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 483441FF136 for ; Mon, 09 Mar 2026 18:01:03 +0100 (CET) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id C91AB640D; Mon, 9 Mar 2026 17:59:54 +0100 (CET) From: Fiona Ebner To: pve-devel@lists.proxmox.com Subject: [PATCH qemu-server v2 07/18] blockdev: switch get_node_name_below_throttle() to use QMP peer Date: Mon, 9 Mar 2026 17:58:33 +0100 Message-ID: <20260309165913.219308-8-f.ebner@proxmox.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260309165913.219308-1-f.ebner@proxmox.com> References: <20260309165913.219308-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: 1773075524860 X-SPAM-LEVEL: Spam detection results: 0 AWL -1.004 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: T36324VWQSX5JDGOJX3NPFMOCXT7FQ33 X-Message-ID-Hash: T36324VWQSX5JDGOJX3NPFMOCXT7FQ33 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 --- Changes in v2: * also die right away in QSD case if no block node can be found src/PVE/QemuServer.pm | 8 +++++--- src/PVE/QemuServer/BlockJob.pm | 2 +- src/PVE/QemuServer/Blockdev.pm | 20 +++++++++++++++----- src/PVE/QemuServer/VolumeChain.pm | 7 ++++--- 4 files changed, 25 insertions(+), 12 deletions(-) diff --git a/src/PVE/QemuServer.pm b/src/PVE/QemuServer.pm index ba5acfe3..0841750a 100644 --- a/src/PVE/QemuServer.pm +++ b/src/PVE/QemuServer.pm @@ -7284,7 +7284,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', @@ -7402,8 +7403,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..59b33482 100644 --- a/src/PVE/QemuServer/BlockJob.pm +++ b/src/PVE/QemuServer/BlockJob.pm @@ -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 e3790683..3613c008 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) = @_; @@ -113,8 +113,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