* [pve-devel] [RFC qemu-server] clone disk: fix handling of snapshot-as-volume-chain for EFI disks
@ 2025-11-07 17:17 Friedrich Weber
0 siblings, 0 replies; only message in thread
From: Friedrich Weber @ 2025-11-07 17:17 UTC (permalink / raw)
To: pve-devel
Currently, cloning an EFI disk off a snapshot-as-volume-chain snapshot
fails with "qemu-img: Failed to load snapshot: Can't find snapshot".
The reason is that the special case for EFI disks calls `qemu-img dd`
with the additional `-l snapname` option, which is only valid for
qcow2-internal snapshots. For snapshot-as-volume-chain snapshots, the
source volume is already the volume corresponding to the snapshot.
Fix this by checking whether the snapshot in question is an external
snapshot, and if it is, omitting the `-l` option.
Reported in enterprise support.
Signed-off-by: Friedrich Weber <f.weber@proxmox.com>
---
Notes:
I noticed that two oddities about volume_snapshot_info:
- it doesn't seem to work for qcow2-internal snapshots: It assumes
that if `qemu img info` returns a JSON object, the snapshots are
internal, and if it returns a JSON array, they are "external", but
this doesn't seem correct -- I think because we pass
--backing-chain, qemu-img will return an one-element JSON array even
for internal snapshots. Hence, volume_snapshot_info incorrectly
returns a hash ref with only a single member "current" if the
snapshots are internal. But since I only found callsites guarded
with snapshot-as-volume-chain, I guess this didn't hurt until now?
It doesn't hurt for my patch either because it only checks for
existence of $info->{$snapshot}->{ext} (which also works for
qcow2-internal snapshots, because alreay $info->{$snapshot} will not
exist then), but that's admittedly not nice and it's probably a good
idea to fix volume_snapshot_info in addition.
- but in which way should we fix it? Right now, for volume-chain
snapshots, it seems like volume_snapshot_info will always have a
member "current" pointing to the "actual" volume, even if the volume
doesn't have any snapshots. Is this intended and do we want this
also in case of qcow2-internal snapshots? From reading
ZFSPoolPlugin::volume_snapshot_info, it looks like that one will
return an empty hash (without "current") if the volume has no
snapshots.
src/PVE/QemuServer.pm | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/src/PVE/QemuServer.pm b/src/PVE/QemuServer.pm
index cf195ccc..4cd7af52 100644
--- a/src/PVE/QemuServer.pm
+++ b/src/PVE/QemuServer.pm
@@ -7868,7 +7868,9 @@ sub clone_disk {
if ($src_format eq 'qcow2' && $snapname) {
die "cannot clone qcow2 EFI disk snapshot - requires QEMU >= 6.2\n"
if !min_version(kvm_user_version(), 6, 2);
- push $cmd->@*, '-l', $snapname;
+ my $snapshot_info =
+ PVE::Storage::volume_snapshot_info($storecfg, $drive->{file});
+ push $cmd->@*, '-l', $snapname if !$snapshot_info->{$snapname}->{ext};
}
push $cmd->@*, "bs=$bs", "osize=$size", "if=$src_path", "of=$dst_path";
run_command($cmd);
--
2.47.3
_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2025-11-07 17:19 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-11-07 17:17 [pve-devel] [RFC qemu-server] clone disk: fix handling of snapshot-as-volume-chain for EFI disks Friedrich Weber
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.