diff options
Diffstat (limited to 'drivers/md/dm-raid1.c')
| -rw-r--r-- | drivers/md/dm-raid1.c | 23 | 
1 files changed, 13 insertions, 10 deletions
diff --git a/drivers/md/dm-raid1.c b/drivers/md/dm-raid1.c index 9584443c561..7dfdb5c746d 100644 --- a/drivers/md/dm-raid1.c +++ b/drivers/md/dm-raid1.c @@ -432,7 +432,7 @@ static int mirror_available(struct mirror_set *ms, struct bio *bio)  	region_t region = dm_rh_bio_to_region(ms->rh, bio);  	if (log->type->in_sync(log, region, 0)) -		return choose_mirror(ms,  bio->bi_sector) ? 1 : 0; +		return choose_mirror(ms,  bio->bi_iter.bi_sector) ? 1 : 0;  	return 0;  } @@ -442,15 +442,15 @@ static int mirror_available(struct mirror_set *ms, struct bio *bio)   */  static sector_t map_sector(struct mirror *m, struct bio *bio)  { -	if (unlikely(!bio->bi_size)) +	if (unlikely(!bio->bi_iter.bi_size))  		return 0; -	return m->offset + dm_target_offset(m->ms->ti, bio->bi_sector); +	return m->offset + dm_target_offset(m->ms->ti, bio->bi_iter.bi_sector);  }  static void map_bio(struct mirror *m, struct bio *bio)  {  	bio->bi_bdev = m->dev->bdev; -	bio->bi_sector = map_sector(m, bio); +	bio->bi_iter.bi_sector = map_sector(m, bio);  }  static void map_region(struct dm_io_region *io, struct mirror *m, @@ -526,8 +526,8 @@ static void read_async_bio(struct mirror *m, struct bio *bio)  	struct dm_io_region io;  	struct dm_io_request io_req = {  		.bi_rw = READ, -		.mem.type = DM_IO_BVEC, -		.mem.ptr.bvec = bio->bi_io_vec + bio->bi_idx, +		.mem.type = DM_IO_BIO, +		.mem.ptr.bio = bio,  		.notify.fn = read_callback,  		.notify.context = bio,  		.client = m->ms->io_client, @@ -559,7 +559,7 @@ static void do_reads(struct mirror_set *ms, struct bio_list *reads)  		 * We can only read balance if the region is in sync.  		 */  		if (likely(region_in_sync(ms, region, 1))) -			m = choose_mirror(ms, bio->bi_sector); +			m = choose_mirror(ms, bio->bi_iter.bi_sector);  		else if (m && atomic_read(&m->error_count))  			m = NULL; @@ -629,8 +629,8 @@ static void do_write(struct mirror_set *ms, struct bio *bio)  	struct mirror *m;  	struct dm_io_request io_req = {  		.bi_rw = WRITE | (bio->bi_rw & WRITE_FLUSH_FUA), -		.mem.type = DM_IO_BVEC, -		.mem.ptr.bvec = bio->bi_io_vec + bio->bi_idx, +		.mem.type = DM_IO_BIO, +		.mem.ptr.bio = bio,  		.notify.fn = write_callback,  		.notify.context = bio,  		.client = ms->io_client, @@ -1181,7 +1181,7 @@ static int mirror_map(struct dm_target *ti, struct bio *bio)  	 * The region is in-sync and we can perform reads directly.  	 * Store enough information so we can retry if it fails.  	 */ -	m = choose_mirror(ms, bio->bi_sector); +	m = choose_mirror(ms, bio->bi_iter.bi_sector);  	if (unlikely(!m))  		return -EIO; @@ -1244,6 +1244,9 @@ static int mirror_end_io(struct dm_target *ti, struct bio *bio, int error)  			dm_bio_restore(bd, bio);  			bio_record->details.bi_bdev = NULL; + +			atomic_inc(&bio->bi_remaining); +  			queue_bio(ms, bio, rw);  			return DM_ENDIO_INCOMPLETE;  		}  | 
