[libvirt] [PATCHv2 45/62] qemu: hotplug: Implement removable media change for -blockdev

John Ferlan jferlan at redhat.com
Wed Aug 22 10:51:49 UTC 2018


[...]

> +static int
> +qemuDomainChangeMediaBlockdev(virQEMUDriverPtr driver,
> +                              virDomainObjPtr vm,
> +                              virDomainDiskDefPtr disk,
> +                              virStorageSourcePtr newsrc,
> +                              bool force)
> +{
> +    qemuDomainObjPrivatePtr priv = vm->privateData;
> +    qemuDomainDiskPrivatePtr diskPriv = QEMU_DOMAIN_DISK_PRIVATE(disk);
> +    qemuHotplugDiskSourceDataPtr newbackend = NULL;
> +    qemuHotplugDiskSourceDataPtr oldbackend = NULL;
> +    virStorageSourcePtr oldsrc = disk->src;
> +    char *nodename = NULL;
> +    int rc;
> +    int ret = -1;
> +
> +    if (!virStorageSourceIsEmpty(disk->src) &&
> +        !(oldbackend = qemuHotplugDiskSourceRemovePrepare(disk, priv->qemuCaps)))
> +        goto cleanup;
> +
> +    disk->src = newsrc;
> +    if (!virStorageSourceIsEmpty(disk->src)) {
> +        if (!(newbackend = qemuHotplugDiskSourceAttachPrepare(disk,
> +                                                              priv->qemuCaps)))
> +            goto cleanup;
> +
> +        if (qemuDomainDiskGetBackendAlias(disk, priv->qemuCaps, &nodename) < 0)

Coverity notes @nodename is leaked at cleanup:

John

BTW: Only 2 Coverity whines for a large series and you got rid of one of
my false positives by removing the detach->info.alias creation done in
qemuDomainDetachVirtioDiskDevice. Something similar I suppose could be
done for qemuDomainDetachControllerDevice using the same reasoning.


> +            goto cleanup;
> +    }
> +
> +    if (diskPriv->tray && disk->tray_status != VIR_DOMAIN_DISK_TRAY_OPEN) {
> +        qemuDomainObjEnterMonitor(driver, vm);
> +        rc = qemuMonitorBlockdevTrayOpen(priv->mon, diskPriv->backendQomName, force);
> +        if (qemuDomainObjExitMonitor(driver, vm) < 0 || rc < 0)
> +            goto cleanup;
> +
> +        if (!force && qemuHotplugWaitForTrayEject(vm, disk) < 0)
> +            goto cleanup;
> +    }
> +
> +    qemuDomainObjEnterMonitor(driver, vm);
> +
> +    rc = qemuMonitorBlockdevMediumRemove(priv->mon, diskPriv->backendQomName);
> +
> +    if (rc == 0 && oldbackend)
> +        qemuHotplugDiskSourceRemove(priv->mon, oldbackend);
> +
> +    if (newbackend && nodename) {
> +        if (rc == 0)
> +            rc = qemuHotplugDiskSourceAttach(priv->mon, newbackend);
> +
> +        if (rc == 0)
> +            rc = qemuMonitorBlockdevMediumInsert(priv->mon,
> +                                                 diskPriv->backendQomName,
> +                                                 nodename);
> +    }
> +
> +    if (rc == 0)
> +        rc = qemuMonitorBlockdevTrayClose(priv->mon, diskPriv->backendQomName);
> +
> +    if (qemuDomainObjExitMonitor(driver, vm) < 0 || rc < 0)
> +        goto cleanup;
> +
> +    ret = 0;
> +
> + cleanup:
> +    qemuHotplugDiskSourceDataFree(newbackend);
> +    qemuHotplugDiskSourceDataFree(oldbackend);
> +    /* caller handles correct exchange of sources */
> +    disk->src = oldsrc;
> +    return ret;
> +}
> +
> +

[...]




More information about the libvir-list mailing list