block: Accept device model name for blockdev-change-medium
In order to remove the need for BlockBackend names in the external API, we want to allow qdev device names in all device related commands. This converts blockdev-change-medium to accept a qdev device name. Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
fbe2d8163e
commit
70e2cb3bd7
18
blockdev.c
18
blockdev.c
@ -2540,7 +2540,9 @@ void qmp_x_blockdev_insert_medium(bool has_device, const char *device,
|
||||
qmp_blockdev_insert_anon_medium(blk, bs, errp);
|
||||
}
|
||||
|
||||
void qmp_blockdev_change_medium(const char *device, const char *filename,
|
||||
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_read_only,
|
||||
BlockdevChangeReadOnlyMode read_only,
|
||||
@ -2553,10 +2555,10 @@ void qmp_blockdev_change_medium(const char *device, const char *filename,
|
||||
QDict *options = NULL;
|
||||
Error *err = NULL;
|
||||
|
||||
blk = blk_by_name(device);
|
||||
blk = qmp_get_blk(has_device ? device : NULL,
|
||||
has_id ? id : NULL,
|
||||
errp);
|
||||
if (!blk) {
|
||||
error_set(errp, ERROR_CLASS_DEVICE_NOT_FOUND,
|
||||
"Device '%s' not found", device);
|
||||
goto fail;
|
||||
}
|
||||
|
||||
@ -2604,7 +2606,9 @@ void qmp_blockdev_change_medium(const char *device, const char *filename,
|
||||
goto fail;
|
||||
}
|
||||
|
||||
rc = do_open_tray(device, NULL, false, &err);
|
||||
rc = do_open_tray(has_device ? device : NULL,
|
||||
has_id ? id : NULL,
|
||||
false, &err);
|
||||
if (rc && rc != -ENOSYS) {
|
||||
error_propagate(errp, err);
|
||||
goto fail;
|
||||
@ -2612,7 +2616,7 @@ void qmp_blockdev_change_medium(const char *device, const char *filename,
|
||||
error_free(err);
|
||||
err = NULL;
|
||||
|
||||
qmp_x_blockdev_remove_medium(true, device, false, NULL, errp);
|
||||
qmp_x_blockdev_remove_medium(has_device, device, has_id, id, errp);
|
||||
if (err) {
|
||||
error_propagate(errp, err);
|
||||
goto fail;
|
||||
@ -2626,7 +2630,7 @@ void qmp_blockdev_change_medium(const char *device, const char *filename,
|
||||
|
||||
blk_apply_root_state(blk, medium_bs);
|
||||
|
||||
qmp_blockdev_close_tray(true, device, false, NULL, errp);
|
||||
qmp_blockdev_close_tray(has_device, device, has_id, id, errp);
|
||||
|
||||
fail:
|
||||
/* If the medium has been inserted, the device has its own reference, so
|
||||
|
@ -3458,7 +3458,9 @@ and loading a new image file which is inserted as the new medium.
|
||||
|
||||
Arguments:
|
||||
|
||||
- "device": device name (json-string)
|
||||
- "device": block device name (deprecated, use @id instead)
|
||||
(json-string, optional)
|
||||
- "id": the name or QOM path of the guest device (json-string, optional)
|
||||
- "filename": filename of the new image (json-string)
|
||||
- "format": format of the new image (json-string, optional)
|
||||
- "read-only-mode": new read-only mode (json-string, optional)
|
||||
@ -3469,7 +3471,7 @@ Examples:
|
||||
1. Change a removable medium
|
||||
|
||||
-> { "execute": "blockdev-change-medium",
|
||||
"arguments": { "device": "ide1-cd0",
|
||||
"arguments": { "id": "ide0-1-0",
|
||||
"filename": "/srv/images/Fedora-12-x86_64-DVD.iso",
|
||||
"format": "raw" } }
|
||||
<- { "return": {} }
|
||||
@ -3477,7 +3479,7 @@ Examples:
|
||||
2. Load a read-only medium into a writable drive
|
||||
|
||||
-> { "execute": "blockdev-change-medium",
|
||||
"arguments": { "device": "isa-fd0",
|
||||
"arguments": { "id": "floppyA",
|
||||
"filename": "/srv/images/ro.img",
|
||||
"format": "raw",
|
||||
"read-only-mode": "retain" } }
|
||||
@ -3487,7 +3489,7 @@ Examples:
|
||||
"desc": "Could not open '/srv/images/ro.img': Permission denied" } }
|
||||
|
||||
-> { "execute": "blockdev-change-medium",
|
||||
"arguments": { "device": "isa-fd0",
|
||||
"arguments": { "id": "floppyA",
|
||||
"filename": "/srv/images/ro.img",
|
||||
"format": "raw",
|
||||
"read-only-mode": "read-only" } }
|
||||
|
5
hmp.c
5
hmp.c
@ -1422,8 +1422,9 @@ void hmp_change(Monitor *mon, const QDict *qdict)
|
||||
}
|
||||
}
|
||||
|
||||
qmp_blockdev_change_medium(device, target, !!arg, arg,
|
||||
!!read_only, read_only_mode, &err);
|
||||
qmp_blockdev_change_medium(true, device, false, NULL, target,
|
||||
!!arg, arg, !!read_only, read_only_mode,
|
||||
&err);
|
||||
if (err &&
|
||||
error_get_class(err) == ERROR_CLASS_DEVICE_ENCRYPTED) {
|
||||
error_free(err);
|
||||
|
@ -2470,7 +2470,10 @@
|
||||
# combines blockdev-open-tray, x-blockdev-remove-medium,
|
||||
# x-blockdev-insert-medium and blockdev-close-tray).
|
||||
#
|
||||
# @device: block device name
|
||||
# @device: #optional Block device name (deprecated, use @id instead)
|
||||
#
|
||||
# @id: #optional The name or QOM path of the guest device
|
||||
# (since: 2.8)
|
||||
#
|
||||
# @filename: filename of the new image to be loaded
|
||||
#
|
||||
@ -2483,7 +2486,8 @@
|
||||
# Since: 2.5
|
||||
##
|
||||
{ 'command': 'blockdev-change-medium',
|
||||
'data': { 'device': 'str',
|
||||
'data': { '*device': 'str',
|
||||
'*id': 'str',
|
||||
'filename': 'str',
|
||||
'*format': 'str',
|
||||
'*read-only-mode': 'BlockdevChangeReadOnlyMode' } }
|
||||
|
4
qmp.c
4
qmp.c
@ -436,8 +436,8 @@ void qmp_change(const char *device, const char *target,
|
||||
if (strcmp(device, "vnc") == 0) {
|
||||
qmp_change_vnc(target, has_arg, arg, errp);
|
||||
} else {
|
||||
qmp_blockdev_change_medium(device, target, has_arg, arg, false, 0,
|
||||
errp);
|
||||
qmp_blockdev_change_medium(true, device, false, NULL, target,
|
||||
has_arg, arg, false, 0, errp);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1119,8 +1119,10 @@ QemuCocoaView *cocoaView;
|
||||
}
|
||||
|
||||
Error *err = NULL;
|
||||
qmp_blockdev_change_medium([drive cStringUsingEncoding:
|
||||
qmp_blockdev_change_medium(true,
|
||||
[drive cStringUsingEncoding:
|
||||
NSASCIIStringEncoding],
|
||||
false, NULL,
|
||||
[file cStringUsingEncoding:
|
||||
NSASCIIStringEncoding],
|
||||
true, "raw",
|
||||
|
Loading…
Reference in New Issue
Block a user