Block layer patches

- mirror: Fix deadlock
 - nbd/server: Fix race in draining the export
 - qemu-img snapshot: Fix formatting with large values
 - Fix blockdev-snapshot-sync error reporting for no medium
 - iotests fixes
 -----BEGIN PGP SIGNATURE-----
 
 iQJFBAABCAAvFiEE3D3rFZqa+V09dFb+fwmycsiPL9YFAmX4OG8RHGt3b2xmQHJl
 ZGhhdC5jb20ACgkQfwmycsiPL9YdiQ//faXfGmbK6rBW4AkpwfrRM8SDHvm6hz7L
 043ujAi3ziSXXoiec2/RK5wZ27nMJkfIrRHXpH41hgQvC6/3a4eIW6KSTaFV1PdG
 JtHCeopmVmgu7TZQ+kt/J6eLUTTLovoO94HgEfmxpr4CGZfx9RJftf2kCKILcYkh
 9r04zSZLByVd4FJ5ZrqsFulWif5mXoGKdT/YisY3tKiCwFRWQDOoTymvJA012VtO
 MVmID593zwem3O3qtlGiGlK9qodBR4yof66xa/0gaYP98BZgv+LWnwLKha+OzSpX
 bQlxT26LY4JnSQkTdjF0QYnQiH4Q1kveUcNRZrGpA4iZxVDq1aks5DisThDwqoGG
 rhaPOWyJwJsonM1Enzim5Jd60JqvGdpTLjSA5oSyTjw62lAulnYihInERYSAFyyz
 UhQaO7qSog1//RpPEXEsiVkJBq8BE9l5I+L7+l5SCBhNr/UwZAOer/4m4X6d0SKN
 GEPRx0kH1voikzx7gIQs+Oldqvb0sg+zAvOynBxzpd+Ac6s8bFtWe+eSyWYL/ZGr
 Jg9+PL1xir/Uh7KmOnzt/iVBAmfSRpAo1O72xQXvHFYYtIP7hTkPO/vzqF206WMc
 WQFHHjfp5gVcMZ5AYg6txw+Bbtzu8g0AfB054lgnhihuShpf0E923TTDQFdV755s
 NUlrzuGu2fs=
 =+JIK
 -----END PGP SIGNATURE-----

Merge tag 'for-upstream' of https://repo.or.cz/qemu/kevin into staging

Block layer patches

- mirror: Fix deadlock
- nbd/server: Fix race in draining the export
- qemu-img snapshot: Fix formatting with large values
- Fix blockdev-snapshot-sync error reporting for no medium
- iotests fixes

# -----BEGIN PGP SIGNATURE-----
#
# iQJFBAABCAAvFiEE3D3rFZqa+V09dFb+fwmycsiPL9YFAmX4OG8RHGt3b2xmQHJl
# ZGhhdC5jb20ACgkQfwmycsiPL9YdiQ//faXfGmbK6rBW4AkpwfrRM8SDHvm6hz7L
# 043ujAi3ziSXXoiec2/RK5wZ27nMJkfIrRHXpH41hgQvC6/3a4eIW6KSTaFV1PdG
# JtHCeopmVmgu7TZQ+kt/J6eLUTTLovoO94HgEfmxpr4CGZfx9RJftf2kCKILcYkh
# 9r04zSZLByVd4FJ5ZrqsFulWif5mXoGKdT/YisY3tKiCwFRWQDOoTymvJA012VtO
# MVmID593zwem3O3qtlGiGlK9qodBR4yof66xa/0gaYP98BZgv+LWnwLKha+OzSpX
# bQlxT26LY4JnSQkTdjF0QYnQiH4Q1kveUcNRZrGpA4iZxVDq1aks5DisThDwqoGG
# rhaPOWyJwJsonM1Enzim5Jd60JqvGdpTLjSA5oSyTjw62lAulnYihInERYSAFyyz
# UhQaO7qSog1//RpPEXEsiVkJBq8BE9l5I+L7+l5SCBhNr/UwZAOer/4m4X6d0SKN
# GEPRx0kH1voikzx7gIQs+Oldqvb0sg+zAvOynBxzpd+Ac6s8bFtWe+eSyWYL/ZGr
# Jg9+PL1xir/Uh7KmOnzt/iVBAmfSRpAo1O72xQXvHFYYtIP7hTkPO/vzqF206WMc
# WQFHHjfp5gVcMZ5AYg6txw+Bbtzu8g0AfB054lgnhihuShpf0E923TTDQFdV755s
# NUlrzuGu2fs=
# =+JIK
# -----END PGP SIGNATURE-----
# gpg: Signature made Mon 18 Mar 2024 12:49:51 GMT
# 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:
  iotests: adapt to output change for recently introduced 'detached header' field
  tests/qemu-iotests: Restrict tests using "--blockdev file" to the file protocol
  tests/qemu-iotests: Fix some tests that use --image-opts for other protocols
  tests/qemu-iotests: Restrict tests that use --image-opts to the 'file' protocol
  tests/qemu-iotests: Restrict test 156 to the 'file' protocol
  tests/qemu-iotests: Restrict test 134 and 158 to the 'file' protocol
  tests/qemu-iotests: Restrict test 130 to the 'file' protocol
  tests/qemu-iotests: Restrict test 114 to the 'file' protocol
  tests/qemu-iotests: Restrict test 066 to the 'file' protocol
  tests/qemu-iotests: Fix test 033 for running with non-file protocols
  qemu-img: Fix Column Width and Improve Formatting in snapshot list
  blockdev: Fix blockdev-snapshot-sync error reporting for no medium
  iotests: Add test for reset/AioContext switches with NBD exports
  nbd/server: Fix race in draining the export
  mirror: Don't call job_pause_point() under graph lock

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
Peter Maydell 2024-03-18 17:16:08 +00:00
commit 4511400fb7
30 changed files with 178 additions and 82 deletions

View File

@ -479,9 +479,9 @@ static unsigned mirror_perform(MirrorBlockJob *s, int64_t offset,
return bytes_handled;
}
static void coroutine_fn GRAPH_RDLOCK mirror_iteration(MirrorBlockJob *s)
static void coroutine_fn GRAPH_UNLOCKED mirror_iteration(MirrorBlockJob *s)
{
BlockDriverState *source = s->mirror_top_bs->backing->bs;
BlockDriverState *source;
MirrorOp *pseudo_op;
int64_t offset;
/* At least the first dirty chunk is mirrored in one iteration. */
@ -489,6 +489,10 @@ static void coroutine_fn GRAPH_RDLOCK mirror_iteration(MirrorBlockJob *s)
bool write_zeroes_ok = bdrv_can_write_zeroes_with_unmap(blk_bs(s->target));
int max_io_bytes = MAX(s->buf_size / MAX_IN_FLIGHT, MAX_IO_BYTES);
bdrv_graph_co_rdlock();
source = s->mirror_top_bs->backing->bs;
bdrv_graph_co_rdunlock();
bdrv_dirty_bitmap_lock(s->dirty_bitmap);
offset = bdrv_dirty_iter_next(s->dbi);
if (offset < 0) {
@ -1066,9 +1070,7 @@ static int coroutine_fn mirror_run(Job *job, Error **errp)
mirror_wait_for_free_in_flight_slot(s);
continue;
} else if (cnt != 0) {
bdrv_graph_co_rdlock();
mirror_iteration(s);
bdrv_graph_co_rdunlock();
}
}

View File

@ -742,15 +742,15 @@ void bdrv_snapshot_dump(QEMUSnapshotInfo *sn)
char *sizing = NULL;
if (!sn) {
qemu_printf("%-10s%-17s%8s%20s%13s%11s",
"ID", "TAG", "VM SIZE", "DATE", "VM CLOCK", "ICOUNT");
qemu_printf("%-7s %-16s %8s %19s %15s %10s",
"ID", "TAG", "VM_SIZE", "DATE", "VM_CLOCK", "ICOUNT");
} else {
g_autoptr(GDateTime) date = g_date_time_new_from_unix_local(sn->date_sec);
g_autofree char *date_buf = g_date_time_format(date, "%Y-%m-%d %H:%M:%S");
secs = sn->vm_clock_nsec / 1000000000;
snprintf(clock_buf, sizeof(clock_buf),
"%02d:%02d:%02d.%03d",
"%04d:%02d:%02d.%03d",
(int)(secs / 3600),
(int)((secs / 60) % 60),
(int)(secs % 60),
@ -759,8 +759,10 @@ void bdrv_snapshot_dump(QEMUSnapshotInfo *sn)
if (sn->icount != -1ULL) {
snprintf(icount_buf, sizeof(icount_buf),
"%"PRId64, sn->icount);
} else {
snprintf(icount_buf, sizeof(icount_buf), "--");
}
qemu_printf("%-9s %-16s %8s%20s%13s%11s",
qemu_printf("%-7s %-16s %8s %19s %15s %10s",
sn->id_str, sn->name,
sizing,
date_buf,

View File

@ -1395,7 +1395,8 @@ static void external_snapshot_action(TransactionAction *action,
bdrv_drained_begin(state->old_bs);
if (!bdrv_is_inserted(state->old_bs)) {
error_setg(errp, QERR_DEVICE_HAS_NO_MEDIUM, device);
error_setg(errp, QERR_DEVICE_HAS_NO_MEDIUM,
bdrv_get_device_or_node_name(state->old_bs));
return;
}

View File

@ -483,7 +483,7 @@ void job_enter(Job *job);
*
* Called with job_mutex *not* held.
*/
void coroutine_fn job_pause_point(Job *job);
void coroutine_fn GRAPH_UNLOCKED job_pause_point(Job *job);
/**
* @job: The job that calls the function.

View File

@ -3007,8 +3007,8 @@ static coroutine_fn int nbd_handle_request(NBDClient *client,
/* Owns a reference to the NBDClient passed as opaque. */
static coroutine_fn void nbd_trip(void *opaque)
{
NBDClient *client = opaque;
NBDRequestData *req = NULL;
NBDRequestData *req = opaque;
NBDClient *client = req->client;
NBDRequest request = { 0 }; /* GCC thinks it can be used uninitialized */
int ret;
Error *local_err = NULL;
@ -3037,8 +3037,6 @@ static coroutine_fn void nbd_trip(void *opaque)
goto done;
}
req = nbd_request_get(client);
/*
* nbd_co_receive_request() returns -EAGAIN when nbd_drained_begin() has
* set client->quiescing but by the time we get back nbd_drained_end() may
@ -3112,9 +3110,7 @@ static coroutine_fn void nbd_trip(void *opaque)
}
done:
if (req) {
nbd_request_put(req);
}
nbd_request_put(req);
qemu_mutex_unlock(&client->lock);
@ -3143,10 +3139,13 @@ disconnect:
*/
static void nbd_client_receive_next_request(NBDClient *client)
{
NBDRequestData *req;
if (!client->recv_coroutine && client->nb_requests < MAX_NBD_REQUESTS &&
!client->quiescing) {
nbd_client_get(client);
client->recv_coroutine = qemu_coroutine_create(nbd_trip, client);
req = nbd_request_get(client);
client->recv_coroutine = qemu_coroutine_create(nbd_trip, req);
aio_co_schedule(client->exp->common.ctx, client->recv_coroutine);
}
}

View File

@ -123,9 +123,9 @@ do_test 512 "write -P 1 0 0x200" "$TEST_IMG" | _filter_qemu_io
# next L2 table
do_test 512 "write -P 1 $L2_COVERAGE 0x200" "$TEST_IMG" | _filter_qemu_io
# only interested in qcow2 here; also other formats might respond with
# "not supported" error message
if [ $IMGFMT = "qcow2" ]; then
# only interested in qcow2 with file protocol here; also other formats
# might respond with "not supported" error message
if [ $IMGFMT = "qcow2" ] && [ $IMGPROTO = "file" ]; then
do_test 512 "truncate $L2_COVERAGE" "$TEST_IMG" | _filter_qemu_io
fi

View File

@ -39,7 +39,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15
# This tests qcow2-specific low-level functionality
_supported_fmt qcow2
_supported_proto generic
_supported_proto file
# We need zero clusters and snapshots
# (TODO: Consider splitting the snapshot part into a separate test
# file, so this one runs with refcount_bits=1 and data_file)

View File

@ -38,7 +38,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15
. ./common.filter
_supported_fmt qcow2
_supported_proto generic
_supported_proto file
# At least OpenBSD doesn't seem to have truncate
_supported_os Linux
# qcow2.py does not work too well with external data files

View File

@ -42,7 +42,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15
. ./common.qemu
_supported_fmt qcow2
_supported_proto generic
_supported_proto file
_supported_os Linux
# We are going to use lazy-refcounts
_unsupported_imgopts 'compat=0.10'

View File

@ -38,7 +38,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15
. ./common.filter
_supported_fmt qcow qcow2
_supported_proto generic
_supported_proto file
size=128M

View File

@ -50,7 +50,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15
. ./common.qemu
_supported_fmt qcow2 qed
_supported_proto generic
_supported_proto file
# Copying files around with cp does not work with external data files
_unsupported_imgopts data_file

View File

@ -38,7 +38,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15
. ./common.filter
_supported_fmt qcow qcow2
_supported_proto generic
_supported_proto file
size=128M

View File

@ -37,8 +37,8 @@ Offset Length File
0x7ffe0000 0x20000 TEST_DIR/t.IMGFMT.itmd
0x83400000 0x200 TEST_DIR/t.IMGFMT.itmd
Snapshot list:
ID TAG
1 snap
ID TAG
1 snap
=== Test pass snapshot.1 ===
@ -78,8 +78,8 @@ Offset Length File
0x7fff0000 0x10000 TEST_DIR/t.IMGFMT
0x83400000 0x200 TEST_DIR/t.IMGFMT
Snapshot list:
ID TAG
1 snap
ID TAG
1 snap
=== Test pass snapshot.2 ===
@ -119,8 +119,8 @@ Offset Length File
0x7fff0000 0x10000 TEST_DIR/t.IMGFMT
0x83400000 0x200 TEST_DIR/t.IMGFMT
Snapshot list:
ID TAG
1 snap
ID TAG
1 snap
=== Test pass snapshot.3 ===
@ -157,8 +157,8 @@ Offset Length File
0x7fff0000 0x10000 TEST_DIR/t.IMGFMT
0x83400000 0x200 TEST_DIR/t.IMGFMT
Snapshot list:
ID TAG
1 snap
ID TAG
1 snap
=== Test pass bitmap.0 ===

View File

@ -38,7 +38,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15
. ./common.filter
_supported_fmt qcow2
_supported_proto generic
_supported_proto file
_supported_os Linux
_require_working_luks

View File

@ -38,7 +38,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15
. ./common.filter
_supported_fmt qcow2
_supported_proto generic
_supported_proto file
_supported_os Linux
_require_working_luks

View File

@ -38,7 +38,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15
. ./common.filter
_supported_fmt qcow2
_supported_proto generic
_supported_proto file
_supported_os Linux
_require_working_luks

View File

@ -39,6 +39,7 @@ Format specific information:
compression type: COMPRESSION_TYPE
encrypt:
ivgen alg: plain64
detached header: false
hash alg: sha256
cipher alg: aes-256
uuid: 00000000-0000-0000-0000-000000000000
@ -84,6 +85,7 @@ Format specific information:
compression type: COMPRESSION_TYPE
encrypt:
ivgen alg: plain64
detached header: false
hash alg: sha256
cipher alg: aes-256
uuid: 00000000-0000-0000-0000-000000000000

View File

@ -114,6 +114,7 @@ Format specific information:
refcount bits: 16
encrypt:
ivgen alg: plain64
detached header: false
hash alg: sha1
cipher alg: aes-128
uuid: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX

View File

@ -393,7 +393,7 @@ _check_test_img -r all
echo
echo "$((sn_count - 1)) snapshots should remain:"
echo " qemu-img info reports $(_img_info | grep -c '^ \{32\}') snapshots"
echo " qemu-img info reports $(_img_info | grep -c '^ \{30\}') snapshots"
echo " Image header reports $(peek_file_be "$TEST_IMG" 60 4) snapshots"
echo
@ -520,7 +520,7 @@ _check_test_img -r all
echo
echo '65536 snapshots should remain:'
echo " qemu-img info reports $(_img_info | grep -c '^ \{32\}') snapshots"
echo " qemu-img info reports $(_img_info | grep -c '^ \{30\}') snapshots"
echo " Image header reports $(peek_file_be "$TEST_IMG" 60 4) snapshots"
# success, all done

View File

@ -34,6 +34,8 @@ _cleanup()
}
trap "_cleanup; exit \$status" 0 1 2 3 15
IMGOPTSSYNTAX=true
# get standard environment, filters and checks
. ./common.rc
. ./common.filter
@ -73,7 +75,7 @@ echo "testing LUKS qcow2 encryption"
echo
_make_test_img --object $SECRET -o "encrypt.format=luks,encrypt.key-secret=sec0,encrypt.iter-time=10,cluster_size=64K" $size
_run_test "driver=$IMGFMT,encrypt.key-secret=sec0,file.filename=$TEST_IMG"
_run_test "$TEST_IMG,encrypt.key-secret=sec0"
_cleanup_test_img
echo
@ -82,7 +84,7 @@ echo
_make_test_img --object $SECRET -o "encrypt.format=aes,encrypt.key-secret=sec0,cluster_size=64K" $size
_run_test "driver=$IMGFMT,encrypt.key-secret=sec0,file.filename=$TEST_IMG"
_run_test "$TEST_IMG,encrypt.key-secret=sec0"
_cleanup_test_img

View File

@ -33,8 +33,8 @@ QEMU X.Y.Z monitor - type 'help' for more information
(qemu) savevm snap0
(qemu) info snapshots
List of snapshots present on all disks:
ID TAG VM SIZE DATE VM CLOCK ICOUNT
-- snap0 SIZE yyyy-mm-dd hh:mm:ss 00:00:00.000
ID TAG VM_SIZE DATE VM_CLOCK ICOUNT
-- snap0 SIZE yyyy-mm-dd hh:mm:ss 0000:00:00.000 --
(qemu) loadvm snap0
(qemu) quit
@ -44,8 +44,8 @@ QEMU X.Y.Z monitor - type 'help' for more information
(qemu) savevm snap0
(qemu) info snapshots
List of snapshots present on all disks:
ID TAG VM SIZE DATE VM CLOCK ICOUNT
-- snap0 SIZE yyyy-mm-dd hh:mm:ss 00:00:00.000
ID TAG VM_SIZE DATE VM_CLOCK ICOUNT
-- snap0 SIZE yyyy-mm-dd hh:mm:ss 0000:00:00.000 --
(qemu) loadvm snap0
(qemu) quit
@ -69,8 +69,8 @@ QEMU X.Y.Z monitor - type 'help' for more information
(qemu) savevm snap0
(qemu) info snapshots
List of snapshots present on all disks:
ID TAG VM SIZE DATE VM CLOCK ICOUNT
-- snap0 SIZE yyyy-mm-dd hh:mm:ss 00:00:00.000
ID TAG VM_SIZE DATE VM_CLOCK ICOUNT
-- snap0 SIZE yyyy-mm-dd hh:mm:ss 0000:00:00.000 --
(qemu) loadvm snap0
(qemu) quit
@ -94,8 +94,8 @@ QEMU X.Y.Z monitor - type 'help' for more information
(qemu) savevm snap0
(qemu) info snapshots
List of snapshots present on all disks:
ID TAG VM SIZE DATE VM CLOCK ICOUNT
-- snap0 SIZE yyyy-mm-dd hh:mm:ss 00:00:00.000
ID TAG VM_SIZE DATE VM_CLOCK ICOUNT
-- snap0 SIZE yyyy-mm-dd hh:mm:ss 0000:00:00.000 --
(qemu) loadvm snap0
(qemu) quit
@ -105,8 +105,8 @@ QEMU X.Y.Z monitor - type 'help' for more information
(qemu) savevm snap0
(qemu) info snapshots
List of snapshots present on all disks:
ID TAG VM SIZE DATE VM CLOCK ICOUNT
-- snap0 SIZE yyyy-mm-dd hh:mm:ss 00:00:00.000
ID TAG VM_SIZE DATE VM_CLOCK ICOUNT
-- snap0 SIZE yyyy-mm-dd hh:mm:ss 0000:00:00.000 --
(qemu) loadvm snap0
(qemu) quit
@ -119,8 +119,8 @@ QEMU X.Y.Z monitor - type 'help' for more information
(qemu) savevm snap0
(qemu) info snapshots
List of snapshots present on all disks:
ID TAG VM SIZE DATE VM CLOCK ICOUNT
-- snap0 SIZE yyyy-mm-dd hh:mm:ss 00:00:00.000
ID TAG VM_SIZE DATE VM_CLOCK ICOUNT
-- snap0 SIZE yyyy-mm-dd hh:mm:ss 0000:00:00.000 --
(qemu) loadvm snap0
(qemu) quit
@ -134,8 +134,8 @@ QEMU X.Y.Z monitor - type 'help' for more information
(qemu) savevm snap0
(qemu) info snapshots
List of snapshots present on all disks:
ID TAG VM SIZE DATE VM CLOCK ICOUNT
-- snap0 SIZE yyyy-mm-dd hh:mm:ss 00:00:00.000
ID TAG VM_SIZE DATE VM_CLOCK ICOUNT
-- snap0 SIZE yyyy-mm-dd hh:mm:ss 0000:00:00.000 --
(qemu) loadvm snap0
(qemu) quit
@ -145,15 +145,15 @@ QEMU X.Y.Z monitor - type 'help' for more information
(qemu) savevm snap0
(qemu) info snapshots
List of snapshots present on all disks:
ID TAG VM SIZE DATE VM CLOCK ICOUNT
-- snap0 SIZE yyyy-mm-dd hh:mm:ss 00:00:00.000
ID TAG VM_SIZE DATE VM_CLOCK ICOUNT
-- snap0 SIZE yyyy-mm-dd hh:mm:ss 0000:00:00.000 --
(qemu) loadvm snap0
(qemu) quit
Internal snapshots on overlay:
Snapshot list:
ID TAG VM SIZE DATE VM CLOCK ICOUNT
1 snap0 SIZE yyyy-mm-dd hh:mm:ss 00:00:00.000
ID TAG VM_SIZE DATE VM_CLOCK ICOUNT
1 snap0 SIZE yyyy-mm-dd hh:mm:ss 0000:00:00.000 --
Internal snapshots on backing file:
=== -blockdev with NBD server on the backing file ===
@ -166,17 +166,17 @@ QEMU X.Y.Z monitor - type 'help' for more information
(qemu) savevm snap0
(qemu) info snapshots
List of snapshots present on all disks:
ID TAG VM SIZE DATE VM CLOCK ICOUNT
-- snap0 SIZE yyyy-mm-dd hh:mm:ss 00:00:00.000
ID TAG VM_SIZE DATE VM_CLOCK ICOUNT
-- snap0 SIZE yyyy-mm-dd hh:mm:ss 0000:00:00.000 --
(qemu) loadvm snap0
(qemu) quit
Internal snapshots on overlay:
Snapshot list:
ID TAG VM SIZE DATE VM CLOCK ICOUNT
1 snap0 SIZE yyyy-mm-dd hh:mm:ss 00:00:00.000
ID TAG VM_SIZE DATE VM_CLOCK ICOUNT
1 snap0 SIZE yyyy-mm-dd hh:mm:ss 0000:00:00.000 --
Internal snapshots on backing file:
Snapshot list:
ID TAG VM SIZE DATE VM CLOCK ICOUNT
1 snap0 SIZE yyyy-mm-dd hh:mm:ss 00:00:00.000
ID TAG VM_SIZE DATE VM_CLOCK ICOUNT
1 snap0 SIZE yyyy-mm-dd hh:mm:ss 0000:00:00.000 --
*** done

View File

@ -33,6 +33,8 @@ _cleanup()
}
trap "_cleanup; exit \$status" 0 1 2 3 15
IMGOPTSSYNTAX=true
# get standard environment, filters and checks
. ./common.rc
. ./common.filter
@ -47,14 +49,12 @@ size=1M
SECRET="secret,id=sec0,data=astrochicken"
IMGSPEC="driver=$IMGFMT,file.filename=$TEST_IMG,encrypt.key-secret=sec0"
QEMU_IO_OPTIONS=$QEMU_IO_OPTIONS_NO_FMT
_run_test()
{
IMGOPTSSYNTAX=true
OLD_TEST_IMG="$TEST_IMG"
TEST_IMG="driver=$IMGFMT,file.filename=$TEST_IMG,encrypt.key-secret=sec0"
TEST_IMG="$TEST_IMG,encrypt.key-secret=sec0"
QEMU_IMG_EXTRA_ARGS="--image-opts --object $SECRET"
echo
@ -78,7 +78,6 @@ _run_test()
TEST_IMG="$OLD_TEST_IMG"
QEMU_IMG_EXTRA_ARGS=
IMGOPTSSYNTAX=
}

View File

@ -69,7 +69,8 @@ $QEMU_IMG snapshot -l "$TEST_IMG" | tail -n 1 | tr -s ' ' \
-e 's/\./(VM state size unit)/' \
-e 's/\./(snapshot date)/' \
-e 's/\./(snapshot time)/' \
-e 's/\./(VM clock)/'
-e 's/\./(VM clock)/' \
-e 's/\./(icount)/'
# success, all done
echo "*** done"

View File

@ -4,5 +4,5 @@ QEMU X.Y.Z monitor - type 'help' for more information
(qemu) savevm abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz
(qemu) quit
Output structure:
(snapshot ID) (snapshot name) (VM state size value) (VM state size unit) (snapshot date) (snapshot time) (VM clock)
(snapshot ID) (snapshot name) (VM state size value) (VM state size unit) (snapshot date) (snapshot time) (VM clock) (icount)
*** done

View File

@ -36,6 +36,8 @@ _cleanup()
}
trap "_cleanup; exit \$status" 0 1 2 3 15
IMGOPTSSYNTAX=true
# get standard environment, filters and checks
cd ..
. ./common.rc
@ -46,7 +48,7 @@ _supported_proto generic
size=128M
_make_test_img $size
IMGSPEC="driver=$IMGFMT,file.filename=$TEST_IMG,discard=unmap,detect-zeroes=unmap"
IMGSPEC="$TEST_IMG,discard=unmap,detect-zeroes=unmap"
echo
echo "== writing zero buffer to image =="

View File

@ -0,0 +1,66 @@
#!/usr/bin/env python3
# group: rw quick
#
# Copyright (C) 2024 Red Hat, Inc.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
# Creator/Owner: Kevin Wolf <kwolf@redhat.com>
import time
import qemu
import iotests
iotests.script_initialize(supported_fmts=['qcow2'],
supported_platforms=['linux'])
with iotests.FilePath('disk1.img') as path, \
iotests.FilePath('nbd.sock', base_dir=iotests.sock_dir) as nbd_sock, \
qemu.machine.QEMUMachine(iotests.qemu_prog) as vm:
img_size = '10M'
iotests.log('Preparing disk...')
iotests.qemu_img_create('-f', iotests.imgfmt, path, img_size)
vm.add_args('-blockdev', f'file,node-name=disk-file,filename={path}')
vm.add_args('-blockdev', 'qcow2,node-name=disk,file=disk-file')
vm.add_args('-object', 'iothread,id=iothread0')
vm.add_args('-device',
'virtio-blk,drive=disk,iothread=iothread0,share-rw=on')
iotests.log('Launching VM...')
vm.add_args('-accel', 'kvm', '-accel', 'tcg')
#vm.add_args('-accel', 'qtest')
vm.launch()
iotests.log('Exporting to NBD...')
iotests.log(vm.qmp('nbd-server-start',
addr={'type': 'unix', 'data': {'path': nbd_sock}}))
iotests.log(vm.qmp('block-export-add', type='nbd', id='exp0',
node_name='disk', writable=True))
iotests.log('Connecting qemu-img...')
qemu_io = iotests.QemuIoInteractive('-f', 'raw',
f'nbd+unix:///disk?socket={nbd_sock}')
iotests.log('Moving the NBD export to a different iothread...')
for i in range(0, 10):
iotests.log(vm.qmp('system_reset'))
time.sleep(0.1)
iotests.log('Checking that it is still alive...')
iotests.log(vm.qmp('query-status'))
qemu_io.close()
vm.shutdown()

View File

@ -0,0 +1,19 @@
Preparing disk...
Launching VM...
Exporting to NBD...
{"return": {}}
{"return": {}}
Connecting qemu-img...
Moving the NBD export to a different iothread...
{"return": {}}
{"return": {}}
{"return": {}}
{"return": {}}
{"return": {}}
{"return": {}}
{"return": {}}
{"return": {}}
{"return": {}}
{"return": {}}
Checking that it is still alive...
{"return": {"running": true, "status": "running"}}

View File

@ -39,7 +39,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15
# This tests qcow2-specific low-level functionality
_supported_fmt qcow2
_supported_proto generic
_supported_proto file
# Internal snapshots are (currently) impossible with refcount_bits=1,
# and generally impossible with external data files
_unsupported_imgopts 'compat=0.10' 'refcount_bits=1[^0-9]' data_file

View File

@ -14,8 +14,8 @@ wrote 524288/524288 bytes at offset 0
(qemu) quit
Snapshot list:
ID TAG VM SIZE DATE VM CLOCK ICOUNT
1 snap0 SIZE yyyy-mm-dd hh:mm:ss 00:00:00.000
ID TAG VM_SIZE DATE VM_CLOCK ICOUNT
1 snap0 SIZE yyyy-mm-dd hh:mm:ss 0000:00:00.000 --
No errors were found on the image.
=== Verify that loading the snapshot reverts to the old content ===
@ -47,9 +47,9 @@ read 64512/64512 bytes at offset 66560
(qemu) quit
Snapshot list:
ID TAG VM SIZE DATE VM CLOCK ICOUNT
1 snap0 SIZE yyyy-mm-dd hh:mm:ss 00:00:00.000
2 snap1 SIZE yyyy-mm-dd hh:mm:ss 00:00:00.000
ID TAG VM_SIZE DATE VM_CLOCK ICOUNT
1 snap0 SIZE yyyy-mm-dd hh:mm:ss 0000:00:00.000 --
2 snap1 SIZE yyyy-mm-dd hh:mm:ss 0000:00:00.000 --
No errors were found on the image.
=== qemu-img snapshot can revert to snapshots ===
@ -79,8 +79,8 @@ read 64512/64512 bytes at offset 66560
(qemu) quit
Snapshot list:
ID TAG VM SIZE DATE VM CLOCK ICOUNT
1 snap0 SIZE yyyy-mm-dd hh:mm:ss 00:00:00.000
ID TAG VM_SIZE DATE VM_CLOCK ICOUNT
1 snap0 SIZE yyyy-mm-dd hh:mm:ss 0000:00:00.000 --
No errors were found on the image.
=== Error cases ===

View File

@ -40,7 +40,7 @@ cd ..
. ./common.filter
_supported_fmt qcow2
_supported_proto generic
_supported_proto file
size=128M