diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index 433fe7e60eb8b72f74516063f268ed1e33e0944c..5ad66d1dcab31a81f330caf6140f03fb3e7e27ff 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -4419,6 +4419,36 @@ qemuMonitorSetWatchdogAction(qemuMonitorPtr mon, } +/** + * qemuMonitorBlockdevCreate: + * @mon: monitor object + * @jobname: name of the job + * @props: JSON object describing the blockdev to add + * + * Instructs qemu to create/format a new stroage or format layer. Note that + * the job does not add the created/formatted image into qemu and + * qemuMonitorBlockdevAdd needs to be called separately with corresponding + * arguments. Note that the arguments for creating and adding are different. + * + * Note that @props is always consumed by this function and should not be + * accessed after calling this function. + */ +int +qemuMonitorBlockdevCreate(qemuMonitorPtr mon, + const char *jobname, + virJSONValuePtr props) +{ + VIR_DEBUG("jobname=%s props=%p", jobname, props); + + QEMU_CHECK_MONITOR_GOTO(mon, error); + + return qemuMonitorJSONBlockdevCreate(mon, jobname, props); + + error: + virJSONValueFree(props); + return -1; +} + /** * qemuMonitorBlockdevAdd: * @mon: monitor object diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index fa8f8a6e472422610da8d5c0fcd1b3cf3949c9e7..88c9702530bdf4be6188abb20e405a1a15a09cd3 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -1290,6 +1290,10 @@ virJSONValuePtr qemuMonitorQueryNamedBlockNodes(qemuMonitorPtr mon); int qemuMonitorSetWatchdogAction(qemuMonitorPtr mon, const char *action); +int qemuMonitorBlockdevCreate(qemuMonitorPtr mon, + const char *jobname, + virJSONValuePtr props); + int qemuMonitorBlockdevAdd(qemuMonitorPtr mon, virJSONValuePtr props); diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index 73eb0f77cb6e2076a820f0af255a0694fc835ac6..f19dced0143330b08e3410c0ddf6b8b8d9f811a0 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -8638,6 +8638,32 @@ qemuMonitorJSONSetWatchdogAction(qemuMonitorPtr mon, } +int +qemuMonitorJSONBlockdevCreate(qemuMonitorPtr mon, + const char *jobname, + virJSONValuePtr props) +{ + VIR_AUTOPTR(virJSONValue) cmd = NULL; + VIR_AUTOPTR(virJSONValue) reply = NULL; + + cmd = qemuMonitorJSONMakeCommand("blockdev-create", + "s:job-id", jobname, + "a:options", &props, + NULL); + virJSONValueFree(props); + if (!cmd) + return -1; + + if (qemuMonitorJSONCommand(mon, cmd, &reply) < 0) + return -1; + + if (qemuMonitorJSONCheckError(cmd, reply) < 0) + return -1; + + return 0; +} + + int qemuMonitorJSONBlockdevAdd(qemuMonitorPtr mon, virJSONValuePtr props) diff --git a/src/qemu/qemu_monitor_json.h b/src/qemu/qemu_monitor_json.h index 89eb554f1d1c54941540028dffac616772f9d3bb..61e64e831b3d4851737734a109c6522a95e0d10d 100644 --- a/src/qemu/qemu_monitor_json.h +++ b/src/qemu/qemu_monitor_json.h @@ -581,6 +581,11 @@ int qemuMonitorJSONSetWatchdogAction(qemuMonitorPtr mon, const char *action) ATTRIBUTE_NONNULL(1); +int qemuMonitorJSONBlockdevCreate(qemuMonitorPtr mon, + const char *jobname, + virJSONValuePtr props) + ATTRIBUTE_NONNULL(1); + int qemuMonitorJSONBlockdevAdd(qemuMonitorPtr mon, virJSONValuePtr props) ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);