From 73ff61dbe5edeb1799d7e91c8b0641f87feb75fa Mon Sep 17 00:00:00 2001 From: Omar Sandoval Date: Fri, 19 Jun 2015 11:52:51 -0700 Subject: [PATCH] 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: https://bugzilla.kernel.org/show_bug.cgi?id=96141 Signed-off-by: Omar Sandoval Signed-off-by: Chris Mason --- Reading git-format-patch failed