Message ID | 20210118193516.2915706-2-hch@lst.de (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [01/11] xfs: factor out a xfs_ilock_iocb helper | expand |
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@lst.de> > Reviewed-by: Dave Chinner <dchinner@redhat.com> > Reviewed-by: Brian Foster <bfoster@redhat.com> Looks pretty straightforward, Reviewed-by: Darrick J. Wong <djwong@kernel.org> --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 >
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;