btrfs: Check for missing device before bio submission in btrfs_map_bio
Before btrfs_map_bio submits all stripe bios it does a number of checks to ensure the device for every stripe is present. However, it doesn't do a DEV_STATE_MISSING check, instead this is relegated to the lower level btrfs_schedule_bio (in the async submission case, sync submission doesn't check DEV_STATE_MISSING at all). Additionally btrfs_schedule_bios does the duplicate device->bdev check which has already been performed in btrfs_map_bio. This patch moves the DEV_STATE_MISSING check in btrfs_map_bio and removes the duplicate device->bdev check. Doing so ensures that no bio cloning/submission happens for both async/sync requests in the face of missing device. This makes the async io submission path slightly shorter in terms of instruction count. No functional changes. Reviewed-by: Josef Bacik <josef@toxicpanda.com> Reviewed-by: Anand Jain <anand.jain@oracle.com> Signed-off-by: Nikolay Borisov <nborisov@suse.com> Reviewed-by: David Sterba <dsterba@suse.com> Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
parent
ab457246f8
commit
fc8a168aa9
|
@ -6109,12 +6109,6 @@ static noinline void btrfs_schedule_bio(struct btrfs_device *device,
|
||||||
int should_queue = 1;
|
int should_queue = 1;
|
||||||
struct btrfs_pending_bios *pending_bios;
|
struct btrfs_pending_bios *pending_bios;
|
||||||
|
|
||||||
if (test_bit(BTRFS_DEV_STATE_MISSING, &device->dev_state) ||
|
|
||||||
!device->bdev) {
|
|
||||||
bio_io_error(bio);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* don't bother with additional async steps for reads, right now */
|
/* don't bother with additional async steps for reads, right now */
|
||||||
if (bio_op(bio) == REQ_OP_READ) {
|
if (bio_op(bio) == REQ_OP_READ) {
|
||||||
btrfsic_submit_bio(bio);
|
btrfsic_submit_bio(bio);
|
||||||
|
@ -6243,7 +6237,8 @@ blk_status_t btrfs_map_bio(struct btrfs_fs_info *fs_info, struct bio *bio,
|
||||||
|
|
||||||
for (dev_nr = 0; dev_nr < total_devs; dev_nr++) {
|
for (dev_nr = 0; dev_nr < total_devs; dev_nr++) {
|
||||||
dev = bbio->stripes[dev_nr].dev;
|
dev = bbio->stripes[dev_nr].dev;
|
||||||
if (!dev || !dev->bdev ||
|
if (!dev || !dev->bdev || test_bit(BTRFS_DEV_STATE_MISSING,
|
||||||
|
&dev->dev_state) ||
|
||||||
(bio_op(first_bio) == REQ_OP_WRITE &&
|
(bio_op(first_bio) == REQ_OP_WRITE &&
|
||||||
!test_bit(BTRFS_DEV_STATE_WRITEABLE, &dev->dev_state))) {
|
!test_bit(BTRFS_DEV_STATE_WRITEABLE, &dev->dev_state))) {
|
||||||
bbio_error(bbio, first_bio, logical);
|
bbio_error(bbio, first_bio, logical);
|
||||||
|
|
Loading…
Reference in New Issue