Commit 70e2cb3b authored by Kevin Wolf's avatar Kevin Wolf
Browse files

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: default avatarKevin Wolf <kwolf@redhat.com>
parent fbe2d816
Loading
Loading
Loading
Loading
+11 −7
Original line number Diff line number Diff line
@@ -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
+6 −4
Original line number Diff line number Diff line
@@ -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" } }
+3 −2
Original line number Diff line number Diff line
@@ -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);
+6 −2
Original line number Diff line number Diff line
@@ -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' } }
+2 −2
Original line number Diff line number Diff line
@@ -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);
    }
}

Loading