From 886188a9c11ff9518c8f20e265e7a98439c14d32 Mon Sep 17 00:00:00 2001 From: Klaus Jensen Date: Thu, 11 Feb 2021 11:50:19 +0100 Subject: [PATCH 1/3] hw/block/nvme: fix legacy namespace registration Moving namespace registration to the nvme-ns realization function had the unintended side-effect of breaking legacy namespace registration. Fix this. Fixes: 15d024d4aa9b ("hw/block/nvme: split setup and register for namespace") Reported-by: Alexander Graf Cc: Minwoo Im Tested-by: Alexander Graf Reviewed-by: Minwoo Im Signed-off-by: Klaus Jensen --- hw/block/nvme.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/hw/block/nvme.c b/hw/block/nvme.c index 5ce21b7100..02390f1f52 100644 --- a/hw/block/nvme.c +++ b/hw/block/nvme.c @@ -4507,6 +4507,10 @@ static void nvme_realize(PCIDevice *pci_dev, Error **errp) if (nvme_ns_setup(ns, errp)) { return; } + + if (nvme_register_namespace(n, ns, errp)) { + return; + } } } From 2132cfe52bd87f191887c1728190bf56e8d5275f Mon Sep 17 00:00:00 2001 From: Bin Meng Date: Wed, 10 Feb 2021 19:22:21 +0800 Subject: [PATCH 2/3] hw/block/nvme: Fix a build error in nvme_get_feature() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Current QEMU HEAD nvme.c does not compile with the default GCC 5.4 on a Ubuntu 16.04 host: hw/block/nvme.c:3242:9: error: ‘result’ may be used uninitialized in this function [-Werror=maybe-uninitialized] trace_pci_nvme_getfeat_vwcache(result ? "enabled" : "disabled"); ^ hw/block/nvme.c:3150:14: note: ‘result’ was declared here uint32_t result; ^ Explicitly initialize the result to fix it. Fixes: aa5e55e3b07e ("hw/block/nvme: open code for volatile write cache") Fixes: Coverity CID 1446371 Signed-off-by: Bin Meng Signed-off-by: Klaus Jensen --- hw/block/nvme.c | 1 + 1 file changed, 1 insertion(+) diff --git a/hw/block/nvme.c b/hw/block/nvme.c index 02390f1f52..fb83636abd 100644 --- a/hw/block/nvme.c +++ b/hw/block/nvme.c @@ -3228,6 +3228,7 @@ static uint16_t nvme_get_feature(NvmeCtrl *n, NvmeRequest *req) result = ns->features.err_rec; goto out; case NVME_VOLATILE_WRITE_CACHE: + result = 0; for (i = 1; i <= n->num_namespaces; i++) { ns = nvme_ns(n, i); if (!ns) { From 832a59e43b5d8b8a9c2b2565008ebea1059d539d Mon Sep 17 00:00:00 2001 From: Klaus Jensen Date: Thu, 11 Feb 2021 14:03:59 +0100 Subject: [PATCH 3/3] hw/block/nvme: fix error handling in nvme_ns_realize nvme_ns_realize passes errp to nvme_register_namespaces, but then try to prepend errp with local_err. Just remove the local_err and use errp directly. Fixes: 15d024d4aa9b ("hw/block/nvme: split setup and register for namespace") Cc: Minwoo Im Reviewed-by: Minwoo Im Signed-off-by: Klaus Jensen --- hw/block/nvme-ns.c | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/hw/block/nvme-ns.c b/hw/block/nvme-ns.c index dfed71a950..93ac6e107a 100644 --- a/hw/block/nvme-ns.c +++ b/hw/block/nvme-ns.c @@ -358,17 +358,12 @@ static void nvme_ns_realize(DeviceState *dev, Error **errp) NvmeNamespace *ns = NVME_NS(dev); BusState *s = qdev_get_parent_bus(dev); NvmeCtrl *n = NVME(s->parent); - Error *local_err = NULL; - if (nvme_ns_setup(ns, &local_err)) { - error_propagate_prepend(errp, local_err, - "could not setup namespace: "); + if (nvme_ns_setup(ns, errp)) { return; } if (nvme_register_namespace(n, ns, errp)) { - error_propagate_prepend(errp, local_err, - "could not register namespace: "); return; }