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 718F61FF2A0 for ; Fri, 24 Apr 2026 14:44:31 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 818F5170FE; Fri, 24 Apr 2026 13:48:26 +0200 (CEST) From: Fiona Ebner To: pve-devel@lists.proxmox.com Subject: [PATCH qemu-server v4 07/18] blockdev: switch get_node_name_below_throttle() to use QMP peer Date: Fri, 24 Apr 2026 13:46:41 +0200 Message-ID: <20260424114722.107671-8-f.ebner@proxmox.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260424114722.107671-1-f.ebner@proxmox.com> References: <20260424114722.107671-1-f.ebner@proxmox.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Bm-Milter-Handled: 55990f41-d878-4baa-be0a-ee34c49e34d2 X-Bm-Transport-Timestamp: 1777031164361 X-SPAM-LEVEL: Spam detection results: 0 AWL -0.992 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 KAM_MAILER 2 Automated Mailer Tag Left in Email 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: UCEMJFIUICKT5GVV4HU3JBCJEZORR62C X-Message-ID-Hash: UCEMJFIUICKT5GVV4HU3JBCJEZORR62C X-MailFrom: f.ebner@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: The get_block_info() function can only be used when the main QEMU instance is the QMP peer, because it gets the information from the front-end devices. In case of QSD, the relevant information can be obtained with the 'query-named-block-nodes' QMP command. Signed-off-by: Fiona Ebner Tested-by: Lukas Sichert --- Changes in v4: * Add include for vm_qmp_peer in BlockJob module. src/PVE/QemuServer.pm | 8 +++++--- src/PVE/QemuServer/BlockJob.pm | 4 ++-- src/PVE/QemuServer/Blockdev.pm | 20 +++++++++++++++----- src/PVE/QemuServer/VolumeChain.pm | 7 ++++--- 4 files changed, 26 insertions(+), 13 deletions(-) diff --git a/src/PVE/QemuServer.pm b/src/PVE/QemuServer.pm index 76f32894..eea5ac3b 100644 --- a/src/PVE/QemuServer.pm +++ b/src/PVE/QemuServer.pm @@ -7302,7 +7302,8 @@ sub pbs_live_restore { # removes itself once all backing images vanish with 'auto-remove=on') my $jobs = {}; for my $ds (sort keys %$restored_disks) { - my $node_name = PVE::QemuServer::Blockdev::get_node_name_below_throttle($vmid, $ds); + my $node_name = + PVE::QemuServer::Blockdev::get_node_name_below_throttle(vm_qmp_peer($vmid), $ds); my $job_id = "restore-$ds"; mon_cmd( $vmid, 'block-stream', @@ -7420,8 +7421,9 @@ sub live_import_from_files { # removes itself once all backing images vanish with 'auto-remove=on') my $jobs = {}; for my $ds (sort keys %$live_restore_backing) { - my $node_name = - PVE::QemuServer::Blockdev::get_node_name_below_throttle($vmid, "drive-$ds"); + my $node_name = PVE::QemuServer::Blockdev::get_node_name_below_throttle( + vm_qmp_peer($vmid), "drive-$ds", + ); my $job_id = "restore-$ds"; mon_cmd( $vmid, 'block-stream', diff --git a/src/PVE/QemuServer/BlockJob.pm b/src/PVE/QemuServer/BlockJob.pm index 97ada28b..d0fce52d 100644 --- a/src/PVE/QemuServer/BlockJob.pm +++ b/src/PVE/QemuServer/BlockJob.pm @@ -13,7 +13,7 @@ use PVE::Storage; use PVE::QemuServer::Agent qw(qga_check_running); use PVE::QemuServer::Blockdev; use PVE::QemuServer::Drive qw(checked_volume_format); -use PVE::QemuServer::Monitor qw(mon_cmd); +use PVE::QemuServer::Monitor qw(mon_cmd vm_qmp_peer); use PVE::QemuServer::RunState; # If the job was started with auto-dismiss=false, it's necessary to dismiss it manually. Using this @@ -455,7 +455,7 @@ sub blockdev_mirror { # Need to replace the node below the top node. This is not necessarily a format node, for # example, it can also be a zeroinit node by a previous mirror! So query QEMU itself. my $source_node_name = - PVE::QemuServer::Blockdev::get_node_name_below_throttle($vmid, $device_id, 1); + PVE::QemuServer::Blockdev::get_node_name_below_throttle(vm_qmp_peer($vmid), $device_id, 1); # Copy original drive config (aio, cache, discard, ...): my $dest_drive = dclone($source->{drive}); diff --git a/src/PVE/QemuServer/Blockdev.pm b/src/PVE/QemuServer/Blockdev.pm index c96b76da..495aff50 100644 --- a/src/PVE/QemuServer/Blockdev.pm +++ b/src/PVE/QemuServer/Blockdev.pm @@ -166,12 +166,22 @@ sub top_node_name { } sub get_node_name_below_throttle { - my ($vmid, $device_id, $assert_top_is_throttle) = @_; + my ($qmp_peer, $device_id, $assert_top_is_throttle) = @_; - my $block_info = get_block_info($vmid); - my $drive_id = $device_id =~ s/^drive-//r; - my $top = $block_info->{$drive_id}->{inserted} - or die "no block node inserted for drive '$drive_id'\n"; + my $top; + if ($qmp_peer->{type} eq 'qmp') { # get_block_info() only works if there are front-end devices. + my $block_info = get_block_info($qmp_peer->{id}); + my $drive_id = $device_id =~ s/^drive-//r; + $top = $block_info->{$drive_id}->{inserted}; + } else { + my $named_block_node_info = qmp_cmd($qmp_peer, 'query-named-block-nodes'); + for my $info ($named_block_node_info->@*) { + next if $info->{'node-name'} ne $device_id; + $top = $info; + last; + } + } + die "no block node found for drive '$device_id'\n" if !$top; if ($top->{drv} ne 'throttle') { die "$device_id: unexpected top node $top->{'node-name'} ($top->{drv})\n" diff --git a/src/PVE/QemuServer/VolumeChain.pm b/src/PVE/QemuServer/VolumeChain.pm index 9aaf6bbe..08acbc05 100644 --- a/src/PVE/QemuServer/VolumeChain.pm +++ b/src/PVE/QemuServer/VolumeChain.pm @@ -11,7 +11,7 @@ use PVE::Storage; use PVE::QemuServer::Blockdev qw(generate_file_blockdev generate_format_blockdev); use PVE::QemuServer::BlockJob; use PVE::QemuServer::Drive; -use PVE::QemuServer::Monitor qw(mon_cmd); +use PVE::QemuServer::Monitor qw(mon_cmd vm_qmp_peer); sub blockdev_external_snapshot { my ($storecfg, $vmid, $machine_version, $deviceid, $drive, $snap, $parent_snap) = @_; @@ -106,8 +106,9 @@ sub blockdev_replace { my $src_blockdev_name; if ($src_snap eq 'current') { # there might be other nodes on top like zeroinit, look up the current node below throttle - $src_blockdev_name = - PVE::QemuServer::Blockdev::get_node_name_below_throttle($vmid, $deviceid, 1); + $src_blockdev_name = PVE::QemuServer::Blockdev::get_node_name_below_throttle( + vm_qmp_peer($vmid), $deviceid, 1, + ); } else { $src_name_options = { 'snapshot-name' => $src_snap }; $src_blockdev_name = -- 2.47.3