@@ -3776,11 +3776,14 @@ void qmp_block_job_set_speed(bool has_id, const char *id, bool has_device,
aio_context_release(aio_context);
}
-void qmp_block_job_cancel(const char *device,
+void qmp_block_job_cancel(bool has_id, const char *id,
+ bool has_device, const char *device,
bool has_force, bool force, Error **errp)
{
AioContext *aio_context;
- BlockJob *job = find_block_job(NULL, device, &aio_context, errp);
+ BlockJob *job = find_block_job(has_id ? id : NULL,
+ has_device ? device : NULL,
+ &aio_context, errp);
if (!job) {
return;
@@ -1509,7 +1509,7 @@ void hmp_block_job_cancel(Monitor *mon, const QDict *qdict)
const char *device = qdict_get_str(qdict, "device");
bool force = qdict_get_try_bool(qdict, "force", false);
- qmp_block_job_cancel(device, true, force, &error);
+ qmp_block_job_cancel(false, NULL, true, device, true, force, &error);
hmp_handle_error(mon, &error);
}
@@ -1505,7 +1505,12 @@
# operation can be started at a later time to finish copying all data from the
# backing file.
#
-# @device: the device name
+# The job must be identified with the @id or @device parameters, but
+# only one of them must be set.
+#
+# @id: #optional the job identifier (Since 2.7)
+#
+# @device: #optional the device name
#
# @force: #optional whether to allow cancellation of a paused job (default
# false). Since 1.3.
@@ -1515,7 +1520,8 @@
#
# Since: 1.1
##
-{ 'command': 'block-job-cancel', 'data': { 'device': 'str', '*force': 'bool' } }
+{ 'command': 'block-job-cancel',
+ 'data': { '*id': 'str', '*device': 'str', '*force': 'bool' } }
##
# @block-job-pause:
@@ -1317,7 +1317,7 @@ EQMP
{
.name = "block-job-cancel",
- .args_type = "device:B,force:b?",
+ .args_type = "id:s?,device:B?,force:b?",
.mhandler.cmd_new = qmp_marshal_block_job_cancel,
},
{