|
@@ -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;
|
|
|
}
|
|
|
|