[Devel] [PATCH RH8 4/7] ploop: Call add_delta directly

Kirill Tkhai ktkhai at virtuozzo.com
Tue May 4 16:05:17 MSK 2021


There is no a possiblily to add delta to starting device.
So, calling that functionality from work is overkill.

Signed-off-by: Kirill Tkhai <ktkhai at virtuozzo.com>
---
 drivers/md/dm-ploop-cmd.c |   62 ++++++++++++++++-----------------------------
 drivers/md/dm-ploop.h     |    7 -----
 2 files changed, 22 insertions(+), 47 deletions(-)

diff --git a/drivers/md/dm-ploop-cmd.c b/drivers/md/dm-ploop-cmd.c
index 01e6ba5153dc..1626cd1b881a 100644
--- a/drivers/md/dm-ploop-cmd.c
+++ b/drivers/md/dm-ploop-cmd.c
@@ -571,8 +571,8 @@ static int ploop_resize(struct ploop *ploop, u64 new_size)
 	return ret;
 }
 
-/* FIXME: this must not be called on running device */
-static void process_add_delta_cmd(struct ploop *ploop, struct ploop_cmd *cmd)
+static int apply_delta_mappings(struct ploop *ploop, struct ploop_delta *deltas,
+				void *hdr, u64 size_in_clus)
 {
 	map_index_t *bat_entries, *delta_bat_entries;
 	unsigned int i, end, level, dst_cluster;
@@ -580,16 +580,10 @@ static void process_add_delta_cmd(struct ploop *ploop, struct ploop_cmd *cmd)
 	struct md_page *md;
 	bool is_raw;
 
-	if (unlikely(ploop->force_link_inflight_bios)) {
-		cmd->retval = -EBUSY;
-		pr_err("ploop: adding delta on running device\n");
-		goto out;
-	}
-
 	level = ploop->nr_deltas;
 	/* Points to hdr since md_page[0] also contains hdr. */
-	delta_bat_entries = (map_index_t *)cmd->add_delta.hdr;
-	is_raw = cmd->add_delta.deltas[level].is_raw;
+	delta_bat_entries = (map_index_t *)hdr;
+	is_raw = deltas[level].is_raw;
 
 	write_lock_irq(&ploop->bat_rwlock);
 
@@ -604,7 +598,7 @@ static void process_add_delta_cmd(struct ploop *ploop, struct ploop_cmd *cmd)
 				dst_cluster = delta_bat_entries[i];
 			else {
 				dst_cluster = page_clu_idx_to_bat_clu(md->id, i);
-				if (dst_cluster >= cmd->add_delta.raw_clusters)
+				if (dst_cluster >= size_in_clus)
 					dst_cluster = BAT_ENTRY_NONE;
 			}
 			if (dst_cluster == BAT_ENTRY_NONE)
@@ -626,24 +620,24 @@ static void process_add_delta_cmd(struct ploop *ploop, struct ploop_cmd *cmd)
 		delta_bat_entries += PAGE_SIZE / sizeof(map_index_t);
 	}
 
-	swap(ploop->deltas, cmd->add_delta.deltas);
+	swap(ploop->deltas, deltas);
 	ploop->nr_deltas++;
 	write_unlock_irq(&ploop->bat_rwlock);
+
+	kfree(deltas);
 	get_file(ploop->deltas[level].file);
-	cmd->retval = 0;
-out:
-	complete(&cmd->comp); /* Last touch of cmd memory */
+	return 0;
 }
 
-static int ploop_check_raw_delta(struct ploop *ploop, struct file *file,
-				 struct ploop_cmd *cmd)
+static int ploop_check_delta_length(struct ploop *ploop, struct file *file,
+				    u64 *size_in_clus)
 {
 	loff_t loff = i_size_read(file->f_mapping->host);
 	unsigned int cluster_log = ploop->cluster_log;
 
 	if (loff & ((1 << (cluster_log + SECTOR_SHIFT)) - 1))
 		return -EPROTO;
-	cmd->add_delta.raw_clusters = loff >> (cluster_log + SECTOR_SHIFT);
+	*size_in_clus = loff >> (cluster_log + SECTOR_SHIFT);
 	return 0;
 }
 
@@ -654,10 +648,11 @@ static int ploop_check_raw_delta(struct ploop *ploop, struct file *file,
 int ploop_add_delta(struct ploop *ploop, int fd, bool is_raw)
 {
 	unsigned int level = ploop->nr_deltas;
-	struct ploop_cmd cmd = { {0} };
 	struct ploop_delta *deltas;
 	unsigned int size;
 	struct file *file;
+	u64 size_in_clus;
+	void *hdr = NULL;
 	int ret;
 
 	if (level == BAT_LEVEL_TOP)
@@ -677,30 +672,19 @@ int ploop_add_delta(struct ploop *ploop, int fd, bool is_raw)
 	memcpy(deltas, ploop->deltas, size);
 	deltas[level].file = file;
 	deltas[level].is_raw = is_raw;
-	/*
-	 * BAT update in general is driven by the kwork
-	 * (see comment in process_one_deferred_bio()),
-	 * so we delegate the cmd to it.
-	 */
-	cmd.add_delta.deltas = deltas;
-	cmd.type = PLOOP_CMD_ADD_DELTA;
-	cmd.ploop = ploop;
 
-	if (is_raw)
-		ret = ploop_check_raw_delta(ploop, file, &cmd);
-	else
-		ret = ploop_read_delta_metadata(ploop, file,
-						&cmd.add_delta.hdr);
+	ret = ploop_check_delta_length(ploop, file, &size_in_clus);
 	if (ret)
 		goto out;
 
-	init_completion(&cmd.comp);
-	ploop_queue_deferred_cmd(ploop, &cmd);
-	wait_for_completion(&cmd.comp);
-	ret = cmd.retval;
+	if (!is_raw)
+		ret = ploop_read_delta_metadata(ploop, file, &hdr);
+	if (ret)
+		goto out;
+
+	ret = apply_delta_mappings(ploop, deltas, hdr, size_in_clus);
 out:
-	vfree(cmd.add_delta.hdr);
-	kfree(cmd.add_delta.deltas);
+	vfree(hdr);
 	fput(file);
 	return ret;
 }
@@ -1774,8 +1758,6 @@ void process_deferred_cmd(struct ploop *ploop, struct ploop_index_wb *piwb)
 
 	if (cmd->type == PLOOP_CMD_RESIZE) {
 		process_resize_cmd(ploop, piwb, cmd);
-	} else if (cmd->type == PLOOP_CMD_ADD_DELTA) {
-		process_add_delta_cmd(ploop, cmd);
 	} else if (cmd->type == PLOOP_CMD_MERGE_SNAPSHOT) {
 		process_merge_latest_snapshot_cmd(ploop, cmd);
 	} else if (cmd->type == PLOOP_CMD_NOTIFY_DELTA_MERGED) {
diff --git a/drivers/md/dm-ploop.h b/drivers/md/dm-ploop.h
index 5f22e95575b5..1741a2075fb2 100644
--- a/drivers/md/dm-ploop.h
+++ b/drivers/md/dm-ploop.h
@@ -39,7 +39,6 @@ struct ploop_delta {
 
 struct ploop_cmd {
 #define PLOOP_CMD_RESIZE		1
-#define PLOOP_CMD_ADD_DELTA		2
 #define PLOOP_CMD_MERGE_SNAPSHOT	3
 #define PLOOP_CMD_NOTIFY_DELTA_MERGED	4
 #define PLOOP_CMD_SWITCH_TOP_DELTA	5
@@ -68,12 +67,6 @@ struct ploop_cmd {
 			struct bio *bio;
 		} resize;
 		struct {
-			struct file *file;
-			struct ploop_delta *deltas;
-			void *hdr; /* hdr and bat_entries consequentially */
-			unsigned int raw_clusters;
-		} add_delta;
-		struct {
 #define NR_MERGE_BIOS			64
 			atomic_t nr_available;
 			unsigned int cluster; /* Currently iterated cluster */




More information about the Devel mailing list