This patch adds new option '-E' to accept user configured hot file
extension, in order to let kernel module handle hot/cold file's datas
separately better.

Signed-off-by: Chao Yu <yuch...@huawei.com>
---
v3:
- remove debug log.
 include/f2fs_fs.h       |  5 ++--
 mkfs/f2fs_format.c      | 74 +++++++++++++++++++++++++++++++------------------
 mkfs/f2fs_format_main.c | 16 +++++++----
 3 files changed, 61 insertions(+), 34 deletions(-)

diff --git a/include/f2fs_fs.h b/include/f2fs_fs.h
index ca4522d54de2..be0a2da8f950 100644
--- a/include/f2fs_fs.h
+++ b/include/f2fs_fs.h
@@ -347,7 +347,7 @@ struct f2fs_configuration {
        int32_t dump_fd;
        struct device_info devices[MAX_DEVICES];
        int ndevs;
-       char *extension_list;
+       char *extension_list[2];
        const char *rootdev_name;
        int dbg_lv;
        int show_dentry;
@@ -614,7 +614,8 @@ struct f2fs_super_block {
        __u8 encrypt_pw_salt[16];       /* Salt used for string2key algorithm */
        struct f2fs_device devs[MAX_DEVICES];   /* device list */
        __le32 qf_ino[F2FS_MAX_QUOTAS]; /* quota inode numbers */
-       __u8 reserved[315];             /* valid reserved region */
+       __u8 hot_ext_count;             /* # of hot file extension */
+       __u8 reserved[314];             /* valid reserved region */
 } __attribute__((packed));
 
 /*
diff --git a/mkfs/f2fs_format.c b/mkfs/f2fs_format.c
index c9492f6bc986..befa80066d81 100644
--- a/mkfs/f2fs_format.c
+++ b/mkfs/f2fs_format.c
@@ -68,6 +68,15 @@ const char *media_ext_lists[] = {
        NULL
 };
 
+const char *hot_ext_lists[] = {
+       NULL
+};
+
+const char **default_ext_list[] = {
+       media_ext_lists,
+       hot_ext_lists
+};
+
 static bool is_extension_exist(const char *name)
 {
        int i;
@@ -83,44 +92,55 @@ static bool is_extension_exist(const char *name)
 
 static void cure_extension_list(void)
 {
-       const char **extlist = media_ext_lists;
-       char *ext_str = c.extension_list;
+       const char **extlist;
+       char *ext_str;
        char *ue;
        int name_len;
-       int i = 0;
+       int i, pos = 0;
 
        set_sb(extension_count, 0);
        memset(sb->extension_list, 0, sizeof(sb->extension_list));
 
-       while (*extlist) {
-               name_len = strlen(*extlist);
-               memcpy(sb->extension_list[i++], *extlist, name_len);
-               extlist++;
-       }
-       set_sb(extension_count, i);
-
-       if (!ext_str)
-               return;
+       for (i = 0; i < 2; i++) {
+               ext_str = c.extension_list[i];
+               extlist = default_ext_list[i];
 
-       /* add user ext list */
-       ue = strtok(ext_str, ", ");
-       while (ue != NULL) {
-               name_len = strlen(ue);
-               if (name_len >= 8) {
-                       MSG(0, "\tWarn: Extension name (%s) is too long\n", ue);
-                       goto next;
+               while (*extlist) {
+                       name_len = strlen(*extlist);
+                       memcpy(sb->extension_list[pos++], *extlist, name_len);
+                       extlist++;
                }
-               if (!is_extension_exist(ue))
-                       memcpy(sb->extension_list[i++], ue, name_len);
+               if (i == 0)
+                       set_sb(extension_count, pos);
+               else
+                       sb->hot_ext_count = pos - get_sb(extension_count);;
+
+               if (!ext_str)
+                       continue;
+
+               /* add user ext list */
+               ue = strtok(ext_str, ", ");
+               while (ue != NULL) {
+                       name_len = strlen(ue);
+                       if (name_len >= 8) {
+                               MSG(0, "\tWarn: Extension name (%s) is too 
long\n", ue);
+                               goto next;
+                       }
+                       if (!is_extension_exist(ue))
+                               memcpy(sb->extension_list[pos++], ue, name_len);
 next:
-               ue = strtok(NULL, ", ");
-               if (i >= F2FS_MAX_EXTENSION)
-                       break;
-       }
+                       ue = strtok(NULL, ", ");
+                       if (pos >= F2FS_MAX_EXTENSION)
+                               break;
+               }
 
-       set_sb(extension_count, i);
+               if (i == 0)
+                       set_sb(extension_count, pos);
+               else
+                       sb->hot_ext_count = pos - get_sb(extension_count);
 
-       free(c.extension_list);
+               free(c.extension_list[i]);
+       }
 }
 
 static void verify_cur_segs(void)
diff --git a/mkfs/f2fs_format_main.c b/mkfs/f2fs_format_main.c
index 120eeba91007..4a52a24cd297 100644
--- a/mkfs/f2fs_format_main.c
+++ b/mkfs/f2fs_format_main.c
@@ -44,7 +44,8 @@ static void mkfs_usage()
        MSG(0, "  -a heap-based allocation [default:0]\n");
        MSG(0, "  -c [device path] up to 7 devices excepts meta device\n");
        MSG(0, "  -d debug level [default:0]\n");
-       MSG(0, "  -e [extension list] e.g. \"mp3,gif,mov\"\n");
+       MSG(0, "  -e [cold file ext list] e.g. \"mp3,gif,mov\"\n");
+       MSG(0, "  -E [hot file ext list] e.g. \"db\"\n");
        MSG(0, "  -f force overwrite the exist filesystem\n");
        MSG(0, "  -i extended node bitmap, node ratio is 20%% by default\n");
        MSG(0, "  -l label\n");
@@ -69,8 +70,10 @@ static void f2fs_show_info()
                MSG(0, "Info: Disable heap-based policy\n");
 
        MSG(0, "Info: Debug level = %d\n", c.dbg_lv);
-       if (c.extension_list)
-               MSG(0, "Info: Add new extension list\n");
+       if (c.extension_list[0])
+               MSG(0, "Info: Add new cold file extension list\n");
+       if (c.extension_list[1])
+               MSG(0, "Info: Add new hot file extension list\n");
 
        if (c.vol_label)
                MSG(0, "Info: Label = %s\n", c.vol_label);
@@ -103,7 +106,7 @@ static void parse_feature(const char *features)
 
 static void f2fs_parse_options(int argc, char *argv[])
 {
-       static const char *option_string = "qa:c:d:e:il:mo:O:s:S:z:t:f";
+       static const char *option_string = "qa:c:d:e:E:il:mo:O:s:S:z:t:f";
        int32_t option=0;
 
        while ((option = getopt(argc,argv,option_string)) != EOF) {
@@ -131,7 +134,10 @@ static void f2fs_parse_options(int argc, char *argv[])
                        c.dbg_lv = atoi(optarg);
                        break;
                case 'e':
-                       c.extension_list = strdup(optarg);
+                       c.extension_list[0] = strdup(optarg);
+                       break;
+               case 'E':
+                       c.extension_list[1] = strdup(optarg);
                        break;
                case 'i':
                        c.large_nat_bitmap = 1;
-- 
2.15.0.55.gc2ece9dc4de6

Reply via email to