diff options
Diffstat (limited to 'drivers/md/raid1.c')
| -rw-r--r-- | drivers/md/raid1.c | 13 | 
1 files changed, 6 insertions, 7 deletions
| diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index 19598bd38939..7dc8026cf6ee 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c @@ -1496,7 +1496,7 @@ static void raid1_write_request(struct mddev *mddev, struct bio *bio,  		if (!r1_bio->bios[i])  			continue; -		if (first_clone) { +		if (first_clone && test_bit(WriteMostly, &rdev->flags)) {  			/* do behind I/O ?  			 * Not if there are too many, or cannot  			 * allocate memory, or a reader on WriteMostly @@ -1529,13 +1529,12 @@ static void raid1_write_request(struct mddev *mddev, struct bio *bio,  		r1_bio->bios[i] = mbio; -		mbio->bi_iter.bi_sector	= (r1_bio->sector + -				   conf->mirrors[i].rdev->data_offset); -		bio_set_dev(mbio, conf->mirrors[i].rdev->bdev); +		mbio->bi_iter.bi_sector	= (r1_bio->sector + rdev->data_offset); +		bio_set_dev(mbio, rdev->bdev);  		mbio->bi_end_io	= raid1_end_write_request;  		mbio->bi_opf = bio_op(bio) | (bio->bi_opf & (REQ_SYNC | REQ_FUA)); -		if (test_bit(FailFast, &conf->mirrors[i].rdev->flags) && -		    !test_bit(WriteMostly, &conf->mirrors[i].rdev->flags) && +		if (test_bit(FailFast, &rdev->flags) && +		    !test_bit(WriteMostly, &rdev->flags) &&  		    conf->raid_disks - mddev->degraded > 1)  			mbio->bi_opf |= MD_FAILFAST;  		mbio->bi_private = r1_bio; @@ -1546,7 +1545,7 @@ static void raid1_write_request(struct mddev *mddev, struct bio *bio,  			trace_block_bio_remap(mbio, disk_devt(mddev->gendisk),  					      r1_bio->sector);  		/* flush_pending_writes() needs access to the rdev so...*/ -		mbio->bi_bdev = (void *)conf->mirrors[i].rdev; +		mbio->bi_bdev = (void *)rdev;  		cb = blk_check_plugged(raid1_unplug, mddev, sizeof(*plug));  		if (cb) |