blockjob: split up virsh blockjob info

I have plans to make future enhancements to the job list mode,
which will be easier to do if the common blockJobImpl function
is not mixing a query command with multiple modify commands.
Besides, it just feels weird that all callers to blockJobImpl
had to supply both a bandwidth input argument (unused for info
mode) and an info output argument (unused for all other modes);
not to mention I just made similar cleanups on the libvirtd
side.

The only reason blockJobImpl returned int was because of info
mode returning -1/0/1 (all other job API are -1/0), so that
can also be cleaned up.  No user-visible changes in this commit.

* tools/virsh-domain.c (blockJobImpl): Change signature and return
value.  Drop info handling.
(cmdBlockJob): Handle info here.
(cmdBlockCommit, cmdBlockCopy, cmdBlockPull): Adjust callers.

Signed-off-by: Eric Blake <eblake@redhat.com>
This commit is contained in:
Eric Blake 2014-08-28 13:18:22 -06:00
parent db33cc2494
commit c47f6aad95

View File

@ -1461,23 +1461,21 @@ cmdBlkiotune(vshControl * ctl, const vshCmd * cmd)
} }
typedef enum { typedef enum {
VSH_CMD_BLOCK_JOB_ABORT = 0, VSH_CMD_BLOCK_JOB_ABORT,
VSH_CMD_BLOCK_JOB_INFO = 1, VSH_CMD_BLOCK_JOB_SPEED,
VSH_CMD_BLOCK_JOB_SPEED = 2, VSH_CMD_BLOCK_JOB_PULL,
VSH_CMD_BLOCK_JOB_PULL = 3, VSH_CMD_BLOCK_JOB_COPY,
VSH_CMD_BLOCK_JOB_COPY = 4, VSH_CMD_BLOCK_JOB_COMMIT,
VSH_CMD_BLOCK_JOB_COMMIT = 5,
} vshCmdBlockJobMode; } vshCmdBlockJobMode;
static int static bool
blockJobImpl(vshControl *ctl, const vshCmd *cmd, blockJobImpl(vshControl *ctl, const vshCmd *cmd,
virDomainBlockJobInfoPtr info, int mode, vshCmdBlockJobMode mode, virDomainPtr *pdom)
virDomainPtr *pdom)
{ {
virDomainPtr dom = NULL; virDomainPtr dom = NULL;
const char *path; const char *path;
unsigned long bandwidth = 0; unsigned long bandwidth = 0;
int ret = -1; bool ret = false;
const char *base = NULL; const char *base = NULL;
const char *top = NULL; const char *top = NULL;
unsigned int flags = 0; unsigned int flags = 0;
@ -1493,19 +1491,18 @@ blockJobImpl(vshControl *ctl, const vshCmd *cmd,
goto cleanup; goto cleanup;
} }
switch ((vshCmdBlockJobMode) mode) { switch (mode) {
case VSH_CMD_BLOCK_JOB_ABORT: case VSH_CMD_BLOCK_JOB_ABORT:
if (vshCommandOptBool(cmd, "async")) if (vshCommandOptBool(cmd, "async"))
flags |= VIR_DOMAIN_BLOCK_JOB_ABORT_ASYNC; flags |= VIR_DOMAIN_BLOCK_JOB_ABORT_ASYNC;
if (vshCommandOptBool(cmd, "pivot")) if (vshCommandOptBool(cmd, "pivot"))
flags |= VIR_DOMAIN_BLOCK_JOB_ABORT_PIVOT; flags |= VIR_DOMAIN_BLOCK_JOB_ABORT_PIVOT;
ret = virDomainBlockJobAbort(dom, path, flags); if (virDomainBlockJobAbort(dom, path, flags) < 0)
break; goto cleanup;
case VSH_CMD_BLOCK_JOB_INFO:
ret = virDomainGetBlockJobInfo(dom, path, info, 0);
break; break;
case VSH_CMD_BLOCK_JOB_SPEED: case VSH_CMD_BLOCK_JOB_SPEED:
ret = virDomainBlockJobSetSpeed(dom, path, bandwidth, 0); if (virDomainBlockJobSetSpeed(dom, path, bandwidth, 0) < 0)
goto cleanup;
break; break;
case VSH_CMD_BLOCK_JOB_PULL: case VSH_CMD_BLOCK_JOB_PULL:
if (vshCommandOptStringReq(ctl, cmd, "base", &base) < 0) if (vshCommandOptStringReq(ctl, cmd, "base", &base) < 0)
@ -1513,10 +1510,13 @@ blockJobImpl(vshControl *ctl, const vshCmd *cmd,
if (vshCommandOptBool(cmd, "keep-relative")) if (vshCommandOptBool(cmd, "keep-relative"))
flags |= VIR_DOMAIN_BLOCK_REBASE_RELATIVE; flags |= VIR_DOMAIN_BLOCK_REBASE_RELATIVE;
if (base || flags) if (base || flags) {
ret = virDomainBlockRebase(dom, path, base, bandwidth, flags); if (virDomainBlockRebase(dom, path, base, bandwidth, flags) < 0)
else goto cleanup;
ret = virDomainBlockPull(dom, path, bandwidth, 0); } else {
if (virDomainBlockPull(dom, path, bandwidth, 0) < 0)
goto cleanup;
}
break; break;
case VSH_CMD_BLOCK_JOB_COMMIT: case VSH_CMD_BLOCK_JOB_COMMIT:
@ -1533,7 +1533,8 @@ blockJobImpl(vshControl *ctl, const vshCmd *cmd,
flags |= VIR_DOMAIN_BLOCK_COMMIT_ACTIVE; flags |= VIR_DOMAIN_BLOCK_COMMIT_ACTIVE;
if (vshCommandOptBool(cmd, "keep-relative")) if (vshCommandOptBool(cmd, "keep-relative"))
flags |= VIR_DOMAIN_BLOCK_COMMIT_RELATIVE; flags |= VIR_DOMAIN_BLOCK_COMMIT_RELATIVE;
ret = virDomainBlockCommit(dom, path, base, top, bandwidth, flags); if (virDomainBlockCommit(dom, path, base, top, bandwidth, flags) < 0)
goto cleanup;
break; break;
case VSH_CMD_BLOCK_JOB_COPY: case VSH_CMD_BLOCK_JOB_COPY:
flags |= VIR_DOMAIN_BLOCK_REBASE_COPY; flags |= VIR_DOMAIN_BLOCK_REBASE_COPY;
@ -1545,11 +1546,15 @@ blockJobImpl(vshControl *ctl, const vshCmd *cmd,
flags |= VIR_DOMAIN_BLOCK_REBASE_COPY_RAW; flags |= VIR_DOMAIN_BLOCK_REBASE_COPY_RAW;
if (vshCommandOptStringReq(ctl, cmd, "dest", &base) < 0) if (vshCommandOptStringReq(ctl, cmd, "dest", &base) < 0)
goto cleanup; goto cleanup;
ret = virDomainBlockRebase(dom, path, base, bandwidth, flags); if (virDomainBlockRebase(dom, path, base, bandwidth, flags) < 0)
goto cleanup;
break;
} }
ret = true;
cleanup: cleanup:
if (pdom && ret == 0) if (pdom && ret)
*pdom = dom; *pdom = dom;
else if (dom) else if (dom)
virDomainFree(dom); virDomainFree(dom);
@ -1721,7 +1726,7 @@ cmdBlockCommit(vshControl *ctl, const vshCmd *cmd)
return false; return false;
} }
if (blockJobImpl(ctl, cmd, NULL, VSH_CMD_BLOCK_JOB_COMMIT, &dom) < 0) if (!blockJobImpl(ctl, cmd, VSH_CMD_BLOCK_JOB_COMMIT, &dom))
goto cleanup; goto cleanup;
if (!blocking) { if (!blocking) {
@ -1924,7 +1929,7 @@ cmdBlockCopy(vshControl *ctl, const vshCmd *cmd)
return false; return false;
} }
if (blockJobImpl(ctl, cmd, NULL, VSH_CMD_BLOCK_JOB_COPY, &dom) < 0) if (!blockJobImpl(ctl, cmd, VSH_CMD_BLOCK_JOB_COPY, &dom))
goto cleanup; goto cleanup;
if (!blocking) { if (!blocking) {
@ -2069,14 +2074,17 @@ vshDomainBlockJobToString(int type)
static bool static bool
cmdBlockJob(vshControl *ctl, const vshCmd *cmd) cmdBlockJob(vshControl *ctl, const vshCmd *cmd)
{ {
int mode;
virDomainBlockJobInfo info; virDomainBlockJobInfo info;
int ret; bool ret = false;
int rc;
bool abortMode = (vshCommandOptBool(cmd, "abort") || bool abortMode = (vshCommandOptBool(cmd, "abort") ||
vshCommandOptBool(cmd, "async") || vshCommandOptBool(cmd, "async") ||
vshCommandOptBool(cmd, "pivot")); vshCommandOptBool(cmd, "pivot"));
bool infoMode = vshCommandOptBool(cmd, "info"); bool infoMode = vshCommandOptBool(cmd, "info");
bool bandwidth = vshCommandOptBool(cmd, "bandwidth"); bool bandwidth = vshCommandOptBool(cmd, "bandwidth");
virDomainPtr dom = NULL;
const char *path;
unsigned int flags = 0;
if (abortMode + infoMode + bandwidth > 1) { if (abortMode + infoMode + bandwidth > 1) {
vshError(ctl, "%s", vshError(ctl, "%s",
@ -2085,24 +2093,35 @@ cmdBlockJob(vshControl *ctl, const vshCmd *cmd)
} }
if (abortMode) if (abortMode)
mode = VSH_CMD_BLOCK_JOB_ABORT; return blockJobImpl(ctl, cmd, VSH_CMD_BLOCK_JOB_ABORT, NULL);
else if (bandwidth) if (bandwidth)
mode = VSH_CMD_BLOCK_JOB_SPEED; return blockJobImpl(ctl, cmd, VSH_CMD_BLOCK_JOB_SPEED, NULL);
else
mode = VSH_CMD_BLOCK_JOB_INFO;
ret = blockJobImpl(ctl, cmd, &info, mode, NULL); /* Everything below here is for --info mode */
if (ret < 0) if (!(dom = vshCommandOptDomain(ctl, cmd, NULL)))
return false; goto cleanup;
if (ret == 0 || mode != VSH_CMD_BLOCK_JOB_INFO) /* XXX Allow path to be optional to list info on all devices at once */
return true; if (vshCommandOptStringReq(ctl, cmd, "path", &path) < 0)
goto cleanup;
rc = virDomainGetBlockJobInfo(dom, path, &info, flags);
if (rc < 0)
goto cleanup;
if (rc == 0) {
ret = true;
goto cleanup;
}
vshPrintJobProgress(vshDomainBlockJobToString(info.type), vshPrintJobProgress(vshDomainBlockJobToString(info.type),
info.end - info.cur, info.end); info.end - info.cur, info.end);
if (info.bandwidth != 0) if (info.bandwidth != 0)
vshPrint(ctl, _(" Bandwidth limit: %lu MiB/s\n"), info.bandwidth); vshPrint(ctl, _(" Bandwidth limit: %lu MiB/s\n"), info.bandwidth);
return true; ret = true;
cleanup:
if (dom)
virDomainFree(dom);
return ret;
} }
/* /*
@ -2201,7 +2220,7 @@ cmdBlockPull(vshControl *ctl, const vshCmd *cmd)
return false; return false;
} }
if (blockJobImpl(ctl, cmd, NULL, VSH_CMD_BLOCK_JOB_PULL, &dom) < 0) if (!blockJobImpl(ctl, cmd, VSH_CMD_BLOCK_JOB_PULL, &dom))
goto cleanup; goto cleanup;
if (!blocking) { if (!blocking) {