From: Friedrich Weber <f.weber@proxmox.com>
To: pve-devel@lists.proxmox.com
Subject: [pve-devel] [PATCH pve-storage 1/2] plugin: map/activate volume: allow callers to pass hints
Date: Fri, 24 Oct 2025 14:25:53 +0200 [thread overview]
Message-ID: <20251024122705.93761-2-f.weber@proxmox.com> (raw)
In-Reply-To: <20251024122705.93761-1-f.weber@proxmox.com>
Right now, the only supported hint is guest-ostype, via which
qemu-server provides the guest's OS type from the VM configuration.
Signed-off-by: Friedrich Weber <f.weber@proxmox.com>
---
src/PVE/Storage.pm | 34 ++++++++++++++++++++++++++++++----
src/PVE/Storage/Plugin.pm | 17 +++++++++++++++--
2 files changed, 45 insertions(+), 6 deletions(-)
diff --git a/src/PVE/Storage.pm b/src/PVE/Storage.pm
index 1dde2b7..709d9ca 100755
--- a/src/PVE/Storage.pm
+++ b/src/PVE/Storage.pm
@@ -771,6 +771,7 @@ sub abs_filesystem_path {
my $path;
if (parse_volume_id($volid, 1)) {
+ # TODO: in order to pass $hints, abs_filesystem_path needs to accept it too
activate_volumes($cfg, [$volid]);
$path = PVE::Storage::path($cfg, $volid);
} else {
@@ -905,6 +906,7 @@ my $volume_export_prepare = sub {
volume_snapshot($cfg, $volid, $snapshot) if $migration_snapshot;
+ # TODO: in order to pass $hints, $volume_export_prepare would need to accept it too
if (defined($snapshot)) {
activate_volumes($cfg, [$volid], $snapshot);
} else {
@@ -1122,7 +1124,9 @@ sub vdisk_create_base {
}
sub map_volume {
- my ($cfg, $volid, $snapname) = @_;
+ my ($cfg, $volid, $snapname, $hints) = @_;
+
+ verify_hints($hints);
my ($storeid, $volname) = parse_volume_id($volid);
@@ -1130,7 +1134,7 @@ sub map_volume {
my $plugin = PVE::Storage::Plugin->lookup($scfg->{type});
- return $plugin->map_volume($storeid, $scfg, $volname, $snapname);
+ return $plugin->map_volume($storeid, $scfg, $volname, $snapname, $hints);
}
sub unmap_volume {
@@ -1385,11 +1389,33 @@ sub deactivate_storage {
$plugin->deactivate_storage($storeid, $scfg, $cache);
}
+sub is_hint_supported {
+ my ($hint) = @_;
+
+ return defined($PVE::Storage::Plugin::hints_properties->{$hint});
+}
+
+sub verify_hints {
+ my ($hints, $noerr) = @_;
+
+ return if !defined($hints);
+
+ eval { PVE::JSONSchema::validate($hints, $PVE::Storage::Plugin::hints_format); };
+ my $err = $@;
+
+ return $hints if !$err;
+ return if $noerr;
+
+ die "hints are not valid: $@";
+}
+
sub activate_volumes {
- my ($cfg, $vollist, $snapname) = @_;
+ my ($cfg, $vollist, $snapname, $hints) = @_;
return if !($vollist && scalar(@$vollist));
+ verify_hints($hints);
+
my $storagehash = {};
foreach my $volid (@$vollist) {
my ($storeid, undef) = parse_volume_id($volid);
@@ -1404,7 +1430,7 @@ sub activate_volumes {
my ($storeid, $volname) = parse_volume_id($volid);
my $scfg = storage_config($cfg, $storeid);
my $plugin = PVE::Storage::Plugin->lookup($scfg->{type});
- $plugin->activate_volume($storeid, $scfg, $volname, $snapname, $cache);
+ $plugin->activate_volume($storeid, $scfg, $volname, $snapname, $cache, $hints);
}
}
diff --git a/src/PVE/Storage/Plugin.pm b/src/PVE/Storage/Plugin.pm
index 8acd214..2c72179 100644
--- a/src/PVE/Storage/Plugin.pm
+++ b/src/PVE/Storage/Plugin.pm
@@ -59,6 +59,19 @@ cfs_register_file(
sub { __PACKAGE__->write_config(@_); },
);
+our $hints_properties = {
+ 'guest-ostype' => {
+ type => 'string',
+ optional => 1,
+ },
+};
+
+our $hints_format = {
+ type => 'object',
+ additionalProperties => 0,
+ properties => $hints_properties,
+};
+
my %prune_option = (
optional => 1,
type => 'integer',
@@ -1871,7 +1884,7 @@ sub deactivate_storage {
}
sub map_volume {
- my ($class, $storeid, $scfg, $volname, $snapname) = @_;
+ my ($class, $storeid, $scfg, $volname, $snapname, $hints) = @_;
my ($path) = $class->path($scfg, $volname, $storeid, $snapname);
return $path;
@@ -1884,7 +1897,7 @@ sub unmap_volume {
}
sub activate_volume {
- my ($class, $storeid, $scfg, $volname, $snapname, $cache) = @_;
+ my ($class, $storeid, $scfg, $volname, $snapname, $cache, $hints) = @_;
my $path = $class->filesystem_path($scfg, $volname, $snapname);
--
2.47.3
_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
next prev parent reply other threads:[~2025-10-24 12:27 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-10-24 12:25 [pve-devel] [RFC qemu-server/storage 0/3] fix #5779: introduce guest hints to pass rxbounce flag to KRBD Friedrich Weber
2025-10-24 12:25 ` Friedrich Weber [this message]
2025-10-24 12:25 ` [pve-devel] [PATCH pve-storage 2/2] plugin: rbd: pass rxbounce when mapping Windows VM disks Friedrich Weber
2025-10-24 12:25 ` [pve-devel] [PATCH qemu-server 1/1] fix #5997: qemu: pass guest-ostype hint when activating volumes Friedrich Weber
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=20251024122705.93761-2-f.weber@proxmox.com \
--to=f.weber@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 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.