From nobody Tue Sep 9 03:13:20 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) client-ip=8.43.85.245; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass(p=reject dis=none) header.from=lists.libvirt.org ARC-Seal: i=1; a=rsa-sha256; t=1748860600; cv=none; d=zohomail.com; s=zohoarc; b=LaK3Uece9LYtQqErA7ZAeOTF9mkpG2Maax+CYNPbtd+Hn6gE/7ANSvHdIrCT1kZOUq2tuSIpEWz0tgHmtut8ZrsWGZV9mZyEMG7aphXTxPfgWmFgTczllMFOzEkcI7b4hwJF9WsPTeRSTF/aE26jyLIfavWueTyowfsNn7xF9cw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1748860600; h=Content-Type:Content-Transfer-Encoding:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Reply-To:References:Subject:Subject:To:To:Message-Id:Cc; bh=dqqpb0j7IVAHvezCSZRR1dLhVQibz9KL8oPCdv0BEpI=; b=am5rEXoScGjNw+YsqdnaXS0AamUk14lMHe2bvl7iehJOE6tYyl5WRvSRHcw7GeCOVl8pTKCjHsY2zpqUwrk9M40VztqCirCgA9E4PPP0JqxEVIM/SpOoV4rgMLpTd70w4Qyl2Gjeq1ch7acQsZ/OsdYZGW/jpsE2YJBwBUZm6tM= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [8.43.85.245]) by mx.zohomail.com with SMTPS id 1748860600253431.7169179515513; Mon, 2 Jun 2025 03:36:40 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 4EC6213DC; Mon, 2 Jun 2025 06:36:39 -0400 (EDT) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id F165314F0; Mon, 2 Jun 2025 06:31:25 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 996) id CE5E6E7A; Mon, 2 Jun 2025 06:31:05 -0400 (EDT) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id E38391083 for ; Mon, 2 Jun 2025 06:31:03 -0400 (EDT) Received: from mail-wr1-f70.google.com (mail-wr1-f70.google.com [209.85.221.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-693-kMavpO2kPIOJ0o_9XsZcUg-1; Mon, 02 Jun 2025 06:31:02 -0400 Received: by mail-wr1-f70.google.com with SMTP id ffacd0b85a97d-3a4f6ba526eso2071218f8f.1 for ; Mon, 02 Jun 2025 03:31:02 -0700 (PDT) Received: from wheatley.localdomain ([85.93.96.130]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-450d7f8ed1bsm121516705e9.8.2025.06.02.03.30.57 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Jun 2025 03:30:58 -0700 (PDT) Received: from wheatley.brq.redhat.com (wheatley.k8r.cz [127.0.0.1]) by wheatley.localdomain (Postfix) with ESMTP id 70994B55DC76 for ; Mon, 02 Jun 2025 12:30:57 +0200 (CEST) X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=DKIM_INVALID,DKIM_SIGNED, MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H5, RCVD_IN_MSPIKE_WL,RCVD_IN_VALIDITY_RPBL_BLOCKED, RCVD_IN_VALIDITY_SAFE_BLOCKED,SPF_HELO_NONE autolearn=unavailable autolearn_force=no version=3.4.4 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1748860263; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=jFcmBF9tYEGhFFxfsxig44L74ZpnxWn3O8SqcqivFjA=; b=RLBLmqrKfUp7JS6NuodsT9bixHJovw0bvjaHdIW5nkRa17kBLtvuZrAdLJ/r/UGayZVc5h 1Lzb7VNT7z9n1spMIUKZgDaizSnX4FASfmADvhRZtDNbcnDxMSnUIR0KhfhU07oVtktJ5Q W88x6pnb6pvCdagk7k61vWl7JBI7SPY= X-MC-Unique: kMavpO2kPIOJ0o_9XsZcUg-1 X-Mimecast-MFC-AGG-ID: kMavpO2kPIOJ0o_9XsZcUg_1748860261 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1748860261; x=1749465061; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=jFcmBF9tYEGhFFxfsxig44L74ZpnxWn3O8SqcqivFjA=; b=DR4Wk70locKtutpKJlymvT3qP/R0MlYdnSSiEZImDuIzUBJ9z3pT+5ta4+tYOrbuiP hASY93Z0OkoE6TxHlTmbkTJsjMbj6GIS3GeDAuvLFf0kbt2eBdrwUhgXljscpVhwmQJG ZAGDtTEHhrBIZI1tUSoCYVo03b2Kfq1ks9IVY0KiRoNbdNA3uFt9YxsSs3SpDUGPOeXI mmgKP2Ggy8Z/bf0aLDz26AhKFqXb/iKQEDUVz3wGUAO5gZTQXubpGeQUshQjelRr4u9m Y6Zpi3jH2HcDZsBxj/2f/5YaJgKMiGYywXvPXayJsk791qZ5CNOs6imAULH0/6Ydc/ZV vUrQ== X-Gm-Message-State: AOJu0YwzNDDriqbA1XOeCHTDEXcjR1AG+rkFmquSf0SwQhQe+RJ4rhl1 NIOa/RYhrgHL8EthB3jTCPOQsbM2KIe+HV8jPWr2xS7iaE1oulcS4xSDIhL0/ydwNNrtmSQubqH J6kCAy0d/n6cNJ1uXRgPF1y61IuK1hhYi0fhyWZ/tE0o/+zLoqoHJySQSjU7J3nPD0gBm0MUfIe EEEN8rPY/lp/i59k2NUifyyJOFB+lD4DKoXVs+tk5NDFw= X-Gm-Gg: ASbGnctp+J3s7JBKIzzmjOVSZJKt2w3cs8Rp8NfsSYOIIe/9DnjUDP2f+MQcHoeQUER r7YNfFQ3GtZVsE74q9+KeI15bMzAyF6H91eQ23C7x96haDTWT9stmnK2ARYpzp/xQ1fuOwe2Eyd OGFITgoEhS+hX00ptDqDFDv1o5nSBThJhvf+x0YwVX2NK+VeA7h5BulOYFLQnpxonIREijieebt T+bn/ci9uD14td3a1y9Plup1eHqzt9C/BP1RDrmLu/PjuL/IamH+3fnRvb0014tBi0AWZcD88kq IeqK3XOd80JycXHlQIKQ9f4kpCc8LdU= X-Received: by 2002:a5d:5f50:0:b0:3a4:d994:be4b with SMTP id ffacd0b85a97d-3a4f89a47a7mr9643268f8f.1.1748860261125; Mon, 02 Jun 2025 03:31:01 -0700 (PDT) X-Google-Smtp-Source: AGHT+IFRPuPsthvQDXGpDE1HF+qcBCbIakIKW3inHtkJZgqIdbvzQIiBZFam+DgEVMx77kDxwxLZwA== X-Received: by 2002:a5d:5f50:0:b0:3a4:d994:be4b with SMTP id ffacd0b85a97d-3a4f89a47a7mr9643232f8f.1.1748860260446; Mon, 02 Jun 2025 03:31:00 -0700 (PDT) To: devel@lists.libvirt.org Subject: [PATCH 04/11] docs, conf, schemas: Add support for NVMe disks Date: Mon, 2 Jun 2025 12:30:47 +0200 Message-ID: X-Mailer: git-send-email 2.49.0 In-Reply-To: References: MIME-Version: 1.0 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: gZEHmjTCUUyTZxGPx-i6XNGKtharhxt658IzydygC_4_1748860261 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Message-ID-Hash: UQ2YLRO4I2CT67B7FK55IFAOAFWGXIQX X-Message-ID-Hash: UQ2YLRO4I2CT67B7FK55IFAOAFWGXIQX X-MailFrom: mkletzan@redhat.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-config-1; header-match-config-2; header-match-config-3; header-match-devel.lists.libvirt.org-0; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; suspicious-header X-Mailman-Version: 3.2.2 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Post: List-Subscribe: List-Unsubscribe: From: Martin Kletzander via Devel Reply-To: Martin Kletzander X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1748860601415116600 Content-Type: text/plain; charset="utf-8"; x-default="true" From: Martin Kletzander NVMe disks are essentially a namespace of an NVMe controller, but to make it easier for the users to just add a disk, the necessary details like adding the proper controller, setting the serial number for the controller based on the disk, are done automatically. Signed-off-by: Martin Kletzander Signed-off-by: Honglei Wang --- docs/formatdomain.rst | 9 ++- src/conf/domain_conf.c | 63 +++++++++++++++++-- src/conf/domain_conf.h | 1 + src/conf/domain_postparse.c | 2 + src/conf/domain_validate.c | 4 +- src/conf/schemas/domaincommon.rng | 12 +++- src/hyperv/hyperv_driver.c | 2 + src/qemu/qemu_alias.c | 1 + src/qemu/qemu_command.c | 2 + src/qemu/qemu_domain_address.c | 1 + src/qemu/qemu_hotplug.c | 2 + src/qemu/qemu_validate.c | 7 ++- src/test/test_driver.c | 2 + src/vbox/vbox_common.c | 1 + src/vmx/vmx.c | 1 + .../disk-nvme-invalid-serials.xml | 29 +++++++++ tests/genericxml2xmlindata/disk-nvme.xml | 32 ++++++++++ tests/genericxml2xmloutdata/disk-nvme.xml | 38 +++++++++++ tests/genericxml2xmltest.c | 2 + 19 files changed, 199 insertions(+), 12 deletions(-) create mode 100644 tests/genericxml2xmlindata/disk-nvme-invalid-serials.xml create mode 100644 tests/genericxml2xmlindata/disk-nvme.xml create mode 100644 tests/genericxml2xmloutdata/disk-nvme.xml diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst index fdc90c61f86d..9f3d09ba1e32 100644 --- a/docs/formatdomain.rst +++ b/docs/formatdomain.rst @@ -2824,7 +2824,7 @@ paravirtualized driver is specified via the ``disk`` = element. - + @@ -3313,7 +3313,8 @@ paravirtualized driver is specified via the ``disk`` = element. name in the guest OS. Treat it as a device ordering hint. The optional ``bus`` attribute specifies the type of disk device to emulate; possible values are driver specific, with typical values being "ide", "scsi", - "virtio", "xen", "usb", "sata", or "sd" :since:`"sd" since 1.1.2`. If + "virtio", "xen", "usb", "sata", "sd", or "nvme" + :since:`"sd" since 1.1.2, "nvme" since 11.5.0`. If omitted, the bus type is inferred from the style of the device name (e.= g. a device named 'sda' will typically be exported using a SCSI bus). The op= tional attribute ``tray`` indicates the tray status of the removable disks (i.= e. @@ -3651,7 +3652,9 @@ paravirtualized driver is specified via the ``disk`` = element. If present, this specify serial number of virtual hard drive. For examp= le, it may look like ``WD-WMAP9A966149``. Not supported for scsi-block devices, that is those using disk ``type`` 'block' using - ``device`` 'lun' on ``bus`` 'scsi'. :since:`Since 0.7.1` + ``device`` 'lun' on ``bus`` 'scsi'. Also not supported for multiple NVMe + devices on the same controller since those have serial number per contr= oller + and not per disk. :since:`Since 0.7.1` =20 Note that depending on hypervisor and device type the serial number may= be truncated silently. IDE/SATA devices are commonly limited to 20 charact= ers. diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index c046f5e7cbe5..f3a118e8fc8a 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -372,6 +372,7 @@ VIR_ENUM_IMPL(virDomainDiskBus, "uml", "sata", "sd", + "nvme", ); =20 VIR_ENUM_IMPL(virDomainDiskCache, @@ -6813,8 +6814,10 @@ virDomainDiskDefAssignAddress(virDomainXMLOption *xm= lopt G_GNUC_UNUSED, virDomainDiskDef *def, const virDomainDef *vmdef) { - int idx =3D virDiskNameToIndex(def->dst); - if (idx < 0) { + int idx =3D 0; + int nvme_ctrl =3D 0; + + if (virDiskNameParse(def->dst, &nvme_ctrl, &idx, NULL) < 0) { virReportError(VIR_ERR_XML_ERROR, _("Unknown disk name '%1$s' and no address specifie= d"), def->dst); @@ -6891,6 +6894,13 @@ virDomainDiskDefAssignAddress(virDomainXMLOption *xm= lopt G_GNUC_UNUSED, def->info.addr.drive.unit =3D idx % 2; break; =20 + case VIR_DOMAIN_DISK_BUS_NVME: + def->info.type =3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DRIVE; + def->info.addr.drive.controller =3D nvme_ctrl; + def->info.addr.drive.bus =3D 0; + def->info.addr.drive.unit =3D idx; + break; + case VIR_DOMAIN_DISK_BUS_NONE: case VIR_DOMAIN_DISK_BUS_VIRTIO: case VIR_DOMAIN_DISK_BUS_XEN: @@ -15026,6 +15036,10 @@ virDomainDiskControllerMatch(int controller_type, = int disk_bus) disk_bus =3D=3D VIR_DOMAIN_DISK_BUS_SATA) return true; =20 + if (controller_type =3D=3D VIR_DOMAIN_CONTROLLER_TYPE_NVME && + disk_bus =3D=3D VIR_DOMAIN_DISK_BUS_NVME) + return true; + return false; } =20 @@ -22675,6 +22689,36 @@ virDomainDefMaybeAddSmartcardController(virDomainD= ef *def) } } =20 +static int +virDomainDefMaybeAssignNvmeControllerSerials(virDomainDef *def) +{ + size_t i =3D 0; + + for (i =3D 0; i < def->ndisks; i++) { + virDomainDiskDef *disk =3D def->disks[i]; + virDomainControllerDef *ctrl =3D NULL; + + if (!disk->serial || + disk->bus !=3D VIR_DOMAIN_DISK_BUS_NVME || + def->disks[i]->info.type !=3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_D= RIVE) + continue; + + ctrl =3D virDomainDeviceFindNvmeController(def, &disk->info.addr.d= rive); + if (ctrl) { + if (!ctrl->opts.nvmeopts.serial) { + ctrl->opts.nvmeopts.serial =3D g_strdup(disk->serial); + } else if (STRNEQ_NULLABLE(disk->serial, ctrl->opts.nvmeopts.s= erial)) { + virReportError(VIR_ERR_XML_DETAIL, "%s", + _("Conflicting NVME disk serial number, all= disks on a controller must have the same serial number as the controller i= tself")); + return -1; + } + } + } + + return 0; +} + + /* * Based on the declared
info for any devices, * add necessary drive controllers which are not already present @@ -22692,6 +22736,8 @@ virDomainDefAddImplicitControllers(virDomainDef *de= f) VIR_DOMAIN_DISK_BUS_IDE); virDomainDefAddDiskControllersForType(def, VIR_DOMAIN_CONTROLLER_TYPE_= SATA, VIR_DOMAIN_DISK_BUS_SATA); + virDomainDefAddDiskControllersForType(def, VIR_DOMAIN_CONTROLLER_TYPE_= NVME, + VIR_DOMAIN_DISK_BUS_NVME); =20 virDomainDefMaybeAddVirtioSerialController(def); virDomainDefMaybeAddSmartcardController(def); @@ -22724,6 +22770,9 @@ virDomainDefAddImplicitDevices(virDomainDef *def, v= irDomainXMLOption *xmlopt) } virDomainDefAddImplicitControllers(def); =20 + if (virDomainDefMaybeAssignNvmeControllerSerials(def) < 0) + return -1; + if (virDomainDefAddImplicitVideo(def, xmlopt) < 0) return -1; =20 @@ -29685,8 +29734,10 @@ virDiskNameToBusDeviceIndex(virDomainDiskDef *disk, int *busIdx, int *devIdx) { - int idx =3D virDiskNameToIndex(disk->dst); - if (idx < 0) + int idx =3D -1; + int nvme_ctrl =3D 0; + + if (virDiskNameParse(disk->dst, &nvme_ctrl, &idx, NULL) < 0 || idx < 0) return -1; =20 switch (disk->bus) { @@ -29698,6 +29749,10 @@ virDiskNameToBusDeviceIndex(virDomainDiskDef *disk, *busIdx =3D idx / 7; *devIdx =3D idx % 7; break; + case VIR_DOMAIN_DISK_BUS_NVME: + *busIdx =3D nvme_ctrl; + *devIdx =3D idx; + break; case VIR_DOMAIN_DISK_BUS_FDC: case VIR_DOMAIN_DISK_BUS_USB: case VIR_DOMAIN_DISK_BUS_VIRTIO: diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index c54e4759a783..3001e51c8ea6 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -401,6 +401,7 @@ typedef enum { VIR_DOMAIN_DISK_BUS_UML, VIR_DOMAIN_DISK_BUS_SATA, VIR_DOMAIN_DISK_BUS_SD, + VIR_DOMAIN_DISK_BUS_NVME, =20 VIR_DOMAIN_DISK_BUS_LAST } virDomainDiskBus; diff --git a/src/conf/domain_postparse.c b/src/conf/domain_postparse.c index bf33f29638ff..a07ec8d94e65 100644 --- a/src/conf/domain_postparse.c +++ b/src/conf/domain_postparse.c @@ -523,6 +523,8 @@ virDomainDiskDefPostParse(virDomainDiskDef *disk, disk->bus =3D VIR_DOMAIN_DISK_BUS_XEN; else if (STRPREFIX(disk->dst, "ubd")) disk->bus =3D VIR_DOMAIN_DISK_BUS_UML; + else if (STRPREFIX(disk->dst, "nvme")) + disk->bus =3D VIR_DOMAIN_DISK_BUS_NVME; } } =20 diff --git a/src/conf/domain_validate.c b/src/conf/domain_validate.c index d0d4bc0bf4b7..96f76f2f7bba 100644 --- a/src/conf/domain_validate.c +++ b/src/conf/domain_validate.c @@ -260,6 +260,7 @@ virDomainDiskAddressDiskBusCompatibility(virDomainDiskB= us bus, case VIR_DOMAIN_DISK_BUS_FDC: case VIR_DOMAIN_DISK_BUS_SCSI: case VIR_DOMAIN_DISK_BUS_SATA: + case VIR_DOMAIN_DISK_BUS_NVME: return addressType =3D=3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DRIVE; case VIR_DOMAIN_DISK_BUS_VIRTIO: case VIR_DOMAIN_DISK_BUS_XEN: @@ -948,7 +949,8 @@ virDomainDiskDefValidate(const virDomainDef *def, !STRPREFIX(disk->dst, "sd") && !STRPREFIX(disk->dst, "vd") && !STRPREFIX(disk->dst, "xvd") && - !STRPREFIX(disk->dst, "ubd")) { + !STRPREFIX(disk->dst, "ubd") && + !STRPREFIX(disk->dst, "nvme")) { virReportError(VIR_ERR_INTERNAL_ERROR, _("Invalid harddisk device name: %1$s"), disk->dst); return -1; diff --git a/src/conf/schemas/domaincommon.rng b/src/conf/schemas/domaincom= mon.rng index 029d4ed4ec7a..a5a0f337684c 100644 --- a/src/conf/schemas/domaincommon.rng +++ b/src/conf/schemas/domaincommon.rng @@ -2517,9 +2517,14 @@ =20 - - (ioemu:)?(fd|hd|sd|vd|xvd|ubd)[a-zA-Z0-9_]+<= /param> - + + + (ioemu:)?(fd|hd|sd|vd|xvd|ubd)[a-zA-Z0-9_]= + + + + nvme[0-9]+n[0-9]+(p[0-9]+)? + + =20 @@ -2539,6 +2544,7 @@ uml sata sd + nvme diff --git a/src/hyperv/hyperv_driver.c b/src/hyperv/hyperv_driver.c index 0d1e388c08d7..126453eda4ab 100644 --- a/src/hyperv/hyperv_driver.c +++ b/src/hyperv/hyperv_driver.c @@ -948,6 +948,7 @@ hypervDomainAttachStorage(virDomainPtr domain, virDomai= nDef *def, const char *ho case VIR_DOMAIN_DISK_BUS_UML: case VIR_DOMAIN_DISK_BUS_SATA: case VIR_DOMAIN_DISK_BUS_SD: + case VIR_DOMAIN_DISK_BUS_NVME: case VIR_DOMAIN_DISK_BUS_LAST: default: virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Unsupported co= ntroller type")); @@ -3078,6 +3079,7 @@ hypervDomainAttachDeviceFlags(virDomainPtr domain, co= nst char *xml, unsigned int case VIR_DOMAIN_DISK_BUS_UML: case VIR_DOMAIN_DISK_BUS_SATA: case VIR_DOMAIN_DISK_BUS_SD: + case VIR_DOMAIN_DISK_BUS_NVME: case VIR_DOMAIN_DISK_BUS_LAST: default: virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Invalid disk b= us in definition")); diff --git a/src/qemu/qemu_alias.c b/src/qemu/qemu_alias.c index 3e6bced4a885..9d39ebd63da1 100644 --- a/src/qemu/qemu_alias.c +++ b/src/qemu/qemu_alias.c @@ -258,6 +258,7 @@ qemuAssignDeviceDiskAlias(virDomainDef *def, case VIR_DOMAIN_DISK_BUS_IDE: case VIR_DOMAIN_DISK_BUS_SATA: case VIR_DOMAIN_DISK_BUS_SCSI: + case VIR_DOMAIN_DISK_BUS_NVME: diskPriv->qomName =3D g_strdup(disk->info.alias); break; =20 diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 07963e33b351..528a8fc8ca86 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -532,6 +532,7 @@ qemuBuildDeviceAddresDriveProps(virJSONValue *props, =20 break; =20 + case VIR_DOMAIN_DISK_BUS_NVME: case VIR_DOMAIN_DISK_BUS_VIRTIO: case VIR_DOMAIN_DISK_BUS_USB: case VIR_DOMAIN_DISK_BUS_XEN: @@ -1722,6 +1723,7 @@ qemuBuildDiskDeviceProps(const virDomainDef *def, driver =3D "floppy"; break; =20 + case VIR_DOMAIN_DISK_BUS_NVME: case VIR_DOMAIN_DISK_BUS_XEN: case VIR_DOMAIN_DISK_BUS_UML: case VIR_DOMAIN_DISK_BUS_SD: diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c index 7bc769fc1934..9b2faf1e8e37 100644 --- a/src/qemu/qemu_domain_address.c +++ b/src/qemu/qemu_domain_address.c @@ -739,6 +739,7 @@ qemuDomainDeviceCalculatePCIConnectFlags(virDomainDevic= eDef *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: case VIR_DOMAIN_DISK_BUS_NONE: case VIR_DOMAIN_DISK_BUS_LAST: return 0; diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 7a1170b2ddd1..9427eec64384 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -1058,6 +1058,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: case VIR_DOMAIN_DISK_BUS_NONE: case VIR_DOMAIN_DISK_BUS_LAST: virReportError(VIR_ERR_OPERATION_UNSUPPORTED, @@ -5776,6 +5777,7 @@ qemuDomainDetachPrepDisk(virDomainObj *vm, case VIR_DOMAIN_DISK_BUS_SCSI: break; =20 + case VIR_DOMAIN_DISK_BUS_NVME: case VIR_DOMAIN_DISK_BUS_IDE: case VIR_DOMAIN_DISK_BUS_FDC: case VIR_DOMAIN_DISK_BUS_XEN: diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c index 8acc44747456..a264185f5f43 100644 --- a/src/qemu/qemu_validate.c +++ b/src/qemu/qemu_validate.c @@ -2945,6 +2945,7 @@ qemuValidateDomainDeviceDefDiskIOThreads(const virDom= ainDef *def, case VIR_DOMAIN_DISK_BUS_SATA: case VIR_DOMAIN_DISK_BUS_SD: case VIR_DOMAIN_DISK_BUS_NONE: + case VIR_DOMAIN_DISK_BUS_NVME: case VIR_DOMAIN_DISK_BUS_LAST: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("IOThreads not available for bus %1$s target %2$s= "), @@ -3086,6 +3087,7 @@ qemuValidateDomainDeviceDefDiskFrontend(const virDoma= inDiskDef *disk, case VIR_DOMAIN_DISK_BUS_UML: case VIR_DOMAIN_DISK_BUS_SATA: case VIR_DOMAIN_DISK_BUS_SD: + case VIR_DOMAIN_DISK_BUS_NVME: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("disk device=3D'lun' is not supported for bus= =3D'%1$s'"), virDomainDiskBusTypeToString(disk->bus)); @@ -3201,6 +3203,7 @@ qemuValidateDomainDeviceDefDiskFrontend(const virDoma= inDiskDef *disk, =20 break; =20 + case VIR_DOMAIN_DISK_BUS_NVME: case VIR_DOMAIN_DISK_BUS_XEN: case VIR_DOMAIN_DISK_BUS_SD: case VIR_DOMAIN_DISK_BUS_NONE: @@ -3397,6 +3400,7 @@ qemuValidateDomainDeviceDefDiskTransient(const virDom= ainDiskDef *disk, case VIR_DOMAIN_DISK_BUS_UML: case VIR_DOMAIN_DISK_BUS_SATA: case VIR_DOMAIN_DISK_BUS_SD: + case VIR_DOMAIN_DISK_BUS_NVME: case VIR_DOMAIN_DISK_BUS_NONE: case VIR_DOMAIN_DISK_BUS_LAST: default: @@ -3418,6 +3422,7 @@ qemuValidateDomainDeviceDefDisk(const virDomainDiskDe= f *disk, { const char *driverName =3D virDomainDiskGetDriver(disk); virStorageSource *n; + int nvme_ctrl; int idx; int partition; =20 @@ -3445,7 +3450,7 @@ qemuValidateDomainDeviceDefDisk(const virDomainDiskDe= f *disk, return -1; } =20 - if (virDiskNameParse(disk->dst, NULL, &idx, &partition) < 0) { + if (virDiskNameParse(disk->dst, &nvme_ctrl, &idx, &partition) < 0) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("invalid disk target '%1$s'"), disk->dst); return -1; diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 6f18b2b2c820..25335d90027e 100644 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -10344,6 +10344,7 @@ testDomainAttachDeviceDiskLiveInternal(testDriver *= driver G_GNUC_UNUSED, case VIR_DOMAIN_DISK_BUS_UML: case VIR_DOMAIN_DISK_BUS_SATA: case VIR_DOMAIN_DISK_BUS_SD: + case VIR_DOMAIN_DISK_BUS_NVME: case VIR_DOMAIN_DISK_BUS_NONE: case VIR_DOMAIN_DISK_BUS_LAST: virReportError(VIR_ERR_OPERATION_UNSUPPORTED, @@ -10792,6 +10793,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: virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s", _("This type of disk cannot be hot unplugged")); return -1; diff --git a/src/vbox/vbox_common.c b/src/vbox/vbox_common.c index 95c70671a752..ed21798b2c7e 100644 --- a/src/vbox/vbox_common.c +++ b/src/vbox/vbox_common.c @@ -1239,6 +1239,7 @@ vboxAttachDrives(virDomainDef *def, struct _vboxDrive= r *data, IMachine *machine) case VIR_DOMAIN_DISK_BUS_USB: case VIR_DOMAIN_DISK_BUS_UML: case VIR_DOMAIN_DISK_BUS_SD: + case VIR_DOMAIN_DISK_BUS_NVME: 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 4a9ad11b42c4..7fa00669a717 100644 --- a/src/vmx/vmx.c +++ b/src/vmx/vmx.c @@ -2240,6 +2240,7 @@ virVMXGenerateDiskTarget(virDomainDiskDef *def, prefix =3D "fd"; break; =20 + case VIR_DOMAIN_DISK_BUS_NVME: case VIR_DOMAIN_DISK_BUS_VIRTIO: case VIR_DOMAIN_DISK_BUS_XEN: case VIR_DOMAIN_DISK_BUS_USB: diff --git a/tests/genericxml2xmlindata/disk-nvme-invalid-serials.xml b/tes= ts/genericxml2xmlindata/disk-nvme-invalid-serials.xml new file mode 100644 index 000000000000..dcfe6eaacfbf --- /dev/null +++ b/tests/genericxml2xmlindata/disk-nvme-invalid-serials.xml @@ -0,0 +1,29 @@ + + bar + 00010203-0405-4607-8809-0a0b0c0d0e0f + 219136 + 219136 + 1 + + hvm + + + + destroy + restart + destroy + + + + + + abcdefgh + + + + + + IJKLMNOP + + + diff --git a/tests/genericxml2xmlindata/disk-nvme.xml b/tests/genericxml2xm= lindata/disk-nvme.xml new file mode 100644 index 000000000000..bdfec4ef7b7c --- /dev/null +++ b/tests/genericxml2xmlindata/disk-nvme.xml @@ -0,0 +1,32 @@ + + bar + 00010203-0405-4607-8809-0a0b0c0d0e0f + 219136 + 219136 + 1 + + hvm + + + + destroy + restart + destroy + + + + + + + + + + + abcdefgh + + + + CDEFGAHC + + + diff --git a/tests/genericxml2xmloutdata/disk-nvme.xml b/tests/genericxml2x= mloutdata/disk-nvme.xml new file mode 100644 index 000000000000..4251e1288eaf --- /dev/null +++ b/tests/genericxml2xmloutdata/disk-nvme.xml @@ -0,0 +1,38 @@ + + bar + 00010203-0405-4607-8809-0a0b0c0d0e0f + 219136 + 219136 + 1 + + hvm + + + + destroy + restart + destroy + + + + + +
+ + + + + + abcdefgh +
+ + + + CDEFGAHC + + + + abcdefgh + + + diff --git a/tests/genericxml2xmltest.c b/tests/genericxml2xmltest.c index f4e04d84f825..6757fc44ded1 100644 --- a/tests/genericxml2xmltest.c +++ b/tests/genericxml2xmltest.c @@ -232,6 +232,8 @@ mymain(void) DO_TEST("fibrechannel-appid"); =20 DO_TEST("controller-nvme"); + DO_TEST_DIFFERENT("disk-nvme"); + DO_TEST_FAIL_INACTIVE("disk-nvme-invalid-serials"); =20 #define DO_TEST_BACKUP_FULL(name, intrnl) \ do { \ --=20 2.49.0