]> git.proxmox.com Git - mirror_lxc.git/commitdiff
storage: prefix all dir paths
authorChristian Brauner <christian.brauner@ubuntu.com>
Sat, 1 Jul 2017 20:36:27 +0000 (22:36 +0200)
committerChristian Brauner <christian.brauner@ubuntu.com>
Sun, 2 Jul 2017 12:40:04 +0000 (14:40 +0200)
Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
src/lxc/bdev/bdev.c
src/lxc/bdev/lxcdir.c
src/lxc/bdev/lxcrsync.c
src/lxc/lxccontainer.c

index 48f2c2759b05015dcbcedd088eff54b1872b2e57..1bc8afcd04c55800f71e12bc864a293017395ebe 100644 (file)
@@ -306,6 +306,7 @@ struct bdev *bdev_copy(struct lxc_container *c0, const char *cname,
        struct bdev *orig, *new;
        pid_t pid;
        int ret;
+       char *src_no_prefix;
        bool snap = flags & LXC_CLONE_SNAPSHOT;
        bool maybe_snap = flags & LXC_CLONE_MAYBE_SNAPSHOT;
        bool keepbdevtype = flags & LXC_CLONE_KEEPBDEVTYPE;
@@ -402,7 +403,9 @@ struct bdev *bdev_copy(struct lxc_container *c0, const char *cname,
                goto err;
        }
 
-       if (am_unpriv() && chown_mapped_root(new->src, c0->lxc_conf) < 0)
+       src_no_prefix = lxc_storage_get_path(new->src, new->type);
+
+       if (am_unpriv() && chown_mapped_root(src_no_prefix, c0->lxc_conf) < 0)
                WARN("Failed to update ownership of %s", new->dest);
 
        if (snap)
@@ -456,6 +459,8 @@ struct bdev *bdev_copy(struct lxc_container *c0, const char *cname,
                                    "rsync_rootfs_wrapper");
        else
                ret = rsync_rootfs(&data);
+       if (ret < 0)
+               ERROR("Failed to rsync");
 
        exit(ret == 0 ? 0 : 1);
 
index be897bb77acce6c77dbabf5caaf5e3db0bbda0f2..652d7e08f0b4030705178e60c4fe3d8ffc169585 100644 (file)
@@ -39,7 +39,8 @@ int dir_clonepaths(struct bdev *orig, struct bdev *new, const char *oldname,
                const char *cname, const char *oldpath, const char *lxcpath,
                int snap, uint64_t newsize, struct lxc_conf *conf)
 {
-       int len, ret;
+       int ret;
+       size_t len;
 
        if (snap) {
                ERROR("directories cannot be snapshotted.  Try aufs or overlayfs.");
@@ -49,38 +50,58 @@ int dir_clonepaths(struct bdev *orig, struct bdev *new, const char *oldname,
        if (!orig->dest || !orig->src)
                return -1;
 
-       len = strlen(lxcpath) + strlen(cname) + strlen("rootfs") + 3;
+       len = strlen(lxcpath) + strlen(cname) + strlen("rootfs") + 4 + 3;
        new->src = malloc(len);
        if (!new->src)
                return -1;
-       ret = snprintf(new->src, len, "%s/%s/rootfs", lxcpath, cname);
-       if (ret < 0 || ret >= len)
+
+       ret = snprintf(new->src, len, "dir:%s/%s/rootfs", lxcpath, cname);
+       if (ret < 0 || (size_t)ret >= len)
                return -1;
-       if ((new->dest = strdup(new->src)) == NULL)
+
+       new->dest = strdup(new->src + 4);
+       if (!new->dest)
                return -1;
 
        return 0;
 }
 
 int dir_create(struct bdev *bdev, const char *dest, const char *n,
-               struct bdev_specs *specs)
+              struct bdev_specs *specs)
 {
+       int ret;
+       const char *src;
+       size_t len;
+
+       /* strlen("dir:") */
+       len = 4;
        if (specs && specs->dir)
-               bdev->src = strdup(specs->dir);
+               src = specs->dir;
        else
-               bdev->src = strdup(dest);
+               src = dest;
+
+       len += strlen(src) + 1;
+       bdev->src = malloc(len);
+       if (!bdev->src)
+               return -1;
+
+       ret = snprintf(bdev->src, len, "dir:%s", src);
+       if (ret < 0 || (size_t)ret >= len)
+               return -1;
+
        bdev->dest = strdup(dest);
-       if (!bdev->src || !bdev->dest) {
-               ERROR("Out of memory");
+       if (!bdev->dest)
                return -1;
-       }
 
-       if (mkdir_p(bdev->src, 0755) < 0) {
-               ERROR("Error creating %s", bdev->src);
+       ret = mkdir_p(src, 0755);
+       if (ret < 0) {
+               ERROR("Failed to create %s", src);
                return -1;
        }
-       if (mkdir_p(bdev->dest, 0755) < 0) {
-               ERROR("Error creating %s", bdev->dest);
+
+       ret = mkdir_p(bdev->dest, 0755);
+       if (ret < 0) {
+               ERROR("Failed to create %s", bdev->dest);
                return -1;
        }
 
@@ -89,8 +110,13 @@ int dir_create(struct bdev *bdev, const char *dest, const char *n,
 
 int dir_destroy(struct bdev *orig)
 {
-       if (lxc_rmdir_onedev(orig->src, NULL) < 0)
+       char *src;
+
+       src = lxc_storage_get_path(orig->src, orig->src);
+
+       if (lxc_rmdir_onedev(src, NULL) < 0)
                return -1;
+
        return 0;
 }
 
@@ -101,17 +127,19 @@ int dir_detect(const char *path)
 
        if (is_dir(path))
                return 1;
+
        return 0;
 }
 
 int dir_mount(struct bdev *bdev)
 {
        unsigned long mntflags;
-       char *mntdata;
+       char *src, *mntdata;
        int ret;
 
        if (strcmp(bdev->type, "dir"))
                return -22;
+
        if (!bdev->src || !bdev->dest)
                return -22;
 
@@ -120,7 +148,9 @@ int dir_mount(struct bdev *bdev)
                return -22;
        }
 
-       ret = mount(bdev->src, bdev->dest, "bind", MS_BIND | MS_REC | mntflags, mntdata);
+       src = lxc_storage_get_path(bdev->src, bdev->type);
+
+       ret = mount(src, bdev->dest, "bind", MS_BIND | MS_REC | mntflags, mntdata);
        free(mntdata);
        return ret;
 }
@@ -129,7 +159,9 @@ int dir_umount(struct bdev *bdev)
 {
        if (strcmp(bdev->type, "dir"))
                return -22;
+
        if (!bdev->src || !bdev->dest)
                return -22;
+
        return umount(bdev->dest);
 }
index 8af39898ddda0450b32150c0e104411790a85c47..41eb881c4ac4c3996774b1312fc79cc64758aa00 100644 (file)
@@ -139,4 +139,3 @@ int rsync_rootfs_wrapper(void *data)
        struct rsync_data *arg = data;
        return rsync_rootfs(arg);
 }
-
index 26ae254107da886d7ba4f57aaa9effa2d892767c..56a34941dde59d23e5b2ffd4280cc2b631d6c4e5 100644 (file)
@@ -1154,8 +1154,10 @@ static bool create_run_template(struct lxc_container *c, char *tpath, bool need_
                                exit(1);
                        }
                } else { // TODO come up with a better way here!
+                       char *src;
                        free(bdev->dest);
-                       bdev->dest = strdup(bdev->src);
+                       src = lxc_storage_get_path(bdev->src, bdev->type);
+                       bdev->dest = strdup(src);
                }
 
                /*
@@ -1320,7 +1322,7 @@ static bool create_run_template(struct lxc_container *c, char *tpath, bool need_
                }
                /* execute */
                execvp(tpath, newargv);
-               SYSERROR("failed to execute template %s", tpath);
+               SYSERROR("Failed to execute template %s", tpath);
                exit(1);
        }