Skip to content

Commit

Permalink
blockdev: Mark {insert, remove}-medium experimental
Browse files Browse the repository at this point in the history
While in the long term we want throttling to be its own block filter
BDS, in the short term we want it to be part of the BB instead of a BDS;
even in the long term we may want legacy throttling to be automatically
tied to the BB.

blockdev-insert-medium and blockdev-remove-medium do not retain
throttling information in the BB (deliberately so). Therefore, using
them means tying this information to a BDS, which would break the model
described above. (The same applies to other flags such as
detect_zeroes.) We probably want to move this information to the BB or
its own filter BDS before blockdev-{insert,remove}-medium can be
considered completely stable.

Therefore, mark these functions experimental for the time being.

Suggested-by: Markus Armbruster <[email protected]>
Signed-off-by: Max Reitz <[email protected]>
Acked-by: Markus Armbruster <[email protected]>
Acked-by: Kevin Wolf <[email protected]>
Message-id: [email protected]
Reviewed-by: Eric Blake <[email protected]>
[PMM: fixed format nit (underlining) in qmp-commands.hx]
Signed-off-by: Peter Maydell <[email protected]>
  • Loading branch information
XanClic authored and pm215 committed Dec 11, 2015
1 parent 3fd3c4b commit 6e0abc2
Show file tree
Hide file tree
Showing 5 changed files with 45 additions and 33 deletions.
10 changes: 5 additions & 5 deletions blockdev.c
Original file line number Diff line number Diff line change
Expand Up @@ -2257,7 +2257,7 @@ void qmp_eject(const char *device, bool has_force, bool force, Error **errp)
return;
}

qmp_blockdev_remove_medium(device, errp);
qmp_x_blockdev_remove_medium(device, errp);
}

void qmp_block_passwd(bool has_device, const char *device,
Expand Down Expand Up @@ -2343,7 +2343,7 @@ void qmp_blockdev_close_tray(const char *device, Error **errp)
blk_dev_change_media_cb(blk, true);
}

void qmp_blockdev_remove_medium(const char *device, Error **errp)
void qmp_x_blockdev_remove_medium(const char *device, Error **errp)
{
BlockBackend *blk;
BlockDriverState *bs;
Expand Down Expand Up @@ -2430,8 +2430,8 @@ static void qmp_blockdev_insert_anon_medium(const char *device,
QTAILQ_INSERT_TAIL(&bdrv_states, bs, device_list);
}

void qmp_blockdev_insert_medium(const char *device, const char *node_name,
Error **errp)
void qmp_x_blockdev_insert_medium(const char *device, const char *node_name,
Error **errp)
{
BlockDriverState *bs;

Expand Down Expand Up @@ -2520,7 +2520,7 @@ void qmp_blockdev_change_medium(const char *device, const char *filename,
goto fail;
}

qmp_blockdev_remove_medium(device, &err);
qmp_x_blockdev_remove_medium(device, &err);
if (err) {
error_propagate(errp, err);
goto fail;
Expand Down
18 changes: 12 additions & 6 deletions qapi/block-core.json
Original file line number Diff line number Diff line change
Expand Up @@ -2081,35 +2081,41 @@
'data': { 'device': 'str' } }

##
# @blockdev-remove-medium:
# @x-blockdev-remove-medium:
#
# Removes a medium (a block driver state tree) from a block device. That block
# device's tray must currently be open (unless there is no attached guest
# device).
#
# If the tray is open and there is no medium inserted, this will be a no-op.
#
# This command is still a work in progress and is considered experimental.
# Stay away from it unless you want to help with its development.
#
# @device: block device name
#
# Since: 2.5
##
{ 'command': 'blockdev-remove-medium',
{ 'command': 'x-blockdev-remove-medium',
'data': { 'device': 'str' } }

##
# @blockdev-insert-medium:
# @x-blockdev-insert-medium:
#
# Inserts a medium (a block driver state tree) into a block device. That block
# device's tray must currently be open (unless there is no attached guest
# device) and there must be no medium inserted already.
#
# This command is still a work in progress and is considered experimental.
# Stay away from it unless you want to help with its development.
#
# @device: block device name
#
# @node-name: name of a node in the block driver state graph
#
# Since: 2.5
##
{ 'command': 'blockdev-insert-medium',
{ 'command': 'x-blockdev-insert-medium',
'data': { 'device': 'str',
'node-name': 'str'} }

Expand Down Expand Up @@ -2137,8 +2143,8 @@
#
# Changes the medium inserted into a block device by ejecting the current medium
# and loading a new image file which is inserted as the new medium (this command
# combines blockdev-open-tray, blockdev-remove-medium, blockdev-insert-medium
# and blockdev-close-tray).
# combines blockdev-open-tray, x-blockdev-remove-medium,
# x-blockdev-insert-medium and blockdev-close-tray).
#
# @device: block device name
#
Expand Down
28 changes: 17 additions & 11 deletions qmp-commands.hx
Original file line number Diff line number Diff line change
Expand Up @@ -4203,27 +4203,30 @@ Example:
EQMP

{
.name = "blockdev-remove-medium",
.name = "x-blockdev-remove-medium",
.args_type = "device:s",
.mhandler.cmd_new = qmp_marshal_blockdev_remove_medium,
.mhandler.cmd_new = qmp_marshal_x_blockdev_remove_medium,
},

SQMP
blockdev-remove-medium
----------------------
x-blockdev-remove-medium
------------------------

Removes a medium (a block driver state tree) from a block device. That block
device's tray must currently be open (unless there is no attached guest device).

If the tray is open and there is no medium inserted, this will be a no-op.

This command is still a work in progress and is considered experimental.
Stay away from it unless you want to help with its development.

Arguments:

- "device": block device name (json-string)

Example:

-> { "execute": "blockdev-remove-medium",
-> { "execute": "x-blockdev-remove-medium",
"arguments": { "device": "ide1-cd0" } }

<- { "error": { "class": "GenericError",
Expand All @@ -4240,27 +4243,30 @@ Example:

<- { "return": {} }

-> { "execute": "blockdev-remove-medium",
-> { "execute": "x-blockdev-remove-medium",
"arguments": { "device": "ide1-cd0" } }

<- { "return": {} }

EQMP

{
.name = "blockdev-insert-medium",
.name = "x-blockdev-insert-medium",
.args_type = "device:s,node-name:s",
.mhandler.cmd_new = qmp_marshal_blockdev_insert_medium,
.mhandler.cmd_new = qmp_marshal_x_blockdev_insert_medium,
},

SQMP
blockdev-insert-medium
----------------------
x-blockdev-insert-medium
------------------------

Inserts a medium (a block driver state tree) into a block device. That block
device's tray must currently be open (unless there is no attached guest device)
and there must be no medium inserted already.

This command is still a work in progress and is considered experimental.
Stay away from it unless you want to help with its development.

Arguments:

- "device": block device name (json-string)
Expand All @@ -4276,7 +4282,7 @@ Example:

<- { "return": {} }

-> { "execute": "blockdev-insert-medium",
-> { "execute": "x-blockdev-insert-medium",
"arguments": { "device": "ide1-cd0",
"node-name": "node0" } }

Expand Down
20 changes: 10 additions & 10 deletions tests/qemu-iotests/118
Original file line number Diff line number Diff line change
Expand Up @@ -208,14 +208,14 @@ class GeneralChangeTestsBaseClass(ChangeBaseClass):
else:
self.assert_qmp(result, 'return[0]/inserted/image/filename', old_img)

result = self.vm.qmp('blockdev-remove-medium', device='drive0')
result = self.vm.qmp('x-blockdev-remove-medium', device='drive0')
self.assert_qmp(result, 'return', {})

result = self.vm.qmp('query-block')
self.assert_qmp(result, 'return[0]/tray_open', True)
self.assert_qmp_absent(result, 'return[0]/inserted')

result = self.vm.qmp('blockdev-insert-medium', device='drive0',
result = self.vm.qmp('x-blockdev-insert-medium', device='drive0',
node_name='new')
self.assert_qmp(result, 'return', {})

Expand Down Expand Up @@ -243,7 +243,7 @@ class GeneralChangeTestsBaseClass(ChangeBaseClass):
# Empty floppy drive
return

result = self.vm.qmp('blockdev-remove-medium', device='drive0')
result = self.vm.qmp('x-blockdev-remove-medium', device='drive0')
self.assert_qmp(result, 'error/class', 'GenericError')

def test_insert_on_closed(self):
Expand All @@ -258,7 +258,7 @@ class GeneralChangeTestsBaseClass(ChangeBaseClass):
'driver': 'file'}})
self.assert_qmp(result, 'return', {})

result = self.vm.qmp('blockdev-insert-medium', device='drive0',
result = self.vm.qmp('x-blockdev-insert-medium', device='drive0',
node_name='new')
self.assert_qmp(result, 'error/class', 'GenericError')

Expand Down Expand Up @@ -289,7 +289,7 @@ class TestInitiallyFilled(GeneralChangeTestsBaseClass):

self.wait_for_open()

result = self.vm.qmp('blockdev-insert-medium', device='drive0',
result = self.vm.qmp('x-blockdev-insert-medium', device='drive0',
node_name='new')
self.assert_qmp(result, 'error/class', 'GenericError')

Expand All @@ -311,7 +311,7 @@ class TestInitiallyEmpty(GeneralChangeTestsBaseClass):

self.wait_for_open()

result = self.vm.qmp('blockdev-remove-medium', device='drive0')
result = self.vm.qmp('x-blockdev-remove-medium', device='drive0')
# Should be a no-op
self.assert_qmp(result, 'return', {})

Expand Down Expand Up @@ -604,14 +604,14 @@ class TestChangeReadOnly(ChangeBaseClass):
self.assert_qmp(result, 'return[0]/inserted/ro', False)
self.assert_qmp(result, 'return[0]/inserted/image/filename', old_img)

result = self.vm.qmp('blockdev-remove-medium', device='drive0')
result = self.vm.qmp('x-blockdev-remove-medium', device='drive0')
self.assert_qmp(result, 'return', {})

result = self.vm.qmp('query-block')
self.assert_qmp(result, 'return[0]/tray_open', True)
self.assert_qmp_absent(result, 'return[0]/inserted')

result = self.vm.qmp('blockdev-insert-medium', device='drive0',
result = self.vm.qmp('x-blockdev-insert-medium', device='drive0',
node_name='new')
self.assert_qmp(result, 'return', {})

Expand Down Expand Up @@ -653,7 +653,7 @@ class TestBlockJobsAfterCycle(ChangeBaseClass):

# For device-less BBs, calling blockdev-open-tray or blockdev-close-tray
# is not necessary
result = self.vm.qmp('blockdev-remove-medium', device='drive0')
result = self.vm.qmp('x-blockdev-remove-medium', device='drive0')
self.assert_qmp(result, 'return', {})

result = self.vm.qmp('query-block')
Expand All @@ -666,7 +666,7 @@ class TestBlockJobsAfterCycle(ChangeBaseClass):
'driver': 'file'}})
self.assert_qmp(result, 'return', {})

result = self.vm.qmp('blockdev-insert-medium', device='drive0',
result = self.vm.qmp('x-blockdev-insert-medium', device='drive0',
node_name='node0')
self.assert_qmp(result, 'return', {})

Expand Down
2 changes: 1 addition & 1 deletion tests/qemu-iotests/139
Original file line number Diff line number Diff line change
Expand Up @@ -174,7 +174,7 @@ class TestBlockdevDel(iotests.QMPTestCase):
def insertDrive(self, backend, node):
self.checkBlockBackend(backend, None)
self.checkBlockDriverState(node)
result = self.vm.qmp('blockdev-insert-medium',
result = self.vm.qmp('x-blockdev-insert-medium',
device = backend, node_name = node)
self.assert_qmp(result, 'return', {})
self.checkBlockBackend(backend, node)
Expand Down

0 comments on commit 6e0abc2

Please sign in to comment.