public inbox for linux-btrfs@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH v4 0/3] btrfs: fix an ASSERT() triggered inside prepare_to_merge()
@ 2023-08-03  9:20 Qu Wenruo
  2023-08-03  9:20 ` [PATCH v4 1/3] btrfs: avoid race with qgroup tree creation and relocation Qu Wenruo
                   ` (3 more replies)
  0 siblings, 4 replies; 9+ messages in thread
From: Qu Wenruo @ 2023-08-03  9:20 UTC (permalink / raw)
  To: linux-btrfs

[CHANGELOG]
v4:
- Remove the remaining commas inside the root key prompt of the 2nd
  patch

v3:
- Update the comments and commit messages

- Replace the deleted ASSERT(0)s with WARN_ON()s

- Remove a debug dump_stack() in the last patch

v2:
- Add two new patches
  One to properly fix the root cause (race between quota tree creation
  and relocation).
  One to reject obviously corrupted reloc trees.

- Remove two ASSERT()s from merge_reloc_roots()

[BUG]
Syzbot reported an ASSERT() triggered inside prepare_to_merge(), which
turns out to be a regression caused by commit 85724171b302 ("btrfs: fix
the btrfs_get_global_root return value").

[CAUSE]
The race can happen between quota tree creation and relocation, the root
cause is btrfs_get_fs_root() can try to read quota tree as one fs tree,
thus setting ROOT_SHAREABLE flag.

This leads to relocation code to create a new reloc tree for quota tree,
which should not happen.
Furthermore at later relocation stages, we will grab quota root from
fs_info->quota_root, which is not the same as the one read by
btrfs_get_fs_root(), thus quota_root->reloc_root is NULL.

This triggers the ASSERT() and crash the system.

[FIX]
- Make sure non-subvolume trees are always grabbed from fs_info
  This changes btrfs_get_root_ref() to a more explicit checks,
  and would return PTR_ERR(-ENOENT) if a non-subvolume (data reloc tree
  still counts as a subvolume tree) objectid is provided.

  This is the root fix.

- Replace the ASSERT() with a more graceful exit
  Still does the extra kernel warning through
  btrfs_abort_transaction(), but with more useful error messages.

- Reject obviously incorrect reloc trees through tree-checker
  Just another layer of sanity checks for on-disk data.


Qu Wenruo (3):
  btrfs: avoid race with qgroup tree creation and relocation
  btrfs: exit gracefully if reloc roots don't match
  btrfs: reject invalid reloc tree root keys with stack dump

 fs/btrfs/disk-io.c      | 13 +++++++++++-
 fs/btrfs/relocation.c   | 44 +++++++++++++++++++++++++++++++++--------
 fs/btrfs/tree-checker.c | 14 +++++++++++++
 3 files changed, 62 insertions(+), 9 deletions(-)

-- 
2.41.0


^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2023-08-17 12:51 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-08-03  9:20 [PATCH v4 0/3] btrfs: fix an ASSERT() triggered inside prepare_to_merge() Qu Wenruo
2023-08-03  9:20 ` [PATCH v4 1/3] btrfs: avoid race with qgroup tree creation and relocation Qu Wenruo
2023-08-03  9:20 ` [PATCH v4 2/3] btrfs: exit gracefully if reloc roots don't match Qu Wenruo
2023-08-03 10:26   ` Filipe Manana
2023-08-09 19:24   ` David Sterba
2023-08-10  0:57     ` Qu Wenruo
2023-08-17 12:44       ` David Sterba
2023-08-03  9:20 ` [PATCH v4 3/3] btrfs: reject invalid reloc tree root keys with stack dump Qu Wenruo
2023-08-09 19:42 ` [PATCH v4 0/3] btrfs: fix an ASSERT() triggered inside prepare_to_merge() David Sterba

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox