static int
-qemuAddSharedHostdev(virQEMUDriverPtr driver,
- virDomainHostdevDefPtr hostdev,
- const char *name)
+qemuSharedDeviceEntryRemove(virQEMUDriverPtr driver,
+ const char *key,
+ const char *name)
+{
+ qemuSharedDeviceEntryPtr entry = NULL;
+ int idx;
+
+ if (!(entry = virHashLookup(driver->sharedDevices, key)))
+ return -1;
+
+ /* Nothing to do if the shared disk is not recored in the table. */
+ if (!qemuSharedDeviceEntryDomainExists(entry, name, &idx))
+ return 0;
+
+ if (entry->ref != 1)
+ VIR_DELETE_ELEMENT(entry->domains, idx, entry->ref);
+ else
+ ignore_value(virHashRemoveEntry(driver->sharedDevices, key));
+
+ return 0;
+}
+
+
+static int
+qemuAddRemoveSharedHostdevInternal(virQEMUDriverPtr driver,
+ virDomainHostdevDefPtr hostdev,
+ const char *name,
+ bool addDevice)
{
char *dev_path = NULL;
char *key = NULL;
goto cleanup;
qemuDriverLock(driver);
- ret = qemuSharedDeviceEntryInsert(driver, key, name);
+
+ if (addDevice)
+ ret = qemuSharedDeviceEntryInsert(driver, key, name);
+ else
+ ret = qemuSharedDeviceEntryRemove(driver, key, name);
+
qemuDriverUnlock(driver);
cleanup:
VIR_FREE(dev_path);
VIR_FREE(key);
return ret;
-}
-
-
-static int
-qemuSharedDeviceEntryRemove(virQEMUDriverPtr driver,
- const char *key,
- const char *name)
-{
- qemuSharedDeviceEntryPtr entry = NULL;
- int idx;
-
- if (!(entry = virHashLookup(driver->sharedDevices, key)))
- return -1;
-
- /* Nothing to do if the shared disk is not recored in the table. */
- if (!qemuSharedDeviceEntryDomainExists(entry, name, &idx))
- return 0;
- if (entry->ref != 1)
- VIR_DELETE_ELEMENT(entry->domains, idx, entry->ref);
- else
- ignore_value(virHashRemoveEntry(driver->sharedDevices, key));
-
- return 0;
}
if (dev->type == VIR_DOMAIN_DEVICE_DISK)
return qemuAddSharedDisk(driver, dev->data.disk, name);
else if (dev->type == VIR_DOMAIN_DEVICE_HOSTDEV)
- return qemuAddSharedHostdev(driver, dev->data.hostdev, name);
+ return qemuAddRemoveSharedHostdevInternal(driver, dev->data.hostdev,
+ name, true);
else
return 0;
}
}
-static int
-qemuRemoveSharedHostdev(virQEMUDriverPtr driver,
- virDomainHostdevDefPtr hostdev,
- const char *name)
-{
- char *dev_path = NULL;
- char *key = NULL;
- int ret = -1;
-
- if (!qemuIsSharedHostdev(hostdev))
- return 0;
-
- if (!(dev_path = qemuGetHostdevPath(hostdev)))
- goto cleanup;
-
- if (!(key = qemuGetSharedDeviceKey(dev_path)))
- goto cleanup;
-
- qemuDriverLock(driver);
- ret = qemuSharedDeviceEntryRemove(driver, key, name);
- qemuDriverUnlock(driver);
-
- cleanup:
- VIR_FREE(dev_path);
- VIR_FREE(key);
- return ret;
-}
/* qemuRemoveSharedDevice:
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);
+ return qemuAddRemoveSharedHostdevInternal(driver, dev->data.hostdev,
+ name, false);
else
return 0;
}