mirror of
https://github.com/qemu/qemu.git
synced 2025-01-24 14:34:00 +08:00
Merge remote-tracking branch 'qmp/queue/qmp' into staging
* qmp/queue/qmp: qapi: g_hash_table_find() instead of GHashTableIter. qmp: make block job command naming consistent
This commit is contained in:
commit
6454678423
@ -1548,7 +1548,8 @@
|
||||
'data': { 'device': 'str', 'bps': 'int', 'bps_rd': 'int', 'bps_wr': 'int',
|
||||
'iops': 'int', 'iops_rd': 'int', 'iops_wr': 'int' } }
|
||||
|
||||
# @block_stream:
|
||||
##
|
||||
# @block-stream:
|
||||
#
|
||||
# Copy data from a backing file into a block device.
|
||||
#
|
||||
@ -1556,7 +1557,7 @@
|
||||
# backing file has been copied. This command returns immediately once streaming
|
||||
# has started. The status of ongoing block streaming operations can be checked
|
||||
# with query-block-jobs. The operation can be stopped before it has completed
|
||||
# using the block_job_cancel command.
|
||||
# using the block-job-cancel command.
|
||||
#
|
||||
# If a base file is specified then sectors are not copied from that base file and
|
||||
# its backing chain. When streaming completes the image file will have the base
|
||||
@ -1578,10 +1579,10 @@
|
||||
#
|
||||
# Since: 1.1
|
||||
##
|
||||
{ 'command': 'block_stream', 'data': { 'device': 'str', '*base': 'str' } }
|
||||
{ 'command': 'block-stream', 'data': { 'device': 'str', '*base': 'str' } }
|
||||
|
||||
##
|
||||
# @block_job_set_speed:
|
||||
# @block-job-set-speed:
|
||||
#
|
||||
# Set maximum speed for a background block operation.
|
||||
#
|
||||
@ -1599,11 +1600,11 @@
|
||||
#
|
||||
# Since: 1.1
|
||||
##
|
||||
{ 'command': 'block_job_set_speed',
|
||||
{ 'command': 'block-job-set-speed',
|
||||
'data': { 'device': 'str', 'value': 'int' } }
|
||||
|
||||
##
|
||||
# @block_job_cancel:
|
||||
# @block-job-cancel:
|
||||
#
|
||||
# Stop an active block streaming operation.
|
||||
#
|
||||
@ -1629,7 +1630,7 @@
|
||||
#
|
||||
# Since: 1.1
|
||||
##
|
||||
{ 'command': 'block_job_cancel', 'data': { 'device': 'str' } }
|
||||
{ 'command': 'block-job-cancel', 'data': { 'device': 'str' } }
|
||||
|
||||
##
|
||||
# @ObjectTypeInfo:
|
||||
|
@ -87,20 +87,29 @@ static void qmp_input_push(QmpInputVisitor *qiv, QObject *obj, Error **errp)
|
||||
qiv->nb_stack++;
|
||||
}
|
||||
|
||||
/** Only for qmp_input_pop. */
|
||||
static gboolean always_true(gpointer key, gpointer val, gpointer user_pkey)
|
||||
{
|
||||
*(const char **)user_pkey = (const char *)key;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void qmp_input_pop(QmpInputVisitor *qiv, Error **errp)
|
||||
{
|
||||
GHashTableIter iter;
|
||||
gpointer key;
|
||||
assert(qiv->nb_stack > 0);
|
||||
|
||||
if (qiv->strict && qiv->stack[qiv->nb_stack - 1].h) {
|
||||
g_hash_table_iter_init(&iter, qiv->stack[qiv->nb_stack - 1].h);
|
||||
if (g_hash_table_iter_next(&iter, &key, NULL)) {
|
||||
error_set(errp, QERR_QMP_EXTRA_MEMBER, (char *) key);
|
||||
if (qiv->strict) {
|
||||
GHashTable * const top_ht = qiv->stack[qiv->nb_stack - 1].h;
|
||||
if (top_ht) {
|
||||
if (g_hash_table_size(top_ht)) {
|
||||
const char *key;
|
||||
g_hash_table_find(top_ht, always_true, &key);
|
||||
error_set(errp, QERR_QMP_EXTRA_MEMBER, key);
|
||||
}
|
||||
g_hash_table_unref(top_ht);
|
||||
}
|
||||
g_hash_table_unref(qiv->stack[qiv->nb_stack - 1].h);
|
||||
}
|
||||
|
||||
assert(qiv->nb_stack > 0);
|
||||
qiv->nb_stack--;
|
||||
}
|
||||
|
||||
|
@ -687,19 +687,19 @@ Example:
|
||||
EQMP
|
||||
|
||||
{
|
||||
.name = "block_stream",
|
||||
.name = "block-stream",
|
||||
.args_type = "device:B,base:s?",
|
||||
.mhandler.cmd_new = qmp_marshal_input_block_stream,
|
||||
},
|
||||
|
||||
{
|
||||
.name = "block_job_set_speed",
|
||||
.name = "block-job-set-speed",
|
||||
.args_type = "device:B,value:o",
|
||||
.mhandler.cmd_new = qmp_marshal_input_block_job_set_speed,
|
||||
},
|
||||
|
||||
{
|
||||
.name = "block_job_cancel",
|
||||
.name = "block-job-cancel",
|
||||
.args_type = "device:B",
|
||||
.mhandler.cmd_new = qmp_marshal_input_block_job_cancel,
|
||||
},
|
||||
|
@ -49,7 +49,7 @@ class TestSingleDrive(ImageStreamingTestCase):
|
||||
def test_stream(self):
|
||||
self.assert_no_active_streams()
|
||||
|
||||
result = self.vm.qmp('block_stream', device='drive0')
|
||||
result = self.vm.qmp('block-stream', device='drive0')
|
||||
self.assert_qmp(result, 'return', {})
|
||||
|
||||
completed = False
|
||||
@ -68,7 +68,7 @@ class TestSingleDrive(ImageStreamingTestCase):
|
||||
'image file not fully populated after streaming')
|
||||
|
||||
def test_device_not_found(self):
|
||||
result = self.vm.qmp('block_stream', device='nonexistent')
|
||||
result = self.vm.qmp('block-stream', device='nonexistent')
|
||||
self.assert_qmp(result, 'error/class', 'DeviceNotFound')
|
||||
|
||||
class TestStreamStop(ImageStreamingTestCase):
|
||||
@ -90,14 +90,14 @@ class TestStreamStop(ImageStreamingTestCase):
|
||||
|
||||
self.assert_no_active_streams()
|
||||
|
||||
result = self.vm.qmp('block_stream', device='drive0')
|
||||
result = self.vm.qmp('block-stream', device='drive0')
|
||||
self.assert_qmp(result, 'return', {})
|
||||
|
||||
time.sleep(1)
|
||||
events = self.vm.get_qmp_events(wait=False)
|
||||
self.assertEqual(events, [], 'unexpected QMP event: %s' % events)
|
||||
|
||||
self.vm.qmp('block_job_cancel', device='drive0')
|
||||
self.vm.qmp('block-job-cancel', device='drive0')
|
||||
self.assert_qmp(result, 'return', {})
|
||||
|
||||
cancelled = False
|
||||
@ -129,10 +129,10 @@ class TestSetSpeed(ImageStreamingTestCase):
|
||||
def perf_test_set_speed(self):
|
||||
self.assert_no_active_streams()
|
||||
|
||||
result = self.vm.qmp('block_stream', device='drive0')
|
||||
result = self.vm.qmp('block-stream', device='drive0')
|
||||
self.assert_qmp(result, 'return', {})
|
||||
|
||||
result = self.vm.qmp('block_job_set_speed', device='drive0', value=8 * 1024 * 1024)
|
||||
result = self.vm.qmp('block-job-set-speed', device='drive0', value=8 * 1024 * 1024)
|
||||
self.assert_qmp(result, 'return', {})
|
||||
|
||||
completed = False
|
||||
|
Loading…
Reference in New Issue
Block a user