Add new command "block_resize": * Units for option "size" is KB. * "--device" is used to specify the device name. E.g. vda, vdb. --- tools/virsh.c | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- tools/virsh.pod | 8 +++++++ 2 files changed, 68 insertions(+), 1 deletions(-) diff --git a/tools/virsh.c b/tools/virsh.c index 49034ae..fcd1be6 100644 --- a/tools/virsh.c +++ b/tools/virsh.c @@ -5269,6 +5269,64 @@ cmdBlockPull(vshControl *ctl, const vshCmd *cmd) } /* + * "blockresize" command + */ +static const vshCmdInfo info_block_resize[] = { + {"help", N_("Resize block device of domain.")}, + {"desc", N_("Resize block device of domain.")}, + {NULL, NULL} +}; + +static const vshCmdOptDef opts_block_resize[] = { + {"domain", VSH_OT_DATA, VSH_OFLAG_REQ, N_("domain name, id or uuid")}, + {"device", VSH_OT_DATA, VSH_OFLAG_REQ, N_("device name of the block device")}, + {"size", VSH_OT_INT, VSH_OFLAG_REQ, N_("New size of the block device in kilobytes, " + "the size must be integer")}, + {NULL, 0, 0, NULL} +}; + +static bool +cmdBlockResize(vshControl *ctl, const vshCmd *cmd) +{ + virDomainPtr dom; + const char *device = NULL; + unsigned long long size = 0; + unsigned int flags = 0; + int ret = false; + + if (!vshConnectionUsability(ctl, ctl->conn)) + return false; + + if (vshCommandOptString(cmd, "device", (const char **) &device) < 0) { + vshError(ctl, "%s", _("Device must not be empty")); + return false; + } + + if (vshCommandOptULongLong(cmd, "size", &size) < 0) { + vshError(ctl, "%s", _("Unable to parse integer")); + return false; + } + + if (size > ULLONG_MAX / 1024) { + vshError(ctl, _("Size must be less than %llu"), ULLONG_MAX / 1024); + return false; + } + + if (!(dom = vshCommandOptDomain(ctl, cmd, NULL))) + return false; + + if (virDomainBlockResize(dom, device, size, flags) < 0) { + vshError(ctl, _("Failed to resize block device '%s'"), device); + } else { + vshPrint(ctl, _("Block device '%s' is resized"), device); + ret = true; + } + + virDomainFree(dom); + return ret; +} + +/* * "blockjobinfo" command */ static const vshCmdInfo info_block_job[] = { @@ -12537,8 +12595,9 @@ static const vshCmdDef domManagementCmds[] = { info_attach_interface, 0}, {"autostart", cmdAutostart, opts_autostart, info_autostart, 0}, {"blkiotune", cmdBlkiotune, opts_blkiotune, info_blkiotune, 0}, - {"blockpull", cmdBlockPull, opts_block_pull, info_block_pull, 0}, {"blockjob", cmdBlockJob, opts_block_job, info_block_job, 0}, + {"blockpull", cmdBlockPull, opts_block_pull, info_block_pull, 0}, + {"blockresize", cmdBlockResize, opts_block_resize, info_block_resize, 0}, #ifndef WIN32 {"console", cmdConsole, opts_console, info_console, 0}, #endif diff --git a/tools/virsh.pod b/tools/virsh.pod index 2cd0f73..fb41063 100644 --- a/tools/virsh.pod +++ b/tools/virsh.pod @@ -419,6 +419,14 @@ the B<shutdown> command instead. However, this does not delete any storage volumes used by the guest, and if the domain is persistent, it can be restarted later. +=item B<blockresize> I<domain> I<--path> I<--size> + +Resize a block device of domain while the domain is running, I<--path> +specifies the absolute path of the block device, I<--size> specifies the +new size in kilobytes + +The I<--managed-save> flag guarantees that any managed save image(see + =item B<domblkstat> I<domain> I<block-device> Get device block stats for a running domain. -- 1.7.6 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list