xfs: factor out a xfs_ilock_iocb helper
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> Reviewed-by: Darrick J. Wong <djwong@kernel.org> Signed-off-by: Darrick J. Wong <djwong@kernel.org>
This commit is contained in:
Родитель
213f627104
Коммит
f50b8f475a
|
@ -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, 0);
|
||||
xfs_iunlock(ip, XFS_IOLOCK_SHARED);
|
||||
|
||||
|
@ -239,13 +253,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);
|
||||
|
||||
|
@ -263,12 +273,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);
|
||||
|
||||
|
@ -607,13 +614,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;
|
||||
|
|
Загрузка…
Ссылка в новой задаче