[libvirt] [PATCH 1/1] Add shrink flag to blockresize command

martinsson.patrik at gmail.com martinsson.patrik at gmail.com
Sat Oct 5 18:56:21 UTC 2019


From: patchon <martinsson.patrik at gmail.com>

These commits simply adds the '--shrink' flag to the blockresize
command to prevent accidental shrinking of a block device. This
behaviour is already present on the vol-resize command and it
makes sense to mimic that behaviour.

Only implemented in the qemu-driver atm.

Signed-off-by: Patrik Martinsson <martinsson.patrik at gmail.com>
---
 src/qemu/qemu_driver.c | 15 ++++++++++++++-
 tools/virsh-domain.c   |  7 +++++++
 tools/virsh.pod        |  9 ++++++++-
 3 files changed, 29 insertions(+), 2 deletions(-)

diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 95fe844c34..4e34eec796 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -11265,8 +11265,10 @@ qemuDomainBlockResize(virDomainPtr dom,
     char *device = NULL;
     const char *nodename = NULL;
     virDomainDiskDefPtr disk = NULL;
+    virDomainBlockInfo info;
 
-    virCheckFlags(VIR_DOMAIN_BLOCK_RESIZE_BYTES, -1);
+    virCheckFlags(VIR_DOMAIN_BLOCK_RESIZE_BYTES |
+                  VIR_STORAGE_VOL_RESIZE_SHRINK, -1);
 
     /* We prefer operating on bytes.  */
     if ((flags & VIR_DOMAIN_BLOCK_RESIZE_BYTES) == 0) {
@@ -11279,6 +11281,9 @@ qemuDomainBlockResize(virDomainPtr dom,
         size *= 1024;
     }
 
+    if (virDomainGetBlockInfo(dom, path, &info, 0) < 0)
+        goto cleanup;
+
     if (!(vm = qemuDomainObjFromDomain(dom)))
         goto cleanup;
 
@@ -11299,6 +11304,14 @@ qemuDomainBlockResize(virDomainPtr dom,
         goto endjob;
     }
 
+    if (size < info.capacity &&
+        !(flags & VIR_STORAGE_VOL_RESIZE_SHRINK)) {
+        virReportError(VIR_ERR_INVALID_ARG, "%s",
+                       _("Can't shrink capacity below current "
+                         "capacity unless shrink flag explicitly specified"));
+        goto endjob;
+    }
+
     /* qcow2 and qed must be sized on 512 byte blocks/sectors,
      * so adjust size if necessary to round up.
      */
diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c
index fbfdc09c0d..a67ee35428 100644
--- a/tools/virsh-domain.c
+++ b/tools/virsh-domain.c
@@ -2920,6 +2920,10 @@ static const vshCmdOptDef opts_blockresize[] = {
      .flags = VSH_OFLAG_REQ,
      .help = N_("New size of the block device, as scaled integer (default KiB)")
     },
+    {.name = "shrink",
+     .type = VSH_OT_BOOL,
+     .help = N_("allow the resize to shrink the volume")
+    },
     {.name = NULL}
 };
 
@@ -2938,6 +2942,9 @@ cmdBlockresize(vshControl *ctl, const vshCmd *cmd)
     if (vshCommandOptScaledInt(ctl, cmd, "size", &size, 1024, ULLONG_MAX) < 0)
         return false;
 
+    if (vshCommandOptBool(cmd, "shrink"))
+        flags |= VIR_STORAGE_VOL_RESIZE_SHRINK;
+
     /* Prefer the older interface of KiB.  */
     if (size % 1024 == 0)
         size /= 1024;
diff --git a/tools/virsh.pod b/tools/virsh.pod
index cf2798e71a..96387127d6 100644
--- a/tools/virsh.pod
+++ b/tools/virsh.pod
@@ -1027,7 +1027,7 @@ I<bandwidth> specifies copying bandwidth limit in MiB/s. For further information
 on the I<bandwidth> argument see the corresponding section for the B<blockjob>
 command.
 
-=item B<blockresize> I<domain> I<path> I<size>
+=item B<blockresize> I<domain> I<path> I<--size> I<--shrink>
 
 Resize a block device of domain while the domain is running, I<path>
 specifies the absolute path of the block device; it corresponds
@@ -1040,6 +1040,13 @@ I<size> is a scaled integer (see B<NOTES> above) which defaults to KiB
 "B" to get bytes (note that for historical reasons, this differs from
 B<vol-resize> which defaults to bytes without a suffix).
 
+Attempts to shrink the block device will fail unless I<--shrink> is present.
+The I<capacity> cannot be negative since the given capacity is the absolute
+size of the block device. Always exercise caution when shrinking a block device.
+B<Also note> that it is up to the driver to implement the check if shrinking
+should be allowed or not depending on if I<--shrink> is set. So far only the
+qemu-driver does this.
+
 =item B<console> I<domain> [I<devname>] [I<--safe>] [I<--force>]
 
 Connect the virtual serial console for the guest. The optional
-- 
2.23.0




More information about the libvir-list mailing list