summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFilipe Manana <fdmanana@suse.com>2026-01-21 20:48:35 +0000
committerDavid Sterba <dsterba@suse.com>2026-02-03 07:56:19 +0100
commita8bec25e014eab671ec8a25b03d391cad3e55230 (patch)
tree90aa9a440e5c1bd17536dba6894d54b2e245c2f6
parent79d51b5c7a2c64f3420ff632df67a76bf01a46ed (diff)
btrfs: deal with missing root in sample_block_group_extent_item()
In case the root does not exists, which is unexpected, btrfs_extent_root() returns NULL, but we ignore that and so if it happens we can trigger a NULL pointer dereference later. So verify if we found the root and log an error message in case it's missing. Reviewed-by: Boris Burkov <boris@bur.io> Reviewed-by: Qu Wenruo <wqu@suse.com> Signed-off-by: Filipe Manana <fdmanana@suse.com> Reviewed-by: David Sterba <dsterba@suse.com> Signed-off-by: David Sterba <dsterba@suse.com>
-rw-r--r--fs/btrfs/block-group.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/fs/btrfs/block-group.c b/fs/btrfs/block-group.c
index 66c512bc022c..28aa87872f0d 100644
--- a/fs/btrfs/block-group.c
+++ b/fs/btrfs/block-group.c
@@ -607,6 +607,12 @@ static int sample_block_group_extent_item(struct btrfs_caching_control *caching_
lockdep_assert_held_read(&fs_info->commit_root_sem);
extent_root = btrfs_extent_root(fs_info, block_group->start);
+ if (unlikely(!extent_root)) {
+ btrfs_err(fs_info,
+ "missing extent root for block group at offset %llu",
+ block_group->start);
+ return -EUCLEAN;
+ }
search_offset = index * div_u64(block_group->length, max_index);
search_key.objectid = block_group->start + search_offset;