1997-04-26 17:21:57 +04:00
|
|
|
/*
|
|
|
|
* mke2fs.c - Make a ext2fs filesystem.
|
|
|
|
*
|
2005-01-05 11:01:06 +03:00
|
|
|
* Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
|
|
|
|
* 2003, 2004, 2005 by Theodore Ts'o.
|
1997-04-29 20:17:09 +04:00
|
|
|
*
|
|
|
|
* %Begin-Header%
|
|
|
|
* This file may be redistributed under the terms of the GNU Public
|
|
|
|
* License.
|
|
|
|
* %End-Header%
|
1997-04-26 17:21:57 +04:00
|
|
|
*/
|
|
|
|
|
|
|
|
/* Usage: mke2fs [options] device
|
|
|
|
*
|
|
|
|
* The device may be a block device or a image of one, but this isn't
|
|
|
|
* enforced (but it's not much fun on a character device :-).
|
|
|
|
*/
|
|
|
|
|
1997-04-26 18:00:26 +04:00
|
|
|
#include <stdio.h>
|
1997-04-26 17:21:57 +04:00
|
|
|
#include <string.h>
|
|
|
|
#include <fcntl.h>
|
|
|
|
#include <ctype.h>
|
|
|
|
#include <time.h>
|
2002-03-08 04:52:12 +03:00
|
|
|
#ifdef __linux__
|
1999-09-15 00:11:19 +04:00
|
|
|
#include <sys/utsname.h>
|
|
|
|
#endif
|
1997-04-26 18:00:26 +04:00
|
|
|
#ifdef HAVE_GETOPT_H
|
1997-04-26 17:21:57 +04:00
|
|
|
#include <getopt.h>
|
Many files:
badblocks.c, dumpe2fs.c, e2label.c, mke2fs.c, tune2fs.c, uuidgen.c:
For platforms that don't define optarg.h, manually define optarg and
optind.
ChangeLog, main.c:
main.c: For platforms that don't define optarg.h, manually define
optarg and optind.
ChangeLog, unix.c:
unix.c: For platforms that don't define optarg.h, manually define
optarg and optind.
2000-04-03 20:22:35 +04:00
|
|
|
#else
|
|
|
|
extern char *optarg;
|
|
|
|
extern int optind;
|
1997-04-26 18:00:26 +04:00
|
|
|
#endif
|
|
|
|
#ifdef HAVE_UNISTD_H
|
1997-04-26 17:21:57 +04:00
|
|
|
#include <unistd.h>
|
1997-04-26 18:00:26 +04:00
|
|
|
#endif
|
|
|
|
#ifdef HAVE_STDLIB_H
|
1997-04-26 17:21:57 +04:00
|
|
|
#include <stdlib.h>
|
1997-04-26 18:00:26 +04:00
|
|
|
#endif
|
|
|
|
#ifdef HAVE_ERRNO_H
|
|
|
|
#include <errno.h>
|
|
|
|
#endif
|
|
|
|
#ifdef HAVE_MNTENT_H
|
1997-04-26 17:21:57 +04:00
|
|
|
#include <mntent.h>
|
1997-04-26 18:00:26 +04:00
|
|
|
#endif
|
1997-04-26 17:21:57 +04:00
|
|
|
#include <sys/ioctl.h>
|
1997-04-26 17:34:30 +04:00
|
|
|
#include <sys/types.h>
|
|
|
|
|
Many files:
badblocks.c, chattr.c, dumpe2fs.c, e2image.c, findsuper.c, lsattr.c,
mke2fs.c, mklost+found.c, tune2fs.c, util.c: Change location of
ext2_fs.h to be ext2fs/ext2_fs.h
ChangeLog, Makefile.in, resize2fs.h:
resize2fs.h: Change location of ext2_fs.h to be ext2fs/ext2_fs.h
ChangeLog, Makefile.in, debugfs.h:
debugfs.h: Change location of ext2_fs.h to be ext2fs/ext2_fs.h
ChangeLog, Makefile.in, e2fsck.h, scantest.c:
e2fsck.h, scantest.c: Change location of ext2_fs.h to be
ext2fs/ext2_fs.h
ChangeLog, Makefile.in, tst_uuid.c, uuid_time.c:
tst_uuid.c, uuid_time.c: Remove unneeded #include of ext2_fs.h
ChangeLog, Makefile.in, e2p.h:
e2p.h: Change location of ext2_fs.h to be ext2fs/ext2_fs.h
ChangeLog, Makefile.in, test_icount.c, test_rel.c:
test_icount.c, test_rel.c: Change location of ext2_fs.h to be
ext2fs/ext2_fs.h
2001-05-14 15:45:38 +04:00
|
|
|
#include "ext2fs/ext2_fs.h"
|
1997-04-26 17:21:57 +04:00
|
|
|
#include "et/com_err.h"
|
1997-04-29 18:53:37 +04:00
|
|
|
#include "uuid/uuid.h"
|
1999-10-23 05:04:50 +04:00
|
|
|
#include "e2p/e2p.h"
|
1997-04-26 17:21:57 +04:00
|
|
|
#include "ext2fs/ext2fs.h"
|
ChangeLog, Makefile.in, mke2fs.c, tune2fs.8.in, tune2fs.c, util.c, util.h:
tune2fs.c (update_feature_set, add_journal): Moved to separate
functions. Added ability to add and remove the journal while the
filesystem is live. Added support for setting a time-based UUID.
Removed zero-initialized static variables.
mke2fs.c, util.c, util.h (strcasecmp, proceed_question,
check_plausibility, parse_journal_opts, check_mount): Moved functions
to util.c so they can be used by tune2fs.
mke2fs.c (main): Change ext2fs_add_journal_fs() to
ext2fs_add_journal_inode() to reflect function renaming.
2001-01-03 20:02:13 +03:00
|
|
|
#include "util.h"
|
2006-03-24 06:00:01 +03:00
|
|
|
#include "profile.h"
|
2006-12-26 11:38:07 +03:00
|
|
|
#include "prof_err.h"
|
1997-04-26 17:21:57 +04:00
|
|
|
#include "../version.h"
|
Many files:
badblocks.c, chattr.c, dumpe2fs.c, e2label.c, findsuper.c, fsck.c,
get_device_by_label.c, lsattr.c, mke2fs.c, mklost+found.c,
nls-enable.h, partinfo.c, tune2fs.c, uuidgen.c: Add
Internationalization support as suggested by Marco d'Itri
<md@linux.it>.
2000-02-08 03:47:55 +03:00
|
|
|
#include "nls-enable.h"
|
1997-04-26 17:21:57 +04:00
|
|
|
|
|
|
|
#define STRIDE_LENGTH 8
|
|
|
|
|
1999-11-23 05:23:30 +03:00
|
|
|
#ifndef __sparc__
|
1997-04-29 18:53:37 +04:00
|
|
|
#define ZAP_BOOTBLOCK
|
|
|
|
#endif
|
|
|
|
|
1997-04-26 17:21:57 +04:00
|
|
|
extern int isatty(int);
|
1997-04-26 17:34:30 +04:00
|
|
|
extern FILE *fpopen(const char *cmd, const char *mode);
|
1997-04-26 17:21:57 +04:00
|
|
|
|
|
|
|
const char * program_name = "mke2fs";
|
2000-12-09 17:36:04 +03:00
|
|
|
const char * device_name /* = NULL */;
|
1997-04-26 17:21:57 +04:00
|
|
|
|
|
|
|
/* Command line options */
|
2001-01-16 10:47:31 +03:00
|
|
|
int cflag;
|
|
|
|
int verbose;
|
|
|
|
int quiet;
|
|
|
|
int super_only;
|
|
|
|
int force;
|
|
|
|
int noaction;
|
|
|
|
int journal_size;
|
|
|
|
int journal_flags;
|
|
|
|
char *bad_blocks_filename;
|
|
|
|
__u32 fs_stride;
|
1997-04-26 17:21:57 +04:00
|
|
|
|
2005-12-11 05:50:30 +03:00
|
|
|
struct ext2_super_block fs_param;
|
2001-01-16 10:47:31 +03:00
|
|
|
char *creator_os;
|
|
|
|
char *volume_label;
|
|
|
|
char *mount_dir;
|
|
|
|
char *journal_device;
|
|
|
|
int sync_kludge; /* Set using the MKE2FS_SYNC env. option */
|
1997-04-26 17:21:57 +04:00
|
|
|
|
2006-03-24 06:00:01 +03:00
|
|
|
profile_t profile;
|
|
|
|
|
2002-05-17 18:53:07 +04:00
|
|
|
int sys_page_size = 4096;
|
2004-09-25 15:40:12 +04:00
|
|
|
int linux_version_code = 0;
|
2002-05-17 18:53:07 +04:00
|
|
|
|
ChangeLog, Makefile.in, mke2fs.c, tune2fs.8.in, tune2fs.c, util.c, util.h:
tune2fs.c (update_feature_set, add_journal): Moved to separate
functions. Added ability to add and remove the journal while the
filesystem is live. Added support for setting a time-based UUID.
Removed zero-initialized static variables.
mke2fs.c, util.c, util.h (strcasecmp, proceed_question,
check_plausibility, parse_journal_opts, check_mount): Moved functions
to util.c so they can be used by tune2fs.
mke2fs.c (main): Change ext2fs_add_journal_fs() to
ext2fs_add_journal_inode() to reflect function renaming.
2001-01-03 20:02:13 +03:00
|
|
|
static void usage(void)
|
1997-04-26 17:21:57 +04:00
|
|
|
{
|
Many files:
badblocks.c, chattr.c, dumpe2fs.c, e2label.c, findsuper.c, fsck.c,
get_device_by_label.c, lsattr.c, mke2fs.c, mklost+found.c,
nls-enable.h, partinfo.c, tune2fs.c, uuidgen.c: Add
Internationalization support as suggested by Marco d'Itri
<md@linux.it>.
2000-02-08 03:47:55 +03:00
|
|
|
fprintf(stderr, _("Usage: %s [-c|-t|-l filename] [-b block-size] "
|
2006-07-16 06:08:20 +04:00
|
|
|
"[-f fragment-size]\n\t[-i bytes-per-inode] [-I inode-size] "
|
|
|
|
"[-j] [-J journal-options]\n"
|
|
|
|
"\t[-N number-of-inodes] [-m reserved-blocks-percentage] "
|
|
|
|
"[-o creator-os]\n\t[-g blocks-per-group] [-L volume-label] "
|
|
|
|
"[-M last-mounted-directory]\n\t[-O feature[,...]] "
|
|
|
|
"[-r fs-revision] [-R options] [-qvSV]\n\tdevice [blocks-count]\n"),
|
1997-04-26 17:21:57 +04:00
|
|
|
program_name);
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
|
1999-11-23 05:23:30 +03:00
|
|
|
static int int_log2(int arg)
|
1997-04-26 17:21:57 +04:00
|
|
|
{
|
|
|
|
int l = 0;
|
|
|
|
|
|
|
|
arg >>= 1;
|
|
|
|
while (arg) {
|
|
|
|
l++;
|
|
|
|
arg >>= 1;
|
|
|
|
}
|
|
|
|
return l;
|
|
|
|
}
|
|
|
|
|
1999-11-23 05:23:30 +03:00
|
|
|
static int int_log10(unsigned int arg)
|
ChangeLog, mke2fs.c, tune2fs.8.in:
tune2fs.8.in: Fix minor display bug in the nroff.
mke2fs.c (show_stats, write_inode_tables): Use the log10 function to
calculate the display of block numbers so that things look nice on an
80 character display.
mke2fs.c (usage): Add the sparse-super-flag to the usage message.
ChangeLog, e2fsck.c, pass1.c, pass2.c, problem.c, problem.h, unix.c:
unix.c (main): Move ext2fs_close() after e2fsck_free_context() since
e2fsck_free_context may reference data in ctx->fs.
e2fsck.c (e2fsck_reset_context): Make sure ctx->fs is non-NULL before
checking ctx->fs->dblist.
pass1.c (e2fsck_pass1): Use the device check subroutine on FIFO's and
Socket's, so that we catch bogus immutable inodes.
pass2.c (process_bad_inode): Process bad socket and fifo's.
problem.h, problem.c: Define new problem codes PR_2_BAD_FIFO and
PR_2_BAD_SOCKET.
1998-11-14 07:18:28 +03:00
|
|
|
{
|
|
|
|
int l;
|
|
|
|
|
|
|
|
for (l=0; arg ; l++)
|
|
|
|
arg = arg / 10;
|
|
|
|
return l;
|
|
|
|
}
|
|
|
|
|
2004-09-25 15:40:12 +04:00
|
|
|
static int parse_version_number(const char *s)
|
|
|
|
{
|
|
|
|
int major, minor, rev;
|
|
|
|
char *endptr;
|
|
|
|
const char *cp = s;
|
|
|
|
|
|
|
|
if (!s)
|
|
|
|
return 0;
|
|
|
|
major = strtol(cp, &endptr, 10);
|
|
|
|
if (cp == endptr || *endptr != '.')
|
|
|
|
return 0;
|
|
|
|
cp = endptr + 1;
|
|
|
|
minor = strtol(cp, &endptr, 10);
|
|
|
|
if (cp == endptr || *endptr != '.')
|
|
|
|
return 0;
|
|
|
|
cp = endptr + 1;
|
|
|
|
rev = strtol(cp, &endptr, 10);
|
|
|
|
if (cp == endptr)
|
|
|
|
return 0;
|
|
|
|
return ((((major * 256) + minor) * 256) + rev);
|
|
|
|
}
|
|
|
|
|
1997-04-26 17:21:57 +04:00
|
|
|
/*
|
|
|
|
* Helper function for read_bb_file and test_disk
|
|
|
|
*/
|
2003-12-07 09:28:50 +03:00
|
|
|
static void invalid_block(ext2_filsys fs EXT2FS_ATTR((unused)), blk_t blk)
|
1997-04-26 17:21:57 +04:00
|
|
|
{
|
2002-03-08 08:14:46 +03:00
|
|
|
fprintf(stderr, _("Bad block %u out of range; ignored.\n"), blk);
|
1997-04-26 17:21:57 +04:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Reads the bad blocks list from a file
|
|
|
|
*/
|
|
|
|
static void read_bb_file(ext2_filsys fs, badblocks_list *bb_list,
|
|
|
|
const char *bad_blocks_file)
|
|
|
|
{
|
|
|
|
FILE *f;
|
|
|
|
errcode_t retval;
|
|
|
|
|
|
|
|
f = fopen(bad_blocks_file, "r");
|
|
|
|
if (!f) {
|
|
|
|
com_err("read_bad_blocks_file", errno,
|
Many files:
badblocks.c, chattr.c, dumpe2fs.c, e2label.c, findsuper.c, fsck.c,
get_device_by_label.c, lsattr.c, mke2fs.c, mklost+found.c,
nls-enable.h, partinfo.c, tune2fs.c, uuidgen.c: Add
Internationalization support as suggested by Marco d'Itri
<md@linux.it>.
2000-02-08 03:47:55 +03:00
|
|
|
_("while trying to open %s"), bad_blocks_file);
|
1997-04-26 17:21:57 +04:00
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
retval = ext2fs_read_bb_FILE(fs, f, bb_list, invalid_block);
|
|
|
|
fclose (f);
|
|
|
|
if (retval) {
|
|
|
|
com_err("ext2fs_read_bb_FILE", retval,
|
Many files:
badblocks.c, chattr.c, dumpe2fs.c, e2label.c, findsuper.c, fsck.c,
get_device_by_label.c, lsattr.c, mke2fs.c, mklost+found.c,
nls-enable.h, partinfo.c, tune2fs.c, uuidgen.c: Add
Internationalization support as suggested by Marco d'Itri
<md@linux.it>.
2000-02-08 03:47:55 +03:00
|
|
|
_("while reading in list of bad blocks from file"));
|
1997-04-26 17:21:57 +04:00
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Runs the badblocks program to test the disk
|
|
|
|
*/
|
|
|
|
static void test_disk(ext2_filsys fs, badblocks_list *bb_list)
|
|
|
|
{
|
|
|
|
FILE *f;
|
|
|
|
errcode_t retval;
|
|
|
|
char buf[1024];
|
|
|
|
|
2006-09-12 22:56:15 +04:00
|
|
|
sprintf(buf, "badblocks -b %d -X %s%s%s %u", fs->blocksize,
|
2001-12-24 23:01:59 +03:00
|
|
|
quiet ? "" : "-s ", (cflag > 1) ? "-w " : "",
|
2006-11-08 08:41:50 +03:00
|
|
|
fs->device_name, fs->super->s_blocks_count-1);
|
1997-04-26 17:21:57 +04:00
|
|
|
if (verbose)
|
Many files:
badblocks.c, chattr.c, dumpe2fs.c, e2label.c, findsuper.c, fsck.c,
get_device_by_label.c, lsattr.c, mke2fs.c, mklost+found.c,
nls-enable.h, partinfo.c, tune2fs.c, uuidgen.c: Add
Internationalization support as suggested by Marco d'Itri
<md@linux.it>.
2000-02-08 03:47:55 +03:00
|
|
|
printf(_("Running command: %s\n"), buf);
|
1997-04-26 17:21:57 +04:00
|
|
|
f = popen(buf, "r");
|
|
|
|
if (!f) {
|
|
|
|
com_err("popen", errno,
|
2005-05-06 07:15:55 +04:00
|
|
|
_("while trying to run '%s'"), buf);
|
1997-04-26 17:21:57 +04:00
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
retval = ext2fs_read_bb_FILE(fs, f, bb_list, invalid_block);
|
1997-04-26 17:34:30 +04:00
|
|
|
pclose(f);
|
1997-04-26 17:21:57 +04:00
|
|
|
if (retval) {
|
|
|
|
com_err("ext2fs_read_bb_FILE", retval,
|
Many files:
badblocks.c, chattr.c, dumpe2fs.c, e2label.c, findsuper.c, fsck.c,
get_device_by_label.c, lsattr.c, mke2fs.c, mklost+found.c,
nls-enable.h, partinfo.c, tune2fs.c, uuidgen.c: Add
Internationalization support as suggested by Marco d'Itri
<md@linux.it>.
2000-02-08 03:47:55 +03:00
|
|
|
_("while processing list of bad blocks from program"));
|
1997-04-26 17:21:57 +04:00
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void handle_bad_blocks(ext2_filsys fs, badblocks_list bb_list)
|
|
|
|
{
|
2003-12-07 09:28:50 +03:00
|
|
|
dgrp_t i;
|
|
|
|
blk_t j;
|
|
|
|
unsigned must_be_good;
|
1997-04-26 17:21:57 +04:00
|
|
|
blk_t blk;
|
|
|
|
badblocks_iterate bb_iter;
|
|
|
|
errcode_t retval;
|
1997-04-26 17:34:30 +04:00
|
|
|
blk_t group_block;
|
|
|
|
int group;
|
|
|
|
int group_bad;
|
1997-04-26 17:21:57 +04:00
|
|
|
|
|
|
|
if (!bb_list)
|
|
|
|
return;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* The primary superblock and group descriptors *must* be
|
|
|
|
* good; if not, abort.
|
|
|
|
*/
|
|
|
|
must_be_good = fs->super->s_first_data_block + 1 + fs->desc_blocks;
|
|
|
|
for (i = fs->super->s_first_data_block; i <= must_be_good; i++) {
|
ChangeLog, dumpe2fs.c, mke2fs.c:
dumpe2fs.c: Use WORDS_BIGENDIAN to determine whether or not we're
(not) using i386 byte order.
dumpe2fs.c, mke2fs.c: Stop using the compatibility badblocks function,
and use the ext2fs_badblocks_* functions instead.
ChangeLog, inode.c, tst_iscan.c:
inode.c, tst_iscan.c: Stop using the compatibility badblocks function,
and use the ext2fs_badblocks_* functions instead.
ChangeLog, badblocks.c:
badblocks.c: Stop using the compatibility badblocks function, and use
the ext2fs_badblocks_* functions instead.
2001-06-13 04:12:04 +04:00
|
|
|
if (ext2fs_badblocks_list_test(bb_list, i)) {
|
Many files:
badblocks.c, chattr.c, dumpe2fs.c, e2label.c, findsuper.c, fsck.c,
get_device_by_label.c, lsattr.c, mke2fs.c, mklost+found.c,
nls-enable.h, partinfo.c, tune2fs.c, uuidgen.c: Add
Internationalization support as suggested by Marco d'Itri
<md@linux.it>.
2000-02-08 03:47:55 +03:00
|
|
|
fprintf(stderr, _("Block %d in primary "
|
|
|
|
"superblock/group descriptor area bad.\n"), i);
|
2006-09-12 22:56:15 +04:00
|
|
|
fprintf(stderr, _("Blocks %u through %u must be good "
|
Many files:
badblocks.c, chattr.c, dumpe2fs.c, e2label.c, findsuper.c, fsck.c,
get_device_by_label.c, lsattr.c, mke2fs.c, mklost+found.c,
nls-enable.h, partinfo.c, tune2fs.c, uuidgen.c: Add
Internationalization support as suggested by Marco d'Itri
<md@linux.it>.
2000-02-08 03:47:55 +03:00
|
|
|
"in order to build a filesystem.\n"),
|
1997-04-26 17:21:57 +04:00
|
|
|
fs->super->s_first_data_block, must_be_good);
|
2003-12-07 09:28:50 +03:00
|
|
|
fputs(_("Aborting....\n"), stderr);
|
1997-04-26 17:21:57 +04:00
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
}
|
1997-04-26 17:34:30 +04:00
|
|
|
|
|
|
|
/*
|
|
|
|
* See if any of the bad blocks are showing up in the backup
|
|
|
|
* superblocks and/or group descriptors. If so, issue a
|
|
|
|
* warning and adjust the block counts appropriately.
|
|
|
|
*/
|
|
|
|
group_block = fs->super->s_first_data_block +
|
|
|
|
fs->super->s_blocks_per_group;
|
|
|
|
|
|
|
|
for (i = 1; i < fs->group_desc_count; i++) {
|
1998-02-17 01:29:34 +03:00
|
|
|
group_bad = 0;
|
1997-04-26 17:34:30 +04:00
|
|
|
for (j=0; j < fs->desc_blocks+1; j++) {
|
ChangeLog, dumpe2fs.c, mke2fs.c:
dumpe2fs.c: Use WORDS_BIGENDIAN to determine whether or not we're
(not) using i386 byte order.
dumpe2fs.c, mke2fs.c: Stop using the compatibility badblocks function,
and use the ext2fs_badblocks_* functions instead.
ChangeLog, inode.c, tst_iscan.c:
inode.c, tst_iscan.c: Stop using the compatibility badblocks function,
and use the ext2fs_badblocks_* functions instead.
ChangeLog, badblocks.c:
badblocks.c: Stop using the compatibility badblocks function, and use
the ext2fs_badblocks_* functions instead.
2001-06-13 04:12:04 +04:00
|
|
|
if (ext2fs_badblocks_list_test(bb_list,
|
|
|
|
group_block + j)) {
|
1997-04-26 17:34:30 +04:00
|
|
|
if (!group_bad)
|
|
|
|
fprintf(stderr,
|
2006-03-19 05:43:46 +03:00
|
|
|
_("Warning: the backup superblock/group descriptors at block %u contain\n"
|
Many files:
badblocks.c, chattr.c, dumpe2fs.c, e2label.c, findsuper.c, fsck.c,
get_device_by_label.c, lsattr.c, mke2fs.c, mklost+found.c,
nls-enable.h, partinfo.c, tune2fs.c, uuidgen.c: Add
Internationalization support as suggested by Marco d'Itri
<md@linux.it>.
2000-02-08 03:47:55 +03:00
|
|
|
" bad blocks.\n\n"),
|
1997-04-26 17:34:30 +04:00
|
|
|
group_block);
|
|
|
|
group_bad++;
|
|
|
|
group = ext2fs_group_of_blk(fs, group_block+j);
|
|
|
|
fs->group_desc[group].bg_free_blocks_count++;
|
|
|
|
fs->super->s_free_blocks_count++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
group_block += fs->super->s_blocks_per_group;
|
|
|
|
}
|
1997-04-26 17:21:57 +04:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Mark all the bad blocks as used...
|
|
|
|
*/
|
ChangeLog, dumpe2fs.c, mke2fs.c:
dumpe2fs.c: Use WORDS_BIGENDIAN to determine whether or not we're
(not) using i386 byte order.
dumpe2fs.c, mke2fs.c: Stop using the compatibility badblocks function,
and use the ext2fs_badblocks_* functions instead.
ChangeLog, inode.c, tst_iscan.c:
inode.c, tst_iscan.c: Stop using the compatibility badblocks function,
and use the ext2fs_badblocks_* functions instead.
ChangeLog, badblocks.c:
badblocks.c: Stop using the compatibility badblocks function, and use
the ext2fs_badblocks_* functions instead.
2001-06-13 04:12:04 +04:00
|
|
|
retval = ext2fs_badblocks_list_iterate_begin(bb_list, &bb_iter);
|
1997-04-26 17:21:57 +04:00
|
|
|
if (retval) {
|
ChangeLog, dumpe2fs.c, mke2fs.c:
dumpe2fs.c: Use WORDS_BIGENDIAN to determine whether or not we're
(not) using i386 byte order.
dumpe2fs.c, mke2fs.c: Stop using the compatibility badblocks function,
and use the ext2fs_badblocks_* functions instead.
ChangeLog, inode.c, tst_iscan.c:
inode.c, tst_iscan.c: Stop using the compatibility badblocks function,
and use the ext2fs_badblocks_* functions instead.
ChangeLog, badblocks.c:
badblocks.c: Stop using the compatibility badblocks function, and use
the ext2fs_badblocks_* functions instead.
2001-06-13 04:12:04 +04:00
|
|
|
com_err("ext2fs_badblocks_list_iterate_begin", retval,
|
Many files:
badblocks.c, chattr.c, dumpe2fs.c, e2label.c, findsuper.c, fsck.c,
get_device_by_label.c, lsattr.c, mke2fs.c, mklost+found.c,
nls-enable.h, partinfo.c, tune2fs.c, uuidgen.c: Add
Internationalization support as suggested by Marco d'Itri
<md@linux.it>.
2000-02-08 03:47:55 +03:00
|
|
|
_("while marking bad blocks as used"));
|
1997-04-26 17:21:57 +04:00
|
|
|
exit(1);
|
|
|
|
}
|
ChangeLog, dumpe2fs.c, mke2fs.c:
dumpe2fs.c: Use WORDS_BIGENDIAN to determine whether or not we're
(not) using i386 byte order.
dumpe2fs.c, mke2fs.c: Stop using the compatibility badblocks function,
and use the ext2fs_badblocks_* functions instead.
ChangeLog, inode.c, tst_iscan.c:
inode.c, tst_iscan.c: Stop using the compatibility badblocks function,
and use the ext2fs_badblocks_* functions instead.
ChangeLog, badblocks.c:
badblocks.c: Stop using the compatibility badblocks function, and use
the ext2fs_badblocks_* functions instead.
2001-06-13 04:12:04 +04:00
|
|
|
while (ext2fs_badblocks_list_iterate(bb_iter, &blk))
|
1997-04-26 17:34:30 +04:00
|
|
|
ext2fs_mark_block_bitmap(fs->block_map, blk);
|
ChangeLog, dumpe2fs.c, mke2fs.c:
dumpe2fs.c: Use WORDS_BIGENDIAN to determine whether or not we're
(not) using i386 byte order.
dumpe2fs.c, mke2fs.c: Stop using the compatibility badblocks function,
and use the ext2fs_badblocks_* functions instead.
ChangeLog, inode.c, tst_iscan.c:
inode.c, tst_iscan.c: Stop using the compatibility badblocks function,
and use the ext2fs_badblocks_* functions instead.
ChangeLog, badblocks.c:
badblocks.c: Stop using the compatibility badblocks function, and use
the ext2fs_badblocks_* functions instead.
2001-06-13 04:12:04 +04:00
|
|
|
ext2fs_badblocks_list_iterate_end(bb_iter);
|
1997-04-26 17:21:57 +04:00
|
|
|
}
|
|
|
|
|
2001-01-16 10:47:31 +03:00
|
|
|
/*
|
|
|
|
* These functions implement a generalized progress meter.
|
|
|
|
*/
|
|
|
|
struct progress_struct {
|
|
|
|
char format[20];
|
|
|
|
char backup[80];
|
|
|
|
__u32 max;
|
2003-09-01 17:28:18 +04:00
|
|
|
int skip_progress;
|
2001-01-16 10:47:31 +03:00
|
|
|
};
|
1999-02-09 11:14:28 +03:00
|
|
|
|
2001-01-16 10:47:31 +03:00
|
|
|
static void progress_init(struct progress_struct *progress,
|
2001-12-17 07:23:37 +03:00
|
|
|
const char *label,__u32 max)
|
2001-01-16 10:47:31 +03:00
|
|
|
{
|
|
|
|
int i;
|
1997-04-26 17:21:57 +04:00
|
|
|
|
2001-01-16 10:47:31 +03:00
|
|
|
memset(progress, 0, sizeof(struct progress_struct));
|
|
|
|
if (quiet)
|
|
|
|
return;
|
ChangeLog, mke2fs.c, tune2fs.8.in:
tune2fs.8.in: Fix minor display bug in the nroff.
mke2fs.c (show_stats, write_inode_tables): Use the log10 function to
calculate the display of block numbers so that things look nice on an
80 character display.
mke2fs.c (usage): Add the sparse-super-flag to the usage message.
ChangeLog, e2fsck.c, pass1.c, pass2.c, problem.c, problem.h, unix.c:
unix.c (main): Move ext2fs_close() after e2fsck_free_context() since
e2fsck_free_context may reference data in ctx->fs.
e2fsck.c (e2fsck_reset_context): Make sure ctx->fs is non-NULL before
checking ctx->fs->dblist.
pass1.c (e2fsck_pass1): Use the device check subroutine on FIFO's and
Socket's, so that we catch bogus immutable inodes.
pass2.c (process_bad_inode): Process bad socket and fifo's.
problem.h, problem.c: Define new problem codes PR_2_BAD_FIFO and
PR_2_BAD_SOCKET.
1998-11-14 07:18:28 +03:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Figure out how many digits we need
|
|
|
|
*/
|
2001-01-16 10:47:31 +03:00
|
|
|
i = int_log10(max);
|
|
|
|
sprintf(progress->format, "%%%dd/%%%dld", i, i);
|
|
|
|
memset(progress->backup, '\b', sizeof(progress->backup)-1);
|
|
|
|
progress->backup[sizeof(progress->backup)-1] = 0;
|
2003-12-07 09:28:50 +03:00
|
|
|
if ((2*i)+1 < (int) sizeof(progress->backup))
|
2001-01-16 10:47:31 +03:00
|
|
|
progress->backup[(2*i)+1] = 0;
|
|
|
|
progress->max = max;
|
|
|
|
|
2003-09-01 17:28:18 +04:00
|
|
|
progress->skip_progress = 0;
|
|
|
|
if (getenv("MKE2FS_SKIP_PROGRESS"))
|
|
|
|
progress->skip_progress++;
|
|
|
|
|
2001-01-16 10:47:31 +03:00
|
|
|
fputs(label, stdout);
|
|
|
|
fflush(stdout);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void progress_update(struct progress_struct *progress, __u32 val)
|
|
|
|
{
|
2003-09-01 17:28:18 +04:00
|
|
|
if ((progress->format[0] == 0) || progress->skip_progress)
|
2001-01-16 10:47:31 +03:00
|
|
|
return;
|
|
|
|
printf(progress->format, val, progress->max);
|
|
|
|
fputs(progress->backup, stdout);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void progress_close(struct progress_struct *progress)
|
|
|
|
{
|
|
|
|
if (progress->format[0] == 0)
|
|
|
|
return;
|
|
|
|
fputs(_("done \n"), stdout);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Helper function which zeros out _num_ blocks starting at _blk_. In
|
|
|
|
* case of an error, the details of the error is returned via _ret_blk_
|
|
|
|
* and _ret_count_ if they are non-NULL pointers. Returns 0 on
|
|
|
|
* success, and an error code on an error.
|
|
|
|
*
|
|
|
|
* As a special case, if the first argument is NULL, then it will
|
|
|
|
* attempt to free the static zeroizing buffer. (This is to keep
|
|
|
|
* programs that check for memory leaks happy.)
|
|
|
|
*/
|
|
|
|
static errcode_t zero_blocks(ext2_filsys fs, blk_t blk, int num,
|
|
|
|
struct progress_struct *progress,
|
|
|
|
blk_t *ret_blk, int *ret_count)
|
|
|
|
{
|
|
|
|
int j, count, next_update, next_update_incr;
|
|
|
|
static char *buf;
|
|
|
|
errcode_t retval;
|
|
|
|
|
|
|
|
/* If fs is null, clean up the static buffer and return */
|
|
|
|
if (!fs) {
|
|
|
|
if (buf) {
|
|
|
|
free(buf);
|
|
|
|
buf = 0;
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
/* Allocate the zeroizing buffer if necessary */
|
|
|
|
if (!buf) {
|
|
|
|
buf = malloc(fs->blocksize * STRIDE_LENGTH);
|
|
|
|
if (!buf) {
|
|
|
|
com_err("malloc", ENOMEM,
|
|
|
|
_("while allocating zeroizing buffer"));
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
memset(buf, 0, fs->blocksize * STRIDE_LENGTH);
|
|
|
|
}
|
|
|
|
/* OK, do the write loop */
|
|
|
|
next_update = 0;
|
|
|
|
next_update_incr = num / 100;
|
|
|
|
if (next_update_incr < 1)
|
|
|
|
next_update_incr = 1;
|
|
|
|
for (j=0; j < num; j += STRIDE_LENGTH, blk += STRIDE_LENGTH) {
|
2002-08-17 21:32:21 +04:00
|
|
|
count = num - j;
|
|
|
|
if (count > STRIDE_LENGTH)
|
2001-01-16 10:47:31 +03:00
|
|
|
count = STRIDE_LENGTH;
|
|
|
|
retval = io_channel_write_blk(fs->io, blk, count, buf);
|
|
|
|
if (retval) {
|
|
|
|
if (ret_count)
|
|
|
|
*ret_count = count;
|
|
|
|
if (ret_blk)
|
|
|
|
*ret_blk = blk;
|
|
|
|
return retval;
|
|
|
|
}
|
|
|
|
if (progress && j > next_update) {
|
|
|
|
next_update += num / 100;
|
|
|
|
progress_update(progress, blk);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void write_inode_tables(ext2_filsys fs)
|
|
|
|
{
|
|
|
|
errcode_t retval;
|
|
|
|
blk_t blk;
|
2003-12-07 09:28:50 +03:00
|
|
|
dgrp_t i;
|
|
|
|
int num;
|
2001-01-16 10:47:31 +03:00
|
|
|
struct progress_struct progress;
|
2006-05-09 04:17:26 +04:00
|
|
|
int lazy_flag = 0;
|
2001-01-16 10:47:31 +03:00
|
|
|
|
|
|
|
if (quiet)
|
|
|
|
memset(&progress, 0, sizeof(progress));
|
|
|
|
else
|
|
|
|
progress_init(&progress, _("Writing inode tables: "),
|
|
|
|
fs->group_desc_count);
|
ChangeLog, mke2fs.c, tune2fs.8.in:
tune2fs.8.in: Fix minor display bug in the nroff.
mke2fs.c (show_stats, write_inode_tables): Use the log10 function to
calculate the display of block numbers so that things look nice on an
80 character display.
mke2fs.c (usage): Add the sparse-super-flag to the usage message.
ChangeLog, e2fsck.c, pass1.c, pass2.c, problem.c, problem.h, unix.c:
unix.c (main): Move ext2fs_close() after e2fsck_free_context() since
e2fsck_free_context may reference data in ctx->fs.
e2fsck.c (e2fsck_reset_context): Make sure ctx->fs is non-NULL before
checking ctx->fs->dblist.
pass1.c (e2fsck_pass1): Use the device check subroutine on FIFO's and
Socket's, so that we catch bogus immutable inodes.
pass2.c (process_bad_inode): Process bad socket and fifo's.
problem.h, problem.c: Define new problem codes PR_2_BAD_FIFO and
PR_2_BAD_SOCKET.
1998-11-14 07:18:28 +03:00
|
|
|
|
2006-05-09 04:17:26 +04:00
|
|
|
if (EXT2_HAS_COMPAT_FEATURE(fs->super,
|
|
|
|
EXT2_FEATURE_COMPAT_LAZY_BG))
|
|
|
|
lazy_flag = 1;
|
|
|
|
|
1997-04-26 17:21:57 +04:00
|
|
|
for (i = 0; i < fs->group_desc_count; i++) {
|
2001-01-16 10:47:31 +03:00
|
|
|
progress_update(&progress, i);
|
1997-04-26 17:21:57 +04:00
|
|
|
|
1997-04-29 20:17:09 +04:00
|
|
|
blk = fs->group_desc[i].bg_inode_table;
|
|
|
|
num = fs->inode_blocks_per_group;
|
2001-01-16 10:47:31 +03:00
|
|
|
|
2006-05-09 04:17:26 +04:00
|
|
|
if (!(lazy_flag &&
|
|
|
|
(fs->group_desc[i].bg_flags & EXT2_BG_INODE_UNINIT))) {
|
|
|
|
retval = zero_blocks(fs, blk, num, 0, &blk, &num);
|
|
|
|
if (retval) {
|
|
|
|
fprintf(stderr, _("\nCould not write %d "
|
|
|
|
"blocks in inode table starting at %u: %s\n"),
|
|
|
|
num, blk, error_message(retval));
|
|
|
|
exit(1);
|
|
|
|
}
|
1997-04-29 20:17:09 +04:00
|
|
|
}
|
1999-02-09 11:14:28 +03:00
|
|
|
if (sync_kludge) {
|
|
|
|
if (sync_kludge == 1)
|
|
|
|
sync();
|
|
|
|
else if ((i % sync_kludge) == 0)
|
|
|
|
sync();
|
|
|
|
}
|
1997-04-26 17:21:57 +04:00
|
|
|
}
|
2001-01-16 10:47:31 +03:00
|
|
|
zero_blocks(0, 0, 0, 0, 0, 0);
|
|
|
|
progress_close(&progress);
|
1997-04-26 17:21:57 +04:00
|
|
|
}
|
|
|
|
|
2006-05-09 04:17:26 +04:00
|
|
|
static void setup_lazy_bg(ext2_filsys fs)
|
|
|
|
{
|
|
|
|
dgrp_t i;
|
|
|
|
int blks;
|
|
|
|
struct ext2_super_block *sb = fs->super;
|
|
|
|
struct ext2_group_desc *bg = fs->group_desc;
|
|
|
|
|
|
|
|
if (EXT2_HAS_COMPAT_FEATURE(fs->super,
|
|
|
|
EXT2_FEATURE_COMPAT_LAZY_BG)) {
|
|
|
|
for (i = 0; i < fs->group_desc_count; i++, bg++) {
|
|
|
|
if ((i == 0) ||
|
|
|
|
(i == fs->group_desc_count-1))
|
|
|
|
continue;
|
|
|
|
if (bg->bg_free_inodes_count ==
|
|
|
|
sb->s_inodes_per_group) {
|
|
|
|
bg->bg_free_inodes_count = 0;
|
|
|
|
bg->bg_flags |= EXT2_BG_INODE_UNINIT;
|
|
|
|
sb->s_free_inodes_count -=
|
|
|
|
sb->s_inodes_per_group;
|
|
|
|
}
|
|
|
|
blks = ext2fs_super_and_bgd_loc(fs, i, 0, 0, 0, 0);
|
|
|
|
if (bg->bg_free_blocks_count == blks) {
|
|
|
|
bg->bg_free_blocks_count = 0;
|
|
|
|
bg->bg_flags |= EXT2_BG_BLOCK_UNINIT;
|
|
|
|
sb->s_free_blocks_count -= blks;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
1997-04-26 17:21:57 +04:00
|
|
|
static void create_root_dir(ext2_filsys fs)
|
|
|
|
{
|
2007-05-08 08:10:54 +04:00
|
|
|
errcode_t retval;
|
1997-04-26 17:34:30 +04:00
|
|
|
struct ext2_inode inode;
|
2007-05-08 08:10:54 +04:00
|
|
|
__u32 uid, gid;
|
1997-04-26 17:21:57 +04:00
|
|
|
|
|
|
|
retval = ext2fs_mkdir(fs, EXT2_ROOT_INO, EXT2_ROOT_INO, 0);
|
|
|
|
if (retval) {
|
Many files:
badblocks.c, chattr.c, dumpe2fs.c, e2label.c, findsuper.c, fsck.c,
get_device_by_label.c, lsattr.c, mke2fs.c, mklost+found.c,
nls-enable.h, partinfo.c, tune2fs.c, uuidgen.c: Add
Internationalization support as suggested by Marco d'Itri
<md@linux.it>.
2000-02-08 03:47:55 +03:00
|
|
|
com_err("ext2fs_mkdir", retval, _("while creating root dir"));
|
1997-04-26 17:21:57 +04:00
|
|
|
exit(1);
|
|
|
|
}
|
1997-04-26 17:34:30 +04:00
|
|
|
if (geteuid()) {
|
|
|
|
retval = ext2fs_read_inode(fs, EXT2_ROOT_INO, &inode);
|
|
|
|
if (retval) {
|
|
|
|
com_err("ext2fs_read_inode", retval,
|
Many files:
badblocks.c, chattr.c, dumpe2fs.c, e2label.c, findsuper.c, fsck.c,
get_device_by_label.c, lsattr.c, mke2fs.c, mklost+found.c,
nls-enable.h, partinfo.c, tune2fs.c, uuidgen.c: Add
Internationalization support as suggested by Marco d'Itri
<md@linux.it>.
2000-02-08 03:47:55 +03:00
|
|
|
_("while reading root inode"));
|
1997-04-26 17:34:30 +04:00
|
|
|
exit(1);
|
|
|
|
}
|
2007-05-08 08:10:54 +04:00
|
|
|
uid = getuid();
|
|
|
|
inode.i_uid = uid;
|
|
|
|
inode.i_uid_high = uid >> 16;
|
|
|
|
if (uid) {
|
|
|
|
gid = getgid();
|
|
|
|
inode.i_gid = gid;
|
|
|
|
inode.i_gid_high = gid >> 16;
|
|
|
|
}
|
2005-03-21 09:02:53 +03:00
|
|
|
retval = ext2fs_write_new_inode(fs, EXT2_ROOT_INO, &inode);
|
1997-04-26 17:34:30 +04:00
|
|
|
if (retval) {
|
|
|
|
com_err("ext2fs_write_inode", retval,
|
Many files:
badblocks.c, chattr.c, dumpe2fs.c, e2label.c, findsuper.c, fsck.c,
get_device_by_label.c, lsattr.c, mke2fs.c, mklost+found.c,
nls-enable.h, partinfo.c, tune2fs.c, uuidgen.c: Add
Internationalization support as suggested by Marco d'Itri
<md@linux.it>.
2000-02-08 03:47:55 +03:00
|
|
|
_("while setting root inode ownership"));
|
1997-04-26 17:34:30 +04:00
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
}
|
1997-04-26 17:21:57 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
static void create_lost_and_found(ext2_filsys fs)
|
|
|
|
{
|
|
|
|
errcode_t retval;
|
ChangeLog, libext2fs.texinfo:
libext2fs.texinfo: Change ino_t to ext2_ino_t
ChangeLog, extent.c, main.c, resize2fs.c:
extent.c, main.c, resize2fs.c: Change ino_t to ext2_ino_t.
ChangeLog, mke2fs.c:
mke2fs.c: Change ino_t to ext2_ino_t.
ChangeLog, test_icount.c, test_rel.c:
test_icount.c, test_rel.c: Change ino_t to ext2_ino_t
2001-01-11 18:38:00 +03:00
|
|
|
ext2_ino_t ino;
|
1997-04-26 17:21:57 +04:00
|
|
|
const char *name = "lost+found";
|
|
|
|
int i;
|
1999-07-19 19:30:21 +04:00
|
|
|
int lpf_size = 0;
|
1997-04-26 17:21:57 +04:00
|
|
|
|
2001-12-24 17:40:00 +03:00
|
|
|
fs->umask = 077;
|
1997-04-26 17:21:57 +04:00
|
|
|
retval = ext2fs_mkdir(fs, EXT2_ROOT_INO, 0, name);
|
|
|
|
if (retval) {
|
Many files:
badblocks.c, chattr.c, dumpe2fs.c, e2label.c, findsuper.c, fsck.c,
get_device_by_label.c, lsattr.c, mke2fs.c, mklost+found.c,
nls-enable.h, partinfo.c, tune2fs.c, uuidgen.c: Add
Internationalization support as suggested by Marco d'Itri
<md@linux.it>.
2000-02-08 03:47:55 +03:00
|
|
|
com_err("ext2fs_mkdir", retval,
|
|
|
|
_("while creating /lost+found"));
|
1997-04-26 17:21:57 +04:00
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
|
|
|
|
retval = ext2fs_lookup(fs, EXT2_ROOT_INO, name, strlen(name), 0, &ino);
|
|
|
|
if (retval) {
|
Many files:
badblocks.c, chattr.c, dumpe2fs.c, e2label.c, findsuper.c, fsck.c,
get_device_by_label.c, lsattr.c, mke2fs.c, mklost+found.c,
nls-enable.h, partinfo.c, tune2fs.c, uuidgen.c: Add
Internationalization support as suggested by Marco d'Itri
<md@linux.it>.
2000-02-08 03:47:55 +03:00
|
|
|
com_err("ext2_lookup", retval,
|
|
|
|
_("while looking up /lost+found"));
|
1997-04-26 17:21:57 +04:00
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
|
|
|
|
for (i=1; i < EXT2_NDIR_BLOCKS; i++) {
|
1999-07-19 19:30:21 +04:00
|
|
|
if ((lpf_size += fs->blocksize) >= 16*1024)
|
|
|
|
break;
|
1997-04-26 17:21:57 +04:00
|
|
|
retval = ext2fs_expand_dir(fs, ino);
|
|
|
|
if (retval) {
|
|
|
|
com_err("ext2fs_expand_dir", retval,
|
Many files:
badblocks.c, chattr.c, dumpe2fs.c, e2label.c, findsuper.c, fsck.c,
get_device_by_label.c, lsattr.c, mke2fs.c, mklost+found.c,
nls-enable.h, partinfo.c, tune2fs.c, uuidgen.c: Add
Internationalization support as suggested by Marco d'Itri
<md@linux.it>.
2000-02-08 03:47:55 +03:00
|
|
|
_("while expanding /lost+found"));
|
1997-04-26 17:21:57 +04:00
|
|
|
exit(1);
|
|
|
|
}
|
2001-12-24 17:40:00 +03:00
|
|
|
}
|
1997-04-26 17:21:57 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
static void create_bad_block_inode(ext2_filsys fs, badblocks_list bb_list)
|
|
|
|
{
|
|
|
|
errcode_t retval;
|
|
|
|
|
1997-04-26 17:34:30 +04:00
|
|
|
ext2fs_mark_inode_bitmap(fs->inode_map, EXT2_BAD_INO);
|
1997-04-26 17:21:57 +04:00
|
|
|
fs->group_desc[0].bg_free_inodes_count--;
|
|
|
|
fs->super->s_free_inodes_count--;
|
|
|
|
retval = ext2fs_update_bb_inode(fs, bb_list);
|
|
|
|
if (retval) {
|
|
|
|
com_err("ext2fs_update_bb_inode", retval,
|
Many files:
badblocks.c, chattr.c, dumpe2fs.c, e2label.c, findsuper.c, fsck.c,
get_device_by_label.c, lsattr.c, mke2fs.c, mklost+found.c,
nls-enable.h, partinfo.c, tune2fs.c, uuidgen.c: Add
Internationalization support as suggested by Marco d'Itri
<md@linux.it>.
2000-02-08 03:47:55 +03:00
|
|
|
_("while setting bad block inode"));
|
1997-04-26 17:21:57 +04:00
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
static void reserve_inodes(ext2_filsys fs)
|
|
|
|
{
|
ChangeLog, libext2fs.texinfo:
libext2fs.texinfo: Change ino_t to ext2_ino_t
ChangeLog, extent.c, main.c, resize2fs.c:
extent.c, main.c, resize2fs.c: Change ino_t to ext2_ino_t.
ChangeLog, mke2fs.c:
mke2fs.c: Change ino_t to ext2_ino_t.
ChangeLog, test_icount.c, test_rel.c:
test_icount.c, test_rel.c: Change ino_t to ext2_ino_t
2001-01-11 18:38:00 +03:00
|
|
|
ext2_ino_t i;
|
|
|
|
int group;
|
1997-04-26 17:21:57 +04:00
|
|
|
|
1997-04-26 18:48:50 +04:00
|
|
|
for (i = EXT2_ROOT_INO + 1; i < EXT2_FIRST_INODE(fs->super); i++) {
|
1997-04-26 17:34:30 +04:00
|
|
|
ext2fs_mark_inode_bitmap(fs->inode_map, i);
|
1997-04-26 17:21:57 +04:00
|
|
|
group = ext2fs_group_of_ino(fs, i);
|
|
|
|
fs->group_desc[group].bg_free_inodes_count--;
|
|
|
|
fs->super->s_free_inodes_count--;
|
|
|
|
}
|
|
|
|
ext2fs_mark_ib_dirty(fs);
|
|
|
|
}
|
|
|
|
|
2002-03-08 04:52:12 +03:00
|
|
|
#define BSD_DISKMAGIC (0x82564557UL) /* The disk magic number */
|
2002-03-08 11:01:53 +03:00
|
|
|
#define BSD_MAGICDISK (0x57455682UL) /* The disk magic number reversed */
|
2002-03-08 04:52:12 +03:00
|
|
|
#define BSD_LABEL_OFFSET 64
|
|
|
|
|
2001-08-31 05:55:26 +04:00
|
|
|
static void zap_sector(ext2_filsys fs, int sect, int nsect)
|
1997-04-26 17:34:30 +04:00
|
|
|
{
|
2001-09-17 18:38:06 +04:00
|
|
|
char *buf;
|
1997-04-26 17:34:30 +04:00
|
|
|
int retval;
|
2002-03-08 04:52:12 +03:00
|
|
|
unsigned int *magic;
|
1997-04-26 17:34:30 +04:00
|
|
|
|
2001-09-17 18:38:06 +04:00
|
|
|
buf = malloc(512*nsect);
|
2001-10-13 11:22:25 +04:00
|
|
|
if (!buf) {
|
2001-12-17 07:23:37 +03:00
|
|
|
printf(_("Out of memory erasing sectors %d-%d\n"),
|
|
|
|
sect, sect + nsect - 1);
|
2001-10-13 11:22:25 +04:00
|
|
|
exit(1);
|
|
|
|
}
|
2002-03-08 04:52:12 +03:00
|
|
|
|
2002-03-08 11:01:53 +03:00
|
|
|
if (sect == 0) {
|
|
|
|
/* Check for a BSD disklabel, and don't erase it if so */
|
|
|
|
retval = io_channel_read_blk(fs->io, 0, -512, buf);
|
|
|
|
if (retval)
|
|
|
|
fprintf(stderr,
|
|
|
|
_("Warning: could not read block 0: %s\n"),
|
|
|
|
error_message(retval));
|
|
|
|
else {
|
|
|
|
magic = (unsigned int *) (buf + BSD_LABEL_OFFSET);
|
|
|
|
if ((*magic == BSD_DISKMAGIC) ||
|
|
|
|
(*magic == BSD_MAGICDISK))
|
|
|
|
return;
|
|
|
|
}
|
2002-03-08 04:52:12 +03:00
|
|
|
}
|
|
|
|
|
2002-07-14 16:00:00 +04:00
|
|
|
memset(buf, 0, 512*nsect);
|
2000-08-14 18:44:15 +04:00
|
|
|
io_channel_set_blksize(fs->io, 512);
|
2001-08-31 05:55:26 +04:00
|
|
|
retval = io_channel_write_blk(fs->io, sect, -512*nsect, buf);
|
2000-08-14 18:44:15 +04:00
|
|
|
io_channel_set_blksize(fs->io, fs->blocksize);
|
2001-09-17 18:38:06 +04:00
|
|
|
free(buf);
|
1997-04-26 17:34:30 +04:00
|
|
|
if (retval)
|
2002-03-08 08:14:46 +03:00
|
|
|
fprintf(stderr, _("Warning: could not erase sector %d: %s\n"),
|
|
|
|
sect, error_message(retval));
|
1997-04-26 17:34:30 +04:00
|
|
|
}
|
2001-01-16 10:47:31 +03:00
|
|
|
|
|
|
|
static void create_journal_dev(ext2_filsys fs)
|
|
|
|
{
|
|
|
|
struct progress_struct progress;
|
|
|
|
errcode_t retval;
|
|
|
|
char *buf;
|
ChangeLog, mke2fs.8.in, mke2fs.c, tune2fs.8.in, tune2fs.c:
tune2fs.c, mke2fs.c, tune2fs.8.in, mke2fs.8.in: Change user interface
so that -J is used to specify journal options, and -j is used to
request creation of a journal using default values. (This is a UI
change, but we haven't done a formal release, and it makes things much
more consistent with the rest of the options out there.)
tune2fs.c: Add support for removing a filesystem from an external
journal; we correctly remove the filesystem UUID from the external
journal's filesystem list.
2001-01-18 04:51:15 +03:00
|
|
|
blk_t blk;
|
|
|
|
int count;
|
2001-01-16 10:47:31 +03:00
|
|
|
|
2001-04-17 06:34:41 +04:00
|
|
|
retval = ext2fs_create_journal_superblock(fs,
|
|
|
|
fs->super->s_blocks_count, 0, &buf);
|
|
|
|
if (retval) {
|
|
|
|
com_err("create_journal_dev", retval,
|
|
|
|
_("while initializing journal superblock"));
|
|
|
|
exit(1);
|
|
|
|
}
|
2001-01-16 10:47:31 +03:00
|
|
|
if (quiet)
|
|
|
|
memset(&progress, 0, sizeof(progress));
|
|
|
|
else
|
|
|
|
progress_init(&progress, _("Zeroing journal device: "),
|
|
|
|
fs->super->s_blocks_count);
|
|
|
|
|
|
|
|
retval = zero_blocks(fs, 0, fs->super->s_blocks_count,
|
|
|
|
&progress, &blk, &count);
|
|
|
|
if (retval) {
|
|
|
|
com_err("create_journal_dev", retval,
|
2001-05-14 02:58:27 +04:00
|
|
|
_("while zeroing journal device (block %u, count %d)"),
|
2001-01-16 10:47:31 +03:00
|
|
|
blk, count);
|
|
|
|
exit(1);
|
|
|
|
}
|
ChangeLog, mke2fs.8.in, mke2fs.c, tune2fs.8.in, tune2fs.c:
tune2fs.c, mke2fs.c, tune2fs.8.in, mke2fs.8.in: Change user interface
so that -J is used to specify journal options, and -j is used to
request creation of a journal using default values. (This is a UI
change, but we haven't done a formal release, and it makes things much
more consistent with the rest of the options out there.)
tune2fs.c: Add support for removing a filesystem from an external
journal; we correctly remove the filesystem UUID from the external
journal's filesystem list.
2001-01-18 04:51:15 +03:00
|
|
|
zero_blocks(0, 0, 0, 0, 0, 0);
|
|
|
|
|
|
|
|
retval = io_channel_write_blk(fs->io,
|
|
|
|
fs->super->s_first_data_block+1,
|
|
|
|
1, buf);
|
2001-01-16 10:47:31 +03:00
|
|
|
if (retval) {
|
|
|
|
com_err("create_journal_dev", retval,
|
|
|
|
_("while writing journal superblock"));
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
progress_close(&progress);
|
|
|
|
}
|
1997-04-26 17:34:30 +04:00
|
|
|
|
1997-04-26 17:21:57 +04:00
|
|
|
static void show_stats(ext2_filsys fs)
|
|
|
|
{
|
2001-01-01 18:31:53 +03:00
|
|
|
struct ext2_super_block *s = fs->super;
|
1997-04-29 18:53:37 +04:00
|
|
|
char buf[80];
|
2005-03-19 09:13:22 +03:00
|
|
|
char *os;
|
1997-04-26 17:21:57 +04:00
|
|
|
blk_t group_block;
|
2003-12-07 09:28:50 +03:00
|
|
|
dgrp_t i;
|
|
|
|
int need, col_left;
|
1997-04-26 17:21:57 +04:00
|
|
|
|
2005-12-11 05:50:30 +03:00
|
|
|
if (fs_param.s_blocks_count != s->s_blocks_count)
|
2006-03-19 05:43:46 +03:00
|
|
|
fprintf(stderr, _("warning: %u blocks unused.\n\n"),
|
2005-12-11 05:50:30 +03:00
|
|
|
fs_param.s_blocks_count - s->s_blocks_count);
|
1999-07-19 19:30:21 +04:00
|
|
|
|
|
|
|
memset(buf, 0, sizeof(buf));
|
|
|
|
strncpy(buf, s->s_volume_name, sizeof(s->s_volume_name));
|
Many files:
badblocks.c, chattr.c, dumpe2fs.c, e2label.c, findsuper.c, fsck.c,
get_device_by_label.c, lsattr.c, mke2fs.c, mklost+found.c,
nls-enable.h, partinfo.c, tune2fs.c, uuidgen.c: Add
Internationalization support as suggested by Marco d'Itri
<md@linux.it>.
2000-02-08 03:47:55 +03:00
|
|
|
printf(_("Filesystem label=%s\n"), buf);
|
2003-12-07 09:28:50 +03:00
|
|
|
fputs(_("OS type: "), stdout);
|
2005-03-19 09:13:22 +03:00
|
|
|
os = e2p_os2string(fs->super->s_creator_os);
|
|
|
|
fputs(os, stdout);
|
|
|
|
free(os);
|
1999-07-19 19:30:21 +04:00
|
|
|
printf("\n");
|
Many files:
badblocks.c, chattr.c, dumpe2fs.c, e2label.c, findsuper.c, fsck.c,
get_device_by_label.c, lsattr.c, mke2fs.c, mklost+found.c,
nls-enable.h, partinfo.c, tune2fs.c, uuidgen.c: Add
Internationalization support as suggested by Marco d'Itri
<md@linux.it>.
2000-02-08 03:47:55 +03:00
|
|
|
printf(_("Block size=%u (log=%u)\n"), fs->blocksize,
|
1999-07-19 19:30:21 +04:00
|
|
|
s->s_log_block_size);
|
Many files:
badblocks.c, chattr.c, dumpe2fs.c, e2label.c, findsuper.c, fsck.c,
get_device_by_label.c, lsattr.c, mke2fs.c, mklost+found.c,
nls-enable.h, partinfo.c, tune2fs.c, uuidgen.c: Add
Internationalization support as suggested by Marco d'Itri
<md@linux.it>.
2000-02-08 03:47:55 +03:00
|
|
|
printf(_("Fragment size=%u (log=%u)\n"), fs->fragsize,
|
1999-07-19 19:30:21 +04:00
|
|
|
s->s_log_frag_size);
|
Many files:
badblocks.c, chattr.c, dumpe2fs.c, e2label.c, findsuper.c, fsck.c,
get_device_by_label.c, lsattr.c, mke2fs.c, mklost+found.c,
nls-enable.h, partinfo.c, tune2fs.c, uuidgen.c: Add
Internationalization support as suggested by Marco d'Itri
<md@linux.it>.
2000-02-08 03:47:55 +03:00
|
|
|
printf(_("%u inodes, %u blocks\n"), s->s_inodes_count,
|
1997-04-26 17:21:57 +04:00
|
|
|
s->s_blocks_count);
|
Many files:
badblocks.c, chattr.c, dumpe2fs.c, e2label.c, findsuper.c, fsck.c,
get_device_by_label.c, lsattr.c, mke2fs.c, mklost+found.c,
nls-enable.h, partinfo.c, tune2fs.c, uuidgen.c: Add
Internationalization support as suggested by Marco d'Itri
<md@linux.it>.
2000-02-08 03:47:55 +03:00
|
|
|
printf(_("%u blocks (%2.2f%%) reserved for the super user\n"),
|
1997-04-26 17:21:57 +04:00
|
|
|
s->s_r_blocks_count,
|
|
|
|
100.0 * s->s_r_blocks_count / s->s_blocks_count);
|
Many files:
badblocks.c, chattr.c, dumpe2fs.c, e2label.c, findsuper.c, fsck.c,
get_device_by_label.c, lsattr.c, mke2fs.c, mklost+found.c,
nls-enable.h, partinfo.c, tune2fs.c, uuidgen.c: Add
Internationalization support as suggested by Marco d'Itri
<md@linux.it>.
2000-02-08 03:47:55 +03:00
|
|
|
printf(_("First data block=%u\n"), s->s_first_data_block);
|
2004-12-15 22:39:16 +03:00
|
|
|
if (s->s_reserved_gdt_blocks)
|
|
|
|
printf(_("Maximum filesystem blocks=%lu\n"),
|
|
|
|
(s->s_reserved_gdt_blocks + fs->desc_blocks) *
|
|
|
|
(fs->blocksize / sizeof(struct ext2_group_desc)) *
|
|
|
|
s->s_blocks_per_group);
|
Many files:
badblocks.c, chattr.c, dumpe2fs.c, e2label.c, findsuper.c, fsck.c,
get_device_by_label.c, lsattr.c, mke2fs.c, mklost+found.c,
nls-enable.h, partinfo.c, tune2fs.c, uuidgen.c: Add
Internationalization support as suggested by Marco d'Itri
<md@linux.it>.
2000-02-08 03:47:55 +03:00
|
|
|
if (fs->group_desc_count > 1)
|
ChangeLog, e2image.c, mke2fs.c, mklost+found.c, tune2fs.c, util.c, uuidgen.c:
e2image.c, mke2fs.c, mklost+found.c, tune2fs.c, util.c, uuidgen.c: Fix
gcc -Wall complaints, including one bug in tune2fs caused by a block
automatic shadowing version of the variable we really wanted to use,
which broke the logic testing to see if the filesystem was mounted.
ChangeLog, MCONFIG.in:
(gcc-wall-new): Added new target which forgoes the make clean so we
only check the newly modified .c files.
2001-01-11 19:08:23 +03:00
|
|
|
printf(_("%u block groups\n"), fs->group_desc_count);
|
Many files:
badblocks.c, chattr.c, dumpe2fs.c, e2label.c, findsuper.c, fsck.c,
get_device_by_label.c, lsattr.c, mke2fs.c, mklost+found.c,
nls-enable.h, partinfo.c, tune2fs.c, uuidgen.c: Add
Internationalization support as suggested by Marco d'Itri
<md@linux.it>.
2000-02-08 03:47:55 +03:00
|
|
|
else
|
ChangeLog, e2image.c, mke2fs.c, mklost+found.c, tune2fs.c, util.c, uuidgen.c:
e2image.c, mke2fs.c, mklost+found.c, tune2fs.c, util.c, uuidgen.c: Fix
gcc -Wall complaints, including one bug in tune2fs caused by a block
automatic shadowing version of the variable we really wanted to use,
which broke the logic testing to see if the filesystem was mounted.
ChangeLog, MCONFIG.in:
(gcc-wall-new): Added new target which forgoes the make clean so we
only check the newly modified .c files.
2001-01-11 19:08:23 +03:00
|
|
|
printf(_("%u block group\n"), fs->group_desc_count);
|
Many files:
badblocks.c, chattr.c, dumpe2fs.c, e2label.c, findsuper.c, fsck.c,
get_device_by_label.c, lsattr.c, mke2fs.c, mklost+found.c,
nls-enable.h, partinfo.c, tune2fs.c, uuidgen.c: Add
Internationalization support as suggested by Marco d'Itri
<md@linux.it>.
2000-02-08 03:47:55 +03:00
|
|
|
printf(_("%u blocks per group, %u fragments per group\n"),
|
1997-04-26 17:21:57 +04:00
|
|
|
s->s_blocks_per_group, s->s_frags_per_group);
|
Many files:
badblocks.c, chattr.c, dumpe2fs.c, e2label.c, findsuper.c, fsck.c,
get_device_by_label.c, lsattr.c, mke2fs.c, mklost+found.c,
nls-enable.h, partinfo.c, tune2fs.c, uuidgen.c: Add
Internationalization support as suggested by Marco d'Itri
<md@linux.it>.
2000-02-08 03:47:55 +03:00
|
|
|
printf(_("%u inodes per group\n"), s->s_inodes_per_group);
|
1997-04-26 17:21:57 +04:00
|
|
|
|
|
|
|
if (fs->group_desc_count == 1) {
|
|
|
|
printf("\n");
|
|
|
|
return;
|
|
|
|
}
|
2004-12-15 22:39:16 +03:00
|
|
|
|
Many files:
badblocks.c, chattr.c, dumpe2fs.c, e2label.c, findsuper.c, fsck.c,
get_device_by_label.c, lsattr.c, mke2fs.c, mklost+found.c,
nls-enable.h, partinfo.c, tune2fs.c, uuidgen.c: Add
Internationalization support as suggested by Marco d'Itri
<md@linux.it>.
2000-02-08 03:47:55 +03:00
|
|
|
printf(_("Superblock backups stored on blocks: "));
|
1997-04-26 17:21:57 +04:00
|
|
|
group_block = s->s_first_data_block;
|
|
|
|
col_left = 0;
|
|
|
|
for (i = 1; i < fs->group_desc_count; i++) {
|
|
|
|
group_block += s->s_blocks_per_group;
|
1997-04-29 21:48:10 +04:00
|
|
|
if (!ext2fs_bg_has_super(fs, i))
|
|
|
|
continue;
|
1999-10-20 22:06:29 +04:00
|
|
|
if (i != 1)
|
|
|
|
printf(", ");
|
1999-11-23 05:23:30 +03:00
|
|
|
need = int_log10(group_block) + 2;
|
ChangeLog, mke2fs.c, tune2fs.8.in:
tune2fs.8.in: Fix minor display bug in the nroff.
mke2fs.c (show_stats, write_inode_tables): Use the log10 function to
calculate the display of block numbers so that things look nice on an
80 character display.
mke2fs.c (usage): Add the sparse-super-flag to the usage message.
ChangeLog, e2fsck.c, pass1.c, pass2.c, problem.c, problem.h, unix.c:
unix.c (main): Move ext2fs_close() after e2fsck_free_context() since
e2fsck_free_context may reference data in ctx->fs.
e2fsck.c (e2fsck_reset_context): Make sure ctx->fs is non-NULL before
checking ctx->fs->dblist.
pass1.c (e2fsck_pass1): Use the device check subroutine on FIFO's and
Socket's, so that we catch bogus immutable inodes.
pass2.c (process_bad_inode): Process bad socket and fifo's.
problem.h, problem.c: Define new problem codes PR_2_BAD_FIFO and
PR_2_BAD_SOCKET.
1998-11-14 07:18:28 +03:00
|
|
|
if (need > col_left) {
|
1997-04-26 17:21:57 +04:00
|
|
|
printf("\n\t");
|
ChangeLog, mke2fs.c, tune2fs.8.in:
tune2fs.8.in: Fix minor display bug in the nroff.
mke2fs.c (show_stats, write_inode_tables): Use the log10 function to
calculate the display of block numbers so that things look nice on an
80 character display.
mke2fs.c (usage): Add the sparse-super-flag to the usage message.
ChangeLog, e2fsck.c, pass1.c, pass2.c, problem.c, problem.h, unix.c:
unix.c (main): Move ext2fs_close() after e2fsck_free_context() since
e2fsck_free_context may reference data in ctx->fs.
e2fsck.c (e2fsck_reset_context): Make sure ctx->fs is non-NULL before
checking ctx->fs->dblist.
pass1.c (e2fsck_pass1): Use the device check subroutine on FIFO's and
Socket's, so that we catch bogus immutable inodes.
pass2.c (process_bad_inode): Process bad socket and fifo's.
problem.h, problem.c: Define new problem codes PR_2_BAD_FIFO and
PR_2_BAD_SOCKET.
1998-11-14 07:18:28 +03:00
|
|
|
col_left = 72;
|
1997-04-26 17:21:57 +04:00
|
|
|
}
|
ChangeLog, mke2fs.c, tune2fs.8.in:
tune2fs.8.in: Fix minor display bug in the nroff.
mke2fs.c (show_stats, write_inode_tables): Use the log10 function to
calculate the display of block numbers so that things look nice on an
80 character display.
mke2fs.c (usage): Add the sparse-super-flag to the usage message.
ChangeLog, e2fsck.c, pass1.c, pass2.c, problem.c, problem.h, unix.c:
unix.c (main): Move ext2fs_close() after e2fsck_free_context() since
e2fsck_free_context may reference data in ctx->fs.
e2fsck.c (e2fsck_reset_context): Make sure ctx->fs is non-NULL before
checking ctx->fs->dblist.
pass1.c (e2fsck_pass1): Use the device check subroutine on FIFO's and
Socket's, so that we catch bogus immutable inodes.
pass2.c (process_bad_inode): Process bad socket and fifo's.
problem.h, problem.c: Define new problem codes PR_2_BAD_FIFO and
PR_2_BAD_SOCKET.
1998-11-14 07:18:28 +03:00
|
|
|
col_left -= need;
|
1997-04-26 18:00:26 +04:00
|
|
|
printf("%u", group_block);
|
1997-04-26 17:21:57 +04:00
|
|
|
}
|
|
|
|
printf("\n\n");
|
|
|
|
}
|
|
|
|
|
1997-04-29 18:53:37 +04:00
|
|
|
/*
|
|
|
|
* Set the S_CREATOR_OS field. Return true if OS is known,
|
|
|
|
* otherwise, 0.
|
|
|
|
*/
|
|
|
|
static int set_os(struct ext2_super_block *sb, char *os)
|
|
|
|
{
|
|
|
|
if (isdigit (*os))
|
|
|
|
sb->s_creator_os = atoi (os);
|
|
|
|
else if (strcasecmp(os, "linux") == 0)
|
|
|
|
sb->s_creator_os = EXT2_OS_LINUX;
|
|
|
|
else if (strcasecmp(os, "GNU") == 0 || strcasecmp(os, "hurd") == 0)
|
|
|
|
sb->s_creator_os = EXT2_OS_HURD;
|
|
|
|
else if (strcasecmp(os, "masix") == 0)
|
|
|
|
sb->s_creator_os = EXT2_OS_MASIX;
|
2005-01-20 02:18:44 +03:00
|
|
|
else if (strcasecmp(os, "freebsd") == 0)
|
|
|
|
sb->s_creator_os = EXT2_OS_FREEBSD;
|
|
|
|
else if (strcasecmp(os, "lites") == 0)
|
|
|
|
sb->s_creator_os = EXT2_OS_LITES;
|
1997-04-29 18:53:37 +04:00
|
|
|
else
|
|
|
|
return 0;
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
1997-04-26 18:00:26 +04:00
|
|
|
#define PATH_SET "PATH=/sbin"
|
|
|
|
|
2005-01-05 19:12:20 +03:00
|
|
|
static void parse_extended_opts(struct ext2_super_block *param,
|
|
|
|
const char *opts)
|
1997-04-30 01:26:48 +04:00
|
|
|
{
|
|
|
|
char *buf, *token, *next, *p, *arg;
|
|
|
|
int len;
|
2004-12-15 22:39:16 +03:00
|
|
|
int r_usage = 0;
|
1997-04-30 01:26:48 +04:00
|
|
|
|
|
|
|
len = strlen(opts);
|
|
|
|
buf = malloc(len+1);
|
|
|
|
if (!buf) {
|
2004-12-15 22:39:16 +03:00
|
|
|
fprintf(stderr,
|
|
|
|
_("Couldn't allocate memory to parse options!\n"));
|
1997-04-30 01:26:48 +04:00
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
strcpy(buf, opts);
|
|
|
|
for (token = buf; token && *token; token = next) {
|
|
|
|
p = strchr(token, ',');
|
|
|
|
next = 0;
|
|
|
|
if (p) {
|
|
|
|
*p = 0;
|
|
|
|
next = p+1;
|
2004-12-15 22:39:16 +03:00
|
|
|
}
|
1997-04-30 01:26:48 +04:00
|
|
|
arg = strchr(token, '=');
|
|
|
|
if (arg) {
|
|
|
|
*arg = 0;
|
|
|
|
arg++;
|
|
|
|
}
|
|
|
|
if (strcmp(token, "stride") == 0) {
|
|
|
|
if (!arg) {
|
2004-12-15 22:39:16 +03:00
|
|
|
r_usage++;
|
1997-04-30 01:26:48 +04:00
|
|
|
continue;
|
|
|
|
}
|
|
|
|
fs_stride = strtoul(arg, &p, 0);
|
|
|
|
if (*p || (fs_stride == 0)) {
|
Many files:
badblocks.c, chattr.c, dumpe2fs.c, e2label.c, findsuper.c, fsck.c,
get_device_by_label.c, lsattr.c, mke2fs.c, mklost+found.c,
nls-enable.h, partinfo.c, tune2fs.c, uuidgen.c: Add
Internationalization support as suggested by Marco d'Itri
<md@linux.it>.
2000-02-08 03:47:55 +03:00
|
|
|
fprintf(stderr,
|
2005-05-06 07:15:55 +04:00
|
|
|
_("Invalid stride parameter: %s\n"),
|
|
|
|
arg);
|
2004-12-15 22:39:16 +03:00
|
|
|
r_usage++;
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
} else if (!strcmp(token, "resize")) {
|
2005-01-05 19:12:20 +03:00
|
|
|
unsigned long resize, bpg, rsv_groups;
|
|
|
|
unsigned long group_desc_count, desc_blocks;
|
|
|
|
unsigned int gdpb, blocksize;
|
|
|
|
int rsv_gdb;
|
2004-12-15 22:39:16 +03:00
|
|
|
|
|
|
|
if (!arg) {
|
|
|
|
r_usage++;
|
1997-04-30 01:26:48 +04:00
|
|
|
continue;
|
|
|
|
}
|
2004-12-15 22:39:16 +03:00
|
|
|
|
2005-01-05 11:01:06 +03:00
|
|
|
resize = parse_num_blocks(arg,
|
|
|
|
param->s_log_block_size);
|
2004-12-15 22:39:16 +03:00
|
|
|
|
|
|
|
if (resize == 0) {
|
2005-01-05 11:01:06 +03:00
|
|
|
fprintf(stderr,
|
|
|
|
_("Invalid resize parameter: %s\n"),
|
|
|
|
arg);
|
2004-12-15 22:39:16 +03:00
|
|
|
r_usage++;
|
|
|
|
continue;
|
|
|
|
}
|
2005-01-05 19:12:20 +03:00
|
|
|
if (resize <= param->s_blocks_count) {
|
|
|
|
fprintf(stderr,
|
2005-05-06 07:15:55 +04:00
|
|
|
_("The resize maximum must be greater "
|
|
|
|
"than the filesystem size.\n"));
|
2005-01-05 19:12:20 +03:00
|
|
|
r_usage++;
|
|
|
|
continue;
|
|
|
|
}
|
2004-12-15 22:39:16 +03:00
|
|
|
|
2005-01-05 19:12:20 +03:00
|
|
|
blocksize = EXT2_BLOCK_SIZE(param);
|
|
|
|
bpg = param->s_blocks_per_group;
|
|
|
|
if (!bpg)
|
|
|
|
bpg = blocksize * 8;
|
|
|
|
gdpb = blocksize / sizeof(struct ext2_group_desc);
|
2006-08-30 09:57:00 +04:00
|
|
|
group_desc_count =
|
|
|
|
ext2fs_div_ceil(param->s_blocks_count, bpg);
|
2005-01-05 19:12:20 +03:00
|
|
|
desc_blocks = (group_desc_count +
|
|
|
|
gdpb - 1) / gdpb;
|
2006-08-30 09:57:00 +04:00
|
|
|
rsv_groups = ext2fs_div_ceil(resize, bpg);
|
|
|
|
rsv_gdb = ext2fs_div_ceil(rsv_groups, gdpb) -
|
2005-01-05 19:12:20 +03:00
|
|
|
desc_blocks;
|
2005-12-11 05:50:30 +03:00
|
|
|
if (rsv_gdb > (int) EXT2_ADDR_PER_BLOCK(param))
|
2005-01-05 19:12:20 +03:00
|
|
|
rsv_gdb = EXT2_ADDR_PER_BLOCK(param);
|
|
|
|
|
|
|
|
if (rsv_gdb > 0) {
|
2006-10-18 08:31:11 +04:00
|
|
|
if (param->s_rev_level == EXT2_GOOD_OLD_REV) {
|
|
|
|
fprintf(stderr,
|
|
|
|
_("On-line resizing not supported with revision 0 filesystems\n"));
|
2007-05-31 19:30:47 +04:00
|
|
|
free(buf);
|
2006-10-18 08:31:11 +04:00
|
|
|
exit(1);
|
|
|
|
}
|
2005-01-05 19:12:20 +03:00
|
|
|
param->s_feature_compat |=
|
|
|
|
EXT2_FEATURE_COMPAT_RESIZE_INODE;
|
|
|
|
|
|
|
|
param->s_reserved_gdt_blocks = rsv_gdb;
|
|
|
|
}
|
1997-04-30 01:26:48 +04:00
|
|
|
} else
|
2004-12-15 22:39:16 +03:00
|
|
|
r_usage++;
|
1997-04-30 01:26:48 +04:00
|
|
|
}
|
2004-12-15 22:39:16 +03:00
|
|
|
if (r_usage) {
|
|
|
|
fprintf(stderr, _("\nBad options specified.\n\n"
|
2005-06-20 16:35:27 +04:00
|
|
|
"Extended options are separated by commas, "
|
1997-04-30 01:26:48 +04:00
|
|
|
"and may take an argument which\n"
|
|
|
|
"\tis set off by an equals ('=') sign.\n\n"
|
2005-06-20 16:35:27 +04:00
|
|
|
"Valid extended options are:\n"
|
2004-12-15 22:39:16 +03:00
|
|
|
"\tstride=<stride length in blocks>\n"
|
|
|
|
"\tresize=<resize maximum size in blocks>\n\n"));
|
2007-05-31 19:30:47 +04:00
|
|
|
free(buf);
|
1997-04-30 01:26:48 +04:00
|
|
|
exit(1);
|
|
|
|
}
|
2007-05-31 19:30:47 +04:00
|
|
|
free(buf);
|
1997-04-30 01:26:48 +04:00
|
|
|
}
|
|
|
|
|
1999-10-23 05:04:50 +04:00
|
|
|
static __u32 ok_features[3] = {
|
2002-09-22 23:37:40 +04:00
|
|
|
EXT3_FEATURE_COMPAT_HAS_JOURNAL |
|
2004-12-15 22:39:16 +03:00
|
|
|
EXT2_FEATURE_COMPAT_RESIZE_INODE |
|
2006-05-09 04:17:26 +04:00
|
|
|
EXT2_FEATURE_COMPAT_DIR_INDEX |
|
|
|
|
EXT2_FEATURE_COMPAT_LAZY_BG, /* Compat */
|
2001-01-16 10:47:31 +03:00
|
|
|
EXT2_FEATURE_INCOMPAT_FILETYPE| /* Incompat */
|
2002-10-20 08:38:57 +04:00
|
|
|
EXT3_FEATURE_INCOMPAT_JOURNAL_DEV|
|
|
|
|
EXT2_FEATURE_INCOMPAT_META_BG,
|
1999-10-23 05:04:50 +04:00
|
|
|
EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER /* R/O compat */
|
|
|
|
};
|
1997-04-30 01:26:48 +04:00
|
|
|
|
|
|
|
|
2006-03-24 06:00:01 +03:00
|
|
|
static void syntax_err_report(const char *filename, long err, int line_num)
|
|
|
|
{
|
|
|
|
fprintf(stderr,
|
|
|
|
_("Syntax error in mke2fs config file (%s, line #%d)\n\t%s\n"),
|
|
|
|
filename, line_num, error_message(err));
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
|
2006-06-10 18:08:18 +04:00
|
|
|
static const char *config_fn[] = { ROOT_SYSCONFDIR "/mke2fs.conf", 0 };
|
2006-03-24 06:00:01 +03:00
|
|
|
|
|
|
|
static void edit_feature(const char *str, __u32 *compat_array)
|
|
|
|
{
|
|
|
|
if (!str)
|
|
|
|
return;
|
|
|
|
|
|
|
|
if (e2p_edit_feature(str, compat_array, ok_features)) {
|
|
|
|
fprintf(stderr, _("Invalid filesystem option set: %s\n"),
|
|
|
|
str);
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2007-07-04 22:10:46 +04:00
|
|
|
extern const char *mke2fs_default_profile;
|
|
|
|
static const char *default_files[] = { "<default>", 0 };
|
|
|
|
|
1997-04-26 17:21:57 +04:00
|
|
|
static void PRS(int argc, char *argv[])
|
|
|
|
{
|
2003-04-12 06:10:50 +04:00
|
|
|
int b, c;
|
1999-10-26 18:35:51 +04:00
|
|
|
int size;
|
2006-03-24 06:00:01 +03:00
|
|
|
char *tmp, *tmp2;
|
1999-10-26 18:35:51 +04:00
|
|
|
int blocksize = 0;
|
|
|
|
int inode_ratio = 0;
|
2002-05-16 13:20:07 +04:00
|
|
|
int inode_size = 0;
|
2005-07-06 20:50:08 +04:00
|
|
|
double reserved_ratio = 5.0;
|
2003-05-22 01:28:29 +04:00
|
|
|
int sector_size = 0;
|
2003-12-07 10:28:24 +03:00
|
|
|
int show_version_only = 0;
|
2007-05-25 19:18:11 +04:00
|
|
|
unsigned long long num_inodes = 0; /* unsigned long long to catch too-large input */
|
1997-04-26 18:00:26 +04:00
|
|
|
errcode_t retval;
|
1999-10-26 18:35:51 +04:00
|
|
|
char * oldpath = getenv("PATH");
|
2005-01-05 19:12:20 +03:00
|
|
|
char * extended_opts = 0;
|
2001-12-17 07:23:37 +03:00
|
|
|
const char * fs_type = 0;
|
1999-10-26 18:35:51 +04:00
|
|
|
blk_t dev_size;
|
2002-03-08 04:52:12 +03:00
|
|
|
#ifdef __linux__
|
1999-10-26 18:35:51 +04:00
|
|
|
struct utsname ut;
|
1999-09-15 00:11:19 +04:00
|
|
|
#endif
|
2002-05-17 18:53:07 +04:00
|
|
|
long sysval;
|
2006-03-24 06:00:01 +03:00
|
|
|
int s_opt = -1, r_opt = -1;
|
|
|
|
char *fs_features = 0;
|
|
|
|
int use_bsize;
|
2006-11-15 07:38:17 +03:00
|
|
|
char *newpath;
|
|
|
|
int pathlen = sizeof(PATH_SET) + 1;
|
|
|
|
|
|
|
|
if (oldpath)
|
|
|
|
pathlen += strlen(oldpath);
|
|
|
|
newpath = malloc(pathlen);
|
|
|
|
strcpy(newpath, PATH_SET);
|
2001-05-14 02:58:27 +04:00
|
|
|
|
1997-04-26 17:21:57 +04:00
|
|
|
/* Update our PATH to include /sbin */
|
1997-04-26 18:00:26 +04:00
|
|
|
if (oldpath) {
|
|
|
|
strcat (newpath, ":");
|
|
|
|
strcat (newpath, oldpath);
|
2006-11-15 07:38:17 +03:00
|
|
|
}
|
|
|
|
putenv (newpath);
|
1997-04-26 17:21:57 +04:00
|
|
|
|
2001-01-16 10:47:31 +03:00
|
|
|
tmp = getenv("MKE2FS_SYNC");
|
|
|
|
if (tmp)
|
|
|
|
sync_kludge = atoi(tmp);
|
2002-05-17 18:53:07 +04:00
|
|
|
|
|
|
|
/* Determine the system page size if possible */
|
|
|
|
#ifdef HAVE_SYSCONF
|
|
|
|
#if (!defined(_SC_PAGESIZE) && defined(_SC_PAGE_SIZE))
|
|
|
|
#define _SC_PAGESIZE _SC_PAGE_SIZE
|
|
|
|
#endif
|
|
|
|
#ifdef _SC_PAGESIZE
|
|
|
|
sysval = sysconf(_SC_PAGESIZE);
|
2002-05-18 23:27:33 +04:00
|
|
|
if (sysval > 0)
|
2002-05-17 18:53:07 +04:00
|
|
|
sys_page_size = sysval;
|
|
|
|
#endif /* _SC_PAGESIZE */
|
|
|
|
#endif /* HAVE_SYSCONF */
|
2006-03-24 06:00:01 +03:00
|
|
|
|
|
|
|
if ((tmp = getenv("MKE2FS_CONFIG")) != NULL)
|
|
|
|
config_fn[0] = tmp;
|
|
|
|
profile_set_syntax_err_cb(syntax_err_report);
|
2007-07-04 22:10:46 +04:00
|
|
|
retval = profile_init(config_fn, &profile);
|
|
|
|
if (retval == ENOENT) {
|
|
|
|
profile_init(default_files, &profile);
|
|
|
|
profile_set_default(profile, mke2fs_default_profile);
|
|
|
|
}
|
2001-01-16 10:47:31 +03:00
|
|
|
|
1997-04-26 17:21:57 +04:00
|
|
|
setbuf(stdout, NULL);
|
|
|
|
setbuf(stderr, NULL);
|
2006-12-26 11:38:07 +03:00
|
|
|
add_error_table(&et_ext2_error_table);
|
|
|
|
add_error_table(&et_prof_error_table);
|
2005-12-11 05:50:30 +03:00
|
|
|
memset(&fs_param, 0, sizeof(struct ext2_super_block));
|
|
|
|
fs_param.s_rev_level = 1; /* Create revision 1 filesystems now */
|
2002-09-22 23:37:40 +04:00
|
|
|
|
2002-03-08 04:52:12 +03:00
|
|
|
#ifdef __linux__
|
2001-05-14 02:58:27 +04:00
|
|
|
if (uname(&ut)) {
|
|
|
|
perror("uname");
|
|
|
|
exit(1);
|
|
|
|
}
|
2004-09-25 15:40:12 +04:00
|
|
|
linux_version_code = parse_version_number(ut.release);
|
2006-03-24 06:00:01 +03:00
|
|
|
if (linux_version_code && linux_version_code < (2*65536 + 2*256))
|
2005-12-11 05:50:30 +03:00
|
|
|
fs_param.s_rev_level = 0;
|
2001-05-14 02:58:27 +04:00
|
|
|
#endif
|
2002-02-26 09:11:26 +03:00
|
|
|
|
|
|
|
if (argc && *argv) {
|
|
|
|
program_name = get_progname(*argv);
|
|
|
|
|
|
|
|
/* If called as mkfs.ext3, create a journal inode */
|
|
|
|
if (!strcmp(program_name, "mkfs.ext3"))
|
|
|
|
journal_size = -1;
|
|
|
|
}
|
|
|
|
|
1997-04-29 18:53:37 +04:00
|
|
|
while ((c = getopt (argc, argv,
|
2005-07-06 21:58:15 +04:00
|
|
|
"b:cf:g:i:jl:m:no:qr:s:tvE:FI:J:L:M:N:O:R:ST:V")) != EOF) {
|
1997-04-26 17:21:57 +04:00
|
|
|
switch (c) {
|
|
|
|
case 'b':
|
2003-04-12 06:10:50 +04:00
|
|
|
blocksize = strtol(optarg, &tmp, 0);
|
|
|
|
b = (blocksize > 0) ? blocksize : -blocksize;
|
|
|
|
if (b < EXT2_MIN_BLOCK_SIZE ||
|
|
|
|
b > EXT2_MAX_BLOCK_SIZE || *tmp) {
|
Many files:
badblocks.c, chattr.c, dumpe2fs.c, e2label.c, findsuper.c, fsck.c,
get_device_by_label.c, lsattr.c, mke2fs.c, mklost+found.c,
nls-enable.h, partinfo.c, tune2fs.c, uuidgen.c: Add
Internationalization support as suggested by Marco d'Itri
<md@linux.it>.
2000-02-08 03:47:55 +03:00
|
|
|
com_err(program_name, 0,
|
2005-05-06 07:15:55 +04:00
|
|
|
_("invalid block size - %s"), optarg);
|
1997-04-26 17:21:57 +04:00
|
|
|
exit(1);
|
|
|
|
}
|
2002-05-16 13:20:07 +04:00
|
|
|
if (blocksize > 4096)
|
|
|
|
fprintf(stderr, _("Warning: blocksize %d not "
|
|
|
|
"usable on most systems.\n"),
|
|
|
|
blocksize);
|
2003-04-12 06:10:50 +04:00
|
|
|
if (blocksize > 0)
|
2005-12-11 05:50:30 +03:00
|
|
|
fs_param.s_log_block_size =
|
2003-04-12 06:10:50 +04:00
|
|
|
int_log2(blocksize >>
|
|
|
|
EXT2_MIN_BLOCK_LOG_SIZE);
|
1997-04-26 17:21:57 +04:00
|
|
|
break;
|
2001-04-22 07:47:23 +04:00
|
|
|
case 'c': /* Check for bad blocks */
|
|
|
|
case 't': /* deprecated */
|
2001-12-24 23:01:59 +03:00
|
|
|
cflag++;
|
1997-04-26 17:21:57 +04:00
|
|
|
break;
|
|
|
|
case 'f':
|
|
|
|
size = strtoul(optarg, &tmp, 0);
|
2002-05-16 13:20:07 +04:00
|
|
|
if (size < EXT2_MIN_BLOCK_SIZE ||
|
|
|
|
size > EXT2_MAX_BLOCK_SIZE || *tmp) {
|
Many files:
badblocks.c, chattr.c, dumpe2fs.c, e2label.c, findsuper.c, fsck.c,
get_device_by_label.c, lsattr.c, mke2fs.c, mklost+found.c,
nls-enable.h, partinfo.c, tune2fs.c, uuidgen.c: Add
Internationalization support as suggested by Marco d'Itri
<md@linux.it>.
2000-02-08 03:47:55 +03:00
|
|
|
com_err(program_name, 0,
|
2005-06-20 16:35:27 +04:00
|
|
|
_("invalid fragment size - %s"),
|
1997-04-26 17:21:57 +04:00
|
|
|
optarg);
|
|
|
|
exit(1);
|
|
|
|
}
|
2005-12-11 05:50:30 +03:00
|
|
|
fs_param.s_log_frag_size =
|
1999-11-23 05:23:30 +03:00
|
|
|
int_log2(size >> EXT2_MIN_BLOCK_LOG_SIZE);
|
2002-03-08 08:14:46 +03:00
|
|
|
fprintf(stderr, _("Warning: fragments not supported. "
|
Many files:
badblocks.c, chattr.c, dumpe2fs.c, e2label.c, findsuper.c, fsck.c,
get_device_by_label.c, lsattr.c, mke2fs.c, mklost+found.c,
nls-enable.h, partinfo.c, tune2fs.c, uuidgen.c: Add
Internationalization support as suggested by Marco d'Itri
<md@linux.it>.
2000-02-08 03:47:55 +03:00
|
|
|
"Ignoring -f option\n"));
|
1997-04-26 17:21:57 +04:00
|
|
|
break;
|
|
|
|
case 'g':
|
2005-12-11 05:50:30 +03:00
|
|
|
fs_param.s_blocks_per_group = strtoul(optarg, &tmp, 0);
|
1997-04-26 17:34:30 +04:00
|
|
|
if (*tmp) {
|
|
|
|
com_err(program_name, 0,
|
Many files:
badblocks.c, chattr.c, dumpe2fs.c, e2label.c, findsuper.c, fsck.c,
get_device_by_label.c, lsattr.c, mke2fs.c, mklost+found.c,
nls-enable.h, partinfo.c, tune2fs.c, uuidgen.c: Add
Internationalization support as suggested by Marco d'Itri
<md@linux.it>.
2000-02-08 03:47:55 +03:00
|
|
|
_("Illegal number for blocks per group"));
|
1997-04-26 17:34:30 +04:00
|
|
|
exit(1);
|
|
|
|
}
|
2005-12-11 05:50:30 +03:00
|
|
|
if ((fs_param.s_blocks_per_group % 8) != 0) {
|
1997-04-26 17:34:30 +04:00
|
|
|
com_err(program_name, 0,
|
Many files:
badblocks.c, chattr.c, dumpe2fs.c, e2label.c, findsuper.c, fsck.c,
get_device_by_label.c, lsattr.c, mke2fs.c, mklost+found.c,
nls-enable.h, partinfo.c, tune2fs.c, uuidgen.c: Add
Internationalization support as suggested by Marco d'Itri
<md@linux.it>.
2000-02-08 03:47:55 +03:00
|
|
|
_("blocks per group must be multiple of 8"));
|
1997-04-26 17:21:57 +04:00
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 'i':
|
|
|
|
inode_ratio = strtoul(optarg, &tmp, 0);
|
2002-05-16 13:20:07 +04:00
|
|
|
if (inode_ratio < EXT2_MIN_BLOCK_SIZE ||
|
|
|
|
inode_ratio > EXT2_MAX_BLOCK_SIZE * 1024 ||
|
1997-04-26 17:21:57 +04:00
|
|
|
*tmp) {
|
Many files:
badblocks.c, chattr.c, dumpe2fs.c, e2label.c, findsuper.c, fsck.c,
get_device_by_label.c, lsattr.c, mke2fs.c, mklost+found.c,
nls-enable.h, partinfo.c, tune2fs.c, uuidgen.c: Add
Internationalization support as suggested by Marco d'Itri
<md@linux.it>.
2000-02-08 03:47:55 +03:00
|
|
|
com_err(program_name, 0,
|
2005-06-20 16:35:27 +04:00
|
|
|
_("invalid inode ratio %s (min %d/max %d)"),
|
2002-05-16 13:20:07 +04:00
|
|
|
optarg, EXT2_MIN_BLOCK_SIZE,
|
|
|
|
EXT2_MAX_BLOCK_SIZE);
|
1997-04-26 17:21:57 +04:00
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
break;
|
ChangeLog, mke2fs.8.in, mke2fs.c, tune2fs.8.in, tune2fs.c:
tune2fs.c, mke2fs.c, tune2fs.8.in, mke2fs.8.in: Change user interface
so that -J is used to specify journal options, and -j is used to
request creation of a journal using default values. (This is a UI
change, but we haven't done a formal release, and it makes things much
more consistent with the rest of the options out there.)
tune2fs.c: Add support for removing a filesystem from an external
journal; we correctly remove the filesystem UUID from the external
journal's filesystem list.
2001-01-18 04:51:15 +03:00
|
|
|
case 'J':
|
|
|
|
parse_journal_opts(optarg);
|
|
|
|
break;
|
2000-10-24 23:33:45 +04:00
|
|
|
case 'j':
|
ChangeLog, mke2fs.8.in, mke2fs.c, tune2fs.8.in, tune2fs.c:
tune2fs.c, mke2fs.c, tune2fs.8.in, mke2fs.8.in: Change user interface
so that -J is used to specify journal options, and -j is used to
request creation of a journal using default values. (This is a UI
change, but we haven't done a formal release, and it makes things much
more consistent with the rest of the options out there.)
tune2fs.c: Add support for removing a filesystem from an external
journal; we correctly remove the filesystem UUID from the external
journal's filesystem list.
2001-01-18 04:51:15 +03:00
|
|
|
if (!journal_size)
|
|
|
|
journal_size = -1;
|
2000-11-17 07:55:24 +03:00
|
|
|
break;
|
1997-04-26 17:21:57 +04:00
|
|
|
case 'l':
|
1997-04-26 17:34:30 +04:00
|
|
|
bad_blocks_filename = malloc(strlen(optarg)+1);
|
|
|
|
if (!bad_blocks_filename) {
|
|
|
|
com_err(program_name, ENOMEM,
|
Many files:
badblocks.c, chattr.c, dumpe2fs.c, e2label.c, findsuper.c, fsck.c,
get_device_by_label.c, lsattr.c, mke2fs.c, mklost+found.c,
nls-enable.h, partinfo.c, tune2fs.c, uuidgen.c: Add
Internationalization support as suggested by Marco d'Itri
<md@linux.it>.
2000-02-08 03:47:55 +03:00
|
|
|
_("in malloc for bad_blocks_filename"));
|
1997-04-26 17:34:30 +04:00
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
strcpy(bad_blocks_filename, optarg);
|
1997-04-26 17:21:57 +04:00
|
|
|
break;
|
|
|
|
case 'm':
|
2005-07-06 20:50:08 +04:00
|
|
|
reserved_ratio = strtod(optarg, &tmp);
|
1997-04-26 17:21:57 +04:00
|
|
|
if (reserved_ratio > 50 || *tmp) {
|
|
|
|
com_err(program_name, 0,
|
2005-06-20 16:35:27 +04:00
|
|
|
_("invalid reserved blocks percent - %s"),
|
1997-04-26 17:21:57 +04:00
|
|
|
optarg);
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
break;
|
1999-07-19 19:30:21 +04:00
|
|
|
case 'n':
|
|
|
|
noaction++;
|
|
|
|
break;
|
1997-04-29 18:53:37 +04:00
|
|
|
case 'o':
|
|
|
|
creator_os = optarg;
|
|
|
|
break;
|
2005-07-06 21:58:15 +04:00
|
|
|
case 'q':
|
|
|
|
quiet = 1;
|
|
|
|
break;
|
1997-04-26 18:48:50 +04:00
|
|
|
case 'r':
|
2006-03-24 06:00:01 +03:00
|
|
|
r_opt = strtoul(optarg, &tmp, 0);
|
2005-07-06 21:58:15 +04:00
|
|
|
if (*tmp) {
|
|
|
|
com_err(program_name, 0,
|
|
|
|
_("bad revision level - %s"), optarg);
|
|
|
|
exit(1);
|
|
|
|
}
|
2006-03-24 06:00:01 +03:00
|
|
|
fs_param.s_rev_level = r_opt;
|
1997-04-26 18:48:50 +04:00
|
|
|
break;
|
2001-04-22 07:47:23 +04:00
|
|
|
case 's': /* deprecated */
|
2006-03-24 06:00:01 +03:00
|
|
|
s_opt = atoi(optarg);
|
1997-04-29 21:48:10 +04:00
|
|
|
break;
|
1997-04-26 18:48:50 +04:00
|
|
|
case 'I':
|
2002-05-16 13:20:07 +04:00
|
|
|
inode_size = strtoul(optarg, &tmp, 0);
|
|
|
|
if (*tmp) {
|
|
|
|
com_err(program_name, 0,
|
2005-06-20 16:35:27 +04:00
|
|
|
_("invalid inode size - %s"), optarg);
|
2002-05-16 13:20:07 +04:00
|
|
|
exit(1);
|
|
|
|
}
|
1997-04-26 18:48:50 +04:00
|
|
|
break;
|
1997-04-26 17:21:57 +04:00
|
|
|
case 'v':
|
|
|
|
verbose = 1;
|
|
|
|
break;
|
1997-04-26 18:37:06 +04:00
|
|
|
case 'F':
|
2006-08-06 03:05:53 +04:00
|
|
|
force++;
|
1997-04-26 18:37:06 +04:00
|
|
|
break;
|
1997-04-29 18:53:37 +04:00
|
|
|
case 'L':
|
|
|
|
volume_label = optarg;
|
|
|
|
break;
|
|
|
|
case 'M':
|
|
|
|
mount_dir = optarg;
|
|
|
|
break;
|
2005-07-06 21:58:15 +04:00
|
|
|
case 'N':
|
|
|
|
num_inodes = strtoul(optarg, &tmp, 0);
|
|
|
|
if (*tmp) {
|
|
|
|
com_err(program_name, 0,
|
|
|
|
_("bad num inodes - %s"), optarg);
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
break;
|
1999-10-23 05:04:50 +04:00
|
|
|
case 'O':
|
2006-03-24 06:00:01 +03:00
|
|
|
fs_features = optarg;
|
1999-10-23 05:04:50 +04:00
|
|
|
break;
|
2005-01-05 19:12:20 +03:00
|
|
|
case 'E':
|
1997-04-30 01:26:48 +04:00
|
|
|
case 'R':
|
2005-01-05 19:12:20 +03:00
|
|
|
extended_opts = optarg;
|
1997-04-30 01:26:48 +04:00
|
|
|
break;
|
1997-04-26 17:34:30 +04:00
|
|
|
case 'S':
|
|
|
|
super_only = 1;
|
|
|
|
break;
|
1999-07-19 19:30:21 +04:00
|
|
|
case 'T':
|
|
|
|
fs_type = optarg;
|
|
|
|
break;
|
ChangeLog, debugfs.8.in, debugfs.c:
Add a -V option which displays the current version.
ChangeLog, unix.c:
unix.c (e2fsck_update_progress): Remove unused variables.
ChangeLog, inode.c:
inode.c (get_next_blockgroup): Fix bug where if get_next_blockgroup()
is called early because of a missing inode table in a block group, the
current_inode counter wasn't incremented correctly.
ChangeLog, tst_uuid.c:
tst_uuid.c (main): Fixed bogus declaration of the main's argv parameter.
ChangeLog, test_icount.c:
test_icount.c (main): Fix main() declaration so that it returns int,
not void.
Many files:
fsck.c (ignore): Remove unused variable cp.
chattr.c (fatal_error):
tune2fs.c (usage):
lsattr.c (usage):
dumpe2fs.c (usage):
badblocks.c (usage): Remove volatile from declaration.
fsck.c: Change use of strdup to be string_copy, since we don't trust
what glibc is doing with strdup. (Whatever it is, it isn't pretty.)
1998-06-27 09:11:14 +04:00
|
|
|
case 'V':
|
|
|
|
/* Print version number and exit */
|
2003-12-07 10:28:24 +03:00
|
|
|
show_version_only++;
|
|
|
|
break;
|
1997-04-26 17:21:57 +04:00
|
|
|
default:
|
|
|
|
usage();
|
|
|
|
}
|
|
|
|
}
|
2005-01-05 11:01:06 +03:00
|
|
|
if ((optind == argc) && !show_version_only)
|
1997-04-26 17:21:57 +04:00
|
|
|
usage();
|
2005-01-05 11:01:06 +03:00
|
|
|
device_name = argv[optind++];
|
1997-04-26 18:00:26 +04:00
|
|
|
|
2003-12-07 10:28:24 +03:00
|
|
|
if (!quiet || show_version_only)
|
2003-04-16 23:29:39 +04:00
|
|
|
fprintf (stderr, "mke2fs %s (%s)\n", E2FSPROGS_VERSION,
|
|
|
|
E2FSPROGS_DATE);
|
|
|
|
|
2003-12-07 10:28:24 +03:00
|
|
|
if (show_version_only) {
|
|
|
|
fprintf(stderr, _("\tUsing %s\n"),
|
|
|
|
error_message(EXT2_ET_BASE));
|
|
|
|
exit(0);
|
|
|
|
}
|
|
|
|
|
2001-07-28 06:00:18 +04:00
|
|
|
/*
|
|
|
|
* If there's no blocksize specified and there is a journal
|
|
|
|
* device, use it to figure out the blocksize
|
|
|
|
*/
|
2003-04-12 06:10:50 +04:00
|
|
|
if (blocksize <= 0 && journal_device) {
|
2001-07-28 06:00:18 +04:00
|
|
|
ext2_filsys jfs;
|
2003-07-09 02:03:48 +04:00
|
|
|
io_manager io_ptr;
|
2001-07-28 06:00:18 +04:00
|
|
|
|
2003-07-09 02:03:48 +04:00
|
|
|
#ifdef CONFIG_TESTIO_DEBUG
|
|
|
|
io_ptr = test_io_manager;
|
|
|
|
test_io_backing_manager = unix_io_manager;
|
|
|
|
#else
|
|
|
|
io_ptr = unix_io_manager;
|
|
|
|
#endif
|
2001-07-28 06:00:18 +04:00
|
|
|
retval = ext2fs_open(journal_device,
|
|
|
|
EXT2_FLAG_JOURNAL_DEV_OK, 0,
|
2003-07-09 02:03:48 +04:00
|
|
|
0, io_ptr, &jfs);
|
2001-07-28 06:00:18 +04:00
|
|
|
if (retval) {
|
|
|
|
com_err(program_name, retval,
|
|
|
|
_("while trying to open journal device %s\n"),
|
|
|
|
journal_device);
|
|
|
|
exit(1);
|
|
|
|
}
|
2003-12-07 09:28:50 +03:00
|
|
|
if ((blocksize < 0) && (jfs->blocksize < (unsigned) (-blocksize))) {
|
2003-04-12 06:10:50 +04:00
|
|
|
com_err(program_name, 0,
|
2003-05-04 02:45:55 +04:00
|
|
|
_("Journal dev blocksize (%d) smaller than "
|
2003-04-12 06:10:50 +04:00
|
|
|
"minimum blocksize %d\n"), jfs->blocksize,
|
|
|
|
-blocksize);
|
|
|
|
exit(1);
|
|
|
|
}
|
2001-07-28 06:00:18 +04:00
|
|
|
blocksize = jfs->blocksize;
|
2005-12-11 05:50:30 +03:00
|
|
|
fs_param.s_log_block_size =
|
2001-07-28 06:00:18 +04:00
|
|
|
int_log2(blocksize >> EXT2_MIN_BLOCK_LOG_SIZE);
|
|
|
|
ext2fs_close(jfs);
|
|
|
|
}
|
ChangeLog, mke2fs.8.in, mke2fs.c, tune2fs.8.in, tune2fs.c:
tune2fs.c, mke2fs.c, tune2fs.8.in, mke2fs.8.in: Change user interface
so that -J is used to specify journal options, and -j is used to
request creation of a journal using default values. (This is a UI
change, but we haven't done a formal release, and it makes things much
more consistent with the rest of the options out there.)
tune2fs.c: Add support for removing a filesystem from an external
journal; we correctly remove the filesystem UUID from the external
journal's filesystem list.
2001-01-18 04:51:15 +03:00
|
|
|
|
2002-05-17 18:53:07 +04:00
|
|
|
if (blocksize > sys_page_size) {
|
2002-05-16 13:20:07 +04:00
|
|
|
if (!force) {
|
|
|
|
com_err(program_name, 0,
|
|
|
|
_("%d-byte blocks too big for system (max %d)"),
|
2002-05-17 18:53:07 +04:00
|
|
|
blocksize, sys_page_size);
|
2002-05-16 13:20:07 +04:00
|
|
|
proceed_question();
|
|
|
|
}
|
|
|
|
fprintf(stderr, _("Warning: %d-byte blocks too big for system "
|
|
|
|
"(max %d), forced to continue\n"),
|
2002-05-17 18:53:07 +04:00
|
|
|
blocksize, sys_page_size);
|
2002-05-16 13:20:07 +04:00
|
|
|
}
|
2005-01-05 11:01:06 +03:00
|
|
|
if (optind < argc) {
|
2005-12-11 05:50:30 +03:00
|
|
|
fs_param.s_blocks_count = parse_num_blocks(argv[optind++],
|
|
|
|
fs_param.s_log_block_size);
|
|
|
|
if (!fs_param.s_blocks_count) {
|
2005-05-06 07:15:55 +04:00
|
|
|
com_err(program_name, 0, _("invalid blocks count - %s"),
|
2005-01-05 11:01:06 +03:00
|
|
|
argv[optind - 1]);
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (optind < argc)
|
|
|
|
usage();
|
|
|
|
|
1997-04-26 18:37:06 +04:00
|
|
|
if (!force)
|
2000-11-17 07:55:24 +03:00
|
|
|
check_plausibility(device_name);
|
ChangeLog, Makefile.in, mke2fs.c, tune2fs.8.in, tune2fs.c, util.c, util.h:
tune2fs.c (update_feature_set, add_journal): Moved to separate
functions. Added ability to add and remove the journal while the
filesystem is live. Added support for setting a time-based UUID.
Removed zero-initialized static variables.
mke2fs.c, util.c, util.h (strcasecmp, proceed_question,
check_plausibility, parse_journal_opts, check_mount): Moved functions
to util.c so they can be used by tune2fs.
mke2fs.c (main): Change ext2fs_add_journal_fs() to
ext2fs_add_journal_inode() to reflect function renaming.
2001-01-03 20:02:13 +03:00
|
|
|
check_mount(device_name, force, _("filesystem"));
|
1997-04-26 18:00:26 +04:00
|
|
|
|
2005-12-11 05:50:30 +03:00
|
|
|
fs_param.s_log_frag_size = fs_param.s_log_block_size;
|
1997-04-26 17:21:57 +04:00
|
|
|
|
2005-12-11 05:50:30 +03:00
|
|
|
if (noaction && fs_param.s_blocks_count) {
|
|
|
|
dev_size = fs_param.s_blocks_count;
|
1999-07-19 19:30:21 +04:00
|
|
|
retval = 0;
|
2005-01-28 03:07:26 +03:00
|
|
|
} else {
|
|
|
|
retry:
|
1999-07-19 19:30:21 +04:00
|
|
|
retval = ext2fs_get_device_size(device_name,
|
2005-12-11 05:50:30 +03:00
|
|
|
EXT2_BLOCK_SIZE(&fs_param),
|
1999-07-19 19:30:21 +04:00
|
|
|
&dev_size);
|
2005-01-28 03:07:26 +03:00
|
|
|
if ((retval == EFBIG) &&
|
|
|
|
(blocksize == 0) &&
|
2005-12-11 05:50:30 +03:00
|
|
|
(fs_param.s_log_block_size == 0)) {
|
|
|
|
fs_param.s_log_block_size = 2;
|
2005-01-28 03:07:26 +03:00
|
|
|
blocksize = 4096;
|
|
|
|
goto retry;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
1998-03-30 05:20:55 +04:00
|
|
|
if (retval && (retval != EXT2_ET_UNIMPLEMENTED)) {
|
|
|
|
com_err(program_name, retval,
|
Many files:
badblocks.c, chattr.c, dumpe2fs.c, e2label.c, findsuper.c, fsck.c,
get_device_by_label.c, lsattr.c, mke2fs.c, mklost+found.c,
nls-enable.h, partinfo.c, tune2fs.c, uuidgen.c: Add
Internationalization support as suggested by Marco d'Itri
<md@linux.it>.
2000-02-08 03:47:55 +03:00
|
|
|
_("while trying to determine filesystem size"));
|
1998-03-30 05:20:55 +04:00
|
|
|
exit(1);
|
|
|
|
}
|
2005-12-11 05:50:30 +03:00
|
|
|
if (!fs_param.s_blocks_count) {
|
1998-03-30 05:20:55 +04:00
|
|
|
if (retval == EXT2_ET_UNIMPLEMENTED) {
|
|
|
|
com_err(program_name, 0,
|
Many files:
badblocks.c, chattr.c, dumpe2fs.c, e2label.c, findsuper.c, fsck.c,
get_device_by_label.c, lsattr.c, mke2fs.c, mklost+found.c,
nls-enable.h, partinfo.c, tune2fs.c, uuidgen.c: Add
Internationalization support as suggested by Marco d'Itri
<md@linux.it>.
2000-02-08 03:47:55 +03:00
|
|
|
_("Couldn't determine device size; you "
|
1998-03-30 05:20:55 +04:00
|
|
|
"must specify\nthe size of the "
|
Many files:
badblocks.c, chattr.c, dumpe2fs.c, e2label.c, findsuper.c, fsck.c,
get_device_by_label.c, lsattr.c, mke2fs.c, mklost+found.c,
nls-enable.h, partinfo.c, tune2fs.c, uuidgen.c: Add
Internationalization support as suggested by Marco d'Itri
<md@linux.it>.
2000-02-08 03:47:55 +03:00
|
|
|
"filesystem\n"));
|
1997-04-26 18:00:26 +04:00
|
|
|
exit(1);
|
2000-05-29 19:05:42 +04:00
|
|
|
} else {
|
|
|
|
if (dev_size == 0) {
|
|
|
|
com_err(program_name, 0,
|
|
|
|
_("Device size reported to be zero. "
|
|
|
|
"Invalid partition specified, or\n\t"
|
|
|
|
"partition table wasn't reread "
|
|
|
|
"after running fdisk, due to\n\t"
|
|
|
|
"a modified partition being busy "
|
|
|
|
"and in use. You may need to reboot\n\t"
|
|
|
|
"to re-read your partition table.\n"
|
|
|
|
));
|
|
|
|
exit(1);
|
|
|
|
}
|
2005-12-11 05:50:30 +03:00
|
|
|
fs_param.s_blocks_count = dev_size;
|
|
|
|
if (sys_page_size > EXT2_BLOCK_SIZE(&fs_param))
|
|
|
|
fs_param.s_blocks_count &= ~((sys_page_size /
|
|
|
|
EXT2_BLOCK_SIZE(&fs_param))-1);
|
2000-05-29 19:05:42 +04:00
|
|
|
}
|
|
|
|
|
2005-12-11 05:50:30 +03:00
|
|
|
} else if (!force && (fs_param.s_blocks_count > dev_size)) {
|
1998-03-30 05:20:55 +04:00
|
|
|
com_err(program_name, 0,
|
2003-04-12 06:10:50 +04:00
|
|
|
_("Filesystem larger than apparent device size."));
|
1998-03-30 05:20:55 +04:00
|
|
|
proceed_question();
|
1997-04-26 18:00:26 +04:00
|
|
|
}
|
1997-04-26 17:21:57 +04:00
|
|
|
|
2006-03-24 06:00:01 +03:00
|
|
|
if (!fs_type) {
|
2006-09-12 22:56:18 +04:00
|
|
|
int megs = (__u64)fs_param.s_blocks_count *
|
2006-03-24 06:00:01 +03:00
|
|
|
(EXT2_BLOCK_SIZE(&fs_param) / 1024) / 1024;
|
|
|
|
|
2007-03-19 15:25:38 +03:00
|
|
|
if (fs_param.s_feature_incompat &
|
|
|
|
EXT3_FEATURE_INCOMPAT_JOURNAL_DEV)
|
|
|
|
fs_type = "journal";
|
|
|
|
else if (megs <= 3)
|
2006-03-24 06:00:01 +03:00
|
|
|
fs_type = "floppy";
|
|
|
|
else if (megs <= 512)
|
|
|
|
fs_type = "small";
|
|
|
|
else
|
|
|
|
fs_type = "default";
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Figure out what features should be enabled */
|
|
|
|
|
2006-10-18 08:31:11 +04:00
|
|
|
tmp = tmp2 = NULL;
|
|
|
|
if (fs_param.s_rev_level != EXT2_GOOD_OLD_REV) {
|
|
|
|
profile_get_string(profile, "defaults", "base_features", 0,
|
2007-05-08 07:38:14 +04:00
|
|
|
"sparse_super,filetype,resize_inode,dir_index",
|
|
|
|
&tmp);
|
2006-10-18 08:31:11 +04:00
|
|
|
profile_get_string(profile, "fs_types", fs_type,
|
|
|
|
"base_features", tmp, &tmp2);
|
|
|
|
edit_feature(tmp2, &fs_param.s_feature_compat);
|
|
|
|
free(tmp);
|
|
|
|
free(tmp2);
|
|
|
|
|
|
|
|
tmp = tmp2 = NULL;
|
|
|
|
profile_get_string(profile, "defaults", "default_features", 0,
|
|
|
|
"", &tmp);
|
|
|
|
profile_get_string(profile, "fs_types", fs_type,
|
|
|
|
"default_features", tmp, &tmp2);
|
|
|
|
}
|
|
|
|
edit_feature(fs_features ? fs_features : tmp2,
|
|
|
|
&fs_param.s_feature_compat);
|
|
|
|
if (tmp)
|
|
|
|
free(tmp);
|
|
|
|
if (tmp2)
|
|
|
|
free(tmp2);
|
|
|
|
|
|
|
|
if (r_opt == EXT2_GOOD_OLD_REV &&
|
|
|
|
(fs_param.s_feature_compat || fs_param.s_feature_incompat ||
|
|
|
|
fs_param.s_feature_incompat)) {
|
2006-03-24 06:00:01 +03:00
|
|
|
fprintf(stderr, _("Filesystem features not supported "
|
|
|
|
"with revision 0 filesystems\n"));
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
|
2006-10-18 08:31:11 +04:00
|
|
|
if (s_opt > 0) {
|
|
|
|
if (r_opt == EXT2_GOOD_OLD_REV) {
|
|
|
|
fprintf(stderr, _("Sparse superblocks not supported "
|
|
|
|
"with revision 0 filesystems\n"));
|
|
|
|
exit(1);
|
|
|
|
}
|
2006-03-24 06:00:01 +03:00
|
|
|
fs_param.s_feature_ro_compat |=
|
|
|
|
EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER;
|
2006-10-18 08:31:11 +04:00
|
|
|
} else if (s_opt == 0)
|
2006-03-24 06:00:01 +03:00
|
|
|
fs_param.s_feature_ro_compat &=
|
|
|
|
~EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER;
|
|
|
|
|
2006-10-18 08:31:11 +04:00
|
|
|
if (journal_size != 0) {
|
|
|
|
if (r_opt == EXT2_GOOD_OLD_REV) {
|
|
|
|
fprintf(stderr, _("Journals not supported "
|
|
|
|
"with revision 0 filesystems\n"));
|
|
|
|
exit(1);
|
|
|
|
}
|
2006-03-24 06:00:01 +03:00
|
|
|
fs_param.s_feature_compat |=
|
|
|
|
EXT3_FEATURE_COMPAT_HAS_JOURNAL;
|
2006-10-18 08:31:11 +04:00
|
|
|
}
|
2006-03-24 06:00:01 +03:00
|
|
|
|
|
|
|
if (fs_param.s_feature_incompat &
|
|
|
|
EXT3_FEATURE_INCOMPAT_JOURNAL_DEV) {
|
|
|
|
reserved_ratio = 0;
|
|
|
|
fs_param.s_feature_incompat = EXT3_FEATURE_INCOMPAT_JOURNAL_DEV;
|
|
|
|
fs_param.s_feature_compat = 0;
|
|
|
|
fs_param.s_feature_ro_compat = 0;
|
|
|
|
}
|
|
|
|
|
2002-10-20 08:38:57 +04:00
|
|
|
/* Set first meta blockgroup via an environment variable */
|
|
|
|
/* (this is mostly for debugging purposes) */
|
2005-12-11 05:50:30 +03:00
|
|
|
if ((fs_param.s_feature_incompat & EXT2_FEATURE_INCOMPAT_META_BG) &&
|
2002-10-20 08:38:57 +04:00
|
|
|
((tmp = getenv("MKE2FS_FIRST_META_BG"))))
|
2005-12-11 05:50:30 +03:00
|
|
|
fs_param.s_first_meta_bg = atoi(tmp);
|
2002-10-20 08:38:57 +04:00
|
|
|
|
2003-05-22 01:28:29 +04:00
|
|
|
/* Get the hardware sector size, if available */
|
|
|
|
retval = ext2fs_get_device_sectsize(device_name, §or_size);
|
|
|
|
if (retval) {
|
|
|
|
com_err(program_name, retval,
|
|
|
|
_("while trying to determine hardware sector size"));
|
|
|
|
exit(1);
|
|
|
|
}
|
2003-09-01 17:28:18 +04:00
|
|
|
|
2003-12-07 09:28:50 +03:00
|
|
|
if ((tmp = getenv("MKE2FS_DEVICE_SECTSIZE")) != NULL)
|
2003-09-01 17:28:18 +04:00
|
|
|
sector_size = atoi(tmp);
|
2003-05-22 01:28:29 +04:00
|
|
|
|
2006-03-24 06:00:01 +03:00
|
|
|
if (blocksize <= 0) {
|
|
|
|
profile_get_integer(profile, "defaults", "blocksize", 0,
|
2007-05-08 07:38:14 +04:00
|
|
|
4096, &use_bsize);
|
2006-03-24 06:00:01 +03:00
|
|
|
profile_get_integer(profile, "fs_types", fs_type,
|
|
|
|
"blocksize", use_bsize, &use_bsize);
|
|
|
|
|
|
|
|
if (use_bsize == -1) {
|
|
|
|
use_bsize = sys_page_size;
|
|
|
|
if ((linux_version_code < (2*65536 + 6*256)) &&
|
|
|
|
(use_bsize > 4096))
|
|
|
|
use_bsize = 4096;
|
|
|
|
}
|
|
|
|
if (sector_size && use_bsize < sector_size)
|
|
|
|
use_bsize = sector_size;
|
|
|
|
if ((blocksize < 0) && (use_bsize < (-blocksize)))
|
|
|
|
use_bsize = -blocksize;
|
|
|
|
blocksize = use_bsize;
|
|
|
|
fs_param.s_blocks_count /= blocksize / 1024;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (inode_ratio == 0) {
|
|
|
|
profile_get_integer(profile, "defaults", "inode_ratio", 0,
|
|
|
|
8192, &inode_ratio);
|
|
|
|
profile_get_integer(profile, "fs_types", fs_type,
|
|
|
|
"inode_ratio", inode_ratio,
|
|
|
|
&inode_ratio);
|
|
|
|
|
|
|
|
if (inode_ratio < blocksize)
|
|
|
|
inode_ratio = blocksize;
|
|
|
|
}
|
|
|
|
|
|
|
|
fs_param.s_log_frag_size = fs_param.s_log_block_size =
|
|
|
|
int_log2(blocksize >> EXT2_MIN_BLOCK_LOG_SIZE);
|
|
|
|
|
2005-12-11 05:50:30 +03:00
|
|
|
blocksize = EXT2_BLOCK_SIZE(&fs_param);
|
2003-04-12 06:10:50 +04:00
|
|
|
|
2005-01-05 19:12:20 +03:00
|
|
|
if (extended_opts)
|
2005-12-11 05:50:30 +03:00
|
|
|
parse_extended_opts(&fs_param, extended_opts);
|
2004-12-15 22:39:16 +03:00
|
|
|
|
|
|
|
/* Since sparse_super is the default, we would only have a problem
|
|
|
|
* here if it was explicitly disabled.
|
|
|
|
*/
|
2005-12-11 05:50:30 +03:00
|
|
|
if ((fs_param.s_feature_compat & EXT2_FEATURE_COMPAT_RESIZE_INODE) &&
|
|
|
|
!(fs_param.s_feature_ro_compat&EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER)) {
|
2004-12-15 22:39:16 +03:00
|
|
|
com_err(program_name, 0,
|
|
|
|
_("reserved online resize blocks not supported "
|
|
|
|
"on non-sparse filesystem"));
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
|
2005-12-11 05:50:30 +03:00
|
|
|
if (fs_param.s_blocks_per_group) {
|
|
|
|
if (fs_param.s_blocks_per_group < 256 ||
|
|
|
|
fs_param.s_blocks_per_group > 8 * (unsigned) blocksize) {
|
1997-04-29 21:48:10 +04:00
|
|
|
com_err(program_name, 0,
|
Many files:
badblocks.c, chattr.c, dumpe2fs.c, e2label.c, findsuper.c, fsck.c,
get_device_by_label.c, lsattr.c, mke2fs.c, mklost+found.c,
nls-enable.h, partinfo.c, tune2fs.c, uuidgen.c: Add
Internationalization support as suggested by Marco d'Itri
<md@linux.it>.
2000-02-08 03:47:55 +03:00
|
|
|
_("blocks per group count out of range"));
|
1997-04-29 21:48:10 +04:00
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2006-11-15 07:38:17 +03:00
|
|
|
if (!force && fs_param.s_blocks_count >= ((unsigned) 1 << 31)) {
|
2005-07-01 04:00:41 +04:00
|
|
|
com_err(program_name, 0,
|
|
|
|
_("Filesystem too large. No more than 2**31-1 blocks\n"
|
|
|
|
"\t (8TB using a blocksize of 4k) are currently supported."));
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
|
2006-03-24 06:00:01 +03:00
|
|
|
if ((blocksize > 4096) &&
|
|
|
|
(fs_param.s_feature_compat & EXT3_FEATURE_COMPAT_HAS_JOURNAL))
|
|
|
|
fprintf(stderr, _("\nWarning: some 2.4 kernels do not support "
|
|
|
|
"blocksizes greater than 4096\n\tusing ext3. "
|
|
|
|
"Use -b 4096 if this is an issue for you.\n\n"));
|
|
|
|
|
2006-07-16 06:08:20 +04:00
|
|
|
if (inode_size == 0) {
|
|
|
|
profile_get_integer(profile, "defaults", "inode_size", NULL,
|
|
|
|
0, &inode_size);
|
|
|
|
profile_get_integer(profile, "fs_types", fs_type,
|
|
|
|
"inode_size", inode_size,
|
|
|
|
&inode_size);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (inode_size && fs_param.s_rev_level >= EXT2_DYNAMIC_REV) {
|
2002-05-16 13:20:07 +04:00
|
|
|
if (inode_size < EXT2_GOOD_OLD_INODE_SIZE ||
|
2005-12-11 05:50:30 +03:00
|
|
|
inode_size > EXT2_BLOCK_SIZE(&fs_param) ||
|
2002-05-16 13:20:07 +04:00
|
|
|
inode_size & (inode_size - 1)) {
|
|
|
|
com_err(program_name, 0,
|
2005-06-20 16:35:27 +04:00
|
|
|
_("invalid inode size %d (min %d/max %d)"),
|
2002-05-16 13:20:07 +04:00
|
|
|
inode_size, EXT2_GOOD_OLD_INODE_SIZE,
|
2003-04-12 06:10:50 +04:00
|
|
|
blocksize);
|
2002-05-16 13:20:07 +04:00
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
if (inode_size != EXT2_GOOD_OLD_INODE_SIZE)
|
|
|
|
fprintf(stderr, _("Warning: %d-byte inodes not usable "
|
2006-07-16 06:08:20 +04:00
|
|
|
"on older systems\n"),
|
2002-05-16 13:20:07 +04:00
|
|
|
inode_size);
|
2005-12-11 05:50:30 +03:00
|
|
|
fs_param.s_inode_size = inode_size;
|
2002-05-16 13:20:07 +04:00
|
|
|
}
|
|
|
|
|
2006-09-12 22:56:17 +04:00
|
|
|
/* Make sure number of inodes specified will fit in 32 bits */
|
|
|
|
if (num_inodes == 0) {
|
2007-05-25 19:18:11 +04:00
|
|
|
unsigned long long n;
|
|
|
|
n = (unsigned long long) fs_param.s_blocks_count * blocksize / inode_ratio;
|
2006-09-12 22:56:17 +04:00
|
|
|
if (n > ~0U) {
|
|
|
|
com_err(program_name, 0,
|
|
|
|
_("too many inodes (%llu), raise inode ratio?"), n);
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
} else if (num_inodes > ~0U) {
|
|
|
|
com_err(program_name, 0,
|
|
|
|
_("too many inodes (%llu), specify < 2^32 inodes"),
|
2007-05-25 19:18:11 +04:00
|
|
|
num_inodes);
|
2006-09-12 22:56:17 +04:00
|
|
|
exit(1);
|
|
|
|
}
|
1997-04-26 17:21:57 +04:00
|
|
|
/*
|
|
|
|
* Calculate number of inodes based on the inode ratio
|
|
|
|
*/
|
2005-12-11 05:50:30 +03:00
|
|
|
fs_param.s_inodes_count = num_inodes ? num_inodes :
|
|
|
|
((__u64) fs_param.s_blocks_count * blocksize)
|
1997-04-26 17:34:30 +04:00
|
|
|
/ inode_ratio;
|
1997-04-26 17:21:57 +04:00
|
|
|
|
2007-05-23 00:04:51 +04:00
|
|
|
if ((((long long)fs_param.s_inodes_count) *
|
|
|
|
(inode_size ? inode_size : EXT2_GOOD_OLD_INODE_SIZE)) >=
|
|
|
|
(((long long)fs_param.s_blocks_count) *
|
|
|
|
EXT2_BLOCK_SIZE(&fs_param))) {
|
|
|
|
com_err(program_name, 0, _("inode_size (%u) * inodes_count "
|
|
|
|
"(%u) too big for a\n\t"
|
|
|
|
"filesystem with %lu blocks, "
|
|
|
|
"specify higher inode_ratio (-i)\n\t"
|
|
|
|
"or lower inode count (-N).\n"),
|
|
|
|
inode_size ? inode_size : EXT2_GOOD_OLD_INODE_SIZE,
|
2007-05-25 19:18:11 +04:00
|
|
|
fs_param.s_inodes_count,
|
|
|
|
(unsigned long) fs_param.s_blocks_count);
|
2007-05-23 00:04:51 +04:00
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
|
1997-04-26 17:21:57 +04:00
|
|
|
/*
|
|
|
|
* Calculate number of blocks to reserve
|
|
|
|
*/
|
2006-08-30 11:08:13 +04:00
|
|
|
fs_param.s_r_blocks_count = e2p_percent(reserved_ratio,
|
|
|
|
fs_param.s_blocks_count);
|
1997-04-26 17:21:57 +04:00
|
|
|
}
|
2004-12-15 22:39:16 +03:00
|
|
|
|
1997-04-26 17:21:57 +04:00
|
|
|
int main (int argc, char *argv[])
|
|
|
|
{
|
|
|
|
errcode_t retval = 0;
|
|
|
|
ext2_filsys fs;
|
|
|
|
badblocks_list bb_list = 0;
|
2000-10-24 23:33:45 +04:00
|
|
|
int journal_blocks;
|
2003-12-07 09:28:50 +03:00
|
|
|
unsigned int i;
|
|
|
|
int val;
|
2003-07-09 02:03:48 +04:00
|
|
|
io_manager io_ptr;
|
Many files:
badblocks.c, chattr.c, dumpe2fs.c, e2label.c, findsuper.c, fsck.c,
get_device_by_label.c, lsattr.c, mke2fs.c, mklost+found.c,
nls-enable.h, partinfo.c, tune2fs.c, uuidgen.c: Add
Internationalization support as suggested by Marco d'Itri
<md@linux.it>.
2000-02-08 03:47:55 +03:00
|
|
|
|
|
|
|
#ifdef ENABLE_NLS
|
|
|
|
setlocale(LC_MESSAGES, "");
|
2002-03-05 11:26:52 +03:00
|
|
|
setlocale(LC_CTYPE, "");
|
Many files:
badblocks.c, chattr.c, dumpe2fs.c, e2label.c, findsuper.c, fsck.c,
get_device_by_label.c, lsattr.c, mke2fs.c, mklost+found.c,
nls-enable.h, partinfo.c, tune2fs.c, uuidgen.c: Add
Internationalization support as suggested by Marco d'Itri
<md@linux.it>.
2000-02-08 03:47:55 +03:00
|
|
|
bindtextdomain(NLS_CAT_NAME, LOCALEDIR);
|
|
|
|
textdomain(NLS_CAT_NAME);
|
|
|
|
#endif
|
1997-04-26 17:21:57 +04:00
|
|
|
PRS(argc, argv);
|
|
|
|
|
2003-07-09 02:03:48 +04:00
|
|
|
#ifdef CONFIG_TESTIO_DEBUG
|
|
|
|
io_ptr = test_io_manager;
|
|
|
|
test_io_backing_manager = unix_io_manager;
|
|
|
|
#else
|
|
|
|
io_ptr = unix_io_manager;
|
|
|
|
#endif
|
|
|
|
|
1997-04-26 17:21:57 +04:00
|
|
|
/*
|
|
|
|
* Initialize the superblock....
|
|
|
|
*/
|
2006-03-19 04:02:05 +03:00
|
|
|
retval = ext2fs_initialize(device_name, EXT2_FLAG_EXCLUSIVE, &fs_param,
|
2003-07-09 02:03:48 +04:00
|
|
|
io_ptr, &fs);
|
1997-04-26 17:21:57 +04:00
|
|
|
if (retval) {
|
Many files:
badblocks.c, chattr.c, dumpe2fs.c, e2label.c, findsuper.c, fsck.c,
get_device_by_label.c, lsattr.c, mke2fs.c, mklost+found.c,
nls-enable.h, partinfo.c, tune2fs.c, uuidgen.c: Add
Internationalization support as suggested by Marco d'Itri
<md@linux.it>.
2000-02-08 03:47:55 +03:00
|
|
|
com_err(device_name, retval, _("while setting up superblock"));
|
1997-04-26 17:21:57 +04:00
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
|
2000-08-14 18:44:15 +04:00
|
|
|
/*
|
|
|
|
* Wipe out the old on-disk superblock
|
|
|
|
*/
|
2001-08-31 05:55:26 +04:00
|
|
|
if (!noaction)
|
|
|
|
zap_sector(fs, 2, 6);
|
2000-08-14 18:44:15 +04:00
|
|
|
|
1997-04-29 18:53:37 +04:00
|
|
|
/*
|
|
|
|
* Generate a UUID for it...
|
|
|
|
*/
|
2001-01-01 18:31:53 +03:00
|
|
|
uuid_generate(fs->super->s_uuid);
|
1997-04-29 18:53:37 +04:00
|
|
|
|
2002-09-22 23:37:40 +04:00
|
|
|
/*
|
|
|
|
* Initialize the directory index variables
|
|
|
|
*/
|
|
|
|
fs->super->s_def_hash_version = EXT2_HASH_TEA;
|
|
|
|
uuid_generate((unsigned char *) fs->super->s_hash_seed);
|
|
|
|
|
2001-01-14 20:02:09 +03:00
|
|
|
/*
|
|
|
|
* Add "jitter" to the superblock's check interval so that we
|
|
|
|
* don't check all the filesystems at the same time. We use a
|
|
|
|
* kludgy hack of using the UUID to derive a random jitter value.
|
|
|
|
*/
|
|
|
|
for (i = 0, val = 0 ; i < sizeof(fs->super->s_uuid); i++)
|
|
|
|
val += fs->super->s_uuid[i];
|
|
|
|
fs->super->s_max_mnt_count += val % EXT2_DFL_MAX_MNT_COUNT;
|
|
|
|
|
1997-04-29 18:53:37 +04:00
|
|
|
/*
|
|
|
|
* Override the creator OS, if applicable
|
|
|
|
*/
|
|
|
|
if (creator_os && !set_os(fs->super, creator_os)) {
|
Many files:
badblocks.c, chattr.c, dumpe2fs.c, e2label.c, findsuper.c, fsck.c,
get_device_by_label.c, lsattr.c, mke2fs.c, mklost+found.c,
nls-enable.h, partinfo.c, tune2fs.c, uuidgen.c: Add
Internationalization support as suggested by Marco d'Itri
<md@linux.it>.
2000-02-08 03:47:55 +03:00
|
|
|
com_err (program_name, 0, _("unknown os - %s"), creator_os);
|
1997-04-29 18:53:37 +04:00
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
|
ChangeLog, problem.c, problem.h, super.c:
problem.c, problem.h (PR_0_HURD_CLEAR_FILETYPE): Add new problem code.
super.c (check_super_block): If the OS type in the superblock is the
Hurd, check to see if the filetype feature is set, and offer to clear
it if so. This needs to be done since the Hurd doesn't properly
support the filetype feature. (And since the hurd allows the
transmogrification of files to special files and vice versa --- for no
good reason that I can understand --- it can't support the filetype
feature for the forseeable future, either.)
ChangeLog, mke2fs.c:
mke2fs.c (main): We forcibly turn off the filetype feature if the OS
is the hurd, since the hurd doesn't support it. (And since the hurd
allows the transmogrification of files to special files and vice versa
--- for no good reason that I can understand --- it can't support the
filetype feature for the forseeable future, either.)
mke2fs.c (proceed_question): Fix reversed sense of proceed_question
that was busted due to the internationalization patch. Fixed bug
where if proceed_question was called twice, the input buffer wasn't
cleared of the previous question's newline.
ChangeLog, expect.1, expect.2, image.gz, name:
f_hurd: Add test for Hurd-specific features (right now, just checks to
make sure the filetype feature is cleared)
ChangeLog, ls.c:
ls.c (list_super): Change the string displayed for the Hurd to be
GNU/Hurd, instead of just "GNU".
2000-05-08 17:33:17 +04:00
|
|
|
/*
|
|
|
|
* For the Hurd, we will turn off filetype since it doesn't
|
|
|
|
* support it.
|
|
|
|
*/
|
|
|
|
if (fs->super->s_creator_os == EXT2_OS_HURD)
|
|
|
|
fs->super->s_feature_incompat &=
|
|
|
|
~EXT2_FEATURE_INCOMPAT_FILETYPE;
|
|
|
|
|
1997-04-29 18:53:37 +04:00
|
|
|
/*
|
|
|
|
* Set the volume label...
|
|
|
|
*/
|
|
|
|
if (volume_label) {
|
2001-01-01 18:31:53 +03:00
|
|
|
memset(fs->super->s_volume_name, 0,
|
|
|
|
sizeof(fs->super->s_volume_name));
|
|
|
|
strncpy(fs->super->s_volume_name, volume_label,
|
|
|
|
sizeof(fs->super->s_volume_name));
|
1997-04-29 18:53:37 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Set the last mount directory
|
|
|
|
*/
|
|
|
|
if (mount_dir) {
|
2001-01-01 18:31:53 +03:00
|
|
|
memset(fs->super->s_last_mounted, 0,
|
|
|
|
sizeof(fs->super->s_last_mounted));
|
|
|
|
strncpy(fs->super->s_last_mounted, mount_dir,
|
|
|
|
sizeof(fs->super->s_last_mounted));
|
1997-04-29 18:53:37 +04:00
|
|
|
}
|
|
|
|
|
1999-07-19 19:30:21 +04:00
|
|
|
if (!quiet || noaction)
|
1997-04-26 17:21:57 +04:00
|
|
|
show_stats(fs);
|
|
|
|
|
1999-07-19 19:30:21 +04:00
|
|
|
if (noaction)
|
|
|
|
exit(0);
|
|
|
|
|
2001-01-16 10:47:31 +03:00
|
|
|
if (fs->super->s_feature_incompat &
|
|
|
|
EXT3_FEATURE_INCOMPAT_JOURNAL_DEV) {
|
|
|
|
create_journal_dev(fs);
|
2001-10-13 11:22:25 +04:00
|
|
|
exit(ext2fs_close(fs) ? 1 : 0);
|
2001-01-16 10:47:31 +03:00
|
|
|
}
|
|
|
|
|
1997-04-26 17:21:57 +04:00
|
|
|
if (bad_blocks_filename)
|
|
|
|
read_bb_file(fs, &bb_list, bad_blocks_filename);
|
|
|
|
if (cflag)
|
|
|
|
test_disk(fs, &bb_list);
|
|
|
|
|
|
|
|
handle_bad_blocks(fs, bb_list);
|
2007-05-19 06:06:53 +04:00
|
|
|
fs->stride = fs->super->s_raid_stride = fs_stride;
|
1997-04-29 20:17:09 +04:00
|
|
|
retval = ext2fs_allocate_tables(fs);
|
|
|
|
if (retval) {
|
|
|
|
com_err(program_name, retval,
|
Many files:
badblocks.c, chattr.c, dumpe2fs.c, e2label.c, findsuper.c, fsck.c,
get_device_by_label.c, lsattr.c, mke2fs.c, mklost+found.c,
nls-enable.h, partinfo.c, tune2fs.c, uuidgen.c: Add
Internationalization support as suggested by Marco d'Itri
<md@linux.it>.
2000-02-08 03:47:55 +03:00
|
|
|
_("while trying to allocate filesystem tables"));
|
1997-04-29 20:17:09 +04:00
|
|
|
exit(1);
|
|
|
|
}
|
1997-04-26 17:34:30 +04:00
|
|
|
if (super_only) {
|
|
|
|
fs->super->s_state |= EXT2_ERROR_FS;
|
|
|
|
fs->flags &= ~(EXT2_FLAG_IB_DIRTY|EXT2_FLAG_BB_DIRTY);
|
|
|
|
} else {
|
2001-08-31 01:39:04 +04:00
|
|
|
/* rsv must be a power of two (64kB is MD RAID sb alignment) */
|
2003-12-07 09:28:50 +03:00
|
|
|
unsigned int rsv = 65536 / fs->blocksize;
|
2001-05-14 08:19:25 +04:00
|
|
|
unsigned long blocks = fs->super->s_blocks_count;
|
2001-08-31 01:39:04 +04:00
|
|
|
unsigned long start;
|
2001-05-14 08:19:25 +04:00
|
|
|
blk_t ret_blk;
|
|
|
|
|
|
|
|
#ifdef ZAP_BOOTBLOCK
|
2001-08-31 05:55:26 +04:00
|
|
|
zap_sector(fs, 0, 2);
|
2001-05-14 08:19:25 +04:00
|
|
|
#endif
|
2001-08-31 01:39:04 +04:00
|
|
|
|
2001-05-14 08:19:25 +04:00
|
|
|
/*
|
|
|
|
* Wipe out any old MD RAID (or other) metadata at the end
|
|
|
|
* of the device. This will also verify that the device is
|
2001-08-31 01:39:04 +04:00
|
|
|
* as large as we think. Be careful with very small devices.
|
2001-05-14 08:19:25 +04:00
|
|
|
*/
|
2001-08-31 01:39:04 +04:00
|
|
|
start = (blocks & ~(rsv - 1));
|
|
|
|
if (start > rsv)
|
|
|
|
start -= rsv;
|
|
|
|
if (start > 0)
|
|
|
|
retval = zero_blocks(fs, start, blocks - start,
|
|
|
|
NULL, &ret_blk, NULL);
|
|
|
|
|
2001-05-14 08:19:25 +04:00
|
|
|
if (retval) {
|
|
|
|
com_err(program_name, retval,
|
2002-08-17 21:32:21 +04:00
|
|
|
_("while zeroing block %u at end of filesystem"),
|
2001-05-14 08:19:25 +04:00
|
|
|
ret_blk);
|
|
|
|
}
|
2006-05-09 04:17:26 +04:00
|
|
|
setup_lazy_bg(fs);
|
1997-04-29 20:17:09 +04:00
|
|
|
write_inode_tables(fs);
|
1997-04-26 17:34:30 +04:00
|
|
|
create_root_dir(fs);
|
|
|
|
create_lost_and_found(fs);
|
|
|
|
reserve_inodes(fs);
|
|
|
|
create_bad_block_inode(fs, bb_list);
|
2005-01-28 19:45:28 +03:00
|
|
|
if (fs->super->s_feature_compat &
|
|
|
|
EXT2_FEATURE_COMPAT_RESIZE_INODE) {
|
|
|
|
retval = ext2fs_create_resize_inode(fs);
|
|
|
|
if (retval) {
|
|
|
|
com_err("ext2fs_create_resize_inode", retval,
|
2004-12-15 22:39:16 +03:00
|
|
|
_("while reserving blocks for online resize"));
|
2005-01-28 19:45:28 +03:00
|
|
|
exit(1);
|
|
|
|
}
|
2004-12-15 22:39:16 +03:00
|
|
|
}
|
1997-04-26 17:34:30 +04:00
|
|
|
}
|
2000-11-17 07:55:24 +03:00
|
|
|
|
2001-01-16 10:47:31 +03:00
|
|
|
if (journal_device) {
|
|
|
|
ext2_filsys jfs;
|
|
|
|
|
2000-11-17 07:55:24 +03:00
|
|
|
if (!force)
|
|
|
|
check_plausibility(journal_device);
|
ChangeLog, Makefile.in, mke2fs.c, tune2fs.8.in, tune2fs.c, util.c, util.h:
tune2fs.c (update_feature_set, add_journal): Moved to separate
functions. Added ability to add and remove the journal while the
filesystem is live. Added support for setting a time-based UUID.
Removed zero-initialized static variables.
mke2fs.c, util.c, util.h (strcasecmp, proceed_question,
check_plausibility, parse_journal_opts, check_mount): Moved functions
to util.c so they can be used by tune2fs.
mke2fs.c (main): Change ext2fs_add_journal_fs() to
ext2fs_add_journal_inode() to reflect function renaming.
2001-01-03 20:02:13 +03:00
|
|
|
check_mount(journal_device, force, _("journal"));
|
2000-11-17 07:55:24 +03:00
|
|
|
|
2001-01-16 10:47:31 +03:00
|
|
|
retval = ext2fs_open(journal_device, EXT2_FLAG_RW|
|
|
|
|
EXT2_FLAG_JOURNAL_DEV_OK, 0,
|
|
|
|
fs->blocksize, unix_io_manager, &jfs);
|
|
|
|
if (retval) {
|
|
|
|
com_err(program_name, retval,
|
|
|
|
_("while trying to open journal device %s\n"),
|
|
|
|
journal_device);
|
|
|
|
exit(1);
|
|
|
|
}
|
2001-02-17 09:09:50 +03:00
|
|
|
if (!quiet) {
|
2001-07-28 06:00:18 +04:00
|
|
|
printf(_("Adding journal to device %s: "),
|
2000-11-17 07:55:24 +03:00
|
|
|
journal_device);
|
2001-02-17 09:09:50 +03:00
|
|
|
fflush(stdout);
|
|
|
|
}
|
2001-01-16 10:47:31 +03:00
|
|
|
retval = ext2fs_add_journal_device(fs, jfs);
|
|
|
|
if(retval) {
|
2000-11-17 07:55:24 +03:00
|
|
|
com_err (program_name, retval,
|
2001-04-17 05:01:49 +04:00
|
|
|
_("\n\twhile trying to add journal to device %s"),
|
2000-11-17 07:55:24 +03:00
|
|
|
journal_device);
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
if (!quiet)
|
|
|
|
printf(_("done\n"));
|
2001-01-16 10:47:31 +03:00
|
|
|
ext2fs_close(jfs);
|
2001-08-17 13:48:11 +04:00
|
|
|
free(journal_device);
|
2006-03-24 06:00:01 +03:00
|
|
|
} else if ((journal_size) ||
|
|
|
|
(fs_param.s_feature_compat &
|
|
|
|
EXT3_FEATURE_COMPAT_HAS_JOURNAL)) {
|
ChangeLog, mke2fs.8.in, mke2fs.c, tune2fs.8.in, tune2fs.c, util.c, util.h:
ke2fs.8.in, tune2fs.8.in: Change man paegs to document that the
journal must be bewteen 1024 and 10,240 file system blocks.
mke2fs.c, tune2fs.c: Change to use figure_journal_size()
util.c, util.h (figure_journal_size): Change journal_default_size into
routine which also converts the requested journal size into filesystem
blocks and does bounds checking to make sure the journal is sized
reasonably. Renamed function to journal_default_size.
parse_journal_opts): Remove bounds check for the journal size, since
this is now done in figure_journal_size, and based on the number of
filesystem blocks, as opposed to using the absolute size of the
journal.
2001-03-27 00:07:13 +04:00
|
|
|
journal_blocks = figure_journal_size(journal_size, fs);
|
2001-02-17 09:09:50 +03:00
|
|
|
|
|
|
|
if (!journal_blocks) {
|
|
|
|
fs->super->s_feature_compat &=
|
|
|
|
~EXT3_FEATURE_COMPAT_HAS_JOURNAL;
|
|
|
|
goto no_journal;
|
|
|
|
}
|
|
|
|
if (!quiet) {
|
2000-12-31 06:21:56 +03:00
|
|
|
printf(_("Creating journal (%d blocks): "),
|
|
|
|
journal_blocks);
|
2001-02-17 09:09:50 +03:00
|
|
|
fflush(stdout);
|
|
|
|
}
|
ChangeLog, Makefile.in, mke2fs.c, tune2fs.8.in, tune2fs.c, util.c, util.h:
tune2fs.c (update_feature_set, add_journal): Moved to separate
functions. Added ability to add and remove the journal while the
filesystem is live. Added support for setting a time-based UUID.
Removed zero-initialized static variables.
mke2fs.c, util.c, util.h (strcasecmp, proceed_question,
check_plausibility, parse_journal_opts, check_mount): Moved functions
to util.c so they can be used by tune2fs.
mke2fs.c (main): Change ext2fs_add_journal_fs() to
ext2fs_add_journal_inode() to reflect function renaming.
2001-01-03 20:02:13 +03:00
|
|
|
retval = ext2fs_add_journal_inode(fs, journal_blocks,
|
|
|
|
journal_flags);
|
2000-10-24 23:33:45 +04:00
|
|
|
if (retval) {
|
|
|
|
com_err (program_name, retval,
|
2001-04-17 05:01:49 +04:00
|
|
|
_("\n\twhile trying to create journal"));
|
2000-10-24 23:33:45 +04:00
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
if (!quiet)
|
|
|
|
printf(_("done\n"));
|
|
|
|
}
|
2001-02-17 09:09:50 +03:00
|
|
|
no_journal:
|
|
|
|
|
1997-04-26 17:21:57 +04:00
|
|
|
if (!quiet)
|
Many files:
badblocks.c, chattr.c, dumpe2fs.c, e2label.c, findsuper.c, fsck.c,
get_device_by_label.c, lsattr.c, mke2fs.c, mklost+found.c,
nls-enable.h, partinfo.c, tune2fs.c, uuidgen.c: Add
Internationalization support as suggested by Marco d'Itri
<md@linux.it>.
2000-02-08 03:47:55 +03:00
|
|
|
printf(_("Writing superblocks and "
|
|
|
|
"filesystem accounting information: "));
|
1999-03-16 22:35:19 +03:00
|
|
|
retval = ext2fs_flush(fs);
|
|
|
|
if (retval) {
|
2002-03-08 08:14:46 +03:00
|
|
|
fprintf(stderr,
|
|
|
|
_("\nWarning, had trouble writing out superblocks."));
|
1999-03-16 22:35:19 +03:00
|
|
|
}
|
2001-02-17 09:09:50 +03:00
|
|
|
if (!quiet) {
|
ChangeLog, mke2fs.8.in, mke2fs.c, tune2fs.8.in, tune2fs.c, util.c, util.h:
ke2fs.8.in, tune2fs.8.in: Change man paegs to document that the
journal must be bewteen 1024 and 10,240 file system blocks.
mke2fs.c, tune2fs.c: Change to use figure_journal_size()
util.c, util.h (figure_journal_size): Change journal_default_size into
routine which also converts the requested journal size into filesystem
blocks and does bounds checking to make sure the journal is sized
reasonably. Renamed function to journal_default_size.
parse_journal_opts): Remove bounds check for the journal size, since
this is now done in figure_journal_size, and based on the number of
filesystem blocks, as opposed to using the absolute size of the
journal.
2001-03-27 00:07:13 +04:00
|
|
|
printf(_("done\n\n"));
|
2003-09-01 17:28:18 +04:00
|
|
|
if (!getenv("MKE2FS_SKIP_CHECK_MSG"))
|
|
|
|
print_check_message(fs);
|
2001-02-17 09:09:50 +03:00
|
|
|
}
|
2001-10-13 11:22:25 +04:00
|
|
|
val = ext2fs_close(fs);
|
2006-12-26 11:38:07 +03:00
|
|
|
remove_error_table(&et_ext2_error_table);
|
|
|
|
remove_error_table(&et_prof_error_table);
|
2001-10-13 11:22:25 +04:00
|
|
|
return (retval || val) ? 1 : 0;
|
1997-04-26 17:21:57 +04:00
|
|
|
}
|