On Mon, Jan 18, 2021 at 08:35:06PM +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: Dave Chinner <dchinner@xxxxxxxxxx> > Reviewed-by: Brian Foster <bfoster@xxxxxxxxxx> Looks pretty straightforward, Reviewed-by: Darrick J. Wong <djwong@xxxxxxxxxx> --D > --- > 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 5b0f93f738372d..c441cddfa4acbc 100644 > --- a/fs/xfs/xfs_file.c > +++ b/fs/xfs/xfs_file.c > @@ -197,6 +197,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, > @@ -213,12 +230,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); > @@ -240,13 +254,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); > > @@ -264,12 +274,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); > > @@ -608,13 +615,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 >