Permalink
Browse files
btrfs: Only require sector size alignment for parent eb bytenr
[BUG] A completely sane converted fs will cause kernel warning at balance time: [ 1557.188633] BTRFS info (device sda7): relocating block group 8162107392 flags data [ 1563.358078] BTRFS info (device sda7): found 11722 extents [ 1563.358277] BTRFS info (device sda7): leaf 7989321728 gen 95 total ptrs 213 free space 3458 owner 2 [ 1563.358280] item 0 key (7984947200 169 0) itemoff 16250 itemsize 33 [ 1563.358281] extent refs 1 gen 90 flags 2 [ 1563.358282] ref#0: tree block backref root 4 [ 1563.358285] item 1 key (7985602560 169 0) itemoff 16217 itemsize 33 [ 1563.358286] extent refs 1 gen 93 flags 258 [ 1563.358287] ref#0: shared block backref parent 7985602560 [ 1563.358288] (parent 7985602560 is NOT ALIGNED to nodesize 16384) [ 1563.358290] item 2 key (7985635328 169 0) itemoff 16184 itemsize 33 ... [ 1563.358995] BTRFS error (device sda7): eb 7989321728 invalid extent inline ref type 182 [ 1563.358996] ------------[ cut here ]------------ [ 1563.359005] WARNING: CPU: 14 PID: 2930 at 0xffffffff9f231766 Then with transaction abort, and obviously failed to balance the fs. [CAUSE] That mentioned inline ref type 182 is completely sane, it's BTRFS_SHARED_BLOCK_REF_KEY, it's some extra check making kernel to believe it's invalid. Commit 64ecdb6 ("Btrfs: add one more sanity check for shared ref type") introduced extra checks for backref type. One of the requirement is, parent bytenr must be aligned to node size, which is not correct, especially for converted fs. As converted fs could created metadata chunk at bytenr aligned to sector size, but not aligned to node size. Then new metadata extents in that chunk would only be aligned to sector size, with only offset inside the chunk is aligned to node size. One tree block can start at any bytenr aligned to sector size. Node size should never be an alignment requirement. Thus such bad check is causing above bug. [FIX] Change the alignment requirement from node size alignment to sector size alignment. Also, to make our lives a little easier, also output @iref when btrfs_get_extent_inline_ref_type() failed, so we can locate the item easier. Link: https://bugzilla.kernel.org/show_bug.cgi?id=205475 Fixes: 64ecdb6 ("Btrfs: add one more sanity check for shared ref type") Signed-off-by: Qu Wenruo <wqu@suse.com>
- Loading branch information
Showing
with
17 additions
and 14 deletions.
- +7 −6 fs/btrfs/extent-tree.c
- +10 −8 fs/btrfs/print-tree.c