diff options
author | Chao Yu <yuchao0@huawei.com> | 2019-08-21 17:13:34 +0200 |
---|---|---|
committer | Jaegeuk Kim <jaegeuk@kernel.org> | 2019-08-23 16:57:15 +0200 |
commit | fe76a166a1e3dd2cc906e5468fda9834029d6258 (patch) | |
tree | 7f13defe5bb8b1eec65c68f1722b62e381fc0563 /fs/f2fs | |
parent | f2fs: Fix indefinite loop in f2fs_gc() (diff) | |
download | linux-fe76a166a1e3dd2cc906e5468fda9834029d6258.tar.xz linux-fe76a166a1e3dd2cc906e5468fda9834029d6258.zip |
f2fs: introduce f2fs_match_name() for cleanup
This patch introduces f2fs_match_name() for cleanup.
BTW, it avoids to fallback to normal comparison once it doesn't
match casefolded name.
Signed-off-by: Chao Yu <yuchao0@huawei.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
Diffstat (limited to 'fs/f2fs')
-rw-r--r-- | fs/f2fs/dir.c | 49 |
1 files changed, 30 insertions, 19 deletions
diff --git a/fs/f2fs/dir.c b/fs/f2fs/dir.c index dac07d17cdbd..501999af581d 100644 --- a/fs/f2fs/dir.c +++ b/fs/f2fs/dir.c @@ -136,6 +136,34 @@ int f2fs_ci_compare(const struct inode *parent, const struct qstr *name, } #endif +static inline bool f2fs_match_name(struct f2fs_dentry_ptr *d, + struct f2fs_dir_entry *de, + struct fscrypt_name *fname, + unsigned long bit_pos, + f2fs_hash_t namehash) +{ +#ifdef CONFIG_UNICODE + struct inode *parent = d->inode; + struct f2fs_sb_info *sbi = F2FS_I_SB(parent); + struct qstr entry; +#endif + + if (de->hash_code != namehash) + return false; + +#ifdef CONFIG_UNICODE + entry.name = d->filename[bit_pos]; + entry.len = de->name_len; + + if (sbi->s_encoding && IS_CASEFOLDED(parent)) + return !f2fs_ci_compare(parent, fname->usr_fname, &entry); +#endif + if (fscrypt_match_name(fname, d->filename[bit_pos], + le16_to_cpu(de->name_len))) + return true; + return false; +} + struct f2fs_dir_entry *f2fs_find_target_dentry(struct fscrypt_name *fname, f2fs_hash_t namehash, int *max_slots, struct f2fs_dentry_ptr *d) @@ -143,9 +171,6 @@ struct f2fs_dir_entry *f2fs_find_target_dentry(struct fscrypt_name *fname, struct f2fs_dir_entry *de; unsigned long bit_pos = 0; int max_len = 0; -#ifdef CONFIG_UNICODE - struct qstr entry; -#endif if (max_slots) *max_slots = 0; @@ -157,28 +182,14 @@ struct f2fs_dir_entry *f2fs_find_target_dentry(struct fscrypt_name *fname, } de = &d->dentry[bit_pos]; -#ifdef CONFIG_UNICODE - entry.name = d->filename[bit_pos]; - entry.len = de->name_len; -#endif if (unlikely(!de->name_len)) { bit_pos++; continue; } - if (de->hash_code == namehash) { -#ifdef CONFIG_UNICODE - if (F2FS_SB(d->inode->i_sb)->s_encoding && - IS_CASEFOLDED(d->inode) && - !f2fs_ci_compare(d->inode, - fname->usr_fname, &entry)) - goto found; -#endif - if (fscrypt_match_name(fname, d->filename[bit_pos], - le16_to_cpu(de->name_len))) - goto found; - } + if (f2fs_match_name(d, de, fname, bit_pos, namehash)) + goto found; if (max_slots && max_len > *max_slots) *max_slots = max_len; |