From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) by lore.proxmox.com (Postfix) with ESMTPS id A9C0F1FF183 for ; Wed, 3 Dec 2025 14:31:45 +0100 (CET) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 8CEA8A406; Wed, 3 Dec 2025 14:30:35 +0100 (CET) From: Fiona Ebner To: pve-devel@lists.proxmox.com Date: Wed, 3 Dec 2025 14:26:43 +0100 Message-ID: <20251203132949.109685-18-f.ebner@proxmox.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20251203132949.109685-1-f.ebner@proxmox.com> References: <20251203132949.109685-1-f.ebner@proxmox.com> MIME-Version: 1.0 X-Bm-Milter-Handled: 55990f41-d878-4baa-be0a-ee34c49e34d2 X-Bm-Transport-Timestamp: 1764768549369 X-SPAM-LEVEL: Spam detection results: 0 AWL -0.017 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 Subject: [pve-devel] [PATCH qemu-server 17/18] snapshot: support 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" Adds a new drive_qmp_peer() helper to determine whether the drive is managed by the QEMU instance or QSD instance for the VM. Signed-off-by: Fiona Ebner --- src/PVE/QemuServer.pm | 30 +++++++++++++----------------- src/PVE/QemuServer/Drive.pm | 8 ++++++++ 2 files changed, 21 insertions(+), 17 deletions(-) diff --git a/src/PVE/QemuServer.pm b/src/PVE/QemuServer.pm index d021dac6..5f2b05ca 100644 --- a/src/PVE/QemuServer.pm +++ b/src/PVE/QemuServer.pm @@ -83,7 +83,7 @@ use PVE::QemuServer::DriveDevice qw(print_drivedevice_full scsihw_infos); use PVE::QemuServer::Machine; use PVE::QemuServer::Memory qw(get_current_memory); use PVE::QemuServer::MetaInfo; -use PVE::QemuServer::Monitor qw(mon_cmd vm_qmp_peer); +use PVE::QemuServer::Monitor qw(mon_cmd qmp_cmd vm_qmp_peer); use PVE::QemuServer::Network; use PVE::QemuServer::OVMF; use PVE::QemuServer::PCI qw(print_pci_addr print_pcie_addr print_pcie_root_port parse_hostpci); @@ -4368,7 +4368,8 @@ sub qemu_volume_snapshot { if ($do_snapshots_type eq 'internal') { print "internal qemu snapshot\n"; - mon_cmd($vmid, 'blockdev-snapshot-internal-sync', device => $deviceid, name => $snap); + my $qmp_peer = PVE::QemuServer::Drive::drive_qmp_peer($storecfg, $vmid, $drive); + qmp_cmd($qmp_peer, 'blockdev-snapshot-internal-sync', device => $deviceid, name => $snap); } elsif ($do_snapshots_type eq 'external') { my $machine_version = PVE::QemuServer::Machine::get_current_qemu_machine($vmid); if (!PVE::QemuServer::Machine::is_machine_version_at_least($machine_version, 10, 0)) { @@ -4381,14 +4382,9 @@ sub qemu_volume_snapshot { print "external qemu snapshot\n"; my $snapshots = PVE::Storage::volume_snapshot_info($storecfg, $volid); my $parent_snap = $snapshots->{'current'}->{parent}; + my $qmp_peer = PVE::QemuServer::Drive::drive_qmp_peer($storecfg, $vmid, $drive); PVE::QemuServer::Blockdev::blockdev_external_snapshot( - $storecfg, - vm_qmp_peer($vmid), - $machine_version, - $deviceid, - $drive, - $snap, - $parent_snap, + $storecfg, $qmp_peer, $machine_version, $deviceid, $drive, $snap, $parent_snap, ); } elsif ($do_snapshots_type eq 'storage') { PVE::Storage::volume_snapshot($storecfg, $volid, $snap); @@ -4416,8 +4412,9 @@ sub qemu_volume_snapshot_delete { my $do_snapshots_type = do_snapshots_type($storecfg, $volid, $attached_deviceid, $running); if ($do_snapshots_type eq 'internal') { - mon_cmd( - $vmid, + my $qmp_peer = PVE::QemuServer::Drive::drive_qmp_peer($storecfg, $vmid, $drive); + qmp_cmd( + $qmp_peer, 'blockdev-snapshot-delete-internal-sync', device => $attached_deviceid, name => $snap, @@ -4441,13 +4438,15 @@ sub qemu_volume_snapshot_delete { my $parentsnap = $snapshots->{$snap}->{parent}; my $childsnap = $snapshots->{$snap}->{child}; + my $qmp_peer = PVE::QemuServer::Drive::drive_qmp_peer($storecfg, $vmid, $drive); + # if we delete the first snasphot, we commit because the first snapshot original base image, it should be big. # improve-me: if firstsnap > child : commit, if firstsnap < child do a stream. if (!$parentsnap) { print "delete first snapshot $snap\n"; PVE::QemuServer::Blockdev::blockdev_commit( $storecfg, - vm_qmp_peer($vmid), + $qmp_peer, $machine_version, $attached_deviceid, $drive, @@ -4459,7 +4458,7 @@ sub qemu_volume_snapshot_delete { PVE::QemuServer::Blockdev::blockdev_replace( $storecfg, - vm_qmp_peer($vmid), + $qmp_peer, $machine_version, $attached_deviceid, $drive, @@ -4472,7 +4471,7 @@ sub qemu_volume_snapshot_delete { print "stream intermediate snapshot $snap to $childsnap\n"; PVE::QemuServer::Blockdev::blockdev_stream( $storecfg, - vm_qmp_peer($vmid), + $qmp_peer, $machine_version, $attached_deviceid, $drive, @@ -7771,9 +7770,6 @@ sub restore_tar_archive { sub do_snapshots_type { my ($storecfg, $volid, $deviceid, $running) = @_; - #always use storage snapshot for tpmstate - return 'storage' if $deviceid && $deviceid =~ m/tpmstate0/; - #we use storage snapshot if vm is not running or if disk is unused; return 'storage' if !$running || !$deviceid; diff --git a/src/PVE/QemuServer/Drive.pm b/src/PVE/QemuServer/Drive.pm index 912c2b47..8c3f212a 100644 --- a/src/PVE/QemuServer/Drive.pm +++ b/src/PVE/QemuServer/Drive.pm @@ -13,6 +13,8 @@ use PVE::Storage; use PVE::Storage::Common; use PVE::JSONSchema qw(get_standard_option); +use PVE::QemuServer::Monitor qw(qsd_peer vm_qmp_peer); + use base qw(Exporter); our @EXPORT_OK = qw( @@ -1161,4 +1163,10 @@ sub drive_uses_qsd_fuse { return; } +sub drive_qmp_peer { + my ($storecfg, $vmid, $drive) = @_; + + return drive_uses_qsd_fuse($storecfg, $drive) ? qsd_peer($vmid) : vm_qmp_peer($vmid); +} + 1; -- 2.47.3 _______________________________________________ pve-devel mailing list pve-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel