[Devel] [PATCH hci-8.1 v9 05/10] dm-qcow2: flush lower metadata before clearing its dirty bit on merge failure

Alexander Ivanov alexander.ivanov at virtuozzo.com
Wed Oct 28 18:06:40 MSK 2026


When qcow2_merge_common() fails, qcow2_merge_backward_work() clears the
dirty bit of the lower image right away. qcow2_service_iter() waits only
for the service qios, so delayed md writeback of the lower image may
still be pending. With kernel_sets_dirty_bit, a crash at that point
leaves the lower image marked clean on disk with L2 tables and refblocks
that lag behind the merged data.

A failed md writeback of the lower image is also missed:
md_writeback_error is set only by qcow2_flush_deferred_activity(), so
the next resume is not refused.

Flush the deferred activity of the lower image before writing its
header, as qcow2_merge_backward_complete() does.

https://virtuozzo.atlassian.net/browse/VSTOR-148171
Feature: dm-qcow2: block device over QCOW2 files driver
Signed-off-by: Alexander Ivanov <alexander.ivanov at virtuozzo.com>
---
 drivers/md/dm-qcow2-cmd.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/md/dm-qcow2-cmd.c b/drivers/md/dm-qcow2-cmd.c
index 2865940cff30..28c2166fd47a 100644
--- a/drivers/md/dm-qcow2-cmd.c
+++ b/drivers/md/dm-qcow2-cmd.c
@@ -338,6 +338,7 @@ void qcow2_merge_backward_work(struct work_struct *work)
 	ret = qcow2_merge_common(tgt, qcow2);
 	if (ret) {
 		set_backward_merge_in_process(tgt, qcow2, false);
+		qcow2_flush_deferred_activity(tgt, lower);
 		ret2 = qcow2_set_image_file_features(lower, false);
 		if (ret2 < 0)
 			QC_ERR(tgt->ti, "Can't unuse lower (%d)", ret2);
-- 
2.53.0



More information about the Devel mailing list