[Devel] [PATCH RH8 03/14] dm-qcow2: Remap qio before submitting
Kirill Tkhai
ktkhai at virtuozzo.com
Tue Jul 27 11:28:57 MSK 2021
Write related file sector to bi_sector before call_rw_iter().
This allows to resubmit partially completed IO in next patches.
Signed-off-by: Kirill Tkhai <ktkhai at virtuozzo.com>
---
drivers/md/dm-qcow2-map.c | 16 ++++++++++++----
drivers/md/dm-qcow2.h | 5 +++++
2 files changed, 17 insertions(+), 4 deletions(-)
diff --git a/drivers/md/dm-qcow2-map.c b/drivers/md/dm-qcow2-map.c
index 01f280848de0..e142556dfbe6 100644
--- a/drivers/md/dm-qcow2-map.c
+++ b/drivers/md/dm-qcow2-map.c
@@ -2716,7 +2716,7 @@ static void data_rw_complete(struct qio *qio)
complete_wbd(qcow2, wbd);
}
-static void submit_rw_mapped(struct qcow2 *qcow2, loff_t clu_pos, struct qio *qio)
+static void submit_rw_mapped(struct qcow2 *qcow2, struct qio *qio)
{
unsigned int rw, nr_segs;
struct bio_vec *bvec;
@@ -2726,14 +2726,22 @@ static void submit_rw_mapped(struct qcow2 *qcow2, loff_t clu_pos, struct qio *qi
rw = (op_is_write(qio->bi_op) ? WRITE : READ);
nr_segs = qio_nr_segs(qio);
bvec = __bvec_iter_bvec(qio->bi_io_vec, qio->bi_iter);
+ pos = to_bytes(qio->bi_iter.bi_sector);
iov_iter_bvec(&iter, rw, bvec, nr_segs, qio->bi_iter.bi_size);
iter.iov_offset = qio->bi_iter.bi_bvec_done;
- pos = clu_pos + bytes_off_in_cluster(qcow2, qio);
call_rw_iter(qcow2->file, pos, rw, &iter, qio);
}
+static void map_and_submit_rw(struct qcow2 *qcow2, loff_t clu_pos, struct qio *qio)
+{
+ WARN_ON_ONCE(qio->qcow2 != qcow2);
+ remap_to_clu(qcow2, qio, clu_pos);
+
+ submit_rw_mapped(qcow2, qio);
+}
+
static void perform_rw_mapped(struct qcow2_map *map, struct qio *qio)
{
struct qcow2 *qcow2 = map->qcow2;
@@ -2765,7 +2773,7 @@ static void perform_rw_mapped(struct qcow2_map *map, struct qio *qio)
spin_unlock_irqrestore(&qcow2->md_pages_lock, flags);
}
- submit_rw_mapped(qcow2, map->data_clu_pos, qio);
+ map_and_submit_rw(qcow2, map->data_clu_pos, qio);
}
static void cow_read_complete(struct qio *qio)
@@ -3685,7 +3693,7 @@ static void submit_sliced_cow_data_write(struct qcow2 *qcow2, struct qio *qio, l
while ((write_qio = qio_list_pop(&list)) != NULL) {
write_qio->complete = data_rw_complete;
write_qio->data = NULL;
- submit_rw_mapped(qcow2, clu_pos, write_qio);
+ map_and_submit_rw(qcow2, clu_pos, write_qio);
}
}
diff --git a/drivers/md/dm-qcow2.h b/drivers/md/dm-qcow2.h
index 817a39356018..58c6fe48fef0 100644
--- a/drivers/md/dm-qcow2.h
+++ b/drivers/md/dm-qcow2.h
@@ -357,4 +357,9 @@ static inline bool qcow2_wants_check(struct qcow2_target *tgt)
return !!(tgt->md_writeback_error|tgt->truncate_error);
}
+static inline void remap_to_clu(struct qcow2 *qcow2, struct qio *qio, loff_t clu_pos)
+{
+ qio->bi_iter.bi_sector &= (to_sector(qcow2->clu_size) - 1);
+ qio->bi_iter.bi_sector |= (to_sector(clu_pos));
+}
#endif
More information about the Devel
mailing list