On Mon, Apr 11, 2016 at 07:16:20PM +0300, Olga Krishtal wrote: > These callbacks let us to create ploop volumes in dir, fs and etc. pools. > If a ploop volume was created via buildVol callback, then this volume > is an empty ploop device with DiskDescriptor.xml. > If the volume was created via .buildFrom - then its content is similar to > input volume content. > > Signed-off-by: Olga Krishtal <okrishtal@xxxxxxxxxxxxx> > --- > src/storage/storage_backend.c | 78 ++++++++++++++++++++++++++++++++++++++++ > src/storage/storage_backend.h | 8 +++++ > src/storage/storage_backend_fs.c | 2 ++ > 3 files changed, 88 insertions(+) > > diff --git a/src/storage/storage_backend.c b/src/storage/storage_backend.c > index 231eccf..d109980 100644 > --- a/src/storage/storage_backend.c > +++ b/src/storage/storage_backend.c > @@ -773,6 +773,81 @@ virStorageBackendCreateExecCommand(virStoragePoolObjPtr pool, > return ret; > } > > +/* Create ploop directory with ploop image and DiskDescriptor.xml > + * if function fails to create image file the directory will be deleted.*/ > +int > +virStorageBackendCreatePloop(virConnectPtr conn ATTRIBUTE_UNUSED, > + virStoragePoolObjPtr pool ATTRIBUTE_UNUSED, > + virStorageVolDefPtr vol, > + virStorageVolDefPtr inputvol, > + unsigned int flags) > +{ > + int ret = -1; > + virCommandPtr cmd = NULL; > + char *create_tool = NULL; > + > + virCheckFlags(0, -1); > + > + if (inputvol && inputvol->target.format != VIR_STORAGE_FILE_PLOOP) { > + virReportError(VIR_ERR_INTERNAL_ERROR, > + _("unsupported input storage vol type %d"), > + inputvol->target.format); > + goto cleanup; > + } > + > + if (vol->target.encryption != NULL) { > + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", > + _("encrypted ploop volumes are not supported with " > + "ploop init")); > + goto cleanup; > + } > + > + if (vol->target.backingStore != NULL) { > + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", > + _("copy-on-write ploop volumes are not yet supported")); > + goto cleanup; > + } > + > + create_tool = virFindFileInPath("ploop"); > + if (!create_tool && !inputvol) { > + virReportError(VIR_ERR_INTERNAL_ERROR, > + "%s", _("unable to find ploop, please install " > + "ploop tools")); > + return ret; > + } > + All the errors above can just 'return -1;', there is nothing to clean up. > + if (!inputvol) { > + if ((virDirCreate(vol->target.path, > + (vol->target.perms->mode == (mode_t) -1 ? > + VIR_STORAGE_DEFAULT_VOL_PERM_MODE: > + vol->target.perms->mode), > + vol->target.perms->uid, > + vol->target.perms->gid, > + 0)) < 0) { > + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", > + _("error creating directory for ploop volume")); > + goto cleanup; > + } > + cmd = virCommandNewArgList(create_tool, "init", "-s", NULL); > + virCommandAddArgFormat(cmd, "%lluM", VIR_DIV_UP(vol->target.capacity, > + (1024 * 1024))); > + virCommandAddArgList(cmd, "-t", "ext4", NULL); > + virCommandAddArgFormat(cmd, "%s/root.hds", vol->target.path); > + > + } else { > + vol->target.capacity = inputvol->target.capacity; > + cmd = virCommandNewArgList("cp", "-r", inputvol->target.path, > + vol->target.path, NULL); > + } > + ret = virCommandRun(cmd, NULL); > + cleanup: > + virCommandFree(cmd); > + VIR_FREE(create_tool); > + if (ret < 0) > + virFileDeleteTree(vol->target.path); virDirCreate cleans up after itself if it fails - we don't need to delete it in this case. > + return ret; > +} > + > enum { > QEMU_IMG_BACKING_FORMAT_NONE = 0, > QEMU_IMG_BACKING_FORMAT_FLAG, > @@ -1291,6 +1366,9 @@ virStorageBackendGetBuildVolFromFunction(virStorageVolDefPtr vol, > return virStorageBackendFSImageToolTypeToFunc(tool_type); > } > > + if (vol->type == VIR_STORAGE_VOL_PLOOP && > + inputvol->type == VIR_STORAGE_VOL_PLOOP) After removing the inputvol->type check, libvirt will output the nicer error message in virStorageBackendCreatePloop if it has a different type. > + return virStorageBackendCreatePloop; > if (vol->type == VIR_STORAGE_VOL_BLOCK) > return virStorageBackendCreateBlockFrom; > else I have squashed the following changes in: Jan diff --git a/src/storage/storage_backend.c b/src/storage/storage_backend.c index d109980..6a035a2 100644 --- a/src/storage/storage_backend.c +++ b/src/storage/storage_backend.c @@ -785,6 +785,7 @@ virStorageBackendCreatePloop(virConnectPtr conn ATTRIBUTE_UNUSED, int ret = -1; virCommandPtr cmd = NULL; char *create_tool = NULL; + bool created = false; virCheckFlags(0, -1); @@ -792,20 +793,20 @@ virStorageBackendCreatePloop(virConnectPtr conn ATTRIBUTE_UNUSED, virReportError(VIR_ERR_INTERNAL_ERROR, _("unsupported input storage vol type %d"), inputvol->target.format); - goto cleanup; + return -1; } if (vol->target.encryption != NULL) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("encrypted ploop volumes are not supported with " "ploop init")); - goto cleanup; + return -1; } if (vol->target.backingStore != NULL) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("copy-on-write ploop volumes are not yet supported")); - goto cleanup; + return -1; } create_tool = virFindFileInPath("ploop"); @@ -813,7 +814,7 @@ virStorageBackendCreatePloop(virConnectPtr conn ATTRIBUTE_UNUSED, virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("unable to find ploop, please install " "ploop tools")); - return ret; + return -1; } if (!inputvol) { @@ -839,11 +840,12 @@ virStorageBackendCreatePloop(virConnectPtr conn ATTRIBUTE_UNUSED, cmd = virCommandNewArgList("cp", "-r", inputvol->target.path, vol->target.path, NULL); } + created = true; ret = virCommandRun(cmd, NULL); cleanup: virCommandFree(cmd); VIR_FREE(create_tool); - if (ret < 0) + if (ret < 0 && created) virFileDeleteTree(vol->target.path); return ret; } @@ -1366,8 +1368,7 @@ virStorageBackendGetBuildVolFromFunction(virStorageVolDefPtr vol, return virStorageBackendFSImageToolTypeToFunc(tool_type); } - if (vol->type == VIR_STORAGE_VOL_PLOOP && - inputvol->type == VIR_STORAGE_VOL_PLOOP) + if (vol->type == VIR_STORAGE_VOL_PLOOP) return virStorageBackendCreatePloop; if (vol->type == VIR_STORAGE_VOL_BLOCK) return virStorageBackendCreateBlockFrom; -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list