On 7/26/20 10:25 AM, Nir Soffer wrote:
When converting to qcow2 compressed format, the last step is a special
zero length compressed write, ending in call to bdrv_co_truncate(). This
call always fail for the nbd driver since it does not implement

fails

bdrv_co_truncate().

Arguably, qemu-img should be taught to ignore the failure, since it is not unique to the nbd driver. But I can live with your approach here.


For block devices, which have the same limits, the call succeeds since
file driver implements bdrv_co_truncate(). If the caller asked to
truncate to the same or smaller size with exact=false, the truncate
succeeds. Implement the same logic for nbd.

Example failing without this change:



Fixes: https://bugzilla.redhat.com/1860627
Signed-off-by: Nir Soffer <nsof...@redhat.com>
---
  block/nbd.c | 27 +++++++++++++++++++++++++++
  1 file changed, 27 insertions(+)

diff --git a/block/nbd.c b/block/nbd.c
index 65a4f56924..2154113af3 100644
--- a/block/nbd.c
+++ b/block/nbd.c
@@ -1966,6 +1966,30 @@ static void nbd_close(BlockDriverState *bs)
      nbd_clear_bdrvstate(s);
  }
+/*
+ * NBD cannot truncate, but if the caller ask to truncate to the same size, or

asks

+ * to a smaller size with extact=false, there is not reason to fail the

exact, no

+ * operation.
+ */
+static int coroutine_fn nbd_co_truncate(BlockDriverState *bs, int64_t offset,
+                                        bool exact, PreallocMode prealloc,
+                                        BdrvRequestFlags flags, Error **errp)
+{
+    BDRVNBDState *s = bs->opaque;
+
+    if (offset != s->info.size && exact) {
+        error_setg(errp, "Cannot resize NBD nodes");
+        return -ENOTSUP;
+    }
+
+    if (offset > s->info.size) {
+        error_setg(errp, "Cannot grow NBD nodes");
+        return -EINVAL;
+    }
+
+    return 0;

Looks reasonable. As Max said, I wonder if we want to reject particular preallocation modes (looking at block/file-posix.c:raw_co_truncate), in the case where the image was resized down and then back up (since s->info.size is constant, but the BDS size is not if inexact resize succeeds).

As you have a bugzilla entry, I think this is safe for -rc2; I'll be touching up the typos and queuing it through my NBD tree later today.

--
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3226
Virtualization:  qemu.org | libvirt.org


Reply via email to