[Devel] [PATCH RHEL8 COMMIT] ploop: Add deltas in normal order

Konstantin Khorenko khorenko at virtuozzo.com
Thu May 6 00:30:45 MSK 2021


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.26
------>
commit 3c56beccd3212933904974dae8e4b42f40dea58c
Author: Kirill Tkhai <ktkhai at virtuozzo.com>
Date:   Thu May 6 00:30:45 2021 +0300

    ploop: Add deltas in normal order
    
    >From newest to oldest.
    
    Signed-off-by: Kirill Tkhai <ktkhai at virtuozzo.com>
    
    =====================
    Patchset description:
    
    ploop: Preparation to kill-loop from dm-ploop (series 2)
    
    Currently, ploop requires underlining loop for top delta. This is overkill,
    since we may submit bios directly to fs, without using it.
    
    Initially there was a possibility, we may use device-mapper format snapshots
    instead of ploop-based. But we don't do that, so we have to use loop for top
    delta and directly submit bios to the rest of deltas. So, these two ways to do
    the same actions are wrong.
    
    This is preparations #2 for further series.
    Let's this goes to testing earlier.
    
    Kirill Tkhai (4):
          ploop: Move ploop_add_delta() to another file
          ploop: Pass level directly in ploop_add_delta()
          ploop: Add deltas in normal order
          ploop: Check next delta in stack not bigger then previous
    
    https://jira.sw.ru/browse/PSBM-123654
    
    Signed-off-by: Kirill Tkhai <ktkhai at virtuozzo.com>
---
 drivers/md/dm-ploop-bat.c    | 40 ++++++++++++++++++----------------------
 drivers/md/dm-ploop-target.c | 12 +++++++-----
 2 files changed, 25 insertions(+), 27 deletions(-)

diff --git a/drivers/md/dm-ploop-bat.c b/drivers/md/dm-ploop-bat.c
index 135427c759dd..45f651ce5549 100644
--- a/drivers/md/dm-ploop-bat.c
+++ b/drivers/md/dm-ploop-bat.c
@@ -409,8 +409,15 @@ int ploop_read_delta_metadata(struct ploop *ploop, struct file *file,
 	return ret;
 }
 
-static int apply_delta_mappings(struct ploop *ploop, struct ploop_delta *deltas,
-				u32 level, void *hdr, u64 size_in_clus)
+/*
+ * Prefer first added delta, since the order is:
+ * 1)add top device
+ * 2)add newest delta
+ * ...
+ * n)add oldest delta
+ */
+static void apply_delta_mappings(struct ploop *ploop, struct ploop_delta *deltas,
+				 u32 level, void *hdr, u64 size_in_clus)
 {
 	map_index_t *bat_entries, *delta_bat_entries;
 	unsigned int i, end, dst_cluster;
@@ -423,14 +430,13 @@ static int apply_delta_mappings(struct ploop *ploop, struct ploop_delta *deltas,
 	is_raw = deltas[level].is_raw;
 
 	write_lock_irq(&ploop->bat_rwlock);
-
-	/* FIXME: Stop on old delta's nr_bat_entries */
 	ploop_for_each_md_page(ploop, md, node) {
 		init_bat_entries_iter(ploop, md->id, &i, &end);
 		bat_entries = kmap_atomic(md->page);
 		for (; i <= end; i++) {
-			if (md_page_cluster_is_in_top_delta(md, i))
+			if (bat_entries[i] != BAT_ENTRY_NONE)
 				continue;
+
 			if (!is_raw)
 				dst_cluster = delta_bat_entries[i];
 			else {
@@ -440,15 +446,6 @@ static int apply_delta_mappings(struct ploop *ploop, struct ploop_delta *deltas,
 			}
 			if (dst_cluster == BAT_ENTRY_NONE)
 				continue;
-			/*
-			 * Prefer last added delta, since the order is:
-			 * 1)add top device
-			 * 2)add oldest delta
-			 * ...
-			 * n)add newest delta
-			 * Keep in mind, top device is current image, and
-			 * it is added first in contrary the "age" order.
-			 */
 			md->bat_levels[i] = level;
 			bat_entries[i] = dst_cluster;
 
@@ -457,9 +454,6 @@ static int apply_delta_mappings(struct ploop *ploop, struct ploop_delta *deltas,
 		delta_bat_entries += PAGE_SIZE / sizeof(map_index_t);
 	}
 	write_unlock_irq(&ploop->bat_rwlock);
-
-	get_file(ploop->deltas[level].file);
-	return 0;
 }
 
 static int ploop_check_delta_length(struct ploop *ploop, struct file *file,
@@ -493,9 +487,6 @@ int ploop_add_delta(struct ploop *ploop, u32 level, int fd, bool is_raw)
 	if (!(file->f_mode & FMODE_READ))
 		goto out;
 
-	deltas[level].file = file;
-	deltas[level].is_raw = is_raw;
-
 	ret = ploop_check_delta_length(ploop, file, &size_in_clus);
 	if (ret)
 		goto out;
@@ -505,9 +496,14 @@ int ploop_add_delta(struct ploop *ploop, u32 level, int fd, bool is_raw)
 	if (ret)
 		goto out;
 
-	ret = apply_delta_mappings(ploop, deltas, level, hdr, size_in_clus);
+	apply_delta_mappings(ploop, deltas, level, hdr, size_in_clus);
+
+	deltas[level].file = file;
+	deltas[level].is_raw = is_raw;
+	ret = 0;
 out:
 	vfree(hdr);
-	fput(file);
+	if (ret)
+		fput(file);
 	return ret;
 }
diff --git a/drivers/md/dm-ploop-target.c b/drivers/md/dm-ploop-target.c
index 4e5f5adba40e..39c39a77b05f 100644
--- a/drivers/md/dm-ploop-target.c
+++ b/drivers/md/dm-ploop-target.c
@@ -84,8 +84,10 @@ static void ploop_destroy(struct ploop *ploop)
 	for (i = 0; i < 2; i++)
 		percpu_ref_exit(&ploop->inflight_bios_ref[i]);
 	/* Nobody uses it after destroy_workqueue() */
-	while (ploop->nr_deltas-- > 0)
-		fput(ploop->deltas[ploop->nr_deltas].file);
+	while (ploop->nr_deltas-- > 0) {
+		if (ploop->deltas[ploop->nr_deltas].file)
+			fput(ploop->deltas[ploop->nr_deltas].file);
+	}
 	WARN_ON(!RB_EMPTY_ROOT(&ploop->exclusive_bios_rbtree));
 	WARN_ON(!RB_EMPTY_ROOT(&ploop->inflight_bios_rbtree));
 	kfree(ploop->deltas);
@@ -133,9 +135,10 @@ static int ploop_add_deltas_stack(struct ploop *ploop, char **argv, int argc)
 	if (!deltas)
 		goto out;
 	ploop->deltas = deltas;
+	ploop->nr_deltas = argc;
 
 	ret = -EINVAL;
-	for (i = 0; i < argc; i++) {
+	for (i = argc - 1; i >= 0; i--) {
 		arg = argv[i];
 		is_raw = false;
 		if (strncmp(arg, "raw@", 4) == 0) {
@@ -147,11 +150,10 @@ static int ploop_add_deltas_stack(struct ploop *ploop, char **argv, int argc)
 		if (kstrtos32(arg, 10, &delta_fd) < 0)
 			goto out;
 
-		level = ploop->nr_deltas;
+		level = i;
 		ret = ploop_add_delta(ploop, level, delta_fd, is_raw);
 		if (ret < 0)
 			goto out;
-		ploop->nr_deltas++;
 	}
 
 	ret = 0;


More information about the Devel mailing list