The commit is pushed to "branch-rh7-3.10.0-123.1.2-ovz" and will appear at 
https://src.openvz.org/scm/ovz/vzkernel.git
after rh7-3.10.0-123.1.2.vz7.5.1
------>
commit fd12acccf76e1a56f073322414cd43cbffa598ba
Author: Andrey Smetanin <asmeta...@virtuozzo.com>
Date:   Tue May 19 08:27:04 2015 +0400

    ploop: add ioctl to limit size of top delta (v2)
    
    customer created an online backup => backup.tib file.  Most probably the
    .tib file is inconsistent and in order to correctly access data inside
    we need to replay the journal.
    
    => We have to provide to container a bundle of .tib file (read-only) and
    a tiny read-writeable ploop delta - journal replayed data will be stored
    there.
    
    A cunning customer can notice that the delta is writeble and fill it
    with his own data - unlimited.
    
    => we need an ability to limit the ploop delta max size.
    
    https://jira.sw.ru/browse/PSBM-22002
    
    v2: move declaration of PLOOP_IOC_MAX_DELTA_SIZE
    
    Signed-off-by: Andrew Vagin <ava...@openvz.org>
    
    Acked-by: Maxim V. Patlasov <mpatla...@parallels.com>
---
 drivers/block/ploop/dev.c        | 20 ++++++++++++++++++++
 drivers/block/ploop/fmt_ploop1.c |  5 +++++
 include/linux/ploop/ploop.h      |  2 ++
 include/linux/ploop/ploop_if.h   |  3 +++
 4 files changed, 30 insertions(+)

diff --git a/drivers/block/ploop/dev.c b/drivers/block/ploop/dev.c
index 0124349..33f8442 100644
--- a/drivers/block/ploop/dev.c
+++ b/drivers/block/ploop/dev.c
@@ -2770,6 +2770,7 @@ init_delta(struct ploop_device * plo, struct ploop_ctl * 
ctl, int level)
        delta->plo = plo;
        delta->ops = ops;
        delta->flags = ctl->pctl_flags & PLOOP_FMT_FLAGS;
+       delta->max_delta_size = ULLONG_MAX;
 
        KOBJECT_INIT(&delta->kobj, &ploop_delta_ktype);
        return delta;
@@ -2780,6 +2781,22 @@ out_err:
 }
 
 
+static int ploop_set_max_delta_size(struct ploop_device *plo, unsigned long 
arg)
+{
+       struct ploop_delta * top_delta = ploop_top_delta(plo);
+       u64 max_delta_size;
+
+       if (copy_from_user(&max_delta_size, (void*)arg, sizeof(u64)))
+               return -EFAULT;
+
+       if (top_delta == NULL)
+               return -EINVAL;
+
+       top_delta->max_delta_size = max_delta_size;
+
+       return 0;
+}
+
 static int ploop_add_delta(struct ploop_device * plo, unsigned long arg)
 {
        int err;
@@ -4419,6 +4436,9 @@ static int ploop_ioctl(struct block_device *bdev, fmode_t 
fmode, unsigned int cm
        case PLOOP_IOC_DISCARD_WAIT:
                err = ploop_discard_wait_ioc(plo);
                break;
+       case PLOOP_IOC_MAX_DELTA_SIZE:
+               err = ploop_set_max_delta_size(plo, arg);
+               break;
        default:
                err = -EINVAL;
        }
diff --git a/drivers/block/ploop/fmt_ploop1.c b/drivers/block/ploop/fmt_ploop1.c
index 5ce6915..585f6ce 100644
--- a/drivers/block/ploop/fmt_ploop1.c
+++ b/drivers/block/ploop/fmt_ploop1.c
@@ -222,6 +222,11 @@ static void
 ploop1_allocate(struct ploop_delta * delta, struct ploop_request * preq,
                struct bio_list * sbl, unsigned int size)
 {
+       if (delta->io.alloc_head >=
+                       (delta->max_delta_size >> delta->cluster_log)) {
+               ploop_fail_request(preq, -E2BIG);
+               return;
+       }
        delta->io.ops->submit_alloc(&delta->io, preq, sbl, size);
 }
 
diff --git a/include/linux/ploop/ploop.h b/include/linux/ploop/ploop.h
index 434789e..ae3dbfc 100644
--- a/include/linux/ploop/ploop.h
+++ b/include/linux/ploop/ploop.h
@@ -286,6 +286,8 @@ struct ploop_delta
        struct ploop_delta_ops  *ops;
 
        struct kobject          kobj;
+
+       u64                     max_delta_size; /* in sectors */
 };
 
 struct ploop_tunable
diff --git a/include/linux/ploop/ploop_if.h b/include/linux/ploop/ploop_if.h
index 45b74fc..aacddb3 100644
--- a/include/linux/ploop/ploop_if.h
+++ b/include/linux/ploop/ploop_if.h
@@ -299,6 +299,9 @@ struct ploop_track_extent
 /* Filter extents with sizes less than arg */
 #define PLOOP_IOC_FBFILTER     _IOR(PLOOPCTLTYPE, 27, unsigned long)
 
+/* Set maximum size for the top delta . */
+#define PLOOP_IOC_MAX_DELTA_SIZE _IOW(PLOOPCTLTYPE, 28, __u64)
+
 /* Events exposed via /sys/block/ploopN/pstate/event */
 #define PLOOP_EVENT_ABORTED    1
 #define PLOOP_EVENT_STOPPED    2
_______________________________________________
Devel mailing list
Devel@openvz.org
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to