mirror of https://github.com/xemu-project/xemu.git
Block patches from 2015-12-23 until 2016-01-07.
-----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iQEcBAABCAAGBQJWjuqwAAoJEDuxQgLoOKytznIH/Ap0ldYSdwBouhZkpKRDwIwf 5/9skIgwuDJ2DeGDqAcVEC4Nxq9HuUCz7DcXPAiTfFRM7ccpnSJJ5O0vfTuC353t 59h1JYh2kLDLXEm4RdylLMeuLNGuc+avUtWGVVQOrjFmSQAO7z3nexmoNRL6ccqE Cd/Oe1I2QU65p/4YpyslKg0N8A/WrHjOsf58Coo2ZCGNh3GLCNuE5mpofXBeSfWB bFdaq2Uv9x3F+vVq5zx3iNt2J8kHXlwZBEEYACzs+2j7j7O5TedjHDjgBrirbxl/ C3F8d+4JqhzAP141yZMO35z1hbehCaKddDZRuN8ryeMXSnBLU3hP9wm4Y1HLrJc= =bxBe -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/maxreitz/tags/pull-block-for-peter-2016-01-07' into staging Block patches from 2015-12-23 until 2016-01-07. # gpg: Signature made Thu 07 Jan 2016 22:46:08 GMT using RSA key ID E838ACAD # gpg: Good signature from "Max Reitz <mreitz@redhat.com>" * remotes/maxreitz/tags/pull-block-for-peter-2016-01-07: (21 commits) iotests: Add test cases for blockdev-mirror qmp: Add blockdev-mirror command block: Add check on mirror target block: Extract blockdev part of qmp_drive_mirror block: Rename BLOCK_OP_TYPE_MIRROR to BLOCK_OP_TYPE_MIRROR_SOURCE qemu-iotests: s390x: fix test 051 iotests: 095: Filter _img_info output iotests: 095: Use TEST_IMG override instead of "mv" iotests: 050: Use TEST_IMG override instead of "mv" iotests: 038: Use TEST_IMG override instead of "mv" iotests: 037: Use TEST_IMG override instead of "mv" iotests: 034: Use TEST_IMG override instead of "mv" iotests: 028: Use TEST_IMG override instead of "mv" iotests: 024: Use TEST_IMG override instead of "mv" iotests: 020: Use TEST_IMG override instead of "mv" iotests: 019: Use TEST_IMG override instead of "mv" iotests: 018: Use TEST_IMG override instead of "mv" block/qapi: Clear err for further error block: use drained section in bdrv_close qemu-iotests: make check-block.sh work on out-of-tree builds ... Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
d9767f1bfa
4
block.c
4
block.c
|
@ -2154,9 +2154,10 @@ void bdrv_close(BlockDriverState *bs)
|
||||||
bdrv_io_limits_disable(bs);
|
bdrv_io_limits_disable(bs);
|
||||||
}
|
}
|
||||||
|
|
||||||
bdrv_drain(bs); /* complete I/O */
|
bdrv_drained_begin(bs); /* complete I/O */
|
||||||
bdrv_flush(bs);
|
bdrv_flush(bs);
|
||||||
bdrv_drain(bs); /* in case flush left pending I/O */
|
bdrv_drain(bs); /* in case flush left pending I/O */
|
||||||
|
|
||||||
notifier_list_notify(&bs->close_notifiers, bs);
|
notifier_list_notify(&bs->close_notifiers, bs);
|
||||||
|
|
||||||
if (bs->blk) {
|
if (bs->blk) {
|
||||||
|
@ -2206,6 +2207,7 @@ void bdrv_close(BlockDriverState *bs)
|
||||||
g_free(ban);
|
g_free(ban);
|
||||||
}
|
}
|
||||||
QLIST_INIT(&bs->aio_notifiers);
|
QLIST_INIT(&bs->aio_notifiers);
|
||||||
|
bdrv_drained_end(bs);
|
||||||
}
|
}
|
||||||
|
|
||||||
void bdrv_close_all(void)
|
void bdrv_close_all(void)
|
||||||
|
|
|
@ -250,6 +250,7 @@ void bdrv_query_image_info(BlockDriverState *bs,
|
||||||
g_free(backing_filename2);
|
g_free(backing_filename2);
|
||||||
backing_filename2 = NULL;
|
backing_filename2 = NULL;
|
||||||
error_free(err);
|
error_free(err);
|
||||||
|
err = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Always report the full_backing_filename if present, even if it's the
|
/* Always report the full_backing_filename if present, even if it's the
|
||||||
|
|
179
blockdev.c
179
blockdev.c
|
@ -3291,29 +3291,23 @@ void qmp_blockdev_backup(const char *device, const char *target,
|
||||||
NULL, errp);
|
NULL, errp);
|
||||||
}
|
}
|
||||||
|
|
||||||
void qmp_drive_mirror(const char *device, const char *target,
|
/* Parameter check and block job starting for drive mirroring.
|
||||||
bool has_format, const char *format,
|
* Caller should hold @device and @target's aio context (must be the same).
|
||||||
bool has_node_name, const char *node_name,
|
**/
|
||||||
bool has_replaces, const char *replaces,
|
static void blockdev_mirror_common(BlockDriverState *bs,
|
||||||
enum MirrorSyncMode sync,
|
BlockDriverState *target,
|
||||||
bool has_mode, enum NewImageMode mode,
|
bool has_replaces, const char *replaces,
|
||||||
bool has_speed, int64_t speed,
|
enum MirrorSyncMode sync,
|
||||||
bool has_granularity, uint32_t granularity,
|
bool has_speed, int64_t speed,
|
||||||
bool has_buf_size, int64_t buf_size,
|
bool has_granularity, uint32_t granularity,
|
||||||
bool has_on_source_error, BlockdevOnError on_source_error,
|
bool has_buf_size, int64_t buf_size,
|
||||||
bool has_on_target_error, BlockdevOnError on_target_error,
|
bool has_on_source_error,
|
||||||
bool has_unmap, bool unmap,
|
BlockdevOnError on_source_error,
|
||||||
Error **errp)
|
bool has_on_target_error,
|
||||||
|
BlockdevOnError on_target_error,
|
||||||
|
bool has_unmap, bool unmap,
|
||||||
|
Error **errp)
|
||||||
{
|
{
|
||||||
BlockBackend *blk;
|
|
||||||
BlockDriverState *bs;
|
|
||||||
BlockDriverState *source, *target_bs;
|
|
||||||
AioContext *aio_context;
|
|
||||||
Error *local_err = NULL;
|
|
||||||
QDict *options;
|
|
||||||
int flags;
|
|
||||||
int64_t size;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
if (!has_speed) {
|
if (!has_speed) {
|
||||||
speed = 0;
|
speed = 0;
|
||||||
|
@ -3324,9 +3318,6 @@ void qmp_drive_mirror(const char *device, const char *target,
|
||||||
if (!has_on_target_error) {
|
if (!has_on_target_error) {
|
||||||
on_target_error = BLOCKDEV_ON_ERROR_REPORT;
|
on_target_error = BLOCKDEV_ON_ERROR_REPORT;
|
||||||
}
|
}
|
||||||
if (!has_mode) {
|
|
||||||
mode = NEW_IMAGE_MODE_ABSOLUTE_PATHS;
|
|
||||||
}
|
|
||||||
if (!has_granularity) {
|
if (!has_granularity) {
|
||||||
granularity = 0;
|
granularity = 0;
|
||||||
}
|
}
|
||||||
|
@ -3348,6 +3339,55 @@ void qmp_drive_mirror(const char *device, const char *target,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (bdrv_op_is_blocked(bs, BLOCK_OP_TYPE_MIRROR_SOURCE, errp)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (bdrv_op_is_blocked(target, BLOCK_OP_TYPE_MIRROR_TARGET, errp)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (target->blk) {
|
||||||
|
error_setg(errp, "Cannot mirror to an attached block device");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!bs->backing && sync == MIRROR_SYNC_MODE_TOP) {
|
||||||
|
sync = MIRROR_SYNC_MODE_FULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* pass the node name to replace to mirror start since it's loose coupling
|
||||||
|
* and will allow to check whether the node still exist at mirror completion
|
||||||
|
*/
|
||||||
|
mirror_start(bs, target,
|
||||||
|
has_replaces ? replaces : NULL,
|
||||||
|
speed, granularity, buf_size, sync,
|
||||||
|
on_source_error, on_target_error, unmap,
|
||||||
|
block_job_cb, bs, errp);
|
||||||
|
}
|
||||||
|
|
||||||
|
void qmp_drive_mirror(const char *device, const char *target,
|
||||||
|
bool has_format, const char *format,
|
||||||
|
bool has_node_name, const char *node_name,
|
||||||
|
bool has_replaces, const char *replaces,
|
||||||
|
enum MirrorSyncMode sync,
|
||||||
|
bool has_mode, enum NewImageMode mode,
|
||||||
|
bool has_speed, int64_t speed,
|
||||||
|
bool has_granularity, uint32_t granularity,
|
||||||
|
bool has_buf_size, int64_t buf_size,
|
||||||
|
bool has_on_source_error, BlockdevOnError on_source_error,
|
||||||
|
bool has_on_target_error, BlockdevOnError on_target_error,
|
||||||
|
bool has_unmap, bool unmap,
|
||||||
|
Error **errp)
|
||||||
|
{
|
||||||
|
BlockDriverState *bs;
|
||||||
|
BlockBackend *blk;
|
||||||
|
BlockDriverState *source, *target_bs;
|
||||||
|
AioContext *aio_context;
|
||||||
|
Error *local_err = NULL;
|
||||||
|
QDict *options = NULL;
|
||||||
|
int flags;
|
||||||
|
int64_t size;
|
||||||
|
int ret;
|
||||||
|
|
||||||
blk = blk_by_name(device);
|
blk = blk_by_name(device);
|
||||||
if (!blk) {
|
if (!blk) {
|
||||||
error_set(errp, ERROR_CLASS_DEVICE_NOT_FOUND,
|
error_set(errp, ERROR_CLASS_DEVICE_NOT_FOUND,
|
||||||
|
@ -3363,15 +3403,14 @@ void qmp_drive_mirror(const char *device, const char *target,
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
bs = blk_bs(blk);
|
bs = blk_bs(blk);
|
||||||
|
if (!has_mode) {
|
||||||
|
mode = NEW_IMAGE_MODE_ABSOLUTE_PATHS;
|
||||||
|
}
|
||||||
|
|
||||||
if (!has_format) {
|
if (!has_format) {
|
||||||
format = mode == NEW_IMAGE_MODE_EXISTING ? NULL : bs->drv->format_name;
|
format = mode == NEW_IMAGE_MODE_EXISTING ? NULL : bs->drv->format_name;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bdrv_op_is_blocked(bs, BLOCK_OP_TYPE_MIRROR, errp)) {
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
flags = bs->open_flags | BDRV_O_RDWR;
|
flags = bs->open_flags | BDRV_O_RDWR;
|
||||||
source = backing_bs(bs);
|
source = backing_bs(bs);
|
||||||
if (!source && sync == MIRROR_SYNC_MODE_TOP) {
|
if (!source && sync == MIRROR_SYNC_MODE_TOP) {
|
||||||
|
@ -3466,22 +3505,78 @@ void qmp_drive_mirror(const char *device, const char *target,
|
||||||
|
|
||||||
bdrv_set_aio_context(target_bs, aio_context);
|
bdrv_set_aio_context(target_bs, aio_context);
|
||||||
|
|
||||||
/* pass the node name to replace to mirror start since it's loose coupling
|
blockdev_mirror_common(bs, target_bs,
|
||||||
* and will allow to check whether the node still exist at mirror completion
|
has_replaces, replaces, sync,
|
||||||
*/
|
has_speed, speed,
|
||||||
mirror_start(bs, target_bs,
|
has_granularity, granularity,
|
||||||
has_replaces ? replaces : NULL,
|
has_buf_size, buf_size,
|
||||||
speed, granularity, buf_size, sync,
|
has_on_source_error, on_source_error,
|
||||||
on_source_error, on_target_error,
|
has_on_target_error, on_target_error,
|
||||||
unmap,
|
has_unmap, unmap,
|
||||||
block_job_cb, bs, &local_err);
|
&local_err);
|
||||||
if (local_err != NULL) {
|
if (local_err) {
|
||||||
bdrv_unref(target_bs);
|
|
||||||
error_propagate(errp, local_err);
|
error_propagate(errp, local_err);
|
||||||
goto out;
|
bdrv_unref(target_bs);
|
||||||
|
}
|
||||||
|
out:
|
||||||
|
aio_context_release(aio_context);
|
||||||
|
}
|
||||||
|
|
||||||
|
void qmp_blockdev_mirror(const char *device, const char *target,
|
||||||
|
bool has_replaces, const char *replaces,
|
||||||
|
MirrorSyncMode sync,
|
||||||
|
bool has_speed, int64_t speed,
|
||||||
|
bool has_granularity, uint32_t granularity,
|
||||||
|
bool has_buf_size, int64_t buf_size,
|
||||||
|
bool has_on_source_error,
|
||||||
|
BlockdevOnError on_source_error,
|
||||||
|
bool has_on_target_error,
|
||||||
|
BlockdevOnError on_target_error,
|
||||||
|
Error **errp)
|
||||||
|
{
|
||||||
|
BlockDriverState *bs;
|
||||||
|
BlockBackend *blk;
|
||||||
|
BlockDriverState *target_bs;
|
||||||
|
AioContext *aio_context;
|
||||||
|
Error *local_err = NULL;
|
||||||
|
|
||||||
|
blk = blk_by_name(device);
|
||||||
|
if (!blk) {
|
||||||
|
error_setg(errp, "Device '%s' not found", device);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
bs = blk_bs(blk);
|
||||||
|
|
||||||
|
if (!bs) {
|
||||||
|
error_setg(errp, "Device '%s' has no media", device);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
target_bs = bdrv_lookup_bs(target, target, errp);
|
||||||
|
if (!target_bs) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
aio_context = bdrv_get_aio_context(bs);
|
||||||
|
aio_context_acquire(aio_context);
|
||||||
|
|
||||||
|
bdrv_ref(target_bs);
|
||||||
|
bdrv_set_aio_context(target_bs, aio_context);
|
||||||
|
|
||||||
|
blockdev_mirror_common(bs, target_bs,
|
||||||
|
has_replaces, replaces, sync,
|
||||||
|
has_speed, speed,
|
||||||
|
has_granularity, granularity,
|
||||||
|
has_buf_size, buf_size,
|
||||||
|
has_on_source_error, on_source_error,
|
||||||
|
has_on_target_error, on_target_error,
|
||||||
|
true, true,
|
||||||
|
&local_err);
|
||||||
|
if (local_err) {
|
||||||
|
error_propagate(errp, local_err);
|
||||||
|
bdrv_unref(target_bs);
|
||||||
}
|
}
|
||||||
|
|
||||||
out:
|
|
||||||
aio_context_release(aio_context);
|
aio_context_release(aio_context);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -195,7 +195,7 @@ void virtio_blk_data_plane_create(VirtIODevice *vdev, VirtIOBlkConf *conf,
|
||||||
blk_op_unblock(conf->conf.blk, BLOCK_OP_TYPE_INTERNAL_SNAPSHOT, s->blocker);
|
blk_op_unblock(conf->conf.blk, BLOCK_OP_TYPE_INTERNAL_SNAPSHOT, s->blocker);
|
||||||
blk_op_unblock(conf->conf.blk, BLOCK_OP_TYPE_INTERNAL_SNAPSHOT_DELETE,
|
blk_op_unblock(conf->conf.blk, BLOCK_OP_TYPE_INTERNAL_SNAPSHOT_DELETE,
|
||||||
s->blocker);
|
s->blocker);
|
||||||
blk_op_unblock(conf->conf.blk, BLOCK_OP_TYPE_MIRROR, s->blocker);
|
blk_op_unblock(conf->conf.blk, BLOCK_OP_TYPE_MIRROR_SOURCE, s->blocker);
|
||||||
blk_op_unblock(conf->conf.blk, BLOCK_OP_TYPE_STREAM, s->blocker);
|
blk_op_unblock(conf->conf.blk, BLOCK_OP_TYPE_STREAM, s->blocker);
|
||||||
blk_op_unblock(conf->conf.blk, BLOCK_OP_TYPE_REPLACE, s->blocker);
|
blk_op_unblock(conf->conf.blk, BLOCK_OP_TYPE_REPLACE, s->blocker);
|
||||||
|
|
||||||
|
|
|
@ -169,7 +169,8 @@ typedef enum BlockOpType {
|
||||||
BLOCK_OP_TYPE_EXTERNAL_SNAPSHOT,
|
BLOCK_OP_TYPE_EXTERNAL_SNAPSHOT,
|
||||||
BLOCK_OP_TYPE_INTERNAL_SNAPSHOT,
|
BLOCK_OP_TYPE_INTERNAL_SNAPSHOT,
|
||||||
BLOCK_OP_TYPE_INTERNAL_SNAPSHOT_DELETE,
|
BLOCK_OP_TYPE_INTERNAL_SNAPSHOT_DELETE,
|
||||||
BLOCK_OP_TYPE_MIRROR,
|
BLOCK_OP_TYPE_MIRROR_SOURCE,
|
||||||
|
BLOCK_OP_TYPE_MIRROR_TARGET,
|
||||||
BLOCK_OP_TYPE_RESIZE,
|
BLOCK_OP_TYPE_RESIZE,
|
||||||
BLOCK_OP_TYPE_STREAM,
|
BLOCK_OP_TYPE_STREAM,
|
||||||
BLOCK_OP_TYPE_REPLACE,
|
BLOCK_OP_TYPE_REPLACE,
|
||||||
|
|
|
@ -1183,6 +1183,54 @@
|
||||||
{ 'command': 'block-dirty-bitmap-clear',
|
{ 'command': 'block-dirty-bitmap-clear',
|
||||||
'data': 'BlockDirtyBitmap' }
|
'data': 'BlockDirtyBitmap' }
|
||||||
|
|
||||||
|
##
|
||||||
|
# @blockdev-mirror
|
||||||
|
#
|
||||||
|
# Start mirroring a block device's writes to a new destination.
|
||||||
|
#
|
||||||
|
# @device: the name of the device whose writes should be mirrored.
|
||||||
|
#
|
||||||
|
# @target: the id or node-name of the block device to mirror to. This mustn't be
|
||||||
|
# attached to guest.
|
||||||
|
#
|
||||||
|
# @replaces: #optional with sync=full graph node name to be replaced by the new
|
||||||
|
# image when a whole image copy is done. This can be used to repair
|
||||||
|
# broken Quorum files.
|
||||||
|
#
|
||||||
|
# @speed: #optional the maximum speed, in bytes per second
|
||||||
|
#
|
||||||
|
# @sync: what parts of the disk image should be copied to the destination
|
||||||
|
# (all the disk, only the sectors allocated in the topmost image, or
|
||||||
|
# only new I/O).
|
||||||
|
#
|
||||||
|
# @granularity: #optional granularity of the dirty bitmap, default is 64K
|
||||||
|
# if the image format doesn't have clusters, 4K if the clusters
|
||||||
|
# are smaller than that, else the cluster size. Must be a
|
||||||
|
# power of 2 between 512 and 64M
|
||||||
|
#
|
||||||
|
# @buf-size: #optional maximum amount of data in flight from source to
|
||||||
|
# target
|
||||||
|
#
|
||||||
|
# @on-source-error: #optional the action to take on an error on the source,
|
||||||
|
# default 'report'. 'stop' and 'enospc' can only be used
|
||||||
|
# if the block device supports io-status (see BlockInfo).
|
||||||
|
#
|
||||||
|
# @on-target-error: #optional the action to take on an error on the target,
|
||||||
|
# default 'report' (no limitations, since this applies to
|
||||||
|
# a different block device than @device).
|
||||||
|
#
|
||||||
|
# Returns: nothing on success.
|
||||||
|
#
|
||||||
|
# Since 2.6
|
||||||
|
##
|
||||||
|
{ 'command': 'blockdev-mirror',
|
||||||
|
'data': { 'device': 'str', 'target': 'str',
|
||||||
|
'*replaces': 'str',
|
||||||
|
'sync': 'MirrorSyncMode',
|
||||||
|
'*speed': 'int', '*granularity': 'uint32',
|
||||||
|
'*buf-size': 'int', '*on-source-error': 'BlockdevOnError',
|
||||||
|
'*on-target-error': 'BlockdevOnError' } }
|
||||||
|
|
||||||
##
|
##
|
||||||
# @block_set_io_throttle:
|
# @block_set_io_throttle:
|
||||||
#
|
#
|
||||||
|
|
|
@ -1635,7 +1635,7 @@ Arguments:
|
||||||
- "speed": maximum speed of the streaming job, in bytes per second
|
- "speed": maximum speed of the streaming job, in bytes per second
|
||||||
(json-int)
|
(json-int)
|
||||||
- "granularity": granularity of the dirty bitmap, in bytes (json-int, optional)
|
- "granularity": granularity of the dirty bitmap, in bytes (json-int, optional)
|
||||||
- "buf_size": maximum amount of data in flight from source to target, in bytes
|
- "buf-size": maximum amount of data in flight from source to target, in bytes
|
||||||
(json-int, default 10M)
|
(json-int, default 10M)
|
||||||
- "sync": what parts of the disk image should be copied to the destination;
|
- "sync": what parts of the disk image should be copied to the destination;
|
||||||
possibilities include "full" for all the disk, "top" for only the sectors
|
possibilities include "full" for all the disk, "top" for only the sectors
|
||||||
|
@ -1664,6 +1664,54 @@ Example:
|
||||||
|
|
||||||
EQMP
|
EQMP
|
||||||
|
|
||||||
|
{
|
||||||
|
.name = "blockdev-mirror",
|
||||||
|
.args_type = "sync:s,device:B,target:B,replaces:s?,speed:i?,"
|
||||||
|
"on-source-error:s?,on-target-error:s?,"
|
||||||
|
"granularity:i?,buf-size:i?",
|
||||||
|
.mhandler.cmd_new = qmp_marshal_blockdev_mirror,
|
||||||
|
},
|
||||||
|
|
||||||
|
SQMP
|
||||||
|
blockdev-mirror
|
||||||
|
------------
|
||||||
|
|
||||||
|
Start mirroring a block device's writes to another block device. target
|
||||||
|
specifies the target of mirror operation.
|
||||||
|
|
||||||
|
Arguments:
|
||||||
|
|
||||||
|
- "device": device name to operate on (json-string)
|
||||||
|
- "target": device name to mirror to (json-string)
|
||||||
|
- "replaces": the block driver node name to replace when finished
|
||||||
|
(json-string, optional)
|
||||||
|
- "speed": maximum speed of the streaming job, in bytes per second
|
||||||
|
(json-int)
|
||||||
|
- "granularity": granularity of the dirty bitmap, in bytes (json-int, optional)
|
||||||
|
- "buf_size": maximum amount of data in flight from source to target, in bytes
|
||||||
|
(json-int, default 10M)
|
||||||
|
- "sync": what parts of the disk image should be copied to the destination;
|
||||||
|
possibilities include "full" for all the disk, "top" for only the sectors
|
||||||
|
allocated in the topmost image, or "none" to only replicate new I/O
|
||||||
|
(MirrorSyncMode).
|
||||||
|
- "on-source-error": the action to take on an error on the source
|
||||||
|
(BlockdevOnError, default 'report')
|
||||||
|
- "on-target-error": the action to take on an error on the target
|
||||||
|
(BlockdevOnError, default 'report')
|
||||||
|
|
||||||
|
The default value of the granularity is the image cluster size clamped
|
||||||
|
between 4096 and 65536, if the image format defines one. If the format
|
||||||
|
does not define a cluster size, the default value of the granularity
|
||||||
|
is 65536.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
-> { "execute": "blockdev-mirror", "arguments": { "device": "ide-hd0",
|
||||||
|
"target": "target0",
|
||||||
|
"sync": "full" } }
|
||||||
|
<- { "return": {} }
|
||||||
|
|
||||||
|
EQMP
|
||||||
{
|
{
|
||||||
.name = "change-backing-file",
|
.name = "change-backing-file",
|
||||||
.args_type = "device:s,image-node-name:s,backing-file:s",
|
.args_type = "device:s,image-node-name:s,backing-file:s",
|
||||||
|
|
|
@ -9,7 +9,7 @@ if [ ! -x $QEMU_PROG ]; then
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
cd $SRC_PATH/tests/qemu-iotests
|
cd tests/qemu-iotests
|
||||||
|
|
||||||
ret=0
|
ret=0
|
||||||
./check -T -nocache -raw || ret=1
|
./check -T -nocache -raw || ret=1
|
||||||
|
|
|
@ -66,8 +66,8 @@ _check_test_img
|
||||||
echo "Creating test image with backing file"
|
echo "Creating test image with backing file"
|
||||||
echo
|
echo
|
||||||
|
|
||||||
TEST_IMG=$TEST_IMG_SAVE
|
TEST_IMG="$TEST_IMG_SAVE.orig"
|
||||||
_make_test_img -b "$TEST_IMG.base" 6G
|
_make_test_img -b "$TEST_IMG_SAVE.base" 6G
|
||||||
|
|
||||||
echo "Filling test image"
|
echo "Filling test image"
|
||||||
echo
|
echo
|
||||||
|
@ -81,8 +81,8 @@ for offset in $TEST_OFFSETS; do
|
||||||
done
|
done
|
||||||
_check_test_img
|
_check_test_img
|
||||||
|
|
||||||
mv "$TEST_IMG" "$TEST_IMG.orig"
|
TEST_IMG="$TEST_IMG_SAVE"
|
||||||
$QEMU_IMG convert -O $IMGFMT "$TEST_IMG.orig" "$TEST_IMG"
|
$QEMU_IMG convert -f $IMGFMT -O $IMGFMT "$TEST_IMG.orig" "$TEST_IMG"
|
||||||
|
|
||||||
echo "Reading"
|
echo "Reading"
|
||||||
echo
|
echo
|
||||||
|
|
|
@ -269,7 +269,7 @@ wrote 65536/65536 bytes at offset 4295032832
|
||||||
No errors were found on the image.
|
No errors were found on the image.
|
||||||
Creating test image with backing file
|
Creating test image with backing file
|
||||||
|
|
||||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=6442450944 backing_file=TEST_DIR/t.IMGFMT.base
|
Formatting 'TEST_DIR/t.IMGFMT.orig', fmt=IMGFMT size=6442450944 backing_file=TEST_DIR/t.IMGFMT.base
|
||||||
Filling test image
|
Filling test image
|
||||||
|
|
||||||
=== IO: pattern 1
|
=== IO: pattern 1
|
||||||
|
|
|
@ -54,6 +54,9 @@ _unsupported_imgopts "subformat=monolithicFlat" \
|
||||||
TEST_OFFSETS="0 4294967296"
|
TEST_OFFSETS="0 4294967296"
|
||||||
CLUSTER_SIZE=65536
|
CLUSTER_SIZE=65536
|
||||||
|
|
||||||
|
TEST_IMG_SAVE="$TEST_IMG"
|
||||||
|
TEST_IMG="$TEST_IMG.base"
|
||||||
|
|
||||||
_make_test_img 6G
|
_make_test_img 6G
|
||||||
|
|
||||||
echo "Filling base image"
|
echo "Filling base image"
|
||||||
|
@ -71,8 +74,8 @@ _check_test_img
|
||||||
echo "Creating test image with backing file"
|
echo "Creating test image with backing file"
|
||||||
echo
|
echo
|
||||||
|
|
||||||
mv "$TEST_IMG" "$TEST_IMG.base"
|
TEST_IMG="$TEST_IMG_SAVE.orig"
|
||||||
_make_test_img -b "$TEST_IMG.base" 6G
|
_make_test_img -b "$TEST_IMG_SAVE.base" 6G
|
||||||
|
|
||||||
echo "Filling test image"
|
echo "Filling test image"
|
||||||
echo
|
echo
|
||||||
|
@ -86,9 +89,7 @@ for offset in $TEST_OFFSETS; do
|
||||||
done
|
done
|
||||||
_check_test_img
|
_check_test_img
|
||||||
|
|
||||||
mv "$TEST_IMG" "$TEST_IMG.orig"
|
TEST_IMG="$TEST_IMG_SAVE"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Test the conversion twice: One test with the old-style -B option and another
|
# Test the conversion twice: One test with the old-style -B option and another
|
||||||
# one with -o backing_file
|
# one with -o backing_file
|
||||||
|
@ -98,7 +99,7 @@ for backing_option in "-B " "-o backing_file="; do
|
||||||
echo
|
echo
|
||||||
echo Testing conversion with $backing_option"$TEST_IMG.base" | _filter_testdir | _filter_imgfmt
|
echo Testing conversion with $backing_option"$TEST_IMG.base" | _filter_testdir | _filter_imgfmt
|
||||||
echo
|
echo
|
||||||
$QEMU_IMG convert -O $IMGFMT $backing_option"$TEST_IMG.base" "$TEST_IMG.orig" "$TEST_IMG"
|
$QEMU_IMG convert -f $IMGFMT -O $IMGFMT $backing_option"$TEST_IMG.base" "$TEST_IMG.orig" "$TEST_IMG"
|
||||||
|
|
||||||
echo "Checking if backing clusters are allocated when they shouldn't"
|
echo "Checking if backing clusters are allocated when they shouldn't"
|
||||||
echo
|
echo
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
QA output created by 019
|
QA output created by 019
|
||||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=6442450944
|
Formatting 'TEST_DIR/t.IMGFMT.base', fmt=IMGFMT size=6442450944
|
||||||
Filling base image
|
Filling base image
|
||||||
|
|
||||||
=== IO: pattern 42
|
=== IO: pattern 42
|
||||||
|
@ -269,7 +269,7 @@ wrote 65536/65536 bytes at offset 4296015872
|
||||||
No errors were found on the image.
|
No errors were found on the image.
|
||||||
Creating test image with backing file
|
Creating test image with backing file
|
||||||
|
|
||||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=6442450944 backing_file=TEST_DIR/t.IMGFMT.base
|
Formatting 'TEST_DIR/t.IMGFMT.orig', fmt=IMGFMT size=6442450944 backing_file=TEST_DIR/t.IMGFMT.base
|
||||||
Filling test image
|
Filling test image
|
||||||
|
|
||||||
=== IO: pattern 43
|
=== IO: pattern 43
|
||||||
|
|
|
@ -56,6 +56,9 @@ fi
|
||||||
|
|
||||||
TEST_OFFSETS="0 4294967296"
|
TEST_OFFSETS="0 4294967296"
|
||||||
|
|
||||||
|
TEST_IMG_SAVE="$TEST_IMG"
|
||||||
|
TEST_IMG="$TEST_IMG.base"
|
||||||
|
|
||||||
_make_test_img 6G
|
_make_test_img 6G
|
||||||
|
|
||||||
echo "Filling base image"
|
echo "Filling base image"
|
||||||
|
@ -73,7 +76,7 @@ _check_test_img
|
||||||
echo "Creating test image with backing file"
|
echo "Creating test image with backing file"
|
||||||
echo
|
echo
|
||||||
|
|
||||||
mv "$TEST_IMG" "$TEST_IMG.base"
|
TEST_IMG="$TEST_IMG_SAVE"
|
||||||
_make_test_img -b "$TEST_IMG.base" 6G
|
_make_test_img -b "$TEST_IMG.base" 6G
|
||||||
|
|
||||||
echo "Filling test image"
|
echo "Filling test image"
|
||||||
|
@ -89,7 +92,7 @@ done
|
||||||
_check_test_img
|
_check_test_img
|
||||||
|
|
||||||
$QEMU_IMG commit "$TEST_IMG"
|
$QEMU_IMG commit "$TEST_IMG"
|
||||||
mv "$TEST_IMG.base" "$TEST_IMG"
|
TEST_IMG="$TEST_IMG.base"
|
||||||
|
|
||||||
echo "Reading from the backing file"
|
echo "Reading from the backing file"
|
||||||
echo
|
echo
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
QA output created by 020
|
QA output created by 020
|
||||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=6442450944
|
Formatting 'TEST_DIR/t.IMGFMT.base', fmt=IMGFMT size=6442450944
|
||||||
Filling base image
|
Filling base image
|
||||||
|
|
||||||
=== IO: pattern 0
|
=== IO: pattern 0
|
||||||
|
|
|
@ -60,16 +60,22 @@ CLUSTER_SIZE=65536
|
||||||
echo "Creating backing file"
|
echo "Creating backing file"
|
||||||
echo
|
echo
|
||||||
|
|
||||||
|
TEST_IMG_SAVE="$TEST_IMG"
|
||||||
|
TEST_IMG="$TEST_IMG.base_old"
|
||||||
|
|
||||||
_make_test_img 1G
|
_make_test_img 1G
|
||||||
io_pattern writev 0 $CLUSTER_SIZE $((2 * CLUSTER_SIZE)) 8 0x11
|
io_pattern writev 0 $CLUSTER_SIZE $((2 * CLUSTER_SIZE)) 8 0x11
|
||||||
mv "$TEST_IMG" "$TEST_IMG.base_old"
|
|
||||||
|
TEST_IMG="$TEST_IMG_SAVE.base_new"
|
||||||
|
|
||||||
echo "Creating new backing file"
|
echo "Creating new backing file"
|
||||||
echo
|
echo
|
||||||
|
|
||||||
_make_test_img 1G
|
_make_test_img 1G
|
||||||
io_pattern writev 0 $((2 * CLUSTER_SIZE)) $((4 * CLUSTER_SIZE)) 4 0x22
|
io_pattern writev 0 $((2 * CLUSTER_SIZE)) $((4 * CLUSTER_SIZE)) 4 0x22
|
||||||
mv "$TEST_IMG" "$TEST_IMG.base_new"
|
|
||||||
|
|
||||||
|
TEST_IMG="$TEST_IMG_SAVE"
|
||||||
|
|
||||||
echo "Creating COW image"
|
echo "Creating COW image"
|
||||||
echo
|
echo
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
QA output created by 024
|
QA output created by 024
|
||||||
Creating backing file
|
Creating backing file
|
||||||
|
|
||||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824
|
Formatting 'TEST_DIR/t.IMGFMT.base_old', fmt=IMGFMT size=1073741824
|
||||||
=== IO: pattern 0x11
|
=== IO: pattern 0x11
|
||||||
wrote 65536/65536 bytes at offset 0
|
wrote 65536/65536 bytes at offset 0
|
||||||
64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
@ -21,7 +21,7 @@ wrote 65536/65536 bytes at offset 917504
|
||||||
64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
Creating new backing file
|
Creating new backing file
|
||||||
|
|
||||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824
|
Formatting 'TEST_DIR/t.IMGFMT.base_new', fmt=IMGFMT size=1073741824
|
||||||
=== IO: pattern 0x22
|
=== IO: pattern 0x22
|
||||||
wrote 131072/131072 bytes at offset 0
|
wrote 131072/131072 bytes at offset 0
|
||||||
128 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
128 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
|
@ -60,6 +60,9 @@ base_size=$(( image_size - 1024 * 1024 * 1024 ))
|
||||||
|
|
||||||
offset=$(( base_size - 32 * 1024 ))
|
offset=$(( base_size - 32 * 1024 ))
|
||||||
|
|
||||||
|
TEST_IMG_SAVE="$TEST_IMG"
|
||||||
|
TEST_IMG="$TEST_IMG.base"
|
||||||
|
|
||||||
_make_test_img $base_size
|
_make_test_img $base_size
|
||||||
|
|
||||||
echo "Filling base image"
|
echo "Filling base image"
|
||||||
|
@ -73,7 +76,7 @@ _check_test_img
|
||||||
echo "Creating test image with backing file"
|
echo "Creating test image with backing file"
|
||||||
echo
|
echo
|
||||||
|
|
||||||
mv "$TEST_IMG" "$TEST_IMG.base"
|
TEST_IMG="$TEST_IMG_SAVE"
|
||||||
_make_test_img -b "$TEST_IMG.base" $image_size
|
_make_test_img -b "$TEST_IMG.base" $image_size
|
||||||
|
|
||||||
echo "Filling test image"
|
echo "Filling test image"
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
QA output created by 028
|
QA output created by 028
|
||||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=3221227008
|
Formatting 'TEST_DIR/t.IMGFMT.base', fmt=IMGFMT size=3221227008
|
||||||
Filling base image
|
Filling base image
|
||||||
|
|
||||||
=== IO: pattern 195
|
=== IO: pattern 195
|
||||||
|
|
|
@ -51,9 +51,13 @@ size=128M
|
||||||
echo
|
echo
|
||||||
echo "== creating backing file for COW tests =="
|
echo "== creating backing file for COW tests =="
|
||||||
|
|
||||||
|
TEST_IMG_SAVE="$TEST_IMG"
|
||||||
|
TEST_IMG="$TEST_IMG.base"
|
||||||
|
|
||||||
_make_test_img $size
|
_make_test_img $size
|
||||||
$QEMU_IO -c "write -P 0x55 0 1M" "$TEST_IMG" | _filter_qemu_io
|
$QEMU_IO -c "write -P 0x55 0 1M" "$TEST_IMG" | _filter_qemu_io
|
||||||
mv "$TEST_IMG" "$TEST_IMG.base"
|
|
||||||
|
TEST_IMG="$TEST_IMG_SAVE"
|
||||||
|
|
||||||
_make_test_img -b "$TEST_IMG.base" 6G
|
_make_test_img -b "$TEST_IMG.base" 6G
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
QA output created by 034
|
QA output created by 034
|
||||||
|
|
||||||
== creating backing file for COW tests ==
|
== creating backing file for COW tests ==
|
||||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134217728
|
Formatting 'TEST_DIR/t.IMGFMT.base', fmt=IMGFMT size=134217728
|
||||||
wrote 1048576/1048576 bytes at offset 0
|
wrote 1048576/1048576 bytes at offset 0
|
||||||
1 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
1 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=6442450944 backing_file=TEST_DIR/t.IMGFMT.base
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=6442450944 backing_file=TEST_DIR/t.IMGFMT.base
|
||||||
|
|
|
@ -51,6 +51,9 @@ size=128M
|
||||||
echo
|
echo
|
||||||
echo "== creating backing file for COW tests =="
|
echo "== creating backing file for COW tests =="
|
||||||
|
|
||||||
|
TEST_IMG_SAVE="$TEST_IMG"
|
||||||
|
TEST_IMG="$TEST_IMG.base"
|
||||||
|
|
||||||
_make_test_img $size
|
_make_test_img $size
|
||||||
|
|
||||||
function backing_io()
|
function backing_io()
|
||||||
|
@ -71,7 +74,7 @@ function backing_io()
|
||||||
|
|
||||||
backing_io 0 256 write | $QEMU_IO "$TEST_IMG" | _filter_qemu_io
|
backing_io 0 256 write | $QEMU_IO "$TEST_IMG" | _filter_qemu_io
|
||||||
|
|
||||||
mv "$TEST_IMG" "$TEST_IMG.base"
|
TEST_IMG="$TEST_IMG_SAVE"
|
||||||
|
|
||||||
_make_test_img -b "$TEST_IMG.base" 6G
|
_make_test_img -b "$TEST_IMG.base" 6G
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
QA output created by 037
|
QA output created by 037
|
||||||
|
|
||||||
== creating backing file for COW tests ==
|
== creating backing file for COW tests ==
|
||||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134217728
|
Formatting 'TEST_DIR/t.IMGFMT.base', fmt=IMGFMT size=134217728
|
||||||
wrote 512/512 bytes at offset 0
|
wrote 512/512 bytes at offset 0
|
||||||
512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
wrote 512/512 bytes at offset 512
|
wrote 512/512 bytes at offset 512
|
||||||
|
|
|
@ -48,6 +48,9 @@ size=128M
|
||||||
echo
|
echo
|
||||||
echo "== creating backing file for COW tests =="
|
echo "== creating backing file for COW tests =="
|
||||||
|
|
||||||
|
TEST_IMG_SAVE="$TEST_IMG"
|
||||||
|
TEST_IMG="$TEST_IMG.base"
|
||||||
|
|
||||||
_make_test_img $size
|
_make_test_img $size
|
||||||
|
|
||||||
function backing_io()
|
function backing_io()
|
||||||
|
@ -68,7 +71,7 @@ function backing_io()
|
||||||
|
|
||||||
backing_io 0 256 write | $QEMU_IO "$TEST_IMG" | _filter_qemu_io
|
backing_io 0 256 write | $QEMU_IO "$TEST_IMG" | _filter_qemu_io
|
||||||
|
|
||||||
mv "$TEST_IMG" "$TEST_IMG.base"
|
TEST_IMG="$TEST_IMG_SAVE"
|
||||||
|
|
||||||
_make_test_img -b "$TEST_IMG.base" 6G
|
_make_test_img -b "$TEST_IMG.base" 6G
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
QA output created by 038
|
QA output created by 038
|
||||||
|
|
||||||
== creating backing file for COW tests ==
|
== creating backing file for COW tests ==
|
||||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134217728
|
Formatting 'TEST_DIR/t.IMGFMT.base', fmt=IMGFMT size=134217728
|
||||||
wrote 65536/65536 bytes at offset 0
|
wrote 65536/65536 bytes at offset 0
|
||||||
64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
wrote 65536/65536 bytes at offset 65536
|
wrote 65536/65536 bytes at offset 65536
|
||||||
|
|
|
@ -34,9 +34,11 @@ quorum_img3 = os.path.join(iotests.test_dir, 'quorum3.img')
|
||||||
quorum_repair_img = os.path.join(iotests.test_dir, 'quorum_repair.img')
|
quorum_repair_img = os.path.join(iotests.test_dir, 'quorum_repair.img')
|
||||||
quorum_snapshot_file = os.path.join(iotests.test_dir, 'quorum_snapshot.img')
|
quorum_snapshot_file = os.path.join(iotests.test_dir, 'quorum_snapshot.img')
|
||||||
|
|
||||||
|
|
||||||
class TestSingleDrive(iotests.QMPTestCase):
|
class TestSingleDrive(iotests.QMPTestCase):
|
||||||
image_len = 1 * 1024 * 1024 # MB
|
image_len = 1 * 1024 * 1024 # MB
|
||||||
|
qmp_cmd = 'drive-mirror'
|
||||||
|
qmp_target = target_img
|
||||||
|
not_found_error = 'DeviceNotFound'
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
iotests.create_image(backing_img, self.image_len)
|
iotests.create_image(backing_img, self.image_len)
|
||||||
|
@ -58,8 +60,8 @@ class TestSingleDrive(iotests.QMPTestCase):
|
||||||
def test_complete(self):
|
def test_complete(self):
|
||||||
self.assert_no_active_block_jobs()
|
self.assert_no_active_block_jobs()
|
||||||
|
|
||||||
result = self.vm.qmp('drive-mirror', device='drive0', sync='full',
|
result = self.vm.qmp(self.qmp_cmd, device='drive0', sync='full',
|
||||||
target=target_img)
|
target=self.qmp_target)
|
||||||
self.assert_qmp(result, 'return', {})
|
self.assert_qmp(result, 'return', {})
|
||||||
|
|
||||||
self.complete_and_wait()
|
self.complete_and_wait()
|
||||||
|
@ -72,8 +74,8 @@ class TestSingleDrive(iotests.QMPTestCase):
|
||||||
def test_cancel(self):
|
def test_cancel(self):
|
||||||
self.assert_no_active_block_jobs()
|
self.assert_no_active_block_jobs()
|
||||||
|
|
||||||
result = self.vm.qmp('drive-mirror', device='drive0', sync='full',
|
result = self.vm.qmp(self.qmp_cmd, device='drive0', sync='full',
|
||||||
target=target_img)
|
target=self.qmp_target)
|
||||||
self.assert_qmp(result, 'return', {})
|
self.assert_qmp(result, 'return', {})
|
||||||
|
|
||||||
self.cancel_and_wait(force=True)
|
self.cancel_and_wait(force=True)
|
||||||
|
@ -84,8 +86,8 @@ class TestSingleDrive(iotests.QMPTestCase):
|
||||||
def test_cancel_after_ready(self):
|
def test_cancel_after_ready(self):
|
||||||
self.assert_no_active_block_jobs()
|
self.assert_no_active_block_jobs()
|
||||||
|
|
||||||
result = self.vm.qmp('drive-mirror', device='drive0', sync='full',
|
result = self.vm.qmp(self.qmp_cmd, device='drive0', sync='full',
|
||||||
target=target_img)
|
target=self.qmp_target)
|
||||||
self.assert_qmp(result, 'return', {})
|
self.assert_qmp(result, 'return', {})
|
||||||
|
|
||||||
self.wait_ready_and_cancel()
|
self.wait_ready_and_cancel()
|
||||||
|
@ -98,8 +100,8 @@ class TestSingleDrive(iotests.QMPTestCase):
|
||||||
def test_pause(self):
|
def test_pause(self):
|
||||||
self.assert_no_active_block_jobs()
|
self.assert_no_active_block_jobs()
|
||||||
|
|
||||||
result = self.vm.qmp('drive-mirror', device='drive0', sync='full',
|
result = self.vm.qmp(self.qmp_cmd, device='drive0', sync='full',
|
||||||
target=target_img)
|
target=self.qmp_target)
|
||||||
self.assert_qmp(result, 'return', {})
|
self.assert_qmp(result, 'return', {})
|
||||||
|
|
||||||
result = self.vm.qmp('block-job-pause', device='drive0')
|
result = self.vm.qmp('block-job-pause', device='drive0')
|
||||||
|
@ -125,8 +127,8 @@ class TestSingleDrive(iotests.QMPTestCase):
|
||||||
self.assert_no_active_block_jobs()
|
self.assert_no_active_block_jobs()
|
||||||
|
|
||||||
# A small buffer is rounded up automatically
|
# A small buffer is rounded up automatically
|
||||||
result = self.vm.qmp('drive-mirror', device='drive0', sync='full',
|
result = self.vm.qmp(self.qmp_cmd, device='drive0', sync='full',
|
||||||
buf_size=4096, target=target_img)
|
buf_size=4096, target=self.qmp_target)
|
||||||
self.assert_qmp(result, 'return', {})
|
self.assert_qmp(result, 'return', {})
|
||||||
|
|
||||||
self.complete_and_wait()
|
self.complete_and_wait()
|
||||||
|
@ -141,8 +143,8 @@ class TestSingleDrive(iotests.QMPTestCase):
|
||||||
|
|
||||||
qemu_img('create', '-f', iotests.imgfmt, '-o', 'cluster_size=%d,size=%d'
|
qemu_img('create', '-f', iotests.imgfmt, '-o', 'cluster_size=%d,size=%d'
|
||||||
% (self.image_len, self.image_len), target_img)
|
% (self.image_len, self.image_len), target_img)
|
||||||
result = self.vm.qmp('drive-mirror', device='drive0', sync='full',
|
result = self.vm.qmp(self.qmp_cmd, device='drive0', sync='full',
|
||||||
buf_size=65536, mode='existing', target=target_img)
|
buf_size=65536, mode='existing', target=self.qmp_target)
|
||||||
self.assert_qmp(result, 'return', {})
|
self.assert_qmp(result, 'return', {})
|
||||||
|
|
||||||
self.complete_and_wait()
|
self.complete_and_wait()
|
||||||
|
@ -157,8 +159,8 @@ class TestSingleDrive(iotests.QMPTestCase):
|
||||||
|
|
||||||
qemu_img('create', '-f', iotests.imgfmt, '-o', 'cluster_size=%d,backing_file=%s'
|
qemu_img('create', '-f', iotests.imgfmt, '-o', 'cluster_size=%d,backing_file=%s'
|
||||||
% (self.image_len, backing_img), target_img)
|
% (self.image_len, backing_img), target_img)
|
||||||
result = self.vm.qmp('drive-mirror', device='drive0', sync='full',
|
result = self.vm.qmp(self.qmp_cmd, device='drive0', sync='full',
|
||||||
mode='existing', target=target_img)
|
mode='existing', target=self.qmp_target)
|
||||||
self.assert_qmp(result, 'return', {})
|
self.assert_qmp(result, 'return', {})
|
||||||
|
|
||||||
self.complete_and_wait()
|
self.complete_and_wait()
|
||||||
|
@ -172,30 +174,82 @@ class TestSingleDrive(iotests.QMPTestCase):
|
||||||
if iotests.qemu_default_machine != 'pc':
|
if iotests.qemu_default_machine != 'pc':
|
||||||
return
|
return
|
||||||
|
|
||||||
result = self.vm.qmp('drive-mirror', device='drive1', # CD-ROM
|
result = self.vm.qmp(self.qmp_cmd, device='ide1-cd0', sync='full',
|
||||||
sync='full', target=target_img)
|
target=self.qmp_target)
|
||||||
self.assert_qmp(result, 'error/class', 'GenericError')
|
self.assert_qmp(result, 'error/class', self.not_found_error)
|
||||||
|
|
||||||
def test_image_not_found(self):
|
def test_image_not_found(self):
|
||||||
result = self.vm.qmp('drive-mirror', device='drive0', sync='full',
|
result = self.vm.qmp(self.qmp_cmd, device='drive0', sync='full',
|
||||||
mode='existing', target=target_img)
|
mode='existing', target=self.qmp_target)
|
||||||
self.assert_qmp(result, 'error/class', 'GenericError')
|
self.assert_qmp(result, 'error/class', 'GenericError')
|
||||||
|
|
||||||
def test_device_not_found(self):
|
def test_device_not_found(self):
|
||||||
result = self.vm.qmp('drive-mirror', device='nonexistent', sync='full',
|
result = self.vm.qmp(self.qmp_cmd, device='nonexistent', sync='full',
|
||||||
target=target_img)
|
target=self.qmp_target)
|
||||||
self.assert_qmp(result, 'error/class', 'DeviceNotFound')
|
self.assert_qmp(result, 'error/class', self.not_found_error)
|
||||||
|
|
||||||
|
class TestSingleBlockdev(TestSingleDrive):
|
||||||
|
qmp_cmd = 'blockdev-mirror'
|
||||||
|
qmp_target = 'node1'
|
||||||
|
not_found_error = 'GenericError'
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
TestSingleDrive.setUp(self)
|
||||||
|
qemu_img('create', '-f', iotests.imgfmt, '-o', 'backing_file=%s' % backing_img, target_img)
|
||||||
|
args = {'options':
|
||||||
|
{'driver': iotests.imgfmt,
|
||||||
|
'node-name': self.qmp_target,
|
||||||
|
'file': { 'filename': target_img, 'driver': 'file' } } }
|
||||||
|
result = self.vm.qmp("blockdev-add", **args)
|
||||||
|
self.assert_qmp(result, 'return', {})
|
||||||
|
|
||||||
|
test_large_cluster = None
|
||||||
|
test_image_not_found = None
|
||||||
|
test_small_buffer2 = None
|
||||||
|
|
||||||
|
class TestBlockdevAttached(iotests.QMPTestCase):
|
||||||
|
image_len = 1 * 1024 * 1024 # MB
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
iotests.create_image(backing_img, self.image_len)
|
||||||
|
qemu_img('create', '-f', iotests.imgfmt, '-o', 'backing_file=%s' % backing_img, test_img)
|
||||||
|
qemu_img('create', '-f', iotests.imgfmt, '-o', 'backing_file=%s' % backing_img, target_img)
|
||||||
|
self.vm = iotests.VM().add_drive(test_img)
|
||||||
|
self.vm.launch()
|
||||||
|
|
||||||
|
def tearDown(self):
|
||||||
|
self.vm.shutdown()
|
||||||
|
os.remove(test_img)
|
||||||
|
os.remove(target_img)
|
||||||
|
|
||||||
|
def test_blockdev_attached(self):
|
||||||
|
self.assert_no_active_block_jobs()
|
||||||
|
args = {'options':
|
||||||
|
{'driver': iotests.imgfmt,
|
||||||
|
'id': 'drive1',
|
||||||
|
'file': { 'filename': target_img, 'driver': 'file' } } }
|
||||||
|
result = self.vm.qmp("blockdev-add", **args)
|
||||||
|
self.assert_qmp(result, 'return', {})
|
||||||
|
result = self.vm.qmp('blockdev-mirror', device='drive0', sync='full',
|
||||||
|
target='drive1')
|
||||||
|
self.assert_qmp(result, 'error/class', 'GenericError')
|
||||||
|
|
||||||
class TestSingleDriveZeroLength(TestSingleDrive):
|
class TestSingleDriveZeroLength(TestSingleDrive):
|
||||||
image_len = 0
|
image_len = 0
|
||||||
test_small_buffer2 = None
|
test_small_buffer2 = None
|
||||||
test_large_cluster = None
|
test_large_cluster = None
|
||||||
|
|
||||||
|
class TestSingleBlockdevZeroLength(TestSingleBlockdev):
|
||||||
|
image_len = 0
|
||||||
|
|
||||||
class TestSingleDriveUnalignedLength(TestSingleDrive):
|
class TestSingleDriveUnalignedLength(TestSingleDrive):
|
||||||
image_len = 1025 * 1024
|
image_len = 1025 * 1024
|
||||||
test_small_buffer2 = None
|
test_small_buffer2 = None
|
||||||
test_large_cluster = None
|
test_large_cluster = None
|
||||||
|
|
||||||
|
class TestSingleBlockdevUnalignedLength(TestSingleBlockdev):
|
||||||
|
image_len = 1025 * 1024
|
||||||
|
|
||||||
class TestMirrorNoBacking(iotests.QMPTestCase):
|
class TestMirrorNoBacking(iotests.QMPTestCase):
|
||||||
image_len = 2 * 1024 * 1024 # MB
|
image_len = 2 * 1024 * 1024 # MB
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
......................................................
|
............................................................................
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
Ran 54 tests
|
Ran 76 tests
|
||||||
|
|
||||||
OK
|
OK
|
||||||
|
|
|
@ -51,14 +51,19 @@ fi
|
||||||
echo
|
echo
|
||||||
echo "== Creating images =="
|
echo "== Creating images =="
|
||||||
|
|
||||||
|
TEST_IMG_SAVE="$TEST_IMG"
|
||||||
|
TEST_IMG="$TEST_IMG.old"
|
||||||
|
|
||||||
size=10M
|
size=10M
|
||||||
_make_test_img $size
|
_make_test_img $size
|
||||||
$QEMU_IO -c "write -P 0x40 0 1048576" "$TEST_IMG" | _filter_qemu_io
|
$QEMU_IO -c "write -P 0x40 0 1048576" "$TEST_IMG" | _filter_qemu_io
|
||||||
mv "$TEST_IMG" "$TEST_IMG.old"
|
|
||||||
|
TEST_IMG="$TEST_IMG_SAVE.new"
|
||||||
|
|
||||||
_make_test_img $size
|
_make_test_img $size
|
||||||
$QEMU_IO -c "write -P 0x5a 0 1048576" "$TEST_IMG" | _filter_qemu_io
|
$QEMU_IO -c "write -P 0x5a 0 1048576" "$TEST_IMG" | _filter_qemu_io
|
||||||
mv "$TEST_IMG" "$TEST_IMG.new"
|
|
||||||
|
TEST_IMG="$TEST_IMG_SAVE"
|
||||||
|
|
||||||
_make_test_img -b "$TEST_IMG.old" $size
|
_make_test_img -b "$TEST_IMG.old" $size
|
||||||
$QEMU_IO -c "write -z 0 1048576" "$TEST_IMG" | _filter_qemu_io
|
$QEMU_IO -c "write -z 0 1048576" "$TEST_IMG" | _filter_qemu_io
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
QA output created by 050
|
QA output created by 050
|
||||||
|
|
||||||
== Creating images ==
|
== Creating images ==
|
||||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=10485760
|
Formatting 'TEST_DIR/t.IMGFMT.old', fmt=IMGFMT size=10485760
|
||||||
wrote 1048576/1048576 bytes at offset 0
|
wrote 1048576/1048576 bytes at offset 0
|
||||||
1 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
1 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=10485760
|
Formatting 'TEST_DIR/t.IMGFMT.new', fmt=IMGFMT size=10485760
|
||||||
wrote 1048576/1048576 bytes at offset 0
|
wrote 1048576/1048576 bytes at offset 0
|
||||||
1 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
1 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=10485760 backing_file=TEST_DIR/t.IMGFMT.old
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=10485760 backing_file=TEST_DIR/t.IMGFMT.old
|
||||||
|
|
|
@ -65,6 +65,7 @@ function run_qemu()
|
||||||
}
|
}
|
||||||
|
|
||||||
size=128M
|
size=128M
|
||||||
|
device_id="drive0"
|
||||||
|
|
||||||
_make_test_img $size
|
_make_test_img $size
|
||||||
cp "$TEST_IMG" "$TEST_IMG.orig"
|
cp "$TEST_IMG" "$TEST_IMG.orig"
|
||||||
|
@ -75,10 +76,10 @@ echo
|
||||||
echo === Unknown option ===
|
echo === Unknown option ===
|
||||||
echo
|
echo
|
||||||
|
|
||||||
run_qemu -drive file="$TEST_IMG",format=qcow2,unknown_opt=
|
run_qemu -drive file="$TEST_IMG",format=qcow2,unknown_opt=,if=none,id=$device_id
|
||||||
run_qemu -drive file="$TEST_IMG",format=qcow2,unknown_opt=on
|
run_qemu -drive file="$TEST_IMG",format=qcow2,unknown_opt=on,if=none,id=$device_id
|
||||||
run_qemu -drive file="$TEST_IMG",format=qcow2,unknown_opt=1234
|
run_qemu -drive file="$TEST_IMG",format=qcow2,unknown_opt=1234,if=none,id=$device_id
|
||||||
run_qemu -drive file="$TEST_IMG",format=qcow2,unknown_opt=foo
|
run_qemu -drive file="$TEST_IMG",format=qcow2,unknown_opt=foo,if=none,id=$device_id
|
||||||
|
|
||||||
echo
|
echo
|
||||||
echo === Unknown protocol option ===
|
echo === Unknown protocol option ===
|
||||||
|
@ -108,7 +109,7 @@ echo
|
||||||
echo === Overriding backing file ===
|
echo === Overriding backing file ===
|
||||||
echo
|
echo
|
||||||
|
|
||||||
echo "info block" | run_qemu -drive file="$TEST_IMG",driver=qcow2,backing.file.filename="$TEST_IMG.orig" -nodefaults\
|
echo "info block" | run_qemu -drive file="$TEST_IMG",driver=qcow2,backing.file.filename="$TEST_IMG.orig",if=none,id=$device_id -nodefaults\
|
||||||
| _filter_generated_node_ids
|
| _filter_generated_node_ids
|
||||||
|
|
||||||
# Drivers that don't support backing files
|
# Drivers that don't support backing files
|
||||||
|
@ -140,13 +141,19 @@ echo
|
||||||
echo === No medium ===
|
echo === No medium ===
|
||||||
echo
|
echo
|
||||||
|
|
||||||
run_qemu -drive if=floppy
|
case "$QEMU_DEFAULT_MACHINE" in
|
||||||
run_qemu -drive if=ide,media=cdrom
|
pc)
|
||||||
run_qemu -drive if=scsi,media=cdrom
|
run_qemu -drive if=floppy
|
||||||
|
run_qemu -drive if=ide,media=cdrom
|
||||||
|
run_qemu -drive if=scsi,media=cdrom
|
||||||
|
run_qemu -drive if=ide
|
||||||
|
run_qemu -drive if=scsi
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
run_qemu -drive if=ide
|
|
||||||
run_qemu -drive if=virtio
|
run_qemu -drive if=virtio
|
||||||
run_qemu -drive if=scsi
|
|
||||||
|
|
||||||
case "$QEMU_DEFAULT_MACHINE" in
|
case "$QEMU_DEFAULT_MACHINE" in
|
||||||
pc)
|
pc)
|
||||||
|
@ -171,13 +178,13 @@ case "$QEMU_DEFAULT_MACHINE" in
|
||||||
run_qemu -drive file="$TEST_IMG",if=ide,media=cdrom,readonly=on
|
run_qemu -drive file="$TEST_IMG",if=ide,media=cdrom,readonly=on
|
||||||
run_qemu -drive file="$TEST_IMG",if=scsi,media=cdrom,readonly=on
|
run_qemu -drive file="$TEST_IMG",if=scsi,media=cdrom,readonly=on
|
||||||
run_qemu -drive file="$TEST_IMG",if=ide,readonly=on
|
run_qemu -drive file="$TEST_IMG",if=ide,readonly=on
|
||||||
|
run_qemu -drive file="$TEST_IMG",if=scsi,readonly=on
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
run_qemu -drive file="$TEST_IMG",if=virtio,readonly=on
|
run_qemu -drive file="$TEST_IMG",if=virtio,readonly=on
|
||||||
run_qemu -drive file="$TEST_IMG",if=scsi,readonly=on
|
|
||||||
|
|
||||||
case "$QEMU_DEFAULT_MACHINE" in
|
case "$QEMU_DEFAULT_MACHINE" in
|
||||||
pc)
|
pc)
|
||||||
|
@ -211,7 +218,7 @@ run_qemu -drive driver=null-co,cache=invalid_value
|
||||||
|
|
||||||
for cache in writeback writethrough unsafe invalid_value; do
|
for cache in writeback writethrough unsafe invalid_value; do
|
||||||
echo -e "info block\ninfo block file\ninfo block backing\ninfo block backing-file" | \
|
echo -e "info block\ninfo block file\ninfo block backing\ninfo block backing-file" | \
|
||||||
run_qemu -drive file="$TEST_IMG",cache=$cache,backing.file.filename="$TEST_IMG.base",backing.cache.no-flush=on,backing.cache.writeback=on,backing.node-name=backing,backing.file.node-name=backing-file,file.node-name=file -nodefaults
|
run_qemu -drive file="$TEST_IMG",cache=$cache,backing.file.filename="$TEST_IMG.base",backing.cache.no-flush=on,backing.cache.writeback=on,backing.node-name=backing,backing.file.node-name=backing-file,file.node-name=file,if=none,id=$device_id -nodefaults
|
||||||
done
|
done
|
||||||
|
|
||||||
echo
|
echo
|
||||||
|
@ -277,7 +284,6 @@ echo
|
||||||
|
|
||||||
$QEMU_IO -c "write -P 0x11 0 4k" "$TEST_IMG" | _filter_qemu_io
|
$QEMU_IO -c "write -P 0x11 0 4k" "$TEST_IMG" | _filter_qemu_io
|
||||||
|
|
||||||
device_id="drive0"
|
|
||||||
|
|
||||||
echo "qemu-io $device_id \"write -P 0x22 0 4k\"" | run_qemu -drive file="$TEST_IMG",if=none,id=$device_id -snapshot | _filter_qemu_io
|
echo "qemu-io $device_id \"write -P 0x22 0 4k\"" | run_qemu -drive file="$TEST_IMG",if=none,id=$device_id -snapshot | _filter_qemu_io
|
||||||
echo "qemu-io $device_id \"write -P 0x22 0 4k\"" | run_qemu -drive file="$TEST_IMG",snapshot=on,if=none,id=$device_id | _filter_qemu_io
|
echo "qemu-io $device_id \"write -P 0x22 0 4k\"" | run_qemu -drive file="$TEST_IMG",snapshot=on,if=none,id=$device_id | _filter_qemu_io
|
||||||
|
|
|
@ -4,17 +4,17 @@ Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134217728 backing_file=TEST_DIR/
|
||||||
|
|
||||||
=== Unknown option ===
|
=== Unknown option ===
|
||||||
|
|
||||||
Testing: -drive file=TEST_DIR/t.qcow2,format=qcow2,unknown_opt=
|
Testing: -drive file=TEST_DIR/t.qcow2,format=qcow2,unknown_opt=,if=none,id=drive0
|
||||||
QEMU_PROG: -drive file=TEST_DIR/t.qcow2,format=qcow2,unknown_opt=: Block format 'qcow2' used by device 'virtio0' doesn't support the option 'unknown_opt'
|
QEMU_PROG: -drive file=TEST_DIR/t.qcow2,format=qcow2,unknown_opt=,if=none,id=drive0: Block format 'qcow2' used by device 'drive0' doesn't support the option 'unknown_opt'
|
||||||
|
|
||||||
Testing: -drive file=TEST_DIR/t.qcow2,format=qcow2,unknown_opt=on
|
Testing: -drive file=TEST_DIR/t.qcow2,format=qcow2,unknown_opt=on,if=none,id=drive0
|
||||||
QEMU_PROG: -drive file=TEST_DIR/t.qcow2,format=qcow2,unknown_opt=on: Block format 'qcow2' used by device 'virtio0' doesn't support the option 'unknown_opt'
|
QEMU_PROG: -drive file=TEST_DIR/t.qcow2,format=qcow2,unknown_opt=on,if=none,id=drive0: Block format 'qcow2' used by device 'drive0' doesn't support the option 'unknown_opt'
|
||||||
|
|
||||||
Testing: -drive file=TEST_DIR/t.qcow2,format=qcow2,unknown_opt=1234
|
Testing: -drive file=TEST_DIR/t.qcow2,format=qcow2,unknown_opt=1234,if=none,id=drive0
|
||||||
QEMU_PROG: -drive file=TEST_DIR/t.qcow2,format=qcow2,unknown_opt=1234: Block format 'qcow2' used by device 'virtio0' doesn't support the option 'unknown_opt'
|
QEMU_PROG: -drive file=TEST_DIR/t.qcow2,format=qcow2,unknown_opt=1234,if=none,id=drive0: Block format 'qcow2' used by device 'drive0' doesn't support the option 'unknown_opt'
|
||||||
|
|
||||||
Testing: -drive file=TEST_DIR/t.qcow2,format=qcow2,unknown_opt=foo
|
Testing: -drive file=TEST_DIR/t.qcow2,format=qcow2,unknown_opt=foo,if=none,id=drive0
|
||||||
QEMU_PROG: -drive file=TEST_DIR/t.qcow2,format=qcow2,unknown_opt=foo: Block format 'qcow2' used by device 'virtio0' doesn't support the option 'unknown_opt'
|
QEMU_PROG: -drive file=TEST_DIR/t.qcow2,format=qcow2,unknown_opt=foo,if=none,id=drive0: Block format 'qcow2' used by device 'drive0' doesn't support the option 'unknown_opt'
|
||||||
|
|
||||||
|
|
||||||
=== Unknown protocol option ===
|
=== Unknown protocol option ===
|
||||||
|
@ -56,10 +56,11 @@ QEMU X.Y.Z monitor - type 'help' for more information
|
||||||
|
|
||||||
=== Overriding backing file ===
|
=== Overriding backing file ===
|
||||||
|
|
||||||
Testing: -drive file=TEST_DIR/t.qcow2,driver=qcow2,backing.file.filename=TEST_DIR/t.qcow2.orig -nodefaults
|
Testing: -drive file=TEST_DIR/t.qcow2,driver=qcow2,backing.file.filename=TEST_DIR/t.qcow2.orig,if=none,id=drive0 -nodefaults
|
||||||
QEMU X.Y.Z monitor - type 'help' for more information
|
QEMU X.Y.Z monitor - type 'help' for more information
|
||||||
(qemu) i[K[Din[K[D[Dinf[K[D[D[Dinfo[K[D[D[D[Dinfo [K[D[D[D[D[Dinfo b[K[D[D[D[D[D[Dinfo bl[K[D[D[D[D[D[D[Dinfo blo[K[D[D[D[D[D[D[D[Dinfo bloc[K[D[D[D[D[D[D[D[D[Dinfo block[K
|
(qemu) i[K[Din[K[D[Dinf[K[D[D[Dinfo[K[D[D[D[Dinfo [K[D[D[D[D[Dinfo b[K[D[D[D[D[D[Dinfo bl[K[D[D[D[D[D[D[Dinfo blo[K[D[D[D[D[D[D[D[Dinfo bloc[K[D[D[D[D[D[D[D[D[Dinfo block[K
|
||||||
virtio0 (NODE_NAME): TEST_DIR/t.qcow2 (qcow2)
|
drive0 (NODE_NAME): TEST_DIR/t.qcow2 (qcow2)
|
||||||
|
Removable device: not locked, tray closed
|
||||||
Cache mode: writeback
|
Cache mode: writeback
|
||||||
Backing file: TEST_DIR/t.qcow2.orig (chain depth: 1)
|
Backing file: TEST_DIR/t.qcow2.orig (chain depth: 1)
|
||||||
(qemu) q[K[Dqu[K[D[Dqui[K[D[D[Dquit[K
|
(qemu) q[K[Dqu[K[D[Dqui[K[D[D[Dquit[K
|
||||||
|
@ -107,35 +108,10 @@ QEMU X.Y.Z monitor - type 'help' for more information
|
||||||
|
|
||||||
=== No medium ===
|
=== No medium ===
|
||||||
|
|
||||||
Testing: -drive if=floppy
|
|
||||||
QEMU X.Y.Z monitor - type 'help' for more information
|
|
||||||
(qemu) Warning: Orphaned drive without device: id=floppy0,file=,if=floppy,bus=0,unit=0
|
|
||||||
q[K[Dqu[K[D[Dqui[K[D[D[Dquit[K
|
|
||||||
|
|
||||||
Testing: -drive if=ide,media=cdrom
|
|
||||||
QEMU X.Y.Z monitor - type 'help' for more information
|
|
||||||
(qemu) Warning: Orphaned drive without device: id=ide0-cd0,file=,if=ide,bus=0,unit=0
|
|
||||||
q[K[Dqu[K[D[Dqui[K[D[D[Dquit[K
|
|
||||||
|
|
||||||
Testing: -drive if=scsi,media=cdrom
|
|
||||||
QEMU X.Y.Z monitor - type 'help' for more information
|
|
||||||
(qemu) Warning: Orphaned drive without device: id=scsi0-cd0,file=,if=scsi,bus=0,unit=0
|
|
||||||
q[K[Dqu[K[D[Dqui[K[D[D[Dquit[K
|
|
||||||
|
|
||||||
Testing: -drive if=ide
|
|
||||||
QEMU X.Y.Z monitor - type 'help' for more information
|
|
||||||
(qemu) Warning: Orphaned drive without device: id=ide0-hd0,file=,if=ide,bus=0,unit=0
|
|
||||||
q[K[Dqu[K[D[Dqui[K[D[D[Dquit[K
|
|
||||||
|
|
||||||
Testing: -drive if=virtio
|
Testing: -drive if=virtio
|
||||||
QEMU X.Y.Z monitor - type 'help' for more information
|
QEMU X.Y.Z monitor - type 'help' for more information
|
||||||
(qemu) QEMU_PROG: -drive if=virtio: Device needs media, but drive is empty
|
(qemu) QEMU_PROG: -drive if=virtio: Device needs media, but drive is empty
|
||||||
|
|
||||||
Testing: -drive if=scsi
|
|
||||||
QEMU X.Y.Z monitor - type 'help' for more information
|
|
||||||
(qemu) Warning: Orphaned drive without device: id=scsi0-hd0,file=,if=scsi,bus=0,unit=0
|
|
||||||
q[K[Dqu[K[D[Dqui[K[D[D[Dquit[K
|
|
||||||
|
|
||||||
|
|
||||||
=== Read-only ===
|
=== Read-only ===
|
||||||
|
|
||||||
|
@ -143,11 +119,6 @@ Testing: -drive file=TEST_DIR/t.qcow2,if=virtio,readonly=on
|
||||||
QEMU X.Y.Z monitor - type 'help' for more information
|
QEMU X.Y.Z monitor - type 'help' for more information
|
||||||
(qemu) q[K[Dqu[K[D[Dqui[K[D[D[Dquit[K
|
(qemu) q[K[Dqu[K[D[Dqui[K[D[D[Dquit[K
|
||||||
|
|
||||||
Testing: -drive file=TEST_DIR/t.qcow2,if=scsi,readonly=on
|
|
||||||
QEMU X.Y.Z monitor - type 'help' for more information
|
|
||||||
(qemu) Warning: Orphaned drive without device: id=scsi0-hd0,file=TEST_DIR/t.qcow2,if=scsi,bus=0,unit=0
|
|
||||||
q[K[Dqu[K[D[Dqui[K[D[D[Dquit[K
|
|
||||||
|
|
||||||
|
|
||||||
=== Cache modes ===
|
=== Cache modes ===
|
||||||
|
|
||||||
|
@ -174,10 +145,11 @@ QEMU X.Y.Z monitor - type 'help' for more information
|
||||||
Testing: -drive driver=null-co,cache=invalid_value
|
Testing: -drive driver=null-co,cache=invalid_value
|
||||||
QEMU_PROG: -drive driver=null-co,cache=invalid_value: invalid cache option
|
QEMU_PROG: -drive driver=null-co,cache=invalid_value: invalid cache option
|
||||||
|
|
||||||
Testing: -drive file=TEST_DIR/t.qcow2,cache=writeback,backing.file.filename=TEST_DIR/t.qcow2.base,backing.cache.no-flush=on,backing.cache.writeback=on,backing.node-name=backing,backing.file.node-name=backing-file,file.node-name=file -nodefaults
|
Testing: -drive file=TEST_DIR/t.qcow2,cache=writeback,backing.file.filename=TEST_DIR/t.qcow2.base,backing.cache.no-flush=on,backing.cache.writeback=on,backing.node-name=backing,backing.file.node-name=backing-file,file.node-name=file,if=none,id=drive0 -nodefaults
|
||||||
QEMU X.Y.Z monitor - type 'help' for more information
|
QEMU X.Y.Z monitor - type 'help' for more information
|
||||||
(qemu) i[K[Din[K[D[Dinf[K[D[D[Dinfo[K[D[D[D[Dinfo [K[D[D[D[D[Dinfo b[K[D[D[D[D[D[Dinfo bl[K[D[D[D[D[D[D[Dinfo blo[K[D[D[D[D[D[D[D[Dinfo bloc[K[D[D[D[D[D[D[D[D[Dinfo block[K
|
(qemu) i[K[Din[K[D[Dinf[K[D[D[Dinfo[K[D[D[D[Dinfo [K[D[D[D[D[Dinfo b[K[D[D[D[D[D[Dinfo bl[K[D[D[D[D[D[D[Dinfo blo[K[D[D[D[D[D[D[D[Dinfo bloc[K[D[D[D[D[D[D[D[D[Dinfo block[K
|
||||||
ide0-hd0 (NODE_NAME): TEST_DIR/t.qcow2 (qcow2)
|
drive0 (NODE_NAME): TEST_DIR/t.qcow2 (qcow2)
|
||||||
|
Removable device: not locked, tray closed
|
||||||
Cache mode: writeback
|
Cache mode: writeback
|
||||||
Backing file: TEST_DIR/t.qcow2.base (chain depth: 1)
|
Backing file: TEST_DIR/t.qcow2.base (chain depth: 1)
|
||||||
(qemu) i[K[Din[K[D[Dinf[K[D[D[Dinfo[K[D[D[D[Dinfo [K[D[D[D[D[Dinfo b[K[D[D[D[D[D[Dinfo bl[K[D[D[D[D[D[D[Dinfo blo[K[D[D[D[D[D[D[D[Dinfo bloc[K[D[D[D[D[D[D[D[D[Dinfo block[K[D[D[D[D[D[D[D[D[D[Dinfo block [K[D[D[D[D[D[D[D[D[D[D[Dinfo block f[K[D[D[D[D[D[D[D[D[D[D[D[Dinfo block fi[K[D[D[D[D[D[D[D[D[D[D[D[D[Dinfo block fil[K[D[D[D[D[D[D[D[D[D[D[D[D[D[Dinfo block file[K
|
(qemu) i[K[Din[K[D[Dinf[K[D[D[Dinfo[K[D[D[D[Dinfo [K[D[D[D[D[Dinfo b[K[D[D[D[D[D[Dinfo bl[K[D[D[D[D[D[D[Dinfo blo[K[D[D[D[D[D[D[D[Dinfo bloc[K[D[D[D[D[D[D[D[D[Dinfo block[K[D[D[D[D[D[D[D[D[D[Dinfo block [K[D[D[D[D[D[D[D[D[D[D[Dinfo block f[K[D[D[D[D[D[D[D[D[D[D[D[Dinfo block fi[K[D[D[D[D[D[D[D[D[D[D[D[D[Dinfo block fil[K[D[D[D[D[D[D[D[D[D[D[D[D[D[Dinfo block file[K
|
||||||
|
@ -193,10 +165,11 @@ backing-file: TEST_DIR/t.qcow2.base (file, read-only)
|
||||||
Cache mode: writeback, ignore flushes
|
Cache mode: writeback, ignore flushes
|
||||||
(qemu) q[K[Dqu[K[D[Dqui[K[D[D[Dquit[K
|
(qemu) q[K[Dqu[K[D[Dqui[K[D[D[Dquit[K
|
||||||
|
|
||||||
Testing: -drive file=TEST_DIR/t.qcow2,cache=writethrough,backing.file.filename=TEST_DIR/t.qcow2.base,backing.cache.no-flush=on,backing.cache.writeback=on,backing.node-name=backing,backing.file.node-name=backing-file,file.node-name=file -nodefaults
|
Testing: -drive file=TEST_DIR/t.qcow2,cache=writethrough,backing.file.filename=TEST_DIR/t.qcow2.base,backing.cache.no-flush=on,backing.cache.writeback=on,backing.node-name=backing,backing.file.node-name=backing-file,file.node-name=file,if=none,id=drive0 -nodefaults
|
||||||
QEMU X.Y.Z monitor - type 'help' for more information
|
QEMU X.Y.Z monitor - type 'help' for more information
|
||||||
(qemu) i[K[Din[K[D[Dinf[K[D[D[Dinfo[K[D[D[D[Dinfo [K[D[D[D[D[Dinfo b[K[D[D[D[D[D[Dinfo bl[K[D[D[D[D[D[D[Dinfo blo[K[D[D[D[D[D[D[D[Dinfo bloc[K[D[D[D[D[D[D[D[D[Dinfo block[K
|
(qemu) i[K[Din[K[D[Dinf[K[D[D[Dinfo[K[D[D[D[Dinfo [K[D[D[D[D[Dinfo b[K[D[D[D[D[D[Dinfo bl[K[D[D[D[D[D[D[Dinfo blo[K[D[D[D[D[D[D[D[Dinfo bloc[K[D[D[D[D[D[D[D[D[Dinfo block[K
|
||||||
ide0-hd0 (NODE_NAME): TEST_DIR/t.qcow2 (qcow2)
|
drive0 (NODE_NAME): TEST_DIR/t.qcow2 (qcow2)
|
||||||
|
Removable device: not locked, tray closed
|
||||||
Cache mode: writethrough
|
Cache mode: writethrough
|
||||||
Backing file: TEST_DIR/t.qcow2.base (chain depth: 1)
|
Backing file: TEST_DIR/t.qcow2.base (chain depth: 1)
|
||||||
(qemu) i[K[Din[K[D[Dinf[K[D[D[Dinfo[K[D[D[D[Dinfo [K[D[D[D[D[Dinfo b[K[D[D[D[D[D[Dinfo bl[K[D[D[D[D[D[D[Dinfo blo[K[D[D[D[D[D[D[D[Dinfo bloc[K[D[D[D[D[D[D[D[D[Dinfo block[K[D[D[D[D[D[D[D[D[D[Dinfo block [K[D[D[D[D[D[D[D[D[D[D[Dinfo block f[K[D[D[D[D[D[D[D[D[D[D[D[Dinfo block fi[K[D[D[D[D[D[D[D[D[D[D[D[D[Dinfo block fil[K[D[D[D[D[D[D[D[D[D[D[D[D[D[Dinfo block file[K
|
(qemu) i[K[Din[K[D[Dinf[K[D[D[Dinfo[K[D[D[D[Dinfo [K[D[D[D[D[Dinfo b[K[D[D[D[D[D[Dinfo bl[K[D[D[D[D[D[D[Dinfo blo[K[D[D[D[D[D[D[D[Dinfo bloc[K[D[D[D[D[D[D[D[D[Dinfo block[K[D[D[D[D[D[D[D[D[D[Dinfo block [K[D[D[D[D[D[D[D[D[D[D[Dinfo block f[K[D[D[D[D[D[D[D[D[D[D[D[Dinfo block fi[K[D[D[D[D[D[D[D[D[D[D[D[D[Dinfo block fil[K[D[D[D[D[D[D[D[D[D[D[D[D[D[Dinfo block file[K
|
||||||
|
@ -212,10 +185,11 @@ backing-file: TEST_DIR/t.qcow2.base (file, read-only)
|
||||||
Cache mode: writeback, ignore flushes
|
Cache mode: writeback, ignore flushes
|
||||||
(qemu) q[K[Dqu[K[D[Dqui[K[D[D[Dquit[K
|
(qemu) q[K[Dqu[K[D[Dqui[K[D[D[Dquit[K
|
||||||
|
|
||||||
Testing: -drive file=TEST_DIR/t.qcow2,cache=unsafe,backing.file.filename=TEST_DIR/t.qcow2.base,backing.cache.no-flush=on,backing.cache.writeback=on,backing.node-name=backing,backing.file.node-name=backing-file,file.node-name=file -nodefaults
|
Testing: -drive file=TEST_DIR/t.qcow2,cache=unsafe,backing.file.filename=TEST_DIR/t.qcow2.base,backing.cache.no-flush=on,backing.cache.writeback=on,backing.node-name=backing,backing.file.node-name=backing-file,file.node-name=file,if=none,id=drive0 -nodefaults
|
||||||
QEMU X.Y.Z monitor - type 'help' for more information
|
QEMU X.Y.Z monitor - type 'help' for more information
|
||||||
(qemu) i[K[Din[K[D[Dinf[K[D[D[Dinfo[K[D[D[D[Dinfo [K[D[D[D[D[Dinfo b[K[D[D[D[D[D[Dinfo bl[K[D[D[D[D[D[D[Dinfo blo[K[D[D[D[D[D[D[D[Dinfo bloc[K[D[D[D[D[D[D[D[D[Dinfo block[K
|
(qemu) i[K[Din[K[D[Dinf[K[D[D[Dinfo[K[D[D[D[Dinfo [K[D[D[D[D[Dinfo b[K[D[D[D[D[D[Dinfo bl[K[D[D[D[D[D[D[Dinfo blo[K[D[D[D[D[D[D[D[Dinfo bloc[K[D[D[D[D[D[D[D[D[Dinfo block[K
|
||||||
ide0-hd0 (NODE_NAME): TEST_DIR/t.qcow2 (qcow2)
|
drive0 (NODE_NAME): TEST_DIR/t.qcow2 (qcow2)
|
||||||
|
Removable device: not locked, tray closed
|
||||||
Cache mode: writeback, ignore flushes
|
Cache mode: writeback, ignore flushes
|
||||||
Backing file: TEST_DIR/t.qcow2.base (chain depth: 1)
|
Backing file: TEST_DIR/t.qcow2.base (chain depth: 1)
|
||||||
(qemu) i[K[Din[K[D[Dinf[K[D[D[Dinfo[K[D[D[D[Dinfo [K[D[D[D[D[Dinfo b[K[D[D[D[D[D[Dinfo bl[K[D[D[D[D[D[D[Dinfo blo[K[D[D[D[D[D[D[D[Dinfo bloc[K[D[D[D[D[D[D[D[D[Dinfo block[K[D[D[D[D[D[D[D[D[D[Dinfo block [K[D[D[D[D[D[D[D[D[D[D[Dinfo block f[K[D[D[D[D[D[D[D[D[D[D[D[Dinfo block fi[K[D[D[D[D[D[D[D[D[D[D[D[D[Dinfo block fil[K[D[D[D[D[D[D[D[D[D[D[D[D[D[Dinfo block file[K
|
(qemu) i[K[Din[K[D[Dinf[K[D[D[Dinfo[K[D[D[D[Dinfo [K[D[D[D[D[Dinfo b[K[D[D[D[D[D[Dinfo bl[K[D[D[D[D[D[D[Dinfo blo[K[D[D[D[D[D[D[D[Dinfo bloc[K[D[D[D[D[D[D[D[D[Dinfo block[K[D[D[D[D[D[D[D[D[D[Dinfo block [K[D[D[D[D[D[D[D[D[D[D[Dinfo block f[K[D[D[D[D[D[D[D[D[D[D[D[Dinfo block fi[K[D[D[D[D[D[D[D[D[D[D[D[D[Dinfo block fil[K[D[D[D[D[D[D[D[D[D[D[D[D[D[Dinfo block file[K
|
||||||
|
@ -231,8 +205,8 @@ backing-file: TEST_DIR/t.qcow2.base (file, read-only)
|
||||||
Cache mode: writeback, ignore flushes
|
Cache mode: writeback, ignore flushes
|
||||||
(qemu) q[K[Dqu[K[D[Dqui[K[D[D[Dquit[K
|
(qemu) q[K[Dqu[K[D[Dqui[K[D[D[Dquit[K
|
||||||
|
|
||||||
Testing: -drive file=TEST_DIR/t.qcow2,cache=invalid_value,backing.file.filename=TEST_DIR/t.qcow2.base,backing.cache.no-flush=on,backing.cache.writeback=on,backing.node-name=backing,backing.file.node-name=backing-file,file.node-name=file -nodefaults
|
Testing: -drive file=TEST_DIR/t.qcow2,cache=invalid_value,backing.file.filename=TEST_DIR/t.qcow2.base,backing.cache.no-flush=on,backing.cache.writeback=on,backing.node-name=backing,backing.file.node-name=backing-file,file.node-name=file,if=none,id=drive0 -nodefaults
|
||||||
QEMU_PROG: -drive file=TEST_DIR/t.qcow2,cache=invalid_value,backing.file.filename=TEST_DIR/t.qcow2.base,backing.cache.no-flush=on,backing.cache.writeback=on,backing.node-name=backing,backing.file.node-name=backing-file,file.node-name=file: invalid cache option
|
QEMU_PROG: -drive file=TEST_DIR/t.qcow2,cache=invalid_value,backing.file.filename=TEST_DIR/t.qcow2.base,backing.cache.no-flush=on,backing.cache.writeback=on,backing.node-name=backing,backing.file.node-name=backing-file,file.node-name=file,if=none,id=drive0: invalid cache option
|
||||||
|
|
||||||
|
|
||||||
=== Specifying the protocol layer ===
|
=== Specifying the protocol layer ===
|
||||||
|
|
|
@ -4,17 +4,17 @@ Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134217728 backing_file=TEST_DIR/
|
||||||
|
|
||||||
=== Unknown option ===
|
=== Unknown option ===
|
||||||
|
|
||||||
Testing: -drive file=TEST_DIR/t.qcow2,format=qcow2,unknown_opt=
|
Testing: -drive file=TEST_DIR/t.qcow2,format=qcow2,unknown_opt=,if=none,id=drive0
|
||||||
QEMU_PROG: -drive file=TEST_DIR/t.qcow2,format=qcow2,unknown_opt=: Block format 'qcow2' used by device 'ide0-hd0' doesn't support the option 'unknown_opt'
|
QEMU_PROG: -drive file=TEST_DIR/t.qcow2,format=qcow2,unknown_opt=,if=none,id=drive0: Block format 'qcow2' used by device 'drive0' doesn't support the option 'unknown_opt'
|
||||||
|
|
||||||
Testing: -drive file=TEST_DIR/t.qcow2,format=qcow2,unknown_opt=on
|
Testing: -drive file=TEST_DIR/t.qcow2,format=qcow2,unknown_opt=on,if=none,id=drive0
|
||||||
QEMU_PROG: -drive file=TEST_DIR/t.qcow2,format=qcow2,unknown_opt=on: Block format 'qcow2' used by device 'ide0-hd0' doesn't support the option 'unknown_opt'
|
QEMU_PROG: -drive file=TEST_DIR/t.qcow2,format=qcow2,unknown_opt=on,if=none,id=drive0: Block format 'qcow2' used by device 'drive0' doesn't support the option 'unknown_opt'
|
||||||
|
|
||||||
Testing: -drive file=TEST_DIR/t.qcow2,format=qcow2,unknown_opt=1234
|
Testing: -drive file=TEST_DIR/t.qcow2,format=qcow2,unknown_opt=1234,if=none,id=drive0
|
||||||
QEMU_PROG: -drive file=TEST_DIR/t.qcow2,format=qcow2,unknown_opt=1234: Block format 'qcow2' used by device 'ide0-hd0' doesn't support the option 'unknown_opt'
|
QEMU_PROG: -drive file=TEST_DIR/t.qcow2,format=qcow2,unknown_opt=1234,if=none,id=drive0: Block format 'qcow2' used by device 'drive0' doesn't support the option 'unknown_opt'
|
||||||
|
|
||||||
Testing: -drive file=TEST_DIR/t.qcow2,format=qcow2,unknown_opt=foo
|
Testing: -drive file=TEST_DIR/t.qcow2,format=qcow2,unknown_opt=foo,if=none,id=drive0
|
||||||
QEMU_PROG: -drive file=TEST_DIR/t.qcow2,format=qcow2,unknown_opt=foo: Block format 'qcow2' used by device 'ide0-hd0' doesn't support the option 'unknown_opt'
|
QEMU_PROG: -drive file=TEST_DIR/t.qcow2,format=qcow2,unknown_opt=foo,if=none,id=drive0: Block format 'qcow2' used by device 'drive0' doesn't support the option 'unknown_opt'
|
||||||
|
|
||||||
|
|
||||||
=== Unknown protocol option ===
|
=== Unknown protocol option ===
|
||||||
|
@ -56,10 +56,11 @@ QEMU X.Y.Z monitor - type 'help' for more information
|
||||||
|
|
||||||
=== Overriding backing file ===
|
=== Overriding backing file ===
|
||||||
|
|
||||||
Testing: -drive file=TEST_DIR/t.qcow2,driver=qcow2,backing.file.filename=TEST_DIR/t.qcow2.orig -nodefaults
|
Testing: -drive file=TEST_DIR/t.qcow2,driver=qcow2,backing.file.filename=TEST_DIR/t.qcow2.orig,if=none,id=drive0 -nodefaults
|
||||||
QEMU X.Y.Z monitor - type 'help' for more information
|
QEMU X.Y.Z monitor - type 'help' for more information
|
||||||
(qemu) i[K[Din[K[D[Dinf[K[D[D[Dinfo[K[D[D[D[Dinfo [K[D[D[D[D[Dinfo b[K[D[D[D[D[D[Dinfo bl[K[D[D[D[D[D[D[Dinfo blo[K[D[D[D[D[D[D[D[Dinfo bloc[K[D[D[D[D[D[D[D[D[Dinfo block[K
|
(qemu) i[K[Din[K[D[Dinf[K[D[D[Dinfo[K[D[D[D[Dinfo [K[D[D[D[D[Dinfo b[K[D[D[D[D[D[Dinfo bl[K[D[D[D[D[D[D[Dinfo blo[K[D[D[D[D[D[D[D[Dinfo bloc[K[D[D[D[D[D[D[D[D[Dinfo block[K
|
||||||
ide0-hd0 (NODE_NAME): TEST_DIR/t.qcow2 (qcow2)
|
drive0 (NODE_NAME): TEST_DIR/t.qcow2 (qcow2)
|
||||||
|
Removable device: not locked, tray closed
|
||||||
Cache mode: writeback
|
Cache mode: writeback
|
||||||
Backing file: TEST_DIR/t.qcow2.orig (chain depth: 1)
|
Backing file: TEST_DIR/t.qcow2.orig (chain depth: 1)
|
||||||
(qemu) q[K[Dqu[K[D[Dqui[K[D[D[Dquit[K
|
(qemu) q[K[Dqu[K[D[Dqui[K[D[D[Dquit[K
|
||||||
|
@ -124,14 +125,14 @@ QEMU X.Y.Z monitor - type 'help' for more information
|
||||||
(qemu) QEMU_PROG: Device needs media, but drive is empty
|
(qemu) QEMU_PROG: Device needs media, but drive is empty
|
||||||
QEMU_PROG: Initialization of device ide-hd failed: Device initialization failed.
|
QEMU_PROG: Initialization of device ide-hd failed: Device initialization failed.
|
||||||
|
|
||||||
Testing: -drive if=virtio
|
|
||||||
QEMU X.Y.Z monitor - type 'help' for more information
|
|
||||||
(qemu) QEMU_PROG: -drive if=virtio: Device needs media, but drive is empty
|
|
||||||
|
|
||||||
Testing: -drive if=scsi
|
Testing: -drive if=scsi
|
||||||
QEMU X.Y.Z monitor - type 'help' for more information
|
QEMU X.Y.Z monitor - type 'help' for more information
|
||||||
(qemu) QEMU_PROG: Initialization of device lsi53c895a failed: Device needs media, but drive is empty
|
(qemu) QEMU_PROG: Initialization of device lsi53c895a failed: Device needs media, but drive is empty
|
||||||
|
|
||||||
|
Testing: -drive if=virtio
|
||||||
|
QEMU X.Y.Z monitor - type 'help' for more information
|
||||||
|
(qemu) QEMU_PROG: -drive if=virtio: Device needs media, but drive is empty
|
||||||
|
|
||||||
Testing: -drive if=none,id=disk -device ide-cd,drive=disk
|
Testing: -drive if=none,id=disk -device ide-cd,drive=disk
|
||||||
QEMU X.Y.Z monitor - type 'help' for more information
|
QEMU X.Y.Z monitor - type 'help' for more information
|
||||||
(qemu) q[K[Dqu[K[D[Dqui[K[D[D[Dquit[K
|
(qemu) q[K[Dqu[K[D[Dqui[K[D[D[Dquit[K
|
||||||
|
@ -178,11 +179,11 @@ QEMU X.Y.Z monitor - type 'help' for more information
|
||||||
(qemu) QEMU_PROG: Can't use a read-only drive
|
(qemu) QEMU_PROG: Can't use a read-only drive
|
||||||
QEMU_PROG: Initialization of device ide-hd failed: Device initialization failed.
|
QEMU_PROG: Initialization of device ide-hd failed: Device initialization failed.
|
||||||
|
|
||||||
Testing: -drive file=TEST_DIR/t.qcow2,if=virtio,readonly=on
|
Testing: -drive file=TEST_DIR/t.qcow2,if=scsi,readonly=on
|
||||||
QEMU X.Y.Z monitor - type 'help' for more information
|
QEMU X.Y.Z monitor - type 'help' for more information
|
||||||
(qemu) q[K[Dqu[K[D[Dqui[K[D[D[Dquit[K
|
(qemu) q[K[Dqu[K[D[Dqui[K[D[D[Dquit[K
|
||||||
|
|
||||||
Testing: -drive file=TEST_DIR/t.qcow2,if=scsi,readonly=on
|
Testing: -drive file=TEST_DIR/t.qcow2,if=virtio,readonly=on
|
||||||
QEMU X.Y.Z monitor - type 'help' for more information
|
QEMU X.Y.Z monitor - type 'help' for more information
|
||||||
(qemu) q[K[Dqu[K[D[Dqui[K[D[D[Dquit[K
|
(qemu) q[K[Dqu[K[D[Dqui[K[D[D[Dquit[K
|
||||||
|
|
||||||
|
@ -238,10 +239,11 @@ QEMU X.Y.Z monitor - type 'help' for more information
|
||||||
Testing: -drive driver=null-co,cache=invalid_value
|
Testing: -drive driver=null-co,cache=invalid_value
|
||||||
QEMU_PROG: -drive driver=null-co,cache=invalid_value: invalid cache option
|
QEMU_PROG: -drive driver=null-co,cache=invalid_value: invalid cache option
|
||||||
|
|
||||||
Testing: -drive file=TEST_DIR/t.qcow2,cache=writeback,backing.file.filename=TEST_DIR/t.qcow2.base,backing.cache.no-flush=on,backing.cache.writeback=on,backing.node-name=backing,backing.file.node-name=backing-file,file.node-name=file -nodefaults
|
Testing: -drive file=TEST_DIR/t.qcow2,cache=writeback,backing.file.filename=TEST_DIR/t.qcow2.base,backing.cache.no-flush=on,backing.cache.writeback=on,backing.node-name=backing,backing.file.node-name=backing-file,file.node-name=file,if=none,id=drive0 -nodefaults
|
||||||
QEMU X.Y.Z monitor - type 'help' for more information
|
QEMU X.Y.Z monitor - type 'help' for more information
|
||||||
(qemu) i[K[Din[K[D[Dinf[K[D[D[Dinfo[K[D[D[D[Dinfo [K[D[D[D[D[Dinfo b[K[D[D[D[D[D[Dinfo bl[K[D[D[D[D[D[D[Dinfo blo[K[D[D[D[D[D[D[D[Dinfo bloc[K[D[D[D[D[D[D[D[D[Dinfo block[K
|
(qemu) i[K[Din[K[D[Dinf[K[D[D[Dinfo[K[D[D[D[Dinfo [K[D[D[D[D[Dinfo b[K[D[D[D[D[D[Dinfo bl[K[D[D[D[D[D[D[Dinfo blo[K[D[D[D[D[D[D[D[Dinfo bloc[K[D[D[D[D[D[D[D[D[Dinfo block[K
|
||||||
ide0-hd0 (NODE_NAME): TEST_DIR/t.qcow2 (qcow2)
|
drive0 (NODE_NAME): TEST_DIR/t.qcow2 (qcow2)
|
||||||
|
Removable device: not locked, tray closed
|
||||||
Cache mode: writeback
|
Cache mode: writeback
|
||||||
Backing file: TEST_DIR/t.qcow2.base (chain depth: 1)
|
Backing file: TEST_DIR/t.qcow2.base (chain depth: 1)
|
||||||
(qemu) i[K[Din[K[D[Dinf[K[D[D[Dinfo[K[D[D[D[Dinfo [K[D[D[D[D[Dinfo b[K[D[D[D[D[D[Dinfo bl[K[D[D[D[D[D[D[Dinfo blo[K[D[D[D[D[D[D[D[Dinfo bloc[K[D[D[D[D[D[D[D[D[Dinfo block[K[D[D[D[D[D[D[D[D[D[Dinfo block [K[D[D[D[D[D[D[D[D[D[D[Dinfo block f[K[D[D[D[D[D[D[D[D[D[D[D[Dinfo block fi[K[D[D[D[D[D[D[D[D[D[D[D[D[Dinfo block fil[K[D[D[D[D[D[D[D[D[D[D[D[D[D[Dinfo block file[K
|
(qemu) i[K[Din[K[D[Dinf[K[D[D[Dinfo[K[D[D[D[Dinfo [K[D[D[D[D[Dinfo b[K[D[D[D[D[D[Dinfo bl[K[D[D[D[D[D[D[Dinfo blo[K[D[D[D[D[D[D[D[Dinfo bloc[K[D[D[D[D[D[D[D[D[Dinfo block[K[D[D[D[D[D[D[D[D[D[Dinfo block [K[D[D[D[D[D[D[D[D[D[D[Dinfo block f[K[D[D[D[D[D[D[D[D[D[D[D[Dinfo block fi[K[D[D[D[D[D[D[D[D[D[D[D[D[Dinfo block fil[K[D[D[D[D[D[D[D[D[D[D[D[D[D[Dinfo block file[K
|
||||||
|
@ -257,10 +259,11 @@ backing-file: TEST_DIR/t.qcow2.base (file, read-only)
|
||||||
Cache mode: writeback, ignore flushes
|
Cache mode: writeback, ignore flushes
|
||||||
(qemu) q[K[Dqu[K[D[Dqui[K[D[D[Dquit[K
|
(qemu) q[K[Dqu[K[D[Dqui[K[D[D[Dquit[K
|
||||||
|
|
||||||
Testing: -drive file=TEST_DIR/t.qcow2,cache=writethrough,backing.file.filename=TEST_DIR/t.qcow2.base,backing.cache.no-flush=on,backing.cache.writeback=on,backing.node-name=backing,backing.file.node-name=backing-file,file.node-name=file -nodefaults
|
Testing: -drive file=TEST_DIR/t.qcow2,cache=writethrough,backing.file.filename=TEST_DIR/t.qcow2.base,backing.cache.no-flush=on,backing.cache.writeback=on,backing.node-name=backing,backing.file.node-name=backing-file,file.node-name=file,if=none,id=drive0 -nodefaults
|
||||||
QEMU X.Y.Z monitor - type 'help' for more information
|
QEMU X.Y.Z monitor - type 'help' for more information
|
||||||
(qemu) i[K[Din[K[D[Dinf[K[D[D[Dinfo[K[D[D[D[Dinfo [K[D[D[D[D[Dinfo b[K[D[D[D[D[D[Dinfo bl[K[D[D[D[D[D[D[Dinfo blo[K[D[D[D[D[D[D[D[Dinfo bloc[K[D[D[D[D[D[D[D[D[Dinfo block[K
|
(qemu) i[K[Din[K[D[Dinf[K[D[D[Dinfo[K[D[D[D[Dinfo [K[D[D[D[D[Dinfo b[K[D[D[D[D[D[Dinfo bl[K[D[D[D[D[D[D[Dinfo blo[K[D[D[D[D[D[D[D[Dinfo bloc[K[D[D[D[D[D[D[D[D[Dinfo block[K
|
||||||
ide0-hd0 (NODE_NAME): TEST_DIR/t.qcow2 (qcow2)
|
drive0 (NODE_NAME): TEST_DIR/t.qcow2 (qcow2)
|
||||||
|
Removable device: not locked, tray closed
|
||||||
Cache mode: writethrough
|
Cache mode: writethrough
|
||||||
Backing file: TEST_DIR/t.qcow2.base (chain depth: 1)
|
Backing file: TEST_DIR/t.qcow2.base (chain depth: 1)
|
||||||
(qemu) i[K[Din[K[D[Dinf[K[D[D[Dinfo[K[D[D[D[Dinfo [K[D[D[D[D[Dinfo b[K[D[D[D[D[D[Dinfo bl[K[D[D[D[D[D[D[Dinfo blo[K[D[D[D[D[D[D[D[Dinfo bloc[K[D[D[D[D[D[D[D[D[Dinfo block[K[D[D[D[D[D[D[D[D[D[Dinfo block [K[D[D[D[D[D[D[D[D[D[D[Dinfo block f[K[D[D[D[D[D[D[D[D[D[D[D[Dinfo block fi[K[D[D[D[D[D[D[D[D[D[D[D[D[Dinfo block fil[K[D[D[D[D[D[D[D[D[D[D[D[D[D[Dinfo block file[K
|
(qemu) i[K[Din[K[D[Dinf[K[D[D[Dinfo[K[D[D[D[Dinfo [K[D[D[D[D[Dinfo b[K[D[D[D[D[D[Dinfo bl[K[D[D[D[D[D[D[Dinfo blo[K[D[D[D[D[D[D[D[Dinfo bloc[K[D[D[D[D[D[D[D[D[Dinfo block[K[D[D[D[D[D[D[D[D[D[Dinfo block [K[D[D[D[D[D[D[D[D[D[D[Dinfo block f[K[D[D[D[D[D[D[D[D[D[D[D[Dinfo block fi[K[D[D[D[D[D[D[D[D[D[D[D[D[Dinfo block fil[K[D[D[D[D[D[D[D[D[D[D[D[D[D[Dinfo block file[K
|
||||||
|
@ -276,10 +279,11 @@ backing-file: TEST_DIR/t.qcow2.base (file, read-only)
|
||||||
Cache mode: writeback, ignore flushes
|
Cache mode: writeback, ignore flushes
|
||||||
(qemu) q[K[Dqu[K[D[Dqui[K[D[D[Dquit[K
|
(qemu) q[K[Dqu[K[D[Dqui[K[D[D[Dquit[K
|
||||||
|
|
||||||
Testing: -drive file=TEST_DIR/t.qcow2,cache=unsafe,backing.file.filename=TEST_DIR/t.qcow2.base,backing.cache.no-flush=on,backing.cache.writeback=on,backing.node-name=backing,backing.file.node-name=backing-file,file.node-name=file -nodefaults
|
Testing: -drive file=TEST_DIR/t.qcow2,cache=unsafe,backing.file.filename=TEST_DIR/t.qcow2.base,backing.cache.no-flush=on,backing.cache.writeback=on,backing.node-name=backing,backing.file.node-name=backing-file,file.node-name=file,if=none,id=drive0 -nodefaults
|
||||||
QEMU X.Y.Z monitor - type 'help' for more information
|
QEMU X.Y.Z monitor - type 'help' for more information
|
||||||
(qemu) i[K[Din[K[D[Dinf[K[D[D[Dinfo[K[D[D[D[Dinfo [K[D[D[D[D[Dinfo b[K[D[D[D[D[D[Dinfo bl[K[D[D[D[D[D[D[Dinfo blo[K[D[D[D[D[D[D[D[Dinfo bloc[K[D[D[D[D[D[D[D[D[Dinfo block[K
|
(qemu) i[K[Din[K[D[Dinf[K[D[D[Dinfo[K[D[D[D[Dinfo [K[D[D[D[D[Dinfo b[K[D[D[D[D[D[Dinfo bl[K[D[D[D[D[D[D[Dinfo blo[K[D[D[D[D[D[D[D[Dinfo bloc[K[D[D[D[D[D[D[D[D[Dinfo block[K
|
||||||
ide0-hd0 (NODE_NAME): TEST_DIR/t.qcow2 (qcow2)
|
drive0 (NODE_NAME): TEST_DIR/t.qcow2 (qcow2)
|
||||||
|
Removable device: not locked, tray closed
|
||||||
Cache mode: writeback, ignore flushes
|
Cache mode: writeback, ignore flushes
|
||||||
Backing file: TEST_DIR/t.qcow2.base (chain depth: 1)
|
Backing file: TEST_DIR/t.qcow2.base (chain depth: 1)
|
||||||
(qemu) i[K[Din[K[D[Dinf[K[D[D[Dinfo[K[D[D[D[Dinfo [K[D[D[D[D[Dinfo b[K[D[D[D[D[D[Dinfo bl[K[D[D[D[D[D[D[Dinfo blo[K[D[D[D[D[D[D[D[Dinfo bloc[K[D[D[D[D[D[D[D[D[Dinfo block[K[D[D[D[D[D[D[D[D[D[Dinfo block [K[D[D[D[D[D[D[D[D[D[D[Dinfo block f[K[D[D[D[D[D[D[D[D[D[D[D[Dinfo block fi[K[D[D[D[D[D[D[D[D[D[D[D[D[Dinfo block fil[K[D[D[D[D[D[D[D[D[D[D[D[D[D[Dinfo block file[K
|
(qemu) i[K[Din[K[D[Dinf[K[D[D[Dinfo[K[D[D[D[Dinfo [K[D[D[D[D[Dinfo b[K[D[D[D[D[D[Dinfo bl[K[D[D[D[D[D[D[Dinfo blo[K[D[D[D[D[D[D[D[Dinfo bloc[K[D[D[D[D[D[D[D[D[Dinfo block[K[D[D[D[D[D[D[D[D[D[Dinfo block [K[D[D[D[D[D[D[D[D[D[D[Dinfo block f[K[D[D[D[D[D[D[D[D[D[D[D[Dinfo block fi[K[D[D[D[D[D[D[D[D[D[D[D[D[Dinfo block fil[K[D[D[D[D[D[D[D[D[D[D[D[D[D[Dinfo block file[K
|
||||||
|
@ -295,8 +299,8 @@ backing-file: TEST_DIR/t.qcow2.base (file, read-only)
|
||||||
Cache mode: writeback, ignore flushes
|
Cache mode: writeback, ignore flushes
|
||||||
(qemu) q[K[Dqu[K[D[Dqui[K[D[D[Dquit[K
|
(qemu) q[K[Dqu[K[D[Dqui[K[D[D[Dquit[K
|
||||||
|
|
||||||
Testing: -drive file=TEST_DIR/t.qcow2,cache=invalid_value,backing.file.filename=TEST_DIR/t.qcow2.base,backing.cache.no-flush=on,backing.cache.writeback=on,backing.node-name=backing,backing.file.node-name=backing-file,file.node-name=file -nodefaults
|
Testing: -drive file=TEST_DIR/t.qcow2,cache=invalid_value,backing.file.filename=TEST_DIR/t.qcow2.base,backing.cache.no-flush=on,backing.cache.writeback=on,backing.node-name=backing,backing.file.node-name=backing-file,file.node-name=file,if=none,id=drive0 -nodefaults
|
||||||
QEMU_PROG: -drive file=TEST_DIR/t.qcow2,cache=invalid_value,backing.file.filename=TEST_DIR/t.qcow2.base,backing.cache.no-flush=on,backing.cache.writeback=on,backing.node-name=backing,backing.file.node-name=backing-file,file.node-name=file: invalid cache option
|
QEMU_PROG: -drive file=TEST_DIR/t.qcow2,cache=invalid_value,backing.file.filename=TEST_DIR/t.qcow2.base,backing.cache.no-flush=on,backing.cache.writeback=on,backing.node-name=backing,backing.file.node-name=backing-file,file.node-name=file,if=none,id=drive0: invalid cache option
|
||||||
|
|
||||||
|
|
||||||
=== Specifying the protocol layer ===
|
=== Specifying the protocol layer ===
|
||||||
|
|
|
@ -38,7 +38,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15
|
||||||
. ./common.rc
|
. ./common.rc
|
||||||
. ./common.filter
|
. ./common.filter
|
||||||
|
|
||||||
_supported_fmt qcow2
|
_supported_fmt qcow2 raw
|
||||||
_supported_proto file nfs
|
_supported_proto file nfs
|
||||||
_supported_os Linux
|
_supported_os Linux
|
||||||
|
|
||||||
|
|
|
@ -50,17 +50,15 @@ _supported_os Linux
|
||||||
size_smaller=5M
|
size_smaller=5M
|
||||||
size_larger=100M
|
size_larger=100M
|
||||||
|
|
||||||
_make_test_img $size_smaller
|
TEST_IMG="$TEST_IMG.base" _make_test_img $size_smaller
|
||||||
mv "${TEST_IMG}" "${TEST_IMG}.base"
|
|
||||||
|
|
||||||
_make_test_img -b "${TEST_IMG}.base" $size_larger
|
TEST_IMG="$TEST_IMG.snp1" _make_test_img -b "$TEST_IMG.base" $size_larger
|
||||||
mv "${TEST_IMG}" "${TEST_IMG}.snp1"
|
|
||||||
|
|
||||||
_make_test_img -b "${TEST_IMG}.snp1" $size_larger
|
_make_test_img -b "${TEST_IMG}.snp1" $size_larger
|
||||||
|
|
||||||
echo
|
echo
|
||||||
echo "=== Base image info before commit and resize ==="
|
echo "=== Base image info before commit and resize ==="
|
||||||
TEST_IMG="${TEST_IMG}.base" _img_info
|
TEST_IMG="${TEST_IMG}.base" _img_info | _filter_img_info
|
||||||
|
|
||||||
echo
|
echo
|
||||||
echo === Running QEMU Live Commit Test ===
|
echo === Running QEMU Live Commit Test ===
|
||||||
|
@ -78,7 +76,7 @@ _send_qemu_cmd $h "{ 'execute': 'block-commit',
|
||||||
|
|
||||||
echo
|
echo
|
||||||
echo "=== Base image info after commit and resize ==="
|
echo "=== Base image info after commit and resize ==="
|
||||||
TEST_IMG="${TEST_IMG}.base" _img_info
|
TEST_IMG="${TEST_IMG}.base" _img_info | _filter_img_info
|
||||||
|
|
||||||
# success, all done
|
# success, all done
|
||||||
echo "*** done"
|
echo "*** done"
|
||||||
|
|
|
@ -1,13 +1,12 @@
|
||||||
QA output created by 095
|
QA output created by 095
|
||||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=5242880
|
Formatting 'TEST_DIR/t.IMGFMT.base', fmt=IMGFMT size=5242880
|
||||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=104857600 backing_file=TEST_DIR/t.IMGFMT.base
|
Formatting 'TEST_DIR/t.IMGFMT.snp1', fmt=IMGFMT size=104857600 backing_file=TEST_DIR/t.IMGFMT.base
|
||||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=104857600 backing_file=TEST_DIR/t.IMGFMT.snp1
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=104857600 backing_file=TEST_DIR/t.IMGFMT.snp1
|
||||||
|
|
||||||
=== Base image info before commit and resize ===
|
=== Base image info before commit and resize ===
|
||||||
image: TEST_DIR/t.IMGFMT.base
|
image: TEST_DIR/t.IMGFMT.base
|
||||||
file format: IMGFMT
|
file format: IMGFMT
|
||||||
virtual size: 5.0M (5242880 bytes)
|
virtual size: 5.0M (5242880 bytes)
|
||||||
cluster_size: 65536
|
|
||||||
|
|
||||||
=== Running QEMU Live Commit Test ===
|
=== Running QEMU Live Commit Test ===
|
||||||
|
|
||||||
|
@ -19,5 +18,4 @@ cluster_size: 65536
|
||||||
image: TEST_DIR/t.IMGFMT.base
|
image: TEST_DIR/t.IMGFMT.base
|
||||||
file format: IMGFMT
|
file format: IMGFMT
|
||||||
virtual size: 100M (104857600 bytes)
|
virtual size: 100M (104857600 bytes)
|
||||||
cluster_size: 65536
|
|
||||||
*** done
|
*** done
|
||||||
|
|
Loading…
Reference in New Issue