Similar to bio->bi_end_io but for pio

Signed-off-by: Kirill Tkhai <[email protected]>
---
 drivers/md/dm-ploop-map.c |   16 +++++++++++++---
 drivers/md/dm-ploop.h     |    6 ++++++
 2 files changed, 19 insertions(+), 3 deletions(-)

diff --git a/drivers/md/dm-ploop-map.c b/drivers/md/dm-ploop-map.c
index aebee550f7a3..fec9d16d8c0d 100644
--- a/drivers/md/dm-ploop-map.c
+++ b/drivers/md/dm-ploop-map.c
@@ -123,14 +123,22 @@ static int ploop_pio_cluster(struct ploop *ploop, struct 
pio *pio,
        return 0;
 }
 
-void pio_endio(struct pio *pio)
+static void call_bio_endio(struct pio *pio, void *data, blk_status_t bi_status)
 {
-       struct bio *bio = dm_bio_from_per_bio_data(pio, sizeof(*pio));
+       struct bio *bio = data;
 
-       bio->bi_status = pio->bi_status;
+       bio->bi_status = bi_status;
        bio_endio(bio);
 }
 
+void pio_endio(struct pio *pio)
+{
+       ploop_endio_t endio_cb = pio->endio_cb;
+       void *endio_cb_data = pio->endio_cb_data;
+
+       endio_cb(pio, endio_cb_data, pio->bi_status);
+}
+
 void defer_pios(struct ploop *ploop, struct pio *pio, struct list_head 
*pio_list)
 {
        unsigned long flags;
@@ -1632,6 +1640,8 @@ int ploop_map(struct dm_target *ti, struct bio *bio)
        pio->bi_iter = bio->bi_iter;
        pio->bi_io_vec = bio->bi_io_vec;
        pio->bi_opf = bio->bi_opf;
+       pio->endio_cb = call_bio_endio;
+       pio->endio_cb_data = bio;
 
        if (pio->bi_iter.bi_size) {
                if (ploop_pio_cluster(ploop, pio, &cluster) < 0)
diff --git a/drivers/md/dm-ploop.h b/drivers/md/dm-ploop.h
index a35770437dc6..dad0e5857a50 100644
--- a/drivers/md/dm-ploop.h
+++ b/drivers/md/dm-ploop.h
@@ -229,6 +229,9 @@ struct ploop {
        spinlock_t pb_lock;
 };
 
+struct pio;
+typedef void (*ploop_endio_t)(struct pio *, void *, blk_status_t);
+
 struct pio {
        struct list_head list;
 
@@ -241,6 +244,9 @@ struct pio {
        unsigned int            bi_opf;
        blk_status_t bi_status;
 
+       ploop_endio_t endio_cb;
+       void *endio_cb_data;
+
        unsigned int cluster;
 
 #define PLOOP_END_IO_NONE              0


_______________________________________________
Devel mailing list
[email protected]
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to