Signed-off-by: Kirill Tkhai <ktk...@virtuozzo.com>
---
 drivers/md/dm-ploop-cmd.c    |   13 +------------
 drivers/md/dm-ploop-target.c |   15 ++++++++++++++-
 2 files changed, 15 insertions(+), 13 deletions(-)

diff --git a/drivers/md/dm-ploop-cmd.c b/drivers/md/dm-ploop-cmd.c
index 1626cd1b881a..ff696065fdb7 100644
--- a/drivers/md/dm-ploop-cmd.c
+++ b/drivers/md/dm-ploop-cmd.c
@@ -620,11 +620,9 @@ static int apply_delta_mappings(struct ploop *ploop, 
struct ploop_delta *deltas,
                delta_bat_entries += PAGE_SIZE / sizeof(map_index_t);
        }
 
-       swap(ploop->deltas, deltas);
        ploop->nr_deltas++;
        write_unlock_irq(&ploop->bat_rwlock);
 
-       kfree(deltas);
        get_file(ploop->deltas[level].file);
        return 0;
 }
@@ -647,16 +645,13 @@ static int ploop_check_delta_length(struct ploop *ploop, 
struct file *file,
  */
 int ploop_add_delta(struct ploop *ploop, int fd, bool is_raw)
 {
+       struct ploop_delta *deltas = ploop->deltas;
        unsigned int level = ploop->nr_deltas;
-       struct ploop_delta *deltas;
-       unsigned int size;
        struct file *file;
        u64 size_in_clus;
        void *hdr = NULL;
        int ret;
 
-       if (level == BAT_LEVEL_TOP)
-               return -EMFILE;
        file = fget(fd);
        if (!file)
                return -ENOENT;
@@ -664,12 +659,6 @@ int ploop_add_delta(struct ploop *ploop, int fd, bool 
is_raw)
        if (!(file->f_mode & FMODE_READ))
                goto out;
 
-       ret = -ENOMEM;
-       deltas = kcalloc(level + 1, sizeof(*deltas), GFP_KERNEL);
-       if (!deltas)
-               goto out;
-       size = level * sizeof(*deltas);
-       memcpy(deltas, ploop->deltas, size);
        deltas[level].file = file;
        deltas[level].is_raw = is_raw;
 
diff --git a/drivers/md/dm-ploop-target.c b/drivers/md/dm-ploop-target.c
index b4a21840fba7..5581e2722e0b 100644
--- a/drivers/md/dm-ploop-target.c
+++ b/drivers/md/dm-ploop-target.c
@@ -111,10 +111,23 @@ static int ploop_check_origin_dev(struct dm_target *ti, 
struct ploop *ploop)
 
 static int ploop_add_deltas_stack(struct ploop *ploop, char **argv, int argc)
 {
-       int i, delta_fd, ret;
+       struct ploop_delta *deltas;
+       int i, delta_fd, ret = 0;
        const char *arg;
        bool is_raw;
 
+       if (!argc)
+               goto out;
+       ret = -EINVAL;
+       if (argc > BAT_LEVEL_TOP - 1)
+               goto out;
+
+       ret = -ENOMEM;
+       deltas = kcalloc(argc, sizeof(*deltas), GFP_KERNEL);
+       if (!deltas)
+               goto out;
+       ploop->deltas = deltas;
+
        ret = -EINVAL;
        for (i = 0; i < argc; i++) {
                arg = argv[i];


_______________________________________________
Devel mailing list
Devel@openvz.org
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to