diff options
Diffstat (limited to 'drivers/md/raid10.c')
| -rw-r--r-- | drivers/md/raid10.c | 31 | 
1 files changed, 9 insertions, 22 deletions
diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c index 434586d4311..e32e8b1042f 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c @@ -2077,13 +2077,10 @@ static void sync_request_write(struct mddev *mddev, struct r10bio *r10_bio)  		 * First we need to fixup bv_offset, bv_len and  		 * bi_vecs, as the read request might have corrupted these  		 */ +		bio_reset(tbio); +  		tbio->bi_vcnt = vcnt;  		tbio->bi_size = r10_bio->sectors << 9; -		tbio->bi_idx = 0; -		tbio->bi_phys_segments = 0; -		tbio->bi_flags &= ~(BIO_POOL_MASK - 1); -		tbio->bi_flags |= 1 << BIO_UPTODATE; -		tbio->bi_next = NULL;  		tbio->bi_rw = WRITE;  		tbio->bi_private = r10_bio;  		tbio->bi_sector = r10_bio->devs[i].addr; @@ -3090,6 +3087,7 @@ static sector_t sync_request(struct mddev *mddev, sector_t sector_nr,  					}  				}  				bio = r10_bio->devs[0].bio; +				bio_reset(bio);  				bio->bi_next = biolist;  				biolist = bio;  				bio->bi_private = r10_bio; @@ -3114,6 +3112,7 @@ static sector_t sync_request(struct mddev *mddev, sector_t sector_nr,  				rdev = mirror->rdev;  				if (!test_bit(In_sync, &rdev->flags)) {  					bio = r10_bio->devs[1].bio; +					bio_reset(bio);  					bio->bi_next = biolist;  					biolist = bio;  					bio->bi_private = r10_bio; @@ -3142,6 +3141,7 @@ static sector_t sync_request(struct mddev *mddev, sector_t sector_nr,  				if (rdev == NULL || bio == NULL ||  				    test_bit(Faulty, &rdev->flags))  					break; +				bio_reset(bio);  				bio->bi_next = biolist;  				biolist = bio;  				bio->bi_private = r10_bio; @@ -3240,7 +3240,7 @@ static sector_t sync_request(struct mddev *mddev, sector_t sector_nr,  				r10_bio->devs[i].repl_bio->bi_end_io = NULL;  			bio = r10_bio->devs[i].bio; -			bio->bi_end_io = NULL; +			bio_reset(bio);  			clear_bit(BIO_UPTODATE, &bio->bi_flags);  			if (conf->mirrors[d].rdev == NULL ||  			    test_bit(Faulty, &conf->mirrors[d].rdev->flags)) @@ -3277,6 +3277,7 @@ static sector_t sync_request(struct mddev *mddev, sector_t sector_nr,  			/* Need to set up for writing to the replacement */  			bio = r10_bio->devs[i].repl_bio; +			bio_reset(bio);  			clear_bit(BIO_UPTODATE, &bio->bi_flags);  			sector = r10_bio->devs[i].addr; @@ -3310,17 +3311,6 @@ static sector_t sync_request(struct mddev *mddev, sector_t sector_nr,  		}  	} -	for (bio = biolist; bio ; bio=bio->bi_next) { - -		bio->bi_flags &= ~(BIO_POOL_MASK - 1); -		if (bio->bi_end_io) -			bio->bi_flags |= 1 << BIO_UPTODATE; -		bio->bi_vcnt = 0; -		bio->bi_idx = 0; -		bio->bi_phys_segments = 0; -		bio->bi_size = 0; -	} -  	nr_sectors = 0;  	if (sector_nr + max_sync < max_sector)  		max_sector = sector_nr + max_sync; @@ -4390,17 +4380,14 @@ read_more:  		}  		if (!rdev2 || test_bit(Faulty, &rdev2->flags))  			continue; + +		bio_reset(b);  		b->bi_bdev = rdev2->bdev;  		b->bi_sector = r10_bio->devs[s/2].addr + rdev2->new_data_offset;  		b->bi_private = r10_bio;  		b->bi_end_io = end_reshape_write;  		b->bi_rw = WRITE; -		b->bi_flags &= ~(BIO_POOL_MASK - 1); -		b->bi_flags |= 1 << BIO_UPTODATE;  		b->bi_next = blist; -		b->bi_vcnt = 0; -		b->bi_idx = 0; -		b->bi_size = 0;  		blist = b;  	}  |