[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-ID: <20200701075310.GB29884@lst.de>
Date: Wed, 1 Jul 2020 09:53:10 +0200
From: Christoph Hellwig <hch@....de>
To: Goldwyn Rodrigues <rgoldwyn@...e.de>
Cc: linux-fsdevel@...r.kernel.org, linux-btrfs@...r.kernel.org,
fdmanana@...il.com, dsterba@...e.cz, david@...morbit.com,
darrick.wong@...cle.com, hch@....de,
Goldwyn Rodrigues <rgoldwyn@...e.com>,
cluster-devel@...hat.com, linux-ext4@...r.kernel.org,
linux-xfs@...r.kernel.org
Subject: always fall back to buffered I/O after invalidation failures, was:
Re: [PATCH 2/6] iomap: IOMAP_DIO_RWF_NO_STALE_PAGECACHE return if
page invalidation fails
On Mon, Jun 29, 2020 at 02:23:49PM -0500, Goldwyn Rodrigues wrote:
> 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>
I'd like to start a discussion of this shouldn't really be the
default behavior. If we have page cache that can't be invalidated it
actually makes a whole lot of sense to not do direct I/O, avoid the
warnings, etc.
Adding all the relevant lists.
> ---
> 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 fd22bff61569..2459c76e41ab 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 8a4ba1635202..2ebb8a298cd8 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
---end quoted text---
Powered by blists - more mailing lists