Whamcloud - gitweb
mke2fs: Allow specifying reserved_ratio via mke2fs.conf
authorAditya Kali <adityakali@google.com>
Tue, 10 May 2011 21:51:31 +0000 (14:51 -0700)
committerTheodore Ts'o <tytso@mit.edu>
Sun, 15 May 2011 03:34:48 +0000 (23:34 -0400)
This patch adds support for specifying 'reserved_ratio' (percent blocks
reserved for super user, same as '-m' command line option) in mke2fs.conf.
It adds profile_get_double function in profile.c that allows reading
floating point values from profile files.

Signed-off-by: Aditya Kali <adityakali@google.com>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
e2fsck/profile.c
e2fsck/profile.h
misc/mke2fs.c
misc/mke2fs.conf.5.in
tests/mke2fs.conf.in

index 5e9dc53..327bfb4 100644 (file)
@@ -1596,6 +1596,43 @@ profile_get_uint(profile_t profile, const char *name, const char *subname,
        return 0;
 }
 
+errcode_t
+profile_get_double(profile_t profile, const char *name, const char *subname,
+                  const char *subsubname, double def_val, double *ret_double)
+{
+       const char      *value;
+       errcode_t         retval;
+       char        *end_value;
+       double      double_val;
+
+       *ret_double = def_val;
+       if (profile == 0)
+               return 0;
+
+       retval = profile_get_value(profile, name, subname, subsubname, &value);
+       if (retval == PROF_NO_SECTION || retval == PROF_NO_RELATION) {
+               *ret_double = def_val;
+               return 0;
+       } else if (retval)
+               return retval;
+
+       if (value[0] == 0)
+               /* Empty string is no good.  */
+               return PROF_BAD_INTEGER;
+       errno = 0;
+       double_val = strtod(value, &end_value);
+
+       /* Overflow or underflow.  */
+       if (errno != 0)
+               return PROF_BAD_INTEGER;
+       /* Garbage in string.  */
+       if (end_value != value + strlen(value))
+               return PROF_BAD_INTEGER;
+
+       *ret_double = double_val;
+       return 0;
+}
+
 static const char *const conf_yes[] = {
     "y", "yes", "true", "t", "1", "on",
     0,
index 0c17732..4cc10eb 100644 (file)
@@ -78,6 +78,11 @@ long profile_get_uint
                const char *subsubname, unsigned int def_val,
                unsigned int *ret_int);
 
+long profile_get_double
+       (profile_t profile, const char *name, const char *subname,
+               const char *subsubname, double def_val,
+               double *ret_float);
+
 long profile_get_boolean
        (profile_t profile, const char *name, const char *subname,
                        const char *subsubname, int def_val,
index 9798b88..ddfa929 100644 (file)
@@ -1082,6 +1082,18 @@ static int get_int_from_profile(char **fs_types, const char *opt, int def_val)
        return ret;
 }
 
+static double get_double_from_profile(char **fs_types, const char *opt,
+                                     double def_val)
+{
+       double ret;
+       char **cpp;
+
+       profile_get_double(profile, "defaults", opt, 0, def_val, &ret);
+       for (cpp = fs_types; *cpp; cpp++)
+               profile_get_double(profile, "fs_types", *cpp, opt, ret, &ret);
+       return ret;
+}
+
 static int get_bool_from_profile(char **fs_types, const char *opt, int def_val)
 {
        int ret;
@@ -1154,7 +1166,7 @@ static void PRS(int argc, char *argv[])
        int             inode_ratio = 0;
        int             inode_size = 0;
        unsigned long   flex_bg_size = 0;
-       double          reserved_ratio = 5.0;
+       double          reserved_ratio = -1.0;
        int             lsector_size = 0, psector_size = 0;
        int             show_version_only = 0;
        unsigned long long num_inodes = 0; /* unsigned long long to catch too-large input */
@@ -1675,6 +1687,18 @@ profile_error:
                        EXT3_FEATURE_COMPAT_HAS_JOURNAL;
        }
 
+       /* Get reserved_ratio from profile if not specified on cmd line. */
+       if (reserved_ratio < 0.0) {
+               reserved_ratio = get_double_from_profile(
+                                       fs_types, "reserved_ratio", 5.0);
+               if (reserved_ratio > 50 || reserved_ratio < 0) {
+                       com_err(program_name, 0,
+                               _("invalid reserved blocks percent - %lf"),
+                               reserved_ratio);
+                       exit(1);
+               }
+       }
+
        if (fs_param.s_feature_incompat &
            EXT3_FEATURE_INCOMPAT_JOURNAL_DEV) {
                reserved_ratio = 0;
index 1834654..1710d70 100644 (file)
@@ -168,6 +168,13 @@ specify one on the command line, and the filesystem-type
 specific section of the configuration file does not specify a default
 inode size.
 .TP
+.I reserved_ratio
+This relation specifies the default percentage of filesystem blocks
+reserved for the super-user, if the user does not
+specify one on the command line, and the filesystem-type
+specific section of the configuration file does not specify a default
+reserved ratio. This value can be a floating point number.
+.TP
 .I undo_dir
 This relation specifies the directory where the undo file should be
 stored.  It can be overridden via the
@@ -353,6 +360,11 @@ specify one on the command line.
 This relation specifies the default inode size if the user does not
 specify one on the command line.
 .TP
+.I reserved_ratio
+This relation specifies the default percentage of filesystem blocks
+reserved for the super-user, if the user does not specify one on the command
+line.
+.TP
 .I hash_alg
 This relation specifies the default hash algorithm used for the
 new filesystems with hashed b-tree directories.  Valid algorithms
index 070d5d5..fbe2e2a 100644 (file)
@@ -3,6 +3,7 @@
        blocksize = 4096
        inode_size = 256
        inode_ratio = 16384
+       reserved_ratio = 5.0
        enable_periodic_fsck = true
        lazy_itable_init = false
        default_mntopts = ^acl