*p = '\0';
fd = open(newfull, O_RDONLY);
+ free(newfull);
if (fd < 0) {
- free(newfull);
return -errno;
}
saved_errno = errno;
close(fd);
- free(newfull);
errno = saved_errno;
return ret;
}
bool btrfs_create_clone(struct lxc_conf *conf, struct bdev *orig,
struct bdev *new, uint64_t newsize)
{
- int ret;
- struct rsync_data data = {0, 0};
- char cmd_output[MAXPATHLEN] = {0};
+ int pid, ret;
+ struct rsync_data data;
ret = rmdir(new->dest);
if (ret < 0 && errno != ENOENT)
return false;
}
- /* rsync the contents from source to target */
- data.orig = orig;
- data.new = new;
- if (am_unpriv()) {
- ret = userns_exec_1(conf, lxc_rsync_exec_wrapper, &data,
- "lxc_rsync_exec_wrapper");
+ /* rsync contents */
+ pid = fork();
+ if (pid < 0) {
+ SYSERROR("fork");
+ return false;
+ }
+
+ if (pid > 0) {
+ int ret = wait_for_pid(pid);
+ bdev_put(orig);
if (ret < 0) {
- ERROR("Failed to rsync from \"%s\" into \"%s\"",
- orig->dest, new->dest);
+ bdev_put(new);
return false;
}
-
return true;
}
- ret = run_command(cmd_output, sizeof(cmd_output),
- lxc_rsync_exec_wrapper, (void *)&data);
+ data.orig = orig;
+ data.new = new;
+
+ if (am_unpriv())
+ ret = userns_exec_1(conf, rsync_rootfs_wrapper, &data,
+ "rsync_rootfs_wrapper");
+ else
+ ret = rsync_rootfs(&data);
if (ret < 0) {
- ERROR("Failed to rsync from \"%s\" into \"%s\": %s", orig->dest,
- new->dest, cmd_output);
+ ERROR("Failed to rsync");
return false;
}
+ TRACE("Created btrfs subvolume \"%s\"", new->dest);
return true;
}
/* strlen("btrfs:") */
len += 6;
bdev->src = malloc(len);
- if (!bdev->src) {
- ERROR("Failed to allocate memory");
+ if (!bdev->src)
return -1;
- }
ret = snprintf(bdev->src, len, "btrfs:%s", dest);
- if (ret < 0 || (size_t)ret >= len) {
- ERROR("Failed to create string");
+ if (ret < 0 || (size_t)ret >= len)
return -1;
- }
bdev->dest = strdup(dest);
- if (!bdev->dest) {
- ERROR("Failed to duplicate string \"%s\"", dest);
+ if (!bdev->dest)
return -1;
- }
- ret = btrfs_subvolume_create(bdev->dest);
- if (ret < 0) {
- SYSERROR("Failed to create btrfs subvolume \"%s\"", bdev->dest);
- }
-
- return ret;
+ return btrfs_subvolume_create(bdev->dest);
}