public inbox for pve-devel@lists.proxmox.com
 help / color / mirror / Atom feed
From: Fiona Ebner <f.ebner@proxmox.com>
To: pve-devel@lists.proxmox.com
Subject: [pve-devel] [PATCH qemu-server 07/18] blockdev: switch get_node_name_below_throttle() to use QMP peer
Date: Wed,  3 Dec 2025 14:26:33 +0100	[thread overview]
Message-ID: <20251203132949.109685-8-f.ebner@proxmox.com> (raw)
In-Reply-To: <20251203132949.109685-1-f.ebner@proxmox.com>

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 <f.ebner@proxmox.com>
---
 src/PVE/QemuServer.pm          |  8 +++++---
 src/PVE/QemuServer/BlockJob.pm |  2 +-
 src/PVE/QemuServer/Blockdev.pm | 22 ++++++++++++++++------
 3 files changed, 22 insertions(+), 10 deletions(-)

diff --git a/src/PVE/QemuServer.pm b/src/PVE/QemuServer.pm
index 177fc7b1..600072c3 100644
--- a/src/PVE/QemuServer.pm
+++ b/src/PVE/QemuServer.pm
@@ -7280,7 +7280,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',
@@ -7400,8 +7401,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 85d86022..f54b783a 100644
--- a/src/PVE/QemuServer/BlockJob.pm
+++ b/src/PVE/QemuServer/BlockJob.pm
@@ -448,7 +448,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 36a0ea99..52875010 100644
--- a/src/PVE/QemuServer/Blockdev.pm
+++ b/src/PVE/QemuServer/Blockdev.pm
@@ -161,12 +161,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}
+            or die "no block node inserted for drive '$drive_id'\n";
+    } 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;
+        }
+    }
 
     if ($top->{drv} ne 'throttle') {
         die "$device_id: unexpected top node $top->{'node-name'} ($top->{drv})\n"
@@ -945,7 +955,7 @@ 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 = get_node_name_below_throttle($vmid, $deviceid, 1);
+        $src_blockdev_name = get_node_name_below_throttle(vm_qmp_peer($vmid), $deviceid, 1);
     } else {
         $src_name_options = { 'snapshot-name' => $src_snap };
         $src_blockdev_name = get_node_name('fmt', $drive_id, $volid, $src_name_options);
-- 
2.47.3



_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel


  parent reply	other threads:[~2025-12-03 13:30 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-12-03 13:26 [pve-devel] [PATCH-SERIES qemu-server 00/18] fix #7066: api: allow live snapshot (remove) of qcow2 TPM drive with snapshot-as-volume-chain Fiona Ebner
2025-12-03 13:26 ` [pve-devel] [PATCH qemu-server 01/18] block job: fix variable name in documentation Fiona Ebner
2025-12-03 13:26 ` [pve-devel] [PATCH qemu-server 02/18] qmp client: add default timeouts for more block commands Fiona Ebner
2025-12-03 13:26 ` [pve-devel] [PATCH qemu-server 03/18] drive: introduce drive_uses_qsd_fuse() helper Fiona Ebner
2025-12-03 13:26 ` [pve-devel] [PATCH qemu-server 04/18] monitor: add vm_qmp_peer() helper Fiona Ebner
2025-12-03 13:26 ` [pve-devel] [PATCH qemu-server 05/18] monitor: add qsd_peer() helper Fiona Ebner
2025-12-03 13:26 ` [pve-devel] [PATCH qemu-server 06/18] blockdev: rename variable in get_node_name_below_throttle() for readability Fiona Ebner
2025-12-03 13:26 ` Fiona Ebner [this message]
2025-12-03 13:26 ` [pve-devel] [PATCH qemu-server 08/18] blockdev: switch detach() to use QMP peer Fiona Ebner
2025-12-03 13:26 ` [pve-devel] [PATCH qemu-server 09/18] blockdev: switch blockdev_replace() " Fiona Ebner
2025-12-03 13:26 ` [pve-devel] [PATCH qemu-server 10/18] blockdev: switch blockdev_external_snapshot() " Fiona Ebner
2025-12-03 13:26 ` [pve-devel] [PATCH qemu-server 11/18] block job: switch qemu_handle_concluded_blockjob() " Fiona Ebner
2025-12-03 13:26 ` [pve-devel] [PATCH qemu-server 12/18] block job: switch qemu_blockjobs_cancel() " Fiona Ebner
2025-12-03 13:26 ` [pve-devel] [PATCH qemu-server 13/18] block job: switch qemu_drive_mirror_monitor() " Fiona Ebner
2025-12-03 13:26 ` [pve-devel] [PATCH qemu-server 14/18] blockdev: switch blockdev_delete() " Fiona Ebner
2025-12-03 13:26 ` [pve-devel] [PATCH qemu-server 15/18] blockdev: switch blockdev_stream() " Fiona Ebner
2025-12-03 13:26 ` [pve-devel] [PATCH qemu-server 16/18] blockdev: switch blockdev_commit() " Fiona Ebner
2025-12-03 13:26 ` [pve-devel] [PATCH qemu-server 17/18] snapshot: support live snapshot (remove) of qcow2 TPM drive on storage with snapshot-as-volume-chain Fiona Ebner
2025-12-03 13:26 ` [pve-devel] [PATCH qemu-server 18/18] fix #7066: api: allow live snapshot (remove) of qcow2 TPM drive " Fiona Ebner

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20251203132949.109685-8-f.ebner@proxmox.com \
    --to=f.ebner@proxmox.com \
    --cc=pve-devel@lists.proxmox.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal