On Mon, Jan 11, 2021 at 05:12:10PM +0100, Christoph Hellwig wrote: > Add a helper to factor out the nowait locking logical for the read/write > helpers. > > Signed-off-by: Christoph Hellwig <hch@xxxxxx> > --- Reviewed-by: Brian Foster <bfoster@xxxxxxxxxx> > fs/xfs/xfs_file.c | 55 +++++++++++++++++++++++++---------------------- > 1 file changed, 29 insertions(+), 26 deletions(-) > > diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c > index ba02780dee6439..aa3fe89628f0f1 100644 > --- a/fs/xfs/xfs_file.c > +++ b/fs/xfs/xfs_file.c > @@ -217,6 +217,23 @@ xfs_file_fsync( > return error; > } > > +static int > +xfs_ilock_iocb( > + struct kiocb *iocb, > + unsigned int lock_mode) > +{ > + struct xfs_inode *ip = XFS_I(file_inode(iocb->ki_filp)); > + > + if (iocb->ki_flags & IOCB_NOWAIT) { > + if (!xfs_ilock_nowait(ip, lock_mode)) > + return -EAGAIN; > + } else { > + xfs_ilock(ip, lock_mode); > + } > + > + return 0; > +} > + > STATIC ssize_t > xfs_file_dio_aio_read( > struct kiocb *iocb, > @@ -233,12 +250,9 @@ xfs_file_dio_aio_read( > > file_accessed(iocb->ki_filp); > > - if (iocb->ki_flags & IOCB_NOWAIT) { > - if (!xfs_ilock_nowait(ip, XFS_IOLOCK_SHARED)) > - return -EAGAIN; > - } else { > - xfs_ilock(ip, XFS_IOLOCK_SHARED); > - } > + ret = xfs_ilock_iocb(iocb, XFS_IOLOCK_SHARED); > + if (ret) > + return ret; > ret = iomap_dio_rw(iocb, to, &xfs_read_iomap_ops, NULL, > is_sync_kiocb(iocb)); > xfs_iunlock(ip, XFS_IOLOCK_SHARED); > @@ -260,13 +274,9 @@ xfs_file_dax_read( > if (!count) > return 0; /* skip atime */ > > - if (iocb->ki_flags & IOCB_NOWAIT) { > - if (!xfs_ilock_nowait(ip, XFS_IOLOCK_SHARED)) > - return -EAGAIN; > - } else { > - xfs_ilock(ip, XFS_IOLOCK_SHARED); > - } > - > + ret = xfs_ilock_iocb(iocb, XFS_IOLOCK_SHARED); > + if (ret) > + return ret; > ret = dax_iomap_rw(iocb, to, &xfs_read_iomap_ops); > xfs_iunlock(ip, XFS_IOLOCK_SHARED); > > @@ -284,12 +294,9 @@ xfs_file_buffered_aio_read( > > trace_xfs_file_buffered_read(ip, iov_iter_count(to), iocb->ki_pos); > > - if (iocb->ki_flags & IOCB_NOWAIT) { > - if (!xfs_ilock_nowait(ip, XFS_IOLOCK_SHARED)) > - return -EAGAIN; > - } else { > - xfs_ilock(ip, XFS_IOLOCK_SHARED); > - } > + ret = xfs_ilock_iocb(iocb, XFS_IOLOCK_SHARED); > + if (ret) > + return ret; > ret = generic_file_read_iter(iocb, to); > xfs_iunlock(ip, XFS_IOLOCK_SHARED); > > @@ -628,13 +635,9 @@ xfs_file_dax_write( > size_t count; > loff_t pos; > > - if (iocb->ki_flags & IOCB_NOWAIT) { > - if (!xfs_ilock_nowait(ip, iolock)) > - return -EAGAIN; > - } else { > - xfs_ilock(ip, iolock); > - } > - > + ret = xfs_ilock_iocb(iocb, iolock); > + if (ret) > + return ret; > ret = xfs_file_aio_write_checks(iocb, from, &iolock); > if (ret) > goto out; > -- > 2.29.2 >