[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 28/30] block/nvme: Implement fake truncate() coroutine
From: |
Max Reitz |
Subject: |
[PULL 28/30] block/nvme: Implement fake truncate() coroutine |
Date: |
Fri, 18 Dec 2020 16:12:47 +0100 |
From: Philippe Mathieu-Daudé <philmd@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>
---
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.29.2
- [PULL 20/30] simplebench: rename ascii() to results_to_text(), (continued)
- [PULL 20/30] simplebench: rename ascii() to results_to_text(), Max Reitz, 2020/12/18
- [PULL 22/30] simplebench/results_to_text: improve view of the table, Max Reitz, 2020/12/18
- [PULL 24/30] simplebench/results_to_text: make executable, Max Reitz, 2020/12/18
- [PULL 16/30] iotests: add 298 to test new preallocate filter driver, Max Reitz, 2020/12/18
- [PULL 15/30] iotests.py: execute_setup_common(): add required_fmts argument, Max Reitz, 2020/12/18
- [PULL 23/30] simplebench/results_to_text: add difference line to the table, Max Reitz, 2020/12/18
- [PULL 21/30] simplebench: move results_to_text() into separate file, Max Reitz, 2020/12/18
- [PULL 25/30] scripts/simplebench: add bench_prealloc.py, Max Reitz, 2020/12/18
- [PULL 26/30] quorum: Implement bdrv_co_block_status(), Max Reitz, 2020/12/18
- [PULL 27/30] quorum: Implement bdrv_co_pwrite_zeroes(), Max Reitz, 2020/12/18
- [PULL 28/30] block/nvme: Implement fake truncate() coroutine,
Max Reitz <=
- [PULL 29/30] iotests/102: Pass $QEMU_HANDLE to _send_qemu_cmd, Max Reitz, 2020/12/18
- [PULL 30/30] iotests: Fix _send_qemu_cmd with bash 5.1, Max Reitz, 2020/12/18