All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] block/mirror: check range when setting zero bitmap for sync write
@ 2026-01-12 15:23 Fiona Ebner
  2026-01-19 15:28 ` Vladimir Sementsov-Ogievskiy
  2026-01-19 20:10 ` [PATCH] block/mirror: check range when setting zero bitmap for sync write Stefan Hajnoczi
  0 siblings, 2 replies; 7+ messages in thread
From: Fiona Ebner @ 2026-01-12 15:23 UTC (permalink / raw)
  To: qemu-devel
  Cc: qemu-block, hreitz, kwolf, stefanha, jsnow, vsementsov,
	qemu-stable, eblake

Some Proxmox users reported an occasional assertion failure [0][1] in
busy VMs when using drive mirror with active mode. In particular, the
failure may occur for zero writes shorter than the job granularity:

> #0  0x00007b421154b507 in abort ()
> #1  0x00007b421154b420 in ?? ()
> #2  0x0000641c582e061f in bitmap_set (map=0x7b4204014e00, start=14, nr=-1)
> #3  0x0000641c58062824 in do_sync_target_write (job=0x641c7e73d1e0,
>       method=MIRROR_METHOD_ZERO, offset=852480, bytes=4096, qiov=0x0, flags=0)
> #4  0x0000641c58062250 in bdrv_mirror_top_do_write (bs=0x641c7e62e1f0,
        method=MIRROR_METHOD_ZERO, copy_to_target=true, offset=852480,
        bytes=4096, qiov=0x0, flags=0)
> #5  0x0000641c58061f31 in bdrv_mirror_top_pwrite_zeroes (bs=0x641c7e62e1f0,
        offset=852480, bytes=4096, flags=0)

The range for the dirty bitmap described by dirty_bitmap_offset and
dirty_bitmap_end is narrower than the original range and in fact,
dirty_bitmap_end might be smaller than dirty_bitmap_offset. There
already is a check for 'dirty_bitmap_offset < dirty_bitmap_end' before
resetting the dirty bitmap. Add such a check for setting the zero
bitmap too, which uses the same narrower range.

[0]: https://forum.proxmox.com/threads/177981/
[1]: https://bugzilla.proxmox.com/show_bug.cgi?id=7222

Cc: qemu-stable@nongnu.org
Fixes: 7e277545b9 ("mirror: Skip writing zeroes when target is already zero")
Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
---
 block/mirror.c | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/block/mirror.c b/block/mirror.c
index b344182c74..bc982cb99a 100644
--- a/block/mirror.c
+++ b/block/mirror.c
@@ -1514,9 +1514,12 @@ do_sync_target_write(MirrorBlockJob *job, MirrorMethod method,
         assert(!qiov);
         ret = blk_co_pwrite_zeroes(job->target, offset, bytes, flags);
         if (job->zero_bitmap && ret >= 0) {
-            bitmap_set(job->zero_bitmap, dirty_bitmap_offset / job->granularity,
-                       (dirty_bitmap_end - dirty_bitmap_offset) /
-                       job->granularity);
+            if (dirty_bitmap_offset < dirty_bitmap_end) {
+                bitmap_set(job->zero_bitmap,
+                           dirty_bitmap_offset / job->granularity,
+                           (dirty_bitmap_end - dirty_bitmap_offset) /
+                           job->granularity);
+            }
         }
         break;
 
-- 
2.47.3




^ permalink raw reply related	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2026-01-21 19:20 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-01-12 15:23 [PATCH] block/mirror: check range when setting zero bitmap for sync write Fiona Ebner
2026-01-19 15:28 ` Vladimir Sementsov-Ogievskiy
2026-01-20 11:38   ` [PATCH] iotests: test active mirror with unaligned, small write zeroes op Fiona Ebner
2026-01-21  7:05     ` Vladimir Sementsov-Ogievskiy
2026-01-19 20:10 ` [PATCH] block/mirror: check range when setting zero bitmap for sync write Stefan Hajnoczi
2026-01-20  8:57   ` Fiona Ebner
2026-01-21 19:18     ` Stefan Hajnoczi

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.