To allow reuse split the code into a separate function and refactor it. To update an existing entry there's no need to copy it first, just update it inplace. --- src/qemu/qemu_conf.c | 81 ++++++++++++++++++++++++++++------------------------ 1 file changed, 44 insertions(+), 37 deletions(-) diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c index ec665d6..ef5d0a5 100644 --- a/src/qemu/qemu_conf.c +++ b/src/qemu/qemu_conf.c @@ -949,6 +949,47 @@ qemuSharedDeviceEntryCopy(const qemuSharedDeviceEntry *entry) return NULL; } + +static int +qemuSharedDeviceEntryInsert(virQEMUDriverPtr driver, + const char *key, + const char *name) +{ + qemuSharedDeviceEntry *entry = NULL; + int ret = -1; + + if ((entry = virHashLookup(driver->sharedDevices, key))) { + /* Nothing to do if the shared scsi host device is already + * recorded in the table. + */ + if (qemuSharedDeviceEntryDomainExists(entry, name, NULL)) { + ret = 0; + goto cleanup; + } + + if (VIR_EXPAND_N(entry->domains, entry->ref, 1) < 0 || + VIR_STRDUP(entry->domains[entry->ref - 1], name) < 0) + goto cleanup; + } else { + if (VIR_ALLOC(entry) < 0 || + VIR_ALLOC_N(entry->domains, 1) < 0 || + VIR_STRDUP(entry->domains[0], name) < 0) + goto cleanup; + + entry->ref = 1; + + if (virHashAddEntry(driver->sharedDevices, key, entry)) + goto cleanup; + } + + ret = 0; + + cleanup: + qemuSharedDeviceEntryFree(entry, NULL); + + return ret; +} + /* qemuAddSharedDevice: * @driver: Pointer to qemu driver struct * @dev: The device def @@ -963,8 +1004,6 @@ qemuAddSharedDevice(virQEMUDriverPtr driver, virDomainDeviceDefPtr dev, const char *name) { - qemuSharedDeviceEntry *entry = NULL; - qemuSharedDeviceEntry *new_entry = NULL; virDomainDiskDefPtr disk = NULL; virDomainHostdevDefPtr hostdev = NULL; char *dev_name = NULL; @@ -1016,43 +1055,11 @@ qemuAddSharedDevice(virQEMUDriverPtr driver, goto cleanup; } - if ((entry = virHashLookup(driver->sharedDevices, key))) { - /* Nothing to do if the shared scsi host device is already - * recorded in the table. - */ - if (qemuSharedDeviceEntryDomainExists(entry, name, NULL)) { - ret = 0; - goto cleanup; - } - - if (!(new_entry = qemuSharedDeviceEntryCopy(entry))) - goto cleanup; - - if (VIR_EXPAND_N(new_entry->domains, new_entry->ref, 1) < 0 || - VIR_STRDUP(new_entry->domains[new_entry->ref - 1], name) < 0) { - qemuSharedDeviceEntryFree(new_entry, NULL); - goto cleanup; - } - - if (virHashUpdateEntry(driver->sharedDevices, key, new_entry) < 0) { - qemuSharedDeviceEntryFree(new_entry, NULL); - goto cleanup; - } - } else { - if (VIR_ALLOC(entry) < 0 || - VIR_ALLOC_N(entry->domains, 1) < 0 || - VIR_STRDUP(entry->domains[0], name) < 0) { - qemuSharedDeviceEntryFree(entry, NULL); - goto cleanup; - } - - entry->ref = 1; - - if (virHashAddEntry(driver->sharedDevices, key, entry)) - goto cleanup; - } + if (qemuSharedDeviceEntryInsert(driver, key, name) < 0) + goto cleanup; ret = 0; + cleanup: qemuDriverUnlock(driver); VIR_FREE(dev_name); -- 2.0.2 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list