[PATCH v2] libxl: adjust handling of libxl_device_disk objects
Jim Fehlig
jfehlig at suse.com
Fri May 21 17:01:50 UTC 2021
On 5/20/21 4:17 AM, Olaf Hering wrote:
> libxl objects are supposed to be initialized and disposed.
> Correct the usage of libxl_device_disk objects which are allocated on
> the stack. Initialize each one prior usage, and dispose them once done.
>
> Adjust libxlMakeDisk to use an already initialized object, it is owned
> by the caller.
>
> Adjust libxlMakeDiskList to initialize the list of objects, before they
> are filled by libxlMakeDisk. In case of error, the objects are disposed
> by libxl_domain_config_dispose.
>
> Signed-off-by: Olaf Hering <olaf at aepfle.de>
> ---
> src/libxl/libxl_conf.c | 20 +++++---------------
> src/libxl/libxl_driver.c | 6 ++++++
> 2 files changed, 11 insertions(+), 15 deletions(-)
Reviewed-by: Jim Fehlig <jfehlig at suse.com
>
> diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c
> index 3149ee3b4a..f29a28a841 100644
> --- a/src/libxl/libxl_conf.c
> +++ b/src/libxl/libxl_conf.c
> @@ -1114,8 +1114,6 @@ libxlMakeDisk(virDomainDiskDef *l_disk, libxl_device_disk *x_disk)
> int format = virDomainDiskGetFormat(l_disk);
> int actual_type = virStorageSourceGetActualType(l_disk->src);
>
> - libxl_device_disk_init(x_disk);
> -
> if (actual_type == VIR_STORAGE_TYPE_NETWORK) {
> if (STRNEQ_NULLABLE(driver, "qemu")) {
> virReportError(VIR_ERR_OPERATION_INVALID, "%s",
> @@ -1265,26 +1263,18 @@ libxlMakeDiskList(virDomainDef *def, libxl_domain_config *d_config)
> {
> virDomainDiskDef **l_disks = def->disks;
> int ndisks = def->ndisks;
> - libxl_device_disk *x_disks;
> size_t i;
>
> - x_disks = g_new0(libxl_device_disk, ndisks);
> + d_config->disks = g_new0(libxl_device_disk, ndisks);
> + d_config->num_disks = ndisks;
>
> for (i = 0; i < ndisks; i++) {
> - if (libxlMakeDisk(l_disks[i], &x_disks[i]) < 0)
> - goto error;
> + libxl_device_disk_init(&d_config->disks[i]);
> + if (libxlMakeDisk(l_disks[i], &d_config->disks[i]) < 0)
> + return -1;
> }
>
> - d_config->disks = x_disks;
> - d_config->num_disks = ndisks;
> -
> return 0;
> -
> - error:
> - for (i = 0; i < ndisks; i++)
> - libxl_device_disk_dispose(&x_disks[i]);
> - VIR_FREE(x_disks);
> - return -1;
> }
>
> /*
> diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c
> index d54cd41785..2b844bb3b5 100644
> --- a/src/libxl/libxl_driver.c
> +++ b/src/libxl/libxl_driver.c
> @@ -2978,6 +2978,7 @@ libxlDomainChangeEjectableMedia(virDomainObj *vm, virDomainDiskDef *disk)
> size_t i;
> int ret = -1;
>
> + libxl_device_disk_init(&x_disk);
> for (i = 0; i < vm->def->ndisks; i++) {
> if (vm->def->disks[i]->bus == disk->bus &&
> STREQ(vm->def->disks[i]->dst, disk->dst)) {
> @@ -3018,6 +3019,7 @@ libxlDomainChangeEjectableMedia(virDomainObj *vm, virDomainDiskDef *disk)
> ret = 0;
>
> cleanup:
> + libxl_device_disk_dispose(&x_disk);
> virObjectUnref(cfg);
> return ret;
> }
> @@ -3030,6 +3032,7 @@ libxlDomainAttachDeviceDiskLive(virDomainObj *vm, virDomainDeviceDef *dev)
> libxl_device_disk x_disk;
> int ret = -1;
>
> + libxl_device_disk_init(&x_disk);
> switch (l_disk->device) {
> case VIR_DOMAIN_DISK_DEVICE_CDROM:
> ret = libxlDomainChangeEjectableMedia(vm, l_disk);
> @@ -3091,6 +3094,7 @@ libxlDomainAttachDeviceDiskLive(virDomainObj *vm, virDomainDeviceDef *dev)
> }
>
> cleanup:
> + libxl_device_disk_dispose(&x_disk);
> virObjectUnref(cfg);
> return ret;
> }
> @@ -3329,6 +3333,7 @@ libxlDomainDetachDeviceDiskLive(virDomainObj *vm, virDomainDeviceDef *dev)
> int idx;
> int ret = -1;
>
> + libxl_device_disk_init(&x_disk);
> switch (dev->data.disk->device) {
> case VIR_DOMAIN_DISK_DEVICE_DISK:
> if (dev->data.disk->bus == VIR_DOMAIN_DISK_BUS_XEN) {
> @@ -3380,6 +3385,7 @@ libxlDomainDetachDeviceDiskLive(virDomainObj *vm, virDomainDeviceDef *dev)
> }
>
> cleanup:
> + libxl_device_disk_dispose(&x_disk);
> virObjectUnref(cfg);
> return ret;
> }
>
More information about the libvir-list
mailing list