OSDN Git Service

f2fs: introduce f2fs_casefolded_name slab cache
authorChao Yu <yuchao0@huawei.com>
Thu, 10 Jun 2021 23:46:30 +0000 (07:46 +0800)
committerJaegeuk Kim <jaegeuk@kernel.org>
Wed, 23 Jun 2021 08:09:35 +0000 (01:09 -0700)
Add a slab cache: "f2fs_casefolded_name" for memory allocation
of casefold name.

Reviewed-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Chao Yu <yuchao0@huawei.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
fs/f2fs/dir.c
fs/f2fs/recovery.c
fs/f2fs/super.c

index 96dcc4a..4566516 100644 (file)
 #include "xattr.h"
 #include <trace/events/f2fs.h>
 
+#ifdef CONFIG_UNICODE
+extern struct kmem_cache *f2fs_cf_name_slab;
+#endif
+
 static unsigned long dir_blocks(struct inode *inode)
 {
        return ((unsigned long long) (i_size_read(inode) + PAGE_SIZE - 1))
@@ -77,11 +81,10 @@ int f2fs_init_casefolded_name(const struct inode *dir,
 {
 #ifdef CONFIG_UNICODE
        struct super_block *sb = dir->i_sb;
-       struct f2fs_sb_info *sbi = F2FS_SB(sb);
 
        if (IS_CASEFOLDED(dir)) {
-               fname->cf_name.name = f2fs_kmalloc(sbi, F2FS_NAME_LEN,
-                                                  GFP_NOFS);
+               fname->cf_name.name = kmem_cache_alloc(f2fs_cf_name_slab,
+                                                               GFP_NOFS);
                if (!fname->cf_name.name)
                        return -ENOMEM;
                fname->cf_name.len = utf8_casefold(sb->s_encoding,
@@ -89,7 +92,7 @@ int f2fs_init_casefolded_name(const struct inode *dir,
                                                   fname->cf_name.name,
                                                   F2FS_NAME_LEN);
                if ((int)fname->cf_name.len <= 0) {
-                       kfree(fname->cf_name.name);
+                       kmem_cache_free(f2fs_cf_name_slab, fname->cf_name.name);
                        fname->cf_name.name = NULL;
                        if (sb_has_strict_encoding(sb))
                                return -EINVAL;
@@ -172,8 +175,10 @@ void f2fs_free_filename(struct f2fs_filename *fname)
        fname->crypto_buf.name = NULL;
 #endif
 #ifdef CONFIG_UNICODE
-       kfree(fname->cf_name.name);
-       fname->cf_name.name = NULL;
+       if (fname->cf_name.name) {
+               kmem_cache_free(f2fs_cf_name_slab, fname->cf_name.name);
+               fname->cf_name.name = NULL;
+       }
 #endif
 }
 
index 4b2f7d1..695eacf 100644 (file)
 
 static struct kmem_cache *fsync_entry_slab;
 
+#ifdef CONFIG_UNICODE
+extern struct kmem_cache *f2fs_cf_name_slab;
+#endif
+
 bool f2fs_space_for_roll_forward(struct f2fs_sb_info *sbi)
 {
        s64 nalloc = percpu_counter_sum_positive(&sbi->alloc_valid_block_count);
@@ -145,7 +149,7 @@ static int init_recovered_filename(const struct inode *dir,
                f2fs_hash_filename(dir, fname);
 #ifdef CONFIG_UNICODE
                /* Case-sensitive match is fine for recovery */
-               kfree(fname->cf_name.name);
+               kmem_cache_free(f2fs_cf_name_slab, fname->cf_name.name);
                fname->cf_name.name = NULL;
 #endif
        } else {
index d70122d..289cdda 100644 (file)
@@ -277,6 +277,24 @@ static int f2fs_sb_read_encoding(const struct f2fs_super_block *sb,
 
        return 0;
 }
+
+struct kmem_cache *f2fs_cf_name_slab;
+static int __init f2fs_create_casefold_cache(void)
+{
+       f2fs_cf_name_slab = f2fs_kmem_cache_create("f2fs_casefolded_name",
+                                                       F2FS_NAME_LEN);
+       if (!f2fs_cf_name_slab)
+               return -ENOMEM;
+       return 0;
+}
+
+static void f2fs_destroy_casefold_cache(void)
+{
+       kmem_cache_destroy(f2fs_cf_name_slab);
+}
+#else
+static int __init f2fs_create_casefold_cache(void) { return 0; }
+static void f2fs_destroy_casefold_cache(void) { }
 #endif
 
 static inline void limit_reserve_root(struct f2fs_sb_info *sbi)
@@ -4319,7 +4337,12 @@ static int __init init_f2fs_fs(void)
        err = f2fs_init_compress_cache();
        if (err)
                goto free_compress_mempool;
+       err = f2fs_create_casefold_cache();
+       if (err)
+               goto free_compress_cache;
        return 0;
+free_compress_cache:
+       f2fs_destroy_compress_cache();
 free_compress_mempool:
        f2fs_destroy_compress_mempool();
 free_bioset:
@@ -4355,6 +4378,7 @@ fail:
 
 static void __exit exit_f2fs_fs(void)
 {
+       f2fs_destroy_casefold_cache();
        f2fs_destroy_compress_cache();
        f2fs_destroy_compress_mempool();
        f2fs_destroy_bioset();