Both addition and removal of a shared hostdev share the code to generate the hostdev key. Split it out into a separate function and refactor them. --- src/qemu/qemu_conf.c | 76 ++++++++++++++++++++++------------------------------ 1 file changed, 32 insertions(+), 44 deletions(-) diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c index f6a3b8d..00405cc 100644 --- a/src/qemu/qemu_conf.c +++ b/src/qemu/qemu_conf.c @@ -992,24 +992,14 @@ qemuAddSharedDisk(virQEMUDriverPtr driver, } -static int -qemuAddSharedHostdev(virQEMUDriverPtr driver, - virDomainHostdevDefPtr hostdev, - const char *name) +static char * +qemuGetSharedHostdevKey(virDomainHostdevDefPtr hostdev) { virDomainHostdevSubsysSCSIPtr scsisrc = &hostdev->source.subsys.u.scsi; virDomainHostdevSubsysSCSIHostPtr scsihostsrc = &scsisrc->u.host; char *dev_name = NULL; char *dev_path = NULL; char *key = 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_name = virSCSIDeviceGetDevName(NULL, scsihostsrc->adapter, @@ -1024,15 +1014,33 @@ qemuAddSharedHostdev(virQEMUDriverPtr driver, if (!(key = qemuGetSharedDeviceKey(dev_path))) goto cleanup; - if (qemuSharedDeviceEntryInsert(driver, key, name) < 0) - goto cleanup; - - ret = 0; - cleanup: - qemuDriverUnlock(driver); VIR_FREE(dev_name); VIR_FREE(dev_path); + + return key; +} + +static int +qemuAddSharedHostdev(virQEMUDriverPtr driver, + virDomainHostdevDefPtr hostdev, + const char *name) +{ + char *key = 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; + + if (!(key = qemuGetSharedHostdevKey(hostdev))) + return -1; + + qemuDriverLock(driver); + ret = qemuSharedDeviceEntryInsert(driver, key, name); + qemuDriverUnlock(driver); + VIR_FREE(key); return ret; } @@ -1121,41 +1129,21 @@ 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; + int ret; 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_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 (!(key = qemuGetSharedDeviceKey(dev_path))) - goto cleanup; - - if (qemuSharedDeviceEntryRemove(driver, key, name) < 0) - goto cleanup; + if (!(key = qemuGetSharedHostdevKey(hostdev))) + return -1; - ret = 0; - cleanup: + qemuDriverLock(driver); + ret = qemuSharedDeviceEntryRemove(driver, key, name); qemuDriverUnlock(driver); - VIR_FREE(dev_name); - VIR_FREE(dev_path); + VIR_FREE(key); return ret; } -- 2.0.2 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list