[Devel] [PATCH RH8 5/8] ploop: Kill "message snapshot" interface

Kirill Tkhai ktkhai at virtuozzo.com
Tue May 11 11:46:11 MSK 2021


The interface is overkill. We use special message
interfaces instead of reload only in case of userspace
touches metadata on suspended image. But in case
of snapshot this is not so (in case of reload fails,
we just continue with old delta).

https://jira.sw.ru/browse/PSBM-129258

Signed-off-by: Kirill Tkhai <ktkhai at virtuozzo.com>
---
 drivers/md/dm-ploop-cmd.c |   99 ---------------------------------------------
 drivers/md/dm-ploop-map.c |   36 ----------------
 drivers/md/dm-ploop.h     |    7 ---
 3 files changed, 1 insertion(+), 141 deletions(-)

diff --git a/drivers/md/dm-ploop-cmd.c b/drivers/md/dm-ploop-cmd.c
index 3961155cf4fd..57ab6a867db1 100644
--- a/drivers/md/dm-ploop-cmd.c
+++ b/drivers/md/dm-ploop-cmd.c
@@ -920,99 +920,6 @@ static int ploop_update_delta_index(struct ploop *ploop, unsigned int level,
 	return cmd.retval;
 }
 
-static void process_switch_top_delta(struct ploop *ploop, struct ploop_cmd *cmd)
-{
-	unsigned int i, end, size, bat_clusters, *bat_entries, level = ploop->nr_deltas;
-	struct rb_node *node;
-	struct md_page *md;
-	int ret;
-
-	force_defer_bio_count_inc(ploop);
-	ret = ploop_inflight_bios_ref_switch(ploop, true);
-	if (ret)
-		goto out;
-
-	/* If you add more two-stages-actions, you must cancel them here too */
-	cancel_discard_bios(ploop);
-	restart_delta_cow(ploop);
-
-	write_lock_irq(&ploop->bat_rwlock);
-	swap(ploop->origin_dev, cmd->switch_top_delta.origin_dev);
-	swap(ploop->deltas, cmd->switch_top_delta.deltas);
-	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->bat_levels[i] == BAT_LEVEL_TOP)
-				md->bat_levels[i] = level;
-		}
-	}
-
-	/* Header and BAT-occupied clusters at start of file */
-	size = (PLOOP_MAP_OFFSET + ploop->nr_bat_entries) * sizeof(map_index_t);
-	bat_clusters = DIV_ROUND_UP(size, 1 << (ploop->cluster_log + 9));
-	for (i = 0; i < ploop->hb_nr; i++) {
-		if (i < bat_clusters)
-			clear_bit(i, ploop->holes_bitmap);
-		else
-			set_bit(i, ploop->holes_bitmap);
-	}
-
-	ploop->nr_deltas++;
-	write_unlock_irq(&ploop->bat_rwlock);
-out:
-	force_defer_bio_count_dec(ploop);
-
-	cmd->retval = ret;
-	complete(&cmd->comp); /* Last touch of cmd memory */
-}
-
-/* Switch top delta to new device after userspace has created snapshot */
-static int ploop_switch_top_delta(struct ploop *ploop, int new_ro_fd,
-				  char *new_dev)
-{
-	struct dm_target *ti = ploop->ti;
-	struct ploop_cmd cmd = { {0} };
-	struct file *file;
-	unsigned int size;
-	int ret;
-
-	cmd.type = PLOOP_CMD_SWITCH_TOP_DELTA;
-	cmd.ploop = ploop;
-
-	if (ploop->maintaince)
-		return -EBUSY;
-	if (ploop->nr_deltas == BAT_LEVEL_TOP)
-		return -EMFILE;
-	if (!(file = fget(new_ro_fd)))
-		return -EBADF;
-	ret = dm_get_device(ti, new_dev, dm_table_get_mode(ti->table),
-			    &cmd.switch_top_delta.origin_dev);
-	if (ret)
-		goto fput;
-	ret = -ENOMEM;
-	size = (ploop->nr_deltas + 1) * sizeof(struct ploop_delta);
-	cmd.switch_top_delta.deltas = kmalloc(size, GFP_NOIO);
-	if (!cmd.switch_top_delta.deltas)
-		goto put_dev;
-	size -= sizeof(struct ploop_delta);
-	memcpy(cmd.switch_top_delta.deltas, ploop->deltas, size);
-	cmd.switch_top_delta.deltas[ploop->nr_deltas].file = file;
-	cmd.switch_top_delta.deltas[ploop->nr_deltas].is_raw = false;
-
-	init_completion(&cmd.comp);
-	ploop_queue_deferred_cmd(ploop, &cmd);
-	wait_for_completion(&cmd.comp);
-	ret = cmd.retval;
-	kfree(cmd.switch_top_delta.deltas);
-put_dev:
-	dm_put_device(ploop->ti, cmd.switch_top_delta.origin_dev);
-fput:
-	if (ret)
-		fput(file);
-	return ret;
-}
-
 static void process_flip_upper_deltas(struct ploop *ploop, struct ploop_cmd *cmd)
 {
 	unsigned int i, size, end, bat_clusters, hb_nr, *bat_entries;
@@ -1630,8 +1537,6 @@ void process_deferred_cmd(struct ploop *ploop, struct ploop_index_wb *piwb)
 		process_merge_latest_snapshot_cmd(ploop, cmd);
 	} else if (cmd->type == PLOOP_CMD_NOTIFY_DELTA_MERGED) {
 		process_notify_delta_merged(ploop, cmd);
-	} else if (cmd->type == PLOOP_CMD_SWITCH_TOP_DELTA) {
-		process_switch_top_delta(ploop, cmd);
 	} else if (cmd->type == PLOOP_CMD_UPDATE_DELTA_INDEX) {
 		process_update_delta_index(ploop, cmd);
 	} else if (cmd->type == PLOOP_CMD_TRACKING_START) {
@@ -1704,10 +1609,6 @@ int ploop_message(struct dm_target *ti, unsigned int argc, char **argv,
 		if (argc != 3 || kstrtou64(argv[1], 10, &val) < 0)
 			goto unlock;
 		ret = ploop_update_delta_index(ploop, val, argv[2]);
-	} else if (!strcmp(argv[0], "snapshot")) {
-		if (argc != 3 || kstrtou64(argv[1], 10, &val) < 0)
-			goto unlock;
-		ret = ploop_switch_top_delta(ploop, val, argv[2]);
 	} else if (!strncmp(argv[0], "tracking_", 9)) {
 		if (argc != 1)
 			goto unlock;
diff --git a/drivers/md/dm-ploop-map.c b/drivers/md/dm-ploop-map.c
index bba578e8c219..1e8a0a1561ce 100644
--- a/drivers/md/dm-ploop-map.c
+++ b/drivers/md/dm-ploop-map.c
@@ -1102,6 +1102,7 @@ static void queue_or_fail(struct ploop *ploop, int err, void *data)
 {
 	struct bio *bio = data;
 
+	/* FIXME: do we use BLK_STS_AGAIN? */
 	if (err && err != BLK_STS_AGAIN) {
 		bio->bi_status = errno_to_blk_status(err);
 		bio_endio(bio);
@@ -1230,25 +1231,6 @@ static void process_delta_wb(struct ploop *ploop, struct ploop_index_wb *piwb)
 	spin_lock_irq(&ploop->deferred_lock);
 }
 
-void restart_delta_cow(struct ploop *ploop)
-{
-	struct bio_list cow_list = BIO_EMPTY_LIST;
-	struct bio *cluster_bio;
-	struct ploop_cow *cow;
-
-	spin_lock_irq(&ploop->deferred_lock);
-	bio_list_merge(&cow_list, &ploop->delta_cow_action_list);
-	bio_list_init(&ploop->delta_cow_action_list);
-	spin_unlock_irq(&ploop->deferred_lock);
-
-	while ((cluster_bio = bio_list_pop(&cow_list)) != NULL) {
-		cow = cluster_bio->bi_private;
-		/* This may restart only normal cow */
-		WARN_ON_ONCE(cow->end_fn != queue_or_fail);
-		complete_cow(cow, BLK_STS_AGAIN);
-	}
-}
-
 /*
  * This allocates a new cluster (if cluster wb is not pending yet),
  * or tries to attach a bio to a planned page index wb.
@@ -1505,22 +1487,6 @@ static void process_discard_bios(struct ploop *ploop, struct bio_list *bios,
 	}
 }
 
-void cancel_discard_bios(struct ploop *ploop)
-{
-	struct bio_list bio_list = BIO_EMPTY_LIST;
-	struct bio *bio;
-
-	spin_lock_irq(&ploop->deferred_lock);
-	bio_list_merge(&bio_list, &ploop->discard_bios);
-	bio_list_init(&ploop->discard_bios);
-	spin_unlock_irq(&ploop->deferred_lock);
-
-	while ((bio = bio_list_pop(&bio_list)) != NULL) {
-		bio->bi_status = BLK_STS_NOTSUPP;
-		bio_endio(bio);
-	}
-}
-
 /* Remove from tree bio and endio bio chain */
 void unlink_postponed_backup_endio(struct ploop *ploop,
 				   struct bio_list *bio_list,
diff --git a/drivers/md/dm-ploop.h b/drivers/md/dm-ploop.h
index 3a64522187a8..cee2a962802d 100644
--- a/drivers/md/dm-ploop.h
+++ b/drivers/md/dm-ploop.h
@@ -42,7 +42,6 @@ struct ploop_cmd {
 #define PLOOP_CMD_RESIZE		1
 #define PLOOP_CMD_MERGE_SNAPSHOT	3
 #define PLOOP_CMD_NOTIFY_DELTA_MERGED	4
-#define PLOOP_CMD_SWITCH_TOP_DELTA	5
 #define PLOOP_CMD_UPDATE_DELTA_INDEX	6
 #define PLOOP_CMD_TRACKING_START	7
 #define PLOOP_CMD_FLIP_UPPER_DELTAS	8
@@ -79,10 +78,6 @@ struct ploop_cmd {
 			u8 level;
 			bool forward;
 		} notify_delta_merged;
-		struct {
-			struct dm_dev *origin_dev;
-			struct ploop_delta *deltas;
-		} switch_top_delta;
 		struct {
 			u8 level;
 			const char *map;
@@ -513,8 +508,6 @@ extern int ploop_message(struct dm_target *ti, unsigned int argc, char **argv,
 extern int submit_cluster_cow(struct ploop *ploop, unsigned int level,
 			      unsigned int cluster, unsigned int dst_cluster,
 			      void (*end_fn)(struct ploop *, int, void *), void *data);
-extern void restart_delta_cow(struct ploop *ploop);
-extern void cancel_discard_bios(struct ploop *ploop);
 
 extern struct bio * alloc_bio_with_pages(struct ploop *ploop);
 extern void free_bio_with_pages(struct ploop *ploop, struct bio *bio);




More information about the Devel mailing list