[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