From: Jeff Layton <jlayton@redhat.com>
To: Christoph Hellwig <hch@infradead.org>
Cc: Trond.Myklebust@netapp.com, linux-nfs@vger.kernel.org
Subject: Re: [PATCH 7/7] nfs: page cache invalidation for dio
Date: Thu, 14 Nov 2013 13:35:51 -0500 [thread overview]
Message-ID: <20131114133551.5d08b5cd@tlielax.poochiereds.net> (raw)
In-Reply-To: <20131114165042.205194841@bombadil.infradead.org>
On Thu, 14 Nov 2013 08:50:34 -0800
Christoph Hellwig <hch@infradead.org> wrote:
> Make sure to properly invalidate the pagecache before performing direct I/O,
> so that no stale pages are left around. This matches what the generic
> direct I/O code does. Also take the i_mutex over the direct write submission
> to avoid the lifelock vs truncate waiting for i_dio_count to decrease, and
> to avoid having the pagecache easily repopulated while direct I/O is in
> progrss. Again matching the generic direct I/O code.
>
> Signed-off-by: Christoph Hellwig <hch@lst.de>
> ---
> fs/nfs/direct.c | 29 +++++++++++++++++++++++++++--
> 1 file changed, 27 insertions(+), 2 deletions(-)
>
> diff --git a/fs/nfs/direct.c b/fs/nfs/direct.c
> index 6cc7fe1..2b778fc 100644
> --- a/fs/nfs/direct.c
> +++ b/fs/nfs/direct.c
> @@ -939,9 +939,12 @@ ssize_t nfs_file_direct_write(struct kiocb *iocb, const struct iovec *iov,
> struct inode *inode = mapping->host;
> struct nfs_direct_req *dreq;
> struct nfs_lock_context *l_ctx;
> + loff_t end;
> size_t count;
>
> count = iov_length(iov, nr_segs);
> + end = (pos + count - 1) >> PAGE_CACHE_SHIFT;
> +
> nfs_add_stats(mapping->host, NFSIOS_DIRECTWRITTENBYTES, count);
>
> dfprintk(FILE, "NFS: direct write(%pD2, %zd@%Ld)\n",
> @@ -958,16 +961,25 @@ ssize_t nfs_file_direct_write(struct kiocb *iocb, const struct iovec *iov,
> if (!count)
> goto out;
>
> + mutex_lock(&inode->i_mutex);
> +
> result = nfs_sync_mapping(mapping);
> if (result)
> - goto out;
> + goto out_unlock;
> +
> + if (mapping->nrpages) {
> + result = invalidate_inode_pages2_range(mapping,
> + pos >> PAGE_CACHE_SHIFT, end);
> + if (result)
> + goto out_unlock;
> + }
>
> task_io_account_write(count);
>
> result = -ENOMEM;
> dreq = nfs_direct_req_alloc();
> if (!dreq)
> - goto out;
> + goto out_unlock;
>
> dreq->inode = inode;
> dreq->bytes_left = count;
> @@ -982,6 +994,14 @@ ssize_t nfs_file_direct_write(struct kiocb *iocb, const struct iovec *iov,
> dreq->iocb = iocb;
>
> result = nfs_direct_write_schedule_iovec(dreq, iov, nr_segs, pos, uio);
> +
> + if (mapping->nrpages) {
> + invalidate_inode_pages2_range(mapping,
> + pos >> PAGE_CACHE_SHIFT, end);
> + }
> +
> + mutex_unlock(&inode->i_mutex);
> +
> if (!result) {
> result = nfs_direct_wait(dreq);
> if (result > 0) {
> @@ -994,8 +1014,13 @@ ssize_t nfs_file_direct_write(struct kiocb *iocb, const struct iovec *iov,
> spin_unlock(&inode->i_lock);
> }
> }
> + nfs_direct_req_release(dreq);
> + return result;
> +
> out_release:
> nfs_direct_req_release(dreq);
> +out_unlock:
> + mutex_unlock(&inode->i_mutex);
> out:
> return result;
> }
Hrm... I started chasing down a bug reported by our QA group last week
that's showing up when you mix DIO writes and buffered reads
(basically, diotest3 in the LTP suite is failing). The bug is marked
private for dumb reasons but I'll see if I can make it public. I'll
also plan to give this series a spin to see if it helps fix that bug...
In any case, the DIO write code calls nfs_zap_mapping after it gets the
WRITE reply. That sets NFS_INO_INVALID_DATA and should prevent buffered
read() calls from getting data out of the cache after the write reply
comes in.
Why is that not sufficient here?
--
Jeff Layton <jlayton@redhat.com>
next prev parent reply other threads:[~2013-11-14 18:36 UTC|newest]
Thread overview: 37+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-11-14 16:50 [PATCH 0/7] direct I/O fixes Christoph Hellwig
2013-11-14 16:50 ` [PATCH 1/7] nfs: fix size updates for aio writes Christoph Hellwig
2013-11-14 16:50 ` [PATCH 2/7] nfs: defer inode_dio_done call until size update is done Christoph Hellwig
2013-11-14 16:50 ` [PATCH 3/7] nfs: increment i_dio_count for reads, too Christoph Hellwig
2013-11-14 16:50 ` [PATCH 4/7] nfs: merge nfs_direct_read into nfs_file_direct_read Christoph Hellwig
2013-11-14 16:50 ` [PATCH 5/7] nfs: merge nfs_direct_write into nfs_file_direct_write Christoph Hellwig
2013-11-14 16:50 ` [PATCH 6/7] nfs: take i_mutex during direct I/O reads Christoph Hellwig
2013-11-14 17:00 ` Chuck Lever
2013-11-15 14:29 ` Christoph Hellwig
2013-11-14 20:43 ` Trond Myklebust
2013-11-15 14:32 ` Christoph Hellwig
2013-11-15 15:23 ` Trond Myklebust
2013-11-15 15:25 ` Christoph Hellwig
2013-11-15 15:34 ` Trond Myklebust
2013-11-15 15:37 ` Christoph Hellwig
2013-11-15 16:00 ` Trond Myklebust
2013-11-14 16:50 ` [PATCH 7/7] nfs: page cache invalidation for dio Christoph Hellwig
2013-11-14 18:35 ` Jeff Layton [this message]
2013-11-15 14:28 ` Christoph Hellwig
2013-11-15 14:52 ` Jeff Layton
2013-11-15 15:02 ` Christoph Hellwig
2013-11-15 15:33 ` Jeff Layton
2014-01-21 19:21 ` Jeff Layton
2014-01-22 8:24 ` Christoph Hellwig
2014-01-22 12:04 ` Jeff Layton
2014-01-24 15:50 ` Jeff Layton
2014-01-24 15:52 ` Jeff Layton
2014-01-24 17:11 ` Trond Myklebust
2014-01-24 17:29 ` Jeff Layton
2014-01-24 17:40 ` Trond Myklebust
2014-01-24 18:00 ` Jeff Layton
2014-01-24 18:46 ` Trond Myklebust
2014-01-24 21:21 ` Jeff Layton
2014-01-25 0:39 ` Trond Myklebust
2014-01-25 0:54 ` Jeff Layton
2014-01-25 1:05 ` Trond Myklebust
2014-01-25 1:11 ` Trond Myklebust
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=20131114133551.5d08b5cd@tlielax.poochiereds.net \
--to=jlayton@redhat.com \
--cc=Trond.Myklebust@netapp.com \
--cc=hch@infradead.org \
--cc=linux-nfs@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).