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 <arm...@redhat.com>
Signed-off-by: Max Reitz <mre...@redhat.com>
Acked-by: Markus Armbruster <arm...@redhat.com>
Acked-by: Kevin Wolf <kw...@redhat.com>
---
 blockdev.c             | 10 +++++-----
 qapi/block-core.json   | 18 ++++++++++++------
 qmp-commands.hx        | 24 +++++++++++++++---------
 tests/qemu-iotests/118 | 20 ++++++++++----------
 tests/qemu-iotests/139 |  2 +-
 5 files changed, 43 insertions(+), 31 deletions(-)

diff --git a/blockdev.c b/blockdev.c
index 313841b..80932e8 100644
--- a/blockdev.c
+++ b/blockdev.c
@@ -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,
@@ -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;
@@ -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;
 
@@ -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;
diff --git a/qapi/block-core.json b/qapi/block-core.json
index a07b13f..5a23165 100644
--- a/qapi/block-core.json
+++ b/qapi/block-core.json
@@ -2081,7 +2081,7 @@
   '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
@@ -2089,27 +2089,33 @@
 #
 # 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'} }
 
@@ -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
 #
diff --git a/qmp-commands.hx b/qmp-commands.hx
index 9d8b42f..b6e5e44 100644
--- a/qmp-commands.hx
+++ b/qmp-commands.hx
@@ -4203,13 +4203,13 @@ 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
@@ -4217,13 +4217,16 @@ 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",
@@ -4240,7 +4243,7 @@ Example:
 
 <- { "return": {} }
 
--> { "execute": "blockdev-remove-medium",
+-> { "execute": "x-blockdev-remove-medium",
      "arguments": { "device": "ide1-cd0" } }
 
 <- { "return": {} }
@@ -4248,19 +4251,22 @@ Example:
 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)
@@ -4276,7 +4282,7 @@ Example:
 
 <- { "return": {} }
 
--> { "execute": "blockdev-insert-medium",
+-> { "execute": "x-blockdev-insert-medium",
      "arguments": { "device": "ide1-cd0",
                     "node-name": "node0" } }
 
diff --git a/tests/qemu-iotests/118 b/tests/qemu-iotests/118
index a2bcd54..114d0e2 100755
--- a/tests/qemu-iotests/118
+++ b/tests/qemu-iotests/118
@@ -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', {})
 
@@ -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):
@@ -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')
 
@@ -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')
 
@@ -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', {})
 
@@ -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', {})
 
@@ -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')
@@ -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', {})
 
diff --git a/tests/qemu-iotests/139 b/tests/qemu-iotests/139
index 42f78c7..a4b9694 100644
--- a/tests/qemu-iotests/139
+++ b/tests/qemu-iotests/139
@@ -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)
-- 
2.5.0


Reply via email to