btrfs: check-integrity: Fix NULL pointer dereference for degraded mount
Commitf8f84b2dfd
("btrfs: index check-integrity state hash by a dev_t") changed how btrfsic indexes device state. Now we need to access device->bdev->bd_dev, while for degraded mount it's completely possible to have device->bdev as NULL, thus it will trigger a NULL pointer dereference at mount time. Fix it by checking if the device is degraded before accessing device->bdev->bd_dev. There are a lot of other places accessing device->bdev->bd_dev, however the other call sites have either checked device->bdev, or the device->bdev is passed from btrfsic_map_block(), so it won't cause harm. Fixes:f8f84b2dfd
("btrfs: index check-integrity state hash by a dev_t") Signed-off-by: Qu Wenruo <wqu@suse.com> Reviewed-by: David Sterba <dsterba@suse.com> Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
parent
43a7e99db6
commit
9912bbf644
@ -1539,7 +1539,12 @@ static int btrfsic_map_block(struct btrfsic_state *state, u64 bytenr, u32 len,
|
||||
}
|
||||
|
||||
device = multi->stripes[0].dev;
|
||||
block_ctx_out->dev = btrfsic_dev_state_lookup(device->bdev->bd_dev);
|
||||
if (test_bit(BTRFS_DEV_STATE_MISSING, &device->dev_state) ||
|
||||
!device->bdev || !device->name)
|
||||
block_ctx_out->dev = NULL;
|
||||
else
|
||||
block_ctx_out->dev = btrfsic_dev_state_lookup(
|
||||
device->bdev->bd_dev);
|
||||
block_ctx_out->dev_bytenr = multi->stripes[0].physical;
|
||||
block_ctx_out->start = bytenr;
|
||||
block_ctx_out->len = len;
|
||||
|
Loading…
Reference in New Issue
Block a user