[Devel] [PATCH hci-8.1 v2 0/3] dm-qcow2: fix merges not stopping the users of the images they change
Andrey Zhadchenko
andrey.zhadchenko at virtuozzo.com
Wed Nov 4 16:15:52 MSK 2026
Reviewed-by: Andrey Zhadchenko <andrey.zhadchenko at virtuozzo.com>
On 11/3/26 10:08, Denis V. Lunev wrote:
> Checking dm-qcow2 for the same problem showed that a merge does not
> stop everything using the images it changes (VSTOR-153049,
> VSTOR-153050):
>
> - a backward merge of an inner image pauses that image, while reads
> enter through the top one. A read reaching the inner image as the
> merge starts oopses on a NULL qio->ext (patch 2);
>
> - SEEK_HOLE/SEEK_DATA walks the images with nothing keeping them
> alive, so merge_backward complete frees an image under the walk
> (patch 3).
>
> Patch 1 (VSTOR-153051) is the counterpart of dm-ploop patch 4, an
> error path leaving state behind: after a failed refcount table
> relocation, allocating writes past the old refcount coverage fail with
> EIO until the device is suspended and resumed.
>
> The series does not depend on the dm-ploop one.
>
> Tested on dev-cl04, stock 6.12.0-211.52.1.22.11.vz10, dm-qcow2 built
> out of tree, with a test-only kprobe module widening the windows:
> - on the stock module, with 4K clusters and refcount_bits=64 so the
> reftable relocates at 1G, a failed md page insert left every later
> write past 1G failing with EIO; a seek went on with an image
> qcow2_destroy() had freed; an intermediate merge oopsed in
> submit_read_sliced_clu(). None of them reproduce with the series;
> - the ploop pytest suite, qcow2 format, passes.
>
> Changes in v2, after Sashiko's review:
> - 1/3: a note in the commit message on why the error path does not
> unlink the pages from the writeback lists;
> - 3/3: guard the walk with a per-target rw_semaphore, taken for write
> by merge_backward complete, instead of an inflight ref held over the
> walk. With the ref every inflight ref switch waited for the whole
> scan, including the one starting a backward merge with the top image
> paused, so guest I/O stalled for as long as the scan ran.
> The seek reproducer and the qcow2 pytest suite were rerun on v2: a
> merge now starts while a seek is held, and merge_backward complete
> waits for the seek to finish before destroying the image.
>
> v1: http://lore.virtuozzo.com/kernel/20261103083708.131379-1-den@openvz.org/
>
> Denis V. Lunev (3):
> dm-qcow2: fix a failed refcount table relocation leaking md pages
> dm-qcow2: fix backward merge of an inner image racing its reads
> dm-qcow2: fix SEEK_HOLE/SEEK_DATA using an image freed by a merge
>
> drivers/md/dm-qcow2-cmd.c | 28 ++++++++++++----------------
> drivers/md/dm-qcow2-map.c | 18 +++++++++++++-----
> drivers/md/dm-qcow2-target.c | 1 +
> drivers/md/dm-qcow2.h | 2 ++
> 4 files changed, 28 insertions(+), 21 deletions(-)
>
>
> base-commit: 09eb9a82fe872048d082391415d1cdeda2ac6879
More information about the Devel
mailing list