We don't have to allocate a new pio inside cow,
which just owns a lock.

Signed-off-by: Kirill Tkhai <ktk...@virtuozzo.com>
---
 drivers/md/dm-ploop-map.c |   50 +++++++++++++++++++++------------------------
 drivers/md/dm-ploop.h     |    5 +----
 2 files changed, 24 insertions(+), 31 deletions(-)

diff --git a/drivers/md/dm-ploop-map.c b/drivers/md/dm-ploop-map.c
index d4bd646ef1d9..15654d8bcf99 100644
--- a/drivers/md/dm-ploop-map.c
+++ b/drivers/md/dm-ploop-map.c
@@ -563,18 +563,31 @@ static void ploop_discard_index_pio_end(struct ploop 
*ploop, struct pio *pio)
        del_cluster_lk(ploop, pio);
 }
 
+static void queue_or_fail(struct ploop *ploop, int err, void *data)
+{
+       struct pio *pio = data;
+
+       /* FIXME: do we use BLK_STS_AGAIN? */
+       if (err && err != BLK_STS_AGAIN) {
+               pio->bi_status = errno_to_blk_status(err);
+               pio_endio(pio);
+       } else {
+               defer_pios(ploop, pio, NULL);
+       }
+}
+
 static void complete_cow(struct ploop_cow *cow, blk_status_t bi_status)
 {
        unsigned int dst_cluster = cow->dst_cluster;
        struct pio *cluster_pio = cow->cluster_pio;
        struct ploop *ploop = cow->ploop;
        unsigned long flags;
-       struct pio *aux_pio;
+       struct pio *cow_pio;
 
        WARN_ON_ONCE(!list_empty(&cluster_pio->list));
-       aux_pio = &cow->aux_pio;
+       cow_pio = cow->cow_pio;
 
-       del_cluster_lk(ploop, aux_pio);
+       del_cluster_lk(ploop, cow_pio);
 
        if (dst_cluster != BAT_ENTRY_NONE && bi_status != BLK_STS_OK) {
                read_lock_irqsave(&ploop->bat_rwlock, flags);
@@ -582,8 +595,7 @@ static void complete_cow(struct ploop_cow *cow, 
blk_status_t bi_status)
                read_unlock_irqrestore(&ploop->bat_rwlock, flags);
        }
 
-       if (cow->end_fn)
-               cow->end_fn(ploop, blk_status_to_errno(bi_status), cow->data);
+       queue_or_fail(ploop, blk_status_to_errno(bi_status), cow_pio);
 
        queue_work(ploop->wq, &ploop->worker);
        free_pio_with_pages(ploop, cow->cluster_pio);
@@ -1154,7 +1166,7 @@ static bool postpone_if_cluster_locked(struct ploop 
*ploop, struct pio *pio,
 
 static int submit_cluster_cow(struct ploop *ploop, unsigned int level,
                              unsigned int cluster, unsigned int dst_cluster,
-                             void (*end_fn)(struct ploop *, int, void *), void 
*data)
+                             struct pio *cow_pio)
 {
        struct ploop_cow *cow = NULL;
        struct pio *pio = NULL;
@@ -1172,11 +1184,9 @@ static int submit_cluster_cow(struct ploop *ploop, 
unsigned int level,
        cow->ploop = ploop;
        cow->dst_cluster = BAT_ENTRY_NONE;
        cow->cluster_pio = pio;
-       cow->end_fn = end_fn;
-       cow->data = data;
+       cow->cow_pio = cow_pio;
 
-       init_pio(ploop, REQ_OP_WRITE, &cow->aux_pio);
-       add_cluster_lk(ploop, &cow->aux_pio, cluster);
+       add_cluster_lk(ploop, cow_pio, cluster);
 
        /* Stage #0: read secondary delta full cluster */
        map_and_submit_rw(ploop, dst_cluster, pio, level);
@@ -1188,24 +1198,10 @@ static int submit_cluster_cow(struct ploop *ploop, 
unsigned int level,
        return -ENOMEM;
 }
 
-static void queue_or_fail(struct ploop *ploop, int err, void *data)
-{
-       struct pio *pio = data;
-
-       /* FIXME: do we use BLK_STS_AGAIN? */
-       if (err && err != BLK_STS_AGAIN) {
-               pio->bi_status = errno_to_blk_status(err);
-               pio_endio(pio);
-       } else {
-               defer_pios(ploop, pio, NULL);
-       }
-}
-
 static void initiate_cluster_cow(struct ploop *ploop, unsigned int level,
                unsigned int cluster, unsigned int dst_cluster, struct pio *pio)
 {
-       if (!submit_cluster_cow(ploop, level, cluster, dst_cluster,
-                               queue_or_fail, pio))
+       if (!submit_cluster_cow(ploop, level, cluster, dst_cluster, pio))
                return;
 
        pio->bi_status = BLK_STS_RESOURCE;
@@ -1238,8 +1234,8 @@ static void submit_cluster_write(struct ploop_cow *cow)
 static void submit_cow_index_wb(struct ploop_cow *cow,
                                struct ploop_index_wb *piwb)
 {
-       struct pio *aux_pio = &cow->aux_pio;
-       unsigned int cluster = aux_pio->cluster;
+       struct pio *cow_pio = cow->cow_pio;
+       unsigned int cluster = cow_pio->cluster;
        struct ploop *ploop = cow->ploop;
        unsigned int page_nr;
        map_index_t *to;
diff --git a/drivers/md/dm-ploop.h b/drivers/md/dm-ploop.h
index cf2680d55ddf..4e132156ff90 100644
--- a/drivers/md/dm-ploop.h
+++ b/drivers/md/dm-ploop.h
@@ -256,10 +256,7 @@ struct ploop_cow {
        struct pio *cluster_pio;
        unsigned int dst_cluster;
 
-       struct pio aux_pio;
-
-       void (*end_fn)(struct ploop *, int, void *);
-       void *data; /* Second argument of end_fn */
+       struct pio *cow_pio;
 };
 
 extern bool ignore_signature_disk_in_use;


_______________________________________________
Devel mailing list
Devel@openvz.org
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to