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>
This commit is contained in:
parent
bbf9f7d90f
commit
fe76a166a1
@ -136,6 +136,34 @@ int f2fs_ci_compare(const struct inode *parent, const struct qstr *name,
|
|||||||
}
|
}
|
||||||
#endif
|
#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,
|
struct f2fs_dir_entry *f2fs_find_target_dentry(struct fscrypt_name *fname,
|
||||||
f2fs_hash_t namehash, int *max_slots,
|
f2fs_hash_t namehash, int *max_slots,
|
||||||
struct f2fs_dentry_ptr *d)
|
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;
|
struct f2fs_dir_entry *de;
|
||||||
unsigned long bit_pos = 0;
|
unsigned long bit_pos = 0;
|
||||||
int max_len = 0;
|
int max_len = 0;
|
||||||
#ifdef CONFIG_UNICODE
|
|
||||||
struct qstr entry;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (max_slots)
|
if (max_slots)
|
||||||
*max_slots = 0;
|
*max_slots = 0;
|
||||||
@ -157,28 +182,14 @@ struct f2fs_dir_entry *f2fs_find_target_dentry(struct fscrypt_name *fname,
|
|||||||
}
|
}
|
||||||
|
|
||||||
de = &d->dentry[bit_pos];
|
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)) {
|
if (unlikely(!de->name_len)) {
|
||||||
bit_pos++;
|
bit_pos++;
|
||||||
continue;
|
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 (f2fs_match_name(d, de, fname, bit_pos, namehash))
|
||||||
if (fscrypt_match_name(fname, d->filename[bit_pos],
|
goto found;
|
||||||
le16_to_cpu(de->name_len)))
|
|
||||||
goto found;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (max_slots && max_len > *max_slots)
|
if (max_slots && max_len > *max_slots)
|
||||||
*max_slots = max_len;
|
*max_slots = max_len;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user