From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [IPv6:2a01:7e0:0:424::9]) by lore.proxmox.com (Postfix) with ESMTPS id 7FEC41FF183 for ; Wed, 19 Nov 2025 12:59:31 +0100 (CET) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 56AFE54D4; Wed, 19 Nov 2025 12:59:34 +0100 (CET) From: Fiona Ebner To: pve-devel@lists.proxmox.com Date: Wed, 19 Nov 2025 12:59:09 +0100 Message-ID: <20251119115925.83971-1-f.ebner@proxmox.com> X-Mailer: git-send-email 2.47.3 MIME-Version: 1.0 X-Bm-Milter-Handled: 55990f41-d878-4baa-be0a-ee34c49e34d2 X-Bm-Transport-Timestamp: 1763553540757 X-SPAM-LEVEL: Spam detection results: 0 AWL -0.018 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 RCVD_IN_VALIDITY_CERTIFIED_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to Validity was blocked. See https://knowledge.validity.com/hc/en-us/articles/20961730681243 for more information. RCVD_IN_VALIDITY_RPBL_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to Validity was blocked. See https://knowledge.validity.com/hc/en-us/articles/20961730681243 for more information. RCVD_IN_VALIDITY_SAFE_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to Validity was blocked. See https://knowledge.validity.com/hc/en-us/articles/20961730681243 for more information. SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record Subject: [pve-devel] [PATCH qemu-server] snapshot: prohibit live snapshot (remove) of qcow2 TPM drive on storage with snapshot-as-volume-chain X-BeenThere: pve-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox VE development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: Proxmox VE development discussion Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: pve-devel-bounces@lists.proxmox.com Sender: "pve-devel" QSD and swtpm currently are not prepared for dealing with blockdev-replace and rename operations that snapshot or snapshot remove operations with a snapshot-as-volume-chain storage entail. Reported-by: Friedrich Weber Signed-off-by: Fiona Ebner --- src/PVE/API2/Qemu.pm | 52 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/src/PVE/API2/Qemu.pm b/src/PVE/API2/Qemu.pm index 5cdba4bb..c580bf63 100644 --- a/src/PVE/API2/Qemu.pm +++ b/src/PVE/API2/Qemu.pm @@ -726,6 +726,36 @@ my $check_cpu_model_access = sub { } }; +# TODO switch to doing internal snapshots only for TPM? Need a way to tell the storage. Also needs +# handling for pre-existing as-volume-chain snapshots then. Or is there a way to make QSD+swtpm +# compatible with using volume-chain live? +my sub assert_tpm_snapshot_compat { + my ($vmid, $conf, $op, $snap_conf) = @_; + + return if !$conf->{tpmstate0}; + return if !PVE::QemuServer::Helpers::vm_running_locally($vmid); + + my $drive = PVE::QemuServer::Drive::parse_drive('tpmstate0', $conf->{tpmstate0}); + my $volid = $drive->{file}; + my $storecfg = PVE::Storage::config(); + + if ($snap_conf) { + return if !$snap_conf->{tpmstate0}; + my $snap_drive = PVE::QemuServer::Drive::parse_drive('tpmstate0', $snap_conf->{tpmstate0}); + return if $volid ne $snap_drive->{file}; + } + + my $format = PVE::QemuServer::Drive::checked_volume_format($storecfg, $volid); + my ($storeid) = PVE::Storage::parse_volume_id($volid, 1); + if ($storeid && $format eq 'qcow2') { + my $scfg = PVE::Storage::storage_config($storecfg, $storeid); + if ($scfg && $scfg->{'snapshot-as-volume-chain'}) { + die "snapshot $op of TPM state '$volid' on storage with 'snapshot-as-volume-chain' is" + . " not yet supported while the VM is running.\n"; + } + } +} + my $cpuoptions = { 'cores' => 1, 'cpu' => 1, @@ -6040,6 +6070,14 @@ __PACKAGE__->register_method({ 0); my $realcmd = sub { + PVE::QemuConfig->lock_config( + $vmid, + sub { + my $conf = PVE::QemuConfig->load_config($vmid); + assert_tpm_snapshot_compat($vmid, $conf, 'create'); + }, + ); + PVE::Cluster::log_msg('info', $authuser, "snapshot VM $vmid: $snapname"); PVE::QemuConfig->snapshot_create( $vmid, $snapname, $param->{vmstate}, $param->{description}, @@ -6291,6 +6329,20 @@ __PACKAGE__->register_method({ my $lock_obtained; my $do_delete = sub { $lock_obtained = 1; + + PVE::QemuConfig->lock_config( + $vmid, + sub { + my $conf = PVE::QemuConfig->load_config($vmid); + assert_tpm_snapshot_compat( + $vmid, + $conf, + 'delete', + $conf->{snapshots}->{$snapname}, + ); + }, + ); + PVE::Cluster::log_msg('info', $authuser, "delete snapshot VM $vmid: $snapname"); PVE::QemuConfig->snapshot_delete($vmid, $snapname, $param->{force}); }; -- 2.47.3 _______________________________________________ pve-devel mailing list pve-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel