From: Aditya Kali Date: Tue, 10 May 2011 21:51:31 +0000 (-0700) Subject: mke2fs: Allow specifying reserved_ratio via mke2fs.conf X-Git-Tag: v1.42-WIP-0702~41 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d3859af33f5bbbc432dedb20e85a5ae62e0fff03;p=thirdparty%2Fe2fsprogs.git mke2fs: Allow specifying reserved_ratio via mke2fs.conf 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 Signed-off-by: Theodore Ts'o --- diff --git a/e2fsck/profile.c b/e2fsck/profile.c index 5e9dc5316..327bfb487 100644 --- a/e2fsck/profile.c +++ b/e2fsck/profile.c @@ -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, diff --git a/e2fsck/profile.h b/e2fsck/profile.h index 0c17732e5..4cc10ebcb 100644 --- a/e2fsck/profile.h +++ b/e2fsck/profile.h @@ -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, diff --git a/misc/mke2fs.c b/misc/mke2fs.c index 9798b888d..ddfa929cf 100644 --- a/misc/mke2fs.c +++ b/misc/mke2fs.c @@ -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; diff --git a/misc/mke2fs.conf.5.in b/misc/mke2fs.conf.5.in index 18346544a..1710d7003 100644 --- a/misc/mke2fs.conf.5.in +++ b/misc/mke2fs.conf.5.in @@ -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 diff --git a/tests/mke2fs.conf.in b/tests/mke2fs.conf.in index 070d5d561..fbe2e2a74 100644 --- a/tests/mke2fs.conf.in +++ b/tests/mke2fs.conf.in @@ -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