提交 a41b2c99 编写于 作者: P Peter Maydell

Merge remote-tracking branch 'remotes/stefanha/tags/block-pull-request' into staging

Block pull request

# gpg: Signature made Fri 25 Apr 2014 17:05:13 BST using RSA key ID 81AB73C8
# gpg: Good signature from "Stefan Hajnoczi <stefanha@redhat.com>"
# gpg:                 aka "Stefan Hajnoczi <stefanha@gmail.com>"

* remotes/stefanha/tags/block-pull-request:
  iscsi: Don't use error_is_set() to suppress additional errors
  blockdev: Clean up fragile use of error_is_set()
  nbd: Use return values instead of error_is_set(errp)
  qemu-img: Consistently name Error * objects err, and not errp
  Use error_is_set() only when necessary (again)
  block: Expose host_* drivers in blockdev-add
  MAINTAINERS: Add qemu-img/io to block subsystem
  qemu-iotests: Improve and make use of QMPTestCase.wait_until_completed()
  doc: add -drive rerror=,werror= to qemu --help output
  block: Prevent coroutine stack overflow when recursing in bdrv_open_backing_file.
Signed-off-by: NPeter Maydell <peter.maydell@linaro.org>
...@@ -674,6 +674,8 @@ S: Supported ...@@ -674,6 +674,8 @@ S: Supported
F: block* F: block*
F: block/ F: block/
F: hw/block/ F: hw/block/
F: qemu-img*
F: qemu-io*
T: git git://repo.or.cz/qemu/kevin.git block T: git git://repo.or.cz/qemu/kevin.git block
T: git git://github.com/stefanha/qemu.git block T: git git://github.com/stefanha/qemu.git block
......
...@@ -864,7 +864,7 @@ static int bdrv_open_common(BlockDriverState *bs, BlockDriverState *file, ...@@ -864,7 +864,7 @@ static int bdrv_open_common(BlockDriverState *bs, BlockDriverState *file,
node_name = qdict_get_try_str(options, "node-name"); node_name = qdict_get_try_str(options, "node-name");
bdrv_assign_node_name(bs, node_name, &local_err); bdrv_assign_node_name(bs, node_name, &local_err);
if (error_is_set(&local_err)) { if (local_err) {
error_propagate(errp, local_err); error_propagate(errp, local_err);
return -EINVAL; return -EINVAL;
} }
...@@ -1068,14 +1068,14 @@ fail: ...@@ -1068,14 +1068,14 @@ fail:
*/ */
int bdrv_open_backing_file(BlockDriverState *bs, QDict *options, Error **errp) int bdrv_open_backing_file(BlockDriverState *bs, QDict *options, Error **errp)
{ {
char backing_filename[PATH_MAX]; char *backing_filename = g_malloc0(PATH_MAX);
int back_flags, ret; int back_flags, ret = 0;
BlockDriver *back_drv = NULL; BlockDriver *back_drv = NULL;
Error *local_err = NULL; Error *local_err = NULL;
if (bs->backing_hd != NULL) { if (bs->backing_hd != NULL) {
QDECREF(options); QDECREF(options);
return 0; goto free_exit;
} }
/* NULL means an empty set of options */ /* NULL means an empty set of options */
...@@ -1088,10 +1088,9 @@ int bdrv_open_backing_file(BlockDriverState *bs, QDict *options, Error **errp) ...@@ -1088,10 +1088,9 @@ int bdrv_open_backing_file(BlockDriverState *bs, QDict *options, Error **errp)
backing_filename[0] = '\0'; backing_filename[0] = '\0';
} else if (bs->backing_file[0] == '\0' && qdict_size(options) == 0) { } else if (bs->backing_file[0] == '\0' && qdict_size(options) == 0) {
QDECREF(options); QDECREF(options);
return 0; goto free_exit;
} else { } else {
bdrv_get_full_backing_filename(bs, backing_filename, bdrv_get_full_backing_filename(bs, backing_filename, PATH_MAX);
sizeof(backing_filename));
} }
if (bs->backing_format[0] != '\0') { if (bs->backing_format[0] != '\0') {
...@@ -1112,7 +1111,7 @@ int bdrv_open_backing_file(BlockDriverState *bs, QDict *options, Error **errp) ...@@ -1112,7 +1111,7 @@ int bdrv_open_backing_file(BlockDriverState *bs, QDict *options, Error **errp)
error_setg(errp, "Could not open backing file: %s", error_setg(errp, "Could not open backing file: %s",
error_get_pretty(local_err)); error_get_pretty(local_err));
error_free(local_err); error_free(local_err);
return ret; goto free_exit;
} }
if (bs->backing_hd->file) { if (bs->backing_hd->file) {
...@@ -1123,7 +1122,9 @@ int bdrv_open_backing_file(BlockDriverState *bs, QDict *options, Error **errp) ...@@ -1123,7 +1122,9 @@ int bdrv_open_backing_file(BlockDriverState *bs, QDict *options, Error **errp)
/* Recalculate the BlockLimits with the backing file */ /* Recalculate the BlockLimits with the backing file */
bdrv_refresh_limits(bs); bdrv_refresh_limits(bs);
return 0; free_exit:
g_free(backing_filename);
return ret;
} }
/* /*
...@@ -1180,8 +1181,7 @@ done: ...@@ -1180,8 +1181,7 @@ done:
void bdrv_append_temp_snapshot(BlockDriverState *bs, Error **errp) void bdrv_append_temp_snapshot(BlockDriverState *bs, Error **errp)
{ {
/* TODO: extra byte is a hack to ensure MAX_PATH space on Windows. */ /* TODO: extra byte is a hack to ensure MAX_PATH space on Windows. */
char tmp_filename[PATH_MAX + 1]; char *tmp_filename = g_malloc0(PATH_MAX + 1);
int64_t total_size; int64_t total_size;
BlockDriver *bdrv_qcow2; BlockDriver *bdrv_qcow2;
QEMUOptionParameter *create_options; QEMUOptionParameter *create_options;
...@@ -1197,15 +1197,15 @@ void bdrv_append_temp_snapshot(BlockDriverState *bs, Error **errp) ...@@ -1197,15 +1197,15 @@ void bdrv_append_temp_snapshot(BlockDriverState *bs, Error **errp)
total_size = bdrv_getlength(bs); total_size = bdrv_getlength(bs);
if (total_size < 0) { if (total_size < 0) {
error_setg_errno(errp, -total_size, "Could not get image size"); error_setg_errno(errp, -total_size, "Could not get image size");
return; goto out;
} }
total_size &= BDRV_SECTOR_MASK; total_size &= BDRV_SECTOR_MASK;
/* Create the temporary image */ /* Create the temporary image */
ret = get_tmp_filename(tmp_filename, sizeof(tmp_filename)); ret = get_tmp_filename(tmp_filename, PATH_MAX + 1);
if (ret < 0) { if (ret < 0) {
error_setg_errno(errp, -ret, "Could not get temporary filename"); error_setg_errno(errp, -ret, "Could not get temporary filename");
return; goto out;
} }
bdrv_qcow2 = bdrv_find_format("qcow2"); bdrv_qcow2 = bdrv_find_format("qcow2");
...@@ -1221,7 +1221,7 @@ void bdrv_append_temp_snapshot(BlockDriverState *bs, Error **errp) ...@@ -1221,7 +1221,7 @@ void bdrv_append_temp_snapshot(BlockDriverState *bs, Error **errp)
"'%s': %s", tmp_filename, "'%s': %s", tmp_filename,
error_get_pretty(local_err)); error_get_pretty(local_err));
error_free(local_err); error_free(local_err);
return; goto out;
} }
/* Prepare a new options QDict for the temporary file */ /* Prepare a new options QDict for the temporary file */
...@@ -1238,10 +1238,13 @@ void bdrv_append_temp_snapshot(BlockDriverState *bs, Error **errp) ...@@ -1238,10 +1238,13 @@ void bdrv_append_temp_snapshot(BlockDriverState *bs, Error **errp)
bs->open_flags & ~BDRV_O_SNAPSHOT, bdrv_qcow2, &local_err); bs->open_flags & ~BDRV_O_SNAPSHOT, bdrv_qcow2, &local_err);
if (ret < 0) { if (ret < 0) {
error_propagate(errp, local_err); error_propagate(errp, local_err);
return; goto out;
} }
bdrv_append(bs_snapshot, bs); bdrv_append(bs_snapshot, bs);
out:
g_free(tmp_filename);
} }
/* /*
......
...@@ -1095,16 +1095,15 @@ static struct scsi_task *iscsi_do_inquiry(struct iscsi_context *iscsi, int lun, ...@@ -1095,16 +1095,15 @@ static struct scsi_task *iscsi_do_inquiry(struct iscsi_context *iscsi, int lun,
*inq = scsi_datain_unmarshall(task); *inq = scsi_datain_unmarshall(task);
if (*inq == NULL) { if (*inq == NULL) {
error_setg(errp, "iSCSI: failed to unmarshall inquiry datain blob"); error_setg(errp, "iSCSI: failed to unmarshall inquiry datain blob");
goto fail; goto fail_with_err;
} }
return task; return task;
fail: fail:
if (!error_is_set(errp)) { error_setg(errp, "iSCSI: Inquiry command failed : %s",
error_setg(errp, "iSCSI: Inquiry command failed : %s", iscsi_get_error(iscsi));
iscsi_get_error(iscsi)); fail_with_err:
}
if (task != NULL) { if (task != NULL) {
scsi_free_scsi_task(task); scsi_free_scsi_task(task);
} }
......
...@@ -680,7 +680,7 @@ void commit_active_start(BlockDriverState *bs, BlockDriverState *base, ...@@ -680,7 +680,7 @@ void commit_active_start(BlockDriverState *bs, BlockDriverState *base,
mirror_start_job(bs, base, speed, 0, 0, mirror_start_job(bs, base, speed, 0, 0,
on_error, on_error, cb, opaque, &local_err, on_error, on_error, cb, opaque, &local_err,
&commit_active_job_driver, false, base); &commit_active_job_driver, false, base);
if (error_is_set(&local_err)) { if (local_err) {
error_propagate(errp, local_err); error_propagate(errp, local_err);
goto error_restore_flags; goto error_restore_flags;
} }
......
...@@ -175,7 +175,7 @@ static void nbd_parse_filename(const char *filename, QDict *options, ...@@ -175,7 +175,7 @@ static void nbd_parse_filename(const char *filename, QDict *options,
InetSocketAddress *addr = NULL; InetSocketAddress *addr = NULL;
addr = inet_parse(host_spec, errp); addr = inet_parse(host_spec, errp);
if (error_is_set(errp)) { if (!addr) {
goto out; goto out;
} }
......
...@@ -343,7 +343,7 @@ static int nfs_file_open(BlockDriverState *bs, QDict *options, int flags, ...@@ -343,7 +343,7 @@ static int nfs_file_open(BlockDriverState *bs, QDict *options, int flags,
opts = qemu_opts_create(&runtime_opts, NULL, 0, &error_abort); opts = qemu_opts_create(&runtime_opts, NULL, 0, &error_abort);
qemu_opts_absorb_qdict(opts, options, &local_err); qemu_opts_absorb_qdict(opts, options, &local_err);
if (error_is_set(&local_err)) { if (local_err) {
error_propagate(errp, local_err); error_propagate(errp, local_err);
return -EINVAL; return -EINVAL;
} }
......
...@@ -753,7 +753,7 @@ static int quorum_open(BlockDriverState *bs, QDict *options, int flags, ...@@ -753,7 +753,7 @@ static int quorum_open(BlockDriverState *bs, QDict *options, int flags,
opts = qemu_opts_create(&quorum_runtime_opts, NULL, 0, &error_abort); opts = qemu_opts_create(&quorum_runtime_opts, NULL, 0, &error_abort);
qemu_opts_absorb_qdict(opts, options, &local_err); qemu_opts_absorb_qdict(opts, options, &local_err);
if (error_is_set(&local_err)) { if (local_err) {
ret = -EINVAL; ret = -EINVAL;
goto exit; goto exit;
} }
...@@ -828,7 +828,7 @@ close_exit: ...@@ -828,7 +828,7 @@ close_exit:
g_free(opened); g_free(opened);
exit: exit:
/* propagate error */ /* propagate error */
if (error_is_set(&local_err)) { if (local_err) {
error_propagate(errp, local_err); error_propagate(errp, local_err);
} }
QDECREF(list); QDECREF(list);
......
...@@ -1115,6 +1115,7 @@ typedef struct InternalSnapshotState { ...@@ -1115,6 +1115,7 @@ typedef struct InternalSnapshotState {
static void internal_snapshot_prepare(BlkTransactionState *common, static void internal_snapshot_prepare(BlkTransactionState *common,
Error **errp) Error **errp)
{ {
Error *local_err = NULL;
const char *device; const char *device;
const char *name; const char *name;
BlockDriverState *bs; BlockDriverState *bs;
...@@ -1163,8 +1164,10 @@ static void internal_snapshot_prepare(BlkTransactionState *common, ...@@ -1163,8 +1164,10 @@ static void internal_snapshot_prepare(BlkTransactionState *common,
} }
/* check whether a snapshot with name exist */ /* check whether a snapshot with name exist */
ret = bdrv_snapshot_find_by_id_and_name(bs, NULL, name, &old_sn, errp); ret = bdrv_snapshot_find_by_id_and_name(bs, NULL, name, &old_sn,
if (error_is_set(errp)) { &local_err);
if (local_err) {
error_propagate(errp, local_err);
return; return;
} else if (ret) { } else if (ret) {
error_setg(errp, error_setg(errp,
......
...@@ -311,7 +311,7 @@ void hmp_hello_world(Monitor *mon, const QDict *qdict) ...@@ -311,7 +311,7 @@ void hmp_hello_world(Monitor *mon, const QDict *qdict)
Error *errp = NULL; Error *errp = NULL;
qmp_hello_world(!!message, message, &errp); qmp_hello_world(!!message, message, &errp);
if (error_is_set(&errp)) { if (errp) {
monitor_printf(mon, "%s\n", error_get_pretty(errp)); monitor_printf(mon, "%s\n", error_get_pretty(errp));
error_free(errp); error_free(errp);
return; return;
...@@ -483,7 +483,7 @@ void hmp_info_alarm_clock(Monitor *mon) ...@@ -483,7 +483,7 @@ void hmp_info_alarm_clock(Monitor *mon)
Error *errp = NULL; Error *errp = NULL;
clock = qmp_query_alarm_clock(&errp); clock = qmp_query_alarm_clock(&errp);
if (error_is_set(&errp)) { if (errp) {
monitor_printf(mon, "Could not query alarm clock information\n"); monitor_printf(mon, "Could not query alarm clock information\n");
error_free(errp); error_free(errp);
return; return;
...@@ -634,7 +634,7 @@ void hmp_info_alarm_methods(Monitor *mon) ...@@ -634,7 +634,7 @@ void hmp_info_alarm_methods(Monitor *mon)
Error *errp = NULL; Error *errp = NULL;
method_list = qmp_query_alarm_methods(&errp); method_list = qmp_query_alarm_methods(&errp);
if (error_is_set(&errp)) { if (errp) {
monitor_printf(mon, "Could not query alarm methods\n"); monitor_printf(mon, "Could not query alarm methods\n");
error_free(errp); error_free(errp);
return; return;
......
...@@ -4285,10 +4285,13 @@ ...@@ -4285,10 +4285,13 @@
# #
# Drivers that are supported in block device operations. # Drivers that are supported in block device operations.
# #
# @host_device, @host_cdrom, @host_floppy: Since 2.1
#
# Since: 2.0 # Since: 2.0
## ##
{ 'enum': 'BlockdevDriver', { 'enum': 'BlockdevDriver',
'data': [ 'file', 'http', 'https', 'ftp', 'ftps', 'tftp', 'vvfat', 'blkdebug', 'data': [ 'file', 'host_device', 'host_cdrom', 'host_floppy',
'http', 'https', 'ftp', 'ftps', 'tftp', 'vvfat', 'blkdebug',
'blkverify', 'bochs', 'cloop', 'cow', 'dmg', 'parallels', 'qcow', 'blkverify', 'bochs', 'cloop', 'cow', 'dmg', 'parallels', 'qcow',
'qcow2', 'qed', 'raw', 'vdi', 'vhdx', 'vmdk', 'vpc', 'quorum' ] } 'qcow2', 'qed', 'raw', 'vdi', 'vhdx', 'vmdk', 'vpc', 'quorum' ] }
...@@ -4555,6 +4558,9 @@ ...@@ -4555,6 +4558,9 @@
'discriminator': 'driver', 'discriminator': 'driver',
'data': { 'data': {
'file': 'BlockdevOptionsFile', 'file': 'BlockdevOptionsFile',
'host_device':'BlockdevOptionsFile',
'host_cdrom': 'BlockdevOptionsFile',
'host_floppy':'BlockdevOptionsFile',
'http': 'BlockdevOptionsFile', 'http': 'BlockdevOptionsFile',
'https': 'BlockdevOptionsFile', 'https': 'BlockdevOptionsFile',
'ftp': 'BlockdevOptionsFile', 'ftp': 'BlockdevOptionsFile',
......
...@@ -457,12 +457,12 @@ fail: ...@@ -457,12 +457,12 @@ fail:
static void dump_json_image_check(ImageCheck *check, bool quiet) static void dump_json_image_check(ImageCheck *check, bool quiet)
{ {
Error *errp = NULL; Error *local_err = NULL;
QString *str; QString *str;
QmpOutputVisitor *ov = qmp_output_visitor_new(); QmpOutputVisitor *ov = qmp_output_visitor_new();
QObject *obj; QObject *obj;
visit_type_ImageCheck(qmp_output_get_visitor(ov), visit_type_ImageCheck(qmp_output_get_visitor(ov),
&check, NULL, &errp); &check, NULL, &local_err);
obj = qmp_output_get_qobject(ov); obj = qmp_output_get_qobject(ov);
str = qobject_to_json_pretty(obj); str = qobject_to_json_pretty(obj);
assert(str != NULL); assert(str != NULL);
...@@ -1731,12 +1731,12 @@ static void dump_snapshots(BlockDriverState *bs) ...@@ -1731,12 +1731,12 @@ static void dump_snapshots(BlockDriverState *bs)
static void dump_json_image_info_list(ImageInfoList *list) static void dump_json_image_info_list(ImageInfoList *list)
{ {
Error *errp = NULL; Error *local_err = NULL;
QString *str; QString *str;
QmpOutputVisitor *ov = qmp_output_visitor_new(); QmpOutputVisitor *ov = qmp_output_visitor_new();
QObject *obj; QObject *obj;
visit_type_ImageInfoList(qmp_output_get_visitor(ov), visit_type_ImageInfoList(qmp_output_get_visitor(ov),
&list, NULL, &errp); &list, NULL, &local_err);
obj = qmp_output_get_qobject(ov); obj = qmp_output_get_qobject(ov);
str = qobject_to_json_pretty(obj); str = qobject_to_json_pretty(obj);
assert(str != NULL); assert(str != NULL);
...@@ -1748,12 +1748,12 @@ static void dump_json_image_info_list(ImageInfoList *list) ...@@ -1748,12 +1748,12 @@ static void dump_json_image_info_list(ImageInfoList *list)
static void dump_json_image_info(ImageInfo *info) static void dump_json_image_info(ImageInfo *info)
{ {
Error *errp = NULL; Error *local_err = NULL;
QString *str; QString *str;
QmpOutputVisitor *ov = qmp_output_visitor_new(); QmpOutputVisitor *ov = qmp_output_visitor_new();
QObject *obj; QObject *obj;
visit_type_ImageInfo(qmp_output_get_visitor(ov), visit_type_ImageInfo(qmp_output_get_visitor(ov),
&info, NULL, &errp); &info, NULL, &local_err);
obj = qmp_output_get_qobject(ov); obj = qmp_output_get_qobject(ov);
str = qobject_to_json_pretty(obj); str = qobject_to_json_pretty(obj);
assert(str != NULL); assert(str != NULL);
......
...@@ -408,7 +408,8 @@ DEF("drive", HAS_ARG, QEMU_OPTION_drive, ...@@ -408,7 +408,8 @@ DEF("drive", HAS_ARG, QEMU_OPTION_drive,
"-drive [file=file][,if=type][,bus=n][,unit=m][,media=d][,index=i]\n" "-drive [file=file][,if=type][,bus=n][,unit=m][,media=d][,index=i]\n"
" [,cyls=c,heads=h,secs=s[,trans=t]][,snapshot=on|off]\n" " [,cyls=c,heads=h,secs=s[,trans=t]][,snapshot=on|off]\n"
" [,cache=writethrough|writeback|none|directsync|unsafe][,format=f]\n" " [,cache=writethrough|writeback|none|directsync|unsafe][,format=f]\n"
" [,serial=s][,addr=A][,id=name][,aio=threads|native]\n" " [,serial=s][,addr=A][,rerror=ignore|stop|report]\n"
" [,werror=ignore|stop|report|enospc][,id=name][,aio=threads|native]\n"
" [,readonly=on|off][,copy-on-read=on|off]\n" " [,readonly=on|off][,copy-on-read=on|off]\n"
" [[,bps=b]|[[,bps_rd=r][,bps_wr=w]]]\n" " [[,bps=b]|[[,bps_rd=r][,bps_wr=w]]]\n"
" [[,iops=i]|[[,iops_rd=r][,iops_wr=w]]]\n" " [[,iops=i]|[[,iops_rd=r][,iops_wr=w]]]\n"
......
...@@ -50,15 +50,7 @@ class TestSingleDrive(iotests.QMPTestCase): ...@@ -50,15 +50,7 @@ class TestSingleDrive(iotests.QMPTestCase):
result = self.vm.qmp('block-stream', device='drive0') result = self.vm.qmp('block-stream', device='drive0')
self.assert_qmp(result, 'return', {}) self.assert_qmp(result, 'return', {})
completed = False self.wait_until_completed()
while not completed:
for event in self.vm.get_qmp_events(wait=True):
if event['event'] == 'BLOCK_JOB_COMPLETED':
self.assert_qmp(event, 'data/type', 'stream')
self.assert_qmp(event, 'data/device', 'drive0')
self.assert_qmp(event, 'data/offset', self.image_len)
self.assert_qmp(event, 'data/len', self.image_len)
completed = True
self.assert_no_active_block_jobs() self.assert_no_active_block_jobs()
self.vm.shutdown() self.vm.shutdown()
...@@ -89,15 +81,7 @@ class TestSingleDrive(iotests.QMPTestCase): ...@@ -89,15 +81,7 @@ class TestSingleDrive(iotests.QMPTestCase):
self.assert_qmp(result, 'return', {}) self.assert_qmp(result, 'return', {})
self.vm.resume_drive('drive0') self.vm.resume_drive('drive0')
completed = False self.wait_until_completed()
while not completed:
for event in self.vm.get_qmp_events(wait=True):
if event['event'] == 'BLOCK_JOB_COMPLETED':
self.assert_qmp(event, 'data/type', 'stream')
self.assert_qmp(event, 'data/device', 'drive0')
self.assert_qmp(event, 'data/offset', self.image_len)
self.assert_qmp(event, 'data/len', self.image_len)
completed = True
self.assert_no_active_block_jobs() self.assert_no_active_block_jobs()
self.vm.shutdown() self.vm.shutdown()
...@@ -112,15 +96,7 @@ class TestSingleDrive(iotests.QMPTestCase): ...@@ -112,15 +96,7 @@ class TestSingleDrive(iotests.QMPTestCase):
result = self.vm.qmp('block-stream', device='drive0', base=mid_img) result = self.vm.qmp('block-stream', device='drive0', base=mid_img)
self.assert_qmp(result, 'return', {}) self.assert_qmp(result, 'return', {})
completed = False self.wait_until_completed()
while not completed:
for event in self.vm.get_qmp_events(wait=True):
if event['event'] == 'BLOCK_JOB_COMPLETED':
self.assert_qmp(event, 'data/type', 'stream')
self.assert_qmp(event, 'data/device', 'drive0')
self.assert_qmp(event, 'data/offset', self.image_len)
self.assert_qmp(event, 'data/len', self.image_len)
completed = True
self.assert_no_active_block_jobs() self.assert_no_active_block_jobs()
self.vm.shutdown() self.vm.shutdown()
...@@ -152,15 +128,7 @@ class TestSmallerBackingFile(iotests.QMPTestCase): ...@@ -152,15 +128,7 @@ class TestSmallerBackingFile(iotests.QMPTestCase):
result = self.vm.qmp('block-stream', device='drive0') result = self.vm.qmp('block-stream', device='drive0')
self.assert_qmp(result, 'return', {}) self.assert_qmp(result, 'return', {})
completed = False self.wait_until_completed()
while not completed:
for event in self.vm.get_qmp_events(wait=True):
if event['event'] == 'BLOCK_JOB_COMPLETED':
self.assert_qmp(event, 'data/type', 'stream')
self.assert_qmp(event, 'data/device', 'drive0')
self.assert_qmp(event, 'data/offset', self.image_len)
self.assert_qmp(event, 'data/len', self.image_len)
completed = True
self.assert_no_active_block_jobs() self.assert_no_active_block_jobs()
self.vm.shutdown() self.vm.shutdown()
...@@ -442,15 +410,7 @@ class TestSetSpeed(iotests.QMPTestCase): ...@@ -442,15 +410,7 @@ class TestSetSpeed(iotests.QMPTestCase):
result = self.vm.qmp('block-job-set-speed', device='drive0', speed=8 * 1024 * 1024) result = self.vm.qmp('block-job-set-speed', device='drive0', speed=8 * 1024 * 1024)
self.assert_qmp(result, 'return', {}) self.assert_qmp(result, 'return', {})
completed = False self.wait_until_completed()
while not completed:
for event in self.vm.get_qmp_events(wait=True):
if event['event'] == 'BLOCK_JOB_COMPLETED':
self.assert_qmp(event, 'data/type', 'stream')
self.assert_qmp(event, 'data/device', 'drive0')
self.assert_qmp(event, 'data/offset', self.image_len)
self.assert_qmp(event, 'data/len', self.image_len)
completed = True
self.assert_no_active_block_jobs() self.assert_no_active_block_jobs()
......
...@@ -57,14 +57,7 @@ class TestSyncModesNoneAndTop(iotests.QMPTestCase): ...@@ -57,14 +57,7 @@ class TestSyncModesNoneAndTop(iotests.QMPTestCase):
format=iotests.imgfmt, target=target_img) format=iotests.imgfmt, target=target_img)
self.assert_qmp(result, 'return', {}) self.assert_qmp(result, 'return', {})
# Custom completed check as we are not copying all data. self.wait_until_completed(check_offset=False)
completed = False
while not completed:
for event in self.vm.get_qmp_events(wait=True):
if event['event'] == 'BLOCK_JOB_COMPLETED':
self.assert_qmp(event, 'data/device', 'drive0')
self.assert_qmp_absent(event, 'data/error')
completed = True
self.assert_no_active_block_jobs() self.assert_no_active_block_jobs()
self.vm.shutdown() self.vm.shutdown()
......
...@@ -257,7 +257,7 @@ def cancel_and_wait(self, drive='drive0', force=False, resume=False): ...@@ -257,7 +257,7 @@ def cancel_and_wait(self, drive='drive0', force=False, resume=False):
self.assert_no_active_block_jobs() self.assert_no_active_block_jobs()
return result return result
def wait_until_completed(self, drive='drive0'): def wait_until_completed(self, drive='drive0', check_offset=True):
'''Wait for a block job to finish, returning the event''' '''Wait for a block job to finish, returning the event'''
completed = False completed = False
while not completed: while not completed:
...@@ -265,7 +265,8 @@ def wait_until_completed(self, drive='drive0'): ...@@ -265,7 +265,8 @@ def wait_until_completed(self, drive='drive0'):
if event['event'] == 'BLOCK_JOB_COMPLETED': if event['event'] == 'BLOCK_JOB_COMPLETED':
self.assert_qmp(event, 'data/device', drive) self.assert_qmp(event, 'data/device', drive)
self.assert_qmp_absent(event, 'data/error') self.assert_qmp_absent(event, 'data/error')
self.assert_qmp(event, 'data/offset', self.image_len) if check_offset:
self.assert_qmp(event, 'data/offset', self.image_len)
self.assert_qmp(event, 'data/len', self.image_len) self.assert_qmp(event, 'data/len', self.image_len)
completed = True completed = True
......
...@@ -153,7 +153,7 @@ static void test_validate_union_flat(TestInputVisitorData *data, ...@@ -153,7 +153,7 @@ static void test_validate_union_flat(TestInputVisitorData *data,
/* TODO when generator bug is fixed, add 'integer': 41 */ /* TODO when generator bug is fixed, add 'integer': 41 */
visit_type_UserDefFlatUnion(v, &tmp, NULL, &errp); visit_type_UserDefFlatUnion(v, &tmp, NULL, &errp);
g_assert(!error_is_set(&errp)); g_assert(!errp);
qapi_free_UserDefFlatUnion(tmp); qapi_free_UserDefFlatUnion(tmp);
} }
...@@ -167,7 +167,7 @@ static void test_validate_union_anon(TestInputVisitorData *data, ...@@ -167,7 +167,7 @@ static void test_validate_union_anon(TestInputVisitorData *data,
v = validate_test_init(data, "42"); v = validate_test_init(data, "42");
visit_type_UserDefAnonUnion(v, &tmp, NULL, &errp); visit_type_UserDefAnonUnion(v, &tmp, NULL, &errp);
g_assert(!error_is_set(&errp)); g_assert(!errp);
qapi_free_UserDefAnonUnion(tmp); qapi_free_UserDefAnonUnion(tmp);
} }
...@@ -240,7 +240,7 @@ static void test_validate_fail_union_flat(TestInputVisitorData *data, ...@@ -240,7 +240,7 @@ static void test_validate_fail_union_flat(TestInputVisitorData *data,
v = validate_test_init(data, "{ 'string': 'c', 'integer': 41, 'boolean': true }"); v = validate_test_init(data, "{ 'string': 'c', 'integer': 41, 'boolean': true }");
visit_type_UserDefFlatUnion(v, &tmp, NULL, &errp); visit_type_UserDefFlatUnion(v, &tmp, NULL, &errp);
g_assert(error_is_set(&errp)); g_assert(errp);
qapi_free_UserDefFlatUnion(tmp); qapi_free_UserDefFlatUnion(tmp);
} }
...@@ -254,7 +254,7 @@ static void test_validate_fail_union_anon(TestInputVisitorData *data, ...@@ -254,7 +254,7 @@ static void test_validate_fail_union_anon(TestInputVisitorData *data,
v = validate_test_init(data, "3.14"); v = validate_test_init(data, "3.14");
visit_type_UserDefAnonUnion(v, &tmp, NULL, &errp); visit_type_UserDefAnonUnion(v, &tmp, NULL, &errp);
g_assert(error_is_set(&errp)); g_assert(errp);
qapi_free_UserDefAnonUnion(tmp); qapi_free_UserDefAnonUnion(tmp);
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册