[Devel] [PATCH RHEL9 COMMIT] ploop: Introduce option "off=" to cut beginning of device

Konstantin Khorenko khorenko at virtuozzo.com
Tue Oct 19 20:24:45 MSK 2021


The commit is pushed to "branch-rh9-5.14.vz9.1.x-ovz" and will appear at https://src.openvz.org/scm/ovz/vzkernel.git
after rh9-5.14.0-4.vz9.10.12
------>
commit 91501875022c2ebc572d48b6b2ea41525000c5ca
Author: Kirill Tkhai <ktkhai at virtuozzo.com>
Date:   Tue Oct 19 20:24:45 2021 +0300

    ploop: Introduce option "off=" to cut beginning of device
    
    This is like the functionality of dm-linear.
    
    https://jira.sw.ru/browse/PSBM-132445
    
    khorenko@: why this is useful for us?
    This option potentially allows us to assemble block device for a Container with
    a partition (if needed, for example for backing up block device use Acrons
    software) and without a partition.
    Using block device without a partition is simply faster.
    
    See more at https://jira.sw.ru/browse/PSBM-134936
    
    Signed-off-by: Kirill Tkhai <ktkhai at virtuozzo.com>
---
 drivers/md/dm-ploop-map.c    |  9 +++++++--
 drivers/md/dm-ploop-target.c | 28 ++++++++++++++++++++--------
 drivers/md/dm-ploop.h        |  1 +
 3 files changed, 28 insertions(+), 10 deletions(-)

diff --git a/drivers/md/dm-ploop-map.c b/drivers/md/dm-ploop-map.c
index e3cf0ab73c98..79142acddecc 100644
--- a/drivers/md/dm-ploop-map.c
+++ b/drivers/md/dm-ploop-map.c
@@ -42,6 +42,11 @@ static unsigned int pio_nr_segs(struct pio *pio)
         return nr_segs;
 }
 
+static sector_t ploop_rq_pos(struct ploop *ploop, struct request *rq)
+{
+	return blk_rq_pos(rq) + ploop->skip_off;
+}
+
 void ploop_index_wb_init(struct ploop_index_wb *piwb, struct ploop *ploop)
 {
 	piwb->ploop = ploop;
@@ -85,7 +90,7 @@ void init_pio(struct ploop *ploop, unsigned int bi_op, struct pio *pio)
 /* Get clu related to pio sectors */
 static int ploop_rq_valid(struct ploop *ploop, struct request *rq)
 {
-	sector_t sector = blk_rq_pos(rq);
+	sector_t sector = ploop_rq_pos(ploop, rq);
 	loff_t end_byte;
 	u32 end_clu;
 
@@ -1651,7 +1656,6 @@ static void prepare_one_embedded_pio(struct ploop *ploop, struct pio *pio,
 			goto err_nomem;
 		prq->bvec = bvec;
 skip_bvec:
-		pio->bi_iter.bi_sector = blk_rq_pos(rq);
 		pio->bi_iter.bi_size = blk_rq_bytes(rq);
 		pio->bi_iter.bi_idx = 0;
 		pio->bi_iter.bi_bvec_done = 0;
@@ -1661,6 +1665,7 @@ static void prepare_one_embedded_pio(struct ploop *ploop, struct pio *pio,
 
 		pio->bi_iter = rq->bio->bi_iter;
 	}
+	pio->bi_iter.bi_sector = ploop_rq_pos(ploop, rq);
 	pio->bi_io_vec = bvec;
 
 	pio->queue_list_id = PLOOP_LIST_DEFERRED;
diff --git a/drivers/md/dm-ploop-target.c b/drivers/md/dm-ploop-target.c
index ec0efddef2ac..327095f75359 100644
--- a/drivers/md/dm-ploop-target.c
+++ b/drivers/md/dm-ploop-target.c
@@ -389,16 +389,26 @@ static int ploop_ctr(struct dm_target *ti, unsigned int argc, char **argv)
 		goto err;
 	}
 
-	/* Optional parameter */
-	if (strcmp(argv[0], "falloc_new_clu") == 0) {
-		if (argc < 2) {
-			ret = -EINVAL;
-			goto err;
+	ret = -EINVAL;
+	/* Optional parameters */
+	while (argc > 0) {
+		if (strcmp(argv[0], "falloc_new_clu") == 0) {
+			ploop->falloc_new_clu = true;
+			EAT_ARG(argc, argv);
+			continue;
+		}
+		if (strncmp(argv[0], "off=", 4) == 0) {
+			if (kstrtou64(argv[0] + 4, 10, &ploop->skip_off) < 0)
+				goto err;
+			EAT_ARG(argc, argv);
+			continue;
 		}
-		ploop->falloc_new_clu = true;
-		EAT_ARG(argc, argv);
+		break;
 	}
 
+	if (argc <= 0)
+		goto err;
+
 	ret = ploop_add_deltas_stack(ploop, &argv[0], argc);
 	if (ret)
 		goto err;
@@ -435,7 +445,7 @@ static void ploop_status(struct dm_target *ti, status_type_t type,
 			 unsigned int maxlen)
 {
 	struct ploop *ploop = ti->private;
-	char stat[16] = { 0 }, *p = stat;
+	char stat[32] = { 0 }, *p = stat;
 	ssize_t sz = 0;
 
 	down_read(&ploop->ctl_rwsem);
@@ -447,6 +457,8 @@ static void ploop_status(struct dm_target *ti, status_type_t type,
 		p += sprintf(p, "n");
 	if (p == stat)
 		p += sprintf(p, "o");
+	if (ploop->skip_off)
+		p += sprintf(p, " off=%llu", ploop->skip_off);
 	up_read(&ploop->ctl_rwsem);
 
 	BUG_ON(p - stat >= sizeof(stat));
diff --git a/drivers/md/dm-ploop.h b/drivers/md/dm-ploop.h
index 8de2a28b2dec..a7ca942c4670 100644
--- a/drivers/md/dm-ploop.h
+++ b/drivers/md/dm-ploop.h
@@ -148,6 +148,7 @@ struct ploop {
 	bool falloc_new_clu; /* fallocate() instead of truncate() */
 	u32 nr_bat_entries;
 	unsigned int cluster_log; /* In sectors */
+	sector_t skip_off; /* To cut beginning of ploop device */
 
 	u8 m_Sig[16]; /* Signature */
 	u32 m_Type; /* Disk type */


More information about the Devel mailing list