[PATCH 2/5] qemu: Add support for NVMe namespace disk bus type

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



From: ray <honglei.wang@xxxxxxxxxx>

This patch extends the previous NVMe disk bus support by introducing a new
nvme-ns bus type.

The nvme-ns bus disk needs to be attached to nvme controller. A controller
can contain multiple nvme-ns disk devices.

Key changes include:

- Add VIR_DOMAIN_DISK_BUS_NVME_NS to disk bus
- Add VIR_DOMAIN_CONTROLLER_TYPE_NVME to controller type
- Update driver-specific functions to handle nvme-ns disks
- Modify disk name parsing to recognize 'nvmens' prefix
- Add support for NVMe namespace-specific addressing and controller handling
- Implement NVMe controller serial number parsing and formatting

Signed-off-by: ray <honglei.wang@xxxxxxxxxx>
---
 src/conf/domain_conf.c         | 39 +++++++++++++++++++++++++++++++++++++++
 src/conf/domain_conf.h         |  7 +++++++
 src/conf/domain_postparse.c    |  2 ++
 src/conf/domain_validate.c     |  1 +
 src/conf/virconftypes.h        |  2 ++
 src/hyperv/hyperv_driver.c     |  2 ++
 src/qemu/qemu_alias.c          |  1 +
 src/qemu/qemu_command.c        | 26 ++++++++++++++++++++++++++
 src/qemu/qemu_domain_address.c |  5 +++++
 src/qemu/qemu_hotplug.c        |  8 ++++++++
 src/qemu/qemu_postparse.c      |  1 +
 src/qemu/qemu_validate.c       | 12 ++++++++++++
 src/test/test_driver.c         |  2 ++
 src/util/virutil.c             |  2 +-
 src/vbox/vbox_common.c         |  2 ++
 src/vmx/vmx.c                  |  1 +
 16 files changed, 112 insertions(+), 1 deletion(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index bc101cca0e..d21cf404e2 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -373,6 +373,7 @@ VIR_ENUM_IMPL(virDomainDiskBus,
               "sata",
               "sd",
               "nvme",
+              "nvme-ns",
 );
 
 VIR_ENUM_IMPL(virDomainDiskCache,
@@ -421,6 +422,7 @@ VIR_ENUM_IMPL(virDomainController,
               "pci",
               "xenbus",
               "isa",
+              "nvme",
 );
 
 VIR_ENUM_IMPL(virDomainControllerModelPCI,
@@ -2545,6 +2547,7 @@ virDomainControllerDefNew(virDomainControllerType type)
     case VIR_DOMAIN_CONTROLLER_TYPE_SATA:
     case VIR_DOMAIN_CONTROLLER_TYPE_CCID:
     case VIR_DOMAIN_CONTROLLER_TYPE_ISA:
+    case VIR_DOMAIN_CONTROLLER_TYPE_NVME:
     case VIR_DOMAIN_CONTROLLER_TYPE_LAST:
         break;
     }
@@ -6773,6 +6776,14 @@ virDomainDiskDefAssignAddress(virDomainXMLOption *xmlopt G_GNUC_UNUSED,
         def->info.addr.drive.unit = idx % 2;
         break;
 
+    case VIR_DOMAIN_DISK_BUS_NVME_NS:
+        /* For NVME-NS, each nvme controller has a maximum of 256 nvme-ns */
+        def->info.type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DRIVE;
+        def->info.addr.drive.controller = idx / 256;
+        def->info.addr.drive.bus = 0;
+        def->info.addr.drive.unit = idx % 256;
+        break;
+
     case VIR_DOMAIN_DISK_BUS_NONE:
     case VIR_DOMAIN_DISK_BUS_VIRTIO:
     case VIR_DOMAIN_DISK_BUS_XEN:
@@ -8513,6 +8524,7 @@ virDomainControllerModelTypeFromString(const virDomainControllerDef *def,
     case VIR_DOMAIN_CONTROLLER_TYPE_SATA:
     case VIR_DOMAIN_CONTROLLER_TYPE_CCID:
     case VIR_DOMAIN_CONTROLLER_TYPE_XENBUS:
+    case VIR_DOMAIN_CONTROLLER_TYPE_NVME:
     case VIR_DOMAIN_CONTROLLER_TYPE_LAST:
         return -1;
     }
@@ -8541,6 +8553,7 @@ virDomainControllerModelTypeToString(virDomainControllerDef *def,
     case VIR_DOMAIN_CONTROLLER_TYPE_SATA:
     case VIR_DOMAIN_CONTROLLER_TYPE_CCID:
     case VIR_DOMAIN_CONTROLLER_TYPE_XENBUS:
+    case VIR_DOMAIN_CONTROLLER_TYPE_NVME:
     case VIR_DOMAIN_CONTROLLER_TYPE_LAST:
         return NULL;
     }
@@ -8561,6 +8574,8 @@ virDomainControllerDefParseXML(virDomainXMLOption *xmlopt,
     int ntargetNodes = 0;
     g_autofree xmlNodePtr *modelNodes = NULL;
     int nmodelNodes = 0;
+    g_autofree xmlNodePtr *serialNodes = NULL;
+    int nserialNodes = 0;
     int numaNode = -1;
     int ports;
     VIR_XPATH_NODE_AUTORESTORE(ctxt)
@@ -8696,6 +8711,18 @@ virDomainControllerDefParseXML(virDomainXMLOption *xmlopt,
     if (virXMLPropInt(node, "ports", 10, VIR_XML_PROP_NONNEGATIVE, &ports, -1) < 0)
         return NULL;
 
+    if ((nserialNodes = virXPathNodeSet("./serial", ctxt, &serialNodes)) > 1) {
+        virReportError(VIR_ERR_XML_ERROR, "%s",
+                       _("Multiple <serial> elements in controller definition not allowed"));
+        return NULL;
+    }
+
+    if (nserialNodes == 1) {
+        if (def->type == VIR_DOMAIN_CONTROLLER_TYPE_NVME) {
+           def->opts.nvmeopts.serial = virXMLNodeContentString(serialNodes[0]);
+        }
+    }
+
     switch (def->type) {
     case VIR_DOMAIN_CONTROLLER_TYPE_VIRTIO_SERIAL: {
         if (virXMLPropInt(node, "vectors", 10, VIR_XML_PROP_NONNEGATIVE,
@@ -8781,6 +8808,7 @@ virDomainControllerDefParseXML(virDomainXMLOption *xmlopt,
     case VIR_DOMAIN_CONTROLLER_TYPE_SATA:
     case VIR_DOMAIN_CONTROLLER_TYPE_CCID:
     case VIR_DOMAIN_CONTROLLER_TYPE_ISA:
+    case VIR_DOMAIN_CONTROLLER_TYPE_NVME:
     case VIR_DOMAIN_CONTROLLER_TYPE_LAST:
     default:
         break;
@@ -14718,6 +14746,10 @@ virDomainDiskControllerMatch(int controller_type, int disk_bus)
         disk_bus == VIR_DOMAIN_DISK_BUS_SATA)
         return true;
 
+    if (controller_type == VIR_DOMAIN_CONTROLLER_TYPE_NVME &&
+        disk_bus == VIR_DOMAIN_DISK_BUS_NVME_NS)
+        return true;
+
     return false;
 }
 
@@ -23650,6 +23682,12 @@ virDomainControllerDefFormat(virBuffer *buf,
         }
         break;
 
+    case VIR_DOMAIN_CONTROLLER_TYPE_NVME:
+        if (def->opts.nvmeopts.serial != NULL) {
+            virBufferAsprintf(&childBuf, "<serial>%s</serial>\n", def->opts.nvmeopts.serial);
+        }
+        break;
+
     case VIR_DOMAIN_CONTROLLER_TYPE_PCI:
         if (virDomainControllerDefFormatPCI(&childBuf, def, flags) < 0)
             return -1;
@@ -29204,6 +29242,7 @@ virDiskNameToBusDeviceIndex(virDomainDiskDef *disk,
         case VIR_DOMAIN_DISK_BUS_SATA:
         case VIR_DOMAIN_DISK_BUS_UML:
         case VIR_DOMAIN_DISK_BUS_NVME:
+        case VIR_DOMAIN_DISK_BUS_NVME_NS:
         case VIR_DOMAIN_DISK_BUS_LAST:
         default:
             *busIdx = 0;
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 5cde6783c2..66e1876d08 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -402,6 +402,7 @@ typedef enum {
     VIR_DOMAIN_DISK_BUS_SATA,
     VIR_DOMAIN_DISK_BUS_SD,
     VIR_DOMAIN_DISK_BUS_NVME,
+    VIR_DOMAIN_DISK_BUS_NVME_NS,
 
     VIR_DOMAIN_DISK_BUS_LAST
 } virDomainDiskBus;
@@ -600,6 +601,7 @@ typedef enum {
     VIR_DOMAIN_CONTROLLER_TYPE_PCI,
     VIR_DOMAIN_CONTROLLER_TYPE_XENBUS,
     VIR_DOMAIN_CONTROLLER_TYPE_ISA,
+    VIR_DOMAIN_CONTROLLER_TYPE_NVME,
 
     VIR_DOMAIN_CONTROLLER_TYPE_LAST
 } virDomainControllerType;
@@ -755,6 +757,10 @@ struct _virDomainXenbusControllerOpts {
     int maxEventChannels; /* -1 == undef */
 };
 
+struct _virDomainNVMeControllerOpts {
+    char *serial;
+};
+
 /* Stores the virtual disk controller configuration */
 struct _virDomainControllerDef {
     virDomainControllerType type;
@@ -770,6 +776,7 @@ struct _virDomainControllerDef {
         virDomainPCIControllerOpts pciopts;
         virDomainUSBControllerOpts usbopts;
         virDomainXenbusControllerOpts xenbusopts;
+        virDomainNVMeControllerOpts nvmeopts;
     } opts;
     virDomainDeviceInfo info;
     virDomainVirtioOptions *virtio;
diff --git a/src/conf/domain_postparse.c b/src/conf/domain_postparse.c
index a07ec8d94e..e1fbcef485 100644
--- a/src/conf/domain_postparse.c
+++ b/src/conf/domain_postparse.c
@@ -523,6 +523,8 @@ virDomainDiskDefPostParse(virDomainDiskDef *disk,
                 disk->bus = VIR_DOMAIN_DISK_BUS_XEN;
             else if (STRPREFIX(disk->dst, "ubd"))
                 disk->bus = VIR_DOMAIN_DISK_BUS_UML;
+            else if (STRPREFIX(disk->dst, "nvmens"))
+                disk->bus = VIR_DOMAIN_DISK_BUS_NVME_NS;
             else if (STRPREFIX(disk->dst, "nvme"))
                 disk->bus = VIR_DOMAIN_DISK_BUS_NVME;
         }
diff --git a/src/conf/domain_validate.c b/src/conf/domain_validate.c
index 4c96d7cacd..0ad33d08df 100644
--- a/src/conf/domain_validate.c
+++ b/src/conf/domain_validate.c
@@ -268,6 +268,7 @@ virDomainDiskAddressDiskBusCompatibility(virDomainDiskBus bus,
     case VIR_DOMAIN_DISK_BUS_SD:
     case VIR_DOMAIN_DISK_BUS_NONE:
     case VIR_DOMAIN_DISK_BUS_NVME:
+    case VIR_DOMAIN_DISK_BUS_NVME_NS:
     case VIR_DOMAIN_DISK_BUS_LAST:
         return true;
     }
diff --git a/src/conf/virconftypes.h b/src/conf/virconftypes.h
index 59be61cea4..83018ad364 100644
--- a/src/conf/virconftypes.h
+++ b/src/conf/virconftypes.h
@@ -272,6 +272,8 @@ typedef struct _virDomainXMLPrivateDataCallbacks virDomainXMLPrivateDataCallback
 
 typedef struct _virDomainXenbusControllerOpts virDomainXenbusControllerOpts;
 
+typedef struct _virDomainNVMeControllerOpts virDomainNVMeControllerOpts;
+
 typedef enum {
     VIR_DOMAIN_DISK_IO_DEFAULT = 0,
     VIR_DOMAIN_DISK_IO_NATIVE,
diff --git a/src/hyperv/hyperv_driver.c b/src/hyperv/hyperv_driver.c
index 708e10b7dc..e932a5e8a7 100644
--- a/src/hyperv/hyperv_driver.c
+++ b/src/hyperv/hyperv_driver.c
@@ -949,6 +949,7 @@ hypervDomainAttachStorage(virDomainPtr domain, virDomainDef *def, const char *ho
         case VIR_DOMAIN_DISK_BUS_SATA:
         case VIR_DOMAIN_DISK_BUS_SD:
         case VIR_DOMAIN_DISK_BUS_NVME:
+        case VIR_DOMAIN_DISK_BUS_NVME_NS:
         case VIR_DOMAIN_DISK_BUS_LAST:
         default:
             virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Unsupported controller type"));
@@ -3092,6 +3093,7 @@ hypervDomainAttachDeviceFlags(virDomainPtr domain, const char *xml, unsigned int
         case VIR_DOMAIN_DISK_BUS_SATA:
         case VIR_DOMAIN_DISK_BUS_SD:
         case VIR_DOMAIN_DISK_BUS_NVME:
+        case VIR_DOMAIN_DISK_BUS_NVME_NS:
         case VIR_DOMAIN_DISK_BUS_LAST:
         default:
             virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Invalid disk bus in definition"));
diff --git a/src/qemu/qemu_alias.c b/src/qemu/qemu_alias.c
index 9d39ebd63d..894274f890 100644
--- a/src/qemu/qemu_alias.c
+++ b/src/qemu/qemu_alias.c
@@ -259,6 +259,7 @@ qemuAssignDeviceDiskAlias(virDomainDef *def,
         case VIR_DOMAIN_DISK_BUS_SATA:
         case VIR_DOMAIN_DISK_BUS_SCSI:
         case VIR_DOMAIN_DISK_BUS_NVME:
+        case VIR_DOMAIN_DISK_BUS_NVME_NS:
             diskPriv->qomName = g_strdup(disk->info.alias);
             break;
 
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index 7b33fa1bec..7a766228db 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -537,6 +537,17 @@ qemuBuildDeviceAddresDriveProps(virJSONValue *props,
         }
 
         break;
+    case VIR_DOMAIN_DISK_BUS_NVME_NS:
+        if (!(controllerAlias = virDomainControllerAliasFind(domainDef,
+                                                                VIR_DOMAIN_CONTROLLER_TYPE_NVME,
+                                                                info->addr.drive.controller)))
+            return -1;
+
+        if (virJSONValueObjectAdd(&props,
+                            "s:bus", controllerAlias,
+                            NULL) < 0)
+            return -1;
+        break;
 
     case VIR_DOMAIN_DISK_BUS_VIRTIO:
     case VIR_DOMAIN_DISK_BUS_USB:
@@ -1738,6 +1749,10 @@ qemuBuildDiskDeviceProps(const virDomainDef *def,
         driver = "nvme";
         break;
 
+    case VIR_DOMAIN_DISK_BUS_NVME_NS:
+        driver = "nvme-ns";
+        break;
+
     case VIR_DOMAIN_DISK_BUS_XEN:
     case VIR_DOMAIN_DISK_BUS_UML:
     case VIR_DOMAIN_DISK_BUS_SD:
@@ -2775,6 +2790,16 @@ qemuBuildControllerDevProps(const virDomainDef *domainDef,
 
         break;
 
+    case VIR_DOMAIN_CONTROLLER_TYPE_NVME:
+        if (virJSONValueObjectAdd(&props,
+                                "s:driver", "nvme",
+                                "s:id", def->info.alias,
+                                "s:serial", def->opts.nvmeopts.serial,
+                                NULL) < 0)
+            return -1;
+
+        break;
+
     case VIR_DOMAIN_CONTROLLER_TYPE_IDE:
     case VIR_DOMAIN_CONTROLLER_TYPE_FDC:
     case VIR_DOMAIN_CONTROLLER_TYPE_XENBUS:
@@ -2937,6 +2962,7 @@ qemuBuildControllersCommandLine(virCommand *cmd,
         VIR_DOMAIN_CONTROLLER_TYPE_IDE,
         VIR_DOMAIN_CONTROLLER_TYPE_SATA,
         VIR_DOMAIN_CONTROLLER_TYPE_VIRTIO_SERIAL,
+        VIR_DOMAIN_CONTROLLER_TYPE_NVME,
     };
 
     for (i = 0; i < G_N_ELEMENTS(contOrder); i++) {
diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c
index df17afb5b9..ac5ccf8f2a 100644
--- a/src/qemu/qemu_domain_address.c
+++ b/src/qemu/qemu_domain_address.c
@@ -616,6 +616,9 @@ qemuDomainDeviceCalculatePCIConnectFlags(virDomainDeviceDef *dev,
             }
             break;
 
+        case VIR_DOMAIN_CONTROLLER_TYPE_NVME:
+            return pciFlags;
+
         case VIR_DOMAIN_CONTROLLER_TYPE_FDC:
         case VIR_DOMAIN_CONTROLLER_TYPE_CCID:
         case VIR_DOMAIN_CONTROLLER_TYPE_XENBUS:
@@ -741,6 +744,7 @@ qemuDomainDeviceCalculatePCIConnectFlags(virDomainDeviceDef *dev,
         case VIR_DOMAIN_DISK_BUS_UML:
         case VIR_DOMAIN_DISK_BUS_SATA:
         case VIR_DOMAIN_DISK_BUS_SD:
+        case VIR_DOMAIN_DISK_BUS_NVME_NS:
         case VIR_DOMAIN_DISK_BUS_NONE:
         case VIR_DOMAIN_DISK_BUS_LAST:
             return 0;
@@ -1922,6 +1926,7 @@ qemuDomainValidateDevicePCISlotsQ35(virDomainDef *def,
         case VIR_DOMAIN_CONTROLLER_TYPE_CCID:
         case VIR_DOMAIN_CONTROLLER_TYPE_XENBUS:
         case VIR_DOMAIN_CONTROLLER_TYPE_ISA:
+        case VIR_DOMAIN_CONTROLLER_TYPE_NVME:
         case VIR_DOMAIN_CONTROLLER_TYPE_LAST:
             break;
         }
diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
index 2673c6818a..301f2fc704 100644
--- a/src/qemu/qemu_hotplug.c
+++ b/src/qemu/qemu_hotplug.c
@@ -1053,6 +1053,7 @@ qemuDomainAttachDeviceDiskLiveInternal(virQEMUDriver *driver,
         /* Note that SD card hotplug support should be added only once
          * they support '-device' (don't require -drive only).
          * See also: qemuDiskBusIsSD */
+    case VIR_DOMAIN_DISK_BUS_NVME_NS:
     case VIR_DOMAIN_DISK_BUS_NONE:
     case VIR_DOMAIN_DISK_BUS_LAST:
         virReportError(VIR_ERR_OPERATION_UNSUPPORTED,
@@ -5733,6 +5734,7 @@ qemuDomainDetachPrepDisk(virDomainObj *vm,
         case VIR_DOMAIN_DISK_BUS_UML:
         case VIR_DOMAIN_DISK_BUS_SATA:
         case VIR_DOMAIN_DISK_BUS_SD:
+        case VIR_DOMAIN_DISK_BUS_NVME_NS:
             virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
                            _("This type of disk cannot be hot unplugged"));
             return -1;
@@ -5807,6 +5809,11 @@ qemuDomainDiskControllerIsBusy(virDomainObj *vm,
                 continue;
             break;
 
+        case VIR_DOMAIN_CONTROLLER_TYPE_NVME:
+            if (disk->bus != VIR_DOMAIN_DISK_BUS_NVME_NS)
+                continue;
+            break;
+
         case VIR_DOMAIN_CONTROLLER_TYPE_XENBUS:
             /* xenbus is not supported by the qemu driver */
             continue;
@@ -5863,6 +5870,7 @@ qemuDomainControllerIsBusy(virDomainObj *vm,
     case VIR_DOMAIN_CONTROLLER_TYPE_USB:
     case VIR_DOMAIN_CONTROLLER_TYPE_PCI:
     case VIR_DOMAIN_CONTROLLER_TYPE_ISA:
+    case VIR_DOMAIN_CONTROLLER_TYPE_NVME:
         /* detach of the controller types above is not yet supported */
         return false;
 
diff --git a/src/qemu/qemu_postparse.c b/src/qemu/qemu_postparse.c
index 49009ae2e4..1513489ab0 100644
--- a/src/qemu/qemu_postparse.c
+++ b/src/qemu/qemu_postparse.c
@@ -429,6 +429,7 @@ qemuDomainControllerDefPostParse(virDomainControllerDef *cont,
     case VIR_DOMAIN_CONTROLLER_TYPE_FDC:
     case VIR_DOMAIN_CONTROLLER_TYPE_XENBUS:
     case VIR_DOMAIN_CONTROLLER_TYPE_ISA:
+    case VIR_DOMAIN_CONTROLLER_TYPE_NVME:
     case VIR_DOMAIN_CONTROLLER_TYPE_LAST:
         break;
     }
diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c
index e7e00fa761..ffa9dcd3cc 100644
--- a/src/qemu/qemu_validate.c
+++ b/src/qemu/qemu_validate.c
@@ -2823,6 +2823,7 @@ qemuValidateDomainDeviceDefDiskIOThreads(const virDomainDef *def,
     case VIR_DOMAIN_DISK_BUS_SD:
     case VIR_DOMAIN_DISK_BUS_NONE:
     case VIR_DOMAIN_DISK_BUS_NVME:
+    case VIR_DOMAIN_DISK_BUS_NVME_NS:
     case VIR_DOMAIN_DISK_BUS_LAST:
         virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
                        _("IOThreads not available for bus %1$s target %2$s"),
@@ -3038,6 +3039,7 @@ qemuValidateDomainDeviceDefDiskFrontend(const virDomainDiskDef *disk,
         case VIR_DOMAIN_DISK_BUS_SATA:
         case VIR_DOMAIN_DISK_BUS_SD:
         case VIR_DOMAIN_DISK_BUS_NVME:
+        case VIR_DOMAIN_DISK_BUS_NVME_NS:
             virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
                            _("disk device='lun' is not supported for bus='%1$s'"),
                            virDomainDiskBusTypeToString(disk->bus));
@@ -3166,6 +3168,14 @@ qemuValidateDomainDeviceDefDiskFrontend(const virDomainDiskDef *disk,
         }
         break;
 
+    case VIR_DOMAIN_DISK_BUS_NVME_NS:
+        if (disk->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DRIVE) {
+            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                           _("unexpected address type for nvme-ns disk"));
+            return -1;
+        }
+        break;
+
     case VIR_DOMAIN_DISK_BUS_XEN:
     case VIR_DOMAIN_DISK_BUS_SD:
     case VIR_DOMAIN_DISK_BUS_NONE:
@@ -3355,6 +3365,7 @@ qemuValidateDomainDeviceDefDiskTransient(const virDomainDiskDef *disk,
         case VIR_DOMAIN_DISK_BUS_VIRTIO:
         case VIR_DOMAIN_DISK_BUS_SCSI:
         case VIR_DOMAIN_DISK_BUS_NVME:
+        case VIR_DOMAIN_DISK_BUS_NVME_NS:
             break;
 
         case VIR_DOMAIN_DISK_BUS_IDE:
@@ -4356,6 +4367,7 @@ qemuValidateDomainDeviceDefController(const virDomainControllerDef *controller,
     case VIR_DOMAIN_CONTROLLER_TYPE_USB:
     case VIR_DOMAIN_CONTROLLER_TYPE_XENBUS:
     case VIR_DOMAIN_CONTROLLER_TYPE_ISA:
+    case VIR_DOMAIN_CONTROLLER_TYPE_NVME:
     case VIR_DOMAIN_CONTROLLER_TYPE_LAST:
         break;
     }
diff --git a/src/test/test_driver.c b/src/test/test_driver.c
index 30eec56941..0b6a57d595 100644
--- a/src/test/test_driver.c
+++ b/src/test/test_driver.c
@@ -10345,6 +10345,7 @@ testDomainAttachDeviceDiskLiveInternal(testDriver *driver G_GNUC_UNUSED,
     case VIR_DOMAIN_DISK_BUS_SATA:
     case VIR_DOMAIN_DISK_BUS_SD:
     case VIR_DOMAIN_DISK_BUS_NVME:
+    case VIR_DOMAIN_DISK_BUS_NVME_NS:
     case VIR_DOMAIN_DISK_BUS_NONE:
     case VIR_DOMAIN_DISK_BUS_LAST:
         virReportError(VIR_ERR_OPERATION_UNSUPPORTED,
@@ -10794,6 +10795,7 @@ testDomainDetachPrepDisk(virDomainObj *vm,
         case VIR_DOMAIN_DISK_BUS_UML:
         case VIR_DOMAIN_DISK_BUS_SATA:
         case VIR_DOMAIN_DISK_BUS_SD:
+        case VIR_DOMAIN_DISK_BUS_NVME_NS:
             virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
                            _("This type of disk cannot be hot unplugged"));
             return -1;
diff --git a/src/util/virutil.c b/src/util/virutil.c
index 521c91d043..249d5e803b 100644
--- a/src/util/virutil.c
+++ b/src/util/virutil.c
@@ -327,7 +327,7 @@ int virDiskNameParse(const char *name, int *disk, int *partition)
     const char *ptr = NULL;
     char *rem;
     int idx = 0;
-    static char const* const drive_prefix[] = {"fd", "hd", "vd", "sd", "xvd", "ubd", "nvme"};
+    static char const* const drive_prefix[] = {"fd", "hd", "vd", "sd", "xvd", "ubd", "nvmens", "nvme"};
     size_t i;
     size_t n_digits;
 
diff --git a/src/vbox/vbox_common.c b/src/vbox/vbox_common.c
index f0e88874da..16cf2928b6 100644
--- a/src/vbox/vbox_common.c
+++ b/src/vbox/vbox_common.c
@@ -494,6 +494,7 @@ vboxSetStorageController(virDomainControllerDef *controller,
     case VIR_DOMAIN_CONTROLLER_TYPE_PCI:
     case VIR_DOMAIN_CONTROLLER_TYPE_XENBUS:
     case VIR_DOMAIN_CONTROLLER_TYPE_ISA:
+    case VIR_DOMAIN_CONTROLLER_TYPE_NVME:
     case VIR_DOMAIN_CONTROLLER_TYPE_LAST:
         vboxReportError(VIR_ERR_CONFIG_UNSUPPORTED,
                         _("The vbox driver does not support %1$s controller type"),
@@ -1239,6 +1240,7 @@ vboxAttachDrives(virDomainDef *def, struct _vboxDriver *data, IMachine *machine)
         case VIR_DOMAIN_DISK_BUS_UML:
         case VIR_DOMAIN_DISK_BUS_SD:
         case VIR_DOMAIN_DISK_BUS_NVME:
+        case VIR_DOMAIN_DISK_BUS_NVME_NS:
         case VIR_DOMAIN_DISK_BUS_NONE:
         case VIR_DOMAIN_DISK_BUS_LAST:
             vboxReportError(VIR_ERR_CONFIG_UNSUPPORTED,
diff --git a/src/vmx/vmx.c b/src/vmx/vmx.c
index b66aeea5c5..cd8c1f6c59 100644
--- a/src/vmx/vmx.c
+++ b/src/vmx/vmx.c
@@ -2250,6 +2250,7 @@ virVMXGenerateDiskTarget(virDomainDiskDef *def,
     case VIR_DOMAIN_DISK_BUS_UML:
     case VIR_DOMAIN_DISK_BUS_SD:
     case VIR_DOMAIN_DISK_BUS_NVME:
+    case VIR_DOMAIN_DISK_BUS_NVME_NS:
         virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
                        _("Unsupported bus type '%1$s' for device type '%2$s'"),
                        virDomainDiskBusTypeToString(def->bus),
-- 
2.11.0



[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]

  Powered by Linux