> 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...@gmail.com>
> ---
>  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


Reply via email to