X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=misc%2Fmke2fs.c;h=a14e62e5fc0016db2306bcc95fd25b104dd63773;hb=624e49458eb92a29b4c66743260524768f4442f4;hp=abc8bd07a61595b23b924588d18c7163f08e6e15;hpb=9aef4b695445c0bc12a79b8c0bd68efc194302e7;p=tools%2Fe2fsprogs.git diff --git a/misc/mke2fs.c b/misc/mke2fs.c index abc8bd0..a14e62e 100644 --- a/misc/mke2fs.c +++ b/misc/mke2fs.c @@ -27,7 +27,7 @@ #include #ifdef __linux__ #include -#include +#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c)) #endif #ifdef HAVE_GETOPT_H #include @@ -62,7 +62,7 @@ extern int optind; #include "prof_err.h" #include "../version.h" #include "nls-enable.h" -#include "quota/mkquota.h" +#include "quota/quotaio.h" #include "mke2fs.h" #define STRIDE_LENGTH 8 @@ -102,6 +102,8 @@ static __u32 fs_stride; static int quotatype = -1; /* Initialize both user and group quotas by default */ static __u64 offset; static blk64_t journal_location = ~0LL; +static int proceed_delay = -1; +static blk64_t dev_size; static struct ext2_super_block fs_param; static char *fs_uuid = NULL; @@ -115,7 +117,6 @@ char **fs_types; static profile_t profile; static int sys_page_size = 4096; -static int linux_version_code = 0; static void usage(void) { @@ -177,7 +178,8 @@ static int parse_version_number(const char *s) return KERNEL_VERSION(major, minor, rev); } -static int is_before_linux_ver(unsigned int major, unsigned int minor) +static int is_before_linux_ver(unsigned int major, unsigned int minor, + unsigned int rev) { struct utsname ut; static int linux_version_code = -1; @@ -191,10 +193,11 @@ static int is_before_linux_ver(unsigned int major, unsigned int minor) if (linux_version_code == 0) return 0; - return linux_version_code < KERNEL_VERSION(major, minor, 0); + return linux_version_code < KERNEL_VERSION(major, minor, rev); } #else -static int is_before_linux_ver(unsigned int major, unsigned int minor) +static int is_before_linux_ver(unsigned int major, unsigned int minor, + unsigned int rev) { return 0; } @@ -366,6 +369,7 @@ static errcode_t packed_allocate_tables(ext2_filsys fs) ext2fs_block_alloc_stats_range(fs, goal, fs->inode_blocks_per_group, +1); ext2fs_inode_table_loc_set(fs, i, goal); + ext2fs_group_desc_csum_set(fs, i); } return 0; } @@ -618,6 +622,14 @@ static void show_stats(ext2_filsys fs) dgrp_t i; int need, col_left; + if (!verbose) { + printf(_("Creating filesystem with %llu %dk blocks and " + "%u inodes\n"), + ext2fs_blocks_count(s), fs->blocksize >> 10, + s->s_inodes_count); + goto skip_details; + } + if (ext2fs_blocks_count(&fs_param) != ext2fs_blocks_count(s)) fprintf(stderr, _("warning: %llu blocks unused.\n\n"), ext2fs_blocks_count(&fs_param) - ext2fs_blocks_count(s)); @@ -666,11 +678,14 @@ static void show_stats(ext2_filsys fs) s->s_blocks_per_group, s->s_clusters_per_group); printf(_("%u inodes per group\n"), s->s_inodes_per_group); +skip_details: if (fs->group_desc_count == 1) { printf("\n"); return; } + if (!e2p_is_null_uuid(s->s_uuid)) + printf(_("Filesystem UUID: %s\n"), e2p_uuid2str(s->s_uuid)); printf("%s", _("Superblock backups stored on blocks: ")); group_block = s->s_first_data_block; col_left = 0; @@ -809,7 +824,7 @@ static void parse_extended_opts(struct ext2_super_block *param, if (*p || num_backups > 2) { fprintf(stderr, _("Invalid # of backup " - "superbocks: %s\n"), + "superblocks: %s\n"), arg); r_usage++; continue; @@ -1295,6 +1310,18 @@ int get_int_from_profile(char **types, const char *opt, int def_val) return ret; } +static unsigned int get_uint_from_profile(char **types, const char *opt, + unsigned int def_val) +{ + unsigned int ret; + char **cpp; + + profile_get_uint(profile, "defaults", opt, 0, def_val, &ret); + for (cpp = types; *cpp; cpp++) + profile_get_uint(profile, "fs_types", *cpp, opt, ret, &ret); + return ret; +} + static double get_double_from_profile(char **types, const char *opt, double def_val) { @@ -1375,7 +1402,7 @@ out: static void PRS(int argc, char *argv[]) { - int b, c; + int b, c, flags; int cluster_size = 0; char *tmp, **cpp; int blocksize = 0; @@ -1384,14 +1411,13 @@ static void PRS(int argc, char *argv[]) unsigned long flex_bg_size = 0; double reserved_ratio = -1.0; int lsector_size = 0, psector_size = 0; - int show_version_only = 0; + int show_version_only = 0, is_device = 0; unsigned long long num_inodes = 0; /* unsigned long long to catch too-large input */ errcode_t retval; char * oldpath = getenv("PATH"); char * extended_opts = 0; char * fs_type = 0; char * usage_types = 0; - blk64_t dev_size; /* * NOTE: A few words about fs_blocks_count and blocksize: * @@ -1473,7 +1499,7 @@ profile_error: memset(&fs_param, 0, sizeof(struct ext2_super_block)); fs_param.s_rev_level = 1; /* Create revision 1 filesystems now */ - if (is_before_linux_ver(2, 2)) + if (is_before_linux_ver(2, 2, 0)) fs_param.s_rev_level = 0; if (argc && *argv) { @@ -1558,6 +1584,12 @@ profile_error: _("flex_bg size must be a power of 2")); exit(1); } + if (flex_bg_size > MAX_32_NUM) { + com_err(program_name, 0, + _("flex_bg size (%lu) must be less than" + " or equal to 2^31"), flex_bg_size); + exit(1); + } break; case 'i': inode_ratio = strtoul(optarg, &tmp, 0); @@ -1647,6 +1679,11 @@ profile_error: _("bad revision level - %s"), optarg); exit(1); } + if (r_opt > EXT2_MAX_SUPP_REV) { + com_err(program_name, EXT2_ET_REV_TOO_HIGH, + _("while trying to create revision %d"), r_opt); + exit(1); + } fs_param.s_rev_level = r_opt; break; case 's': /* deprecated */ @@ -1734,7 +1771,7 @@ profile_error: printf(_("Using journal device's blocksize: %d\n"), blocksize); fs_param.s_log_block_size = int_log2(blocksize >> EXT2_MIN_BLOCK_LOG_SIZE); - ext2fs_close(jfs); + ext2fs_close_free(&jfs); } if (optind < argc) { @@ -1750,8 +1787,20 @@ profile_error: if (optind < argc) usage(); - if (!force) - check_plausibility(device_name); + profile_get_integer(profile, "options", "proceed_delay", 0, 0, + &proceed_delay); + + /* The isatty() test is so we don't break existing scripts */ + flags = CREATE_FILE; + if (isatty(0) && isatty(1)) + flags |= CHECK_FS_EXIST; + if (!quiet) + flags |= VERBOSE_CREATE; + if (fs_blocks_count == 0) + flags |= NO_SIZE; + if (!check_plausibility(device_name, flags, &is_device) && !force) + proceed_question(proceed_delay); + check_mount(device_name, force, _("filesystem")); /* Determine the size of the device (if possible) */ @@ -1793,10 +1842,10 @@ profile_error: fs_blocks_count &= ~((blk64_t) ((sys_page_size / EXT2_BLOCK_SIZE(&fs_param))-1)); } - } else if (!force && (fs_blocks_count > dev_size)) { + } else if (!force && is_device && (fs_blocks_count > dev_size)) { com_err(program_name, 0, "%s", _("Filesystem larger than apparent device size.")); - proceed_question(); + proceed_question(proceed_delay); } if (!fs_type) @@ -1824,7 +1873,7 @@ profile_error: tmp = NULL; if (fs_param.s_rev_level != EXT2_GOOD_OLD_REV) { tmp = get_string_from_profile(fs_types, "base_features", - "sparse_super,filetype,resize_inode,dir_index"); + "sparse_super,large_file,filetype,resize_inode,dir_index"); edit_feature(tmp, &fs_param.s_feature_compat); free(tmp); @@ -1882,7 +1931,7 @@ profile_error: if (use_bsize == -1) { use_bsize = sys_page_size; - if (is_before_linux_ver(2, 6) && use_bsize > 4096) + if (is_before_linux_ver(2, 6, 0) && use_bsize > 4096) use_bsize = 4096; } if (lsector_size && use_bsize < lsector_size) @@ -2070,14 +2119,22 @@ profile_error: com_err(program_name, 0, _("%d-byte blocks too big for system (max %d)"), blocksize, sys_page_size); - proceed_question(); + proceed_question(proceed_delay); } fprintf(stderr, _("Warning: %d-byte blocks too big for system " "(max %d), forced to continue\n"), blocksize, sys_page_size); } - lazy_itable_init = 0; + /* + * On newer kernels we do have lazy_itable_init support. So pick the + * right default in case ext4 module is not loaded. + */ + if (is_before_linux_ver(2, 6, 37)) + lazy_itable_init = 0; + else + lazy_itable_init = 1; + if (access("/sys/fs/ext4/features/lazy_itable_init", R_OK) == 0) lazy_itable_init = 1; @@ -2141,13 +2198,6 @@ profile_error: "See https://ext4.wiki.kernel.org/" "index.php/Bigalloc for more information\n\n")); - if (!quiet && - (fs_param.s_feature_ro_compat & EXT4_FEATURE_RO_COMPAT_QUOTA)) - fprintf(stderr, "%s", _("\nWarning: the quota feature is " - "still under development\n" - "See https://ext4.wiki.kernel.org/" - "index.php/Quota for more information\n\n")); - /* Since sparse_super is the default, we would only have a problem * here if it was explicitly disabled. */ @@ -2181,8 +2231,8 @@ profile_error: inode_size = get_int_from_profile(fs_types, "inode_size", 0); if (!flex_bg_size && (fs_param.s_feature_incompat & EXT4_FEATURE_INCOMPAT_FLEX_BG)) - flex_bg_size = get_int_from_profile(fs_types, - "flex_bg_size", 16); + flex_bg_size = get_uint_from_profile(fs_types, + "flex_bg_size", 16); if (flex_bg_size) { if (!(fs_param.s_feature_incompat & EXT4_FEATURE_INCOMPAT_FLEX_BG)) { @@ -2489,7 +2539,7 @@ int main (int argc, char *argv[]) errcode_t retval = 0; ext2_filsys fs; badblocks_list bb_list = 0; - unsigned int journal_blocks; + unsigned int journal_blocks = 0; unsigned int i, checkinterval; int max_mnt_count; int val, hash_alg; @@ -2554,7 +2604,7 @@ int main (int argc, char *argv[]) journal_blocks = figure_journal_size(journal_size, fs); /* Can't undo discard ... */ - if (!noaction && discard && (io_ptr != undo_io_manager)) { + if (!noaction && discard && dev_size && (io_ptr != undo_io_manager)) { retval = mke2fs_discard_device(fs); if (!retval && io_channel_discard_zeroes_data(fs->io)) { if (verbose) @@ -2688,7 +2738,7 @@ int main (int argc, char *argv[]) if (fs->super->s_feature_incompat & EXT3_FEATURE_INCOMPAT_JOURNAL_DEV) { create_journal_dev(fs); - exit(ext2fs_close(fs) ? 1 : 0); + exit(ext2fs_close_free(&fs) ? 1 : 0); } if (bad_blocks_filename) @@ -2782,8 +2832,9 @@ int main (int argc, char *argv[]) if (journal_device) { ext2_filsys jfs; - if (!force) - check_plausibility(journal_device); + if (!check_plausibility(journal_device, CHECK_BLOCK_DEV, + NULL) && !force) + proceed_question(proceed_delay); check_mount(journal_device, force, _("journal")); retval = ext2fs_open(journal_device, EXT2_FLAG_RW| @@ -2809,7 +2860,7 @@ int main (int argc, char *argv[]) } if (!quiet) printf("%s", _("done\n")); - ext2fs_close(jfs); + ext2fs_close_free(&jfs); free(journal_device); } else if ((journal_size) || (fs_param.s_feature_compat & @@ -2864,7 +2915,7 @@ no_journal: EXT4_FEATURE_RO_COMPAT_QUOTA)) create_quota_inodes(fs); - retval = mk_hugefiles(fs); + retval = mk_hugefiles(fs, device_name); if (retval) com_err(program_name, retval, "while creating huge files"); @@ -2873,7 +2924,7 @@ no_journal: "filesystem accounting information: ")); checkinterval = fs->super->s_checkinterval; max_mnt_count = fs->super->s_max_mnt_count; - retval = ext2fs_close(fs); + retval = ext2fs_close_free(&fs); if (retval) { fprintf(stderr, "%s", _("\nWarning, had trouble writing out superblocks."));