From 714b38cb232bcbbd7487af4c058fa6d0999b3326 Mon Sep 17 00:00:00 2001 From: Peter Krempa Date: Tue, 7 Apr 2015 16:08:32 +0200 Subject: [PATCH] qemu: Enforce WWN to be unique among VM's disks Operating systems use the identifier to name the disks. As the name suggests the ID should be unique. Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1208009 --- docs/formatdomain.html.in | 3 ++- src/conf/domain_conf.c | 25 +++++++++++++++++++++++++ src/conf/domain_conf.h | 3 +++ src/libvirt_private.syms | 1 + src/qemu/qemu_process.c | 3 +++ 5 files changed, 34 insertions(+), 1 deletion(-) diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in index 7ceb1fa63d..e921749692 100644 --- a/docs/formatdomain.html.in +++ b/docs/formatdomain.html.in @@ -2453,7 +2453,8 @@
wwn
If present, this element specifies the WWN (World Wide Name) of a virtual hard disk or CD-ROM drive. It must be composed - of 16 hexadecimal digits. + of 16 hexadecimal digits and must be unique (at least among + disks of a single domain) Since 0.10.1
vendor
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 8ccf763175..58b98c639c 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -23186,3 +23186,28 @@ virDomainDefNeedsPlacementAdvice(virDomainDefPtr def) return false; } + + +int +virDomainDefCheckDuplicateDiskWWN(virDomainDefPtr def) +{ + size_t i; + size_t j; + + for (i = 0; i < def->ndisks; i++) { + if (def->disks[i]->wwn) { + for (j = i + 1; j < def->ndisks; j++) { + if (STREQ_NULLABLE(def->disks[i]->wwn, + def->disks[j]->wwn)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Disks '%s' and '%s' have identical WWN"), + def->disks[i]->dst, + def->disks[j]->dst); + return -1; + } + } + } + } + + return 0; +} diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 95cbb9cbce..e6fa3c9220 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -3080,4 +3080,7 @@ virDomainParseMemory(const char *xpath, bool virDomainDefNeedsPlacementAdvice(virDomainDefPtr def) ATTRIBUTE_NONNULL(1); +int virDomainDefCheckDuplicateDiskWWN(virDomainDefPtr def) + ATTRIBUTE_NONNULL(1); + #endif /* __DOMAIN_CONF_H */ diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 67ab526e2f..716628368a 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -198,6 +198,7 @@ virDomainCpuPlacementModeTypeFromString; virDomainCpuPlacementModeTypeToString; virDomainDefAddImplicitControllers; virDomainDefCheckABIStability; +virDomainDefCheckDuplicateDiskWWN; virDomainDefCheckUnsupportedMemoryHotplug; virDomainDefClearCCWAddresses; virDomainDefClearDeviceAliases; diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 753afe8ae8..d9611c9ac7 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -4568,6 +4568,9 @@ int qemuProcessStart(virConnectPtr conn, goto cleanup; } + if (virDomainDefCheckDuplicateDiskWWN(vm->def) < 0) + goto cleanup; + /* "volume" type disk's source must be translated before * cgroup and security setting. */ -- GitLab