summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorKlaus Jensen <k.jensen@samsung.com>2021-01-12 10:32:37 +0100
committerKlaus Jensen <k.jensen@samsung.com>2021-02-08 21:15:53 +0100
commit635b23ad43e37910eb7607cfee6887e89ae9e69a (patch)
tree15436f3df8615a31a828424a76d7a6f12cd68f0f
parent24ec776a5ac70954e95a33249d8fe3378c01f3a0 (diff)
downloadfocaccia-qemu-635b23ad43e37910eb7607cfee6887e89ae9e69a.tar.gz
focaccia-qemu-635b23ad43e37910eb7607cfee6887e89ae9e69a.zip
hw/block/nvme: fix zone write finalize
The zone write pointer is unconditionally advanced, even for write
faults. Make sure that the zone is always transitioned to Full if the
write pointer reaches zone capacity.

Cc: Dmitry Fomichev <dmitry.fomichev@wdc.com>
Reviewed-by: Keith Busch <kbusch@kernel.org>
Signed-off-by: Klaus Jensen <k.jensen@samsung.com>
-rw-r--r--hw/block/nvme.c10
1 files changed, 5 insertions, 5 deletions
diff --git a/hw/block/nvme.c b/hw/block/nvme.c
index 30bd70fd5b..4d73398798 100644
--- a/hw/block/nvme.c
+++ b/hw/block/nvme.c
@@ -1268,10 +1268,13 @@ static void nvme_finalize_zoned_write(NvmeNamespace *ns, NvmeRequest *req,
     nlb = le16_to_cpu(rw->nlb) + 1;
     zone = nvme_get_zone_by_slba(ns, slba);
 
+    zone->d.wp += nlb;
+
     if (failed) {
         res->slba = 0;
-        zone->d.wp += nlb;
-    } else if (zone->w_ptr == nvme_zone_wr_boundary(zone)) {
+    }
+
+    if (zone->d.wp == nvme_zone_wr_boundary(zone)) {
         switch (nvme_get_zone_state(zone)) {
         case NVME_ZONE_STATE_IMPLICITLY_OPEN:
         case NVME_ZONE_STATE_EXPLICITLY_OPEN:
@@ -1288,9 +1291,6 @@ static void nvme_finalize_zoned_write(NvmeNamespace *ns, NvmeRequest *req,
         default:
             assert(false);
         }
-        zone->d.wp = zone->w_ptr;
-    } else {
-        zone->d.wp += nlb;
     }
 }