From: Josef Bacik <josef@toxicpanda.com>
To: David Sterba <dsterba@suse.com>, Chris Mason <mason@kernel.org>,
Naohiro Aota <naohiro.aota@wdc.com>,
Johannes Thumshirn <johannes.thumshirn@wdc.com>,
Qu Wenruo <wqu@suse.com>, Boris Burkov <boris@bur.io>,
Filipe Manana <fdmanana@suse.com>
Cc: linux-btrfs@vger.kernel.org, linux-kernel@vger.kernel.org,
stable@vger.kernel.org,
Zygo Blaxell <ce3g8jdj@umail.furryterror.org>,
Josef Bacik <josef@toxicpanda.com>
Subject: [PATCH v2 0/5] btrfs: data integrity fixes
Date: Tue, 03 Nov 2026 15:05:15 +0000 [thread overview]
Message-ID: <20261103-b4-btrfs-data-integrity-v2-0-577dc2690061@toxicpanda.com> (raw)
v1: https://lore.kernel.org/all/20261030-b4-btrfs-data-integrity-v1-0-f4d4196731e6@toxicpanda.com/
v1->v2:
- Rework patch 3, now "btrfs: wait for ordered extent IO in fast fsync".
BTRFS_INODE_COW_WRITE_ERROR is set after the end IO handler clears
writeback, so a fast fsync could still miss it, for plain write errors
as well. Fast fsync now waits for BTRFS_ORDERED_IO_DONE on the ordered
extents it collected and checks BTRFS_ORDERED_IOERR, and the inode flag
is gone (Sashiko, Qu, Filipe).
- Patch 4: use DEBUG_WARN() instead of ASSERT() for the check that can no
longer be true (Filipe).
- Collect tags.
--- Original email (v1) ---
Hello,
I've been doing some model checking of our trickier paths with Claude's
help, and these are the fixes for the bugs it turned up that actually
lose data, or tell userspace that something is safe when it isn't.
Every one of them was reproduced in a VM on an unpatched kernel and goes
away with the fix, though the fsync and log sync ones needed a delay
injected to hit the window.
The worst one is the fstrim one. If you run fstrim while a device
replace is running we'll discard everything that has already been copied
to the target device, because the target's alloc_state is empty until
the replace finishes, so the whole device looks unallocated. The
replace then finishes happily, the source device goes away, and you're
left with zeroes where your metadata used to be. This has been around
since FITRIM learned to trim unallocated space back in 4.3.
The split bio one is similarly nasty. If the last piece of a split bio
to complete is one of the split bios and it failed, we drop the error on
the floor, and a buffered read returns success with whatever was sitting
in the page.
The rest are in our error handling. A delalloc failure in the middle of
a folio leaves blocks dirty that no longer have an ordered extent, a
fast fsync after an error that happened before we submitted the bio can
log extents that were never written (which log replay then happily puts
in place of the data that was there before), and btrfs_sync_log() can
return success for a log transaction that never got committed.
I have a cleanup series for btrfs_sync_log coming, as I had to spend a
lot of time grokking that fix, which is a good indication that the code
is too complicated.
They're all independent of each other and tagged for stable. This is
against for-next, and it also applies cleanly on top of Qu's
extent-by-extent writeback series. Thanks,
Josef
---
Changes in v2:
- Link to v1: https://patch.msgid.link/20261030-b4-btrfs-data-integrity-v1-0-f4d4196731e6@toxicpanda.com
---
Josef Bacik (5):
btrfs: don't drop the error of the last split bio
btrfs: clear dirty blocks after a delalloc failure
btrfs: wait for ordered extent IO in fast fsync
btrfs: don't report success for a skipped log sync
btrfs: don't trim the target of a device replace
fs/btrfs/bio.c | 9 ++++++---
fs/btrfs/btrfs_inode.h | 10 ----------
fs/btrfs/extent-tree.c | 8 ++++++++
fs/btrfs/extent_io.c | 10 ++++++++++
fs/btrfs/file.c | 52 +++++++++++++++++++++++++++++++++++++++----------
fs/btrfs/ordered-data.c | 31 -----------------------------
fs/btrfs/tree-log.c | 20 +++++++++++++++++--
7 files changed, 84 insertions(+), 56 deletions(-)
---
base-commit: 2789b2c034d7c0c8687355921a38c5ac41a565fa
change-id: 20261029-b4-btrfs-data-integrity-eb753b57300f
next reply other threads:[~2026-11-03 15:05 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-03 15:05 Josef Bacik [this message]
2026-11-03 15:05 ` [PATCH v2 1/5] btrfs: don't drop the error of the last split bio Josef Bacik
2026-11-03 15:05 ` [PATCH v2 2/5] btrfs: clear dirty blocks after a delalloc failure Josef Bacik
2026-11-03 15:05 ` [PATCH v2 3/5] btrfs: wait for ordered extent IO in fast fsync Josef Bacik
2026-11-03 18:10 ` Filipe Manana
2026-11-03 15:05 ` [PATCH v2 4/5] btrfs: don't report success for a skipped log sync Josef Bacik
2026-11-03 15:05 ` [PATCH v2 5/5] btrfs: don't trim the target of a device replace Josef Bacik
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=20261103-b4-btrfs-data-integrity-v2-0-577dc2690061@toxicpanda.com \
--to=josef@toxicpanda.com \
--cc=boris@bur.io \
--cc=ce3g8jdj@umail.furryterror.org \
--cc=dsterba@suse.com \
--cc=fdmanana@suse.com \
--cc=johannes.thumshirn@wdc.com \
--cc=linux-btrfs@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mason@kernel.org \
--cc=naohiro.aota@wdc.com \
--cc=stable@vger.kernel.org \
--cc=wqu@suse.com \
/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
all inboxes | Powered by JetHome®