int slot = r10_bio->read_slot;
struct md_rdev *err_rdev = NULL;
gfp_t gfp = GFP_NOIO;
- int error;
if (slot >= 0 && r10_bio->devs[slot].rdev) {
/*
rdev->bdev,
(unsigned long long)r10_bio->sector);
if (max_sectors < bio_sectors(bio)) {
- struct bio *split = bio_split(bio, max_sectors,
- gfp, &conf->bio_split);
- if (IS_ERR(split)) {
- error = PTR_ERR(split);
+ allow_barrier(conf);
+ bio = bio_submit_split_bioset(bio, max_sectors,
+ &conf->bio_split);
+ wait_barrier(conf, false);
+ if (!bio) {
+ set_bit(R10BIO_Returned, &r10_bio->state);
goto err_handle;
}
- bio_chain(split, bio);
- trace_block_split(split, bio->bi_iter.bi_sector);
- allow_barrier(conf);
- submit_bio_noacct(bio);
- wait_barrier(conf, false);
- bio = split;
r10_bio->master_bio = bio;
r10_bio->sectors = max_sectors;
}
return;
err_handle:
atomic_dec(&rdev->nr_pending);
- bio->bi_status = errno_to_blk_status(error);
- set_bit(R10BIO_Uptodate, &r10_bio->state);
raid_end_bio_io(r10_bio);
}
int i, k;
sector_t sectors;
int max_sectors;
- int error;
if ((mddev_is_clustered(mddev) &&
mddev->cluster_ops->area_resyncing(mddev, WRITE,
* complexity of supporting that is not worth
* the benefit.
*/
- if (bio->bi_opf & REQ_ATOMIC) {
- error = -EIO;
+ if (bio->bi_opf & REQ_ATOMIC)
goto err_handle;
- }
good_sectors = first_bad - dev_sector;
if (good_sectors < max_sectors)
r10_bio->sectors = max_sectors;
if (r10_bio->sectors < bio_sectors(bio)) {
- struct bio *split = bio_split(bio, r10_bio->sectors,
- GFP_NOIO, &conf->bio_split);
- if (IS_ERR(split)) {
- error = PTR_ERR(split);
+ allow_barrier(conf);
+ bio = bio_submit_split_bioset(bio, r10_bio->sectors,
+ &conf->bio_split);
+ wait_barrier(conf, false);
+ if (!bio) {
+ set_bit(R10BIO_Returned, &r10_bio->state);
goto err_handle;
}
- bio_chain(split, bio);
- trace_block_split(split, bio->bi_iter.bi_sector);
- allow_barrier(conf);
- submit_bio_noacct(bio);
- wait_barrier(conf, false);
- bio = split;
r10_bio->master_bio = bio;
}
}
}
- bio->bi_status = errno_to_blk_status(error);
- set_bit(R10BIO_Uptodate, &r10_bio->state);
raid_end_bio_io(r10_bio);
}