|
@@ -2290,12 +2290,18 @@ static void recovery_request_write(struct mddev *mddev, struct r10bio *r10_bio)
|
|
|
d = r10_bio->devs[1].devnum;
|
|
|
wbio = r10_bio->devs[1].bio;
|
|
|
wbio2 = r10_bio->devs[1].repl_bio;
|
|
|
+ /* Need to test wbio2->bi_end_io before we call
|
|
|
+ * generic_make_request as if the former is NULL,
|
|
|
+ * the latter is free to free wbio2.
|
|
|
+ */
|
|
|
+ if (wbio2 && !wbio2->bi_end_io)
|
|
|
+ wbio2 = NULL;
|
|
|
if (wbio->bi_end_io) {
|
|
|
atomic_inc(&conf->mirrors[d].rdev->nr_pending);
|
|
|
md_sync_acct(conf->mirrors[d].rdev->bdev, bio_sectors(wbio));
|
|
|
generic_make_request(wbio);
|
|
|
}
|
|
|
- if (wbio2 && wbio2->bi_end_io) {
|
|
|
+ if (wbio2) {
|
|
|
atomic_inc(&conf->mirrors[d].replacement->nr_pending);
|
|
|
md_sync_acct(conf->mirrors[d].replacement->bdev,
|
|
|
bio_sectors(wbio2));
|