Whamcloud - gitweb
filefrag: Lustre changes to filefrag FIEMAP handling
[tools/e2fsprogs.git] / misc / mke2fs.c
index e1fd40e..a14e62e 100644 (file)
@@ -27,7 +27,7 @@
 #include <time.h>
 #ifdef __linux__
 #include <sys/utsname.h>
-#include <linux/version.h>
+#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))
 #endif
 #ifdef HAVE_GETOPT_H
 #include <getopt.h>
@@ -178,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;
@@ -192,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;
 }
@@ -367,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;
 }
@@ -821,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;
@@ -1307,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)
 {
@@ -1484,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) {
@@ -1569,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);
@@ -1658,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 */
@@ -1745,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) {
@@ -1770,6 +1796,8 @@ profile_error:
                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);
 
@@ -1845,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);
 
@@ -1903,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)
@@ -2098,7 +2126,15 @@ profile_error:
                        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;
 
@@ -2162,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.
         */
@@ -2202,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)) {
@@ -2709,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)
@@ -2831,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 &
@@ -2886,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");
 
@@ -2895,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."));