85 lines
3.0 KiB
Diff
85 lines
3.0 KiB
Diff
From f4c65e14055e208e331a83b9340998ecbe796b5f Mon Sep 17 00:00:00 2001
|
|
From: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= <philmd@redhat.com>
|
|
Date: Fri, 1 Jan 2021 17:18:13 -0500
|
|
Subject: block/nvme: Implement fake truncate() coroutine
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
RH-Author: Philippe Mathieu-Daudé <philmd@redhat.com>
|
|
Message-id: <20210101171813.1734014-2-philmd@redhat.com>
|
|
Patchwork-id: 100503
|
|
O-Subject: [RHEL-AV-8.4.0 qemu-kvm PATCH 1/1] block/nvme: Implement fake truncate() coroutine
|
|
Bugzilla: 1848834
|
|
RH-Acked-by: Thomas Huth <thuth@redhat.com>
|
|
RH-Acked-by: Max Reitz <mreitz@redhat.com>
|
|
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
|
|
|
NVMe drive cannot be shrunk.
|
|
|
|
Since commit c80d8b06cfa we can use the @exact parameter (set
|
|
to false) to return success if the block device is larger than
|
|
the requested offset (even if we can not be shrunk).
|
|
|
|
Use this parameter to implement the NVMe truncate() coroutine,
|
|
similarly how it is done for the iscsi and file-posix drivers
|
|
(see commit 82325ae5f2f "Evaluate @exact in protocol drivers").
|
|
|
|
Reported-by: Xueqiang Wei <xuwei@redhat.com>
|
|
Suggested-by: Max Reitz <mreitz@redhat.com>
|
|
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
|
|
Message-Id: <20201210125202.858656-1-philmd@redhat.com>
|
|
Signed-off-by: Max Reitz <mreitz@redhat.com>
|
|
(cherry picked from commit c8807c5edcc8bd8917a5b7531d47ef6a99e07bd8)
|
|
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
|
|
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
|
---
|
|
block/nvme.c | 24 ++++++++++++++++++++++++
|
|
1 file changed, 24 insertions(+)
|
|
|
|
diff --git a/block/nvme.c b/block/nvme.c
|
|
index a06a188d53..5a6fbacf4a 100644
|
|
--- a/block/nvme.c
|
|
+++ b/block/nvme.c
|
|
@@ -1389,6 +1389,29 @@ out:
|
|
|
|
}
|
|
|
|
+static int coroutine_fn nvme_co_truncate(BlockDriverState *bs, int64_t offset,
|
|
+ bool exact, PreallocMode prealloc,
|
|
+ BdrvRequestFlags flags, Error **errp)
|
|
+{
|
|
+ int64_t cur_length;
|
|
+
|
|
+ if (prealloc != PREALLOC_MODE_OFF) {
|
|
+ error_setg(errp, "Unsupported preallocation mode '%s'",
|
|
+ PreallocMode_str(prealloc));
|
|
+ return -ENOTSUP;
|
|
+ }
|
|
+
|
|
+ cur_length = nvme_getlength(bs);
|
|
+ if (offset != cur_length && exact) {
|
|
+ error_setg(errp, "Cannot resize NVMe devices");
|
|
+ return -ENOTSUP;
|
|
+ } else if (offset > cur_length) {
|
|
+ error_setg(errp, "Cannot grow NVMe devices");
|
|
+ return -EINVAL;
|
|
+ }
|
|
+
|
|
+ return 0;
|
|
+}
|
|
|
|
static int nvme_reopen_prepare(BDRVReopenState *reopen_state,
|
|
BlockReopenQueue *queue, Error **errp)
|
|
@@ -1523,6 +1546,7 @@ static BlockDriver bdrv_nvme = {
|
|
.bdrv_close = nvme_close,
|
|
.bdrv_getlength = nvme_getlength,
|
|
.bdrv_probe_blocksizes = nvme_probe_blocksizes,
|
|
+ .bdrv_co_truncate = nvme_co_truncate,
|
|
|
|
.bdrv_co_preadv = nvme_co_preadv,
|
|
.bdrv_co_pwritev = nvme_co_pwritev,
|
|
--
|
|
2.18.4
|
|
|