[pve-devel] [PATCH qemu-server v2 5/5] blockdev-stream/-commit: make backing file relative

Fabian Grünbichler f.gruenbichler at proxmox.com
Tue Jul 29 13:53:20 CEST 2025


to avoid the resulting qcow2 file referencing its backing file via an absolute
path, which makes renaming the base of the storage impossible.

Signed-off-by: Fabian Grünbichler <f.gruenbichler at proxmox.com>
---

Notes:
    v2: move logic into its own helper

 src/PVE/QemuServer/Blockdev.pm | 24 ++++++++++++++++++++++--
 1 file changed, 22 insertions(+), 2 deletions(-)

diff --git a/src/PVE/QemuServer/Blockdev.pm b/src/PVE/QemuServer/Blockdev.pm
index 6e105571..08bc48dd 100644
--- a/src/PVE/QemuServer/Blockdev.pm
+++ b/src/PVE/QemuServer/Blockdev.pm
@@ -5,6 +5,7 @@ use warnings;
 
 use Digest::SHA;
 use Fcntl qw(S_ISBLK S_ISCHR);
+use File::Basename qw(basename dirname);
 use File::stat;
 use JSON;
 
@@ -885,6 +886,20 @@ sub blockdev_delete {
     PVE::Storage::volume_snapshot_delete($storecfg, $volid, $snap, 1);
 }
 
+my sub blockdev_relative_backing_file {
+    my ($backing, $backed) = @_;
+
+    my $backing_file = $backing->{filename};
+    my $backed_file = $backed->{filename};
+
+    if (dirname($backing_file) eq dirname($backed_file)) {
+        # make backing file relative if in same directory
+        return basename($backing_file);
+    }
+
+    return $backing_file;
+}
+
 sub blockdev_replace {
     my (
         $storecfg,
@@ -954,12 +969,15 @@ sub blockdev_replace {
         $parent_fmt_blockdev->{backing} = $target_fmt_blockdev->{'node-name'};
         mon_cmd($vmid, 'blockdev-reopen', options => [$parent_fmt_blockdev]);
 
+        my $backing_file =
+            blockdev_relative_backing_file($target_file_blockdev, $parent_file_blockdev);
+
         #change backing-file in qcow2 metadatas
         mon_cmd(
             $vmid, 'change-backing-file',
             device => $deviceid,
             'image-node-name' => $parent_fmt_blockdev->{'node-name'},
-            'backing-file' => $target_file_blockdev->{filename},
+            'backing-file' => $backing_file,
         );
     }
 
@@ -1069,11 +1087,13 @@ sub blockdev_stream {
         { 'snapshot-name' => $snap },
     );
 
+    my $backing_file = blockdev_relative_backing_file($parent_file_blockdev, $target_file_blockdev);
+
     my $job_id = "stream-$deviceid";
     my $jobs = {};
     my $options = { 'job-id' => $job_id, device => $target_fmt_blockdev->{'node-name'} };
     $options->{'base-node'} = $parent_fmt_blockdev->{'node-name'};
-    $options->{'backing-file'} = $parent_file_blockdev->{filename};
+    $options->{'backing-file'} = $backing_file;
 
     mon_cmd($vmid, 'block-stream', %$options);
     $jobs->{$job_id} = {};
-- 
2.39.5





More information about the pve-devel mailing list