diff options
author | Aditya Kali <adityakali@google.com> | 2011-05-10 14:51:31 -0700 |
---|---|---|
committer | Theodore Ts'o <tytso@mit.edu> | 2011-05-14 23:34:48 -0400 |
commit | d3859af33f5bbbc432dedb20e85a5ae62e0fff03 (patch) | |
tree | 13a9df80c232e127d5a03845bf0f9381baa3607c | |
parent | 598d20cc3c0f71561402e13c07aaf5880b85fa37 (diff) | |
download | android_external_e2fsprogs-d3859af33f5bbbc432dedb20e85a5ae62e0fff03.tar.gz android_external_e2fsprogs-d3859af33f5bbbc432dedb20e85a5ae62e0fff03.tar.bz2 android_external_e2fsprogs-d3859af33f5bbbc432dedb20e85a5ae62e0fff03.zip |
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 <adityakali@google.com>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
-rw-r--r-- | e2fsck/profile.c | 37 | ||||
-rw-r--r-- | e2fsck/profile.h | 5 | ||||
-rw-r--r-- | misc/mke2fs.c | 26 | ||||
-rw-r--r-- | misc/mke2fs.conf.5.in | 12 | ||||
-rw-r--r-- | tests/mke2fs.conf.in | 1 |
5 files changed, 80 insertions, 1 deletions
diff --git a/e2fsck/profile.c b/e2fsck/profile.c index 5e9dc531..327bfb48 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 0c17732e..4cc10ebc 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 9798b888..ddfa929c 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 18346544..1710d700 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 070d5d56..fbe2e2a7 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 |