[libvirt] [PATCHv1 09/13] Split out qemu-img command generation
Peter Krempa
pkrempa at redhat.com
Mon Apr 13 07:03:40 UTC 2015
On Fri, Apr 10, 2015 at 14:59:01 +0200, Ján Tomko wrote:
> Do not require the volume definition.
> This will allow code reuse when creating snapshots.
> ---
> src/storage/storage_backend.c | 203 +++++++++++++++++++++++-------------------
> 1 file changed, 109 insertions(+), 94 deletions(-)
>
> diff --git a/src/storage/storage_backend.c b/src/storage/storage_backend.c
> index f5b95ec..bfbc193 100644
> --- a/src/storage/storage_backend.c
> +++ b/src/storage/storage_backend.c
> @@ -870,38 +870,16 @@ virStorageBackendCreateQemuImgOpts(char **opts,
> return -1;
> }
>
> -/* Create a qemu-img virCommand from the supplied binary path,
> - * volume definitions and imgformat
> - */
> -virCommandPtr
> -virStorageBackendCreateQemuImgCmdFromVol(virConnectPtr conn,
> - virStoragePoolObjPtr pool,
> - virStorageVolDefPtr vol,
> - virStorageVolDefPtr inputvol,
> - unsigned int flags,
> - const char *create_tool,
> - int imgformat)
> +static virCommandPtr
> +virStorageBackendCreateQemuImgCmd(const char *create_tool,
> + int imgformat,
> + struct _virStorageBackendQemuImgInfo info)
> {
> virCommandPtr cmd = NULL;
> - const char *type;
> + const char *type = NULL;
> const char *backingType = NULL;
> const char *inputType = NULL;
> char *opts = NULL;
> - struct _virStorageBackendQemuImgInfo info = {
> - .format = vol->target.format,
> - .path = vol->target.path,
> - .encryption = vol->target.encryption != NULL,
> - .preallocate = !!(flags & VIR_STORAGE_VOL_CREATE_PREALLOC_METADATA),
> - .compat = vol->target.compat,
> - .features = vol->target.features,
> - .nocow = vol->target.nocow,
> - };
> -
> - virCheckFlags(VIR_STORAGE_VOL_CREATE_PREALLOC_METADATA, NULL);
> -
> - /* Treat output block devices as 'raw' format */
> - if (vol->type == VIR_STORAGE_VOL_BLOCK)
> - info.format = VIR_STORAGE_FILE_RAW;
>
> if (!(type = virStorageFileFormatTypeToString(info.format))) {
> virReportError(VIR_ERR_INTERNAL_ERROR,
> @@ -926,6 +904,107 @@ virStorageBackendCreateQemuImgCmdFromVol(virConnectPtr conn,
> return NULL;
> }
>
> + if (info.inputPath &&
> + !(inputType = virStorageFileFormatTypeToString(info.inputFormat))) {
> + virReportError(VIR_ERR_INTERNAL_ERROR,
> + _("unknown storage vol type %d"),
> + info.inputFormat);
> + return NULL;
> + }
> +
> + if (info.backingPath) {
> + if (info.preallocate) {
> + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> + _("metadata preallocation conflicts with backing"
> + " store"));
> + return NULL;
> + }
> +
> + if (!(backingType = virStorageFileFormatTypeToString(info.backingFormat))) {
> + virReportError(VIR_ERR_INTERNAL_ERROR,
> + _("unknown storage vol backing store type %d"),
> + info.backingFormat);
> + return NULL;
> + }
> + }
> +
> + /* ignore the backing volume when we're converting a volume */
> + if (info.inputPath) {
> + info.backingPath = NULL;
> + backingType = NULL;
> + }
Shouldn't this go before you bother to check if the backing info is
correct?
> +
> + cmd = virCommandNew(create_tool);
> +
> + if (info.inputPath)
> + virCommandAddArgList(cmd, "convert", "-f", inputType, "-O", type, NULL);
> + else
> + virCommandAddArgList(cmd, "create", "-f", type, NULL);
> +
> + if (info.backingPath)
> + virCommandAddArgList(cmd, "-b", info.backingPath, NULL);
> +
> + if (imgformat >= QEMU_IMG_BACKING_FORMAT_OPTIONS) {
> + if (info.format == VIR_STORAGE_FILE_QCOW2 && !info.compat &&
> + imgformat == QEMU_IMG_BACKING_FORMAT_OPTIONS_COMPAT)
> + info.compat = "0.10";
> +
> + if (virStorageBackendCreateQemuImgOpts(&opts, info) < 0) {
> + virCommandFree(cmd);
> + return NULL;
> + }
> + if (opts)
> + virCommandAddArgList(cmd, "-o", opts, NULL);
> + VIR_FREE(opts);
> + } else {
> + if (info.backingPath) {
> + if (imgformat == QEMU_IMG_BACKING_FORMAT_FLAG)
> + virCommandAddArgList(cmd, "-F", backingType, NULL);
> + else
> + VIR_DEBUG("Unable to set backing store format for %s with %s",
> + info.path, create_tool);
> + }
> + if (info.encryption)
> + virCommandAddArg(cmd, "-e");
> + }
> +
> + if (info.inputPath)
> + virCommandAddArg(cmd, info.inputPath);
> + virCommandAddArg(cmd, info.path);
> + if (!info.inputPath && info.size_arg)
> + virCommandAddArgFormat(cmd, "%lluK", info.size_arg);
> + return cmd;
> +}
Looks good otherwise.
Peter
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: Digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20150413/a45dee64/attachment-0001.sig>
More information about the libvir-list
mailing list