* [pve-devel] [PATCH-SERIES storage/qemu-server 0/9] storage configuration-dependent format info
@ 2025-07-21 12:10 Fiona Ebner
2025-07-21 12:10 ` [pve-devel] [PATCH storage 1/9] api change log: improve style consistency a bit Fiona Ebner
` (10 more replies)
0 siblings, 11 replies; 15+ messages in thread
From: Fiona Ebner @ 2025-07-21 12:10 UTC (permalink / raw)
To: pve-devel
The LVM plugin can only use qcow2 format when the
'snapshot-as-volume-chain' configuration option is set. The format
information is currently only recorded statically in the plugin data.
This causes issues, for example, restoring a guest volume that uses
qcow2 as a format hint on an LVM storage without the option set will
fail, because the plugin data indicates that qcow2 is supported.
Introduce a dedicated method, so that plugins can indicate what
actually is supported according to the storage configuration.
In case the 'snapshot-as-volume-chain' option is set for the LVM
storage, qcow2 is even preferred and thus declared the default format.
As a second step, a dedicated resolve_format_hint() helper is
introduced.
That second part requires a dependency and a breaks between
qemu-server and pve-storage.
storage:
Fiona Ebner (6):
api change log: improve style consistency a bit
plugin: add get_formats() method and use it instead of
default_format()
lvm plugin: implement get_formats() method
api: status: rely on get_formats() method for determining
format-related info
introduce resolve_format_hint() helper
default format helper: only return default format
ApiChangeLog | 22 +++++++++----
src/PVE/API2/Storage/Status.pm | 6 ----
src/PVE/Storage.pm | 32 ++++++++++++------
src/PVE/Storage/LVMPlugin.pm | 10 ++++++
src/PVE/Storage/Plugin.pm | 59 +++++++++++++++++++++++-----------
5 files changed, 88 insertions(+), 41 deletions(-)
qemu-server:
Fiona Ebner (3):
make tidy
resolve destination disk format helper: drop unused variable
use storage layer's resolve_format_hint() helper where appropriate
src/PVE/API2/Qemu/HMPPerms.pm | 2 +-
src/PVE/QemuServer.pm | 29 ++++++++---------------------
src/PVE/VZDump/QemuServer.pm | 5 ++---
3 files changed, 11 insertions(+), 25 deletions(-)
Summary over all repositories:
8 files changed, 99 insertions(+), 66 deletions(-)
--
Generated by git-murpp 0.5.0
_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
^ permalink raw reply [flat|nested] 15+ messages in thread
* [pve-devel] [PATCH storage 1/9] api change log: improve style consistency a bit
2025-07-21 12:10 [pve-devel] [PATCH-SERIES storage/qemu-server 0/9] storage configuration-dependent format info Fiona Ebner
@ 2025-07-21 12:10 ` Fiona Ebner
2025-07-21 12:10 ` [pve-devel] [PATCH storage 2/9] plugin: add get_formats() method and use it instead of default_format() Fiona Ebner
` (9 subsequent siblings)
10 siblings, 0 replies; 15+ messages in thread
From: Fiona Ebner @ 2025-07-21 12:10 UTC (permalink / raw)
To: pve-devel
Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
---
ApiChangeLog | 16 +++++++++-------
1 file changed, 9 insertions(+), 7 deletions(-)
diff --git a/ApiChangeLog b/ApiChangeLog
index 1b06fa7..0984afb 100644
--- a/ApiChangeLog
+++ b/ApiChangeLog
@@ -22,12 +22,15 @@ Future changes should be documented in here.
Feel free to request allowing more drivers or options on the pve-devel mailing list based on your
needs.
-* Introduce rename_snapshot() plugin method
- This method allow to rename a vm disk snapshot name to a different snapshot name.
+* Introduce `rename_snapshot()` plugin method
-* Introduce volume_qemu_snapshot_method() plugin method
- This method declares how snapshots should be handled for *running* VMs.
- This should return one of the following:
+ This method allow to rename a vm disk snapshot name to a different snapshot name.
+
+* Introduce `volume_qemu_snapshot_method()` plugin method
+
+ This method declares how snapshots should be handled for *running* VMs.
+
+ This should return one of the following:
'qemu':
Qemu must perform the snapshot. The storage plugin does nothing.
'storage':
@@ -46,7 +49,6 @@ Future changes should be documented in here.
NOTE: Storages must support using "current" as a special name in `rename_snapshot()` to
cheaply convert a snapshot into the current disk state and back.
-
## Version 11:
* Allow declaring storage features via plugin data
@@ -56,7 +58,7 @@ Future changes should be documented in here.
`backup-provider`, see below for more details. To declare support for this feature, return
`features => { 'backup-provider' => 1 }` as part of the plugin data.
-* Introduce new_backup_provider() plugin method
+* Introduce `new_backup_provider()` plugin method
Proxmox VE now supports a `Backup Provider API` that can be used to implement custom backup
solutions tightly integrated in the Proxmox VE stack. See the `PVE::BackupProvider::Plugin::Base`
--
2.47.2
_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
^ permalink raw reply [flat|nested] 15+ messages in thread
* [pve-devel] [PATCH storage 2/9] plugin: add get_formats() method and use it instead of default_format()
2025-07-21 12:10 [pve-devel] [PATCH-SERIES storage/qemu-server 0/9] storage configuration-dependent format info Fiona Ebner
2025-07-21 12:10 ` [pve-devel] [PATCH storage 1/9] api change log: improve style consistency a bit Fiona Ebner
@ 2025-07-21 12:10 ` Fiona Ebner
2025-07-22 12:13 ` Wolfgang Bumiller
2025-07-21 12:10 ` [pve-devel] [PATCH storage 3/9] lvm plugin: implement get_formats() method Fiona Ebner
` (8 subsequent siblings)
10 siblings, 1 reply; 15+ messages in thread
From: Fiona Ebner @ 2025-07-21 12:10 UTC (permalink / raw)
To: pve-devel
The LVM plugin can only use qcow2 format when the
'snapshot-as-volume-chain' configuration option is set. The format
information is currently only recorded statically in the plugin data.
This causes issues, for example, restoring a guest volume that uses
qcow2 as a format hint on an LVM storage without the option set will
fail, because the plugin data indicates that qcow2 is supported.
Introduce a dedicated method, so that plugins can indicate what
actually is supported according to the storage configuration.
The implementation for LVM is done in a separate commit.
Remove the now unused default_format() function from Plugin.pm.
Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
---
ApiChangeLog | 8 ++++++
src/PVE/Storage.pm | 19 +++++++------
src/PVE/Storage/Plugin.pm | 59 ++++++++++++++++++++++++++-------------
3 files changed, 59 insertions(+), 27 deletions(-)
diff --git a/ApiChangeLog b/ApiChangeLog
index 0984afb..d80bfb3 100644
--- a/ApiChangeLog
+++ b/ApiChangeLog
@@ -49,6 +49,14 @@ Future changes should be documented in here.
NOTE: Storages must support using "current" as a special name in `rename_snapshot()` to
cheaply convert a snapshot into the current disk state and back.
+* Introduce `get_formats()` plugin method
+
+ Get information about the supported formats and default format according to the current storage
+ configuration. The default implemenation is backwards-compatible with previous behavior and looks
+ at the definition given in the plugin data, as well as the `format` storage configuration option,
+ which can override the default format. Must be implemented when the supported formats or default
+ format depend on the storage configuration.
+
## Version 11:
* Allow declaring storage features via plugin data
diff --git a/src/PVE/Storage.pm b/src/PVE/Storage.pm
index 6ca9f88..1faf893 100755
--- a/src/PVE/Storage.pm
+++ b/src/PVE/Storage.pm
@@ -857,10 +857,11 @@ my $volname_for_storage = sub {
my $scfg = storage_config($cfg, $storeid);
- my (undef, $valid_formats) = PVE::Storage::Plugin::default_format($scfg);
- my $format_is_valid = grep { $_ eq $format } @$valid_formats;
+ my $plugin = PVE::Storage::Plugin->lookup($scfg->{type});
+
+ my $formats = $plugin->get_formats($scfg, $storeid);
die "unsupported format '$format' for storage type $scfg->{type}\n"
- if !$format_is_valid;
+ if !$formats->{valid}->{$format};
(my $name_without_extension = $name) =~ s/\.$format$//;
@@ -1184,14 +1185,12 @@ sub vdisk_alloc {
$vmid = parse_vmid($vmid);
- my $defformat = PVE::Storage::Plugin::default_format($scfg);
+ my $plugin = PVE::Storage::Plugin->lookup($scfg->{type});
- $fmt = $defformat if !$fmt;
+ $fmt = $plugin->get_formats($scfg, $storeid)->{default} if !$fmt;
activate_storage($cfg, $storeid);
- my $plugin = PVE::Storage::Plugin->lookup($scfg->{type});
-
# lock shared storage
return $plugin->cluster_lock_storage(
$storeid,
@@ -1673,8 +1672,12 @@ sub storage_default_format {
my ($cfg, $storeid) = @_;
my $scfg = storage_config($cfg, $storeid);
+ my $plugin = PVE::Storage::Plugin->lookup($scfg->{type});
- return PVE::Storage::Plugin::default_format($scfg);
+ my $formats = $plugin->get_formats($scfg, $storeid);
+
+ return
+ wantarray ? ($formats->{default}, [sort keys $formats->{valid}->%*]) : $formats->{default};
}
sub vgroup_is_used {
diff --git a/src/PVE/Storage/Plugin.pm b/src/PVE/Storage/Plugin.pm
index ef04cb1..c3c1b63 100644
--- a/src/PVE/Storage/Plugin.pm
+++ b/src/PVE/Storage/Plugin.pm
@@ -287,23 +287,6 @@ sub storage_has_feature {
return;
}
-sub default_format {
- my ($scfg) = @_;
-
- my $type = $scfg->{type};
- my $def = $defaultData->{plugindata}->{$type};
-
- my $def_format = 'raw';
- my $valid_formats = [$def_format];
-
- if (defined($def->{format})) {
- $def_format = $scfg->{format} || $def->{format}->[1];
- $valid_formats = [sort keys %{ $def->{format}->[0] }];
- }
-
- return wantarray ? ($def_format, $valid_formats) : $def_format;
-}
-
PVE::JSONSchema::register_format('pve-storage-path', \&verify_path);
sub verify_path {
@@ -640,6 +623,44 @@ sub preallocation_cmd_opt {
# Storage implementation
+=pod
+
+=head3 get_formats
+
+ my $formats = $plugin->get_formats($scfg);
+ my $default_format = $formats->{default};
+ my $is_valid = $formats->{valid}->{$format} ? 1 : 0;
+
+Get information about the supported formats and default format according to the current storage
+configuration C<$scfg>. The return value is a hash reference with C<default> mapping to the default
+format and C<valid> mapping to a hash reference, where each supported format is present as a key
+mapping to C<1>. For example:
+
+ {
+ default => 'raw',
+ valid => {
+ 'qcow2 => 1,
+ 'raw' => 1,
+ },
+ }
+
+=cut
+
+sub get_formats {
+ my ($class, $scfg, $storeid) = @_;
+
+ my $type = $scfg->{type};
+ my $plugin_data = $defaultData->{plugindata}->{$type};
+
+ return { default => 'raw', valid => { raw => 1 } } if !defined($plugin_data->{format});
+
+ return {
+ default => $scfg->{format} || $plugin_data->{format}->[1],
+ # copy rather than passing direct reference
+ valid => { $plugin_data->{format}->[0]->%* },
+ };
+}
+
# called during addition of storage (before the new storage config got written)
# die to abort addition if there are (grave) problems
# NOTE: runs in a storage config *locked* context
@@ -1526,8 +1547,8 @@ sub list_images {
my $imagedir = $class->get_subdir($scfg, 'images');
- my ($defFmt, $vaidFmts) = default_format($scfg);
- my $fmts = join('|', @$vaidFmts);
+ my $format_info = $class->get_formats($scfg, $storeid);
+ my $fmts = join('|', sort keys $format_info->{valid}->%*);
my $res = [];
--
2.47.2
_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
^ permalink raw reply [flat|nested] 15+ messages in thread
* [pve-devel] [PATCH storage 3/9] lvm plugin: implement get_formats() method
2025-07-21 12:10 [pve-devel] [PATCH-SERIES storage/qemu-server 0/9] storage configuration-dependent format info Fiona Ebner
2025-07-21 12:10 ` [pve-devel] [PATCH storage 1/9] api change log: improve style consistency a bit Fiona Ebner
2025-07-21 12:10 ` [pve-devel] [PATCH storage 2/9] plugin: add get_formats() method and use it instead of default_format() Fiona Ebner
@ 2025-07-21 12:10 ` Fiona Ebner
2025-07-21 12:10 ` [pve-devel] [PATCH storage 4/9] api: status: rely on get_formats() method for determining format-related info Fiona Ebner
` (7 subsequent siblings)
10 siblings, 0 replies; 15+ messages in thread
From: Fiona Ebner @ 2025-07-21 12:10 UTC (permalink / raw)
To: pve-devel
As the alloc_lvm_image() helper asserts, qcow2 cannot be used as a
format without the 'snapshot-as-volume-chain' configuration option.
Therefore it is necessary to implement get_formats() and distinguish
based on the storage configuration.
In case the 'snapshot-as-volume-chain' option is set, qcow2 is even
preferred and thus declared the default format.
Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
---
src/PVE/Storage/LVMPlugin.pm | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/src/PVE/Storage/LVMPlugin.pm b/src/PVE/Storage/LVMPlugin.pm
index 8be2a10..1690e97 100644
--- a/src/PVE/Storage/LVMPlugin.pm
+++ b/src/PVE/Storage/LVMPlugin.pm
@@ -405,6 +405,16 @@ sub options {
# Storage implementation
+sub get_formats {
+ my ($class, $scfg, $storeid) = @_;
+
+ if ($scfg->{'snapshot-as-volume-chain'}) {
+ return { default => 'qcow2', valid => { 'qcow2' => 1, 'raw' => 1, } };
+ }
+
+ return { default => 'raw', valid => { 'raw' => 1 } };
+}
+
sub on_add_hook {
my ($class, $storeid, $scfg, %param) = @_;
--
2.47.2
_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
^ permalink raw reply [flat|nested] 15+ messages in thread
* [pve-devel] [PATCH storage 4/9] api: status: rely on get_formats() method for determining format-related info
2025-07-21 12:10 [pve-devel] [PATCH-SERIES storage/qemu-server 0/9] storage configuration-dependent format info Fiona Ebner
` (2 preceding siblings ...)
2025-07-21 12:10 ` [pve-devel] [PATCH storage 3/9] lvm plugin: implement get_formats() method Fiona Ebner
@ 2025-07-21 12:10 ` Fiona Ebner
2025-07-21 12:10 ` [pve-devel] [PATCH storage 5/9] introduce resolve_format_hint() helper Fiona Ebner
` (6 subsequent siblings)
10 siblings, 0 replies; 15+ messages in thread
From: Fiona Ebner @ 2025-07-21 12:10 UTC (permalink / raw)
To: pve-devel
Rely on get_formats() rather than just the static plugin data in the
'status' API call. This removes the need for the special casing for
LVM storages without the 'snapshot-as-volume-chain' option. It also
fixes the issue that the 'format' storage configuration option to
override the default format was previously ignored there.
Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
---
src/PVE/API2/Storage/Status.pm | 6 ------
src/PVE/Storage.pm | 5 +++--
2 files changed, 3 insertions(+), 8 deletions(-)
diff --git a/src/PVE/API2/Storage/Status.pm b/src/PVE/API2/Storage/Status.pm
index 25933f8..c172073 100644
--- a/src/PVE/API2/Storage/Status.pm
+++ b/src/PVE/API2/Storage/Status.pm
@@ -220,12 +220,6 @@ __PACKAGE__->register_method({
$data->{used_fraction} = ($data->{used} // 0) / $data->{total};
}
- # TODO: add support to the storage plugin system to allow returing different supported
- # formats depending on the storage config instead, this is just a stop gap!
- if (lc($data->{type}) eq 'lvm') {
- $data->{format}->[0]->{qcow2} = 0 if !$scfg->{'snapshot-as-volume-chain'};
- }
-
$res->{$storeid} = $data;
}
diff --git a/src/PVE/Storage.pm b/src/PVE/Storage.pm
index 1faf893..3286144 100755
--- a/src/PVE/Storage.pm
+++ b/src/PVE/Storage.pm
@@ -1511,9 +1511,10 @@ sub storage_info {
my $plugin = PVE::Storage::Plugin->lookup($scfg->{type});
if ($includeformat) {
+ my $formats = $plugin->get_formats($scfg, $storeid);
+ $info->{$storeid}->{format} = [$formats->{valid}, $formats->{default}];
+
my $pd = $plugin->plugindata();
- $info->{$storeid}->{format} = $pd->{format}
- if $pd->{format};
$info->{$storeid}->{select_existing} = $pd->{select_existing}
if $pd->{select_existing};
}
--
2.47.2
_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
^ permalink raw reply [flat|nested] 15+ messages in thread
* [pve-devel] [PATCH storage 5/9] introduce resolve_format_hint() helper
2025-07-21 12:10 [pve-devel] [PATCH-SERIES storage/qemu-server 0/9] storage configuration-dependent format info Fiona Ebner
` (3 preceding siblings ...)
2025-07-21 12:10 ` [pve-devel] [PATCH storage 4/9] api: status: rely on get_formats() method for determining format-related info Fiona Ebner
@ 2025-07-21 12:10 ` Fiona Ebner
2025-07-21 12:10 ` [pve-devel] [PATCH storage 6/9] default format helper: only return default format Fiona Ebner
` (5 subsequent siblings)
10 siblings, 0 replies; 15+ messages in thread
From: Fiona Ebner @ 2025-07-21 12:10 UTC (permalink / raw)
To: pve-devel
Callers interested in the list of valid formats from
storage_default_format() actually want this functionality.
Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
---
src/PVE/Storage.pm | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/src/PVE/Storage.pm b/src/PVE/Storage.pm
index 3286144..24ca19f 100755
--- a/src/PVE/Storage.pm
+++ b/src/PVE/Storage.pm
@@ -1681,6 +1681,17 @@ sub storage_default_format {
wantarray ? ($formats->{default}, [sort keys $formats->{valid}->%*]) : $formats->{default};
}
+sub resolve_format_hint {
+ my ($cfg, $storeid, $format_hint) = @_;
+
+ my $scfg = storage_config($cfg, $storeid);
+ my $plugin = PVE::Storage::Plugin->lookup($scfg->{type});
+
+ my $formats = $plugin->get_formats($scfg, $storeid);
+ return $format_hint if $format_hint && $formats->{valid}->{$format_hint};
+ return $formats->{default};
+}
+
sub vgroup_is_used {
my ($cfg, $vgname) = @_;
--
2.47.2
_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
^ permalink raw reply [flat|nested] 15+ messages in thread
* [pve-devel] [PATCH storage 6/9] default format helper: only return default format
2025-07-21 12:10 [pve-devel] [PATCH-SERIES storage/qemu-server 0/9] storage configuration-dependent format info Fiona Ebner
` (4 preceding siblings ...)
2025-07-21 12:10 ` [pve-devel] [PATCH storage 5/9] introduce resolve_format_hint() helper Fiona Ebner
@ 2025-07-21 12:10 ` Fiona Ebner
2025-07-21 12:10 ` [pve-devel] [PATCH qemu-server 7/9] make tidy Fiona Ebner
` (4 subsequent siblings)
10 siblings, 0 replies; 15+ messages in thread
From: Fiona Ebner @ 2025-07-21 12:10 UTC (permalink / raw)
To: pve-devel
Callers that required the valid formats are now using the
resolve_format_hint() helper instead.
Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
---
Versioned breaks for qemu-server needed!
src/PVE/Storage.pm | 5 +----
1 file changed, 1 insertion(+), 4 deletions(-)
diff --git a/src/PVE/Storage.pm b/src/PVE/Storage.pm
index 24ca19f..e2e6742 100755
--- a/src/PVE/Storage.pm
+++ b/src/PVE/Storage.pm
@@ -1675,10 +1675,7 @@ sub storage_default_format {
my $scfg = storage_config($cfg, $storeid);
my $plugin = PVE::Storage::Plugin->lookup($scfg->{type});
- my $formats = $plugin->get_formats($scfg, $storeid);
-
- return
- wantarray ? ($formats->{default}, [sort keys $formats->{valid}->%*]) : $formats->{default};
+ return $plugin->get_formats($scfg, $storeid)->{default};
}
sub resolve_format_hint {
--
2.47.2
_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
^ permalink raw reply [flat|nested] 15+ messages in thread
* [pve-devel] [PATCH qemu-server 7/9] make tidy
2025-07-21 12:10 [pve-devel] [PATCH-SERIES storage/qemu-server 0/9] storage configuration-dependent format info Fiona Ebner
` (5 preceding siblings ...)
2025-07-21 12:10 ` [pve-devel] [PATCH storage 6/9] default format helper: only return default format Fiona Ebner
@ 2025-07-21 12:10 ` Fiona Ebner
2025-07-21 12:10 ` [pve-devel] [PATCH qemu-server 8/9] resolve destination disk format helper: drop unused variable Fiona Ebner
` (3 subsequent siblings)
10 siblings, 0 replies; 15+ messages in thread
From: Fiona Ebner @ 2025-07-21 12:10 UTC (permalink / raw)
To: pve-devel
Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
---
src/PVE/API2/Qemu/HMPPerms.pm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/PVE/API2/Qemu/HMPPerms.pm b/src/PVE/API2/Qemu/HMPPerms.pm
index f6b32891..68213016 100644
--- a/src/PVE/API2/Qemu/HMPPerms.pm
+++ b/src/PVE/API2/Qemu/HMPPerms.pm
@@ -185,7 +185,7 @@ our $hmp_command_perms = {
sub generate_description {
my $cmd_by_priv = {};
for my $cmd (sort keys $hmp_command_perms->%*) {
- push $cmd_by_priv->{$hmp_command_perms->{$cmd}}->@*, $cmd;
+ push $cmd_by_priv->{ $hmp_command_perms->{$cmd} }->@*, $cmd;
}
my $none_cmds = delete($cmd_by_priv->{none})
or die "internal error - no commands for 'none' found";
--
2.47.2
_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
^ permalink raw reply [flat|nested] 15+ messages in thread
* [pve-devel] [PATCH qemu-server 8/9] resolve destination disk format helper: drop unused variable
2025-07-21 12:10 [pve-devel] [PATCH-SERIES storage/qemu-server 0/9] storage configuration-dependent format info Fiona Ebner
` (6 preceding siblings ...)
2025-07-21 12:10 ` [pve-devel] [PATCH qemu-server 7/9] make tidy Fiona Ebner
@ 2025-07-21 12:10 ` Fiona Ebner
2025-07-21 12:10 ` [pve-devel] [PATCH qemu-server 9/9] use storage layer's resolve_format_hint() helper where appropriate Fiona Ebner
` (2 subsequent siblings)
10 siblings, 0 replies; 15+ messages in thread
From: Fiona Ebner @ 2025-07-21 12:10 UTC (permalink / raw)
To: pve-devel
The $scfg variable in resolve_dst_disk_format() has been unused since
commit 1f961e51 ("resolve destination disk format helper: use volume
format from storage layer").
Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
---
src/PVE/QemuServer.pm | 1 -
1 file changed, 1 deletion(-)
diff --git a/src/PVE/QemuServer.pm b/src/PVE/QemuServer.pm
index d7398648..60c390bd 100644
--- a/src/PVE/QemuServer.pm
+++ b/src/PVE/QemuServer.pm
@@ -7964,7 +7964,6 @@ sub resolve_dst_disk_format {
if (!$format) {
# if no target format is specified, use the source disk format as hint
if ($src_volid) {
- my $scfg = PVE::Storage::storage_config($storecfg, $storeid);
$format = checked_volume_format($storecfg, $src_volid);
} else {
return $defFormat;
--
2.47.2
_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
^ permalink raw reply [flat|nested] 15+ messages in thread
* [pve-devel] [PATCH qemu-server 9/9] use storage layer's resolve_format_hint() helper where appropriate
2025-07-21 12:10 [pve-devel] [PATCH-SERIES storage/qemu-server 0/9] storage configuration-dependent format info Fiona Ebner
` (7 preceding siblings ...)
2025-07-21 12:10 ` [pve-devel] [PATCH qemu-server 8/9] resolve destination disk format helper: drop unused variable Fiona Ebner
@ 2025-07-21 12:10 ` Fiona Ebner
2025-07-21 16:26 ` [pve-devel] [PATCH-SERIES storage/qemu-server 0/9] storage configuration-dependent format info Max R. Carrara
2025-07-22 13:03 ` [pve-devel] applied-series: " Wolfgang Bumiller
10 siblings, 0 replies; 15+ messages in thread
From: Fiona Ebner @ 2025-07-21 12:10 UTC (permalink / raw)
To: pve-devel
This also fixes an issue that the check_and_prepare_fleecing() helper
would always try 'raw' (which might not even be supported) rather than
the storage's default format.
Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
---
Dependency bump for pve-storage needed.
src/PVE/QemuServer.pm | 28 ++++++++--------------------
src/PVE/VZDump/QemuServer.pm | 5 ++---
2 files changed, 10 insertions(+), 23 deletions(-)
diff --git a/src/PVE/QemuServer.pm b/src/PVE/QemuServer.pm
index 60c390bd..f8fb472a 100644
--- a/src/PVE/QemuServer.pm
+++ b/src/PVE/QemuServer.pm
@@ -5337,8 +5337,7 @@ sub vm_migrate_alloc_nbd_disks {
# order of precedence, filtered by whether storage supports it:
# 1. explicit requested format
# 2. default format of storage
- my ($defFormat, $validFormats) = PVE::Storage::storage_default_format($storecfg, $storeid);
- $format = $defFormat if !$format || !grep { $format eq $_ } $validFormats->@*;
+ $format = PVE::Storage::resolve_format_hint($storecfg, $storeid, $format);
my $size = $drive->{size} / 1024;
my $newvolid = PVE::Storage::vdisk_alloc($storecfg, $storeid, $vmid, $format, undef, $size);
@@ -6452,11 +6451,8 @@ my $restore_allocate_devices = sub {
my $storeid = $d->{storeid};
my $scfg = PVE::Storage::storage_config($storecfg, $storeid);
- # test if requested format is supported
- my ($defFormat, $validFormats) =
- PVE::Storage::storage_default_format($storecfg, $storeid);
- my $supported = grep { $_ eq $d->{format} } @$validFormats;
- $d->{format} = $defFormat if !$supported;
+ # falls back to default format if requested format is not supported
+ $d->{format} = PVE::Storage::resolve_format_hint($storecfg, $storeid, $d->{format});
my $name;
if ($d->{is_cloudinit}) {
@@ -7959,21 +7955,13 @@ sub scsihw_infos {
sub resolve_dst_disk_format {
my ($storecfg, $storeid, $src_volid, $format) = @_;
- my ($defFormat, $validFormats) = PVE::Storage::storage_default_format($storecfg, $storeid);
-
- if (!$format) {
- # if no target format is specified, use the source disk format as hint
- if ($src_volid) {
- $format = checked_volume_format($storecfg, $src_volid);
- } else {
- return $defFormat;
- }
+ # if no target format is specified, use the source disk format as hint
+ if (!$format && $src_volid) {
+ $format = checked_volume_format($storecfg, $src_volid);
}
- # test if requested format is supported - else use default
- my $supported = grep { $_ eq $format } @$validFormats;
- $format = $defFormat if !$supported;
- return $format;
+ # falls back to default format if requested format is not supported
+ return PVE::Storage::resolve_format_hint($storecfg, $storeid, $format);
}
sub generate_uuid {
diff --git a/src/PVE/VZDump/QemuServer.pm b/src/PVE/VZDump/QemuServer.pm
index eb85106c..5b94c369 100644
--- a/src/PVE/VZDump/QemuServer.pm
+++ b/src/PVE/VZDump/QemuServer.pm
@@ -698,9 +698,8 @@ my sub check_and_prepare_fleecing {
if ($use_fleecing) {
$self->query_block_node_sizes($vmid, $disks);
- my ($default_format, $valid_formats) =
- PVE::Storage::storage_default_format($self->{storecfg}, $fleecing_opts->{storage});
- my $format = scalar(grep { $_ eq 'qcow2' } $valid_formats->@*) ? 'qcow2' : 'raw';
+ my $format = PVE::Storage::resolve_format_hint($self->{storecfg}, $fleecing_opts->{storage},
+ 'qcow2');
allocate_fleecing_images(
$self,
--
2.47.2
_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [pve-devel] [PATCH-SERIES storage/qemu-server 0/9] storage configuration-dependent format info
2025-07-21 12:10 [pve-devel] [PATCH-SERIES storage/qemu-server 0/9] storage configuration-dependent format info Fiona Ebner
` (8 preceding siblings ...)
2025-07-21 12:10 ` [pve-devel] [PATCH qemu-server 9/9] use storage layer's resolve_format_hint() helper where appropriate Fiona Ebner
@ 2025-07-21 16:26 ` Max R. Carrara
2025-07-22 13:03 ` [pve-devel] applied-series: " Wolfgang Bumiller
10 siblings, 0 replies; 15+ messages in thread
From: Max R. Carrara @ 2025-07-21 16:26 UTC (permalink / raw)
To: Proxmox VE development discussion
On Mon Jul 21, 2025 at 2:10 PM CEST, Fiona Ebner wrote:
> The LVM plugin can only use qcow2 format when the
> 'snapshot-as-volume-chain' configuration option is set. The format
> information is currently only recorded statically in the plugin data.
> This causes issues, for example, restoring a guest volume that uses
> qcow2 as a format hint on an LVM storage without the option set will
> fail, because the plugin data indicates that qcow2 is supported.
> Introduce a dedicated method, so that plugins can indicate what
> actually is supported according to the storage configuration.
>
> In case the 'snapshot-as-volume-chain' option is set for the LVM
> storage, qcow2 is even preferred and thus declared the default format.
>
> As a second step, a dedicated resolve_format_hint() helper is
> introduced.
>
> That second part requires a dependency and a breaks between
> qemu-server and pve-storage.
Review
------
No surprises here in terms of the code itself; the commits are easy to
follow as well. Can't spot anything that's off. I'm also always happy to
see a docstring being added ;P
I've also double-checked whether the removal of Plugin::default_format()
was fine; a quick `rg` through all my local repositories didn't spot
anything at least.
Testing
-------
Built this series by building pve-storage first, installing it, and then
building qemu-server. (Took me a hot minute to find that out though,
since I had skimmed over your note regarding dependency updates / breaks
above, woops.)
Tested this by configuring a fresh LVM (thick) storage with
storage-managed snapshots, installing a new Debian VM, and then running
a snapshot as well as a rollback after making a couple changes inside
the VM.
Haven't noticed anything off in regards to this series overall.
Summary
-------
Seems to do what it says on the tin, so... LGTM.
Consider:
Reviewed-by: Max R. Carrara <m.carrara@proxmox.com>
Tested-by: Max R. Carrara <m.carrara@proxmox.com>
>
> storage:
>
> Fiona Ebner (6):
> api change log: improve style consistency a bit
> plugin: add get_formats() method and use it instead of
> default_format()
> lvm plugin: implement get_formats() method
> api: status: rely on get_formats() method for determining
> format-related info
> introduce resolve_format_hint() helper
> default format helper: only return default format
>
> ApiChangeLog | 22 +++++++++----
> src/PVE/API2/Storage/Status.pm | 6 ----
> src/PVE/Storage.pm | 32 ++++++++++++------
> src/PVE/Storage/LVMPlugin.pm | 10 ++++++
> src/PVE/Storage/Plugin.pm | 59 +++++++++++++++++++++++-----------
> 5 files changed, 88 insertions(+), 41 deletions(-)
>
>
> qemu-server:
>
> Fiona Ebner (3):
> make tidy
> resolve destination disk format helper: drop unused variable
> use storage layer's resolve_format_hint() helper where appropriate
>
> src/PVE/API2/Qemu/HMPPerms.pm | 2 +-
> src/PVE/QemuServer.pm | 29 ++++++++---------------------
> src/PVE/VZDump/QemuServer.pm | 5 ++---
> 3 files changed, 11 insertions(+), 25 deletions(-)
>
>
> Summary over all repositories:
> 8 files changed, 99 insertions(+), 66 deletions(-)
_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [pve-devel] [PATCH storage 2/9] plugin: add get_formats() method and use it instead of default_format()
2025-07-21 12:10 ` [pve-devel] [PATCH storage 2/9] plugin: add get_formats() method and use it instead of default_format() Fiona Ebner
@ 2025-07-22 12:13 ` Wolfgang Bumiller
0 siblings, 0 replies; 15+ messages in thread
From: Wolfgang Bumiller @ 2025-07-22 12:13 UTC (permalink / raw)
To: Fiona Ebner; +Cc: pve-devel
minor nit but the whole storage side LGTM
On Mon, Jul 21, 2025 at 02:10:47PM +0200, Fiona Ebner wrote:
> The LVM plugin can only use qcow2 format when the
> 'snapshot-as-volume-chain' configuration option is set. The format
> information is currently only recorded statically in the plugin data.
> This causes issues, for example, restoring a guest volume that uses
> qcow2 as a format hint on an LVM storage without the option set will
> fail, because the plugin data indicates that qcow2 is supported.
> Introduce a dedicated method, so that plugins can indicate what
> actually is supported according to the storage configuration.
>
> The implementation for LVM is done in a separate commit.
>
> Remove the now unused default_format() function from Plugin.pm.
>
> Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
> ---
> ApiChangeLog | 8 ++++++
> src/PVE/Storage.pm | 19 +++++++------
> src/PVE/Storage/Plugin.pm | 59 ++++++++++++++++++++++++++-------------
> 3 files changed, 59 insertions(+), 27 deletions(-)
>
> diff --git a/ApiChangeLog b/ApiChangeLog
> index 0984afb..d80bfb3 100644
> --- a/ApiChangeLog
> +++ b/ApiChangeLog
> @@ -49,6 +49,14 @@ Future changes should be documented in here.
> NOTE: Storages must support using "current" as a special name in `rename_snapshot()` to
> cheaply convert a snapshot into the current disk state and back.
>
> +* Introduce `get_formats()` plugin method
> +
> + Get information about the supported formats and default format according to the current storage
> + configuration. The default implemenation is backwards-compatible with previous behavior and looks
> + at the definition given in the plugin data, as well as the `format` storage configuration option,
> + which can override the default format. Must be implemented when the supported formats or default
> + format depend on the storage configuration.
> +
> ## Version 11:
>
> * Allow declaring storage features via plugin data
> diff --git a/src/PVE/Storage.pm b/src/PVE/Storage.pm
> index 6ca9f88..1faf893 100755
> --- a/src/PVE/Storage.pm
> +++ b/src/PVE/Storage.pm
> @@ -857,10 +857,11 @@ my $volname_for_storage = sub {
>
> my $scfg = storage_config($cfg, $storeid);
>
> - my (undef, $valid_formats) = PVE::Storage::Plugin::default_format($scfg);
> - my $format_is_valid = grep { $_ eq $format } @$valid_formats;
> + my $plugin = PVE::Storage::Plugin->lookup($scfg->{type});
> +
> + my $formats = $plugin->get_formats($scfg, $storeid);
> die "unsupported format '$format' for storage type $scfg->{type}\n"
> - if !$format_is_valid;
> + if !$formats->{valid}->{$format};
>
> (my $name_without_extension = $name) =~ s/\.$format$//;
>
> @@ -1184,14 +1185,12 @@ sub vdisk_alloc {
>
> $vmid = parse_vmid($vmid);
>
> - my $defformat = PVE::Storage::Plugin::default_format($scfg);
> + my $plugin = PVE::Storage::Plugin->lookup($scfg->{type});
>
> - $fmt = $defformat if !$fmt;
> + $fmt = $plugin->get_formats($scfg, $storeid)->{default} if !$fmt;
>
> activate_storage($cfg, $storeid);
>
> - my $plugin = PVE::Storage::Plugin->lookup($scfg->{type});
> -
> # lock shared storage
> return $plugin->cluster_lock_storage(
> $storeid,
> @@ -1673,8 +1672,12 @@ sub storage_default_format {
> my ($cfg, $storeid) = @_;
>
> my $scfg = storage_config($cfg, $storeid);
> + my $plugin = PVE::Storage::Plugin->lookup($scfg->{type});
>
> - return PVE::Storage::Plugin::default_format($scfg);
> + my $formats = $plugin->get_formats($scfg, $storeid);
> +
> + return
> + wantarray ? ($formats->{default}, [sort keys $formats->{valid}->%*]) : $formats->{default};
> }
>
> sub vgroup_is_used {
> diff --git a/src/PVE/Storage/Plugin.pm b/src/PVE/Storage/Plugin.pm
> index ef04cb1..c3c1b63 100644
> --- a/src/PVE/Storage/Plugin.pm
> +++ b/src/PVE/Storage/Plugin.pm
> @@ -287,23 +287,6 @@ sub storage_has_feature {
> return;
> }
>
> -sub default_format {
> - my ($scfg) = @_;
> -
> - my $type = $scfg->{type};
> - my $def = $defaultData->{plugindata}->{$type};
> -
> - my $def_format = 'raw';
> - my $valid_formats = [$def_format];
> -
> - if (defined($def->{format})) {
> - $def_format = $scfg->{format} || $def->{format}->[1];
> - $valid_formats = [sort keys %{ $def->{format}->[0] }];
> - }
> -
> - return wantarray ? ($def_format, $valid_formats) : $def_format;
> -}
> -
> PVE::JSONSchema::register_format('pve-storage-path', \&verify_path);
>
> sub verify_path {
> @@ -640,6 +623,44 @@ sub preallocation_cmd_opt {
>
> # Storage implementation
>
> +=pod
> +
↑ can be dropped
> +=head3 get_formats
> +
> + my $formats = $plugin->get_formats($scfg);
↑ misses the `$storeid` parameter
> + my $default_format = $formats->{default};
> + my $is_valid = $formats->{valid}->{$format} ? 1 : 0;
↑ could just use !! instead of `? 1 : 0`
> +
> +Get information about the supported formats and default format according to the current storage
> +configuration C<$scfg>. The return value is a hash reference with C<default> mapping to the default
> +format and C<valid> mapping to a hash reference, where each supported format is present as a key
> +mapping to C<1>. For example:
> +
> + {
> + default => 'raw',
> + valid => {
> + 'qcow2 => 1,
> + 'raw' => 1,
> + },
> + }
> +
> +=cut
> +
> +sub get_formats {
> + my ($class, $scfg, $storeid) = @_;
> +
> + my $type = $scfg->{type};
> + my $plugin_data = $defaultData->{plugindata}->{$type};
> +
> + return { default => 'raw', valid => { raw => 1 } } if !defined($plugin_data->{format});
> +
> + return {
> + default => $scfg->{format} || $plugin_data->{format}->[1],
> + # copy rather than passing direct reference
> + valid => { $plugin_data->{format}->[0]->%* },
> + };
> +}
> +
> # called during addition of storage (before the new storage config got written)
> # die to abort addition if there are (grave) problems
> # NOTE: runs in a storage config *locked* context
> @@ -1526,8 +1547,8 @@ sub list_images {
>
> my $imagedir = $class->get_subdir($scfg, 'images');
>
> - my ($defFmt, $vaidFmts) = default_format($scfg);
> - my $fmts = join('|', @$vaidFmts);
> + my $format_info = $class->get_formats($scfg, $storeid);
> + my $fmts = join('|', sort keys $format_info->{valid}->%*);
>
> my $res = [];
>
> --
> 2.47.2
_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
^ permalink raw reply [flat|nested] 15+ messages in thread
* [pve-devel] applied-series: [PATCH-SERIES storage/qemu-server 0/9] storage configuration-dependent format info
2025-07-21 12:10 [pve-devel] [PATCH-SERIES storage/qemu-server 0/9] storage configuration-dependent format info Fiona Ebner
` (9 preceding siblings ...)
2025-07-21 16:26 ` [pve-devel] [PATCH-SERIES storage/qemu-server 0/9] storage configuration-dependent format info Max R. Carrara
@ 2025-07-22 13:03 ` Wolfgang Bumiller
2025-07-22 14:17 ` Max R. Carrara
10 siblings, 1 reply; 15+ messages in thread
From: Wolfgang Bumiller @ 2025-07-22 13:03 UTC (permalink / raw)
To: Fiona Ebner; +Cc: pve-devel
applied series thanks
(fixed up the doc nits and dropped the make-tidy patch on qemu-server as
that was already fixed up in git)
On Mon, Jul 21, 2025 at 02:10:45PM +0200, Fiona Ebner wrote:
> The LVM plugin can only use qcow2 format when the
> 'snapshot-as-volume-chain' configuration option is set. The format
> information is currently only recorded statically in the plugin data.
> This causes issues, for example, restoring a guest volume that uses
> qcow2 as a format hint on an LVM storage without the option set will
> fail, because the plugin data indicates that qcow2 is supported.
> Introduce a dedicated method, so that plugins can indicate what
> actually is supported according to the storage configuration.
>
> In case the 'snapshot-as-volume-chain' option is set for the LVM
> storage, qcow2 is even preferred and thus declared the default format.
>
> As a second step, a dedicated resolve_format_hint() helper is
> introduced.
>
> That second part requires a dependency and a breaks between
> qemu-server and pve-storage.
>
> storage:
>
> Fiona Ebner (6):
> api change log: improve style consistency a bit
> plugin: add get_formats() method and use it instead of
> default_format()
> lvm plugin: implement get_formats() method
> api: status: rely on get_formats() method for determining
> format-related info
> introduce resolve_format_hint() helper
> default format helper: only return default format
>
> ApiChangeLog | 22 +++++++++----
> src/PVE/API2/Storage/Status.pm | 6 ----
> src/PVE/Storage.pm | 32 ++++++++++++------
> src/PVE/Storage/LVMPlugin.pm | 10 ++++++
> src/PVE/Storage/Plugin.pm | 59 +++++++++++++++++++++++-----------
> 5 files changed, 88 insertions(+), 41 deletions(-)
>
>
> qemu-server:
>
> Fiona Ebner (3):
> make tidy
> resolve destination disk format helper: drop unused variable
> use storage layer's resolve_format_hint() helper where appropriate
>
> src/PVE/API2/Qemu/HMPPerms.pm | 2 +-
> src/PVE/QemuServer.pm | 29 ++++++++---------------------
> src/PVE/VZDump/QemuServer.pm | 5 ++---
> 3 files changed, 11 insertions(+), 25 deletions(-)
>
>
> Summary over all repositories:
> 8 files changed, 99 insertions(+), 66 deletions(-)
>
> --
> Generated by git-murpp 0.5.0
_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [pve-devel] applied-series: [PATCH-SERIES storage/qemu-server 0/9] storage configuration-dependent format info
2025-07-22 13:03 ` [pve-devel] applied-series: " Wolfgang Bumiller
@ 2025-07-22 14:17 ` Max R. Carrara
2025-07-23 11:49 ` Wolfgang Bumiller
0 siblings, 1 reply; 15+ messages in thread
From: Max R. Carrara @ 2025-07-22 14:17 UTC (permalink / raw)
To: Proxmox VE development discussion, Fiona Ebner
On Tue Jul 22, 2025 at 3:03 PM CEST, Wolfgang Bumiller wrote:
> applied series thanks
>
> (fixed up the doc nits and dropped the make-tidy patch on qemu-server as
> that was already fixed up in git)
Is there a specific reason why my R-b & T-b trailers weren't added? :s
_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [pve-devel] applied-series: [PATCH-SERIES storage/qemu-server 0/9] storage configuration-dependent format info
2025-07-22 14:17 ` Max R. Carrara
@ 2025-07-23 11:49 ` Wolfgang Bumiller
0 siblings, 0 replies; 15+ messages in thread
From: Wolfgang Bumiller @ 2025-07-23 11:49 UTC (permalink / raw)
To: Max R. Carrara; +Cc: Proxmox VE development discussion
On Tue, Jul 22, 2025 at 04:17:23PM +0200, Max R. Carrara wrote:
> On Tue Jul 22, 2025 at 3:03 PM CEST, Wolfgang Bumiller wrote:
> > applied series thanks
> >
> > (fixed up the doc nits and dropped the make-tidy patch on qemu-server as
> > that was already fixed up in git)
>
> Is there a specific reason why my R-b & T-b trailers weren't added? :s
No, I just used the wrong apply hotkey...
_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
^ permalink raw reply [flat|nested] 15+ messages in thread
end of thread, other threads:[~2025-07-23 11:48 UTC | newest]
Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-07-21 12:10 [pve-devel] [PATCH-SERIES storage/qemu-server 0/9] storage configuration-dependent format info Fiona Ebner
2025-07-21 12:10 ` [pve-devel] [PATCH storage 1/9] api change log: improve style consistency a bit Fiona Ebner
2025-07-21 12:10 ` [pve-devel] [PATCH storage 2/9] plugin: add get_formats() method and use it instead of default_format() Fiona Ebner
2025-07-22 12:13 ` Wolfgang Bumiller
2025-07-21 12:10 ` [pve-devel] [PATCH storage 3/9] lvm plugin: implement get_formats() method Fiona Ebner
2025-07-21 12:10 ` [pve-devel] [PATCH storage 4/9] api: status: rely on get_formats() method for determining format-related info Fiona Ebner
2025-07-21 12:10 ` [pve-devel] [PATCH storage 5/9] introduce resolve_format_hint() helper Fiona Ebner
2025-07-21 12:10 ` [pve-devel] [PATCH storage 6/9] default format helper: only return default format Fiona Ebner
2025-07-21 12:10 ` [pve-devel] [PATCH qemu-server 7/9] make tidy Fiona Ebner
2025-07-21 12:10 ` [pve-devel] [PATCH qemu-server 8/9] resolve destination disk format helper: drop unused variable Fiona Ebner
2025-07-21 12:10 ` [pve-devel] [PATCH qemu-server 9/9] use storage layer's resolve_format_hint() helper where appropriate Fiona Ebner
2025-07-21 16:26 ` [pve-devel] [PATCH-SERIES storage/qemu-server 0/9] storage configuration-dependent format info Max R. Carrara
2025-07-22 13:03 ` [pve-devel] applied-series: " Wolfgang Bumiller
2025-07-22 14:17 ` Max R. Carrara
2025-07-23 11:49 ` Wolfgang Bumiller
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox