void *opaque G_GNUC_UNUSED,
void *parseOpaque G_GNUC_UNUSED)
{
+ size_t i;
virStorageSource *src = NULL;
+ g_autoptr(GHashTable) nvme_controllers = g_hash_table_new(g_direct_hash,
+ g_direct_equal);
+
+ for (i = 0; i < def->ndisks; i++) {
+ virDomainDiskDef *disk = def->disks[i];
+ int nvme_ctrl = 0;
+ int idx = -1;
+
+ if (disk->bus == VIR_DOMAIN_DISK_BUS_NVME) {
+ if (virDiskNameParse(disk->dst, &nvme_ctrl, &idx, NULL) < 0) {
+ virReportError(VIR_ERR_XML_ERROR,
+ _("Unknown disk name '%1$s' and no address specified"),
+ disk->dst);
+ return -1;
+ }
+
+ if (g_hash_table_contains(nvme_controllers, GINT_TO_POINTER(nvme_ctrl))) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ "%s",
+ _("Cannot have more than one disk per NVMe controller"));
+ return -1;
+ }
+
+ g_hash_table_add(nvme_controllers, GINT_TO_POINTER(nvme_ctrl));
+ }
+ }
if (!def->os.loader)
return 0;
--- /dev/null
+<domain type='bhyve'>
+ <name>bhyve</name>
+ <uuid>df3be7e7-a104-11e3-aeb0-50e5492bd3dc</uuid>
+ <memory>219136</memory>
+ <vcpu>1</vcpu>
+ <os>
+ <type>hvm</type>
+ </os>
+ <devices>
+ <disk type='file'>
+ <driver name='file' type='raw'/>
+ <source file='/tmp/freebsd.img'/>
+ <target dev='nvme0n1' bus='nvme'/>
+ </disk>
+ <disk type='file'>
+ <driver name='file' type='raw'/>
+ <source file='/tmp/data.img'/>
+ <target dev='nvme0n2' bus='nvme'/>
+ </disk>
+ </devices>
+</domain>
DO_TEST_FAILURE("serial-invalid-port");
DO_TEST("nvme");
DO_TEST("2-nvme-2-controllers");
+ DO_TEST_FAILURE("2-nvme-same-controller");
/* Address allocation tests */
DO_TEST("addr-single-sata-disk");