if (IS_ERR(rbio)) {
btrfs_put_bioc(bioc);
ret = PTR_ERR(rbio);
- goto out;
+ goto out_dec_counter;
}
rbio->operation = BTRFS_RBIO_WRITE;
rbio_add_bio(rbio, bio);
- btrfs_bio_counter_inc_noblocked(fs_info);
rbio->generic_bio_cnt = 1;
/*
out_dec_counter:
btrfs_bio_counter_dec(fs_info);
-out:
bio->bi_status = errno_to_blk_status(ret);
bio_endio(bio);
}
if (generic_io) {
ASSERT(bioc->mirror_num == mirror_num);
btrfs_bio(bio)->mirror_num = mirror_num;
+ } else {
+ btrfs_get_bioc(bioc);
}
rbio = alloc_rbio(fs_info, bioc);
goto out_end_bio;
}
- if (generic_io) {
- btrfs_bio_counter_inc_noblocked(fs_info);
+ if (generic_io)
rbio->generic_bio_cnt = 1;
- } else {
- btrfs_get_bioc(bioc);
- }
/*
* Loop retry:
return;
out_end_bio:
- if (generic_io)
- btrfs_put_bioc(bioc);
+ btrfs_bio_counter_dec(fs_info);
+ btrfs_put_bioc(bioc);
bio_endio(bio);
}
btrfs_bio_counter_inc_blocked(fs_info);
ret = __btrfs_map_block(fs_info, btrfs_op(bio), logical,
&map_length, &bioc, mirror_num, 1);
- if (ret)
- goto out_dec;
+ if (ret) {
+ btrfs_bio_counter_dec(fs_info);
+ bio->bi_status = errno_to_blk_status(ret);
+ bio_endio(bio);
+ return;
+ }
total_devs = bioc->num_stripes;
bioc->orig_bio = bio;
raid56_parity_write(bio, bioc);
else
raid56_parity_recover(bio, bioc, mirror_num, true);
- goto out_dec;
+ return;
}
if (map_length < length) {
submit_stripe_bio(bioc, bio, dev_nr, should_clone);
}
-out_dec:
btrfs_bio_counter_dec(fs_info);
- if (ret) {
- bio->bi_status = errno_to_blk_status(ret);
- bio_endio(bio);
- }
}
static bool dev_args_match_fs_devices(const struct btrfs_dev_lookup_args *args,