[libvirt] [PATCH 07/26] qemu: Allow qemuBuildControllerDevStr() to return NULL
Laine Stump
laine at laine.org
Mon Jun 12 14:58:44 UTC 2017
On 06/02/2017 12:07 PM, Andrea Bolognani wrote:
> We will soon need to be able to return a NULL pointer
> without the caller considering that an error: to make
> it possible, change the return type to int and use
> an out parameter for the string instead.
>
> Add some documentation for the function as well.
> ---
> src/qemu/qemu_command.c | 53 ++++++++++++++++++++++++++++++++++++-------------
> src/qemu/qemu_command.h | 9 +++++----
> src/qemu/qemu_hotplug.c | 5 ++++-
> 3 files changed, 48 insertions(+), 19 deletions(-)
>
> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
> index 015af10..a0403bf 100644
> --- a/src/qemu/qemu_command.c
> +++ b/src/qemu/qemu_command.c
> @@ -2664,10 +2664,31 @@ qemuCheckSCSIControllerIOThreads(const virDomainDef *domainDef,
> }
>
>
> -char *
> +/**
> + * qemuBuildControllerDevStr:
> + * @domainDef: domain definition
> + * @def: controller definition
> + * @qemuCaps: QEMU binary capabilities
> + * @devstr: device string
> + * @nusbcontroller: number of USB controllers
> + *
> + * Turn @def into a description of the controller that QEMU will understand,
> + * to be used either on the command line or through the monitor.
> + *
> + * The description will be returned in @devstr and can be NULL, eg. when
> + * passing in one of the built-in controllers. The returned string must be
> + * freed by the caller.
> + *
> + * The number pointed to by @nusbcontroller will be increased by one every
> + * time the description for a USB controller has been generated successfully.
> + *
> + * Returns: 0 on success, <0 on failure
> + */
> +int
> qemuBuildControllerDevStr(const virDomainDef *domainDef,
> virDomainControllerDefPtr def,
> virQEMUCapsPtr qemuCaps,
> + char **devstr,
> int *nusbcontroller)
> {
> virBuffer buf = VIR_BUFFER_INITIALIZER;
Maybe initialize *devstr to NULL in case the caller hasn't?
Reviewed-by: Laine Stump <laine at laine.org>
> @@ -2676,11 +2697,11 @@ qemuBuildControllerDevStr(const virDomainDef *domainDef,
>
> if (!qemuCheckCCWS390AddressSupport(domainDef, def->info, qemuCaps,
> "controller"))
> - return NULL;
> + return -1;
>
> if (def->type == VIR_DOMAIN_CONTROLLER_TYPE_SCSI) {
> if ((qemuDomainSetSCSIControllerModel(domainDef, qemuCaps, &model)) < 0)
> - return NULL;
> + return -1;
> }
>
> if (!(def->type == VIR_DOMAIN_CONTROLLER_TYPE_SCSI &&
> @@ -2688,22 +2709,22 @@ qemuBuildControllerDevStr(const virDomainDef *domainDef,
> if (def->queues) {
> virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> _("'queues' is only supported by virtio-scsi controller"));
> - return NULL;
> + return -1;
> }
> if (def->cmd_per_lun) {
> virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> _("'cmd_per_lun' is only supported by virtio-scsi controller"));
> - return NULL;
> + return -1;
> }
> if (def->max_sectors) {
> virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> _("'max_sectors' is only supported by virtio-scsi controller"));
> - return NULL;
> + return -1;
> }
> if (def->ioeventfd) {
> virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> _("'ioeventfd' is only supported by virtio-scsi controller"));
> - return NULL;
> + return -1;
> }
> }
>
> @@ -3114,11 +3135,12 @@ qemuBuildControllerDevStr(const virDomainDef *domainDef,
> if (virBufferCheckError(&buf) < 0)
> goto error;
>
> - return virBufferContentAndReset(&buf);
> + *devstr = virBufferContentAndReset(&buf);
> + return 0;
>
> error:
> virBufferFreeAndReset(&buf);
> - return NULL;
> + return -1;
> }
>
>
> @@ -3213,12 +3235,15 @@ qemuBuildControllerDevCommandLine(virCommandPtr cmd,
> continue;
> }
>
> - virCommandAddArg(cmd, "-device");
> - if (!(devstr = qemuBuildControllerDevStr(def, cont, qemuCaps,
> - &usbcontroller)))
> + if (qemuBuildControllerDevStr(def, cont, qemuCaps,
> + &devstr, &usbcontroller) < 0)
> return -1;
> - virCommandAddArg(cmd, devstr);
> - VIR_FREE(devstr);
> +
> + if (devstr) {
> + virCommandAddArg(cmd, "-device");
> + virCommandAddArg(cmd, devstr);
> + VIR_FREE(devstr);
> + }
> }
> }
>
> diff --git a/src/qemu/qemu_command.h b/src/qemu/qemu_command.h
> index 09cb00e..9a2ab29 100644
> --- a/src/qemu/qemu_command.h
> +++ b/src/qemu/qemu_command.h
> @@ -118,10 +118,11 @@ char *qemuBuildDriveDevStr(const virDomainDef *def,
> virQEMUCapsPtr qemuCaps);
>
> /* Current, best practice */
> -char *qemuBuildControllerDevStr(const virDomainDef *domainDef,
> - virDomainControllerDefPtr def,
> - virQEMUCapsPtr qemuCaps,
> - int *nusbcontroller);
> +int qemuBuildControllerDevStr(const virDomainDef *domainDef,
> + virDomainControllerDefPtr def,
> + virQEMUCapsPtr qemuCaps,
> + char **devstr,
> + int *nusbcontroller);
>
> int qemuBuildMemoryBackendStr(virJSONValuePtr *backendProps,
> const char **backendType,
> diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
> index 4a7d997..f910012 100644
> --- a/src/qemu/qemu_hotplug.c
> +++ b/src/qemu/qemu_hotplug.c
> @@ -523,7 +523,10 @@ int qemuDomainAttachControllerDevice(virQEMUDriverPtr driver,
> if (qemuAssignDeviceControllerAlias(vm->def, priv->qemuCaps, controller) < 0)
> goto cleanup;
>
> - if (!(devstr = qemuBuildControllerDevStr(vm->def, controller, priv->qemuCaps, NULL)))
> + if (qemuBuildControllerDevStr(vm->def, controller, priv->qemuCaps, &devstr, NULL) < 0)
> + goto cleanup;
> +
> + if (!devstr)
> goto cleanup;
>
> if (VIR_REALLOC_N(vm->def->controllers, vm->def->ncontrollers+1) < 0)
>
More information about the libvir-list
mailing list