From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from gate001.proxmox.com (gate001.proxmox.com [45.144.208.40]) by lore.proxmox.com (Postfix) with ESMTPS id 590E51FF0AA for ; Tue, 06 Oct 2026 10:53:03 +0200 (CEST) Received: from gate001.proxmox.com (localhost.localdomain [127.0.0.1]) by gate001.proxmox.com (Proxmox) with ESMTP id 2F488214CA; Tue, 06 Oct 2026 10:53:01 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dualfroz.com; s=dkim; t=1791276775; h=from:subject:date:message-id:to:mime-version: content-transfer-encoding; bh=6Za8O9J0rDUmNcmbX9YjfUg+k0YMr2fxIPY6SWYbUUE=; b=fXJt9nuTD8pAXZ7jCxGe6dn1OsKVUH0rLJf6EmY6S3tfSGcVTdhJjbVICvJAygAIPZzLy1 hN9jjb1Zs1YMnK/An+DWEgSizRtlByOTkKGKgnBn4vjQIVK3fz3AZc6bZfdjzTL3fU4HrL t+712PNvNSMy6SMp7BayllMwTYstUkU+4RmspvkQrhmcSavehRObNk0ekSSnCZ5VKuAB9m mgyNJFiwCDJD7BHi7l9XBr2xLtFcjZxqryAEMRZL4N+Ny1DJrzJuR3kQZLkBDzX5Hf6zeO mT5Sa4WKZ5EowGtfdXOtAi5wV+mbu4wacmQVaiX9QeksUJZH/y5UulRniy6RxQ== From: Michal Fox To: pve-devel@lists.proxmox.com Subject: [PATCH qemu-server] fix #4012: migrate: mention snapshots referencing a local ISO image Date: Tue, 6 Oct 2026 08:52:53 +0000 Message-ID: <20261006085253.7-1-me@dualfroz.com> X-Mailer: git-send-email 2.47.3 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Last-TLS-Session-Version: TLSv1.3 X-SPAM-LEVEL: Spam detection results: 0 AWL 0.145 Adjusted score from AWL reputation of From: address DKIM_SIGNED 0.1 Message has a DKIM or DK signature, not necessarily valid DKIM_VALID -0.1 Message has at least one valid DKIM or DK signature DKIM_VALID_AU -0.1 Message has a valid DKIM or DK signature from author's domain DKIM_VALID_EF -0.1 Message has a valid DKIM or DK signature from envelope-from domain DMARC_PASS -0.1 DMARC pass policy SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record Message-ID-Hash: AE2GORDPQOMZIKPAMNYSTOQGXORP65JO X-Message-ID-Hash: AE2GORDPQOMZIKPAMNYSTOQGXORP65JO X-MailFrom: me@dualfroz.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header X-Mailman-Version: 3.3.10 Precedence: list List-Id: Proxmox VE development discussion List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: When a VM has no local ISO image attached anymore, but one of its snapshots still references it, migration fails with: can't migrate local disk 'local:iso/debian.iso': local cdrom image which does not tell where the image is coming from, since it is not visible in the current configuration of the VM. Add the names of the snapshots referencing the image to the error in that case, like it is already done for a physical CD/DVD drive. The check for the physical drive now reuses the same hint. Signed-off-by: Michal Fox --- Tested with a new migration test for an ISO image on local storage that is only referenced in a snapshot. Without the fix, the error does not contain the snapshot name. The whole qemu-server test suite passes. The test needed the ISO in the mocked volume list and 'iso' content on the mocked 'local' storage. The GUI still only shows 'Cannot migrate VM with local CD/DVD' in that case, which could be done as a follow-up in pve-manager. src/PVE/QemuMigrate.pm | 14 ++++----- src/test/run_qemu_migrate_tests.pl | 47 ++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 7 deletions(-) diff --git a/src/PVE/QemuMigrate.pm b/src/PVE/QemuMigrate.pm index 8da6f15d..a9b69898 100644 --- a/src/PVE/QemuMigrate.pm +++ b/src/PVE/QemuMigrate.pm @@ -412,15 +412,15 @@ sub scan_local_volumes { } my $snaprefs = $attr->{referenced_in_snapshot}; + my $snapshot_hint = ''; + if (defined($snaprefs) && !$attr->{is_attached}) { + my $snapnames = join(', ', sort keys %$snaprefs); + $snapshot_hint = " (referenced in snapshot - $snapnames)"; + } if ($attr->{cdrom}) { if ($volid eq 'cdrom') { - my $msg = "can't migrate local cdrom drive"; - if (defined($snaprefs) && !$attr->{is_attached}) { - my $snapnames = join(', ', sort keys %$snaprefs); - $msg .= " (referenced in snapshot - $snapnames)"; - } - &$log_error("$msg\n"); + &$log_error("can't migrate local cdrom drive$snapshot_hint\n"); return; } return if $volid eq 'none'; @@ -475,7 +475,7 @@ sub scan_local_volumes { $local_volumes->{$volid}->{ref} = 'generated'; return; } - die "local cdrom image\n"; + die "local cdrom image$snapshot_hint\n"; } my ($path, $owner) = PVE::Storage::path($storecfg, $volid); diff --git a/src/test/run_qemu_migrate_tests.pl b/src/test/run_qemu_migrate_tests.pl index 05eed1d9..49248ed9 100755 --- a/src/test/run_qemu_migrate_tests.pl +++ b/src/test/run_qemu_migrate_tests.pl @@ -37,6 +37,7 @@ my $storage_config = { local => { content => { images => 1, + iso => 1, }, path => "/var/lib/vz", type => "dir", @@ -346,6 +347,17 @@ my $source_vdisks = { 'volid' => 'local-dir:4567/vm-4567-state-snap2.raw', }, ], + 'local' => [ + { + 'ctime' => 1589439681, + 'format' => 'iso', + 'parent' => undef, + 'size' => 663748608, + 'used' => 663748608, + 'vmid' => '0', + 'volid' => 'local:iso/debian.iso', + }, + ], 'local-lvm' => [ { 'ctime' => '1589277334', @@ -1236,6 +1248,41 @@ my $tests = [ }, }, }, + { + name => '105_local_iso_in_snapshot', + target => 'pve1', + vmid => 105, + vm_status => { + running => 0, + }, + config_patch => { + snapshots => { + ohsnap => { + ide2 => 'local:iso/debian.iso,media=cdrom', + }, + }, + }, + expected_calls => {}, + expect_die => + "can't migrate local disk 'local:iso/debian.iso': local cdrom image (referenced in snapshot - ohsnap)", + expected => { + source_volids => local_volids_for_vm(105), + target_volids => {}, + vm_config => get_patched_config( + 105, + { + snapshots => { + ohsnap => { + ide2 => 'local:iso/debian.iso,media=cdrom', + }, + }, + }, + ), + vm_status => { + running => 0, + }, + }, + }, { name => '105_cdrom', target => 'pve1', -- 2.43.0