The commit is pushed to "branch-rh8-4.18.0-305.3.1.vz8.7.x-ovz" and will appear 
at https://src.openvz.org/scm/ovz/vzkernel.git
after rh8-4.18.0-305.3.1.vz8.7.11
------>
commit 83fc54ea76dfd842c5716e338ed32c857a30ed04
Author: Kirill Tkhai <[email protected]>
Date:   Fri Sep 10 20:16:49 2021 +0300

    push_backup: Change retval postpone_if_required_for_backup()
    
    Signed-off-by: Kirill Tkhai <[email protected]>
    
    ====================
    push_backup: Make target !immutable.
    
    https://jira.sw.ru/browse/PSBM-127989
    
    Kirill Tkhai (14):
          push_backup: Rename ppb_map
          push_backup: Add unsigned long alignment
          push_backup: Add pending_map
          push_backup: Kill find_node_pbio_range()
          push_backup: Use nr_delayed in postpone_if_required_for_backup()
          push_backup: Introduce hash table
          push_backup: Leave pending pbio in pending queue
          push_backup: Do not split bios by cluster size
          dm: Allow singleton target with devices attached
          dm: Introduce dm_requeue_original_rq()
          push_backup: Make it request based
          push_backup: Change retval postpone_if_required_for_backup()
          push_backup: Change arguments of calc_bio_clusters()
          push_backup: Make the target !immutable
---
 drivers/md/dm-push-backup.c | 32 ++++++++++++++++++++------------
 1 file changed, 20 insertions(+), 12 deletions(-)

diff --git a/drivers/md/dm-push-backup.c b/drivers/md/dm-push-backup.c
index 198fe0e55a32..044b7569654e 100644
--- a/drivers/md/dm-push-backup.c
+++ b/drivers/md/dm-push-backup.c
@@ -102,8 +102,8 @@ static void calc_bio_clusters(struct push_backup *pb, 
struct request *rq,
        pbio->end_clu = (off + blk_rq_bytes(rq) - 1) / pb->clu_size;
 }
 
-static bool setup_if_required_for_backup(struct push_backup *pb, struct 
request *rq,
-                                        struct pb_bio *pbio)
+static int setup_if_required_for_backup(struct push_backup *pb, struct request 
*rq,
+                                       struct pb_bio *pbio)
 {
        u64 key;
 
@@ -114,9 +114,9 @@ static bool setup_if_required_for_backup(struct push_backup 
*pb, struct request
        if (key != U64_MAX) {
                pbio->rq = rq;
                pbio->key_clu = key;
-               return true;
+               return 1;
        }
-       return false;
+       return 0;
 }
 
 static void update_pending_map(struct push_backup *pb, struct pb_bio *pbio)
@@ -232,22 +232,26 @@ static void pb_timer_func(struct timer_list *timer)
                queue_work(pb->wq, &pb->worker);
 }
 
-static bool postpone_if_required_for_backup(struct push_backup *pb,
-                                           struct request *rq,
-                                           struct pb_bio *pbio)
+static int postpone_if_required_for_backup(struct push_backup *pb,
+                                          struct request *rq,
+                                          struct pb_bio *pbio)
 {
-       bool queue_timer = false, postpone = false;
+       bool queue_timer = false;
        unsigned long flags;
+       int ret = 0;
 
        rcu_read_lock(); /* See push_backup_stop() */
        spin_lock_irqsave(&pb->lock, flags);
-       if (!pb->alive || !setup_if_required_for_backup(pb, rq, pbio))
+       if (!pb->alive)
+               goto unlock;
+       ret = setup_if_required_for_backup(pb, rq, pbio);
+       if (ret <= 0)
                goto unlock;
 
        update_pending_map(pb, pbio);
        link_pending_pbio(pb, pbio);
 
-       postpone = true;
+       ret = 1;
        pb->nr_delayed += 1;
        if (pb->nr_delayed == 1) {
                pb->deadline_jiffies = get_jiffies_64() + 
pb->timeout_in_jiffies;
@@ -263,7 +267,7 @@ static bool postpone_if_required_for_backup(struct 
push_backup *pb,
        if (queue_timer)
                wake_up_interruptible(&pb->waitq);
 
-       return postpone;
+       return ret;
 }
 
 static inline struct pb_bio *map_info_to_embedded_pbio(union map_info *info)
@@ -281,9 +285,13 @@ static int pb_clone_and_map(struct dm_target *ti, struct 
request *rq,
        struct block_device *bdev = pb->origin_dev->bdev;
        struct request_queue *q;
        struct request *clone;
+       int ret;
 
        if (blk_rq_bytes(rq) && op_is_write(req_op(rq))) {
-               if (postpone_if_required_for_backup(pb, rq, pbio))
+               ret = postpone_if_required_for_backup(pb, rq, pbio);
+               if (ret < 0) /* ENOMEM */
+                       return DM_MAPIO_REQUEUE;
+               if (ret > 0) /* Postponed */
                        return DM_MAPIO_SUBMITTED;
        }
 
_______________________________________________
Devel mailing list
[email protected]
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to