All of lore.kernel.org
 help / color / mirror / Atom feed
From: Dave Chinner <david@fromorbit.com>
To: Brian Foster <bfoster@redhat.com>
Cc: linux-xfs@vger.kernel.org
Subject: Re: [PATCH 2/2] xfs: don't preempt writeback sequence on single page wb error
Date: Thu, 1 Nov 2018 10:02:25 +1100	[thread overview]
Message-ID: <20181031230225.GX19305@dastard> (raw)
In-Reply-To: <20181031140155.17996-3-bfoster@redhat.com>

On Wed, Oct 31, 2018 at 10:01:55AM -0400, Brian Foster wrote:
> xfs_do_writepage() currently returns errors directly regardless of
> whether it is called via ->writepages() or ->writepage(). In the
> case of ->writepages(), an xfs_do_writepage() error return breaks
> the current writeback sequence in write_cache_pages(). This means
> that an integrity writeback (i.e., sync), for example, returns
> before all associated pages have been processed.

That sounds like a bug in write_cache_pages(). It sends pages
one at a time to the writepage context, and it is supposed to
iterate the entire range on a data sync operation. If you look at
the code, is clearly stopping at the first error.

IOWs, every filesystem that uses write_cache_pages() for data
integrity writes is broken in the same way.

And a quick look as fs specific writepages implementations indicates
that ext4_writepages() and ibtrfs's extent_write_cache_pages() have
the same issue.

> This can be problematic in cases like unmount. If the writeback
> doesn't process all delalloc pages before unmounting, we end up
> reclaiming inodes with non-zero delalloc block counts. In turn, this
> breaks block accounting and leaves the fs inconsistent.

XFS is probably the only filesystem that leaves detectable state
around and then detects and reports it....

> XFS explicitly discards delalloc blocks on such writepage failures
> to avoid this problem. This isn't terribly useful if we allow an
> integrity writeback to complete (and thus a filesystem to unmount)
> without addressing the entire set of dirty pages on an inode.
> Therefore, change ->writepage[s]() to track high level error state
> in the xfs_writepage_ctx structure and return it from the higher
> level operation callout rather than xfs_do_writepage(). This ensures
> that write_cache_pages() does not exit prematurely when called via
> ->writepages(), but both ->writepage() and ->writepages() still
> ultimately return an error for the higher level operation.
> 
> This patch introduces a subtle change in the behavior of background
> writeback in the event of persistent errors. The current behavior of
> returning an error preempts the background writeback. Writeback
> eventually comes around again and repeats the process for a few more
> pages (in practice) before it once again fails. This repeats over
> and over until the entire set of dirty pages is cleaned. This
> behavior results in a somewhat slower stream of "page discard"
> errors in the system log and dictates that many repeated fsync calls
> may be required before the entire data set is processed and mapping
> error consumed. With this change in place, background writeback
> executes on as many pages as necessary as if each page writeback
> were successful. The pages are cleaned immediately and significantly
> more page discard errors can be observed at once.

Yeah, this is a good change in behaviour, but I think the
implementation is wrong. write_cache_pages() needs to continue
iterating the range if WB_SYNC_ALL is set even when errors occur.

i.e. the error state should be maintained by write_cache_pages and
returned on completion, not require the filesystem to hide errors
from wcp in it's own specific writepage structure...

Cheers,

Dave.
-- 
Dave Chinner
david@fromorbit.com

  reply	other threads:[~2018-11-01  8:02 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-10-31 14:01 [PATCH 0/2] xfs: don't preempt writeback on page errors Brian Foster
2018-10-31 14:01 ` [PATCH 1/2] xfs: add writepage map error tag Brian Foster
2018-10-31 14:01 ` [PATCH 2/2] xfs: don't preempt writeback sequence on single page wb error Brian Foster
2018-10-31 23:02   ` Dave Chinner [this message]
2018-11-01 14:17     ` Brian Foster
2018-11-01 21:37       ` Dave Chinner
2018-11-02 11:42         ` Brian Foster

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=20181031230225.GX19305@dastard \
    --to=david@fromorbit.com \
    --cc=bfoster@redhat.com \
    --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.