]> xenbits.xensource.com Git - libvirt.git/commitdiff
virDomainBlockResize: Introduce VIR_DOMAIN_BLOCK_RESIZE_CAPACITY
authorPeter Krempa <pkrempa@redhat.com>
Wed, 13 Dec 2023 09:07:52 +0000 (10:07 +0100)
committerPeter Krempa <pkrempa@redhat.com>
Thu, 14 Dec 2023 15:09:05 +0000 (16:09 +0100)
Allow users to easily resize 'raw' images on block devices to the full
capacity of the block device. Obviously this won't work on file-backed
storage (filling the remaining capacity is most likely wrong) or for
formats with metadata due to the overhead.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
docs/manpages/virsh.rst
include/libvirt/libvirt-domain.h
src/libvirt-domain.c
tools/virsh-domain.c

index 3e7a4c6c22cebf4acdcc9d69a6d8cb37b9921847..ed1027e133e8d4f292b47d9160df430d3821f2d8 100644 (file)
@@ -1421,7 +1421,7 @@ blockresize
 
 ::
 
-   blockresize domain path size
+   blockresize domain path ([size] | [--capacity])
 
 Resize a block device of domain while the domain is running, *path*
 specifies the absolute path of the block device; it corresponds
@@ -1429,6 +1429,10 @@ to a unique target name (<target dev='name'/>) or source file (<source
 file='name'/>) for one of the disk devices attached to *domain* (see
 also ``domblklist`` for listing these names).
 
+For image formats without metadata (raw) stored inside fixed-size storage (e.g.
+block devices) the --capacity flag can be used to resize the device to the
+full size of the backing device.
+
 *size* is a scaled integer (see ``NOTES`` above) which defaults to KiB
 (blocks of 1024 bytes) if there is no suffix.  You must use a suffix of
 "B" to get bytes (note that for historical reasons, this differs from
index a1902546bb3c0b2a499a843afbfecc4d9238b75c..30cce85b29596fe4970df5ffc6ef25bd508b375c 100644 (file)
@@ -2172,6 +2172,7 @@ int                     virDomainBlockPeek (virDomainPtr dom,
  */
 typedef enum {
     VIR_DOMAIN_BLOCK_RESIZE_BYTES = 1 << 0, /* size in bytes instead of KiB (Since: 0.9.11) */
+    VIR_DOMAIN_BLOCK_RESIZE_CAPACITY = 1 << 1, /* resize to full the capacity of the source (Since: 10.0.0) */
 } virDomainBlockResizeFlags;
 
 int                     virDomainBlockResize (virDomainPtr dom,
index 77a9682ecb76d6224da0b2ded0aa3ad8008b7c3a..94e5672ed8b51181bec45c3150bc6dbd8fa52e39 100644 (file)
@@ -6388,6 +6388,11 @@ virDomainBlockPeek(virDomainPtr dom,
  * size.  Depending on the file format, the hypervisor may round up
  * to the next alignment boundary.
  *
+ * If @flag contains VIR_DOMAIN_BLOCK_RESIZE_CAPACITY (since 10.0.0) the
+ * hypervisor will resize the guest block device to fully fill the source,
+ * ignoring @size. This is possible only for image formats with no metadata
+ * ('raw') and for source devices with limited capacity such as block devices.
+ *
  * The @disk parameter is either an unambiguous source name of the
  * block device (the <source file='...'/> sub-element, such as
  * "/path/to/image"), or (since 0.9.5) the device target shorthand
index fa9d356e15a7bbc033ff19e7b300c14d793a9e98..58d5a4ab576abacf971466cd5d51007ccb146fa8 100644 (file)
@@ -2949,9 +2949,12 @@ static const vshCmdOptDef opts_blockresize[] = {
     },
     {.name = "size",
      .type = VSH_OT_INT,
-     .flags = VSH_OFLAG_REQ,
      .help = N_("New size of the block device, as scaled integer (default KiB)")
     },
+    {.name = "capacity",
+     .type = VSH_OT_BOOL,
+     .help = N_("resize to capacity of source (block device)")
+    },
     {.name = NULL}
 };
 
@@ -2963,17 +2966,23 @@ cmdBlockresize(vshControl *ctl, const vshCmd *cmd)
     unsigned long long size = 0;
     unsigned int flags = 0;
 
+    VSH_ALTERNATIVE_OPTIONS("size", "capacity");
+
     if (vshCommandOptStringReq(ctl, cmd, "path", (const char **) &path) < 0)
         return false;
 
     if (vshCommandOptScaledInt(ctl, cmd, "size", &size, 1024, ULLONG_MAX) < 0)
         return false;
 
-    /* Prefer the older interface of KiB.  */
-    if (size % 1024 == 0)
-        size /= 1024;
-    else
-        flags |= VIR_DOMAIN_BLOCK_RESIZE_BYTES;
+    if (vshCommandOptBool(cmd, "capacity")) {
+        flags |= VIR_DOMAIN_BLOCK_RESIZE_CAPACITY;
+    } else {
+        /* Prefer the older interface of KiB.  */
+        if (size % 1024 == 0)
+            size /= 1024;
+        else
+            flags |= VIR_DOMAIN_BLOCK_RESIZE_BYTES;
+    }
 
     if (!(dom = virshCommandOptDomain(ctl, cmd, NULL)))
         return false;