The commit is pushed to "branch-rh8-4.18.0-240.1.1.vz8.5.x-ovz" and will appear 
at https://src.openvz.org/scm/ovz/vzkernel.git
after rh8-4.18.0-240.1.1.vz8.5.53
------>
commit fdd1296b78d2e4598669ecc5b89cf0461b14c17e
Author: Kirill Tkhai <[email protected]>
Date:   Fri Jul 9 13:05:25 2021 +0300

    ploop: Don't forget about nr_inflight after stop
    
    We need to call inc_nr_inflight() for pios, which
    are resubmitted after submission was stopped.
    Refactor code to allow both the places to use
    the same function.
    
    Signed-off-by: Kirill Tkhai <[email protected]>
---
 drivers/md/dm-ploop-cmd.c |  2 +-
 drivers/md/dm-ploop-map.c | 55 ++++++++++++++++++++++++++++-------------------
 drivers/md/dm-ploop.h     |  1 +
 3 files changed, 35 insertions(+), 23 deletions(-)

diff --git a/drivers/md/dm-ploop-cmd.c b/drivers/md/dm-ploop-cmd.c
index f989d2ab008b..137067cccd47 100644
--- a/drivers/md/dm-ploop-cmd.c
+++ b/drivers/md/dm-ploop-cmd.c
@@ -140,7 +140,7 @@ static void ploop_resume_submitting_pios(struct ploop 
*ploop)
        list_splice_tail_init(&ploop->suspended_pios, &list);
        spin_unlock_irq(&ploop->deferred_lock);
 
-       dispatch_pios(ploop, NULL, &list);
+       submit_embedded_pios(ploop, &list);
 }
 
 /* Find existing BAT clu pointing to dst_clu */
diff --git a/drivers/md/dm-ploop-map.c b/drivers/md/dm-ploop-map.c
index ca7f841cb8b8..00e4a6ad1d92 100644
--- a/drivers/md/dm-ploop-map.c
+++ b/drivers/md/dm-ploop-map.c
@@ -78,10 +78,8 @@ void init_pio(struct ploop *ploop, unsigned int bi_op, 
struct pio *pio)
 }
 
 /* Get clu related to pio sectors */
-static int ploop_prq_valid(struct ploop *ploop, struct ploop_rq *prq)
+static int ploop_rq_valid(struct ploop *ploop, struct request *rq)
 {
-       struct request *rq = prq->rq;
-
        sector_t sector = blk_rq_pos(rq);
        loff_t end_byte;
        u32 end_clu;
@@ -1772,36 +1770,21 @@ static void init_prq(struct ploop_rq *prq, struct 
request *rq)
        prq->bvec = NULL;
 }
 
-int ploop_clone_and_map(struct dm_target *ti, struct request *rq,
-                   union map_info *info, struct request **clone)
+static void submit_embedded_pio(struct ploop *ploop, struct pio *pio)
 {
-       struct ploop *ploop = ti->private;
+       struct ploop_rq *prq = embedded_pio_to_prq(pio);
+       struct request *rq = prq->rq;
        struct work_struct *worker;
-       struct ploop_rq *prq;
        unsigned long flags;
        bool queue = true;
-       struct pio *pio;
-
-       prq = map_info_to_embedded_prq(info);
-       init_prq(prq, rq);
-
-       pio = map_info_to_embedded_pio(info);
-       init_pio(ploop, req_op(rq), pio);
-       pio->endio_cb = prq_endio;
-       pio->endio_cb_data = prq;
 
        if (blk_rq_bytes(rq)) {
-               if (ploop_prq_valid(ploop, prq) < 0)
-                       return DM_MAPIO_KILL;
-
                pio->queue_list_id = PLOOP_LIST_PREPARE;
                worker = &ploop->worker;
        } else {
+               WARN_ON_ONCE(pio->bi_op != REQ_OP_FLUSH);
                pio->queue_list_id = PLOOP_LIST_FLUSH;
                worker = &ploop->fsync_worker;
-
-               if (WARN_ON_ONCE(pio->bi_op != REQ_OP_FLUSH))
-                       return DM_MAPIO_KILL;
        }
 
        spin_lock_irqsave(&ploop->deferred_lock, flags);
@@ -1818,7 +1801,35 @@ int ploop_clone_and_map(struct dm_target *ti, struct 
request *rq,
 
        if (queue)
                queue_work(ploop->wq, worker);
+}
+
+void submit_embedded_pios(struct ploop *ploop, struct list_head *list)
+{
+       struct pio *pio;
+
+       while ((pio = pio_list_pop(list)) != NULL)
+               submit_embedded_pio(ploop, pio);
+}
+
+int ploop_clone_and_map(struct dm_target *ti, struct request *rq,
+                   union map_info *info, struct request **clone)
+{
+       struct ploop *ploop = ti->private;
+       struct ploop_rq *prq;
+       struct pio *pio;
+
+       if (blk_rq_bytes(rq) && ploop_rq_valid(ploop, rq) < 0)
+               return DM_MAPIO_KILL;
+
+       prq = map_info_to_embedded_prq(info);
+       init_prq(prq, rq);
+
+       pio = map_info_to_embedded_pio(info);
+       init_pio(ploop, req_op(rq), pio);
+       pio->endio_cb = prq_endio;
+       pio->endio_cb_data = prq;
 
+       submit_embedded_pio(ploop, pio);
        return DM_MAPIO_SUBMITTED;
 }
 
diff --git a/drivers/md/dm-ploop.h b/drivers/md/dm-ploop.h
index 9c4b77852c18..d766a3381205 100644
--- a/drivers/md/dm-ploop.h
+++ b/drivers/md/dm-ploop.h
@@ -552,6 +552,7 @@ extern bool try_update_bat_entry(struct ploop *ploop, u32 
clu,
 
 extern int ploop_add_delta(struct ploop *ploop, u32 level, struct file *file, 
bool is_raw);
 extern int ploop_check_delta_length(struct ploop *ploop, struct file *file, 
loff_t *file_size);
+extern void submit_embedded_pios(struct ploop *ploop, struct list_head *list);
 extern void dispatch_pios(struct ploop *ploop, struct pio *pio, struct 
list_head *pio_list);
 extern void do_ploop_work(struct work_struct *ws);
 extern void do_ploop_fsync_work(struct work_struct *ws);
_______________________________________________
Devel mailing list
[email protected]
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to