• Omar Sandoval's avatar
    Btrfs: fix device replace of a missing RAID 5/6 device · 73ff61db
    Omar Sandoval authored
    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: default avatarPhilip <bugzilla@philip-seeger.de>
    Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=96141Signed-off-by: default avatarOmar Sandoval <osandov@fb.com>
    Signed-off-by: default avatarChris Mason <clm@fb.com>
    73ff61db
scrub.c 115 KB