diff --git a/tools/virsh.c b/tools/virsh.c index d8e5dae02b..3370fc4603 100644 --- a/tools/virsh.c +++ b/tools/virsh.c @@ -6091,6 +6091,63 @@ cmdBlockJob(vshControl *ctl, const vshCmd *cmd) return true; } +/* + * "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")}, + {"path", VSH_OT_DATA, VSH_OFLAG_REQ, N_("Fully-qualified path of 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 *path = NULL; + unsigned long long size = 0; + unsigned int flags = 0; + int ret = false; + + if (!vshConnectionUsability(ctl, ctl->conn)) + return false; + + if (vshCommandOptString(cmd, "path", (const char **) &path) < 0) { + vshError(ctl, "%s", _("Path 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, path, size, flags) < 0) { + vshError(ctl, _("Failed to resize block device '%s'"), path); + } else { + vshPrint(ctl, _("Block device '%s' is resized"), path); + ret = true; + } + + virDomainFree(dom); + return ret; +} /* * "net-autostart" command @@ -14761,6 +14818,7 @@ static const vshCmdDef domManagementCmds[] = { {"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}, + {"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 d94e5998d7..b5aadef92c 100644 --- a/tools/virsh.pod +++ b/tools/virsh.pod @@ -590,6 +590,12 @@ If I<--info> is specified, the active job information on the specified disk will be printed. I can be used to set bandwidth limit for the active job. +=item B I 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 + =item B I Returns basic information about the domain.