51232e2e40
The type for the copy-before-write timeout in nanoseconds was wrong. By being just uint32_t, a maximum of slightly over 4 seconds was possible. Larger values would overflow and thus the 45 seconds set by Proxmox's backup with fleecing, resulted in effectively 2 seconds timeout for copy-before-write operations. Reported-by: Friedrich Weber <f.weber@proxmox.com> Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
56 lines
2.3 KiB
Diff
56 lines
2.3 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru>
|
|
Date: Thu, 11 Apr 2024 11:29:22 +0200
|
|
Subject: [PATCH] block/copy-before-write: fix permission
|
|
|
|
In case when source node does not have any parents, the condition still
|
|
works as required: backup job do create the parent by
|
|
|
|
block_job_create -> block_job_add_bdrv -> bdrv_root_attach_child
|
|
|
|
Still, in this case checking @perm variable doesn't work, as backup job
|
|
creates the root blk with empty permissions (as it rely on CBW filter
|
|
to require correct permissions and don't want to create extra
|
|
conflicts).
|
|
|
|
So, we should not check @perm.
|
|
|
|
The hack may be dropped entirely when transactional insertion of
|
|
filter (when we don't try to recalculate permissions in intermediate
|
|
state, when filter does conflict with original parent of the source
|
|
node) merged (old big series
|
|
"[PATCH v5 00/45] Transactional block-graph modifying API"[1] and it's
|
|
current in-flight part is "[PATCH v8 0/7] blockdev-replace"[2])
|
|
|
|
[1] https://patchew.org/QEMU/20220330212902.590099-1-vsementsov@openvz.org/
|
|
[2] https://patchew.org/QEMU/20231017184444.932733-1-vsementsov@yandex-team.ru/
|
|
|
|
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru>
|
|
Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
|
|
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
|
---
|
|
block/copy-before-write.c | 10 +++++++---
|
|
1 file changed, 7 insertions(+), 3 deletions(-)
|
|
|
|
diff --git a/block/copy-before-write.c b/block/copy-before-write.c
|
|
index 026fa9840f..5a9456d426 100644
|
|
--- a/block/copy-before-write.c
|
|
+++ b/block/copy-before-write.c
|
|
@@ -364,9 +364,13 @@ cbw_child_perm(BlockDriverState *bs, BdrvChild *c, BdrvChildRole role,
|
|
perm, shared, nperm, nshared);
|
|
|
|
if (!QLIST_EMPTY(&bs->parents)) {
|
|
- if (perm & BLK_PERM_WRITE) {
|
|
- *nperm = *nperm | BLK_PERM_CONSISTENT_READ;
|
|
- }
|
|
+ /*
|
|
+ * Note, that source child may be shared with backup job. Backup job
|
|
+ * does create own blk parent on copy-before-write node, so this
|
|
+ * works even if source node does not have any parents before backup
|
|
+ * start
|
|
+ */
|
|
+ *nperm = *nperm | BLK_PERM_CONSISTENT_READ;
|
|
*nshared &= ~(BLK_PERM_WRITE | BLK_PERM_RESIZE);
|
|
}
|
|
}
|