all lists on lists.proxmox.com
 help / color / mirror / Atom feed
From: Alexandre Derumier via pve-devel <pve-devel@lists.proxmox.com>
To: pve-devel@lists.proxmox.com
Cc: Alexandre Derumier <alexandre.derumier@groupe-cyllene.com>
Subject: [pve-devel] [PATCH v3 qemu-server 11/11] qcow2: add external snapshot support
Date: Mon, 16 Dec 2024 10:12:29 +0100	[thread overview]
Message-ID: <mailman.210.1734340371.332.pve-devel@lists.proxmox.com> (raw)
In-Reply-To: <20241216091229.3142660-1-alexandre.derumier@groupe-cyllene.com>

[-- Attachment #1: Type: message/rfc822, Size: 18136 bytes --]

From: Alexandre Derumier <alexandre.derumier@groupe-cyllene.com>
To: pve-devel@lists.proxmox.com
Subject: [PATCH v3 qemu-server 11/11] qcow2: add external snapshot support
Date: Mon, 16 Dec 2024 10:12:29 +0100
Message-ID: <20241216091229.3142660-16-alexandre.derumier@groupe-cyllene.com>

Signed-off-by: Alexandre Derumier <alexandre.derumier@groupe-cyllene.com>
---
 PVE/QemuConfig.pm |   4 +-
 PVE/QemuServer.pm | 345 ++++++++++++++++++++++++++++++++++++++++++++--
 2 files changed, 335 insertions(+), 14 deletions(-)

diff --git a/PVE/QemuConfig.pm b/PVE/QemuConfig.pm
index ffdf9f03..c17edb46 100644
--- a/PVE/QemuConfig.pm
+++ b/PVE/QemuConfig.pm
@@ -375,7 +375,7 @@ sub __snapshot_create_vol_snapshot {
 
     print "snapshotting '$device' ($drive->{file})\n";
 
-    PVE::QemuServer::qemu_volume_snapshot($vmid, $device, $storecfg, $volid, $snapname);
+    PVE::QemuServer::qemu_volume_snapshot($vmid, $device, $storecfg, $drive, $snapname);
 }
 
 sub __snapshot_delete_remove_drive {
@@ -412,7 +412,7 @@ sub __snapshot_delete_vol_snapshot {
     my $storecfg = PVE::Storage::config();
     my $volid = $drive->{file};
 
-    PVE::QemuServer::qemu_volume_snapshot_delete($vmid, $storecfg, $volid, $snapname);
+    PVE::QemuServer::qemu_volume_snapshot_delete($vmid, $storecfg, $drive, $snapname);
 
     push @$unused, $volid;
 }
diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm
index 3a3feadf..f29a8449 100644
--- a/PVE/QemuServer.pm
+++ b/PVE/QemuServer.pm
@@ -4959,20 +4959,269 @@ sub qemu_block_resize {
 }
 
 sub qemu_volume_snapshot {
-    my ($vmid, $deviceid, $storecfg, $volid, $snap) = @_;
+    my ($vmid, $deviceid, $storecfg, $drive, $snap) = @_;
 
+    my $volid = $drive->{file};
     my $running = check_running($vmid);
-
-    if ($running && do_snapshots_with_qemu($storecfg, $volid, $deviceid)) {
-	mon_cmd($vmid, 'blockdev-snapshot-internal-sync', device => $deviceid, name => $snap);
+    my $do_snapshots_with_qemu = do_snapshots_with_qemu($storecfg, $volid, $deviceid) if $running;
+    if ($do_snapshots_with_qemu) {
+	if($do_snapshots_with_qemu == 2) {
+	    my $snap_path = PVE::Storage::path($storecfg, $volid, $snap);
+	    my $path = PVE::Storage::path($storecfg, $volid);
+	    blockdev_current_rename($storecfg, $vmid, $deviceid, $drive, $path, $snap_path, 1);
+	    blockdev_external_snapshot($storecfg, $vmid, $deviceid, $drive, $snap);
+	} else {
+	    mon_cmd($vmid, 'blockdev-snapshot-internal-sync', device => $deviceid, name => $snap);
+	}
     } else {
 	PVE::Storage::volume_snapshot($storecfg, $volid, $snap);
     }
 }
 
+sub blockdev_external_snapshot {
+    my ($storecfg, $vmid, $deviceid, $drive, $snap) = @_;
+
+    my $nodes = get_blockdev_nodes($vmid);
+    my $volid = $drive->{file};
+    my $path = PVE::Storage::path($storecfg, $volid, $snap);
+    my $format_node = find_blockdev_node($nodes, $path, 'fmt');
+    my $format_nodename = $format_node->{'node-name'};
+
+    #preallocate add a new current file
+    my $new_current_fmt_nodename = get_blockdev_nextid("fmt-$deviceid", $nodes);
+    my $new_current_file_nodename = get_blockdev_nextid("file-$deviceid", $nodes);
+    PVE::Storage::volume_snapshot($storecfg, $volid, $snap);
+    my $new_file_blockdev = generate_file_blockdev($storecfg, $drive, $new_current_file_nodename);
+    my $new_fmt_blockdev = generate_format_blockdev($storecfg, $drive, $new_current_fmt_nodename, $new_file_blockdev);
+
+    $new_fmt_blockdev->{backing} = undef;
+    PVE::QemuServer::Monitor::mon_cmd($vmid, 'blockdev-add', %$new_fmt_blockdev);
+    mon_cmd($vmid, 'blockdev-snapshot', node => $format_nodename, overlay => $new_current_fmt_nodename);
+}
+
+sub blockdev_snap_rename {
+    my ($storecfg, $vmid, $deviceid, $drive, $src_path, $target_path) = @_;
+
+    my $nodes = get_blockdev_nodes($vmid);
+    my $volid = $drive->{file};
+
+    #copy the original drive param and change target file
+    my $target_fmt_nodename = get_blockdev_nextid("fmt-$deviceid", $nodes);
+    my $target_file_nodename = get_blockdev_nextid("file-$deviceid", $nodes);
+
+    my $src_fmt_node = find_blockdev_node($nodes, $src_path, 'fmt');
+    my $src_fmt_nodename = $src_fmt_node->{'node-name'};
+    my $src_file_node = find_blockdev_node($nodes, $src_path, 'file');
+    my $src_file_nodename = $src_file_node->{'node-name'};
+
+    #untaint
+    if ($src_path =~ m/^(\S+)$/) {
+	$src_path = $1;
+    }
+    if ($target_path =~ m/^(\S+)$/) {
+	$target_path = $1;
+    }
+
+    #create a hardlink
+    link($src_path, $target_path);
+
+    #add new format blockdev
+    my $read_only = 1;
+    my $target_file_blockdev = generate_file_blockdev($storecfg, $drive, $target_file_nodename);
+    $target_file_blockdev->{filename} = $target_path;
+    my $target_fmt_blockdev = generate_format_blockdev($storecfg, $drive, $target_fmt_nodename, $target_file_blockdev, $read_only);
+
+    PVE::QemuServer::Monitor::mon_cmd($vmid, 'blockdev-add', %$target_fmt_blockdev);
+
+    #reopen the parent node with different backing file
+    my $parent_fmt_node = find_parent_node($nodes, $src_path);
+    my $parent_fmt_nodename = $parent_fmt_node->{'node-name'};
+    my $parent_path = $parent_fmt_node->{file};
+    my $parent_file_node = find_blockdev_node($nodes, $parent_path, 'file');
+    my $parent_file_nodename = $parent_file_node->{'node-name'};
+    my $filenode_exist = 1;
+    $read_only = $parent_fmt_node->{ro};
+    my $parent_fmt_blockdev = generate_format_blockdev($storecfg, $drive, $parent_fmt_nodename, $parent_file_nodename, $read_only);
+    $parent_fmt_blockdev->{backing} = $target_fmt_nodename;
+    PVE::QemuServer::Monitor::mon_cmd($vmid, 'blockdev-reopen', options => [$parent_fmt_blockdev]);
+
+    #change backing-file in qcow2 metadatas
+    PVE::QemuServer::Monitor::mon_cmd($vmid, 'change-backing-file', device => $deviceid, 'image-node-name' => $parent_fmt_nodename, 'backing-file' => $target_path);
+
+    # fileblockdev seem to be autoremoved, if it have been created online, but not if they are created at start with command line
+    eval { PVE::QemuServer::Monitor::mon_cmd($vmid, 'blockdev-del', 'node-name' => $src_file_nodename) };
+    eval { PVE::QemuServer::Monitor::mon_cmd($vmid, 'blockdev-del', 'node-name' => $src_fmt_nodename) };
+
+    #delete old $path link
+    unlink($src_path);
+
+    #rename underlay
+    my $storage_name = PVE::Storage::parse_volume_id($volid);
+    my $scfg = $storecfg->{ids}->{$storage_name};
+    if ($scfg->{type} eq 'lvm') {
+	print"lvrename $src_path to $target_path\n";
+	run_command(
+	    ['/sbin/lvrename', $src_path, $target_path],
+	    errmsg => "lvrename $src_path to $target_path error",
+	);
+    }
+}
+
+sub blockdev_current_rename {
+    my ($storecfg, $vmid, $deviceid, $drive, $path, $target_path, $skip_underlay) = @_;
+    ## rename current running image
+
+    my $nodes = get_blockdev_nodes($vmid);
+    my $volid = $drive->{file};
+    my $target_file_nodename = get_blockdev_nextid("file-$deviceid", $nodes);
+
+    my $file_blockdev = generate_file_blockdev($storecfg, $drive, $target_file_nodename);
+    $file_blockdev->{filename} = $target_path;
+
+    my $format_node = find_blockdev_node($nodes, $path, 'fmt');
+    my $format_nodename = $format_node->{'node-name'};
+
+    my $file_node = find_blockdev_node($nodes, $path, 'file');
+    my $file_nodename = $file_node->{'node-name'};
+
+    my $backingfile = $format_node->{image}->{'backing-filename'};
+    my $backing_node = $backingfile ? find_blockdev_node($nodes, $backingfile, 'fmt') : undef;
+
+    #create a hardlink
+    link($path, $target_path);
+    #add new file blockdev
+    PVE::QemuServer::Monitor::mon_cmd($vmid, 'blockdev-add', %$file_blockdev);
+
+    #reopen the current fmt nodename with a new file nodename
+    my $reopen_blockdev = generate_format_blockdev($storecfg, $drive, $format_nodename, $target_file_nodename);
+    $reopen_blockdev->{backing} = $backing_node->{'node-name'};
+    PVE::QemuServer::Monitor::mon_cmd($vmid, 'blockdev-reopen', options => [$reopen_blockdev]);
+
+    # delete old file blockdev
+    # seem that the old file block is autoremoved after reopen if the file nodename is autogenerad with #block ?
+    eval { PVE::QemuServer::Monitor::mon_cmd($vmid, 'blockdev-del', 'node-name' => $file_nodename) };
+
+    unlink($path);
+
+    #skip_underlay: lvm will be renamed later in Storage::volume_snaphot
+    return if $skip_underlay;
+
+    #rename underlay
+    my $storage_name = PVE::Storage::parse_volume_id($volid);
+    my $scfg = $storecfg->{ids}->{$storage_name};
+    if ($scfg->{type} eq 'lvm') {
+	print"lvrename $path to $target_path\n";
+	run_command(
+	    ['/sbin/lvrename', $path, $target_path],
+	    errmsg => "lvrename $path to $target_path error",
+	);
+    }
+}
+
+sub blockdev_commit {
+    my ($storecfg, $vmid, $deviceid, $drive, $top_path, $base_path) = @_;
+
+    my $nodes = get_blockdev_nodes($vmid);
+    my $volid = $drive->{file};
+
+    #untaint
+    if ($top_path =~ m/^(\S+)$/) {
+	$top_path = $1;
+    }
+
+    print "block-commit top:$top_path to base:$base_path\n";
+    my $job_id = "commit-$deviceid";
+    my $jobs = {};
+
+    my $base_node = find_blockdev_node($nodes, $base_path, 'fmt');
+    my $top_node = find_blockdev_node($nodes, $top_path, 'fmt');
+
+    my $options = { 'job-id' => $job_id, device => $deviceid };
+    $options->{'top-node'} = $top_node->{'node-name'};
+    $options->{'base-node'} = $base_node->{'node-name'};
+
+
+    mon_cmd($vmid, 'block-commit', %$options);
+    $jobs->{$job_id} = {};
+
+    qemu_drive_mirror_monitor($vmid, undef, $jobs, 'auto', 0, 'commit');
+
+    #remove fmt-blockdev, file-blockdev && file
+    my $fmt_node = find_blockdev_node($nodes, $top_path, 'fmt');
+    my $fmt_nodename = $fmt_node->{'node-name'};
+    eval { PVE::QemuServer::Monitor::mon_cmd($vmid, 'blockdev-del', 'node-name' => $fmt_nodename) };
+
+    my $file_node = find_blockdev_node($nodes, $top_path, 'file');
+    my $file_nodename = $file_node->{'node-name'};
+    eval { PVE::QemuServer::Monitor::mon_cmd($vmid, 'blockdev-del', 'node-name' => $file_nodename) };
+
+
+
+    my $storage_name = PVE::Storage::parse_volume_id($volid);
+    my $scfg = $storecfg->{ids}->{$storage_name};
+    if ($scfg->{type} eq 'lvm') {
+	print"lvremove $top_path\n";
+	run_command(
+	    ['/sbin/lvremove', '-f', $top_path],
+	    errmsg => "lvremove $top_path",
+	);
+    } else {
+	unlink($top_path);
+    }
+
+}
+
+sub blockdev_live_commit {
+    my ($storecfg, $vmid, $deviceid, $drive, $current_path, $snapshot_path) = @_;
+
+    my $nodes = get_blockdev_nodes($vmid);
+    my $volid = $drive->{file};
+
+    #untaint
+    if ($current_path =~ m/^(\S+)$/) {
+	$current_path = $1;
+    }
+
+    print "live block-commit top:$current_path to base:$snapshot_path\n";
+    my $job_id = "commit-$deviceid";
+    my $jobs = {};
+
+    my $snapshot_node = find_blockdev_node($nodes, $snapshot_path, 'fmt');
+    my $snapshot_file_node = find_blockdev_node($nodes, $current_path, 'file');
+    my $current_node = find_blockdev_node($nodes, $current_path, 'fmt');
+
+    my $opts = { 'job-id' => $job_id,
+		  device => $deviceid,
+		  'base-node' => $snapshot_node->{'node-name'},
+		  replaces => $current_node->{'node-name'}
+    };
+    mon_cmd($vmid, "block-commit", %$opts);
+    $jobs->{$job_id} = {};
+
+    qemu_drive_mirror_monitor ($vmid, undef, $jobs, 'complete', 0, 'commit');
+
+    eval { mon_cmd($vmid, 'blockdev-del', 'node-name' => $current_node->{'node-name'}) };
+
+    my $storage_name = PVE::Storage::parse_volume_id($volid);
+    my $scfg = $storecfg->{ids}->{$storage_name};
+    if ($scfg->{type} eq 'lvm') {
+	print"lvremove $current_path\n";
+	run_command(
+	    ['/sbin/lvremove', '-f', $current_path],
+	    errmsg => "lvremove $current_path",
+	);
+    } else {
+	unlink($current_path);
+    }
+
+    return;
+
+}
+
 sub qemu_volume_snapshot_delete {
-    my ($vmid, $storecfg, $volid, $snap) = @_;
+    my ($vmid, $storecfg, $drive, $snap) = @_;
 
+    my $volid = $drive->{file};
     my $running = check_running($vmid);
     my $attached_deviceid;
 
@@ -4984,13 +5233,51 @@ sub qemu_volume_snapshot_delete {
 	});
     }
 
-    if ($attached_deviceid && do_snapshots_with_qemu($storecfg, $volid, $attached_deviceid)) {
-	mon_cmd(
-	    $vmid,
-	    'blockdev-snapshot-delete-internal-sync',
-	    device => $attached_deviceid,
-	    name => $snap,
-	);
+    my $do_snapshots_with_qemu = do_snapshots_with_qemu($storecfg, $volid, $attached_deviceid) if $running;
+    if ($attached_deviceid && $do_snapshots_with_qemu) {
+
+	if ($do_snapshots_with_qemu == 2) {
+
+	    my $path = PVE::Storage::path($storecfg, $volid);
+	    my $snapshots = PVE::Storage::volume_snapshot_info($storecfg, $volid);
+
+	    my $snappath = $snapshots->{$snap}->{file};
+	    return if !-e $snappath;  #already deleted ?
+
+	    my $parentsnap = $snapshots->{$snap}->{parent};
+	    my $childsnap = $snapshots->{$snap}->{child};
+
+	    my $parentpath = $snapshots->{$parentsnap}->{file} if $parentsnap;
+	    my $childpath = $snapshots->{$childsnap}->{file} if $childsnap;
+
+	    #if first snapshot
+	    if(!$parentsnap) {
+		print"delete first snapshot $childpath\n";
+		if($childpath eq $path) {
+		    #if child is the current (last snapshot), we need to a live active-commit
+		    print"commit first snapshot $snappath to current $path\n";
+		    blockdev_live_commit($storecfg, $vmid, $attached_deviceid, $drive, $childpath, $snappath);
+		    print" rename $snappath to $path\n";
+		    blockdev_current_rename($storecfg, $vmid, $attached_deviceid, $drive, $snappath, $path);
+		} else {
+		    print"commit first snapshot $snappath to $childpath path\n";
+		    blockdev_commit($storecfg, $vmid, $attached_deviceid, $drive, $childpath, $snappath);
+		    print" rename $snappath to $childpath\n";
+		    blockdev_snap_rename($storecfg, $vmid, $attached_deviceid, $drive, $snappath, $childpath);
+		}
+	    } else {
+		#intermediate snapshot, we just need to commit the snapshot
+		print"commit intermediate snapshot $snappath to $parentpath\n";
+		blockdev_commit($storecfg, $vmid, $attached_deviceid, $drive, $snappath, $parentpath, 'auto');
+	    }
+	} else {
+	    mon_cmd(
+	        $vmid,
+		'blockdev-snapshot-delete-internal-sync',
+		device => $attached_deviceid,
+		name => $snap,
+	    );
+	}
     } else {
 	PVE::Storage::volume_snapshot_delete(
 	    $storecfg, $volid, $snap, $attached_deviceid ? 1 : undef);
@@ -8066,6 +8353,8 @@ sub do_snapshots_with_qemu {
 	return 1;
     }
 
+    return 2 if $scfg->{snapext} || $scfg->{type} eq 'lvm' && $volid =~ m/\.(qcow2)/;
+
     if ($volid =~ m/\.(qcow2|qed)$/){
 	return 1;
     }
@@ -9169,6 +9458,38 @@ sub delete_ifaces_ipams_ips {
     }
 }
 
+sub find_blockdev_node {
+    my ($nodes, $path, $type) = @_;
+
+    my $found_nodeid = undef;
+    my $found_node = undef;
+    for my $nodeid (keys %$nodes) {
+	my $node = $nodes->{$nodeid};
+	if ($nodeid =~ m/^$type-(\S+)$/ && $node->{file} eq $path ) {
+	    $found_node = $node;
+	    last;
+	}
+    }
+    die "can't found nodeid for file $path\n" if !$found_node;
+    return $found_node;
+}
+
+sub find_parent_node {
+    my ($nodes, $backing_path) = @_;
+
+    my $found_nodeid = undef;
+    my $found_node = undef;
+    for my $nodeid (keys %$nodes) {
+	my $node = $nodes->{$nodeid};
+	if ($nodeid =~ m/^fmt-(\S+)$/ && $node->{backing_file} && $node->{backing_file} eq $backing_path) {
+	    $found_node = $node;
+	    last;
+	}
+    }
+    die "can't found nodeid for file $backing_path\n" if !$found_node;
+    return $found_node;
+}
+
 sub find_fmt_nodename_drive {
     my ($storecfg, $vmid, $drive, $nodes) = @_;
 
-- 
2.39.5



[-- Attachment #2: Type: text/plain, Size: 160 bytes --]

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

  parent reply	other threads:[~2024-12-16  9:13 UTC|newest]

Thread overview: 68+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <20241216091229.3142660-1-alexandre.derumier@groupe-cyllene.com>
2024-12-16  9:12 ` [pve-devel] [PATCH v1 pve-qemu 1/1] add block-commit-replaces option patch Alexandre Derumier via pve-devel
2025-01-08 13:27   ` Fabian Grünbichler
2025-01-10  7:55     ` DERUMIER, Alexandre via pve-devel
     [not found]     ` <34a164520eba035d1db5f70761b0f4aa59fecfa5.camel@groupe-cyllene.com>
2025-01-10  9:15       ` Fiona Ebner
2025-01-10  9:32         ` DERUMIER, Alexandre via pve-devel
     [not found]         ` <1e45e756801843dd46eb6ce2958d30885ad73bc2.camel@groupe-cyllene.com>
2025-01-13 14:28           ` Fiona Ebner
2025-01-14 10:10             ` DERUMIER, Alexandre via pve-devel
2024-12-16  9:12 ` [pve-devel] [PATCH v3 qemu-server 01/11] blockdev: cmdline: convert drive to blockdev syntax Alexandre Derumier via pve-devel
2025-01-08 14:17   ` Fabian Grünbichler
2025-01-10 13:50     ` DERUMIER, Alexandre via pve-devel
2024-12-16  9:12 ` [pve-devel] [PATCH v3 pve-storage 1/3] qcow2: add external snapshot support Alexandre Derumier via pve-devel
2025-01-09 12:36   ` Fabian Grünbichler
2025-01-10  9:10     ` DERUMIER, Alexandre via pve-devel
     [not found]     ` <f25028d41a9588e82889b3ef869a14f33cbd216e.camel@groupe-cyllene.com>
2025-01-10 11:02       ` Fabian Grünbichler
2025-01-10 11:51         ` DERUMIER, Alexandre via pve-devel
     [not found]         ` <1caecaa23e5d57030a9e31f2f0e67648f1930d6a.camel@groupe-cyllene.com>
2025-01-10 12:20           ` Fabian Grünbichler
2025-01-10 13:14             ` DERUMIER, Alexandre via pve-devel
2024-12-16  9:12 ` [pve-devel] [PATCH v3 qemu-server 02/11] blockdev: fix cfg2cmd tests Alexandre Derumier via pve-devel
2024-12-16  9:12 ` [pve-devel] [PATCH v3 pve-storage 2/3] lvmplugin: add qcow2 snapshot Alexandre Derumier via pve-devel
2025-01-09 13:55   ` Fabian Grünbichler
2025-01-10 10:16     ` DERUMIER, Alexandre via pve-devel
2024-12-16  9:12 ` [pve-devel] [PATCH v3 qemu-server 03/11] blockdev : convert qemu_driveadd && qemu_drivedel Alexandre Derumier via pve-devel
2025-01-08 14:26   ` Fabian Grünbichler
2025-01-10 14:08     ` DERUMIER, Alexandre via pve-devel
2024-12-16  9:12 ` [pve-devel] [PATCH v3 pve-storage 3/3] storage: vdisk_free: remove external snapshots Alexandre Derumier via pve-devel
2024-12-16  9:12 ` [pve-devel] [PATCH v3 qemu-server 04/11] blockdev: vm_devices_list : fix block-query Alexandre Derumier via pve-devel
2025-01-08 14:31   ` Fabian Grünbichler
2025-01-13  7:56     ` DERUMIER, Alexandre via pve-devel
2024-12-16  9:12 ` [pve-devel] [PATCH v3 qemu-server 05/11] blockdev: convert cdrom media eject/insert Alexandre Derumier via pve-devel
2025-01-08 14:34   ` Fabian Grünbichler
2024-12-16  9:12 ` [pve-devel] [PATCH v3 qemu-server 06/11] blockdev: block_resize: convert to blockdev Alexandre Derumier via pve-devel
2024-12-16  9:12 ` [pve-devel] [PATCH v3 qemu-server 07/11] blockdev: nbd_export: block-export-add : use drive-$id for nodename Alexandre Derumier via pve-devel
2024-12-16  9:12 ` [pve-devel] [PATCH v3 qemu-server 08/11] blockdev: convert drive_mirror to blockdev_mirror Alexandre Derumier via pve-devel
2025-01-08 15:19   ` Fabian Grünbichler
2025-01-13  8:27     ` DERUMIER, Alexandre via pve-devel
     [not found]     ` <0d0d4c4d73110cf0e692cae0ee65bf7f9a6ce93a.camel@groupe-cyllene.com>
2025-01-13  9:52       ` Fabian Grünbichler
2025-01-13  9:55         ` Fabian Grünbichler
2025-01-13 10:47         ` DERUMIER, Alexandre via pve-devel
2025-01-13 13:42           ` Fiona Ebner
2025-01-14 10:03             ` DERUMIER, Alexandre via pve-devel
     [not found]             ` <fa38efbd95b57ba57a5628d6acfcda9d5875fa82.camel@groupe-cyllene.com>
2025-01-15  9:39               ` Fiona Ebner
2025-01-15  9:51                 ` Fabian Grünbichler
2025-01-15 10:06                   ` Fiona Ebner
2025-01-15 10:15                     ` Fabian Grünbichler
2025-01-15 10:46                       ` Fiona Ebner
2025-01-15 10:50                         ` Fabian Grünbichler
2025-01-15 11:01                           ` Fiona Ebner
2025-01-15 13:01                       ` DERUMIER, Alexandre via pve-devel
2025-01-16 14:56                     ` DERUMIER, Alexandre via pve-devel
2025-01-15 10:15                   ` DERUMIER, Alexandre via pve-devel
     [not found]         ` <c1559499319052d6cf10900efd5376c12389a60f.camel@groupe-cyllene.com>
2025-01-13 13:31           ` Fabian Grünbichler
2025-01-20 13:37             ` DERUMIER, Alexandre via pve-devel
2024-12-16  9:12 ` [pve-devel] [PATCH v3 qemu-server 09/11] blockdev: mirror: change aio on target if io_uring is not default Alexandre Derumier via pve-devel
2025-01-09  9:51   ` Fabian Grünbichler
2025-01-13  8:38     ` DERUMIER, Alexandre via pve-devel
2024-12-16  9:12 ` [pve-devel] [PATCH v3 qemu-server 10/11] blockdev: add backing_chain support Alexandre Derumier via pve-devel
2025-01-09 11:57   ` Fabian Grünbichler
2025-01-13  8:53     ` DERUMIER, Alexandre via pve-devel
2024-12-16  9:12 ` Alexandre Derumier via pve-devel [this message]
2025-01-09 11:57   ` [pve-devel] [PATCH v3 qemu-server 11/11] qcow2: add external snapshot support Fabian Grünbichler
2025-01-09 13:19     ` Fabio Fantoni via pve-devel
2025-01-20 13:44       ` DERUMIER, Alexandre via pve-devel
     [not found]       ` <3307ec388a763510ec78f97ed9f0de00c87d54b5.camel@groupe-cyllene.com>
2025-01-20 14:29         ` Fabio Fantoni via pve-devel
     [not found]         ` <6bdfe757-ae04-42e1-b197-c9ddb873e353@m2r.biz>
2025-01-20 14:41           ` DERUMIER, Alexandre via pve-devel
2025-01-13 10:08     ` DERUMIER, Alexandre via pve-devel
     [not found]     ` <0ae72889042e006d9202e837aac7ecf2b413e1b4.camel@groupe-cyllene.com>
2025-01-13 13:27       ` Fabian Grünbichler
2025-01-13 18:07         ` DERUMIER, Alexandre via pve-devel
2025-01-13 18:58           ` DERUMIER, Alexandre via pve-devel

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=mailman.210.1734340371.332.pve-devel@lists.proxmox.com \
    --to=pve-devel@lists.proxmox.com \
    --cc=alexandre.derumier@groupe-cyllene.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal