mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-08 18:23:57 -06:00
Block layer patches
- Optimise reqs_lock to make multiqueue actually scale - virtio: Drop out of coroutine context in virtio_load() - iotests: Fix reference output for some tests after recent changes - vpc: Avoid dynamic stack allocation - Code cleanup, improved documentation -----BEGIN PGP SIGNATURE----- iQJFBAABCAAvFiEE3D3rFZqa+V09dFb+fwmycsiPL9YFAmT7VYgRHGt3b2xmQHJl ZGhhdC5jb20ACgkQfwmycsiPL9YfOg/7BoYF6lkB7DF/jH3XLY6f8zoI+OVM7dg1 QFEjyVO+uZiJVh0CeBNI9WgnBe7f5vXMbiStyGbWKo3BLUsjnwoQcW/Sxpw61bR2 jZYK6UHe0RhFqTQpbt8G1iCmlpRS+sX+Cy+lxcVcbqxcnLRXCOjT6ivyA4bGbYIC q9BHg/9hBmjuM05NTV6Axy8qjqBGVaIWE9ALTnw8H//waBr4/ydJPTl7EWHe3+tO Stm73evgPG7aLHM6W4qdFW4gwAQ8f+f42Q+0NH1YavB/pN3LTN1B6sLQY/51du+0 d/JCsXex0IZQXmNPhqv1h01vhOyU9WBmlwpPG2iZv3a06SXk1ys3rQt/L7uIcsZg Z58CpcUJ517FERnkl0BWXzYhsdcW2K+RdlaiL5PX6H1A2B9LT05ouZfD47hh7kKv oX+Ulk05PFr3JRCKQF6QDEejRKXt169bGzInTlns/wXinD/V4sCkUnr9aWQuhoWk KhQm7WMscTTIyHP2FznO4x9kq0ALsoX/NKqBW2wgJUtqRzsd4XxPp5CXEsAir8Vt dpne/DaV5iDI1mGFJrvkctJN545tEoezBtUzC8/9rZGE0cxHAkhvQVZUDo7xVmrq PlGQ1ko9cNui/Gf9B6qDqaJJwSyw0S6vHurGVQJRwbyly57Fi5aisWkr4w7Rc4eA 7u9B1RvwF/Q= =2wGD -----END PGP SIGNATURE----- Merge tag 'for-upstream' of https://repo.or.cz/qemu/kevin into staging Block layer patches - Optimise reqs_lock to make multiqueue actually scale - virtio: Drop out of coroutine context in virtio_load() - iotests: Fix reference output for some tests after recent changes - vpc: Avoid dynamic stack allocation - Code cleanup, improved documentation # -----BEGIN PGP SIGNATURE----- # # iQJFBAABCAAvFiEE3D3rFZqa+V09dFb+fwmycsiPL9YFAmT7VYgRHGt3b2xmQHJl # ZGhhdC5jb20ACgkQfwmycsiPL9YfOg/7BoYF6lkB7DF/jH3XLY6f8zoI+OVM7dg1 # QFEjyVO+uZiJVh0CeBNI9WgnBe7f5vXMbiStyGbWKo3BLUsjnwoQcW/Sxpw61bR2 # jZYK6UHe0RhFqTQpbt8G1iCmlpRS+sX+Cy+lxcVcbqxcnLRXCOjT6ivyA4bGbYIC # q9BHg/9hBmjuM05NTV6Axy8qjqBGVaIWE9ALTnw8H//waBr4/ydJPTl7EWHe3+tO # Stm73evgPG7aLHM6W4qdFW4gwAQ8f+f42Q+0NH1YavB/pN3LTN1B6sLQY/51du+0 # d/JCsXex0IZQXmNPhqv1h01vhOyU9WBmlwpPG2iZv3a06SXk1ys3rQt/L7uIcsZg # Z58CpcUJ517FERnkl0BWXzYhsdcW2K+RdlaiL5PX6H1A2B9LT05ouZfD47hh7kKv # oX+Ulk05PFr3JRCKQF6QDEejRKXt169bGzInTlns/wXinD/V4sCkUnr9aWQuhoWk # KhQm7WMscTTIyHP2FznO4x9kq0ALsoX/NKqBW2wgJUtqRzsd4XxPp5CXEsAir8Vt # dpne/DaV5iDI1mGFJrvkctJN545tEoezBtUzC8/9rZGE0cxHAkhvQVZUDo7xVmrq # PlGQ1ko9cNui/Gf9B6qDqaJJwSyw0S6vHurGVQJRwbyly57Fi5aisWkr4w7Rc4eA # 7u9B1RvwF/Q= # =2wGD # -----END PGP SIGNATURE----- # gpg: Signature made Fri 08 Sep 2023 13:10:32 EDT # gpg: using RSA key DC3DEB159A9AF95D3D7456FE7F09B272C88F2FD6 # gpg: issuer "kwolf@redhat.com" # gpg: Good signature from "Kevin Wolf <kwolf@redhat.com>" [full] # Primary key fingerprint: DC3D EB15 9A9A F95D 3D74 56FE 7F09 B272 C88F 2FD6 * tag 'for-upstream' of https://repo.or.cz/qemu/kevin: virtio: Drop out of coroutine context in virtio_load() vmstate: Mark VMStateInfo.get/put() coroutine_mixed_fn block: Make more BlockDriver definitions static block/meson.build: Restore alphabetical order of files block: Remove unnecessary variable in bdrv_block_device_info block: Remove bdrv_query_block_node_info vmdk: Clean up bdrv_open_child() return value check qemu-img: Update documentation for compressed images block: Be more verbose in create fallback block/iscsi: Document why we use raw malloc() qemu-img: omit errno value in error message block: change reqs_lock to QemuMutex block: minimize bs->reqs_lock section in tracked_request_end() iotests: adapt test output for new qemu_cleanup() behavior block/vpc: Avoid dynamic stack allocation Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
commit
78f8b6d9c8
22 changed files with 142 additions and 80 deletions
10
block.c
10
block.c
|
@ -415,7 +415,7 @@ BlockDriverState *bdrv_new(void)
|
||||||
for (i = 0; i < BLOCK_OP_TYPE_MAX; i++) {
|
for (i = 0; i < BLOCK_OP_TYPE_MAX; i++) {
|
||||||
QLIST_INIT(&bs->op_blockers[i]);
|
QLIST_INIT(&bs->op_blockers[i]);
|
||||||
}
|
}
|
||||||
qemu_co_mutex_init(&bs->reqs_lock);
|
qemu_mutex_init(&bs->reqs_lock);
|
||||||
qemu_mutex_init(&bs->dirty_bitmap_mutex);
|
qemu_mutex_init(&bs->dirty_bitmap_mutex);
|
||||||
bs->refcnt = 1;
|
bs->refcnt = 1;
|
||||||
bs->aio_context = qemu_get_aio_context();
|
bs->aio_context = qemu_get_aio_context();
|
||||||
|
@ -661,8 +661,10 @@ int coroutine_fn bdrv_co_create_opts_simple(BlockDriver *drv,
|
||||||
blk = blk_co_new_open(filename, NULL, options,
|
blk = blk_co_new_open(filename, NULL, options,
|
||||||
BDRV_O_RDWR | BDRV_O_RESIZE, errp);
|
BDRV_O_RDWR | BDRV_O_RESIZE, errp);
|
||||||
if (!blk) {
|
if (!blk) {
|
||||||
error_prepend(errp, "Protocol driver '%s' does not support image "
|
error_prepend(errp, "Protocol driver '%s' does not support creating "
|
||||||
"creation, and opening the image failed: ",
|
"new images, so an existing image must be selected as "
|
||||||
|
"the target; however, opening the given target as an "
|
||||||
|
"existing image failed: ",
|
||||||
drv->format_name);
|
drv->format_name);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
@ -5476,6 +5478,8 @@ static void bdrv_delete(BlockDriverState *bs)
|
||||||
|
|
||||||
bdrv_close(bs);
|
bdrv_close(bs);
|
||||||
|
|
||||||
|
qemu_mutex_destroy(&bs->reqs_lock);
|
||||||
|
|
||||||
g_free(bs);
|
g_free(bs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -503,7 +503,7 @@ static void cbw_close(BlockDriverState *bs)
|
||||||
s->bcs = NULL;
|
s->bcs = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
BlockDriver bdrv_cbw_filter = {
|
static BlockDriver bdrv_cbw_filter = {
|
||||||
.format_name = "copy-before-write",
|
.format_name = "copy-before-write",
|
||||||
.instance_size = sizeof(BDRVCopyBeforeWriteState),
|
.instance_size = sizeof(BDRVCopyBeforeWriteState),
|
||||||
|
|
||||||
|
|
30
block/io.c
30
block/io.c
|
@ -591,10 +591,16 @@ static void coroutine_fn tracked_request_end(BdrvTrackedRequest *req)
|
||||||
qatomic_dec(&req->bs->serialising_in_flight);
|
qatomic_dec(&req->bs->serialising_in_flight);
|
||||||
}
|
}
|
||||||
|
|
||||||
qemu_co_mutex_lock(&req->bs->reqs_lock);
|
qemu_mutex_lock(&req->bs->reqs_lock);
|
||||||
QLIST_REMOVE(req, list);
|
QLIST_REMOVE(req, list);
|
||||||
|
qemu_mutex_unlock(&req->bs->reqs_lock);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* At this point qemu_co_queue_wait(&req->wait_queue, ...) won't be called
|
||||||
|
* anymore because the request has been removed from the list, so it's safe
|
||||||
|
* to restart the queue outside reqs_lock to minimize the critical section.
|
||||||
|
*/
|
||||||
qemu_co_queue_restart_all(&req->wait_queue);
|
qemu_co_queue_restart_all(&req->wait_queue);
|
||||||
qemu_co_mutex_unlock(&req->bs->reqs_lock);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -621,9 +627,9 @@ static void coroutine_fn tracked_request_begin(BdrvTrackedRequest *req,
|
||||||
|
|
||||||
qemu_co_queue_init(&req->wait_queue);
|
qemu_co_queue_init(&req->wait_queue);
|
||||||
|
|
||||||
qemu_co_mutex_lock(&bs->reqs_lock);
|
qemu_mutex_lock(&bs->reqs_lock);
|
||||||
QLIST_INSERT_HEAD(&bs->tracked_requests, req, list);
|
QLIST_INSERT_HEAD(&bs->tracked_requests, req, list);
|
||||||
qemu_co_mutex_unlock(&bs->reqs_lock);
|
qemu_mutex_unlock(&bs->reqs_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool tracked_request_overlaps(BdrvTrackedRequest *req,
|
static bool tracked_request_overlaps(BdrvTrackedRequest *req,
|
||||||
|
@ -787,9 +793,9 @@ bdrv_wait_serialising_requests(BdrvTrackedRequest *self)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
qemu_co_mutex_lock(&bs->reqs_lock);
|
qemu_mutex_lock(&bs->reqs_lock);
|
||||||
bdrv_wait_serialising_requests_locked(self);
|
bdrv_wait_serialising_requests_locked(self);
|
||||||
qemu_co_mutex_unlock(&bs->reqs_lock);
|
qemu_mutex_unlock(&bs->reqs_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
void coroutine_fn bdrv_make_request_serialising(BdrvTrackedRequest *req,
|
void coroutine_fn bdrv_make_request_serialising(BdrvTrackedRequest *req,
|
||||||
|
@ -797,12 +803,12 @@ void coroutine_fn bdrv_make_request_serialising(BdrvTrackedRequest *req,
|
||||||
{
|
{
|
||||||
IO_CODE();
|
IO_CODE();
|
||||||
|
|
||||||
qemu_co_mutex_lock(&req->bs->reqs_lock);
|
qemu_mutex_lock(&req->bs->reqs_lock);
|
||||||
|
|
||||||
tracked_request_set_serialising(req, align);
|
tracked_request_set_serialising(req, align);
|
||||||
bdrv_wait_serialising_requests_locked(req);
|
bdrv_wait_serialising_requests_locked(req);
|
||||||
|
|
||||||
qemu_co_mutex_unlock(&req->bs->reqs_lock);
|
qemu_mutex_unlock(&req->bs->reqs_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
int bdrv_check_qiov_request(int64_t offset, int64_t bytes,
|
int bdrv_check_qiov_request(int64_t offset, int64_t bytes,
|
||||||
|
@ -2996,7 +3002,7 @@ int coroutine_fn bdrv_co_flush(BlockDriverState *bs)
|
||||||
goto early_exit;
|
goto early_exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
qemu_co_mutex_lock(&bs->reqs_lock);
|
qemu_mutex_lock(&bs->reqs_lock);
|
||||||
current_gen = qatomic_read(&bs->write_gen);
|
current_gen = qatomic_read(&bs->write_gen);
|
||||||
|
|
||||||
/* Wait until any previous flushes are completed */
|
/* Wait until any previous flushes are completed */
|
||||||
|
@ -3006,7 +3012,7 @@ int coroutine_fn bdrv_co_flush(BlockDriverState *bs)
|
||||||
|
|
||||||
/* Flushes reach this point in nondecreasing current_gen order. */
|
/* Flushes reach this point in nondecreasing current_gen order. */
|
||||||
bs->active_flush_req = true;
|
bs->active_flush_req = true;
|
||||||
qemu_co_mutex_unlock(&bs->reqs_lock);
|
qemu_mutex_unlock(&bs->reqs_lock);
|
||||||
|
|
||||||
/* Write back all layers by calling one driver function */
|
/* Write back all layers by calling one driver function */
|
||||||
if (bs->drv->bdrv_co_flush) {
|
if (bs->drv->bdrv_co_flush) {
|
||||||
|
@ -3094,11 +3100,11 @@ out:
|
||||||
bs->flushed_gen = current_gen;
|
bs->flushed_gen = current_gen;
|
||||||
}
|
}
|
||||||
|
|
||||||
qemu_co_mutex_lock(&bs->reqs_lock);
|
qemu_mutex_lock(&bs->reqs_lock);
|
||||||
bs->active_flush_req = false;
|
bs->active_flush_req = false;
|
||||||
/* Return value is ignored - it's ok if wait queue is empty */
|
/* Return value is ignored - it's ok if wait queue is empty */
|
||||||
qemu_co_queue_next(&bs->flush_queue);
|
qemu_co_queue_next(&bs->flush_queue);
|
||||||
qemu_co_mutex_unlock(&bs->reqs_lock);
|
qemu_mutex_unlock(&bs->reqs_lock);
|
||||||
|
|
||||||
early_exit:
|
early_exit:
|
||||||
bdrv_dec_in_flight(bs);
|
bdrv_dec_in_flight(bs);
|
||||||
|
|
|
@ -1058,6 +1058,7 @@ static BlockAIOCB *iscsi_aio_ioctl(BlockDriverState *bs,
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Must use malloc(): this is freed via scsi_free_scsi_task() */
|
||||||
acb->task = malloc(sizeof(struct scsi_task));
|
acb->task = malloc(sizeof(struct scsi_task));
|
||||||
if (acb->task == NULL) {
|
if (acb->task == NULL) {
|
||||||
error_report("iSCSI: Failed to allocate task for scsi command. %s",
|
error_report("iSCSI: Failed to allocate task for scsi command. %s",
|
||||||
|
|
|
@ -4,41 +4,41 @@ block_ss.add(files(
|
||||||
'aio_task.c',
|
'aio_task.c',
|
||||||
'amend.c',
|
'amend.c',
|
||||||
'backup.c',
|
'backup.c',
|
||||||
'copy-before-write.c',
|
|
||||||
'blkdebug.c',
|
'blkdebug.c',
|
||||||
'blklogwrites.c',
|
'blklogwrites.c',
|
||||||
'blkverify.c',
|
'blkverify.c',
|
||||||
'block-backend.c',
|
'block-backend.c',
|
||||||
'block-copy.c',
|
'block-copy.c',
|
||||||
'graph-lock.c',
|
|
||||||
'commit.c',
|
'commit.c',
|
||||||
|
'copy-before-write.c',
|
||||||
'copy-on-read.c',
|
'copy-on-read.c',
|
||||||
'preallocate.c',
|
|
||||||
'progress_meter.c',
|
|
||||||
'create.c',
|
'create.c',
|
||||||
'crypto.c',
|
'crypto.c',
|
||||||
'dirty-bitmap.c',
|
'dirty-bitmap.c',
|
||||||
'filter-compress.c',
|
'filter-compress.c',
|
||||||
|
'graph-lock.c',
|
||||||
'io.c',
|
'io.c',
|
||||||
'mirror.c',
|
'mirror.c',
|
||||||
'nbd.c',
|
'nbd.c',
|
||||||
'null.c',
|
'null.c',
|
||||||
'plug.c',
|
'plug.c',
|
||||||
|
'preallocate.c',
|
||||||
|
'progress_meter.c',
|
||||||
'qapi.c',
|
'qapi.c',
|
||||||
|
'qcow2.c',
|
||||||
'qcow2-bitmap.c',
|
'qcow2-bitmap.c',
|
||||||
'qcow2-cache.c',
|
'qcow2-cache.c',
|
||||||
'qcow2-cluster.c',
|
'qcow2-cluster.c',
|
||||||
'qcow2-refcount.c',
|
'qcow2-refcount.c',
|
||||||
'qcow2-snapshot.c',
|
'qcow2-snapshot.c',
|
||||||
'qcow2-threads.c',
|
'qcow2-threads.c',
|
||||||
'qcow2.c',
|
|
||||||
'quorum.c',
|
'quorum.c',
|
||||||
'raw-format.c',
|
'raw-format.c',
|
||||||
'reqlist.c',
|
'reqlist.c',
|
||||||
'snapshot.c',
|
'snapshot.c',
|
||||||
'snapshot-access.c',
|
'snapshot-access.c',
|
||||||
'throttle-groups.c',
|
|
||||||
'throttle.c',
|
'throttle.c',
|
||||||
|
'throttle-groups.c',
|
||||||
'write-threshold.c',
|
'write-threshold.c',
|
||||||
), zstd, zlib, gnutls)
|
), zstd, zlib, gnutls)
|
||||||
|
|
||||||
|
|
|
@ -535,7 +535,7 @@ static void preallocate_child_perm(BlockDriverState *bs, BdrvChild *c,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
BlockDriver bdrv_preallocate_filter = {
|
static BlockDriver bdrv_preallocate_filter = {
|
||||||
.format_name = "preallocate",
|
.format_name = "preallocate",
|
||||||
.instance_size = sizeof(BDRVPreallocateState),
|
.instance_size = sizeof(BDRVPreallocateState),
|
||||||
|
|
||||||
|
|
32
block/qapi.c
32
block/qapi.c
|
@ -48,7 +48,7 @@ BlockDeviceInfo *bdrv_block_device_info(BlockBackend *blk,
|
||||||
{
|
{
|
||||||
ImageInfo **p_image_info;
|
ImageInfo **p_image_info;
|
||||||
ImageInfo *backing_info;
|
ImageInfo *backing_info;
|
||||||
BlockDriverState *bs0, *backing;
|
BlockDriverState *backing;
|
||||||
BlockDeviceInfo *info;
|
BlockDeviceInfo *info;
|
||||||
ERRP_GUARD();
|
ERRP_GUARD();
|
||||||
|
|
||||||
|
@ -145,7 +145,6 @@ BlockDeviceInfo *bdrv_block_device_info(BlockBackend *blk,
|
||||||
|
|
||||||
info->write_threshold = bdrv_write_threshold_get(bs);
|
info->write_threshold = bdrv_write_threshold_get(bs);
|
||||||
|
|
||||||
bs0 = bs;
|
|
||||||
p_image_info = &info->image;
|
p_image_info = &info->image;
|
||||||
info->backing_file_depth = 0;
|
info->backing_file_depth = 0;
|
||||||
|
|
||||||
|
@ -153,7 +152,7 @@ BlockDeviceInfo *bdrv_block_device_info(BlockBackend *blk,
|
||||||
* Skip automatically inserted nodes that the user isn't aware of for
|
* Skip automatically inserted nodes that the user isn't aware of for
|
||||||
* query-block (blk != NULL), but not for query-named-block-nodes
|
* query-block (blk != NULL), but not for query-named-block-nodes
|
||||||
*/
|
*/
|
||||||
bdrv_query_image_info(bs0, p_image_info, flat, blk != NULL, errp);
|
bdrv_query_image_info(bs, p_image_info, flat, blk != NULL, errp);
|
||||||
if (*errp) {
|
if (*errp) {
|
||||||
qapi_free_BlockDeviceInfo(info);
|
qapi_free_BlockDeviceInfo(info);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -309,33 +308,6 @@ out:
|
||||||
aio_context_release(bdrv_get_aio_context(bs));
|
aio_context_release(bdrv_get_aio_context(bs));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* bdrv_query_block_node_info:
|
|
||||||
* @bs: block node to examine
|
|
||||||
* @p_info: location to store node information
|
|
||||||
* @errp: location to store error information
|
|
||||||
*
|
|
||||||
* Store image information about @bs in @p_info.
|
|
||||||
*
|
|
||||||
* @p_info will be set only on success. On error, store error in @errp.
|
|
||||||
*/
|
|
||||||
void bdrv_query_block_node_info(BlockDriverState *bs,
|
|
||||||
BlockNodeInfo **p_info,
|
|
||||||
Error **errp)
|
|
||||||
{
|
|
||||||
BlockNodeInfo *info;
|
|
||||||
ERRP_GUARD();
|
|
||||||
|
|
||||||
info = g_new0(BlockNodeInfo, 1);
|
|
||||||
bdrv_do_query_node_info(bs, info, errp);
|
|
||||||
if (*errp) {
|
|
||||||
qapi_free_BlockNodeInfo(info);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
*p_info = info;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* bdrv_query_image_info:
|
* bdrv_query_image_info:
|
||||||
* @bs: block node to examine
|
* @bs: block node to examine
|
||||||
|
|
|
@ -108,7 +108,7 @@ static void snapshot_access_child_perm(BlockDriverState *bs, BdrvChild *c,
|
||||||
*nshared = BLK_PERM_ALL;
|
*nshared = BLK_PERM_ALL;
|
||||||
}
|
}
|
||||||
|
|
||||||
BlockDriver bdrv_snapshot_access_drv = {
|
static BlockDriver bdrv_snapshot_access_drv = {
|
||||||
.format_name = "snapshot-access",
|
.format_name = "snapshot-access",
|
||||||
|
|
||||||
.bdrv_open = snapshot_access_open,
|
.bdrv_open = snapshot_access_open,
|
||||||
|
|
|
@ -1207,7 +1207,7 @@ static int vmdk_parse_extents(const char *desc, BlockDriverState *bs,
|
||||||
bs, &child_of_bds, extent_role, false,
|
bs, &child_of_bds, extent_role, false,
|
||||||
&local_err);
|
&local_err);
|
||||||
g_free(extent_path);
|
g_free(extent_path);
|
||||||
if (local_err) {
|
if (!extent_file) {
|
||||||
error_propagate(errp, local_err);
|
error_propagate(errp, local_err);
|
||||||
ret = -EINVAL;
|
ret = -EINVAL;
|
||||||
goto out;
|
goto out;
|
||||||
|
|
|
@ -510,7 +510,7 @@ get_image_offset(BlockDriverState *bs, uint64_t offset, bool write, int *err)
|
||||||
miss sparse read optimization, but it's not a problem in terms of
|
miss sparse read optimization, but it's not a problem in terms of
|
||||||
correctness. */
|
correctness. */
|
||||||
if (write && (s->last_bitmap_offset != bitmap_offset)) {
|
if (write && (s->last_bitmap_offset != bitmap_offset)) {
|
||||||
uint8_t bitmap[s->bitmap_size];
|
g_autofree uint8_t *bitmap = g_malloc(s->bitmap_size);
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
s->last_bitmap_offset = bitmap_offset;
|
s->last_bitmap_offset = bitmap_offset;
|
||||||
|
@ -558,7 +558,7 @@ alloc_block(BlockDriverState *bs, int64_t offset)
|
||||||
int64_t bat_offset;
|
int64_t bat_offset;
|
||||||
uint32_t index, bat_value;
|
uint32_t index, bat_value;
|
||||||
int ret;
|
int ret;
|
||||||
uint8_t bitmap[s->bitmap_size];
|
g_autofree uint8_t *bitmap = g_malloc(s->bitmap_size);
|
||||||
|
|
||||||
/* Check if sector_num is valid */
|
/* Check if sector_num is valid */
|
||||||
if ((offset < 0) || (offset > bs->total_sectors * BDRV_SECTOR_SIZE)) {
|
if ((offset < 0) || (offset > bs->total_sectors * BDRV_SECTOR_SIZE)) {
|
||||||
|
|
|
@ -106,7 +106,11 @@ by the used format or see the format descriptions below for details.
|
||||||
|
|
||||||
.. option:: -c
|
.. option:: -c
|
||||||
|
|
||||||
Indicates that target image must be compressed (qcow format only).
|
Indicates that target image must be compressed (qcow/qcow2 and vmdk with
|
||||||
|
streamOptimized subformat only).
|
||||||
|
|
||||||
|
For qcow2, the compression algorithm can be specified with the ``-o
|
||||||
|
compression_type=...`` option (see below).
|
||||||
|
|
||||||
.. option:: -h
|
.. option:: -h
|
||||||
|
|
||||||
|
@ -776,7 +780,7 @@ Supported image file formats:
|
||||||
|
|
||||||
QEMU image format, the most versatile format. Use it to have smaller
|
QEMU image format, the most versatile format. Use it to have smaller
|
||||||
images (useful if your filesystem does not supports holes, for example
|
images (useful if your filesystem does not supports holes, for example
|
||||||
on Windows), optional AES encryption, zlib based compression and
|
on Windows), optional AES encryption, zlib or zstd based compression and
|
||||||
support of multiple VM snapshots.
|
support of multiple VM snapshots.
|
||||||
|
|
||||||
Supported options:
|
Supported options:
|
||||||
|
@ -794,6 +798,17 @@ Supported image file formats:
|
||||||
``backing_fmt``
|
``backing_fmt``
|
||||||
Image format of the base image
|
Image format of the base image
|
||||||
|
|
||||||
|
``compression_type``
|
||||||
|
This option configures which compression algorithm will be used for
|
||||||
|
compressed clusters on the image. Note that setting this option doesn't yet
|
||||||
|
cause the image to actually receive compressed writes. It is most commonly
|
||||||
|
used with the ``-c`` option of ``qemu-img convert``, but can also be used
|
||||||
|
with the ``compress`` filter driver or backup block jobs with compression
|
||||||
|
enabled.
|
||||||
|
|
||||||
|
Valid values are ``zlib`` and ``zstd``. For images that use
|
||||||
|
``compat=0.10``, only ``zlib`` compression is available.
|
||||||
|
|
||||||
``encryption``
|
``encryption``
|
||||||
If this option is set to ``on``, the image is encrypted with
|
If this option is set to ``on``, the image is encrypted with
|
||||||
128-bit AES-CBC.
|
128-bit AES-CBC.
|
||||||
|
|
|
@ -2825,7 +2825,8 @@ static int virtio_device_put(QEMUFile *f, void *opaque, size_t size,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* A wrapper for use as a VMState .get function */
|
/* A wrapper for use as a VMState .get function */
|
||||||
static int virtio_device_get(QEMUFile *f, void *opaque, size_t size,
|
static int coroutine_mixed_fn
|
||||||
|
virtio_device_get(QEMUFile *f, void *opaque, size_t size,
|
||||||
const VMStateField *field)
|
const VMStateField *field)
|
||||||
{
|
{
|
||||||
VirtIODevice *vdev = VIRTIO_DEVICE(opaque);
|
VirtIODevice *vdev = VIRTIO_DEVICE(opaque);
|
||||||
|
@ -2853,6 +2854,39 @@ static int virtio_set_features_nocheck(VirtIODevice *vdev, uint64_t val)
|
||||||
return bad ? -1 : 0;
|
return bad ? -1 : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typedef struct VirtioSetFeaturesNocheckData {
|
||||||
|
Coroutine *co;
|
||||||
|
VirtIODevice *vdev;
|
||||||
|
uint64_t val;
|
||||||
|
int ret;
|
||||||
|
} VirtioSetFeaturesNocheckData;
|
||||||
|
|
||||||
|
static void virtio_set_features_nocheck_bh(void *opaque)
|
||||||
|
{
|
||||||
|
VirtioSetFeaturesNocheckData *data = opaque;
|
||||||
|
|
||||||
|
data->ret = virtio_set_features_nocheck(data->vdev, data->val);
|
||||||
|
aio_co_wake(data->co);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int coroutine_mixed_fn
|
||||||
|
virtio_set_features_nocheck_maybe_co(VirtIODevice *vdev, uint64_t val)
|
||||||
|
{
|
||||||
|
if (qemu_in_coroutine()) {
|
||||||
|
VirtioSetFeaturesNocheckData data = {
|
||||||
|
.co = qemu_coroutine_self(),
|
||||||
|
.vdev = vdev,
|
||||||
|
.val = val,
|
||||||
|
};
|
||||||
|
aio_bh_schedule_oneshot(qemu_get_current_aio_context(),
|
||||||
|
virtio_set_features_nocheck_bh, &data);
|
||||||
|
qemu_coroutine_yield();
|
||||||
|
return data.ret;
|
||||||
|
} else {
|
||||||
|
return virtio_set_features_nocheck(vdev, val);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int virtio_set_features(VirtIODevice *vdev, uint64_t val)
|
int virtio_set_features(VirtIODevice *vdev, uint64_t val)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
@ -2906,7 +2940,8 @@ size_t virtio_get_config_size(const VirtIOConfigSizeParams *params,
|
||||||
return config_size;
|
return config_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
int virtio_load(VirtIODevice *vdev, QEMUFile *f, int version_id)
|
int coroutine_mixed_fn
|
||||||
|
virtio_load(VirtIODevice *vdev, QEMUFile *f, int version_id)
|
||||||
{
|
{
|
||||||
int i, ret;
|
int i, ret;
|
||||||
int32_t config_len;
|
int32_t config_len;
|
||||||
|
@ -3023,14 +3058,14 @@ int virtio_load(VirtIODevice *vdev, QEMUFile *f, int version_id)
|
||||||
* host_features.
|
* host_features.
|
||||||
*/
|
*/
|
||||||
uint64_t features64 = vdev->guest_features;
|
uint64_t features64 = vdev->guest_features;
|
||||||
if (virtio_set_features_nocheck(vdev, features64) < 0) {
|
if (virtio_set_features_nocheck_maybe_co(vdev, features64) < 0) {
|
||||||
error_report("Features 0x%" PRIx64 " unsupported. "
|
error_report("Features 0x%" PRIx64 " unsupported. "
|
||||||
"Allowed features: 0x%" PRIx64,
|
"Allowed features: 0x%" PRIx64,
|
||||||
features64, vdev->host_features);
|
features64, vdev->host_features);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (virtio_set_features_nocheck(vdev, features) < 0) {
|
if (virtio_set_features_nocheck_maybe_co(vdev, features) < 0) {
|
||||||
error_report("Features 0x%x unsupported. "
|
error_report("Features 0x%x unsupported. "
|
||||||
"Allowed features: 0x%" PRIx64,
|
"Allowed features: 0x%" PRIx64,
|
||||||
features, vdev->host_features);
|
features, vdev->host_features);
|
||||||
|
|
|
@ -1231,7 +1231,7 @@ struct BlockDriverState {
|
||||||
unsigned int write_gen; /* Current data generation */
|
unsigned int write_gen; /* Current data generation */
|
||||||
|
|
||||||
/* Protected by reqs_lock. */
|
/* Protected by reqs_lock. */
|
||||||
CoMutex reqs_lock;
|
QemuMutex reqs_lock;
|
||||||
QLIST_HEAD(, BdrvTrackedRequest) tracked_requests;
|
QLIST_HEAD(, BdrvTrackedRequest) tracked_requests;
|
||||||
CoQueue flush_queue; /* Serializing flush queue */
|
CoQueue flush_queue; /* Serializing flush queue */
|
||||||
bool active_flush_req; /* Flush request in flight? */
|
bool active_flush_req; /* Flush request in flight? */
|
||||||
|
|
|
@ -36,9 +36,6 @@ BlockDeviceInfo *bdrv_block_device_info(BlockBackend *blk,
|
||||||
int bdrv_query_snapshot_info_list(BlockDriverState *bs,
|
int bdrv_query_snapshot_info_list(BlockDriverState *bs,
|
||||||
SnapshotInfoList **p_list,
|
SnapshotInfoList **p_list,
|
||||||
Error **errp);
|
Error **errp);
|
||||||
void bdrv_query_block_node_info(BlockDriverState *bs,
|
|
||||||
BlockNodeInfo **p_info,
|
|
||||||
Error **errp);
|
|
||||||
void bdrv_query_image_info(BlockDriverState *bs,
|
void bdrv_query_image_info(BlockDriverState *bs,
|
||||||
ImageInfo **p_info,
|
ImageInfo **p_info,
|
||||||
bool flat,
|
bool flat,
|
||||||
|
|
|
@ -41,8 +41,10 @@ typedef struct VMStateField VMStateField;
|
||||||
*/
|
*/
|
||||||
struct VMStateInfo {
|
struct VMStateInfo {
|
||||||
const char *name;
|
const char *name;
|
||||||
int (*get)(QEMUFile *f, void *pv, size_t size, const VMStateField *field);
|
int coroutine_mixed_fn (*get)(QEMUFile *f, void *pv, size_t size,
|
||||||
int (*put)(QEMUFile *f, void *pv, size_t size, const VMStateField *field,
|
const VMStateField *field);
|
||||||
|
int coroutine_mixed_fn (*put)(QEMUFile *f, void *pv, size_t size,
|
||||||
|
const VMStateField *field,
|
||||||
JSONWriter *vmdesc);
|
JSONWriter *vmdesc);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -3468,8 +3468,8 @@ static int img_snapshot(int argc, char **argv)
|
||||||
|
|
||||||
ret = bdrv_snapshot_create(bs, &sn);
|
ret = bdrv_snapshot_create(bs, &sn);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
error_report("Could not create snapshot '%s': %d (%s)",
|
error_report("Could not create snapshot '%s': %s",
|
||||||
snapshot_name, ret, strerror(-ret));
|
snapshot_name, strerror(-ret));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
|
@ -33,7 +33,7 @@ qemu-io: can't open device TEST_DIR/t.qcow2: Snapshot table offset invalid
|
||||||
|
|
||||||
== Hitting snapshot table size limit ==
|
== Hitting snapshot table size limit ==
|
||||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864
|
||||||
qemu-img: Could not create snapshot 'test': -27 (File too large)
|
qemu-img: Could not create snapshot 'test': File too large
|
||||||
read 512/512 bytes at offset 0
|
read 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)
|
||||||
|
|
||||||
|
@ -56,8 +56,8 @@ qemu-io: can't open device TEST_DIR/t.qcow2: Backing file name too long
|
||||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864
|
||||||
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)
|
||||||
qemu-img: Could not create snapshot 'test': -27 (File too large)
|
qemu-img: Could not create snapshot 'test': File too large
|
||||||
qemu-img: Could not create snapshot 'test': -11 (Resource temporarily unavailable)
|
qemu-img: Could not create snapshot 'test': Resource temporarily unavailable
|
||||||
|
|
||||||
== Invalid snapshot L1 table offset ==
|
== Invalid snapshot L1 table offset ==
|
||||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864
|
||||||
|
|
|
@ -44,6 +44,8 @@ read 512/512 bytes at offset 0
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false, "reason": "host-qmp-quit"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false, "reason": "host-qmp-quit"}}
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "standby", "id": "src"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "standby", "id": "src"}}
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "ready", "id": "src"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "ready", "id": "src"}}
|
||||||
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "standby", "id": "src"}}
|
||||||
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "ready", "id": "src"}}
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "aborting", "id": "src"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "aborting", "id": "src"}}
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_CANCELLED", "data": {"device": "src", "len": 1024, "offset": 1024, "speed": 0, "type": "mirror"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_CANCELLED", "data": {"device": "src", "len": 1024, "offset": 1024, "speed": 0, "type": "mirror"}}
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "concluded", "id": "src"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "concluded", "id": "src"}}
|
||||||
|
@ -94,6 +96,8 @@ read 512/512 bytes at offset 0
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false, "reason": "host-qmp-quit"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false, "reason": "host-qmp-quit"}}
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "standby", "id": "src"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "standby", "id": "src"}}
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "ready", "id": "src"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "ready", "id": "src"}}
|
||||||
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "standby", "id": "src"}}
|
||||||
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "ready", "id": "src"}}
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "aborting", "id": "src"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "aborting", "id": "src"}}
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_CANCELLED", "data": {"device": "src", "len": 197120, "offset": 197120, "speed": 0, "type": "mirror"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_CANCELLED", "data": {"device": "src", "len": 197120, "offset": 197120, "speed": 0, "type": "mirror"}}
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "concluded", "id": "src"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "concluded", "id": "src"}}
|
||||||
|
@ -144,6 +148,8 @@ read 512/512 bytes at offset 0
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false, "reason": "host-qmp-quit"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false, "reason": "host-qmp-quit"}}
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "standby", "id": "src"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "standby", "id": "src"}}
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "ready", "id": "src"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "ready", "id": "src"}}
|
||||||
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "standby", "id": "src"}}
|
||||||
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "ready", "id": "src"}}
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "aborting", "id": "src"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "aborting", "id": "src"}}
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_CANCELLED", "data": {"device": "src", "len": 327680, "offset": 327680, "speed": 0, "type": "mirror"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_CANCELLED", "data": {"device": "src", "len": 327680, "offset": 327680, "speed": 0, "type": "mirror"}}
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "concluded", "id": "src"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "concluded", "id": "src"}}
|
||||||
|
@ -194,6 +200,8 @@ read 512/512 bytes at offset 0
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false, "reason": "host-qmp-quit"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false, "reason": "host-qmp-quit"}}
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "standby", "id": "src"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "standby", "id": "src"}}
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "ready", "id": "src"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "ready", "id": "src"}}
|
||||||
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "standby", "id": "src"}}
|
||||||
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "ready", "id": "src"}}
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "aborting", "id": "src"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "aborting", "id": "src"}}
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_CANCELLED", "data": {"device": "src", "len": 1024, "offset": 1024, "speed": 0, "type": "mirror"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_CANCELLED", "data": {"device": "src", "len": 1024, "offset": 1024, "speed": 0, "type": "mirror"}}
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "concluded", "id": "src"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "concluded", "id": "src"}}
|
||||||
|
@ -244,6 +252,8 @@ read 512/512 bytes at offset 0
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false, "reason": "host-qmp-quit"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false, "reason": "host-qmp-quit"}}
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "standby", "id": "src"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "standby", "id": "src"}}
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "ready", "id": "src"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "ready", "id": "src"}}
|
||||||
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "standby", "id": "src"}}
|
||||||
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "ready", "id": "src"}}
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "aborting", "id": "src"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "aborting", "id": "src"}}
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_CANCELLED", "data": {"device": "src", "len": 65536, "offset": 65536, "speed": 0, "type": "mirror"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_CANCELLED", "data": {"device": "src", "len": 65536, "offset": 65536, "speed": 0, "type": "mirror"}}
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "concluded", "id": "src"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "concluded", "id": "src"}}
|
||||||
|
@ -294,6 +304,8 @@ read 512/512 bytes at offset 0
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false, "reason": "host-qmp-quit"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false, "reason": "host-qmp-quit"}}
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "standby", "id": "src"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "standby", "id": "src"}}
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "ready", "id": "src"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "ready", "id": "src"}}
|
||||||
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "standby", "id": "src"}}
|
||||||
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "ready", "id": "src"}}
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "aborting", "id": "src"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "aborting", "id": "src"}}
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_CANCELLED", "data": {"device": "src", "len": 2560, "offset": 2560, "speed": 0, "type": "mirror"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_CANCELLED", "data": {"device": "src", "len": 2560, "offset": 2560, "speed": 0, "type": "mirror"}}
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "concluded", "id": "src"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "concluded", "id": "src"}}
|
||||||
|
@ -343,6 +355,8 @@ read 512/512 bytes at offset 0
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false, "reason": "host-qmp-quit"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false, "reason": "host-qmp-quit"}}
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "standby", "id": "src"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "standby", "id": "src"}}
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "ready", "id": "src"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "ready", "id": "src"}}
|
||||||
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "standby", "id": "src"}}
|
||||||
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "ready", "id": "src"}}
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "aborting", "id": "src"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "aborting", "id": "src"}}
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_CANCELLED", "data": {"device": "src", "len": 2560, "offset": 2560, "speed": 0, "type": "mirror"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_CANCELLED", "data": {"device": "src", "len": 2560, "offset": 2560, "speed": 0, "type": "mirror"}}
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "concluded", "id": "src"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "concluded", "id": "src"}}
|
||||||
|
@ -392,6 +406,8 @@ read 512/512 bytes at offset 0
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false, "reason": "host-qmp-quit"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false, "reason": "host-qmp-quit"}}
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "standby", "id": "src"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "standby", "id": "src"}}
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "ready", "id": "src"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "ready", "id": "src"}}
|
||||||
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "standby", "id": "src"}}
|
||||||
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "ready", "id": "src"}}
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "aborting", "id": "src"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "aborting", "id": "src"}}
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_CANCELLED", "data": {"device": "src", "len": 31457280, "offset": 31457280, "speed": 0, "type": "mirror"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_CANCELLED", "data": {"device": "src", "len": 31457280, "offset": 31457280, "speed": 0, "type": "mirror"}}
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "concluded", "id": "src"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "concluded", "id": "src"}}
|
||||||
|
@ -441,6 +457,8 @@ read 512/512 bytes at offset 0
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false, "reason": "host-qmp-quit"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false, "reason": "host-qmp-quit"}}
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "standby", "id": "src"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "standby", "id": "src"}}
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "ready", "id": "src"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "ready", "id": "src"}}
|
||||||
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "standby", "id": "src"}}
|
||||||
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "ready", "id": "src"}}
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "aborting", "id": "src"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "aborting", "id": "src"}}
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_CANCELLED", "data": {"device": "src", "len": 327680, "offset": 327680, "speed": 0, "type": "mirror"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_CANCELLED", "data": {"device": "src", "len": 327680, "offset": 327680, "speed": 0, "type": "mirror"}}
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "concluded", "id": "src"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "concluded", "id": "src"}}
|
||||||
|
@ -490,6 +508,8 @@ read 512/512 bytes at offset 0
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false, "reason": "host-qmp-quit"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false, "reason": "host-qmp-quit"}}
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "standby", "id": "src"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "standby", "id": "src"}}
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "ready", "id": "src"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "ready", "id": "src"}}
|
||||||
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "standby", "id": "src"}}
|
||||||
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "ready", "id": "src"}}
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "aborting", "id": "src"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "aborting", "id": "src"}}
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_CANCELLED", "data": {"device": "src", "len": 2048, "offset": 2048, "speed": 0, "type": "mirror"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_CANCELLED", "data": {"device": "src", "len": 2048, "offset": 2048, "speed": 0, "type": "mirror"}}
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "concluded", "id": "src"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "concluded", "id": "src"}}
|
||||||
|
@ -519,6 +539,8 @@ WARNING: Image format was not specified for 'TEST_DIR/t.raw' and probing guessed
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false, "reason": "host-qmp-quit"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false, "reason": "host-qmp-quit"}}
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "standby", "id": "src"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "standby", "id": "src"}}
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "ready", "id": "src"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "ready", "id": "src"}}
|
||||||
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "standby", "id": "src"}}
|
||||||
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "ready", "id": "src"}}
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "aborting", "id": "src"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "aborting", "id": "src"}}
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_CANCELLED", "data": {"device": "src", "len": 512, "offset": 512, "speed": 0, "type": "mirror"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_CANCELLED", "data": {"device": "src", "len": 512, "offset": 512, "speed": 0, "type": "mirror"}}
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "concluded", "id": "src"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "concluded", "id": "src"}}
|
||||||
|
@ -541,6 +563,8 @@ Images are identical.
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false, "reason": "host-qmp-quit"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false, "reason": "host-qmp-quit"}}
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "standby", "id": "src"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "standby", "id": "src"}}
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "ready", "id": "src"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "ready", "id": "src"}}
|
||||||
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "standby", "id": "src"}}
|
||||||
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "ready", "id": "src"}}
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "aborting", "id": "src"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "aborting", "id": "src"}}
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_CANCELLED", "data": {"device": "src", "len": 512, "offset": 512, "speed": 0, "type": "mirror"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_CANCELLED", "data": {"device": "src", "len": 512, "offset": 512, "speed": 0, "type": "mirror"}}
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "concluded", "id": "src"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "concluded", "id": "src"}}
|
||||||
|
|
|
@ -32,7 +32,7 @@ Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864
|
||||||
refcount bits: 1
|
refcount bits: 1
|
||||||
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)
|
||||||
qemu-img: Could not create snapshot 'foo': -22 (Invalid argument)
|
qemu-img: Could not create snapshot 'foo': Invalid argument
|
||||||
Leaked cluster 6 refcount=1 reference=0
|
Leaked cluster 6 refcount=1 reference=0
|
||||||
|
|
||||||
1 leaked clusters were found on the image.
|
1 leaked clusters were found on the image.
|
||||||
|
@ -44,7 +44,7 @@ Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864
|
||||||
refcount bits: 2
|
refcount bits: 2
|
||||||
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)
|
||||||
qemu-img: Could not create snapshot 'baz': -22 (Invalid argument)
|
qemu-img: Could not create snapshot 'baz': Invalid argument
|
||||||
Leaked cluster 7 refcount=1 reference=0
|
Leaked cluster 7 refcount=1 reference=0
|
||||||
|
|
||||||
1 leaked clusters were found on the image.
|
1 leaked clusters were found on the image.
|
||||||
|
@ -75,7 +75,7 @@ Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864
|
||||||
refcount bits: 64
|
refcount bits: 64
|
||||||
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)
|
||||||
qemu-img: Could not create snapshot 'foo': -22 (Invalid argument)
|
qemu-img: Could not create snapshot 'foo': Invalid argument
|
||||||
Leaked cluster 5 refcount=18446744073709551615 reference=1
|
Leaked cluster 5 refcount=18446744073709551615 reference=1
|
||||||
Leaked cluster 6 refcount=1 reference=0
|
Leaked cluster 6 refcount=1 reference=0
|
||||||
|
|
||||||
|
|
|
@ -354,6 +354,8 @@ wait_for_job_and_quit() {
|
||||||
QEMU_EVENTS= # Ignore all JOB_STATUS_CHANGE events that came before SHUTDOWN
|
QEMU_EVENTS= # Ignore all JOB_STATUS_CHANGE events that came before SHUTDOWN
|
||||||
_wait_event $h 'JOB_STATUS_CHANGE' # standby
|
_wait_event $h 'JOB_STATUS_CHANGE' # standby
|
||||||
_wait_event $h 'JOB_STATUS_CHANGE' # ready
|
_wait_event $h 'JOB_STATUS_CHANGE' # ready
|
||||||
|
_wait_event $h 'JOB_STATUS_CHANGE' # standby
|
||||||
|
_wait_event $h 'JOB_STATUS_CHANGE' # ready
|
||||||
_wait_event $h 'JOB_STATUS_CHANGE' # aborting
|
_wait_event $h 'JOB_STATUS_CHANGE' # aborting
|
||||||
# Filter the offset (depends on when exactly `quit` was issued)
|
# Filter the offset (depends on when exactly `quit` was issued)
|
||||||
_wait_event $h 'BLOCK_JOB_CANCELLED' \
|
_wait_event $h 'BLOCK_JOB_CANCELLED' \
|
||||||
|
|
|
@ -137,6 +137,8 @@ Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false, "reason": "host-qmp-quit"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false, "reason": "host-qmp-quit"}}
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "standby", "id": "mirror"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "standby", "id": "mirror"}}
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "ready", "id": "mirror"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "ready", "id": "mirror"}}
|
||||||
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "standby", "id": "mirror"}}
|
||||||
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "ready", "id": "mirror"}}
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "aborting", "id": "mirror"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "aborting", "id": "mirror"}}
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_CANCELLED", "data": {"device": "mirror", "len": 33554432, "offset": (filtered), "speed": 0, "type": "mirror"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_CANCELLED", "data": {"device": "mirror", "len": 33554432, "offset": (filtered), "speed": 0, "type": "mirror"}}
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "concluded", "id": "mirror"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "concluded", "id": "mirror"}}
|
||||||
|
@ -160,6 +162,8 @@ Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false, "reason": "host-qmp-quit"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false, "reason": "host-qmp-quit"}}
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "standby", "id": "commit"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "standby", "id": "commit"}}
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "ready", "id": "commit"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "ready", "id": "commit"}}
|
||||||
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "standby", "id": "commit"}}
|
||||||
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "ready", "id": "commit"}}
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "aborting", "id": "commit"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "aborting", "id": "commit"}}
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_CANCELLED", "data": {"device": "commit", "len": 33554432, "offset": (filtered), "speed": 0, "type": "commit"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_CANCELLED", "data": {"device": "commit", "len": 33554432, "offset": (filtered), "speed": 0, "type": "commit"}}
|
||||||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "concluded", "id": "commit"}}
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "concluded", "id": "commit"}}
|
||||||
|
|
|
@ -41,7 +41,7 @@ write failed: Operation not supported
|
||||||
No errors were found on the image.
|
No errors were found on the image.
|
||||||
|
|
||||||
Take an internal snapshot:
|
Take an internal snapshot:
|
||||||
qemu-img: Could not create snapshot 'test': -95 (Operation not supported)
|
qemu-img: Could not create snapshot 'test': Operation not supported
|
||||||
No errors were found on the image.
|
No errors were found on the image.
|
||||||
|
|
||||||
=== Standalone image with external data file (efficient) ===
|
=== Standalone image with external data file (efficient) ===
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue