From: Dave Chinner <david@fromorbit.com>
To: "Darrick J. Wong" <djwong@kernel.org>
Cc: linux-xfs@vger.kernel.org
Subject: Re: [PATCH 2/3] xfs: recalculate free rt extents after log recovery
Date: Mon, 11 Apr 2022 11:19:20 +1000 [thread overview]
Message-ID: <20220411011920.GR1544202@dread.disaster.area> (raw)
In-Reply-To: <164961486596.70555.15167639007811062573.stgit@magnolia>
On Sun, Apr 10, 2022 at 11:21:06AM -0700, Darrick J. Wong wrote:
> From: Darrick J. Wong <djwong@kernel.org>
>
> I've been observing periodic corruption reports from xfs_scrub involving
> the free rt extent counter (frextents) while running xfs/141. That test
> uses an error injection knob to induce a torn write to the log, and an
> arbitrary number of recovery mounts, frextents will count fewer free rt
> extents than can be found the rtbitmap.
>
> The root cause of the problem is a combination of the misuse of
> sb_frextents in the incore mount to reflect both incore reservations
> made by running transactions as well as the actual count of free rt
> extents on disk. The following sequence can reproduce the undercount:
>
> Thread 1 Thread 2
> xfs_trans_alloc(rtextents=3)
> xfs_mod_frextents(-3)
> <blocks>
> xfs_attr_set()
> xfs_bmap_attr_addfork()
> xfs_add_attr2()
> xfs_log_sb()
> xfs_sb_to_disk()
> xfs_trans_commit()
> <log flushed to disk>
> <log goes down>
>
> Note that thread 1 subtracts 3 from sb_frextents even though it never
> commits to using that space. Thread 2 writes the undercounted value to
> the ondisk superblock and logs it to the xattr transaction, which is
> then flushed to disk. At next mount, log recovery will find the logged
> superblock and write that back into the filesystem. At the end of log
> recovery, we reread the superblock and install the recovered
> undercounted frextents value into the incore superblock. From that
> point on, we've effectively leaked thread 1's transaction reservation.
>
> The correct fix for this is to separate the incore reservation from the
> ondisk usage, but that's a matter for the next patch. Because the
> kernel has been logging superblocks with undercounted frextents for a
> very long time and we don't demand that sysadmins run xfs_repair after a
> crash, fix the undercount by recomputing frextents after log recovery.
>
> Gating this on log recovery is a reasonable balance (I think) between
> correcting the problem and slowing down every mount attempt. Note that
> xfs_repair will fix undercounted frextents.
>
> Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Looks good now!
Reviewed-by: Dave Chinner <dchinner@redhat.com>
--
Dave Chinner
david@fromorbit.com
next prev parent reply other threads:[~2022-04-11 1:19 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-04-10 18:20 [PATCHSET v2 0/3] xfs: fix corruption of free rt extent count Darrick J. Wong
2022-04-10 18:21 ` [PATCH 1/3] xfs: pass explicit mount pointer to rtalloc query functions Darrick J. Wong
2022-04-11 1:17 ` Dave Chinner
2022-04-11 19:46 ` Darrick J. Wong
2022-04-11 20:50 ` Dave Chinner
2022-04-10 18:21 ` [PATCH 2/3] xfs: recalculate free rt extents after log recovery Darrick J. Wong
2022-04-11 1:19 ` Dave Chinner [this message]
2022-04-10 18:21 ` [PATCH 3/3] xfs: use a separate frextents counter for rt extent reservations Darrick J. Wong
2022-04-11 1:26 ` Dave Chinner
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=20220411011920.GR1544202@dread.disaster.area \
--to=david@fromorbit.com \
--cc=djwong@kernel.org \
--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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox