From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from gate001.proxmox.com (gate001.proxmox.com [IPv6:2a0f:8001:1:32::40]) by lore.proxmox.com (Postfix) with ESMTPS id 5A2321FF138 for ; Mon, 29 Jun 2026 16:04:53 +0200 (CEST) Received: from gate001.proxmox.com (localhost.localdomain [127.0.0.1]) by gate001.proxmox.com (Proxmox) with ESMTP id CF6EB21443; Mon, 29 Jun 2026 16:04:47 +0200 (CEST) From: =?UTF-8?q?Michael=20K=C3=B6ppl?= To: pve-devel@lists.proxmox.com Subject: [PATCH container v9 06/10] add linked clone check when destroying container template Date: Mon, 29 Jun 2026 16:04:35 +0200 Message-ID: <20260629140439.184878-7-m.koeppl@proxmox.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260629140439.184878-1-m.koeppl@proxmox.com> References: <20260629140439.184878-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: 1782741871631 X-SPAM-LEVEL: Spam detection results: 0 AWL 0.089 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% DMARC_MISSING 0.1 Missing DMARC policy KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment 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: AKNJCPLORDRBZZYFQ4GBEPVZ5E7UX2KW X-Message-ID-Hash: AKNJCPLORDRBZZYFQ4GBEPVZ5E7UX2KW 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 no 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 | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/PVE/LXC.pm b/src/PVE/LXC.pm index e76da29f..c9f3cba7 100644 --- a/src/PVE/LXC.pm +++ b/src/PVE/LXC.pm @@ -1024,6 +1024,25 @@ 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) }; + PVE::RESTEnvironment::log_warn( + "failed to check if volume '$volid' is used by linked clones: $@") + if $@; + die "base volume '$volid' is still in use by linked clone\n" if $result; + }, + ); + } + my $remove_volume = sub { my ($ms, $mountpoint) = @_; -- 2.47.3