Skip to content

Commit

Permalink
block: add 'force' parameter to 'blockdev-change-medium' command
Browse files Browse the repository at this point in the history
'blockdev-change-medium' is a convinient wrapper for the following
sequence of commands:
 * blockdev-open-tray
 * blockdev-remove-medium
 * blockdev-insert-medium
 * blockdev-close-tray
and should be used f.e. to change ISO image inside the CD-ROM tray.
Though the guest could lock the tray and some linux guests like
CentOS 8.5 actually does that. In this case the execution if this
command results in the error like the following:
  Device 'scsi0-0-1-0' is locked and force was not specified,
  wait for tray to open and try again.

This situation is could be resolved 'blockdev-open-tray' by passing
flag 'force' inside. Thus is seems reasonable to add the same
capability for 'blockdev-change-medium' too.

Signed-off-by: Denis V. Lunev <den@openvz.org>
Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@openvz.org>
Acked-by: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
CC: Kevin Wolf <kwolf@redhat.com>
CC: Hanna Reitz <hreitz@redhat.com>
CC: Eric Blake <eblake@redhat.com>
CC: Markus Armbruster <armbru@redhat.com>
Message-Id: <20220412221846.280723-1-den@openvz.org>
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Signed-off-by: Hanna Reitz <hreitz@redhat.com>
  • Loading branch information
Denis V. Lunev authored and XanClic committed Apr 25, 2022
1 parent 754f756 commit 80dd5af
Show file tree
Hide file tree
Showing 5 changed files with 19 additions and 6 deletions.
3 changes: 2 additions & 1 deletion block/qapi-sysemu.c
Expand Up @@ -318,6 +318,7 @@ void qmp_blockdev_change_medium(bool has_device, const char *device,
bool has_id, const char *id,
const char *filename,
bool has_format, const char *format,
bool has_force, bool force,
bool has_read_only,
BlockdevChangeReadOnlyMode read_only,
Error **errp)
Expand Down Expand Up @@ -380,7 +381,7 @@ void qmp_blockdev_change_medium(bool has_device, const char *device,

rc = do_open_tray(has_device ? device : NULL,
has_id ? id : NULL,
false, &err);
force, &err);
if (rc && rc != -ENOSYS) {
error_propagate(errp, err);
goto fail;
Expand Down
11 changes: 7 additions & 4 deletions hmp-commands.hx
Expand Up @@ -202,21 +202,24 @@ ERST

{
.name = "change",
.args_type = "device:B,target:F,arg:s?,read-only-mode:s?",
.params = "device filename [format [read-only-mode]]",
.help = "change a removable medium, optional format",
.args_type = "device:B,force:-f,target:F,arg:s?,read-only-mode:s?",
.params = "device [-f] filename [format [read-only-mode]]",
.help = "change a removable medium, optional format, use -f to force the operation",
.cmd = hmp_change,
},

SRST
``change`` *device* *setting*
Change the configuration of a device.

``change`` *diskdevice* *filename* [*format* [*read-only-mode*]]
``change`` *diskdevice* [-f] *filename* [*format* [*read-only-mode*]]
Change the medium for a removable disk device to point to *filename*. eg::

(qemu) change ide1-cd0 /path/to/some.iso

``-f``
forces the operation even if the guest has locked the tray.

*format* is optional.

*read-only-mode* may be used to change the read-only status of the device.
Expand Down
4 changes: 3 additions & 1 deletion monitor/hmp-cmds.c
Expand Up @@ -1472,6 +1472,7 @@ void hmp_change(Monitor *mon, const QDict *qdict)
const char *target = qdict_get_str(qdict, "target");
const char *arg = qdict_get_try_str(qdict, "arg");
const char *read_only = qdict_get_try_str(qdict, "read-only-mode");
bool force = qdict_get_try_bool(qdict, "force", false);
BlockdevChangeReadOnlyMode read_only_mode = 0;
Error *err = NULL;

Expand Down Expand Up @@ -1508,7 +1509,8 @@ void hmp_change(Monitor *mon, const QDict *qdict)
}

qmp_blockdev_change_medium(true, device, false, NULL, target,
!!arg, arg, !!read_only, read_only_mode,
!!arg, arg, true, force,
!!read_only, read_only_mode,
&err);
}

Expand Down
6 changes: 6 additions & 0 deletions qapi/block.json
Expand Up @@ -326,6 +326,11 @@
# @read-only-mode: change the read-only mode of the device; defaults
# to 'retain'
#
# @force: if false (the default), an eject request through blockdev-open-tray
# will be sent to the guest if it has locked the tray (and the tray
# will not be opened immediately); if true, the tray will be opened
# regardless of whether it is locked. (since 7.1)
#
# Features:
# @deprecated: Member @device is deprecated. Use @id instead.
#
Expand Down Expand Up @@ -367,6 +372,7 @@
'*id': 'str',
'filename': 'str',
'*format': 'str',
'*force': 'bool',
'*read-only-mode': 'BlockdevChangeReadOnlyMode' } }


Expand Down
1 change: 1 addition & 0 deletions ui/cocoa.m
Expand Up @@ -1531,6 +1531,7 @@ - (void)changeDeviceMedia:(id)sender
[file cStringUsingEncoding:
NSASCIIStringEncoding],
true, "raw",
true, false,
false, 0,
&err);
});
Expand Down

0 comments on commit 80dd5af

Please sign in to comment.