summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/md/raid10.c42
1 files changed, 13 insertions, 29 deletions
diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c
index cac5c6df75bb..8996fa0dff60 100644
--- a/drivers/md/raid10.c
+++ b/drivers/md/raid10.c
@@ -1156,7 +1156,6 @@ static void raid10_read_request(struct mddev *mddev, struct bio *bio,
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) {
/*
@@ -1205,19 +1204,15 @@ static void raid10_read_request(struct mddev *mddev, struct bio *bio,
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;
}
@@ -1245,8 +1240,6 @@ static void raid10_read_request(struct mddev *mddev, struct bio *bio,
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);
}
@@ -1355,7 +1348,6 @@ static void raid10_write_request(struct mddev *mddev, struct bio *bio,
int i, k;
sector_t sectors;
int max_sectors;
- int error;
if ((mddev_is_clustered(mddev) &&
mddev->cluster_ops->area_resyncing(mddev, WRITE,
@@ -1469,10 +1461,8 @@ static void raid10_write_request(struct mddev *mddev, struct bio *bio,
* 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)
@@ -1493,19 +1483,15 @@ static void raid10_write_request(struct mddev *mddev, struct bio *bio,
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;
}
@@ -1537,8 +1523,6 @@ err_handle:
}
}
- bio->bi_status = errno_to_blk_status(error);
- set_bit(R10BIO_Uptodate, &r10_bio->state);
raid_end_bio_io(r10_bio);
}