clean up error case in clone, which in particular could cause double lxc_container_put(c2)
for overlayfs, handle (with error message) all bdev types. Signed-off-by: Serge Hallyn <serge.hal...@ubuntu.com> --- src/lxc/bdev.c | 11 ++++++----- src/lxc/lxccontainer.c | 25 +++++++------------------ 2 files changed, 13 insertions(+), 23 deletions(-) diff --git a/src/lxc/bdev.c b/src/lxc/bdev.c index 1de302f..9408918 100644 --- a/src/lxc/bdev.c +++ b/src/lxc/bdev.c @@ -1186,11 +1186,6 @@ static int overlayfs_clonepaths(struct bdev *orig, struct bdev *new, const char free(delta); if (ret < 0 || ret >= len) return -ENOMEM; - } else if (strcmp(orig->type, "lvm") == 0) { - ERROR("overlayfs clone of lvm container is not yet supported"); - // Note, supporting this will require overlayfs_mount supporting - // mounting of the underlay. No big deal, just needs to be done. - return -1; } 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 @@ -1228,6 +1223,12 @@ static int overlayfs_clonepaths(struct bdev *orig, struct bdev *new, const char free(ndelta); if (ret < 0 || ret >= len) return -ENOMEM; + } else { + ERROR("overlayfs clone of %s container is not yet supported", + orig->type); + // Note, supporting this will require overlayfs_mount supporting + // mounting of the underlay. No big deal, just needs to be done. + return -1; } return 0; diff --git a/src/lxc/lxccontainer.c b/src/lxc/lxccontainer.c index 10f188e..452323c 100644 --- a/src/lxc/lxccontainer.c +++ b/src/lxc/lxccontainer.c @@ -1477,7 +1477,7 @@ struct lxc_container *lxcapi_clone(struct lxc_container *c, const char *newname, } c2 = lxc_container_new(n, l); - if (!c) { + if (!c2) { ERROR("clone: failed to create new container (%s %s)", n, l); goto out; } @@ -1487,16 +1487,12 @@ struct lxc_container *lxcapi_clone(struct lxc_container *c, const char *newname, ret = copyhooks(c, c2); if (ret < 0) { ERROR("error copying hooks"); - c2->destroy(c2); - lxc_container_put(c2); goto out; } } if (copy_fstab(c, c2) < 0) { ERROR("error copying fstab"); - c2->destroy(c2); - lxc_container_put(c2); goto out; } @@ -1506,23 +1502,14 @@ struct lxc_container *lxcapi_clone(struct lxc_container *c, const char *newname, // copy/snapshot rootfs's ret = copy_storage(c, c2, bdevtype, flags, bdevdata, newsize); - if (ret < 0) { - c2->destroy(c2); - lxc_container_put(c2); + if (ret < 0) goto out; - } - if (!c2->save_config(c2, NULL)) { - c2->destroy(c2); - lxc_container_put(c2); + if (!c2->save_config(c2, NULL)) goto out; - } - if (clone_update_rootfs(c2, flags) < 0) { - //c2->destroy(c2); - lxc_container_put(c2); + if (clone_update_rootfs(c2, flags) < 0) goto out; - } // TODO: update c's lxc.snapshot = count lxcunlock(c->privlock); @@ -1530,8 +1517,10 @@ struct lxc_container *lxcapi_clone(struct lxc_container *c, const char *newname, out: lxcunlock(c->privlock); - if (c2) + if (c2) { + c2->destroy(c2); lxc_container_put(c2); + } return NULL; } -- 1.7.9.5 ------------------------------------------------------------------------------ Introducing AppDynamics Lite, a free troubleshooting tool for Java/.NET Get 100% visibility into your production application - at no cost. Code-level diagnostics for performance bottlenecks with <2% overhead Download for free and get started troubleshooting in minutes. http://p.sf.net/sfu/appdyn_d2d_ap1 _______________________________________________ Lxc-devel mailing list Lxc-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/lxc-devel