@@ -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
12411251static 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
15041539static 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