mkfs.f2fs: support hot file extension
authorChao Yu <yuchao0@huawei.com>
Thu, 1 Mar 2018 02:48:47 +0000 (10:48 +0800)
committerJaegeuk Kim <jaegeuk@kernel.org>
Mon, 7 May 2018 21:49:38 +0000 (14:49 -0700)
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 <yuchao0@huawei.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
include/f2fs_fs.h
mkfs/f2fs_format.c
mkfs/f2fs_format_main.c

index 9101acf..27671d9 100644 (file)
@@ -348,7 +348,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;
@@ -611,7 +611,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));
 
 /*
index a4d3660..662ac52 100644 (file)
@@ -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)
index de408ec..19a90b9 100644 (file)
@@ -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");
@@ -70,8 +71,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);
@@ -106,7 +109,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:fw:";
+       static const char *option_string = "qa:c:d:e:E:il:mo:O:s:S:z:t:fw:";
        int32_t option=0;
 
        while ((option = getopt(argc,argv,option_string)) != EOF) {
@@ -134,7 +137,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;