This patch makes feature bit work be global in f2fs-tools. Signed-off-by: Jaegeuk Kim <jaeg...@kernel.org> --- include/f2fs_fs.h | 77 +++++++++++++++++++++++++++++++++++++++++ mkfs/f2fs_format_main.c | 67 ++--------------------------------- 2 files changed, 80 insertions(+), 64 deletions(-)
diff --git a/include/f2fs_fs.h b/include/f2fs_fs.h index 54ac1c8..a1274fd 100644 --- a/include/f2fs_fs.h +++ b/include/f2fs_fs.h @@ -40,6 +40,14 @@ #include <linux/blkzoned.h> #endif +#ifdef HAVE_STDLIB_H +#include <stdlib.h> +#endif + +#ifdef HAVE_STRING_H +#include <string.h> +#endif + #ifdef HAVE_LIBSELINUX #include <selinux/selinux.h> #include <selinux/label.h> @@ -1307,4 +1315,73 @@ static inline void show_version(const char *prog) MSG(0, "%s %s (%s)\n", prog, F2FS_TOOLS_VERSION, F2FS_TOOLS_DATE); } +struct feature { + char *name; + u32 mask; +}; + +#define INIT_FEATURE_TABLE \ +struct feature feature_table[] = { \ + { "encrypt", F2FS_FEATURE_ENCRYPT }, \ + { "extra_attr", F2FS_FEATURE_EXTRA_ATTR }, \ + { "project_quota", F2FS_FEATURE_PRJQUOTA }, \ + { "inode_checksum", F2FS_FEATURE_INODE_CHKSUM }, \ + { "flexible_inline_xattr", F2FS_FEATURE_FLEXIBLE_INLINE_XATTR },\ + { "quota", F2FS_FEATURE_QUOTA_INO }, \ + { "inode_crtime", F2FS_FEATURE_INODE_CRTIME }, \ + { "lost_found", F2FS_FEATURE_LOST_FOUND }, \ + { "verity", F2FS_FEATURE_VERITY }, /* reserved */ \ + { NULL, 0x0}, \ +}; + +static inline u32 feature_map(struct feature *table, char *feature) +{ + struct feature *p; + for (p = table; p->name && strcmp(p->name, feature); p++) + ; + return p->mask; +} + +static inline int set_feature_bits(struct feature *table, char *features) +{ + u32 mask = feature_map(table, features); + if (mask) { + c.feature |= cpu_to_le32(mask); + } else { + MSG(0, "Error: Wrong features %s\n", features); + return -1; + } + return 0; +} + +static inline int parse_feature(struct feature *table, const char *features) +{ + char *buf, *sub, *next; + + buf = calloc(strlen(features) + 1, sizeof(char)); + ASSERT(buf); + strncpy(buf, features, strlen(features) + 1); + + for (sub = buf; sub && *sub; sub = next ? next + 1 : NULL) { + /* Skip the beginning blanks */ + while (*sub && *sub == ' ') + sub++; + next = sub; + /* Skip a feature word */ + while (*next && *next != ' ' && *next != ',') + next++; + + if (*next == 0) + next = NULL; + else + *next = 0; + + if (set_feature_bits(table, sub)) { + free(buf); + return -1; + } + } + free(buf); + return 0; +} #endif /*__F2FS_FS_H */ diff --git a/mkfs/f2fs_format_main.c b/mkfs/f2fs_format_main.c index 4e39fbd..8af70a2 100644 --- a/mkfs/f2fs_format_main.c +++ b/mkfs/f2fs_format_main.c @@ -37,23 +37,7 @@ extern struct sparse_file *f2fs_sparse_file; extern struct f2fs_configuration c; static int force_overwrite = 0; -struct feature { - char *name; - u32 mask; -}; - -struct feature feature_table[] = { - { "encrypt", F2FS_FEATURE_ENCRYPT }, - { "extra_attr", F2FS_FEATURE_EXTRA_ATTR }, - { "project_quota", F2FS_FEATURE_PRJQUOTA }, - { "inode_checksum", F2FS_FEATURE_INODE_CHKSUM }, - { "flexible_inline_xattr", F2FS_FEATURE_FLEXIBLE_INLINE_XATTR }, - { "quota", F2FS_FEATURE_QUOTA_INO }, - { "inode_crtime", F2FS_FEATURE_INODE_CRTIME }, - { "lost_found", F2FS_FEATURE_LOST_FOUND }, - { "verity", F2FS_FEATURE_VERITY }, /* reserved */ - { NULL, 0x0}, -}; +INIT_FEATURE_TABLE; static void mkfs_usage() { @@ -104,52 +88,6 @@ static void f2fs_show_info() MSG(0, "Info: Set conf for android\n"); } -static inline u32 feature_map(char *feature) -{ - struct feature *p; - for (p = feature_table; p->name && strcmp(p->name, feature); p++) - ; - return p->mask; -} - -static void set_feature_bits(char *features) -{ - u32 mask = feature_map(features); - if (mask) { - c.feature |= cpu_to_le32(mask); - } else { - MSG(0, "Error: Wrong features %s\n", features); - mkfs_usage(); - } -} - -static void parse_feature(const char *features) -{ - char *buf, *sub, *next; - - buf = calloc(strlen(features) + 1, sizeof(char)); - ASSERT(buf); - strncpy(buf, features, strlen(features) + 1); - - for (sub = buf; sub && *sub; sub = next ? next + 1 : NULL) { - /* Skip the beginning blanks */ - while (*sub && *sub == ' ') - sub++; - next = sub; - /* Skip a feature word */ - while (*next && *next != ' ' && *next != ',') - next++; - - if (*next == 0) - next = NULL; - else - *next = 0; - - set_feature_bits(sub); - } - free(buf); -} - static void add_default_options(void) { switch (c.defset) { @@ -221,7 +159,8 @@ static void f2fs_parse_options(int argc, char *argv[]) c.overprovision = atof(optarg); break; case 'O': - parse_feature(optarg); + if (parse_feature(feature_table, optarg)) + mkfs_usage(); break; case 's': c.segs_per_sec = atoi(optarg); -- 2.17.0.484.g0c8726318c-goog ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot _______________________________________________ Linux-f2fs-devel mailing list Linux-f2fs-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel