提交 58244603 编写于 作者: C Christoph Hellwig 提交者: Zheng Zengkai

xfs: factor out a xfs_ilock_iocb helper

mainline inclusion
from mainline-v5.11-rc4
commit f50b8f47
category: bugfix
bugzilla: 187526,https://gitee.com/openeuler/kernel/issues/I4KIAO

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=f50b8f475a2c70ae8309c16b6d4ecb305a4aa9d6

--------------------------------

Add a helper to factor out the nowait locking logical for the read/write
helpers.
Signed-off-by: NChristoph Hellwig <hch@lst.de>
Reviewed-by: NDave Chinner <dchinner@redhat.com>
Reviewed-by: NBrian Foster <bfoster@redhat.com>
Reviewed-by: NDarrick J. Wong <djwong@kernel.org>
Signed-off-by: NDarrick J. Wong <djwong@kernel.org>
Signed-off-by: NGuo Xuenan <guoxuenan@huawei.com>
Conflicts: fs/xfs/xfs_file.c
Signed-off-by: NGuo Xuenan <guoxuenan@huawei.com>
Reviewed-by: NZhang Yi <yi.zhang@huawei.com>
Signed-off-by: NZheng Zengkai <zhengzengkai@huawei.com>
上级 83b8636c
...@@ -224,6 +224,23 @@ xfs_file_fsync( ...@@ -224,6 +224,23 @@ xfs_file_fsync(
return error; 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 STATIC ssize_t
xfs_file_dio_aio_read( xfs_file_dio_aio_read(
struct kiocb *iocb, struct kiocb *iocb,
...@@ -240,12 +257,9 @@ xfs_file_dio_aio_read( ...@@ -240,12 +257,9 @@ xfs_file_dio_aio_read(
file_accessed(iocb->ki_filp); file_accessed(iocb->ki_filp);
if (iocb->ki_flags & IOCB_NOWAIT) { ret = xfs_ilock_iocb(iocb, XFS_IOLOCK_SHARED);
if (!xfs_ilock_nowait(ip, XFS_IOLOCK_SHARED)) if (ret)
return -EAGAIN; return ret;
} else {
xfs_ilock(ip, XFS_IOLOCK_SHARED);
}
ret = iomap_dio_rw(iocb, to, &xfs_read_iomap_ops, NULL, ret = iomap_dio_rw(iocb, to, &xfs_read_iomap_ops, NULL,
is_sync_kiocb(iocb)); is_sync_kiocb(iocb));
xfs_iunlock(ip, XFS_IOLOCK_SHARED); xfs_iunlock(ip, XFS_IOLOCK_SHARED);
...@@ -267,13 +281,9 @@ xfs_file_dax_read( ...@@ -267,13 +281,9 @@ xfs_file_dax_read(
if (!count) if (!count)
return 0; /* skip atime */ return 0; /* skip atime */
if (iocb->ki_flags & IOCB_NOWAIT) { ret = xfs_ilock_iocb(iocb, XFS_IOLOCK_SHARED);
if (!xfs_ilock_nowait(ip, XFS_IOLOCK_SHARED)) if (ret)
return -EAGAIN; return ret;
} else {
xfs_ilock(ip, XFS_IOLOCK_SHARED);
}
ret = dax_iomap_rw(iocb, to, &xfs_read_iomap_ops); ret = dax_iomap_rw(iocb, to, &xfs_read_iomap_ops);
xfs_iunlock(ip, XFS_IOLOCK_SHARED); xfs_iunlock(ip, XFS_IOLOCK_SHARED);
...@@ -292,12 +302,9 @@ xfs_file_buffered_aio_read( ...@@ -292,12 +302,9 @@ xfs_file_buffered_aio_read(
trace_xfs_file_buffered_read(ip, iov_iter_count(to), iocb->ki_pos); trace_xfs_file_buffered_read(ip, iov_iter_count(to), iocb->ki_pos);
fs_file_read_do_trace(iocb); fs_file_read_do_trace(iocb);
if (iocb->ki_flags & IOCB_NOWAIT) { ret = xfs_ilock_iocb(iocb, XFS_IOLOCK_SHARED);
if (!xfs_ilock_nowait(ip, XFS_IOLOCK_SHARED)) if (ret)
return -EAGAIN; return ret;
} else {
xfs_ilock(ip, XFS_IOLOCK_SHARED);
}
ret = generic_file_read_iter(iocb, to); ret = generic_file_read_iter(iocb, to);
xfs_iunlock(ip, XFS_IOLOCK_SHARED); xfs_iunlock(ip, XFS_IOLOCK_SHARED);
...@@ -650,13 +657,9 @@ xfs_file_dax_write( ...@@ -650,13 +657,9 @@ xfs_file_dax_write(
size_t count; size_t count;
loff_t pos; loff_t pos;
if (iocb->ki_flags & IOCB_NOWAIT) { ret = xfs_ilock_iocb(iocb, iolock);
if (!xfs_ilock_nowait(ip, iolock)) if (ret)
return -EAGAIN; return ret;
} else {
xfs_ilock(ip, iolock);
}
ret = xfs_file_aio_write_checks(iocb, from, &iolock); ret = xfs_file_aio_write_checks(iocb, from, &iolock);
if (ret) if (ret)
goto out; goto out;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册