linux/fs/btrfs
Filipe Manana eb145463f2 btrfs: do not assert we found block group item when creating free space tree
commit a5a51bf4e9 upstream.

Currently, when building a free space tree at populate_free_space_tree(),
if we are not using the block group tree feature, we always expect to find
block group items (either extent items or a block group item with key type
BTRFS_BLOCK_GROUP_ITEM_KEY) when we search the extent tree with
btrfs_search_slot_for_read(), so we assert that we found an item. However
this expectation is wrong since we can have a new block group created in
the current transaction which is still empty and for which we still have
not added the block group's item to the extent tree, in which case we do
not have any items in the extent tree associated to the block group.

The insertion of a new block group's block group item in the extent tree
happens at btrfs_create_pending_block_groups() when it calls the helper
insert_block_group_item(). This typically is done when a transaction
handle is released, committed or when running delayed refs (either as
part of a transaction commit or when serving tickets for space reservation
if we are low on free space).

So remove the assertion at populate_free_space_tree() even when the block
group tree feature is not enabled and update the comment to mention this
case.

Syzbot reported this with the following stack trace:

  BTRFS info (device loop3 state M): rebuilding free space tree
  assertion failed: ret == 0 :: 0, in fs/btrfs/free-space-tree.c:1115
  ------------[ cut here ]------------
  kernel BUG at fs/btrfs/free-space-tree.c:1115!
  Oops: invalid opcode: 0000 [#1] SMP KASAN PTI
  CPU: 1 UID: 0 PID: 6352 Comm: syz.3.25 Not tainted syzkaller #0 PREEMPT(full)
  Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 08/18/2025
  RIP: 0010:populate_free_space_tree+0x700/0x710 fs/btrfs/free-space-tree.c:1115
  Code: ff ff e8 d3 (...)
  RSP: 0018:ffffc9000430f780 EFLAGS: 00010246
  RAX: 0000000000000043 RBX: ffff88805b709630 RCX: fea61d0e2e79d000
  RDX: 0000000000000000 RSI: 0000000080000000 RDI: 0000000000000000
  RBP: ffffc9000430f8b0 R08: ffffc9000430f4a7 R09: 1ffff92000861e94
  R10: dffffc0000000000 R11: fffff52000861e95 R12: 0000000000000001
  R13: 1ffff92000861f00 R14: dffffc0000000000 R15: 0000000000000000
  FS:  00007f424d9fe6c0(0000) GS:ffff888125afc000(0000) knlGS:0000000000000000
  CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
  CR2: 00007fd78ad212c0 CR3: 0000000076d68000 CR4: 00000000003526f0
  Call Trace:
   <TASK>
   btrfs_rebuild_free_space_tree+0x1ba/0x6d0 fs/btrfs/free-space-tree.c:1364
   btrfs_start_pre_rw_mount+0x128f/0x1bf0 fs/btrfs/disk-io.c:3062
   btrfs_remount_rw fs/btrfs/super.c:1334 [inline]
   btrfs_reconfigure+0xaed/0x2160 fs/btrfs/super.c:1559
   reconfigure_super+0x227/0x890 fs/super.c:1076
   do_remount fs/namespace.c:3279 [inline]
   path_mount+0xd1a/0xfe0 fs/namespace.c:4027
   do_mount fs/namespace.c:4048 [inline]
   __do_sys_mount fs/namespace.c:4236 [inline]
   __se_sys_mount+0x313/0x410 fs/namespace.c:4213
   do_syscall_x64 arch/x86/entry/syscall_64.c:63 [inline]
   do_syscall_64+0xfa/0xfa0 arch/x86/entry/syscall_64.c:94
   entry_SYSCALL_64_after_hwframe+0x77/0x7f
   RIP: 0033:0x7f424e39066a
  Code: d8 64 89 02 (...)
  RSP: 002b:00007f424d9fde68 EFLAGS: 00000246 ORIG_RAX: 00000000000000a5
  RAX: ffffffffffffffda RBX: 00007f424d9fdef0 RCX: 00007f424e39066a
  RDX: 0000200000000180 RSI: 0000200000000380 RDI: 0000000000000000
  RBP: 0000200000000180 R08: 00007f424d9fdef0 R09: 0000000000000020
  R10: 0000000000000020 R11: 0000000000000246 R12: 0000200000000380
  R13: 00007f424d9fdeb0 R14: 0000000000000000 R15: 00002000000002c0
   </TASK>
  Modules linked in:
  ---[ end trace 0000000000000000 ]---

Reported-by: syzbot+884dc4621377ba579a6f@syzkaller.appspotmail.com
Link: https://lore.kernel.org/linux-btrfs/68dc3dab.a00a0220.102ee.004e.GAE@google.com/
Fixes: a5ed918285 ("Btrfs: implement the free space B-tree")
CC: <stable@vger.kernel.org> # 6.1.x: 1961d20f6f: btrfs: fix assertion when building free space tree
CC: <stable@vger.kernel.org> # 6.1.x
Reviewed-by: Qu Wenruo <wqu@suse.com>
Signed-off-by: Filipe Manana <fdmanana@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
History 2025-10-23 16:24:24 +02:00
..
tests btrfs: remove btrfs_clear_extent_bits() 2025-07-22 00:09:22 +02:00
accessors.c btrfs: accessors: rename variable for folio offset 2025-07-22 00:09:21 +02:00
accessors.h btrfs: accessors: delete token versions of set/get helpers 2025-07-22 00:05:00 +02:00
acl.c btrfs: remove unused included headers 2024-03-04 16:24:46 +01:00
acl.h btrfs: update include and forward declarations in headers 2025-03-18 20:35:43 +01:00
async-thread.c btrfs: use list_first_entry() everywhere 2025-05-15 14:30:47 +02:00
async-thread.h btrfs: add forward declarations and headers, part 1 2024-03-04 16:24:49 +01:00
backref.c btrfs: set search_commit_root to false in iterate_inodes_from_logical() 2025-07-22 00:09:20 +02:00
backref.h btrfs: set search_commit_root to false in iterate_inodes_from_logical() 2025-07-22 00:09:20 +02:00
bio.c btrfs: switch RCU helper versions to btrfs_debug() 2025-07-21 23:56:38 +02:00
bio.h btrfs: pass a physical address to btrfs_repair_io_failure() 2025-05-15 14:30:46 +02:00
block-group.c btrfs: annotate block group access with data_race() when sorting for reclaim 2025-09-15 05:25:43 +02:00
block-group.h btrfs: cache if we are using free space bitmaps for a block group 2025-07-21 23:58:03 +02:00
block-rsv.c btrfs: add block reserve for treelog 2025-05-15 14:30:53 +02:00
block-rsv.h btrfs: add block reserve for treelog 2025-05-15 14:30:53 +02:00
btrfs_inode.h btrfs: fix race between setting last_dir_index_offset and inode logging 2025-08-22 00:58:47 +02:00
compression.c btrfs: reject invalid compression level 2025-09-18 13:18:49 +02:00
compression.h btrfs: reject invalid compression level 2025-09-18 13:18:49 +02:00
ctree.c btrfs: don't use token set/get accessors for btrfs_item members 2025-07-22 00:04:59 +02:00
ctree.h btrfs: split btrfs_is_fstree() into multiple if statements for readability 2025-07-21 23:58:04 +02:00
defrag.c btrfs: defrag: add flag to force no-compression 2025-07-22 01:13:03 +02:00
defrag.h btrfs: pass struct btrfs_inode to btrfs_defrag_file() 2025-03-18 20:35:43 +01:00
delalloc-space.c btrfs: add block reserve for treelog 2025-05-15 14:30:53 +02:00
delalloc-space.h btrfs: pass struct btrfs_inode to btrfs_free_reserved_data_space_noquota() 2025-05-15 14:30:52 +02:00
delayed-inode.c btrfs: initialize inode::file_extent_tree after i_mode has been set 2025-09-15 05:25:40 +02:00
delayed-inode.h btrfs: make btrfs_readdir_delayed_dir_index() return a bool instead 2025-07-21 23:53:30 +02:00
delayed-ref.c btrfs: add btrfs prefix to is_fstree() and make it return bool 2025-07-21 23:58:04 +02:00
delayed-ref.h btrfs: constify more pointer parameters 2025-07-21 23:53:26 +02:00
dev-replace.c btrfs: use fs_holder_ops for all opened devices 2025-07-22 00:06:20 +02:00
dev-replace.h btrfs: trivial conversion to return bool instead of int 2025-05-15 14:30:49 +02:00
dir-item.c btrfs: rename inode number parameter passed to btrfs_check_dir_item_collision() 2025-07-22 00:05:00 +02:00
dir-item.h btrfs: rename inode number parameter passed to btrfs_check_dir_item_collision() 2025-07-22 00:05:00 +02:00
direct-io.c btrfs: remove superfluous return value check at btrfs_dio_iomap_begin() 2025-05-15 14:30:57 +02:00
direct-io.h btrfs: update include and forward declarations in headers 2025-03-18 20:35:43 +01:00
discard.c btrfs: use verbose assert at peek_discard_list() 2025-05-15 14:30:55 +02:00
discard.h btrfs: update include and forward declarations in headers 2025-03-18 20:35:43 +01:00
disk-io.c CRC updates for 6.17 2025-07-28 17:43:29 -07:00
disk-io.h btrfs: get rid of btrfs_read_dev_super() 2025-05-15 14:30:50 +02:00
export.c btrfs: avoid potential out-of-bounds in btrfs_encode_fh() 2025-10-19 16:37:23 +02:00
export.h btrfs: add forward declarations and headers, part 1 2024-03-04 16:24:49 +01:00
extent-io-tree.c btrfs: use our message helpers instead of pr_err/pr_warn/pr_info 2025-07-21 23:58:04 +02:00
extent-io-tree.h btrfs: remove btrfs_clear_extent_bits() 2025-07-22 00:09:22 +02:00
extent-tree.c btrfs: fix ssd_spread overallocation 2025-07-22 01:12:52 +02:00
extent-tree.h btrfs: constify more pointer parameters 2025-07-21 23:53:26 +02:00
extent_io.c btrfs: fix incorrect readahead expansion length 2025-10-23 16:24:23 +02:00
extent_io.h btrfs: make extent_buffer_test_bit() return a boolean instead 2025-07-21 23:58:02 +02:00
extent_map.c btrfs: add btrfs prefix to is_fstree() and make it return bool 2025-07-21 23:58:04 +02:00
extent_map.h btrfs: rename remaining exported extent map functions 2025-05-15 14:30:45 +02:00
fiemap.c btrfs: use refcount_t type for the extent buffer reference counter 2025-07-21 23:53:30 +02:00
fiemap.h btrfs: move fiemap code into its own file 2024-07-11 15:33:20 +02:00
file-item.c btrfs: use btrfs_is_data_reloc_root() where not done yet 2025-07-21 23:53:31 +02:00
file-item.h btrfs: change return type of btrfs_alloc_dummy_sum() to int 2025-05-15 14:30:49 +02:00
file.c vfs-6.17-rc1.mmap_prepare 2025-07-28 13:43:25 -07:00
file.h btrfs: update include and forward declarations in headers 2025-03-18 20:35:43 +01:00
free-space-cache.c btrfs: use pgoff_t for page index variables 2025-07-21 23:58:05 +02:00
free-space-cache.h btrfs: add cancellation points to trim loops 2024-10-07 23:21:56 +02:00
free-space-tree.c btrfs: do not assert we found block group item when creating free space tree 2025-10-23 16:24:24 +02:00
free-space-tree.h btrfs: add btrfs prefix to free space tree exported functions 2025-07-21 23:58:02 +02:00
fs.c btrfs: update include and forward declarations in headers 2025-03-18 20:35:43 +01:00
fs.h btrfs: index buffer_tree using node size 2025-07-22 00:09:20 +02:00
inode-item.c btrfs: remove unused parameters from btrfs_lookup_inode_extref() 2025-07-21 23:58:03 +02:00
inode-item.h btrfs: remove unused parameters from btrfs_lookup_inode_extref() 2025-07-21 23:58:03 +02:00
inode.c btrfs: fix symbolic link reading when bs > ps 2025-10-15 12:03:18 +02:00
ioctl.c btrfs: fix memory leak on duplicated memory in the qgroup assign ioctl 2025-10-23 16:24:23 +02:00
ioctl.h tree-wide: s/struct fileattr/struct file_kattr/g 2025-07-04 16:14:39 +02:00
Kconfig btrfs: enable large data folio support under CONFIG_BTRFS_EXPERIMENTAL 2025-07-21 23:53:30 +02:00
locking.c btrfs: trivial conversion to return bool instead of int 2025-05-15 14:30:49 +02:00
locking.h btrfs: trivial conversion to return bool instead of int 2025-05-15 14:30:49 +02:00
lru_cache.c btrfs: fix typos found by codespell 2023-12-15 23:00:04 +01:00
lru_cache.h btrfs: cleanup recursive include of the same header 2024-07-11 15:33:22 +02:00
lzo.c btrfs: prepare compression paths for large data folios 2025-05-15 14:30:45 +02:00
Makefile btrfs: selftests: add delayed ref self test cases 2025-01-13 14:53:13 +01:00
messages.c btrfs: disable rate limiting when debug enabled 2024-10-01 19:29:41 +02:00
messages.h btrfs: merge btrfs_printk_ratelimited() and its only caller 2025-07-21 23:56:39 +02:00
misc.h btrfs: add helper folio_end() 2025-07-21 23:58:01 +02:00
ordered-data.c btrfs: use folio_end() where appropriate 2025-07-21 23:58:01 +02:00
ordered-data.h btrfs: introduce a read path dedicated extent lock helper 2025-03-18 20:35:48 +01:00
orphan.c btrfs: BTRFS_PATH_AUTO_FREE in orphan.c 2024-09-10 16:51:22 +02:00
orphan.h btrfs: add forward declarations and headers, part 1 2024-03-04 16:24:49 +01:00
print-tree.c btrfs: use our message helpers instead of pr_err/pr_warn/pr_info 2025-07-21 23:58:04 +02:00
print-tree.h btrfs: update include and forward declarations in headers 2025-03-18 20:35:43 +01:00
props.c btrfs: props: switch prop_handler::extract to struct btrfs_inode 2025-03-18 20:35:44 +01:00
props.h btrfs: pass struct btrfs_inode to btrfs_inode_inherit_props() 2025-03-18 20:35:44 +01:00
qgroup.c btrfs: fix squota compressed stats leak 2025-09-02 20:45:15 +02:00
qgroup.h btrfs: update include and forward declarations in headers 2025-03-18 20:35:43 +01:00
raid-stripe-tree.c btrfs: unfold transaction abort at btrfs_insert_one_raid_extent() 2025-07-21 23:53:24 +02:00
raid-stripe-tree.h btrfs: update include and forward declarations in headers 2025-03-18 20:35:43 +01:00
raid56.c btrfs: raid56: use list_last_entry() at cache_rbio() 2025-05-15 14:30:54 +02:00
raid56.h btrfs: add forward declarations and headers, part 2 2024-03-04 16:24:49 +01:00
ref-verify.c btrfs: ref-verify: handle damaged extent root tree 2025-09-18 05:47:34 +02:00
ref-verify.h btrfs: constify more pointer parameters 2025-07-21 23:53:26 +02:00
reflink.c btrfs: remove btrfs_clear_extent_bits() 2025-07-22 00:09:22 +02:00
reflink.h btrfs: add forward declarations and headers, part 1 2024-03-04 16:24:49 +01:00
relocation.c btrfs: fix clearing of BTRFS_FS_RELOC_RUNNING if relocation already running 2025-10-23 16:24:23 +02:00
relocation.h btrfs: don't print relocation messages from auto reclaim 2025-07-22 00:09:22 +02:00
root-tree.c btrfs: root-tree: remove unnecessary calls to btrfs_mark_buffer_dirty() 2025-01-13 14:53:20 +01:00
root-tree.h btrfs: qgroup: fix qgroup prealloc rsv leak in subvolume operations 2024-04-02 19:18:23 +02:00
scrub.c btrfs: switch RCU helper versions to btrfs_warn() 2025-07-21 23:56:38 +02:00
scrub.h btrfs: add forward declarations and headers, part 1 2024-03-04 16:24:49 +01:00
send.c btrfs: send: use fallocate for hole punching with send stream v2 2025-07-22 01:23:14 +02:00
send.h btrfs: pass btrfs_root pointers to send ioctl parameters 2025-03-18 20:35:49 +01:00
space-info.c btrfs: change dump_block_groups() in btrfs_dump_space_info() from int to bool 2025-07-21 23:58:05 +02:00
space-info.h btrfs: change dump_block_groups() in btrfs_dump_space_info() from int to bool 2025-07-21 23:58:05 +02:00
subpage.c btrfs: subpage: keep TOWRITE tag until folio is cleaned 2025-08-13 14:08:45 +02:00
subpage.h btrfs: enable large data folio support under CONFIG_BTRFS_EXPERIMENTAL 2025-07-21 23:53:30 +02:00
super.c btrfs: only set the device specific options after devices are opened 2025-10-23 16:24:23 +02:00
super.h btrfs: change BTRFS_MOUNT_* flags to 64bit type 2024-07-19 17:20:23 +02:00
sysfs.c btrfs: use our message helpers instead of pr_err/pr_warn/pr_info 2025-07-21 23:58:04 +02:00
sysfs.h btrfs: update include and forward declarations in headers 2025-03-18 20:35:43 +01:00
transaction.c btrfs: qgroup: fix qgroup create ioctl returning success after quotas disabled 2025-07-22 00:07:30 +02:00
transaction.h btrfs: move abort_should_print_stack() to transaction.h 2025-01-13 14:53:17 +01:00
tree-checker.c btrfs: tree-checker: fix the incorrect inode ref size check 2025-09-18 05:47:25 +02:00
tree-checker.h btrfs: validate system chunk array at btrfs_validate_super() 2025-01-13 14:53:18 +01:00
tree-log.c btrfs: fix invalid extref key setup when replaying dentry 2025-09-15 05:25:31 +02:00
tree-log.h btrfs: avoid transaction commit on any fsync after subvolume creation 2024-07-11 15:33:24 +02:00
tree-mod-log.c btrfs: reduce size of struct tree_mod_elem 2025-07-22 00:09:20 +02:00
tree-mod-log.h btrfs: drop unused parameter path from btrfs_tree_mod_log_rewind() 2024-11-11 14:34:15 +01:00
ulist.c btrfs: use rb_find_add() in ulist_rbtree_insert() 2025-07-21 23:53:25 +02:00
ulist.h btrfs: preallocate ulist memory for qgroup rsv 2024-07-11 15:33:26 +02:00
uuid-tree.c btrfs: uuid-tree: remove unnecessary call to btrfs_mark_buffer_dirty() 2025-01-13 14:53:20 +01:00
uuid-tree.h btrfs: move uuid tree related code to uuid-tree.[ch] 2024-09-10 16:51:12 +02:00
verity.c btrfs: pass struct btrfs_inode to btrfs_sync_inode_flags_to_i_flags() 2025-03-18 20:35:49 +01:00
verity.h btrfs: add forward declarations and headers, part 1 2024-03-04 16:24:49 +01:00
volumes.c btrfs: don't allow adding block device of less than 1 MB 2025-09-05 19:52:10 +02:00
volumes.h btrfs: don't print relocation messages from auto reclaim 2025-07-22 00:09:22 +02:00
xattr.c btrfs: replace strcpy() with strscpy() 2025-07-22 00:05:00 +02:00
xattr.h btrfs: update include and forward declarations in headers 2025-03-18 20:35:43 +01:00
zlib.c btrfs: prepare compression paths for large data folios 2025-05-15 14:30:45 +02:00
zoned.c btrfs: fix memory leaks when rejecting a non SINGLE data profile without an RST 2025-10-23 16:24:24 +02:00
zoned.h btrfs: zoned: reserve data_reloc block group on mount 2025-07-21 23:56:31 +02:00
zstd.c btrfs: use our message helpers instead of pr_err/pr_warn/pr_info 2025-07-21 23:58:04 +02:00