[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20200708211926.7706-3-rgoldwyn@suse.de>
Date: Wed, 8 Jul 2020 16:19:22 -0500
From: Goldwyn Rodrigues <rgoldwyn@...e.de>
To: linux-btrfs@...r.kernel.org
Cc: linux-fsdevel@...r.kernel.org, darrick.wong@...cle.com, hch@....de,
cluster-devel@...hat.com, linux-ext4@...r.kernel.org,
linux-xfs@...r.kernel.org, Goldwyn Rodrigues <rgoldwyn@...e.com>
Subject: [PATCH 2/6] iomap: IOMAP_DIO_RWF_NO_STALE_PAGECACHE return if page invalidation fails
From: Goldwyn Rodrigues <rgoldwyn@...e.com>
For direct I/O, add the flag IOMAP_DIO_RWF_NO_STALE_PAGECACHE to indicate
that if the page invalidation fails, return back control to the
filesystem so it may fallback to buffered mode.
Reviewed-by: Darrick J. Wong <darrick.wong@...cle.com>
Signed-off-by: Goldwyn Rodrigues <rgoldwyn@...e.com>
---
fs/iomap/direct-io.c | 8 +++++++-
include/linux/iomap.h | 14 ++++++++++++++
2 files changed, 21 insertions(+), 1 deletion(-)
diff --git a/fs/iomap/direct-io.c b/fs/iomap/direct-io.c
index 2753b7022403..66becf935865 100644
--- a/fs/iomap/direct-io.c
+++ b/fs/iomap/direct-io.c
@@ -484,8 +484,14 @@ iomap_dio_rw(struct kiocb *iocb, struct iov_iter *iter,
*/
ret = invalidate_inode_pages2_range(mapping,
pos >> PAGE_SHIFT, end >> PAGE_SHIFT);
- if (ret)
+ if (ret) {
+ if (dio_flags & IOMAP_DIO_RWF_NO_STALE_PAGECACHE) {
+ if (ret == -EBUSY)
+ ret = 0;
+ goto out_free_dio;
+ }
dio_warn_stale_pagecache(iocb->ki_filp);
+ }
ret = 0;
if (iov_iter_rw(iter) == WRITE && !wait_for_completion &&
diff --git a/include/linux/iomap.h b/include/linux/iomap.h
index 80cd5f524124..a68705369a2c 100644
--- a/include/linux/iomap.h
+++ b/include/linux/iomap.h
@@ -262,7 +262,21 @@ struct iomap_dio_ops {
/*
* Wait for completion of DIO
*/
+
#define IOMAP_DIO_RWF_SYNCIO (1 << 0)
+/*
+ * Direct IO will attempt to keep the page cache coherent by
+ * invalidating the inode's page cache over the range of the DIO.
+ * That can fail if something else is actively using the page cache.
+ * If this happens and the DIO continues, the data in the page
+ * cache will become stale.
+ *
+ * Set this flag if you want the DIO to abort without issuing any IO
+ * or error if it fails to invalidate the page cache successfully.
+ * This allows the IO submitter to fallback to buffered IO to resubmit
+ * IO
+ */
+#define IOMAP_DIO_RWF_NO_STALE_PAGECACHE (1 << 1)
ssize_t iomap_dio_rw(struct kiocb *iocb, struct iov_iter *iter,
const struct iomap_ops *ops, const struct iomap_dio_ops *dops,
--
2.26.2
Powered by blists - more mailing lists