Re: [PATCH v1 01/11] exfat: add __exfat_get_dentry_set() helper

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



> - * Returns a set of dentries for a file or dir.
> + * Returns a set of dentries.
>   *
>   * Note It provides a direct pointer to bh->data via
> exfat_get_dentry_cached().
>   * User should call exfat_get_dentry_set() after setting 'modified' to
> apply
> @@ -842,22 +836,24 @@ struct exfat_dentry *exfat_get_dentry_cached(
>   *
>   * in:
>   *   sb+p_dir+entry: indicates a file/dir
> - *   type:  specifies how many dentries should be included.
> + *   num_entries: specifies how many dentries should be included.
> + *                It will be set to es->num_entries if it is not 0.
> + *                If num_entries is 0, es->num_entries will be obtained
> + *                from the first dentry.
> + * out:
> + *   es: pointer of entry set on success.
>   * return:
> - *   pointer of entry set on success,
> - *   NULL on failure.
> + *   0 on success
> + *   < 0 on failure
         -error code on failure.
>   */
> -int exfat_get_dentry_set(struct exfat_entry_set_cache *es,
> +static int __exfat_get_dentry_set(struct exfat_entry_set_cache *es,
>  		struct super_block *sb, struct exfat_chain *p_dir, int entry,
> -		unsigned int type)
> +		unsigned int num_entries)
>  {
>  	int ret, i, num_bh;
>  	unsigned int off;
>  	sector_t sec;
>  	struct exfat_sb_info *sbi = EXFAT_SB(sb);
> -	struct exfat_dentry *ep;
> -	int num_entries;
> -	enum exfat_validate_dentry_mode mode = ES_MODE_STARTED;
>  	struct buffer_head *bh;
>
>  	if (p_dir->dir == DIR_DELETED) {
> @@ -880,12 +876,16 @@ int exfat_get_dentry_set(struct exfat_entry_set_cache
> *es,
>  		return -EIO;
>  	es->bh[es->num_bh++] = bh;
>
> -	ep = exfat_get_dentry_cached(es, ES_IDX_FILE);
> -	if (!exfat_validate_entry(exfat_get_entry_type(ep), &mode))
> -		goto put_es;
> +	if (num_entries == ES_ALL_ENTRIES) {
> +		struct exfat_dentry *ep;
> +
> +		ep = exfat_get_dentry_cached(es, ES_IDX_FILE);
> +		if (ep->type == EXFAT_FILE)
> +			num_entries = ep->dentry.file.num_ext + 1;
> +		else
> +			goto put_es;
I prefer to avoid else{}.
               if (ep->type != EXFAT_FILE)
                        goto put_es;
> +	}
>
> -	num_entries = type == ES_ALL_ENTRIES ?
> -		ep->dentry.file.num_ext + 1 : type;
>  	es->num_entries = num_entries;
>
>  	num_bh = EXFAT_B_TO_BLK_ROUND_UP(off + num_entries * DENTRY_SIZE, sb);
> @@ -918,8 +918,27 @@ int exfat_get_dentry_set(struct exfat_entry_set_cache
> *es,
>  		es->bh[es->num_bh++] = bh;
>  	}
>
> +	return 0;
> +
> +put_es:
> +	exfat_put_dentry_set(es, false);
> +	return -EIO;
> +}
> +
> +int exfat_get_dentry_set(struct exfat_entry_set_cache *es,
> +		struct super_block *sb, struct exfat_chain *p_dir,
> +		int entry, unsigned int type)
> +{
> +	int ret, i;
> +	struct exfat_dentry *ep;
> +	enum exfat_validate_dentry_mode mode = ES_MODE_GET_FILE_ENTRY;
> +
> +	ret = __exfat_get_dentry_set(es, sb, p_dir, entry, type);
You need to change type to num_entries ?

> +	if (ret < 0)
> +		return ret;
> +
>  	/* validate cached dentries */
> -	for (i = ES_IDX_STREAM; i < num_entries; i++) {
> +	for (i = ES_IDX_STREAM; i < es->num_entries; i++) {
>  		ep = exfat_get_dentry_cached(es, i);
>  		if (!exfat_validate_entry(exfat_get_entry_type(ep), &mode))
>  			goto put_es;
> --
> 2.25.1
>
>




[Index of Archives]     [Linux Ext4 Filesystem]     [Union Filesystem]     [Filesystem Testing]     [Ceph Users]     [Ecryptfs]     [NTFS 3]     [AutoFS]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux Cachefs]     [Reiser Filesystem]     [Linux RAID]     [NTFS 3]     [Samba]     [Device Mapper]     [CEPH Development]

  Powered by Linux