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 <ktk...@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 <ktk...@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 */
_______________________________________________
Devel mailing list
Devel@openvz.org
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to