forked from luck/tmp_suning_uos_patched
dm raid1: dont use map_context
Don't use map_info any more in dm-raid1. map_info was used for writes to hold the region number. For this purpose we add a new field dm_bio_details to dm_raid1_bio_record. map_info was used for reads to hold a pointer to dm_raid1_bio_record (if the pointer was non-NULL, bio details were saved; if the pointer was NULL, bio details were not saved). We use dm_raid1_bio_record.details->bi_bdev for this purpose. If bi_bdev is NULL, details were not saved, if bi_bdev is non-NULL, details were saved. Signed-off-by: Mikulas Patocka <mpatocka@redhat.com> Signed-off-by: Alasdair G Kergon <agk@redhat.com>
This commit is contained in:
parent
c7cfdf5973
commit
0045d61b5b
@ -140,7 +140,9 @@ static void dispatch_bios(void *context, struct bio_list *bio_list)
|
|||||||
|
|
||||||
struct dm_raid1_bio_record {
|
struct dm_raid1_bio_record {
|
||||||
struct mirror *m;
|
struct mirror *m;
|
||||||
|
/* if details->bi_bdev == NULL, details were not saved */
|
||||||
struct dm_bio_details details;
|
struct dm_bio_details details;
|
||||||
|
region_t write_region;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1146,12 +1148,15 @@ static int mirror_map(struct dm_target *ti, struct bio *bio,
|
|||||||
int r, rw = bio_rw(bio);
|
int r, rw = bio_rw(bio);
|
||||||
struct mirror *m;
|
struct mirror *m;
|
||||||
struct mirror_set *ms = ti->private;
|
struct mirror_set *ms = ti->private;
|
||||||
struct dm_raid1_bio_record *bio_record;
|
|
||||||
struct dm_dirty_log *log = dm_rh_dirty_log(ms->rh);
|
struct dm_dirty_log *log = dm_rh_dirty_log(ms->rh);
|
||||||
|
struct dm_raid1_bio_record *bio_record =
|
||||||
|
dm_per_bio_data(bio, sizeof(struct dm_raid1_bio_record));
|
||||||
|
|
||||||
|
bio_record->details.bi_bdev = NULL;
|
||||||
|
|
||||||
if (rw == WRITE) {
|
if (rw == WRITE) {
|
||||||
/* Save region for mirror_end_io() handler */
|
/* Save region for mirror_end_io() handler */
|
||||||
map_context->ll = dm_rh_bio_to_region(ms->rh, bio);
|
bio_record->write_region = dm_rh_bio_to_region(ms->rh, bio);
|
||||||
queue_bio(ms, bio, rw);
|
queue_bio(ms, bio, rw);
|
||||||
return DM_MAPIO_SUBMITTED;
|
return DM_MAPIO_SUBMITTED;
|
||||||
}
|
}
|
||||||
@ -1179,9 +1184,7 @@ static int mirror_map(struct dm_target *ti, struct bio *bio,
|
|||||||
if (unlikely(!m))
|
if (unlikely(!m))
|
||||||
return -EIO;
|
return -EIO;
|
||||||
|
|
||||||
bio_record = dm_per_bio_data(bio, sizeof(struct dm_raid1_bio_record));
|
|
||||||
dm_bio_record(&bio_record->details, bio);
|
dm_bio_record(&bio_record->details, bio);
|
||||||
map_context->ptr = bio_record;
|
|
||||||
bio_record->m = m;
|
bio_record->m = m;
|
||||||
|
|
||||||
map_bio(m, bio);
|
map_bio(m, bio);
|
||||||
@ -1196,14 +1199,15 @@ static int mirror_end_io(struct dm_target *ti, struct bio *bio,
|
|||||||
struct mirror_set *ms = (struct mirror_set *) ti->private;
|
struct mirror_set *ms = (struct mirror_set *) ti->private;
|
||||||
struct mirror *m = NULL;
|
struct mirror *m = NULL;
|
||||||
struct dm_bio_details *bd = NULL;
|
struct dm_bio_details *bd = NULL;
|
||||||
struct dm_raid1_bio_record *bio_record = map_context->ptr;
|
struct dm_raid1_bio_record *bio_record =
|
||||||
|
dm_per_bio_data(bio, sizeof(struct dm_raid1_bio_record));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We need to dec pending if this was a write.
|
* We need to dec pending if this was a write.
|
||||||
*/
|
*/
|
||||||
if (rw == WRITE) {
|
if (rw == WRITE) {
|
||||||
if (!(bio->bi_rw & (REQ_FLUSH | REQ_DISCARD)))
|
if (!(bio->bi_rw & (REQ_FLUSH | REQ_DISCARD)))
|
||||||
dm_rh_dec(ms->rh, map_context->ll);
|
dm_rh_dec(ms->rh, bio_record->write_region);
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1214,7 +1218,7 @@ static int mirror_end_io(struct dm_target *ti, struct bio *bio,
|
|||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
if (unlikely(error)) {
|
if (unlikely(error)) {
|
||||||
if (!bio_record) {
|
if (!bio_record->details.bi_bdev) {
|
||||||
/*
|
/*
|
||||||
* There wasn't enough memory to record necessary
|
* There wasn't enough memory to record necessary
|
||||||
* information for a retry or there was no other
|
* information for a retry or there was no other
|
||||||
@ -1239,7 +1243,7 @@ static int mirror_end_io(struct dm_target *ti, struct bio *bio,
|
|||||||
bd = &bio_record->details;
|
bd = &bio_record->details;
|
||||||
|
|
||||||
dm_bio_restore(bd, bio);
|
dm_bio_restore(bd, bio);
|
||||||
map_context->ptr = NULL;
|
bio_record->details.bi_bdev = NULL;
|
||||||
queue_bio(ms, bio, rw);
|
queue_bio(ms, bio, rw);
|
||||||
return DM_ENDIO_INCOMPLETE;
|
return DM_ENDIO_INCOMPLETE;
|
||||||
}
|
}
|
||||||
@ -1247,7 +1251,7 @@ static int mirror_end_io(struct dm_target *ti, struct bio *bio,
|
|||||||
}
|
}
|
||||||
|
|
||||||
out:
|
out:
|
||||||
map_context->ptr = NULL;
|
bio_record->details.bi_bdev = NULL;
|
||||||
|
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user