On Thu, Dec 14, 2023 at 10:19:40AM +0100, Peter Krempa wrote:
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(a)redhat.com>
---
docs/manpages/virsh.rst | 6 +++++-
include/libvirt/libvirt-domain.h | 1 +
src/libvirt-domain.c | 5 +++++
tools/virsh-domain.c | 10 +++++++++-
4 files changed, 20 insertions(+), 2 deletions(-)
diff --git a/docs/manpages/virsh.rst b/docs/manpages/virsh.rst
index 3e7a4c6c22..ed1027e133 100644
--- a/docs/manpages/virsh.rst
+++ b/docs/manpages/virsh.rst
@@ -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
diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-domain.h
index a1902546bb..30cce85b29 100644
--- a/include/libvirt/libvirt-domain.h
+++ b/include/libvirt/libvirt-domain.h
@@ -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,
diff --git a/src/libvirt-domain.c b/src/libvirt-domain.c
index 77a9682ecb..94e5672ed8 100644
--- a/src/libvirt-domain.c
+++ b/src/libvirt-domain.c
@@ -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.
+ *
I think we should declare that @size *must* be set to either
0, or the underlying block device size, when VIR_DOMAIN_BLOCK_RESIZE_CAPACITY.
If set to 0 then auto-discover the size.
If set to non-zero then validate that it is an *exact* match for
the block dev capacity, as a means of error checking.
With regards,
Daniel
--
|:
https://berrange.com -o-
https://www.flickr.com/photos/dberrange :|
|:
https://libvirt.org -o-
https://fstop138.berrange.com :|
|:
https://entangle-photo.org -o-
https://www.instagram.com/dberrange :|