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@xxxxxxxxxx> --- e2fsck/profile.c | 37 +++++++++++++++++++++++++++++++++++++ e2fsck/profile.h | 5 +++++ misc/mke2fs.c | 26 +++++++++++++++++++++++++- misc/mke2fs.conf.5.in | 12 ++++++++++++ tests/mke2fs.conf.in | 1 + 5 files changed, 80 insertions(+), 1 deletions(-) diff --git a/e2fsck/profile.c b/e2fsck/profile.c index 5e9dc53..327bfb4 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 0c17732..4cc10eb 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 23f8c10..313423b 100644 --- a/misc/mke2fs.c +++ b/misc/mke2fs.c @@ -1072,6 +1072,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; @@ -1144,7 +1156,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 */ @@ -1667,6 +1679,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 2e8b585..0136e39 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 070d5d5..fbe2e2a 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 -- 1.7.3.1 -- To unsubscribe from this list: send the line "unsubscribe linux-ext4" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html