diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 9b7ae3f2ae..c73a221dda 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -11680,6 +11680,33 @@ virDomainDiskControllerMatch(int controller_type, int disk_bus) return false; } +/* Return true if there's a duplicate disk[]->dst name for the same bus */ +bool +virDomainDiskDefDstDuplicates(virDomainDefPtr def) +{ + size_t i, j; + + /* optimization */ + if (def->ndisks <= 1) + return false; + + for (i = 1; i < def->ndisks; i++) { + for (j = 0; j < i; j++) { + if (def->disks[i]->bus == def->disks[j]->bus && + STREQ(def->disks[i]->dst, def->disks[j]->dst)) { + virReportError(VIR_ERR_XML_ERROR, + _("target '%s' duplicated for disk sources " + "'%s' and '%s'"), + def->disks[i]->dst, + NULLSTR(virDomainDiskGetSource(def->disks[i])), + NULLSTR(virDomainDiskGetSource(def->disks[j]))); + return true; + } + } + } + return false; +} + int virDomainDiskIndexByAddress(virDomainDefPtr def, virDevicePCIAddressPtr pci_address, diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 02ddd93a4d..ee95f19d2b 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -2574,6 +2574,7 @@ int virDomainEmulatorPinDel(virDomainDefPtr def); void virDomainRNGDefFree(virDomainRNGDefPtr def); +bool virDomainDiskDefDstDuplicates(virDomainDefPtr def); int virDomainDiskIndexByAddress(virDomainDefPtr def, virDevicePCIAddressPtr pci_controller, unsigned int bus, unsigned int target, diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 496b0522bb..7b6a386548 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -224,6 +224,7 @@ virDomainDiskBusTypeToString; virDomainDiskCacheTypeFromString; virDomainDiskCacheTypeToString; virDomainDiskDefAssignAddress; +virDomainDiskDefDstDuplicates; virDomainDiskDefForeachPath; virDomainDiskDefFree; virDomainDiskDefNew; diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 549853c904..c112619669 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -3882,6 +3882,9 @@ qemuBuildDriveDevStr(virDomainDefPtr def, const char *bus = virDomainDiskQEMUBusTypeToString(disk->bus); int controllerModel; + if (virDomainDiskDefDstDuplicates(def)) + goto error; + if (qemuCheckDiskConfig(disk) < 0) goto error; diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-scsi-disk-split.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-scsi-disk-split.xml index 4402f3eda3..20b6f287f9 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-scsi-disk-split.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-scsi-disk-split.xml @@ -21,7 +21,7 @@ - +
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-scsi-lun-passthrough-sgio.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-scsi-lun-passthrough-sgio.xml index 7cf57ec985..4dbbd2995a 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-scsi-lun-passthrough-sgio.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-scsi-lun-passthrough-sgio.xml @@ -21,7 +21,7 @@ - +
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-scsi-lun-passthrough.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-scsi-lun-passthrough.xml index 8111ea3d23..3858ede77d 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-scsi-lun-passthrough.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-scsi-lun-passthrough.xml @@ -21,7 +21,7 @@ - +
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-source-pool-mode.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-source-pool-mode.xml index 9f902936bb..c791717232 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-source-pool-mode.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-source-pool-mode.xml @@ -30,7 +30,7 @@ - +
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-source-pool.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-source-pool.xml index 95d5be2904..ef095a0920 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-source-pool.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-source-pool.xml @@ -34,7 +34,7 @@ - +
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-pci-bridge-many-disks.args b/tests/qemuxml2argvdata/qemuxml2argv-pci-bridge-many-disks.args index 893eaa15a8..fcd9692407 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-pci-bridge-many-disks.args +++ b/tests/qemuxml2argvdata/qemuxml2argv-pci-bridge-many-disks.args @@ -8,8 +8,8 @@ LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test QEMU_AUDIO_DRV=none \ -device pci-bridge,chassis_nr=3,id=pci.3,bus=pci.0,addr=0x5 \ -usb -drive file=/var/lib/libvirt/images/test.img,if=none,id=drive-virtio-disk0 \ -device virtio-blk-pci,bus=pci.0,addr=0x6,drive=drive-virtio-disk0,id=virtio-disk0 \ --drive file=/var/lib/libvirt/images/disk-a-a.img,if=none,id=drive-virtio-disk0 \ --device virtio-blk-pci,bus=pci.0,addr=0x7,drive=drive-virtio-disk0,id=virtio-disk0 \ +-drive file=/var/lib/libvirt/images/disk-a-a.img,if=none,id=drive-virtio-disk26 \ +-device virtio-blk-pci,bus=pci.0,addr=0x7,drive=drive-virtio-disk26,id=virtio-disk26 \ -drive file=/var/lib/libvirt/images/disk-a-b.img,if=none,id=drive-virtio-disk27 \ -device virtio-blk-pci,bus=pci.0,addr=0x8,drive=drive-virtio-disk27,id=virtio-disk27 \ -drive file=/var/lib/libvirt/images/disk-a-c.img,if=none,id=drive-virtio-disk28 \ diff --git a/tests/qemuxml2argvdata/qemuxml2argv-pci-bridge-many-disks.xml b/tests/qemuxml2argvdata/qemuxml2argv-pci-bridge-many-disks.xml index 1f3ad6ecbc..bc429216e1 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-pci-bridge-many-disks.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-pci-bridge-many-disks.xml @@ -29,7 +29,7 @@ - + diff --git a/tests/qemuxml2argvdata/qemuxml2argv-pci-many.args b/tests/qemuxml2argvdata/qemuxml2argv-pci-many.args index 9551c91de3..0f33065425 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-pci-many.args +++ b/tests/qemuxml2argvdata/qemuxml2argv-pci-many.args @@ -6,10 +6,10 @@ LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test QEMU_AUDIO_DRV=none \ -device ide-drive,bus=ide.1,unit=0,drive=drive-ide0-1-0,id=ide0-1-0 \ -drive file=/var/lib/libvirt/images/test.img,if=none,id=drive-virtio-disk0 \ -device virtio-blk-pci,bus=pci.0,addr=0x3,drive=drive-virtio-disk0,id=virtio-disk0 \ --drive file=/var/lib/libvirt/images/test1.img,if=none,id=drive-virtio-disk0 \ --device virtio-blk-pci,bus=pci.0,addr=0x4,drive=drive-virtio-disk0,id=virtio-disk0 \ --drive file=/var/lib/libvirt/images/disk-a-a.img,if=none,id=drive-virtio-disk0 \ --device virtio-blk-pci,bus=pci.0,addr=0x5,drive=drive-virtio-disk0,id=virtio-disk0 \ +-drive file=/var/lib/libvirt/images/test1.img,if=none,id=drive-virtio-disk1 \ +-device virtio-blk-pci,bus=pci.0,addr=0x4,drive=drive-virtio-disk1,id=virtio-disk1 \ +-drive file=/var/lib/libvirt/images/disk-a-a.img,if=none,id=drive-virtio-disk26 \ +-device virtio-blk-pci,bus=pci.0,addr=0x5,drive=drive-virtio-disk26,id=virtio-disk26 \ -drive file=/var/lib/libvirt/images/disk-a-b.img,if=none,id=drive-virtio-disk27 \ -device virtio-blk-pci,bus=pci.0,addr=0x7,drive=drive-virtio-disk27,id=virtio-disk27 \ -drive file=/var/lib/libvirt/images/disk-a-c.img,if=none,id=drive-virtio-disk28 \ diff --git a/tests/qemuxml2argvdata/qemuxml2argv-pci-many.xml b/tests/qemuxml2argvdata/qemuxml2argv-pci-many.xml index 400470e578..b3c9ab1378 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-pci-many.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-pci-many.xml @@ -42,13 +42,13 @@ - +
- +
diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-disk-source-pool.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-disk-source-pool.xml index e96f76eae8..31e4928caf 100644 --- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-disk-source-pool.xml +++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-disk-source-pool.xml @@ -32,7 +32,7 @@ - +
diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-pci-bridge-many-disks.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-pci-bridge-many-disks.xml index d49f5f4d07..060fe870e6 100644 --- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-pci-bridge-many-disks.xml +++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-pci-bridge-many-disks.xml @@ -30,7 +30,7 @@ - +