]> git.baikalelectronics.ru Git - kernel.git/commit
btrfs: tree-checker: do not error out if extent ref hash doesn't match
authorJosef Bacik <josef@toxicpanda.com>
Tue, 16 Feb 2021 20:43:22 +0000 (15:43 -0500)
committerDavid Sterba <dsterba@suse.com>
Mon, 22 Feb 2021 17:07:44 +0000 (18:07 +0100)
commitf5f404fc7f2ab77348e8776d29f73a8cd9d7b710
treedaba30956b0868111b1fca1aec7651022f2f60ac
parentb2a4810c3971f6bd895d2b9f2a5ec06a9e1b01be
btrfs: tree-checker: do not error out if extent ref hash doesn't match

The tree checker checks the extent ref hash at read and write time to
make sure we do not corrupt the file system.  Generally extent
references go inline, but if we have enough of them we need to make an
item, which looks like

key.objectid = <bytenr>
key.type = <BTRFS_EXTENT_DATA_REF_KEY|BTRFS_TREE_BLOCK_REF_KEY>
key.offset = hash(tree, owner, offset)

However if key.offset collide with an unrelated extent reference we'll
simply key.offset++ until we get something that doesn't collide.
Obviously this doesn't match at tree checker time, and thus we error
while writing out the transaction.  This is relatively easy to
reproduce, simply do something like the following

  xfs_io -f -c "pwrite 0 1M" file
  offset=2

  for i in {0..10000}
  do
  xfs_io -c "reflink file 0 ${offset}M 1M" file
  offset=$(( offset + 2 ))
  done

  xfs_io -c "reflink file 0 17999258914816 1M" file
  xfs_io -c "reflink file 0 35998517829632 1M" file
  xfs_io -c "reflink file 0 53752752058368 1M" file

  btrfs filesystem sync

And the sync will error out because we'll abort the transaction.  The
magic values above are used because they generate hash collisions with
the first file in the main subvol.

The fix for this is to remove the hash value check from tree checker, as
we have no idea which offset ours should belong to.

Reported-by: Tuomas Lähdekorpi <tuomas.lahdekorpi@gmail.com>
Fixes: e8aa04cd9b8f ("btrfs: tree-checker: Add EXTENT_DATA_REF check")
CC: stable@vger.kernel.org # 5.4+
Reviewed-by: Filipe Manana <fdmanana@suse.com>
Signed-off-by: Josef Bacik <josef@toxicpanda.com>
Reviewed-by: David Sterba <dsterba@suse.com>
[ add comment]
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/tree-checker.c