{ .name = "btrfs", .ops = &btrfs_ops, },
{ .name = "dir", .ops = &dir_ops, },
{ .name = "aufs", .ops = &aufs_ops, },
- { .name = "overlay", .ops = &ovl_ops, },
{ .name = "overlayfs", .ops = &ovl_ops, },
{ .name = "loop", .ops = &loop_ops, },
{ .name = "nbd", .ops = &nbd_ops, },
*/
if (!bdevtype && !keepbdevtype && snap &&
strcmp(orig->type, "dir") == 0)
- bdevtype = "overlay";
+ bdevtype = "overlayfs";
if (am_unpriv() && !unpriv_snap_allowed(orig, bdevtype, snap, maybe_snap)) {
- ERROR("Unsupported snapshot type \"%s\" for unprivileged users",
- bdevtype ? bdevtype : "(null)");
+ ERROR("Unsupported snapshot type for unprivileged users");
bdev_put(orig);
return NULL;
}
*needs_rdep = 0;
if (bdevtype && strcmp(orig->type, "dir") == 0 &&
(strcmp(bdevtype, "aufs") == 0 ||
- strcmp(bdevtype, "overlayfs") == 0 ||
- strcmp(bdevtype, "overlay") == 0)) {
+ strcmp(bdevtype, "overlayfs") == 0)) {
*needs_rdep = 1;
} else if (snap && strcmp(orig->type, "lvm") == 0 &&
!lvm_is_thin_volume(orig->src)) {
goto err;
}
- if (!strcmp(new->type, "overlay") || !strcmp(new->type, "overlayfs"))
- src_no_prefix = ovl_get_lower(new->src);
- else
- src_no_prefix = lxc_storage_get_path(new->src, new->type);
+ 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);
#include "lxccontainer.h"
#include "lxcoverlay.h"
#include "lxcrsync.h"
-#include "storage_utils.h"
#include "utils.h"
lxc_log_define(lxcoverlay, lxc);
static char *ovl_name;
static char *ovl_version[] = {"overlay", "overlayfs"};
+/* 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);
+
static char *ovl_detect_name(void);
static int ovl_do_rsync(struct bdev *orig, struct bdev *new,
struct lxc_conf *conf);
char *src;
if (!snap) {
- ERROR("overlay is only for snapshot clones");
+ ERROR("overlayfs is only for snapshot clones");
return -22;
}
if (!orig->src || !orig->dest)
return -1;
- new->dest = lxc_string_join(
- "/", (const char *[]){lxcpath, cname, "rootfs", NULL}, false);
+ new->dest = dir_new_path(orig->dest, oldname, cname, oldpath, lxcpath);
if (!new->dest)
return -1;
-
if (mkdir_p(new->dest, 0755) < 0)
return -1;
free(delta);
return -ENOMEM;
}
- ret = snprintf(new->src, len, "overlay:%s:%s", src, delta);
+ ret = snprintf(new->src, len, "overlayfs:%s:%s", src, delta);
free(delta);
if (ret < 0 || ret >= len)
- return -1;
- } else if (!strcmp(orig->type, "overlayfs") || !strcmp(orig->type, "overlay")) {
+ return -ENOMEM;
+ } else if (strcmp(orig->type, "overlayfs") == 0) {
/*
* What exactly do we want to do here? I think we want to use
* the original lowerdir, with a private delta which is
char *osrc, *odelta, *nsrc, *ndelta, *work;
char *lastslash;
int len, ret, lastslashidx;
-
- osrc = strdup(orig->src);
- if (!osrc) {
- SYSERROR("Failed to duplicate \"%s\"", orig->src);
+ if (!(osrc = strdup(orig->src)))
return -22;
- }
-
nsrc = strchr(osrc, ':') + 1;
- if ((nsrc != osrc + 8) && (nsrc != osrc + 10)) {
- free(osrc);
- ERROR("Detected \":\" in \"%s\" at wrong position", osrc);
- return -22;
- }
-
- odelta = strchr(nsrc, ':');
- if (!odelta) {
+ if (nsrc != osrc + 10 || (odelta = strchr(nsrc, ':')) == NULL) {
free(osrc);
- ERROR("Failed to find \":\" in \"%s\"", nsrc);
return -22;
}
-
*odelta = '\0';
odelta++;
- ndelta = lxc_string_join("/", (const char *[]){lxcpath, cname, "rootfs", NULL}, false);
- if (!ndelta) {
+ ndelta = dir_new_path(odelta, oldname, cname, oldpath, lxcpath);
+ if (!ndelta) {
free(osrc);
- ERROR("Failed to create new path");
return -ENOMEM;
- }
-
- ret = mkdir(ndelta, 0755);
- if (ret < 0 && errno != EEXIST) {
+ }
+ if ((ret = mkdir(ndelta, 0755)) < 0 && errno != EEXIST) {
+ SYSERROR("error: mkdir %s", ndelta);
free(osrc);
free(ndelta);
- SYSERROR("Failed to create \"%s\"", ndelta);
return -1;
}
-
if (am_unpriv() && chown_mapped_root(ndelta, conf) < 0)
WARN("Failed to update ownership of %s", ndelta);
if (!lastslash) {
free(osrc);
free(ndelta);
- ERROR("Failed to detect \"/\" in \"%s\"", ndelta);
return -1;
}
lastslash++;
if (!work) {
free(osrc);
free(ndelta);
- ERROR("Failed to allocate memory");
return -1;
}
strncpy(work, ndelta, lastslashidx + 1);
strcpy(work + lastslashidx, "olwork");
- ret = mkdir(work, 0755);
- if (ret < 0 && errno != EEXIST) {
+ if ((mkdir(work, 0755) < 0) && errno != EEXIST) {
+ SYSERROR("error: mkdir %s", work);
free(osrc);
free(ndelta);
free(work);
- SYSERROR("Failed to create \"%s\"", ndelta);
return -1;
}
-
if (am_unpriv() && chown_mapped_root(work, conf) < 0)
WARN("Failed to update ownership of %s", work);
free(work);
- len = strlen(nsrc) + strlen(ndelta) + 10;
+ len = strlen(nsrc) + strlen(ndelta) + 12;
new->src = malloc(len);
if (!new->src) {
free(osrc);
free(ndelta);
- ERROR("Failed to allocate memory");
return -ENOMEM;
}
- ret = snprintf(new->src, len, "overlay:%s:%s", nsrc, ndelta);
+ ret = snprintf(new->src, len, "overlayfs:%s:%s", nsrc, ndelta);
free(osrc);
free(ndelta);
- if (ret < 0 || ret >= len) {
- ERROR("Failed to create string");
- return -1;
- }
+ if (ret < 0 || ret >= len)
+ return -ENOMEM;
return ovl_do_rsync(orig, new, conf);
} else {
- ERROR("overlay clone of %s container is not yet supported",
+ ERROR("overlayfs clone of %s container is not yet supported",
orig->type);
/*
* Note, supporting this will require ovl_mount supporting
}
/*
- * to say 'lxc-create -t ubuntu -n o1 -B overlay' means you want
+ * to say 'lxc-create -t ubuntu -n o1 -B overlayfs' means you want
* $lxcpath/$lxcname/rootfs to have the created container, while all
* changes after starting the container are written to
* $lxcpath/$lxcname/delta0
return -1;
}
- // overlay:lower:upper
- newlen = (2 * len) + strlen("overlay:") + 2;
+ // overlayfs:lower:upper
+ newlen = (2 * len) + strlen("overlayfs:") + 2;
bdev->src = malloc(newlen);
if (!bdev->src) {
ERROR("Out of memory");
return -1;
}
- ret = snprintf(bdev->src, newlen, "overlay:%s:%s", dest, delta);
+ ret = snprintf(bdev->src, newlen, "overlayfs:%s:%s", dest, delta);
if (ret < 0 || ret >= newlen)
return -1;
int ovl_destroy(struct bdev *orig)
{
- bool ovl;
- char *upper = orig->src;
+ char *upper;
- ovl = !strncmp(upper, "overlay:", 8);
- if (!ovl && strncmp(upper, "overlayfs:", 10))
+ if (strncmp(orig->src, "overlayfs:", 10) != 0)
return -22;
-
- if (ovl)
- upper += 8;
- else
- upper += 10;
-
- upper = strchr(upper, ':');
+ upper = strchr(orig->src + 10, ':');
if (!upper)
return -22;
upper++;
-
return lxc_rmdir_onedev(upper, NULL);
}
return 0;
}
+char *ovl_getlower(char *p)
+{
+ char *p1 = strchr(p, ':');
+ if (p1)
+ *p1 = '\0';
+ return p;
+}
+
int ovl_mount(struct bdev *bdev)
{
char *tmp, *options, *dup, *lower, *upper;
char *mntdata;
int ret, ret2;
- if (strcmp(bdev->type, "overlay") && strcmp(bdev->type, "overlayfs"))
+ if (strcmp(bdev->type, "overlayfs"))
return -22;
-
if (!bdev->src || !bdev->dest)
return -22;
ret = ovl_remount_on_enodev(lower, bdev->dest, ovl_name,
MS_MGC_VAL | mntflags, options_work);
if (ret < 0) {
- INFO("Overlay: Error mounting %s onto %s with options %s. "
+ INFO("Overlayfs: Error mounting %s onto %s with options %s. "
"Retrying without workdir: %s.",
lower, bdev->dest, options_work, strerror(errno));
ret = ovl_remount_on_enodev(lower, bdev->dest, ovl_name,
MS_MGC_VAL | mntflags, options);
if (ret < 0)
- SYSERROR("Overlay: Error mounting %s onto %s with "
+ SYSERROR("Overlayfs: Error mounting %s onto %s with "
"options %s: %s.",
lower, bdev->dest, options,
strerror(errno));
else
- INFO("Overlay: Mounted %s onto %s with options %s.",
+ INFO("Overlayfs: Mounted %s onto %s with options %s.",
lower, bdev->dest, options);
} else {
- INFO("Overlay: Mounted %s onto %s with options %s.", lower,
+ INFO("Overlayfs: Mounted %s onto %s with options %s.", lower,
bdev->dest, options_work);
}
return ret;
int ovl_umount(struct bdev *bdev)
{
- if (strcmp(bdev->type, "overlay") && strcmp(bdev->type, "overlayfs"))
+ if (strcmp(bdev->type, "overlayfs"))
return -22;
-
if (!bdev->src || !bdev->dest)
return -22;
-
return umount(bdev->dest);
}
-char *ovl_get_lower(const char *rootfs_path)
-{
- char *s1;
- s1 = strstr(rootfs_path, ":/");
- if (!s1)
- return NULL;
- s1++;
-
- s1 = strstr(s1, ":/");
- if (!s1)
- return NULL;
- s1++;
-
- return s1;
-}
-
char *ovl_get_rootfs(const char *rootfs_path, size_t *rootfslen)
{
char *rootfsdir = NULL;
else
ret = ovl_rsync(&rdata);
if (ret)
- ERROR("copying overlay delta");
+ ERROR("copying overlayfs delta");
return ret;
}