All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jeffrey Layton <jlayton@kernel.org>
To: David Howells <dhowells@redhat.com>,
	Christian Brauner <brauner@kernel.org>
Cc: Eric Van Hensbergen <ericvh@kernel.org>,
	Latchesar Ionkov <lucho@ionkov.net>,
	 Dominique Martinet <asmadeus@codewreck.org>,
	Christian Schoenebeck <linux_oss@crudebyte.com>,
	Marc Dionne <marc.dionne@auristor.com>,
	netfs@lists.linux.dev,  linux-fsdevel@vger.kernel.org,
	linux-mm@kvack.org, v9fs@lists.linux.dev,
	 linux-afs@lists.infradead.org, linux-cifs@vger.kernel.org,
	 linux-kernel@vger.kernel.org
Subject: Re: [PATCH] netfs: Fix the pre-flush when appending to a file in writethrough mode
Date: Fri, 26 Apr 2024 07:43:18 -0400	[thread overview]
Message-ID: <873caf750d495a1850839f30fb120be7c6b5fd36.camel@kernel.org> (raw)
In-Reply-To: <2150448.1714130115@warthog.procyon.org.uk>

On Fri, 2024-04-26 at 12:15 +0100, David Howells wrote:
> In netfs_perform_write(), when the file is marked NETFS_ICTX_WRITETHROUGH
> or O_*SYNC or RWF_*SYNC was specified, write-through caching is performed
> on a buffered file.  When setting up for write-through, we flush any
> conflicting writes in the region and wait for the write to complete,
> failing if there's a write error to return.
> 
> The issue arises if we're writing at or above the EOF position because we
> skip the flush and - more importantly - the wait.  This becomes a problem
> if there's a partial folio at the end of the file that is being written out
> and we want to make a write to it too.  Both the already-running write and
> the write we start both want to clear the writeback mark, but whoever is
> second causes a warning looking something like:
> 
>     ------------[ cut here ]------------
>     R=00000012: folio 11 is not under writeback
>     WARNING: CPU: 34 PID: 654 at fs/netfs/write_collect.c:105
>     ...
>     CPU: 34 PID: 654 Comm: kworker/u386:27 Tainted: G S ...
>     ...
>     Workqueue: events_unbound netfs_write_collection_worker
>     ...
>     RIP: 0010:netfs_writeback_lookup_folio
> 
> Fix this by making the flush-and-wait unconditional.  It will do nothing if
> there are no folios in the pagecache and will return quickly if there are
> no folios in the region specified.
> 
> Further, move the WBC attachment above the flush call as the flush is going
> to attach a WBC and detach it again if it is not present - and since we
> need one anyway we might as well share it.
> 
> Fixes: 41d8e7673a77 ("netfs: Implement a write-through caching option")
> Reported-by: kernel test robot <oliver.sang@intel.com>
> Closes: https://lore.kernel.org/oe-lkp/202404161031.468b84f-oliver.sang@intel.com
> Signed-off-by: David Howells <dhowells@redhat.com>
> cc: Eric Van Hensbergen <ericvh@kernel.org>
> cc: Latchesar Ionkov <lucho@ionkov.net>
> cc: Dominique Martinet <asmadeus@codewreck.org>
> cc: Christian Schoenebeck <linux_oss@crudebyte.com>
> cc: Marc Dionne <marc.dionne@auristor.com>
> cc: netfs@lists.linux.dev
> cc: linux-fsdevel@vger.kernel.org
> cc: linux-mm@kvack.org
> cc: v9fs@lists.linux.dev
> cc: linux-afs@lists.infradead.org
> cc: linux-cifs@vger.kernel.org
> ---
>  fs/netfs/buffered_write.c |   13 ++++++-------
>  1 file changed, 6 insertions(+), 7 deletions(-)
> 
> diff --git a/fs/netfs/buffered_write.c b/fs/netfs/buffered_write.c
> index 9a0d32e4b422..07aff231926c 100644
> --- a/fs/netfs/buffered_write.c
> +++ b/fs/netfs/buffered_write.c
> @@ -172,15 +172,14 @@ ssize_t netfs_perform_write(struct kiocb *iocb, struct iov_iter *iter,
>  	if (unlikely(test_bit(NETFS_ICTX_WRITETHROUGH, &ctx->flags) ||
>  		     iocb->ki_flags & (IOCB_DSYNC | IOCB_SYNC))
>  	    ) {
> -		if (pos < i_size_read(inode)) {
> -			ret = filemap_write_and_wait_range(mapping, pos, pos + iter->count);
> -			if (ret < 0) {
> -				goto out;
> -			}
> -		}
> -
>  		wbc_attach_fdatawrite_inode(&wbc, mapping->host);
>  
> +		ret = filemap_write_and_wait_range(mapping, pos, pos + iter->count);
> +		if (ret < 0) {
> +			wbc_detach_inode(&wbc);
> +			goto out;
> +		}
> +
>  		wreq = netfs_begin_writethrough(iocb, iter->count);
>  		if (IS_ERR(wreq)) {
>  			wbc_detach_inode(&wbc);
> 

Reviewed-by: Jeffrey Layton <jlayton@kernel.org>

      reply	other threads:[~2024-04-26 11:43 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-04-26 11:15 [PATCH] netfs: Fix the pre-flush when appending to a file in writethrough mode David Howells
2024-04-26 11:43 ` Jeffrey Layton [this message]

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=873caf750d495a1850839f30fb120be7c6b5fd36.camel@kernel.org \
    --to=jlayton@kernel.org \
    --cc=asmadeus@codewreck.org \
    --cc=brauner@kernel.org \
    --cc=dhowells@redhat.com \
    --cc=ericvh@kernel.org \
    --cc=linux-afs@lists.infradead.org \
    --cc=linux-cifs@vger.kernel.org \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=linux_oss@crudebyte.com \
    --cc=lucho@ionkov.net \
    --cc=marc.dionne@auristor.com \
    --cc=netfs@lists.linux.dev \
    --cc=v9fs@lists.linux.dev \
    /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.