Removing a shared device needs special steps for disks and hostdevs.
Instead of having one function dealing this split the code into two
separate functions that can be used with better granularity.
---
src/qemu/qemu_conf.c | 117 +++++++++++++++++++++++++++++++--------------------
1 file changed, 71 insertions(+), 46 deletions(-)
diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c
index 7af3c5c..f6a3b8d 100644
--- a/src/qemu/qemu_conf.c
+++ b/src/qemu/qemu_conf.c
@@ -1088,64 +1088,65 @@ qemuAddSharedDevice(virQEMUDriverPtr driver,
return 0;
}
-/* qemuRemoveSharedDevice:
- * @driver: Pointer to qemu driver struct
- * @device: The device def
- * @name: The domain name
- *
- * Decrease ref count and remove the domain name from the list which
- * records all the domains that use the shared device if ref is not
- * 1, otherwise remove the entry.
- */
-int
-qemuRemoveSharedDevice(virQEMUDriverPtr driver,
- virDomainDeviceDefPtr dev,
- const char *name)
+
+static int
+qemuRemoveSharedDisk(virQEMUDriverPtr driver,
+ virDomainDiskDefPtr disk,
+ const char *name)
{
- virDomainDiskDefPtr disk = NULL;
- virDomainHostdevDefPtr hostdev = NULL;
char *key = NULL;
- char *dev_name = NULL;
- char *dev_path = NULL;
int ret = -1;
- if (dev->type == VIR_DOMAIN_DEVICE_DISK) {
- disk = dev->data.disk;
+ if (!disk->src->shared || !virDomainDiskSourceIsBlockType(disk->src))
+ return 0;
- if (!disk->src->shared || !virDomainDiskSourceIsBlockType(disk->src))
- return 0;
- } else if (dev->type == VIR_DOMAIN_DEVICE_HOSTDEV) {
- hostdev = dev->data.hostdev;
+ qemuDriverLock(driver);
- if (!hostdev->shareable ||
- !(hostdev->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS &&
- hostdev->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI))
- return 0;
- } else {
+ if (!(key = qemuGetSharedDeviceKey(virDomainDiskGetSource(disk))))
+ goto cleanup;
+
+ if (qemuSharedDeviceEntryRemove(driver, key, name) < 0)
+ goto cleanup;
+
+ ret = 0;
+ cleanup:
+ qemuDriverUnlock(driver);
+ VIR_FREE(key);
+ return ret;
+}
+
+
+static int
+qemuRemoveSharedHostdev(virQEMUDriverPtr driver,
+ virDomainHostdevDefPtr hostdev,
+ const char *name)
+{
+ virDomainHostdevSubsysSCSIPtr scsisrc = &hostdev->source.subsys.u.scsi;
+ virDomainHostdevSubsysSCSIHostPtr scsihostsrc = &scsisrc->u.host;
+ char *key = NULL;
+ char *dev_name = NULL;
+ char *dev_path = NULL;
+ int ret = -1;
+
+ if (!hostdev->shareable ||
+ !(hostdev->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS &&
+ hostdev->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI))
return 0;
- }
qemuDriverLock(driver);
- if (dev->type == VIR_DOMAIN_DEVICE_DISK) {
- if (!(key = qemuGetSharedDeviceKey(virDomainDiskGetSource(disk))))
- goto cleanup;
- } else {
- virDomainHostdevSubsysSCSIPtr scsisrc = &hostdev->source.subsys.u.scsi;
- virDomainHostdevSubsysSCSIHostPtr scsihostsrc = &scsisrc->u.host;
- if (!(dev_name = virSCSIDeviceGetDevName(NULL,
- scsihostsrc->adapter,
- scsihostsrc->bus,
- scsihostsrc->target,
- scsihostsrc->unit)))
- goto cleanup;
+ if (!(dev_name = virSCSIDeviceGetDevName(NULL,
+ scsihostsrc->adapter,
+ scsihostsrc->bus,
+ scsihostsrc->target,
+ scsihostsrc->unit)))
+ goto cleanup;
- if (virAsprintf(&dev_path, "/dev/%s", dev_name) < 0)
- goto cleanup;
+ if (virAsprintf(&dev_path, "/dev/%s", dev_name) < 0)
+ goto cleanup;
- if (!(key = qemuGetSharedDeviceKey(dev_path)))
- goto cleanup;
- }
+ if (!(key = qemuGetSharedDeviceKey(dev_path)))
+ goto cleanup;
if (qemuSharedDeviceEntryRemove(driver, key, name) < 0)
goto cleanup;
@@ -1159,6 +1160,30 @@ qemuRemoveSharedDevice(virQEMUDriverPtr driver,
return ret;
}
+
+/* qemuRemoveSharedDevice:
+ * @driver: Pointer to qemu driver struct
+ * @device: The device def
+ * @name: The domain name
+ *
+ * Decrease ref count and remove the domain name from the list which
+ * records all the domains that use the shared device if ref is not
+ * 1, otherwise remove the entry.
+ */
+int
+qemuRemoveSharedDevice(virQEMUDriverPtr driver,
+ virDomainDeviceDefPtr dev,
+ const char *name)
+{
+ if (dev->type == VIR_DOMAIN_DEVICE_DISK)
+ return qemuRemoveSharedDisk(driver, dev->data.disk, name);
+ else if (dev->type == VIR_DOMAIN_DEVICE_HOSTDEV)
+ return qemuRemoveSharedHostdev(driver, dev->data.hostdev, name);
+ else
+ return 0;
+}
+
+
int
qemuSetUnprivSGIO(virDomainDeviceDefPtr dev)
{
--
2.0.2