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 2680F1FF13E for ; Wed, 01 Jul 2026 16:14:44 +0200 (CEST) Received: from gate001.proxmox.com (localhost.localdomain [127.0.0.1]) by gate001.proxmox.com (Proxmox) with ESMTP id 4E95221483; Wed, 01 Jul 2026 16:14:15 +0200 (CEST) From: =?UTF-8?q?Michael=20K=C3=B6ppl?= To: pve-devel@lists.proxmox.com Subject: [PATCH container v10 06/10] destroy template: add early check for linked clones of volumes Date: Wed, 1 Jul 2026 16:13:35 +0200 Message-ID: <20260701141339.181276-7-m.koeppl@proxmox.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260701141339.181276-1-m.koeppl@proxmox.com> References: <20260701141339.181276-1-m.koeppl@proxmox.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Bm-Milter-Handled: 55990f41-d878-4baa-be0a-ee34c49e34d2 X-Bm-Transport-Timestamp: 1782915215873 X-SPAM-LEVEL: Spam detection results: 0 AWL 0.000 Adjusted score from AWL reputation of From: address DMARC_MISSING 0.1 Missing DMARC policy KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment (newer systems) 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: PMZZWI3KGM35UVG3KLF5ZPBUAZ5DVE6Z X-Message-ID-Hash: PMZZWI3KGM35UVG3KLF5ZPBUAZ5DVE6Z X-MailFrom: m.koeppl@proxmox.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: This check matches the behavior already implemented for VMs and prevents partial storage deletion if a container template has a linked clone. In such cases, the destruction of the container template will now fail, informing the user that the base volume is still in use by the linked clone. In case of a storage error (such as the underlying storage not existing anymore), a warning will be printed and execution continues, mimicking the handling of storage errors in later stages of destroy_lxc_container(). Originally-by: Stefan Hrdlicka [ MK: use classify_mountpoint instead of pattern matching display warning for storage errors during linked clone check resolve style nit ] Signed-off-by: Michael Köppl --- src/PVE/LXC.pm | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/PVE/LXC.pm b/src/PVE/LXC.pm index e76da29f..3d217f24 100644 --- a/src/PVE/LXC.pm +++ b/src/PVE/LXC.pm @@ -1024,6 +1024,28 @@ sub destroy_lxc_container { my ($storage_cfg, $vmid, $conf, $replacement_conf, $purge_unreferenced) = @_; my $volids = {}; + + if ($conf->{template}) { + PVE::LXC::Config->foreach_volume_full( + $conf, + { include_unused => 1 }, + sub { + my ($ms, $mountpoint) = @_; + my $volid = $mountpoint->{volume}; + return if !$volid || PVE::LXC::Config->classify_mountpoint($volid) ne 'volume'; + my $result = + eval { PVE::Storage::volume_is_base_and_used($storage_cfg, $volid) }; + if ($@) { + # early check, removal of volume will fail later anyway, so warning here is fine + PVE::RESTEnvironment::log_warn( + "failed to check if volume '$volid' is used by linked clones: $@"); + } + + die "base volume '$volid' is still in use by linked clone\n" if $result; + }, + ); + } + my $remove_volume = sub { my ($ms, $mountpoint) = @_; -- 2.47.3