Btrfs: catch invalid free space trees
authorOmar Sandoval <osandov@fb.com>
Fri, 23 Sep 2016 00:24:22 +0000 (17:24 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 22 Oct 2016 10:06:47 +0000 (12:06 +0200)
commit56a17dd9eab1ea323f86adcbb05672369f63f8fa
tree83f4ad737255f96ed3f6a2ed02d2e1e383926d35
parent520f16abf003952def5d6b175c56c2b7d5d5b90f
Btrfs: catch invalid free space trees

commit 6675df311db87aa2107a04ef97e19420953cbace upstream.

There are two separate issues that can lead to corrupted free space
trees.

1. The free space tree bitmaps had an endianness issue on big-endian
   systems which is fixed by an earlier patch in this series.
2. btrfs-progs before v4.7.3 modified filesystems without updating the
   free space tree.

To catch both of these issues at once, we need to force the free space
tree to be rebuilt. To do so, add a FREE_SPACE_TREE_VALID compat_ro bit.
If the bit isn't set, we know that it was either produced by a broken
big-endian kernel or may have been corrupted by btrfs-progs.

This also provides us with a way to add rudimentary read-write support
for the free space tree to btrfs-progs: it can just clear this bit and
have the kernel rebuild the free space tree.

Tested-by: Holger Hoffstätte <holger@applied-asynchrony.com>
Tested-by: Chandan Rajendra <chandan@linux.vnet.ibm.com>
Signed-off-by: Omar Sandoval <osandov@fb.com>
Signed-off-by: David Sterba <dsterba@suse.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
fs/btrfs/ctree.h
fs/btrfs/disk-io.c
fs/btrfs/free-space-tree.c
include/uapi/linux/btrfs.h