forked from Minki/linux
raid1: Refactor narrow_write_error() to not use bi_idx
More bi_idx removal. This code was just open coding bio_clone(). This could probably be further improved by using bio_advance() instead of skipping over null pages, but that'd be a larger rework. Signed-off-by: Kent Overstreet <koverstreet@google.com> CC: Jens Axboe <axboe@kernel.dk> CC: NeilBrown <neilb@suse.de>
This commit is contained in:
parent
2f6db2a707
commit
b783863f68
@ -2063,8 +2063,6 @@ static int narrow_write_error(struct r1bio *r1_bio, int i)
|
|||||||
struct mddev *mddev = r1_bio->mddev;
|
struct mddev *mddev = r1_bio->mddev;
|
||||||
struct r1conf *conf = mddev->private;
|
struct r1conf *conf = mddev->private;
|
||||||
struct md_rdev *rdev = conf->mirrors[i].rdev;
|
struct md_rdev *rdev = conf->mirrors[i].rdev;
|
||||||
int vcnt, idx;
|
|
||||||
struct bio_vec *vec;
|
|
||||||
|
|
||||||
/* bio has the data to be written to device 'i' where
|
/* bio has the data to be written to device 'i' where
|
||||||
* we just recently had a write error.
|
* we just recently had a write error.
|
||||||
@ -2092,30 +2090,32 @@ static int narrow_write_error(struct r1bio *r1_bio, int i)
|
|||||||
& ~(sector_t)(block_sectors - 1))
|
& ~(sector_t)(block_sectors - 1))
|
||||||
- sector;
|
- sector;
|
||||||
|
|
||||||
if (test_bit(R1BIO_BehindIO, &r1_bio->state)) {
|
|
||||||
vcnt = r1_bio->behind_page_count;
|
|
||||||
vec = r1_bio->behind_bvecs;
|
|
||||||
idx = 0;
|
|
||||||
while (vec[idx].bv_page == NULL)
|
|
||||||
idx++;
|
|
||||||
} else {
|
|
||||||
vcnt = r1_bio->master_bio->bi_vcnt;
|
|
||||||
vec = r1_bio->master_bio->bi_io_vec;
|
|
||||||
idx = r1_bio->master_bio->bi_idx;
|
|
||||||
}
|
|
||||||
while (sect_to_write) {
|
while (sect_to_write) {
|
||||||
struct bio *wbio;
|
struct bio *wbio;
|
||||||
if (sectors > sect_to_write)
|
if (sectors > sect_to_write)
|
||||||
sectors = sect_to_write;
|
sectors = sect_to_write;
|
||||||
/* Write at 'sector' for 'sectors'*/
|
/* Write at 'sector' for 'sectors'*/
|
||||||
|
|
||||||
wbio = bio_alloc_mddev(GFP_NOIO, vcnt, mddev);
|
if (test_bit(R1BIO_BehindIO, &r1_bio->state)) {
|
||||||
memcpy(wbio->bi_io_vec, vec, vcnt * sizeof(struct bio_vec));
|
unsigned vcnt = r1_bio->behind_page_count;
|
||||||
wbio->bi_sector = r1_bio->sector;
|
struct bio_vec *vec = r1_bio->behind_bvecs;
|
||||||
|
|
||||||
|
while (!vec->bv_page) {
|
||||||
|
vec++;
|
||||||
|
vcnt--;
|
||||||
|
}
|
||||||
|
|
||||||
|
wbio = bio_alloc_mddev(GFP_NOIO, vcnt, mddev);
|
||||||
|
memcpy(wbio->bi_io_vec, vec, vcnt * sizeof(struct bio_vec));
|
||||||
|
|
||||||
|
wbio->bi_vcnt = vcnt;
|
||||||
|
} else {
|
||||||
|
wbio = bio_clone_mddev(r1_bio->master_bio, GFP_NOIO, mddev);
|
||||||
|
}
|
||||||
|
|
||||||
wbio->bi_rw = WRITE;
|
wbio->bi_rw = WRITE;
|
||||||
wbio->bi_vcnt = vcnt;
|
wbio->bi_sector = r1_bio->sector;
|
||||||
wbio->bi_size = r1_bio->sectors << 9;
|
wbio->bi_size = r1_bio->sectors << 9;
|
||||||
wbio->bi_idx = idx;
|
|
||||||
|
|
||||||
md_trim_bio(wbio, sector - r1_bio->sector, sectors);
|
md_trim_bio(wbio, sector - r1_bio->sector, sectors);
|
||||||
wbio->bi_sector += rdev->data_offset;
|
wbio->bi_sector += rdev->data_offset;
|
||||||
|
Loading…
Reference in New Issue
Block a user