From: Stefan Roesch <shr@fb.com>
To: <io-uring@vger.kernel.org>, <kernel-team@fb.com>,
<linux-mm@kvack.org>, <linux-xfs@vger.kernel.org>,
<linux-fsdevel@vger.kernel.org>
Cc: <shr@fb.com>, <david@fromorbit.com>, <jack@suse.cz>
Subject: [RFC PATCH v3 10/18] xfs: Add async buffered write support
Date: Wed, 18 May 2022 16:37:01 -0700 [thread overview]
Message-ID: <20220518233709.1937634-11-shr@fb.com> (raw)
In-Reply-To: <20220518233709.1937634-1-shr@fb.com>
This adds the async buffered write support to XFS. For async buffered
write requests, the request will return -EAGAIN if the ilock cannot be
obtained immediately.
This splits off a new helper xfs_ilock_inode from the existing helper
xfs_ilock_iocb so it can be used for this function. The exising helper
cannot be used as it hardcoded the inode to be used.
Signed-off-by: Stefan Roesch <shr@fb.com>
---
fs/xfs/xfs_file.c | 32 +++++++++++++++-----------------
1 file changed, 15 insertions(+), 17 deletions(-)
diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c
index 793918c83755..ad3175b7d366 100644
--- a/fs/xfs/xfs_file.c
+++ b/fs/xfs/xfs_file.c
@@ -190,14 +190,13 @@ xfs_file_fsync(
return error;
}
-static int
-xfs_ilock_iocb(
- struct kiocb *iocb,
+static inline int
+xfs_ilock_xfs_inode(
+ struct xfs_inode *ip,
+ int flags,
unsigned int lock_mode)
{
- struct xfs_inode *ip = XFS_I(file_inode(iocb->ki_filp));
-
- if (iocb->ki_flags & IOCB_NOWAIT) {
+ if (flags & IOCB_NOWAIT) {
if (!xfs_ilock_nowait(ip, lock_mode))
return -EAGAIN;
} else {
@@ -222,7 +221,7 @@ xfs_file_dio_read(
file_accessed(iocb->ki_filp);
- ret = xfs_ilock_iocb(iocb, XFS_IOLOCK_SHARED);
+ ret = xfs_ilock_xfs_inode(ip, iocb->ki_flags, XFS_IOLOCK_SHARED);
if (ret)
return ret;
ret = iomap_dio_rw(iocb, to, &xfs_read_iomap_ops, NULL, 0, 0);
@@ -244,7 +243,7 @@ xfs_file_dax_read(
if (!iov_iter_count(to))
return 0; /* skip atime */
- ret = xfs_ilock_iocb(iocb, XFS_IOLOCK_SHARED);
+ ret = xfs_ilock_xfs_inode(ip, iocb->ki_flags, XFS_IOLOCK_SHARED);
if (ret)
return ret;
ret = dax_iomap_rw(iocb, to, &xfs_read_iomap_ops);
@@ -264,7 +263,7 @@ xfs_file_buffered_read(
trace_xfs_file_buffered_read(iocb, to);
- ret = xfs_ilock_iocb(iocb, XFS_IOLOCK_SHARED);
+ ret = xfs_ilock_xfs_inode(ip, iocb->ki_flags, XFS_IOLOCK_SHARED);
if (ret)
return ret;
ret = generic_file_read_iter(iocb, to);
@@ -343,7 +342,7 @@ xfs_file_write_checks(
if (*iolock == XFS_IOLOCK_SHARED && !IS_NOSEC(inode)) {
xfs_iunlock(ip, *iolock);
*iolock = XFS_IOLOCK_EXCL;
- error = xfs_ilock_iocb(iocb, *iolock);
+ error = xfs_ilock_xfs_inode(ip, iocb->ki_flags, *iolock);
if (error) {
*iolock = 0;
return error;
@@ -516,7 +515,7 @@ xfs_file_dio_write_aligned(
int iolock = XFS_IOLOCK_SHARED;
ssize_t ret;
- ret = xfs_ilock_iocb(iocb, iolock);
+ ret = xfs_ilock_xfs_inode(ip, iocb->ki_flags, iolock);
if (ret)
return ret;
ret = xfs_file_write_checks(iocb, from, &iolock);
@@ -583,7 +582,7 @@ xfs_file_dio_write_unaligned(
flags = IOMAP_DIO_FORCE_WAIT;
}
- ret = xfs_ilock_iocb(iocb, iolock);
+ ret = xfs_ilock_xfs_inode(ip, iocb->ki_flags, iolock);
if (ret)
return ret;
@@ -659,7 +658,7 @@ xfs_file_dax_write(
ssize_t ret, error = 0;
loff_t pos;
- ret = xfs_ilock_iocb(iocb, iolock);
+ ret = xfs_ilock_xfs_inode(ip, iocb->ki_flags, iolock);
if (ret)
return ret;
ret = xfs_file_write_checks(iocb, from, &iolock);
@@ -702,12 +701,11 @@ xfs_file_buffered_write(
bool cleared_space = false;
int iolock;
- if (iocb->ki_flags & IOCB_NOWAIT)
- return -EOPNOTSUPP;
-
write_retry:
iolock = XFS_IOLOCK_EXCL;
- xfs_ilock(ip, iolock);
+ ret = xfs_ilock_xfs_inode(ip, iocb->ki_flags, iolock);
+ if (ret)
+ return ret;
ret = xfs_file_write_checks(iocb, from, &iolock);
if (ret)
--
2.30.2
next prev parent reply other threads:[~2022-05-18 23:38 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-05-18 23:36 [RFC PATCH v3 00/18] io-uring/xfs: support async buffered writes Stefan Roesch
2022-05-18 23:36 ` [RFC PATCH v3 01/18] block: Add check for async buffered writes to generic_write_checks Stefan Roesch
2022-05-19 8:17 ` Christoph Hellwig
2022-05-20 18:23 ` Stefan Roesch
2022-05-18 23:36 ` [RFC PATCH v3 02/18] iomap: Add iomap_page_create_gfp to allocate iomap_pages Stefan Roesch
2022-05-19 8:18 ` Christoph Hellwig
2022-05-20 18:25 ` Stefan Roesch
2022-05-18 23:36 ` [RFC PATCH v3 03/18] iomap: Use iomap_page_create_gfp() in __iomap_write_begin Stefan Roesch
2022-05-19 8:19 ` Christoph Hellwig
2022-05-20 18:26 ` Stefan Roesch
2022-05-18 23:36 ` [RFC PATCH v3 04/18] iomap: Add async buffered write support Stefan Roesch
2022-05-19 8:25 ` Christoph Hellwig
2022-05-20 18:29 ` Stefan Roesch
2022-05-18 23:36 ` [RFC PATCH v3 05/18] xfs: Add iomap " Stefan Roesch
2022-05-18 23:36 ` [RFC PATCH v3 06/18] fs: Split off remove_needs_file_privs() __remove_file_privs() Stefan Roesch
2022-05-18 23:36 ` [RFC PATCH v3 07/18] fs: Split off file_needs_update_time and __file_update_time Stefan Roesch
2022-05-18 23:36 ` [RFC PATCH v3 08/18] xfs: Enable async write file modification handling Stefan Roesch
2022-05-18 23:37 ` [RFC PATCH v3 09/18] fs: Optimization for concurrent file time updates Stefan Roesch
2022-05-18 23:37 ` Stefan Roesch [this message]
2022-05-18 23:37 ` [RFC PATCH v3 11/18] io_uring: Add support for async buffered writes Stefan Roesch
2022-05-18 23:37 ` [RFC PATCH v3 12/18] mm: Move starting of background writeback into the main balancing loop Stefan Roesch
2022-05-18 23:37 ` [RFC PATCH v3 13/18] mm: Move updates of dirty_exceeded into one place Stefan Roesch
2022-05-18 23:37 ` [RFC PATCH v3 14/18] mm: Prepare balance_dirty_pages() for async buffered writes Stefan Roesch
2022-05-18 23:37 ` [RFC PATCH v3 15/18] mm: Add balance_dirty_pages_ratelimited_async() function Stefan Roesch
2022-05-19 8:29 ` Christoph Hellwig
2022-05-19 8:54 ` Jan Kara
2022-05-20 18:32 ` Stefan Roesch
2022-05-20 18:29 ` Stefan Roesch
2022-05-18 23:37 ` [RFC PATCH v3 16/18] iomap: Use balance_dirty_pages_ratelimited_flags in iomap_write_iter Stefan Roesch
2022-05-19 8:32 ` Christoph Hellwig
2022-05-20 18:31 ` Stefan Roesch
2022-05-18 23:37 ` [RFC PATCH v3 17/18] io_uring: Add tracepoint for short writes Stefan Roesch
2022-05-18 23:37 ` [RFC PATCH v3 18/18] xfs: Enable async buffered write support Stefan Roesch
2022-05-19 8:32 ` Christoph Hellwig
2022-05-20 18:32 ` Stefan Roesch
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220518233709.1937634-11-shr@fb.com \
--to=shr@fb.com \
--cc=david@fromorbit.com \
--cc=io-uring@vger.kernel.org \
--cc=jack@suse.cz \
--cc=kernel-team@fb.com \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=linux-xfs@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.