}
typedef enum {
- VSH_CMD_BLOCK_JOB_ABORT = 0,
- VSH_CMD_BLOCK_JOB_INFO = 1,
- VSH_CMD_BLOCK_JOB_SPEED = 2,
- VSH_CMD_BLOCK_JOB_PULL = 3,
- VSH_CMD_BLOCK_JOB_COPY = 4,
- VSH_CMD_BLOCK_JOB_COMMIT = 5,
+ VSH_CMD_BLOCK_JOB_ABORT,
+ VSH_CMD_BLOCK_JOB_SPEED,
+ VSH_CMD_BLOCK_JOB_PULL,
+ VSH_CMD_BLOCK_JOB_COPY,
+ VSH_CMD_BLOCK_JOB_COMMIT,
} vshCmdBlockJobMode;
-static int
+static bool
blockJobImpl(vshControl *ctl, const vshCmd *cmd,
- virDomainBlockJobInfoPtr info, int mode,
- virDomainPtr *pdom)
+ vshCmdBlockJobMode mode, virDomainPtr *pdom)
{
virDomainPtr dom = NULL;
const char *path;
unsigned long bandwidth = 0;
- int ret = -1;
+ bool ret = false;
const char *base = NULL;
const char *top = NULL;
unsigned int flags = 0;
goto cleanup;
}
- switch ((vshCmdBlockJobMode) mode) {
+ switch (mode) {
case VSH_CMD_BLOCK_JOB_ABORT:
if (vshCommandOptBool(cmd, "async"))
flags |= VIR_DOMAIN_BLOCK_JOB_ABORT_ASYNC;
if (vshCommandOptBool(cmd, "pivot"))
flags |= VIR_DOMAIN_BLOCK_JOB_ABORT_PIVOT;
- ret = virDomainBlockJobAbort(dom, path, flags);
- break;
- case VSH_CMD_BLOCK_JOB_INFO:
- ret = virDomainGetBlockJobInfo(dom, path, info, 0);
+ if (virDomainBlockJobAbort(dom, path, flags) < 0)
+ goto cleanup;
break;
case VSH_CMD_BLOCK_JOB_SPEED:
- ret = virDomainBlockJobSetSpeed(dom, path, bandwidth, 0);
+ if (virDomainBlockJobSetSpeed(dom, path, bandwidth, 0) < 0)
+ goto cleanup;
break;
case VSH_CMD_BLOCK_JOB_PULL:
if (vshCommandOptStringReq(ctl, cmd, "base", &base) < 0)
if (vshCommandOptBool(cmd, "keep-relative"))
flags |= VIR_DOMAIN_BLOCK_REBASE_RELATIVE;
- if (base || flags)
- ret = virDomainBlockRebase(dom, path, base, bandwidth, flags);
- else
- ret = virDomainBlockPull(dom, path, bandwidth, 0);
+ if (base || flags) {
+ if (virDomainBlockRebase(dom, path, base, bandwidth, flags) < 0)
+ goto cleanup;
+ } else {
+ if (virDomainBlockPull(dom, path, bandwidth, 0) < 0)
+ goto cleanup;
+ }
break;
case VSH_CMD_BLOCK_JOB_COMMIT:
flags |= VIR_DOMAIN_BLOCK_COMMIT_ACTIVE;
if (vshCommandOptBool(cmd, "keep-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;
case VSH_CMD_BLOCK_JOB_COPY:
flags |= VIR_DOMAIN_BLOCK_REBASE_COPY;
flags |= VIR_DOMAIN_BLOCK_REBASE_COPY_RAW;
if (vshCommandOptStringReq(ctl, cmd, "dest", &base) < 0)
goto cleanup;
- ret = virDomainBlockRebase(dom, path, base, bandwidth, flags);
+ if (virDomainBlockRebase(dom, path, base, bandwidth, flags) < 0)
+ goto cleanup;
+ break;
}
+ ret = true;
+
cleanup:
- if (pdom && ret == 0)
+ if (pdom && ret)
*pdom = dom;
else if (dom)
virDomainFree(dom);
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;
if (!blocking) {
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;
if (!blocking) {
static bool
cmdBlockJob(vshControl *ctl, const vshCmd *cmd)
{
- int mode;
virDomainBlockJobInfo info;
- int ret;
+ bool ret = false;
+ int rc;
bool abortMode = (vshCommandOptBool(cmd, "abort") ||
vshCommandOptBool(cmd, "async") ||
vshCommandOptBool(cmd, "pivot"));
bool infoMode = vshCommandOptBool(cmd, "info");
bool bandwidth = vshCommandOptBool(cmd, "bandwidth");
+ virDomainPtr dom = NULL;
+ const char *path;
+ unsigned int flags = 0;
if (abortMode + infoMode + bandwidth > 1) {
vshError(ctl, "%s",
}
if (abortMode)
- mode = VSH_CMD_BLOCK_JOB_ABORT;
- else if (bandwidth)
- mode = VSH_CMD_BLOCK_JOB_SPEED;
- else
- mode = VSH_CMD_BLOCK_JOB_INFO;
+ return blockJobImpl(ctl, cmd, VSH_CMD_BLOCK_JOB_ABORT, NULL);
+ if (bandwidth)
+ return blockJobImpl(ctl, cmd, VSH_CMD_BLOCK_JOB_SPEED, NULL);
- ret = blockJobImpl(ctl, cmd, &info, mode, NULL);
- if (ret < 0)
- return false;
+ /* Everything below here is for --info mode */
+ if (!(dom = vshCommandOptDomain(ctl, cmd, NULL)))
+ goto cleanup;
- if (ret == 0 || mode != VSH_CMD_BLOCK_JOB_INFO)
- return true;
+ /* XXX Allow path to be optional to list info on all devices at once */
+ 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),
info.end - info.cur, info.end);
if (info.bandwidth != 0)
vshPrint(ctl, _(" Bandwidth limit: %lu MiB/s\n"), info.bandwidth);
- return true;
+ ret = true;
+ cleanup:
+ if (dom)
+ virDomainFree(dom);
+ return ret;
}
/*
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;
if (!blocking) {