mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-10-22 22:13:18 +00:00
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:
parent
db33cc2494
commit
c47f6aad95
@ -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) {
|
||||||
|
Loading…
Reference in New Issue
Block a user