]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
btrfs: simplify + bugfix
authorChristian Brauner <christian.brauner@ubuntu.com>
Sat, 15 Jul 2017 13:34:39 +0000 (15:34 +0200)
committerChristian Brauner <christian.brauner@ubuntu.com>
Mon, 31 Jul 2017 21:34:13 +0000 (23:34 +0200)
Closes #1698.
Closes #1703.

Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
src/lxc/bdev/bdev.c
src/lxc/bdev/lxcbtrfs.c

index bef79f70f4e628ec77fc9d8105751edc956ab0f8..ffc9d46a092bd4b26fa796aae4421b5b80285a98 100644 (file)
@@ -392,7 +392,7 @@ struct bdev *bdev_copy(struct lxc_container *c0, const char *cname,
                *needs_rdep = 1;
        }
 
-       if (strcmp(oldpath, lxcpath) && !bdevtype)
+       if (strcmp(oldpath, lxcpath) && !bdevtype && !snap)
                bdevtype = "dir";
        else if (!bdevtype)
                bdevtype = orig->type;
@@ -403,6 +403,7 @@ struct bdev *bdev_copy(struct lxc_container *c0, const char *cname,
                bdev_put(orig);
                return NULL;
        }
+       TRACE("Detected \"%s\" storage driver", new->type);
 
        if (new->ops->clone_paths(orig, new, oldname, cname, oldpath, lxcpath,
                                  snap, newsize, c0->lxc_conf) < 0) {
index 1defa76eea2378c3ee03cce557fa6eac330cbdaf..07265490774af8006611d84552ecdacba8491478 100644 (file)
@@ -32,6 +32,7 @@
 #include <unistd.h>
 #include <sys/ioctl.h>
 #include <sys/stat.h>
+#include <sys/wait.h>
 #include <sys/types.h>
 #include <sys/vfs.h>
 
 #include "log.h"
 #include "lxcbtrfs.h"
 #include "lxcrsync.h"
-#include "utils.h"
+#include "../utils.h"
 
 lxc_log_define(lxcbtrfs, lxc);
 
-/* defined in lxccontainer.c: needs to become common helper */
-extern char *dir_new_path(char *src, const char *oldname, const char *name,
-                         const char *oldpath, const char *lxcpath);
-
 /*
  * Return the full path of objid under dirid.  Let's say dirid is
  * /lxc/c1/rootfs, and objid is /lxc/c1/rootfs/a/b/c.  Then we will
@@ -380,30 +377,20 @@ int btrfs_clonepaths(struct bdev *orig, struct bdev *new, const char *oldname,
        if (!orig->dest || !orig->src)
                return -1;
 
-       if (strcmp(orig->type, "btrfs")) {
-               int len, ret;
-               if (snap) {
-                       ERROR("btrfs snapshot from %s backing store is not supported",
-                               orig->type);
-                       return -1;
-               }
-
-               len = strlen(lxcpath) + strlen(cname) + strlen("rootfs") + 6 + 3;
-               new->src = malloc(len);
-               if (!new->src)
-                       return -1;
-
-               ret = snprintf(new->src, len, "btrfs:%s/%s/rootfs", lxcpath, cname);
-               if (ret < 0 || ret >= len)
-                       return -1;
-       } else {
-               /* In case rootfs is in custom path, reuse it. */
-               new->src = dir_new_path(orig->src, oldname, cname, oldpath, lxcpath);
-               if (!new->src)
-                       return -1;
-
+       if (strcmp(orig->type, "btrfs") && snap) {
+               ERROR("btrfs snapshot from %s backing store is not supported",
+                     orig->type);
+               return -1;
        }
 
+       new->src = lxc_string_join(
+           "/",
+           (const char *[]){"btrfs:", *lxcpath != '/' ? lxcpath : ++lxcpath,
+                            cname, "rootfs", NULL},
+           false);
+       if (!new->src)
+               return -1;
+
        src = lxc_storage_get_path(new->src, "btrfs");
        new->dest = strdup(src);
        if (!new->dest)