]> www.infradead.org Git - users/jedix/linux-maple.git/commit
Btrfs: fix device replace of a missing RAID 5/6 device
authorOmar Sandoval <osandov@fb.com>
Fri, 19 Jun 2015 18:52:51 +0000 (11:52 -0700)
committerChuck Anderson <chuck.anderson@oracle.com>
Mon, 31 Oct 2016 00:00:08 +0000 (17:00 -0700)
commitd6423797493bb4e6c221c74970969f2b72c2737b
treef7d31a1562b5e1c1ff89b37aa22180e68c1d4a8f
parent28ed3031bea3170917d791a95233bb40894a660d
Btrfs: fix device replace of a missing RAID 5/6 device

The original implementation of device replace on RAID 5/6 seems to have
missed support for replacing a missing device. When this is attempted,
we end up calling bio_add_page() on a bio with a NULL ->bi_bdev, which
crashes when we try to dereference it. This happens because
btrfs_map_block() has no choice but to return us the missing device
because RAID 5/6 don't have any alternate mirrors to read from, and a
missing device has a NULL bdev.

The idea implemented here is to handle the missing device case
separately, which better only happen when we're replacing a missing RAID
5/6 device. We use the new BTRFS_RBIO_REBUILD_MISSING operation to
reconstruct the data from parity, check it with
scrub_recheck_block_checksum(), and write it out with
scrub_write_block_to_dev_replace().

Reported-by: Philip <bugzilla@philip-seeger.de>
Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=96141
Signed-off-by: Omar Sandoval <osandov@fb.com>
Signed-off-by: Chris Mason <clm@fb.com>
Orabug: 24447930
signed-off-by: Divya Indi <divya.indi@oracle.com>
(cherry picked from commit 73ff61dbe5edeb1799d7e91c8b0641f87feb75fa)
fs/btrfs/scrub.c