diff options
| -rw-r--r-- | drivers/md/raid1.c | 19 |
1 files changed, 10 insertions, 9 deletions
diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index db536a68b2ee..29e2df5cd77b 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c | |||
| @@ -2297,17 +2297,23 @@ static void handle_read_error(struct r1conf *conf, struct r1bio *r1_bio) | |||
| 2297 | * This is all done synchronously while the array is | 2297 | * This is all done synchronously while the array is |
| 2298 | * frozen | 2298 | * frozen |
| 2299 | */ | 2299 | */ |
| 2300 | |||
| 2301 | bio = r1_bio->bios[r1_bio->read_disk]; | ||
| 2302 | bdevname(bio->bi_bdev, b); | ||
| 2303 | bio_put(bio); | ||
| 2304 | r1_bio->bios[r1_bio->read_disk] = NULL; | ||
| 2305 | |||
| 2300 | if (mddev->ro == 0) { | 2306 | if (mddev->ro == 0) { |
| 2301 | freeze_array(conf, 1); | 2307 | freeze_array(conf, 1); |
| 2302 | fix_read_error(conf, r1_bio->read_disk, | 2308 | fix_read_error(conf, r1_bio->read_disk, |
| 2303 | r1_bio->sector, r1_bio->sectors); | 2309 | r1_bio->sector, r1_bio->sectors); |
| 2304 | unfreeze_array(conf); | 2310 | unfreeze_array(conf); |
| 2305 | } else | 2311 | } else { |
| 2306 | md_error(mddev, conf->mirrors[r1_bio->read_disk].rdev); | 2312 | r1_bio->bios[r1_bio->read_disk] = IO_BLOCKED; |
| 2313 | } | ||
| 2314 | |||
| 2307 | rdev_dec_pending(conf->mirrors[r1_bio->read_disk].rdev, conf->mddev); | 2315 | rdev_dec_pending(conf->mirrors[r1_bio->read_disk].rdev, conf->mddev); |
| 2308 | 2316 | ||
| 2309 | bio = r1_bio->bios[r1_bio->read_disk]; | ||
| 2310 | bdevname(bio->bi_bdev, b); | ||
| 2311 | read_more: | 2317 | read_more: |
| 2312 | disk = read_balance(conf, r1_bio, &max_sectors); | 2318 | disk = read_balance(conf, r1_bio, &max_sectors); |
| 2313 | if (disk == -1) { | 2319 | if (disk == -1) { |
| @@ -2318,11 +2324,6 @@ read_more: | |||
| 2318 | } else { | 2324 | } else { |
| 2319 | const unsigned long do_sync | 2325 | const unsigned long do_sync |
| 2320 | = r1_bio->master_bio->bi_opf & REQ_SYNC; | 2326 | = r1_bio->master_bio->bi_opf & REQ_SYNC; |
| 2321 | if (bio) { | ||
| 2322 | r1_bio->bios[r1_bio->read_disk] = | ||
| 2323 | mddev->ro ? IO_BLOCKED : NULL; | ||
| 2324 | bio_put(bio); | ||
| 2325 | } | ||
| 2326 | r1_bio->read_disk = disk; | 2327 | r1_bio->read_disk = disk; |
| 2327 | bio = bio_clone_mddev(r1_bio->master_bio, GFP_NOIO, mddev); | 2328 | bio = bio_clone_mddev(r1_bio->master_bio, GFP_NOIO, mddev); |
| 2328 | bio_trim(bio, r1_bio->sector - bio->bi_iter.bi_sector, | 2329 | bio_trim(bio, r1_bio->sector - bio->bi_iter.bi_sector, |
