btrfs-progs: Fix wrong tree block alignment for unalianged block group
authorQu Wenruo <quwenruo@cn.fujitsu.com>
Mon, 24 Oct 2016 07:22:33 +0000 (15:22 +0800)
committerDavid Sterba <dsterba@suse.com>
Tue, 25 Oct 2016 12:31:06 +0000 (14:31 +0200)
commitffb1b847bd554e45c00212280847b9f2059a87f3
treeac814579158f3a29451ed842850989ca7c000d8e
parentb2fbfc8cdd4ce4bf7d22e55695a4cc7e707c9ef3
btrfs-progs: Fix wrong tree block alignment for unalianged block group

Commit 854437ca(btrfs-progs: extent-tree: avoid allocating tree block
that crosses stripe boundary) introduces check for logical bytenr not
crossing stripe boundary.

However that check is not completely correct.
It only checks if the logical bytenr and length agaist absolute logical
offset.
That's to say, it only check if a tree block lies in 64K logical stripe.

But in fact, it's possible a block group starts at bytenr unaligned with
64K, just like the following case.

Then btrfsck will give false alert.

0       32K       64K       96K        128K         160K ...
        |--------------- Block group A ---------------------
|<-----TB 32K------>|
        |/Scrub stripe unit/|
|    WRONG UNIT   |

In that case, TB(tree block) at bytenr 32K in fact fits into the kernel
scrub stripe unit.
But doesn't fit into the pure logical 64K stripe.

Fix check_crossing_stripes() to compare bytenr to block group start, not
to absolute logical bytenr.

Reported-by: Jussi Kansanen <jussi.kansanen@gmail.com>
Signed-off-by: Qu Wenruo <quwenruo@cn.fujitsu.com>
Signed-off-by: David Sterba <dsterba@suse.com>
cmds-check.c
extent-tree.c
volumes.h