> Name extraction in exfat_find_dir_entry() also doesn't care NameLength, so > the name may be incorrect. > Replace the name extraction in exfat_find_dir_entry() with using > exfat_entry_set_cache and exfat_get_uniname_from_name_entries(), > like exfat_readdir(). > Replace the name extraction with using exfat_entry_set_cache and > exfat_get_uniname_from_name_entries(), like exfat_readdir(). > And, remove unused functions/parameters. > > ** This patch depends on: > '[PATCH v3] exfat: integrates dir-entry getting and validation'. > > Signed-off-by: Tetsuhiro Kohada <kohada.t2@xxxxxxxxx> > --- > fs/exfat/dir.c | 161 ++++++++++---------------------------------- > fs/exfat/exfat_fs.h | 2 +- > fs/exfat/namei.c | 4 +- > 3 files changed, 38 insertions(+), 129 deletions(-) > > diff --git a/fs/exfat/dir.c b/fs/exfat/dir.c index > 545bb73b95e9..c9715c7a55a1 100644 > --- a/fs/exfat/dir.c > +++ b/fs/exfat/dir.c > @@ -10,24 +10,6 @@ > #include "exfat_raw.h" > #include "exfat_fs.h" [snip] > @@ -963,80 +942,38 @@ int exfat_find_dir_entry(struct super_block *sb, > struct exfat_inode_info *ei, > num_empty = 0; > candi_empty.eidx = EXFAT_HINT_NONE; > [snip] > > - if (entry_type & > - (TYPE_CRITICAL_SEC | TYPE_BENIGN_SEC)) { > - if (step == DIRENT_STEP_SECD) { > - if (++order == num_ext) > - goto found; > - continue; > - } > + exfat_get_uniname_from_name_entries(es, &uni_name); It is needed to check a return value. > + exfat_free_dentry_set(es, false); > + > + if (!exfat_uniname_ncmp(sb, > + p_uniname->name, > + uni_name.name, > + name_len)) { > + /* set the last used position as hint */ > + hint_stat->clu = clu.dir; > + hint_stat->eidx = dentry; eidx and clu of hint_stat should have one for the next entry we'll start looking for. Did you intentionally change the concept? > + return dentry; > } > - step = DIRENT_STEP_FILE; > } > > if (clu.flags == ALLOC_NO_FAT_CHAIN) { @@ -1069,32 +1006,6 > @@ int exfat_find_dir_entry(struct super_block *sb, struct > exfat_inode_info *ei, > hint_stat->clu = p_dir->dir; > hint_stat->eidx = 0; > return -ENOENT; > - > -found: > - /* next dentry we'll find is out of this cluster */ > - if (!((dentry + 1) & (dentries_per_clu - 1))) { > - int ret = 0; > - > - if (clu.flags == ALLOC_NO_FAT_CHAIN) { > - if (--clu.size > 0) > - clu.dir++; > - else > - clu.dir = EXFAT_EOF_CLUSTER; > - } else { > - ret = exfat_get_next_cluster(sb, &clu.dir); > - } > - > - if (ret || clu.dir == EXFAT_EOF_CLUSTER) { > - /* just initialized hint_stat */ > - hint_stat->clu = p_dir->dir; > - hint_stat->eidx = 0; > - return (dentry - num_ext); > - } > - } > - > - hint_stat->clu = clu.dir; > - hint_stat->eidx = dentry + 1; > - return dentry - num_ext; > } > > int exfat_count_ext_entries(struct super_block *sb, struct exfat_chain > *p_dir, diff --git a/fs/exfat/exfat_fs.h b/fs/exfat/exfat_fs.h index > b88b7abc25bd..62a4768a4f6e 100644 > --- a/fs/exfat/exfat_fs.h > +++ b/fs/exfat/exfat_fs.h > @@ -456,7 +456,7 @@ void exfat_update_dir_chksum_with_entry_set(struct > exfat_entry_set_cache *es); int exfat_calc_num_entries(struct > exfat_uni_name *p_uniname); int exfat_find_dir_entry(struct super_block > *sb, struct exfat_inode_info *ei, > struct exfat_chain *p_dir, struct exfat_uni_name *p_uniname, > - int num_entries, unsigned int type); > + int num_entries); > int exfat_alloc_new_dir(struct inode *inode, struct exfat_chain *clu); > int exfat_find_location(struct super_block *sb, struct exfat_chain *p_dir, > int entry, sector_t *sector, int *offset); diff --git > a/fs/exfat/namei.c b/fs/exfat/namei.c index a65d60ef93f4..c59d523547ca > 100644 > --- a/fs/exfat/namei.c > +++ b/fs/exfat/namei.c > @@ -625,9 +625,7 @@ static int exfat_find(struct inode *dir, struct qstr > *qname, > } > > /* search the file name for directories */ > - dentry = exfat_find_dir_entry(sb, ei, &cdir, &uni_name, > - num_entries, TYPE_ALL); > - > + dentry = exfat_find_dir_entry(sb, ei, &cdir, &uni_name, > num_entries); > if ((dentry < 0) && (dentry != -EEXIST)) > return dentry; /* -error value */ > > -- > 2.25.1