Re: [PATCH v3 1/3] direct-io: clean up error paths of do_blockdev_direct_IO

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

 



On Sat 05-09-20 01:20:21, Gabriel Krisman Bertazi wrote:
> In preparation to resort DIO checks, reduce code duplication of error
> handling in do_blockdev_direct_IO.
> 
> Changes since V1:
>   - Remove fail_dio_unlocked (Me)
>   - Ensure fail_dio won't call inode_unlock() for writes (Jan Kara)

Please add the patch changelogs below the diffstat. That way they won't be
in the final changelog (which is the right thing to do because they are
mostly irrelevant for the final patch).

Otherwise the patch looks good to me so feel free to add:

Reviewed-by: Jan Kara <jack@xxxxxxx>

								Honza 

> 
> Signed-off-by: Gabriel Krisman Bertazi <krisman@xxxxxxxxxxxxx>
> ---
>  fs/direct-io.c | 35 ++++++++++++++---------------------
>  1 file changed, 14 insertions(+), 21 deletions(-)
> 
> diff --git a/fs/direct-io.c b/fs/direct-io.c
> index 183299892465..6c11db1cec27 100644
> --- a/fs/direct-io.c
> +++ b/fs/direct-io.c
> @@ -1170,7 +1170,7 @@ do_blockdev_direct_IO(struct kiocb *iocb, struct inode *inode,
>  			blkbits = blksize_bits(bdev_logical_block_size(bdev));
>  		blocksize_mask = (1 << blkbits) - 1;
>  		if (align & blocksize_mask)
> -			goto out;
> +			return -EINVAL;
>  	}
>  
>  	/* watch out for a 0 len io from a tricksy fs */
> @@ -1178,9 +1178,8 @@ do_blockdev_direct_IO(struct kiocb *iocb, struct inode *inode,
>  		return 0;
>  
>  	dio = kmem_cache_alloc(dio_cache, GFP_KERNEL);
> -	retval = -ENOMEM;
>  	if (!dio)
> -		goto out;
> +		return -ENOMEM;
>  	/*
>  	 * Believe it or not, zeroing out the page array caused a .5%
>  	 * performance regression in a database benchmark.  So, we take
> @@ -1199,22 +1198,16 @@ do_blockdev_direct_IO(struct kiocb *iocb, struct inode *inode,
>  
>  			retval = filemap_write_and_wait_range(mapping, offset,
>  							      end - 1);
> -			if (retval) {
> -				inode_unlock(inode);
> -				kmem_cache_free(dio_cache, dio);
> -				goto out;
> -			}
> +			if (retval)
> +				goto fail_dio;
>  		}
>  	}
>  
>  	/* Once we sampled i_size check for reads beyond EOF */
>  	dio->i_size = i_size_read(inode);
>  	if (iov_iter_rw(iter) == READ && offset >= dio->i_size) {
> -		if (dio->flags & DIO_LOCKING)
> -			inode_unlock(inode);
> -		kmem_cache_free(dio_cache, dio);
>  		retval = 0;
> -		goto out;
> +		goto fail_dio;
>  	}
>  
>  	/*
> @@ -1258,14 +1251,8 @@ do_blockdev_direct_IO(struct kiocb *iocb, struct inode *inode,
>  			 */
>  			retval = sb_init_dio_done_wq(dio->inode->i_sb);
>  		}
> -		if (retval) {
> -			/*
> -			 * We grab i_mutex only for reads so we don't have
> -			 * to release it here
> -			 */
> -			kmem_cache_free(dio_cache, dio);
> -			goto out;
> -		}
> +		if (retval)
> +			goto fail_dio;
>  	}
>  
>  	/*
> @@ -1368,7 +1355,13 @@ do_blockdev_direct_IO(struct kiocb *iocb, struct inode *inode,
>  	} else
>  		BUG_ON(retval != -EIOCBQUEUED);
>  
> -out:
> +	return retval;
> +
> +fail_dio:
> +	if (dio->flags & DIO_LOCKING && iov_iter_rw(iter) == READ)
> +		inode_unlock(inode);
> +
> +	kmem_cache_free(dio_cache, dio);
>  	return retval;
>  }
>  
> -- 
> 2.28.0
> 
-- 
Jan Kara <jack@xxxxxxxx>
SUSE Labs, CR



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

  Powered by Linux