From 4f1324aa48d834f419584b3bffebf763eb778572 Mon Sep 17 00:00:00 2001 From: Peter Krempa Date: Thu, 4 Feb 2016 13:39:15 +0100 Subject: [PATCH] qemu: hotplug: Check duplicate disk serial/wwn on hotplug too We do the check on VM start, but the user could still hotplug a disk with a conflicting serial or WWN. Reuse the checker function to fix the issue. --- src/conf/domain_conf.c | 2 +- src/conf/domain_conf.h | 3 +++ src/libvirt_private.syms | 1 + src/qemu/qemu_hotplug.c | 3 +++ 4 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 8f74ac5c02..e7d4ac90fa 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -23988,7 +23988,7 @@ virDomainDefNeedsPlacementAdvice(virDomainDefPtr def) } -static int +int virDomainDiskDefCheckDuplicateInfo(virDomainDiskDefPtr a, virDomainDiskDefPtr b) { diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 83a080b4a4..aa1908efc4 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -3153,6 +3153,9 @@ virDomainParseMemory(const char *xpath, bool virDomainDefNeedsPlacementAdvice(virDomainDefPtr def) ATTRIBUTE_NONNULL(1); +int virDomainDiskDefCheckDuplicateInfo(virDomainDiskDefPtr a, + virDomainDiskDefPtr b) + ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2); int virDomainDefCheckDuplicateDiskInfo(virDomainDefPtr def) ATTRIBUTE_NONNULL(1); diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 276aacfe5e..23a15a4e25 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -257,6 +257,7 @@ virDomainDiskByName; virDomainDiskCacheTypeFromString; virDomainDiskCacheTypeToString; virDomainDiskDefAssignAddress; +virDomainDiskDefCheckDuplicateInfo; virDomainDiskDefDstDuplicates; virDomainDiskDefForeachPath; virDomainDiskDefFree; diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 2e5cf64901..18a5a12d2a 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -799,6 +799,9 @@ qemuDomainAttachDeviceDiskLive(virConnectPtr conn, _("target %s already exists"), disk->dst); goto cleanup; } + + if (virDomainDiskDefCheckDuplicateInfo(vm->def->disks[i], disk) < 0) + goto cleanup; } switch ((virDomainDiskBus) disk->bus) {