[PATCH] block/nvme: Implement fake truncate() coroutine

Philippe Mathieu-Daudé posted 1 patch 3 years, 4 months ago
Test checkpatch passed
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/qemu tags/patchew/20201210125202.858656-1-philmd@redhat.com
block/nvme.c | 24 ++++++++++++++++++++++++
1 file changed, 24 insertions(+)
[PATCH] block/nvme: Implement fake truncate() coroutine
Posted by Philippe Mathieu-Daudé 3 years, 4 months ago
NVMe drive can not 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>
---
 block/nvme.c | 24 ++++++++++++++++++++++++
 1 file changed, 24 insertions(+)

diff --git a/block/nvme.c b/block/nvme.c
index a06a188d530..5a6fbacf4a5 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.26.2

Re: [PATCH] block/nvme: Implement fake truncate() coroutine
Posted by Max Reitz 3 years, 4 months ago
On 10.12.20 13:52, Philippe Mathieu-Daudé wrote:
> NVMe drive can not be shrunk.

*cannot

> 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>
> ---
>   block/nvme.c | 24 ++++++++++++++++++++++++
>   1 file changed, 24 insertions(+)
Thanks!  (Fixed the typo and) applied to my block branch:

https://git.xanclic.moe/XanClic/qemu/commits/branch/block


Re: [PATCH] block/nvme: Implement fake truncate() coroutine
Posted by Philippe Mathieu-Daudé 3 years, 4 months ago
On 12/10/20 4:36 PM, Max Reitz wrote:
> On 10.12.20 13:52, Philippe Mathieu-Daudé wrote:
>> NVMe drive can not be shrunk.
> 
> *cannot
> 
>> 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>
>> ---
>>   block/nvme.c | 24 ++++++++++++++++++++++++
>>   1 file changed, 24 insertions(+)
> Thanks!  (Fixed the typo and) applied to my block branch:
> 
> https://git.xanclic.moe/XanClic/qemu/commits/branch/block
> 

Thanks Max!