]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
storage: switch to new rsync functions
authorChristian Brauner <christian.brauner@ubuntu.com>
Mon, 24 Jul 2017 15:49:03 +0000 (17:49 +0200)
committerChristian Brauner <christian.brauner@ubuntu.com>
Mon, 31 Jul 2017 21:34:16 +0000 (23:34 +0200)
Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
src/lxc/bdev/bdev.c

index 96fe88c64ff4c3ef8dd1e9cd677a92b53078823f..f4fea6b2ef02c3eba4a713ccbcad7cc73df69475 100644 (file)
@@ -326,7 +326,6 @@ struct bdev *bdev_copy(struct lxc_container *c0, const char *cname,
                       const char *bdevdata, uint64_t newsize, int *needs_rdep)
 {
        struct bdev *orig, *new;
-       pid_t pid;
        int ret;
        char *src_no_prefix;
        bool snap = flags & LXC_CLONE_SNAPSHOT;
@@ -336,6 +335,7 @@ struct bdev *bdev_copy(struct lxc_container *c0, const char *cname,
        const char *oldname = c0->name;
        const char *oldpath = c0->config_path;
        struct rsync_data data;
+       char cmd_output[MAXPATHLEN];
 
        /* If the container name doesn't show up in the rootfs path, then we
         * don't know how to come up with a new name.
@@ -475,33 +475,28 @@ struct bdev *bdev_copy(struct lxc_container *c0, const char *cname,
                return new;
 
        /* rsync the contents from source to target */
-       pid = fork();
-       if (pid < 0) {
-               SYSERROR("fork");
-               goto err;
-       }
-
-       if (pid > 0) {
-               int ret = wait_for_pid(pid);
-               bdev_put(orig);
+       data.orig = orig;
+       data.new = new;
+       if (am_unpriv()) {
+               ret = userns_exec_1(c0->lxc_conf, lxc_rsync_exec_wrapper, &data,
+                                   "lxc_rsync_exec_wrapper");
                if (ret < 0) {
-                       bdev_put(new);
-                       return NULL;
+                       ERROR("Failed to rsync from \"%s\" into \"%s\"",
+                             orig->dest, new->dest);
+                       goto err;
+               }
+       } else {
+               ret = run_command(cmd_output, sizeof(cmd_output),
+                                 lxc_rsync_exec_wrapper, (void *)&data);
+               if (ret < 0) {
+                       ERROR("Failed to rsync from \"%s\" into \"%s\": %s",
+                             orig->dest, new->dest, cmd_output);
+                       goto err;
                }
-               return new;
        }
 
-       data.orig = orig;
-       data.new = new;
-       if (am_unpriv())
-               ret = userns_exec_1(c0->lxc_conf, rsync_rootfs_wrapper, &data,
-                                   "rsync_rootfs_wrapper");
-       else
-               ret = rsync_rootfs(&data);
-       if (ret < 0)
-               ERROR("Failed to rsync from");
-
-       exit(ret == 0 ? 0 : 1);
+       bdev_put(orig);
+       return new;
 
 err:
        bdev_put(orig);