This switches f2fs over to the generic casefolded support provided in
the previous patch

Signed-off-by: Daniel Rosenberg <dro...@google.com>
---
 fs/f2fs/dir.c           | 63 +++++++----------------------------------
 fs/f2fs/f2fs.h          |  4 ---
 fs/f2fs/hash.c          |  2 +-
 fs/f2fs/super.c         | 10 +++----
 fs/f2fs/sysfs.c         | 10 ++++---
 include/linux/f2fs_fs.h |  3 --
 6 files changed, 22 insertions(+), 70 deletions(-)

diff --git a/fs/f2fs/dir.c b/fs/f2fs/dir.c
index 27d0dd7a16d6d..d822c0d5eb182 100644
--- a/fs/f2fs/dir.c
+++ b/fs/f2fs/dir.c
@@ -114,8 +114,8 @@ static struct f2fs_dir_entry *find_in_block(struct inode 
*dir,
 int f2fs_ci_compare(const struct inode *parent, const struct qstr *name,
                                const struct qstr *entry, bool quick)
 {
-       const struct f2fs_sb_info *sbi = F2FS_SB(parent->i_sb);
-       const struct unicode_map *um = sbi->s_encoding;
+       const struct super_block *sb = parent->i_sb;
+       const struct unicode_map *um = sb->s_encoding;
        int ret;
 
        if (quick)
@@ -127,7 +127,7 @@ int f2fs_ci_compare(const struct inode *parent, const 
struct qstr *name,
                /* Handle invalid character sequence as either an error
                 * or as an opaque byte sequence.
                 */
-               if (f2fs_has_strict_mode(sbi))
+               if (sb_has_enc_strict_mode(sb))
                        return -EINVAL;
 
                if (name->len != entry->len)
@@ -154,7 +154,7 @@ static void f2fs_fname_setup_ci_filename(struct inode *dir,
        if (!cf_name->name)
                return;
 
-       cf_name->len = utf8_casefold(sbi->s_encoding,
+       cf_name->len = utf8_casefold(dir->i_sb->s_encoding,
                                        iname, cf_name->name,
                                        F2FS_NAME_LEN);
        if ((int)cf_name->len <= 0) {
@@ -173,7 +173,7 @@ static inline bool f2fs_match_name(struct f2fs_dentry_ptr 
*d,
 {
 #ifdef CONFIG_UNICODE
        struct inode *parent = d->inode;
-       struct f2fs_sb_info *sbi = F2FS_I_SB(parent);
+       struct super_block *sb = parent->i_sb;
        struct qstr entry;
 #endif
 
@@ -184,7 +184,7 @@ static inline bool f2fs_match_name(struct f2fs_dentry_ptr 
*d,
        entry.name = d->filename[bit_pos];
        entry.len = de->name_len;
 
-       if (sbi->s_encoding && IS_CASEFOLDED(parent)) {
+       if (sb->s_encoding && IS_CASEFOLDED(parent)) {
                if (cf_str->name) {
                        struct qstr cf = {.name = cf_str->name,
                                          .len = cf_str->len};
@@ -357,8 +357,8 @@ struct f2fs_dir_entry *f2fs_find_entry(struct inode *dir,
        int err;
 
 #ifdef CONFIG_UNICODE
-       if (f2fs_has_strict_mode(F2FS_I_SB(dir)) && IS_CASEFOLDED(dir) &&
-                       utf8_validate(F2FS_I_SB(dir)->s_encoding, child)) {
+       if (sb_has_enc_strict_mode(dir->i_sb) && IS_CASEFOLDED(dir) &&
+                       utf8_validate(dir->i_sb->s_encoding, child)) {
                *res_page = ERR_PTR(-EINVAL);
                return NULL;
        }
@@ -1079,51 +1079,8 @@ const struct file_operations f2fs_dir_operations = {
 };
 
 #ifdef CONFIG_UNICODE
-static int f2fs_d_compare(const struct dentry *dentry, unsigned int len,
-                         const char *str, const struct qstr *name)
-{
-       struct qstr qstr = {.name = str, .len = len };
-       const struct dentry *parent = READ_ONCE(dentry->d_parent);
-       const struct inode *inode = READ_ONCE(parent->d_inode);
-
-       if (!inode || !IS_CASEFOLDED(inode)) {
-               if (len != name->len)
-                       return -1;
-               return memcmp(str, name->name, len);
-       }
-
-       return f2fs_ci_compare(inode, name, &qstr, false);
-}
-
-static int f2fs_d_hash(const struct dentry *dentry, struct qstr *str)
-{
-       struct f2fs_sb_info *sbi = F2FS_SB(dentry->d_sb);
-       const struct unicode_map *um = sbi->s_encoding;
-       const struct inode *inode = READ_ONCE(dentry->d_inode);
-       unsigned char *norm;
-       int len, ret = 0;
-
-       if (!inode || !IS_CASEFOLDED(inode))
-               return 0;
-
-       norm = f2fs_kmalloc(sbi, PATH_MAX, GFP_ATOMIC);
-       if (!norm)
-               return -ENOMEM;
-
-       len = utf8_casefold(um, str, norm, PATH_MAX);
-       if (len < 0) {
-               if (f2fs_has_strict_mode(sbi))
-                       ret = -EINVAL;
-               goto out;
-       }
-       str->hash = full_name_hash(dentry, norm, len);
-out:
-       kvfree(norm);
-       return ret;
-}
-
 const struct dentry_operations f2fs_dentry_ops = {
-       .d_hash = f2fs_d_hash,
-       .d_compare = f2fs_d_compare,
+       .d_hash = generic_ci_d_hash,
+       .d_compare = generic_ci_d_compare,
 };
 #endif
diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h
index 5355be6b6755c..e73b8752f9c8d 100644
--- a/fs/f2fs/f2fs.h
+++ b/fs/f2fs/f2fs.h
@@ -1284,10 +1284,6 @@ struct f2fs_sb_info {
        int valid_super_block;                  /* valid super block no */
        unsigned long s_flag;                           /* flags for sbi */
        struct mutex writepages;                /* mutex for writepages() */
-#ifdef CONFIG_UNICODE
-       struct unicode_map *s_encoding;
-       __u16 s_encoding_flags;
-#endif
 
 #ifdef CONFIG_BLK_DEV_ZONED
        unsigned int blocks_per_blkz;           /* F2FS blocks per zone */
diff --git a/fs/f2fs/hash.c b/fs/f2fs/hash.c
index 5bc4dcd8fc03f..28acb24e7a7a8 100644
--- a/fs/f2fs/hash.c
+++ b/fs/f2fs/hash.c
@@ -110,7 +110,7 @@ f2fs_hash_t f2fs_dentry_hash(const struct inode *dir,
 {
 #ifdef CONFIG_UNICODE
        struct f2fs_sb_info *sbi = F2FS_SB(dir->i_sb);
-       const struct unicode_map *um = sbi->s_encoding;
+       const struct unicode_map *um = dir->i_sb->s_encoding;
        int r, dlen;
        unsigned char *buff;
        struct qstr folded;
diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c
index 65a7a432dfee2..89b52629bd437 100644
--- a/fs/f2fs/super.c
+++ b/fs/f2fs/super.c
@@ -1213,7 +1213,7 @@ static void f2fs_put_super(struct super_block *sb)
        for (i = 0; i < NR_PAGE_TYPE; i++)
                kvfree(sbi->write_io[i]);
 #ifdef CONFIG_UNICODE
-       utf8_unload(sbi->s_encoding);
+       utf8_unload(sb->s_encoding);
 #endif
        kvfree(sbi);
 }
@@ -3223,7 +3223,7 @@ static int f2fs_scan_devices(struct f2fs_sb_info *sbi)
 static int f2fs_setup_casefold(struct f2fs_sb_info *sbi)
 {
 #ifdef CONFIG_UNICODE
-       if (f2fs_sb_has_casefold(sbi) && !sbi->s_encoding) {
+       if (f2fs_sb_has_casefold(sbi) && !sbi->sb->s_encoding) {
                const struct f2fs_sb_encodings *encoding_info;
                struct unicode_map *encoding;
                __u16 encoding_flags;
@@ -3254,8 +3254,8 @@ static int f2fs_setup_casefold(struct f2fs_sb_info *sbi)
                         "%s-%s with flags 0x%hx", encoding_info->name,
                         encoding_info->version?:"\b", encoding_flags);
 
-               sbi->s_encoding = encoding;
-               sbi->s_encoding_flags = encoding_flags;
+               sbi->sb->s_encoding = encoding;
+               sbi->sb->s_encoding_flags = encoding_flags;
                sbi->sb->s_d_op = &f2fs_dentry_ops;
        }
 #else
@@ -3742,7 +3742,7 @@ static int f2fs_fill_super(struct super_block *sb, void 
*data, int silent)
                kvfree(sbi->write_io[i]);
 
 #ifdef CONFIG_UNICODE
-       utf8_unload(sbi->s_encoding);
+       utf8_unload(sb->s_encoding);
 #endif
 free_options:
 #ifdef CONFIG_QUOTA
diff --git a/fs/f2fs/sysfs.c b/fs/f2fs/sysfs.c
index 91d649790b1bc..4e8aae03f26c1 100644
--- a/fs/f2fs/sysfs.c
+++ b/fs/f2fs/sysfs.c
@@ -175,12 +175,14 @@ static ssize_t encoding_show(struct f2fs_attr *a,
                struct f2fs_sb_info *sbi, char *buf)
 {
 #ifdef CONFIG_UNICODE
+       struct super_block *sb = sbi->sb;
+
        if (f2fs_sb_has_casefold(sbi))
                return snprintf(buf, PAGE_SIZE, "%s (%d.%d.%d)\n",
-                       sbi->s_encoding->charset,
-                       (sbi->s_encoding->version >> 16) & 0xff,
-                       (sbi->s_encoding->version >> 8) & 0xff,
-                       sbi->s_encoding->version & 0xff);
+                       sb->s_encoding->charset,
+                       (sb->s_encoding->version >> 16) & 0xff,
+                       (sb->s_encoding->version >> 8) & 0xff,
+                       sb->s_encoding->version & 0xff);
 #endif
        return sprintf(buf, "(none)");
 }
diff --git a/include/linux/f2fs_fs.h b/include/linux/f2fs_fs.h
index ac3f4888b3dfa..e8763a955f90d 100644
--- a/include/linux/f2fs_fs.h
+++ b/include/linux/f2fs_fs.h
@@ -38,9 +38,6 @@
 #define F2FS_MAX_QUOTAS                3
 
 #define F2FS_ENC_UTF8_12_1     1
-#define F2FS_ENC_STRICT_MODE_FL        (1 << 0)
-#define f2fs_has_strict_mode(sbi) \
-       (sbi->s_encoding_flags & F2FS_ENC_STRICT_MODE_FL)
 
 #define F2FS_IO_SIZE(sbi)      (1 << F2FS_OPTION(sbi).write_io_size_bits) /* 
Blocks */
 #define F2FS_IO_SIZE_KB(sbi)   (1 << (F2FS_OPTION(sbi).write_io_size_bits + 
2)) /* KB */
-- 
2.25.1.481.gfbce0eb801-goog



_______________________________________________
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

Reply via email to