[RHEL8,COMMIT] ploop: Introduce find_endio_hook_range()

Submitted by Konstantin Khorenko on Oct. 18, 2019, 11:36 a.m.

Details

Message ID 201910181136.x9IBavKi020508@finist_el8beta.work.ct
State New
Series "ploop: Introduce find_endio_hook_range()"
Headers show

Commit Message

Konstantin Khorenko Oct. 18, 2019, 11:36 a.m.
The commit is pushed to "branch-rh8-4.18.0-80.1.2.vz8.2.x-ovz" and will appear at https://src.openvz.org/scm/ovz/vzkernel.git
after rh8-4.18.0-80.1.2.vz8.2.2
------>
commit 15be4a79c618f075689c4621f275c77f3076925e
Author: Kirill Tkhai <ktkhai@virtuozzo.com>
Date:   Fri Oct 18 14:36:57 2019 +0300

    ploop: Introduce find_endio_hook_range()
    
    Introduce this function to more effective search
    of range of hooks.
    
    Fixes: 398e0c85e871 ("dm: Interpreter of ploop1 format (ploop driver)")
    Signed-off-by: Kirill Tkhai <ktkhai@virtuozzo.com>
---
 drivers/md/dm-ploop-cmd.c | 12 +++++++-----
 drivers/md/dm-ploop-map.c | 11 ++++++-----
 drivers/md/dm-ploop.h     | 12 +++++++++---
 3 files changed, 22 insertions(+), 13 deletions(-)

Patch hide | download patch | download mbox

diff --git a/drivers/md/dm-ploop-cmd.c b/drivers/md/dm-ploop-cmd.c
index bde9ae11a625..0ad873a15411 100644
--- a/drivers/md/dm-ploop-cmd.c
+++ b/drivers/md/dm-ploop-cmd.c
@@ -1483,12 +1483,14 @@  static int ploop_push_backup_write(struct ploop *ploop, char *uuid,
 		return -ESTALE;
 
 	spin_lock_irq(&ploop->pb_lock);
-	for (i = cluster; i < cluster + nr; i++) {
+	for (i = cluster; i < cluster + nr; i++)
 		clear_bit(i, pb->ppb_map);
-		/* TODO: optimize by introduction find_endio_hook_after() */
-		h = find_endio_hook(ploop, &pb->rb_root, i);
-		if (h)
-			unlink_postponed_backup_endio(ploop, &bio_list, h);
+	for (i = 0; i < nr; i++) {
+		h = find_endio_hook_range(ploop, &pb->rb_root, cluster,
+					  cluster + nr - 1);
+		if (!h)
+			break;
+		unlink_postponed_backup_endio(ploop, &bio_list, h);
 	}
 
 	has_more = !RB_EMPTY_ROOT(&pb->rb_root);
diff --git a/drivers/md/dm-ploop-map.c b/drivers/md/dm-ploop-map.c
index faa334e4d8a1..0fad19c69fa8 100644
--- a/drivers/md/dm-ploop-map.c
+++ b/drivers/md/dm-ploop-map.c
@@ -222,18 +222,19 @@  static int ploop_map_discard(struct ploop *ploop, struct bio *bio)
 	return DM_MAPIO_SUBMITTED;
 }
 
-struct dm_ploop_endio_hook *find_endio_hook(struct ploop *ploop,
-					    struct rb_root *root,
-					    unsigned int cluster)
+struct dm_ploop_endio_hook *find_endio_hook_range(struct ploop *ploop,
+						  struct rb_root *root,
+						  unsigned int left,
+						  unsigned int right)
 {
 	struct rb_node *node = root->rb_node;
 	struct dm_ploop_endio_hook *h;
 
 	while (node) {
 		h = rb_entry(node, struct dm_ploop_endio_hook, node);
-		if (cluster < h->cluster)
+		if (right < h->cluster)
 			node = node->rb_left;
-		else if (cluster > h->cluster)
+		else if (left > h->cluster)
 			node = node->rb_right;
 		else
 			return h;
diff --git a/drivers/md/dm-ploop.h b/drivers/md/dm-ploop.h
index ea6917d13835..02b496d7b7c3 100644
--- a/drivers/md/dm-ploop.h
+++ b/drivers/md/dm-ploop.h
@@ -343,6 +343,15 @@  static inline void track_bio(struct ploop *ploop, struct bio *bio)
 		__track_bio(ploop, bio);
 }
 
+extern struct dm_ploop_endio_hook *find_endio_hook_range(struct ploop *ploop,
+			struct rb_root *root, unsigned int l, unsigned int r);
+
+static inline struct dm_ploop_endio_hook *find_endio_hook(struct ploop *ploop,
+				   struct rb_root *root, unsigned int cluster)
+{
+	return find_endio_hook_range(ploop, root, cluster, cluster);
+}
+
 extern int ploop_add_delta(struct ploop *ploop, const char *arg);
 extern void defer_bio(struct ploop *ploop, struct bio *bio);
 extern void defer_bio_list(struct ploop *ploop, struct bio_list *bio_list);
@@ -354,9 +363,6 @@  extern int ploop_endio(struct dm_target *ti, struct bio *bio, blk_status_t *err)
 extern void ploop_inflight_bios_ref_switch(struct ploop *ploop);
 extern struct dm_ploop_endio_hook *find_lk_of_cluster(struct ploop *ploop,
 						      unsigned int cluster);
-extern struct dm_ploop_endio_hook *find_endio_hook(struct ploop *ploop,
-						   struct rb_root *root,
-						   unsigned int cluster);
 extern void unlink_postponed_backup_endio(struct ploop *ploop,
 					  struct bio_list *bio_list,
 					  struct dm_ploop_endio_hook *h);