Skip to content

Commit 4cf58d9

Browse files
johnpgarryaxboe
authored andcommitted
md/raid10: Handle bio_split() errors
Add proper bio_split() error handling. For any error, call raid_end_bio_io() and return. Except for discard, where we end the bio directly. Reviewed-by: Yu Kuai <[email protected]> Reviewed-by: Hannes Reinecke <[email protected]> Signed-off-by: John Garry <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Jens Axboe <[email protected]>
1 parent b1a7ad8 commit 4cf58d9

File tree

1 file changed

+46
-1
lines changed

1 file changed

+46
-1
lines changed

drivers/md/raid10.c

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1159,6 +1159,7 @@ static void raid10_read_request(struct mddev *mddev, struct bio *bio,
11591159
int slot = r10_bio->read_slot;
11601160
struct md_rdev *err_rdev = NULL;
11611161
gfp_t gfp = GFP_NOIO;
1162+
int error;
11621163

11631164
if (slot >= 0 && r10_bio->devs[slot].rdev) {
11641165
/*
@@ -1206,6 +1207,10 @@ static void raid10_read_request(struct mddev *mddev, struct bio *bio,
12061207
if (max_sectors < bio_sectors(bio)) {
12071208
struct bio *split = bio_split(bio, max_sectors,
12081209
gfp, &conf->bio_split);
1210+
if (IS_ERR(split)) {
1211+
error = PTR_ERR(split);
1212+
goto err_handle;
1213+
}
12091214
bio_chain(split, bio);
12101215
allow_barrier(conf);
12111216
submit_bio_noacct(bio);
@@ -1236,6 +1241,11 @@ static void raid10_read_request(struct mddev *mddev, struct bio *bio,
12361241
mddev_trace_remap(mddev, read_bio, r10_bio->sector);
12371242
submit_bio_noacct(read_bio);
12381243
return;
1244+
err_handle:
1245+
atomic_dec(&rdev->nr_pending);
1246+
bio->bi_status = errno_to_blk_status(error);
1247+
set_bit(R10BIO_Uptodate, &r10_bio->state);
1248+
raid_end_bio_io(r10_bio);
12391249
}
12401250

12411251
static void raid10_write_one_disk(struct mddev *mddev, struct r10bio *r10_bio,
@@ -1343,9 +1353,10 @@ static void raid10_write_request(struct mddev *mddev, struct bio *bio,
13431353
struct r10bio *r10_bio)
13441354
{
13451355
struct r10conf *conf = mddev->private;
1346-
int i;
1356+
int i, k;
13471357
sector_t sectors;
13481358
int max_sectors;
1359+
int error;
13491360

13501361
if ((mddev_is_clustered(mddev) &&
13511362
md_cluster_ops->area_resyncing(mddev, WRITE,
@@ -1478,6 +1489,10 @@ static void raid10_write_request(struct mddev *mddev, struct bio *bio,
14781489
if (r10_bio->sectors < bio_sectors(bio)) {
14791490
struct bio *split = bio_split(bio, r10_bio->sectors,
14801491
GFP_NOIO, &conf->bio_split);
1492+
if (IS_ERR(split)) {
1493+
error = PTR_ERR(split);
1494+
goto err_handle;
1495+
}
14811496
bio_chain(split, bio);
14821497
allow_barrier(conf);
14831498
submit_bio_noacct(bio);
@@ -1499,6 +1514,26 @@ static void raid10_write_request(struct mddev *mddev, struct bio *bio,
14991514
raid10_write_one_disk(mddev, r10_bio, bio, true, i);
15001515
}
15011516
one_write_done(r10_bio);
1517+
return;
1518+
err_handle:
1519+
for (k = 0; k < i; k++) {
1520+
int d = r10_bio->devs[k].devnum;
1521+
struct md_rdev *rdev = conf->mirrors[d].rdev;
1522+
struct md_rdev *rrdev = conf->mirrors[d].replacement;
1523+
1524+
if (r10_bio->devs[k].bio) {
1525+
rdev_dec_pending(rdev, mddev);
1526+
r10_bio->devs[k].bio = NULL;
1527+
}
1528+
if (r10_bio->devs[k].repl_bio) {
1529+
rdev_dec_pending(rrdev, mddev);
1530+
r10_bio->devs[k].repl_bio = NULL;
1531+
}
1532+
}
1533+
1534+
bio->bi_status = errno_to_blk_status(error);
1535+
set_bit(R10BIO_Uptodate, &r10_bio->state);
1536+
raid_end_bio_io(r10_bio);
15021537
}
15031538

15041539
static void __make_request(struct mddev *mddev, struct bio *bio, int sectors)
@@ -1640,6 +1675,11 @@ static int raid10_handle_discard(struct mddev *mddev, struct bio *bio)
16401675
if (remainder) {
16411676
split_size = stripe_size - remainder;
16421677
split = bio_split(bio, split_size, GFP_NOIO, &conf->bio_split);
1678+
if (IS_ERR(split)) {
1679+
bio->bi_status = errno_to_blk_status(PTR_ERR(split));
1680+
bio_endio(bio);
1681+
return 0;
1682+
}
16431683
bio_chain(split, bio);
16441684
allow_barrier(conf);
16451685
/* Resend the fist split part */
@@ -1650,6 +1690,11 @@ static int raid10_handle_discard(struct mddev *mddev, struct bio *bio)
16501690
if (remainder) {
16511691
split_size = bio_sectors(bio) - remainder;
16521692
split = bio_split(bio, split_size, GFP_NOIO, &conf->bio_split);
1693+
if (IS_ERR(split)) {
1694+
bio->bi_status = errno_to_blk_status(PTR_ERR(split));
1695+
bio_endio(bio);
1696+
return 0;
1697+
}
16531698
bio_chain(split, bio);
16541699
allow_barrier(conf);
16551700
/* Resend the second split part */

0 commit comments

Comments
 (0)