[Devel] [PATCH RH8 1/2] ploop: Add interface to configure new clusters preallocation

Kirill Tkhai ktkhai at virtuozzo.com
Tue Jul 13 12:30:45 MSK 2021


Add new optional parameter "falloc_new_clu> to configure new clusters preallocation.
It goes after clu_size and before fds:

$dmsetup create dm_ploop --table "0 $sectors ploop <clu_size> falloc_new_clu <fd1 ... <fdN>"

In case of falloc is not needed (truncate will be used instead),
we just don't use it:

$dmsetup create dm_ploop --table "0 $sectors ploop <clu_size> <fd1 ... <fdN>"

In case of falloc is enabled, 'f' is added to status line:

$dmsetup table ploopXXX
ploopXXX: 0 4194304 ploop 2 v2 2048 f
(it may be combined with other status symbols like 'ftn').

It may be enabled dynamically:

$dmsetup message dm_ploop 0 set_falloc_new_clu <enabled>
where enabled is 1 or 0.

Note, that now we use rwsem in ploop_status() to get status
letters, since they are modified under this rwsem.

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

Signed-off-by: Kirill Tkhai <ktkhai at virtuozzo.com>
---
 drivers/md/dm-ploop-cmd.c    |   12 ++++++++++++
 drivers/md/dm-ploop-target.c |   29 +++++++++++++++++++++++++----
 drivers/md/dm-ploop.h        |    1 +
 3 files changed, 38 insertions(+), 4 deletions(-)

diff --git a/drivers/md/dm-ploop-cmd.c b/drivers/md/dm-ploop-cmd.c
index 137067cccd47..ed775e9bbeb4 100644
--- a/drivers/md/dm-ploop-cmd.c
+++ b/drivers/md/dm-ploop-cmd.c
@@ -940,6 +940,14 @@ static int process_flip_upper_deltas(struct ploop *ploop)
 	return 0;
 }
 
+static int ploop_set_falloc_new_clu(struct ploop *ploop, u64 val)
+{
+	if (val > 1)
+		return -EINVAL;
+	ploop->falloc_new_clu = !!val;
+	return 0;
+}
+
 static int process_tracking_start(struct ploop *ploop, void *tracking_bitmap,
 				  u32 tb_nr)
 {
@@ -1269,6 +1277,10 @@ 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 (!strncmp(argv[0], "set_falloc_new_clu", 20)) {
+		if (argc != 2 || kstrtou64(argv[1], 10, &val) < 0)
+			goto unlock;
+		ret = ploop_set_falloc_new_clu(ploop, val);
 	} else if (!strncmp(argv[0], "tracking_", 9)) {
 		if (argc != 1)
 			goto unlock;
diff --git a/drivers/md/dm-ploop-target.c b/drivers/md/dm-ploop-target.c
index c69e18bfa13d..472f5aed73e5 100644
--- a/drivers/md/dm-ploop-target.c
+++ b/drivers/md/dm-ploop-target.c
@@ -253,8 +253,8 @@ static int ploop_add_deltas_stack(struct ploop *ploop, char **argv, int argc)
 	ploop->deltas = deltas;
 	ploop->nr_deltas = argc;
 
-	ret = -EINVAL;
 	for (i = argc - 1; i >= 0; i--) {
+		ret = -EINVAL;
 		arg = argv[i];
 		is_raw = false;
 		if (strncmp(arg, "raw@", 4) == 0) {
@@ -290,6 +290,13 @@ static int ploop_add_deltas_stack(struct ploop *ploop, char **argv, int argc)
 	fput(file);
 	goto out;
 }
+
+#define EAT_ARG(argc, argv)					\
+	do {							\
+		BUILD_BUG_ON(sizeof(argc) != sizeof(int));	\
+		argc--;						\
+		argv++;						\
+	} while (0);
 /*
  * <data dev>
  */
@@ -366,13 +373,24 @@ static int ploop_ctr(struct dm_target *ti, unsigned int argc, char **argv)
 		ti->error = "could not parse cluster_log";
 		goto err;
 	}
+	EAT_ARG(argc, argv);
 	ret = dm_set_target_max_io_len(ti, CLU_TO_SEC(ploop, 1));
 	if (ret) {
 		ti->error = "could not set max_io_len";
 		goto err;
 	}
 
-	ret = ploop_add_deltas_stack(ploop, &argv[1], argc - 1);
+	/* Optional parameter */
+	if (strcmp(argv[0], "falloc_new_clu") == 0) {
+		if (argc < 2) {
+			ret = -EINVAL;
+			goto err;
+		}
+		ploop->falloc_new_clu = true;
+		EAT_ARG(argc, argv);
+	}
+
+	ret = ploop_add_deltas_stack(ploop, &argv[0], argc);
 	if (ret)
 		goto err;
 
@@ -412,16 +430,19 @@ static void ploop_status(struct dm_target *ti, status_type_t type,
 	char stat[16] = { 0 }, *p = stat;
 	ssize_t sz = 0;
 
-	read_lock_irq(&ploop->bat_rwlock);
+	down_read(&ploop->ctl_rwsem);
+	if (ploop->falloc_new_clu)
+		p += sprintf(p, "f");
 	if (ploop->tracking_bitmap)
 		p += sprintf(p, "t");
 	if (READ_ONCE(ploop->noresume))
 		p += sprintf(p, "n");
 	if (p == stat)
 		p += sprintf(p, "o");
+	up_read(&ploop->ctl_rwsem);
+
 	BUG_ON(p - stat >= sizeof(stat));
 	DMEMIT("%u v2 %u %s", ploop->nr_deltas, (u32)CLU_TO_SEC(ploop, 1), stat);
-	read_unlock_irq(&ploop->bat_rwlock);
 }
 
 static void ploop_set_wants_suspend(struct dm_target *ti, bool wants)
diff --git a/drivers/md/dm-ploop.h b/drivers/md/dm-ploop.h
index 9fcad49015b1..b10820887350 100644
--- a/drivers/md/dm-ploop.h
+++ b/drivers/md/dm-ploop.h
@@ -140,6 +140,7 @@ struct ploop {
 	struct rb_root bat_entries;
 	struct ploop_delta *deltas;
 	u8 nr_deltas;
+	bool falloc_new_clu; /* fallocate() instead of truncate() */
 	u32 nr_bat_entries;
 	unsigned int cluster_log; /* In sectors */
 




More information about the Devel mailing list