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 <[email protected]>
---

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




Reply via email to