1
The following changes since commit fa54abb8c298f892639ffc4bc2f61448ac3be4a1:
1
The following changes since commit 67c1115edd98f388ca89dd38322ea3fadf034523:
2
2
3
Drop QEMU_GNUC_PREREQ() checks for gcc older than 4.1 (2017-04-20 18:33:33 +0100)
3
Merge remote-tracking branch 'remotes/kraxel/tags/ui-20210323-pull-request' into staging (2021-03-23 23:47:30 +0000)
4
4
5
are available in the git repository at:
5
are available in the Git repository at:
6
6
7
git://github.com/stefanha/qemu.git tags/block-pull-request
7
https://gitlab.com/stefanha/qemu.git tags/block-pull-request
8
8
9
for you to fetch changes up to 3ccc0a0163b932fe980dce8d26db4bf98b1900e9:
9
for you to fetch changes up to 3460fd7f3959d1fa7bcc255796844aa261c805a4:
10
10
11
MAINTAINERS: update my email address (2017-04-21 10:36:12 +0100)
11
migrate-bitmaps-postcopy-test: check that we can't remove in-flight bitmaps (2021-03-24 13:41:19 +0000)
12
13
----------------------------------------------------------------
14
Pull request
15
16
This dirty bitmap fix solves a crash that can be triggered in the destination
17
QEMU process during live migration.
12
18
13
----------------------------------------------------------------
19
----------------------------------------------------------------
14
20
15
----------------------------------------------------------------
21
Vladimir Sementsov-Ogievskiy (2):
22
migration/block-dirty-bitmap: make incoming disabled bitmaps busy
23
migrate-bitmaps-postcopy-test: check that we can't remove in-flight
24
bitmaps
16
25
17
Changlong Xie (1):
26
migration/block-dirty-bitmap.c | 6 ++++++
18
MAINTAINERS: update Wen's email address
27
tests/qemu-iotests/tests/migrate-bitmaps-postcopy-test | 10 ++++++++++
19
28
2 files changed, 16 insertions(+)
20
Lidong Chen (1):
21
migration/block: use blk_pwrite_zeroes for each zero cluster
22
23
Stefan Hajnoczi (3):
24
qemu-options: explain disk I/O throttling options
25
throttle: do not use invalid config in test
26
throttle: make throttle_config(throttle_get_config()) symmetric
27
28
Zhang Chen (1):
29
MAINTAINERS: update my email address
30
31
MAINTAINERS | 4 ++--
32
migration/block.c | 35 +++++++++++++++++++++++++++++++++--
33
tests/test-throttle.c | 8 ++++----
34
util/throttle.c | 14 ++++++++++++++
35
qemu-options.hx | 24 ++++++++++++++++++++++++
36
5 files changed, 77 insertions(+), 8 deletions(-)
37
29
38
--
30
--
39
2.9.3
31
2.30.2
40
32
41
diff view generated by jsdifflib
Deleted patch
1
The disk I/O throttling options have been listed for a long time but
2
never explained on the QEMU man page.
3
1
4
Suggested-by: Nini Gu <ngu@redhat.com>
5
Cc: Alberto Garcia <berto@igalia.com>
6
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
7
Reviewed-by: Alberto Garcia <berto@igalia.com>
8
Reviewed-by: Greg Kurz <groug@kaod.org>
9
Message-id: 20170301115026.22621-2-stefanha@redhat.com
10
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
11
---
12
qemu-options.hx | 24 ++++++++++++++++++++++++
13
1 file changed, 24 insertions(+)
14
15
diff --git a/qemu-options.hx b/qemu-options.hx
16
index XXXXXXX..XXXXXXX 100644
17
--- a/qemu-options.hx
18
+++ b/qemu-options.hx
19
@@ -XXX,XX +XXX,XX @@ file sectors into the image file.
20
conversion of plain zero writes by the OS to driver specific optimized
21
zero write commands. You may even choose "unmap" if @var{discard} is set
22
to "unmap" to allow a zero write to be converted to an UNMAP operation.
23
+@item bps=@var{b},bps_rd=@var{r},bps_wr=@var{w}
24
+Specify bandwidth throttling limits in bytes per second, either for all request
25
+types or for reads or writes only. Small values can lead to timeouts or hangs
26
+inside the guest. A safe minimum for disks is 2 MB/s.
27
+@item bps_max=@var{bm},bps_rd_max=@var{rm},bps_wr_max=@var{wm}
28
+Specify bursts in bytes per second, either for all request types or for reads
29
+or writes only. Bursts allow the guest I/O to spike above the limit
30
+temporarily.
31
+@item iops=@var{i},iops_rd=@var{r},iops_wr=@var{w}
32
+Specify request rate limits in requests per second, either for all request
33
+types or for reads or writes only.
34
+@item iops_max=@var{bm},iops_rd_max=@var{rm},iops_wr_max=@var{wm}
35
+Specify bursts in requests per second, either for all request types or for reads
36
+or writes only. Bursts allow the guest I/O to spike above the limit
37
+temporarily.
38
+@item iops_size=@var{is}
39
+Let every @var{is} bytes of a request count as a new request for iops
40
+throttling purposes. Use this option to prevent guests from circumventing iops
41
+limits by sending fewer but larger requests.
42
+@item group=@var{g}
43
+Join a throttling quota group with given name @var{g}. All drives that are
44
+members of the same group are accounted for together. Use this option to
45
+prevent guests from circumventing throttling limits by using many small disks
46
+instead of a single larger disk.
47
@end table
48
49
By default, the @option{cache=writeback} mode is used. It will report data
50
--
51
2.9.3
52
53
diff view generated by jsdifflib
Deleted patch
1
The (burst) max parameter cannot be smaller than the avg parameter.
2
There is a test case that uses avg = 56, max = 1 and gets away with it
3
because no input validation is performed by the test case.
4
1
5
This patch switches to valid test input parameters.
6
7
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
8
Reviewed-by: Alberto Garcia <berto@igalia.com>
9
Message-id: 20170301115026.22621-3-stefanha@redhat.com
10
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
11
---
12
tests/test-throttle.c | 8 ++++----
13
1 file changed, 4 insertions(+), 4 deletions(-)
14
15
diff --git a/tests/test-throttle.c b/tests/test-throttle.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/tests/test-throttle.c
18
+++ b/tests/test-throttle.c
19
@@ -XXX,XX +XXX,XX @@ static void test_config_functions(void)
20
orig_cfg.buckets[THROTTLE_OPS_READ].avg = 69;
21
orig_cfg.buckets[THROTTLE_OPS_WRITE].avg = 23;
22
23
- orig_cfg.buckets[THROTTLE_BPS_TOTAL].max = 0; /* should be corrected */
24
- orig_cfg.buckets[THROTTLE_BPS_READ].max = 1; /* should not be corrected */
25
+ orig_cfg.buckets[THROTTLE_BPS_TOTAL].max = 0; /* should be corrected */
26
+ orig_cfg.buckets[THROTTLE_BPS_READ].max = 56; /* should not be corrected */
27
orig_cfg.buckets[THROTTLE_BPS_WRITE].max = 120;
28
29
orig_cfg.buckets[THROTTLE_OPS_TOTAL].max = 150;
30
@@ -XXX,XX +XXX,XX @@ static void test_config_functions(void)
31
g_assert(final_cfg.buckets[THROTTLE_OPS_READ].avg == 69);
32
g_assert(final_cfg.buckets[THROTTLE_OPS_WRITE].avg == 23);
33
34
- g_assert(final_cfg.buckets[THROTTLE_BPS_TOTAL].max == 15.3);/* fixed */
35
- g_assert(final_cfg.buckets[THROTTLE_BPS_READ].max == 1); /* not fixed */
36
+ g_assert(final_cfg.buckets[THROTTLE_BPS_TOTAL].max == 15.3); /* fixed */
37
+ g_assert(final_cfg.buckets[THROTTLE_BPS_READ].max == 56); /* not fixed */
38
g_assert(final_cfg.buckets[THROTTLE_BPS_WRITE].max == 120);
39
40
g_assert(final_cfg.buckets[THROTTLE_OPS_TOTAL].max == 150);
41
--
42
2.9.3
43
44
diff view generated by jsdifflib
Deleted patch
1
Throttling has a weird property that throttle_get_config() does not
2
always return the same throttling settings that were given with
3
throttle_config(). In other words, the set and get functions aren't
4
symmetric.
5
1
6
If .max is 0 then the throttling code assigns a default value of .avg /
7
10 in throttle_config(). This is an implementation detail of the
8
throttling algorithm. When throttle_get_config() is called the .max
9
value returned should still be 0.
10
11
Users are exposed to this quirk via "info block" or "query-block"
12
monitor commands. This has caused confusion because it looks like a bug
13
when an unexpected value is reported.
14
15
This patch hides the .max value adjustment in throttle_get_config() and
16
updates test-throttle.c appropriately.
17
18
Reported-by: Nini Gu <ngu@redhat.com>
19
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
20
Reviewed-by: Alberto Garcia <berto@igalia.com>
21
Message-id: 20170301115026.22621-4-stefanha@redhat.com
22
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
23
---
24
tests/test-throttle.c | 8 ++++----
25
util/throttle.c | 14 ++++++++++++++
26
2 files changed, 18 insertions(+), 4 deletions(-)
27
28
diff --git a/tests/test-throttle.c b/tests/test-throttle.c
29
index XXXXXXX..XXXXXXX 100644
30
--- a/tests/test-throttle.c
31
+++ b/tests/test-throttle.c
32
@@ -XXX,XX +XXX,XX @@ static void test_config_functions(void)
33
orig_cfg.buckets[THROTTLE_OPS_READ].avg = 69;
34
orig_cfg.buckets[THROTTLE_OPS_WRITE].avg = 23;
35
36
- orig_cfg.buckets[THROTTLE_BPS_TOTAL].max = 0; /* should be corrected */
37
- orig_cfg.buckets[THROTTLE_BPS_READ].max = 56; /* should not be corrected */
38
+ orig_cfg.buckets[THROTTLE_BPS_TOTAL].max = 0;
39
+ orig_cfg.buckets[THROTTLE_BPS_READ].max = 56;
40
orig_cfg.buckets[THROTTLE_BPS_WRITE].max = 120;
41
42
orig_cfg.buckets[THROTTLE_OPS_TOTAL].max = 150;
43
@@ -XXX,XX +XXX,XX @@ static void test_config_functions(void)
44
g_assert(final_cfg.buckets[THROTTLE_OPS_READ].avg == 69);
45
g_assert(final_cfg.buckets[THROTTLE_OPS_WRITE].avg == 23);
46
47
- g_assert(final_cfg.buckets[THROTTLE_BPS_TOTAL].max == 15.3); /* fixed */
48
- g_assert(final_cfg.buckets[THROTTLE_BPS_READ].max == 56); /* not fixed */
49
+ g_assert(final_cfg.buckets[THROTTLE_BPS_TOTAL].max == 0);
50
+ g_assert(final_cfg.buckets[THROTTLE_BPS_READ].max == 56);
51
g_assert(final_cfg.buckets[THROTTLE_BPS_WRITE].max == 120);
52
53
g_assert(final_cfg.buckets[THROTTLE_OPS_TOTAL].max == 150);
54
diff --git a/util/throttle.c b/util/throttle.c
55
index XXXXXXX..XXXXXXX 100644
56
--- a/util/throttle.c
57
+++ b/util/throttle.c
58
@@ -XXX,XX +XXX,XX @@ static void throttle_fix_bucket(LeakyBucket *bkt)
59
}
60
}
61
62
+/* undo internal bucket parameter changes (see throttle_fix_bucket()) */
63
+static void throttle_unfix_bucket(LeakyBucket *bkt)
64
+{
65
+ if (bkt->max < bkt->avg) {
66
+ bkt->max = 0;
67
+ }
68
+}
69
+
70
/* take care of canceling a timer */
71
static void throttle_cancel_timer(QEMUTimer *timer)
72
{
73
@@ -XXX,XX +XXX,XX @@ void throttle_config(ThrottleState *ts,
74
*/
75
void throttle_get_config(ThrottleState *ts, ThrottleConfig *cfg)
76
{
77
+ int i;
78
+
79
*cfg = ts->cfg;
80
+
81
+ for (i = 0; i < BUCKETS_COUNT; i++) {
82
+ throttle_unfix_bucket(&cfg->buckets[i]);
83
+ }
84
}
85
86
87
--
88
2.9.3
89
90
diff view generated by jsdifflib
Deleted patch
1
From: Lidong Chen <lidongchen@tencent.com>
2
1
3
BLOCK_SIZE is (1 << 20), qcow2 cluster size is 65536 by default,
4
this may cause the qcow2 file size to be bigger after migration.
5
This patch checks each cluster, using blk_pwrite_zeroes for each
6
zero cluster.
7
8
[Initialize cluster_size to BLOCK_SIZE to prevent a gcc uninitialized
9
variable compiler warning. In reality we always initialize cluster_size
10
in a conditional but gcc doesn't know that.
11
--Stefan]
12
13
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
14
Signed-off-by: Lidong Chen <lidongchen@tencent.com>
15
Message-id: 1492050868-16200-1-git-send-email-lidongchen@tencent.com
16
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
17
---
18
migration/block.c | 35 +++++++++++++++++++++++++++++++++--
19
1 file changed, 33 insertions(+), 2 deletions(-)
20
21
diff --git a/migration/block.c b/migration/block.c
22
index XXXXXXX..XXXXXXX 100644
23
--- a/migration/block.c
24
+++ b/migration/block.c
25
@@ -XXX,XX +XXX,XX @@ static int block_load(QEMUFile *f, void *opaque, int version_id)
26
int64_t total_sectors = 0;
27
int nr_sectors;
28
int ret;
29
+ BlockDriverInfo bdi;
30
+ int cluster_size = BLOCK_SIZE;
31
32
do {
33
addr = qemu_get_be64(f);
34
@@ -XXX,XX +XXX,XX @@ static int block_load(QEMUFile *f, void *opaque, int version_id)
35
error_report_err(local_err);
36
return -EINVAL;
37
}
38
+
39
+ ret = bdrv_get_info(blk_bs(blk), &bdi);
40
+ if (ret == 0 && bdi.cluster_size > 0 &&
41
+ bdi.cluster_size <= BLOCK_SIZE &&
42
+ BLOCK_SIZE % bdi.cluster_size == 0) {
43
+ cluster_size = bdi.cluster_size;
44
+ } else {
45
+ cluster_size = BLOCK_SIZE;
46
+ }
47
}
48
49
if (total_sectors - addr < BDRV_SECTORS_PER_DIRTY_CHUNK) {
50
@@ -XXX,XX +XXX,XX @@ static int block_load(QEMUFile *f, void *opaque, int version_id)
51
nr_sectors * BDRV_SECTOR_SIZE,
52
BDRV_REQ_MAY_UNMAP);
53
} else {
54
+ int i;
55
+ int64_t cur_addr;
56
+ uint8_t *cur_buf;
57
+
58
buf = g_malloc(BLOCK_SIZE);
59
qemu_get_buffer(f, buf, BLOCK_SIZE);
60
- ret = blk_pwrite(blk, addr * BDRV_SECTOR_SIZE, buf,
61
- nr_sectors * BDRV_SECTOR_SIZE, 0);
62
+ for (i = 0; i < BLOCK_SIZE / cluster_size; i++) {
63
+ cur_addr = addr * BDRV_SECTOR_SIZE + i * cluster_size;
64
+ cur_buf = buf + i * cluster_size;
65
+
66
+ if ((!block_mig_state.zero_blocks ||
67
+ cluster_size < BLOCK_SIZE) &&
68
+ buffer_is_zero(cur_buf, cluster_size)) {
69
+ ret = blk_pwrite_zeroes(blk, cur_addr,
70
+ cluster_size,
71
+ BDRV_REQ_MAY_UNMAP);
72
+ } else {
73
+ ret = blk_pwrite(blk, cur_addr, cur_buf,
74
+ cluster_size, 0);
75
+ }
76
+ if (ret < 0) {
77
+ break;
78
+ }
79
+ }
80
g_free(buf);
81
}
82
83
--
84
2.9.3
85
86
diff view generated by jsdifflib
1
From: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
1
From: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
2
2
3
I'm leaving my job at Fujitsu, this email address will stop working
3
Incoming enabled bitmaps are busy, because we do
4
this week. Update it to one that I will have access to later.
4
bdrv_dirty_bitmap_create_successor() for them. But disabled bitmaps
5
being migrated are not marked busy, and user can remove them during the
6
incoming migration. Then we may crash in cancel_incoming_locked() when
7
try to remove the bitmap that was already removed by user, like this:
5
8
6
Signed-off-by: Xie Changlong <xiecl.fnst@cn.fujitsu.com>
9
#0 qemu_mutex_lock_impl (mutex=0x5593d88c50d1, file=0x559680554b20
7
Message-id: 1492758767-19716-1-git-send-email-xiecl.fnst@cn.fujitsu.com
10
"../block/dirty-bitmap.c", line=64) at ../util/qemu-thread-posix.c:77
11
#1 bdrv_dirty_bitmaps_lock (bs=0x5593d88c0ee9)
12
at ../block/dirty-bitmap.c:64
13
#2 bdrv_release_dirty_bitmap (bitmap=0x5596810e9570)
14
at ../block/dirty-bitmap.c:362
15
#3 cancel_incoming_locked (s=0x559680be8208 <dbm_state+40>)
16
at ../migration/block-dirty-bitmap.c:918
17
#4 dirty_bitmap_load (f=0x559681d02b10, opaque=0x559680be81e0
18
<dbm_state>, version_id=1) at ../migration/block-dirty-bitmap.c:1194
19
#5 vmstate_load (f=0x559681d02b10, se=0x559680fb5810)
20
at ../migration/savevm.c:908
21
#6 qemu_loadvm_section_part_end (f=0x559681d02b10,
22
mis=0x559680fb4a30) at ../migration/savevm.c:2473
23
#7 qemu_loadvm_state_main (f=0x559681d02b10, mis=0x559680fb4a30)
24
at ../migration/savevm.c:2626
25
#8 postcopy_ram_listen_thread (opaque=0x0)
26
at ../migration/savevm.c:1871
27
#9 qemu_thread_start (args=0x5596817ccd10)
28
at ../util/qemu-thread-posix.c:521
29
#10 start_thread () at /lib64/libpthread.so.0
30
#11 clone () at /lib64/libc.so.6
31
32
Note bs pointer taken from bitmap: it's definitely bad aligned. That's
33
because we are in use after free, bitmap is already freed.
34
35
So, let's make disabled bitmaps (being migrated) busy during incoming
36
migration.
37
38
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
8
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
39
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
40
Message-Id: <20210322094906.5079-2-vsementsov@virtuozzo.com>
9
---
41
---
10
MAINTAINERS | 2 +-
42
migration/block-dirty-bitmap.c | 6 ++++++
11
1 file changed, 1 insertion(+), 1 deletion(-)
43
1 file changed, 6 insertions(+)
12
44
13
diff --git a/MAINTAINERS b/MAINTAINERS
45
diff --git a/migration/block-dirty-bitmap.c b/migration/block-dirty-bitmap.c
14
index XXXXXXX..XXXXXXX 100644
46
index XXXXXXX..XXXXXXX 100644
15
--- a/MAINTAINERS
47
--- a/migration/block-dirty-bitmap.c
16
+++ b/MAINTAINERS
48
+++ b/migration/block-dirty-bitmap.c
17
@@ -XXX,XX +XXX,XX @@ F: tests/image-fuzzer/
49
@@ -XXX,XX +XXX,XX @@ static int dirty_bitmap_load_start(QEMUFile *f, DBMLoadState *s)
18
50
error_report_err(local_err);
19
Replication
51
return -EINVAL;
20
M: Wen Congyang <wencongyang2@huawei.com>
52
}
21
-M: Changlong Xie <xiecl.fnst@cn.fujitsu.com>
53
+ } else {
22
+M: Xie Changlong <xiechanglong.d@gmail.com>
54
+ bdrv_dirty_bitmap_set_busy(s->bitmap, true);
23
S: Supported
55
}
24
F: replication*
56
25
F: block/replication.c
57
b = g_new(LoadBitmapState, 1);
58
@@ -XXX,XX +XXX,XX @@ static void cancel_incoming_locked(DBMLoadState *s)
59
assert(!s->before_vm_start_handled || !b->migrated);
60
if (bdrv_dirty_bitmap_has_successor(b->bitmap)) {
61
bdrv_reclaim_dirty_bitmap(b->bitmap, &error_abort);
62
+ } else {
63
+ bdrv_dirty_bitmap_set_busy(b->bitmap, false);
64
}
65
bdrv_release_dirty_bitmap(b->bitmap);
66
}
67
@@ -XXX,XX +XXX,XX @@ static void dirty_bitmap_load_complete(QEMUFile *f, DBMLoadState *s)
68
69
if (bdrv_dirty_bitmap_has_successor(s->bitmap)) {
70
bdrv_reclaim_dirty_bitmap(s->bitmap, &error_abort);
71
+ } else {
72
+ bdrv_dirty_bitmap_set_busy(s->bitmap, false);
73
}
74
75
for (item = s->bitmaps; item; item = g_slist_next(item)) {
26
--
76
--
27
2.9.3
77
2.30.2
28
78
29
diff view generated by jsdifflib
1
From: Changlong Xie <xiecl.fnst@cn.fujitsu.com>
1
From: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
2
2
3
So he can get CC'ed on future patches and bugs for this feature
3
Check that we can't remove bitmaps being migrated on destination vm.
4
The new check proves that previous commit helps.
4
5
5
Signed-off-by: Changlong Xie <xiecl.fnst@cn.fujitsu.com>
6
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
6
Message-id: 1492484893-23435-1-git-send-email-xiecl.fnst@cn.fujitsu.com
7
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
7
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
8
Message-Id: <20210322094906.5079-3-vsementsov@virtuozzo.com>
8
---
9
---
9
MAINTAINERS | 2 +-
10
tests/qemu-iotests/tests/migrate-bitmaps-postcopy-test | 10 ++++++++++
10
1 file changed, 1 insertion(+), 1 deletion(-)
11
1 file changed, 10 insertions(+)
11
12
12
diff --git a/MAINTAINERS b/MAINTAINERS
13
diff --git a/tests/qemu-iotests/tests/migrate-bitmaps-postcopy-test b/tests/qemu-iotests/tests/migrate-bitmaps-postcopy-test
13
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100755
14
--- a/MAINTAINERS
15
--- a/tests/qemu-iotests/tests/migrate-bitmaps-postcopy-test
15
+++ b/MAINTAINERS
16
+++ b/tests/qemu-iotests/tests/migrate-bitmaps-postcopy-test
16
@@ -XXX,XX +XXX,XX @@ S: Supported
17
@@ -XXX,XX +XXX,XX @@ class TestDirtyBitmapPostcopyMigration(iotests.QMPTestCase):
17
F: tests/image-fuzzer/
18
self.start_postcopy()
18
19
19
Replication
20
self.vm_b_events += self.vm_b.get_qmp_events()
20
-M: Wen Congyang <wency@cn.fujitsu.com>
21
+
21
+M: Wen Congyang <wencongyang2@huawei.com>
22
+ # While being here, let's check that we can't remove in-flight bitmaps.
22
M: Changlong Xie <xiecl.fnst@cn.fujitsu.com>
23
+ for vm in (self.vm_a, self.vm_b):
23
S: Supported
24
+ for i in range(0, nb_bitmaps):
24
F: replication*
25
+ result = vm.qmp('block-dirty-bitmap-remove', node='drive0',
26
+ name=f'bitmap{i}')
27
+ self.assert_qmp(result, 'error/desc',
28
+ f"Bitmap 'bitmap{i}' is currently in use by "
29
+ "another operation and cannot be used")
30
+
31
self.vm_b.shutdown()
32
# recreate vm_b, so there is no incoming option, which prevents
33
# loading bitmaps from disk
25
--
34
--
26
2.9.3
35
2.30.2
27
36
28
diff view generated by jsdifflib