Revert "storage: prefix all zfs paths"

This reverts commit aa7802e1. Signed-off-by: 's avatarChristian Brauner <christian.brauner@ubuntu.com>
parent 4e30cce1
...@@ -85,23 +85,20 @@ int zfs_detect(const char *path) ...@@ -85,23 +85,20 @@ int zfs_detect(const char *path)
int zfs_mount(struct bdev *bdev) int zfs_mount(struct bdev *bdev)
{ {
int ret;
char *mntdata, *src;
unsigned long mntflags;
if (strcmp(bdev->type, "zfs")) if (strcmp(bdev->type, "zfs"))
return -22; return -22;
if (!bdev->src || !bdev->dest) if (!bdev->src || !bdev->dest)
return -22; return -22;
char *mntdata;
unsigned long mntflags;
if (parse_mntopts(bdev->mntopts, &mntflags, &mntdata) < 0) { if (parse_mntopts(bdev->mntopts, &mntflags, &mntdata) < 0) {
free(mntdata); free(mntdata);
return -22; return -22;
} }
src = lxc_storage_get_path(bdev->src, bdev->type); int ret = mount(bdev->src, bdev->dest, "bind", MS_BIND | MS_REC | mntflags, mntdata);
ret = mount(src, bdev->dest, "bind", MS_BIND | MS_REC | mntflags, mntdata);
free(mntdata); free(mntdata);
return ret; return ret;
...@@ -208,7 +205,6 @@ int zfs_clonepaths(struct bdev *orig, struct bdev *new, const char *oldname, ...@@ -208,7 +205,6 @@ int zfs_clonepaths(struct bdev *orig, struct bdev *new, const char *oldname,
const char *cname, const char *oldpath, const char *lxcpath, int snap, const char *cname, const char *oldpath, const char *lxcpath, int snap,
uint64_t newsize, struct lxc_conf *conf) uint64_t newsize, struct lxc_conf *conf)
{ {
char *origsrc, *newsrc;
int len, ret; int len, ret;
if (!orig->src || !orig->dest) if (!orig->src || !orig->dest)
...@@ -219,22 +215,19 @@ int zfs_clonepaths(struct bdev *orig, struct bdev *new, const char *oldname, ...@@ -219,22 +215,19 @@ int zfs_clonepaths(struct bdev *orig, struct bdev *new, const char *oldname,
return -1; return -1;
} }
len = strlen(lxcpath) + strlen(cname) + strlen("rootfs") + 4 + 3; len = strlen(lxcpath) + strlen(cname) + strlen("rootfs") + 3;
new->src = malloc(len); new->src = malloc(len);
if (!new->src) if (!new->src)
return -1; return -1;
ret = snprintf(new->src, len, "zfs:%s/%s/rootfs", lxcpath, cname); ret = snprintf(new->src, len, "%s/%s/rootfs", lxcpath, cname);
if (ret < 0 || ret >= len) if (ret < 0 || ret >= len)
return -1; return -1;
newsrc = lxc_storage_get_path(new->src, new->type); if ((new->dest = strdup(new->src)) == NULL)
new->dest = strdup(newsrc);
if (!new->dest)
return -1; return -1;
origsrc = lxc_storage_get_path(orig->src, orig->type); return zfs_clone(orig->src, new->src, oldname, cname, lxcpath, snap);
return zfs_clone(origsrc, newsrc, oldname, cname, lxcpath, snap);
} }
/* /*
...@@ -246,15 +239,14 @@ int zfs_destroy(struct bdev *orig) ...@@ -246,15 +239,14 @@ int zfs_destroy(struct bdev *orig)
{ {
pid_t pid; pid_t pid;
char output[MAXPATHLEN]; char output[MAXPATHLEN];
char *p, *src; char *p;
if ((pid = fork()) < 0) if ((pid = fork()) < 0)
return -1; return -1;
if (pid) if (pid)
return wait_for_pid(pid); return wait_for_pid(pid);
src = lxc_storage_get_path(orig->src, orig->type); if (!zfs_list_entry(orig->src, output, MAXPATHLEN)) {
if (!zfs_list_entry(src, output, MAXPATHLEN)) {
ERROR("Error: zfs entry for %s not found", orig->src); ERROR("Error: zfs entry for %s not found", orig->src);
return -1; return -1;
} }
...@@ -268,64 +260,41 @@ int zfs_destroy(struct bdev *orig) ...@@ -268,64 +260,41 @@ int zfs_destroy(struct bdev *orig)
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
struct zfs_exec_args {
char *dataset;
char *options;
};
int zfs_create_exec_wrapper(void *args)
{
struct zfs_exec_args *zfs_args = args;
execlp("zfs", "zfs", "create", zfs_args->options, zfs_args->dataset,
(char *)NULL);
return -1;
}
int zfs_create(struct bdev *bdev, const char *dest, const char *n, int zfs_create(struct bdev *bdev, const char *dest, const char *n,
struct bdev_specs *specs) struct bdev_specs *specs)
{ {
const char *zfsroot; const char *zfsroot;
char cmd_output[MAXPATHLEN], dev[MAXPATHLEN], option[MAXPATHLEN]; char option[MAXPATHLEN];
int ret; int ret;
size_t len; pid_t pid;
struct zfs_exec_args cmd_args;
if (!specs || !specs->zfs.zfsroot) if (!specs || !specs->zfs.zfsroot)
zfsroot = lxc_global_config_value("lxc.bdev.zfs.root"); zfsroot = lxc_global_config_value("lxc.bdev.zfs.root");
else else
zfsroot = specs->zfs.zfsroot; zfsroot = specs->zfs.zfsroot;
bdev->dest = strdup(dest); if (!(bdev->dest = strdup(dest))) {
if (!bdev->dest) {
ERROR("No mount target specified or out of memory"); ERROR("No mount target specified or out of memory");
return -1; return -1;
} }
if (!(bdev->src = strdup(bdev->dest))) {
len = strlen(bdev->dest) + 1; ERROR("out of memory");
/* strlen("zfs:") */
len += 4;
bdev->src = malloc(len);
if (!bdev->src)
return -1;
ret = snprintf(bdev->src, len, "zfs:%s", bdev->dest);
if (ret < 0 || (size_t)ret >= len)
return -1; return -1;
}
ret = snprintf(option, MAXPATHLEN, "-omountpoint=%s", bdev->dest); ret = snprintf(option, MAXPATHLEN, "-omountpoint=%s", bdev->dest);
if (ret < 0 || ret >= MAXPATHLEN) if (ret < 0 || ret >= MAXPATHLEN)
return -1; return -1;
if ((pid = fork()) < 0)
return -1;
if (pid)
return wait_for_pid(pid);
char dev[MAXPATHLEN];
ret = snprintf(dev, MAXPATHLEN, "%s/%s", zfsroot, n); ret = snprintf(dev, MAXPATHLEN, "%s/%s", zfsroot, n);
if (ret < 0 || ret >= MAXPATHLEN) if (ret < 0 || ret >= MAXPATHLEN)
return -1; exit(EXIT_FAILURE);
cmd_args.options = option; execlp("zfs", "zfs", "create", option, dev, (char *)NULL);
cmd_args.dataset = dev; exit(EXIT_FAILURE);
ret = run_command(cmd_output, sizeof(cmd_output),
zfs_create_exec_wrapper, (void *)&cmd_args);
if (ret < 0)
ERROR("Failed to create zfs dataset \"%s\": %s", dev, cmd_output);
return ret;
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment