From: Daniel Henrique Barboza Date: Tue, 3 Sep 2019 23:06:05 +0000 (-0300) Subject: qemu_conf.c: introduce qemuAddRemoveSharedHostdevInternal X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=b2de989b9d9ce75206ae4a3542b738e917d3fdfb;p=libvirt.git qemu_conf.c: introduce qemuAddRemoveSharedHostdevInternal qemuAddSharedHostdev() has a code similar to qemuRemoveSharedHostdev(), with exception of one line that defines the operation (add or remove). This patch introduces a new function that aggregates the common code, using a flag to switch between the operations, avoiding code repetition. No functional change was made. Signed-off-by: Daniel Henrique Barboza Reviewed-by: Pavel Hrdina --- diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c index bf9ab32a12..08672ac94f 100644 --- a/src/qemu/qemu_conf.c +++ b/src/qemu/qemu_conf.c @@ -1730,9 +1730,34 @@ qemuGetHostdevPath(virDomainHostdevDefPtr hostdev) 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; @@ -1748,37 +1773,19 @@ qemuAddSharedHostdev(virQEMUDriverPtr driver, 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; } @@ -1803,7 +1810,8 @@ qemuAddSharedDevice(virQEMUDriverPtr driver, 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; } @@ -1838,33 +1846,6 @@ qemuRemoveSharedDisk(virQEMUDriverPtr driver, } -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: @@ -1884,7 +1865,8 @@ qemuRemoveSharedDevice(virQEMUDriverPtr driver, 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; }