diff options
Diffstat (limited to 'drivers/md')
| -rw-r--r-- | drivers/md/raid10.c | 9 | 
1 files changed, 5 insertions, 4 deletions
| diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c index 1a632a8c8005..4589866257d5 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c @@ -2465,20 +2465,21 @@ static int narrow_write_error(struct r10bio *r10_bio, int i)  	while (sect_to_write) {  		struct bio *wbio; +		sector_t wsector;  		if (sectors > sect_to_write)  			sectors = sect_to_write;  		/* Write at 'sector' for 'sectors' */  		wbio = bio_clone_mddev(bio, GFP_NOIO, mddev);  		bio_trim(wbio, sector - bio->bi_iter.bi_sector, sectors); -		wbio->bi_iter.bi_sector = (r10_bio->devs[i].addr+ -				   choose_data_offset(r10_bio, rdev) + -				   (sector - r10_bio->sector)); +		wsector = r10_bio->devs[i].addr + (sector - r10_bio->sector); +		wbio->bi_iter.bi_sector = wsector + +				   choose_data_offset(r10_bio, rdev);  		wbio->bi_bdev = rdev->bdev;  		bio_set_op_attrs(wbio, REQ_OP_WRITE, 0);  		if (submit_bio_wait(wbio) < 0)  			/* Failure! */ -			ok = rdev_set_badblocks(rdev, sector, +			ok = rdev_set_badblocks(rdev, wsector,  						sectors, 0)  				&& ok; |