all lists on lists.proxmox.com
 help / color / mirror / Atom feed
From: Fiona Ebner <f.ebner@proxmox.com>
To: pve-devel@lists.proxmox.com
Subject: [pve-devel] [RFC storage 1/3] plugin: add method to get qemu blockdevice options for volume
Date: Fri,  9 May 2025 16:15:30 +0200	[thread overview]
Message-ID: <20250509141532.111458-3-f.ebner@proxmox.com> (raw)
In-Reply-To: <20250509141532.111458-1-f.ebner@proxmox.com>

There intentionally is only handling for absolute paths in the default
plugin implementation. Any plugin requiring more needs to implement
the method itself.

Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
---

I discussed this with Fabian off-list. With PVE 9 being a major
release and most popular plugins not using special protocols like
'rbd://', this seems acceptable. He'll also give a heads-up to known
plugin developers with other changes for PVE 9 in time.

For NBD, etc. qemu-server should construct the blockdev object.

Still missing API bump + Changelog

Did not test snapshots yet.

 src/PVE/Storage.pm        | 19 ++++++++++++
 src/PVE/Storage/Plugin.pm | 64 +++++++++++++++++++++++++++++++++++++++
 2 files changed, 83 insertions(+)

diff --git a/src/PVE/Storage.pm b/src/PVE/Storage.pm
index d0a696a..5915395 100755
--- a/src/PVE/Storage.pm
+++ b/src/PVE/Storage.pm
@@ -710,6 +710,25 @@ sub abs_filesystem_path {
     return $path;
 }
 
+sub qemu_blockdev_options {
+    my ($cfg, $volid, $snapname) = @_;
+
+    my ($storeid, $volname) = parse_volume_id($volid);
+
+    my $scfg = storage_config($cfg, $storeid);
+
+    my $plugin = PVE::Storage::Plugin->lookup($scfg->{type});
+
+    my ($vtype) = $plugin->parse_volname($volname);
+    die "cannot use volume of type '$vtype' as a QEMU blockdevice\n"
+	if $vtype ne 'images' && $vtype ne 'iso' && $vtype ne 'import';
+
+    die "QEMU blockdevice - 'snapname' argument is not supported for vtype '$vtype'"
+	if $snapname && $vtype ne 'images';
+
+    return $plugin->qemu_blockdev_options($scfg, $storeid, $volname, $snapname);
+}
+
 # used as last resort to adapt volnames when migrating
 my $volname_for_storage = sub {
     my ($cfg, $storeid, $name, $vmid, $format) = @_;
diff --git a/src/PVE/Storage/Plugin.pm b/src/PVE/Storage/Plugin.pm
index 4e16420..dc3c6df 100644
--- a/src/PVE/Storage/Plugin.pm
+++ b/src/PVE/Storage/Plugin.pm
@@ -1880,6 +1880,70 @@ sub rename_volume {
     return "${storeid}:${base}${target_vmid}/${target_volname}";
 }
 
+=pod
+
+=head3 qemu_blockdev_options
+
+    $blockdev = $plugin->qemu_blockdev_options($scfg, $storeid, $volname, $snapname)
+
+Returns a hash reference with the basic options needed to open the volume via QEMU's C<-blockdev>
+API. This at least requires a C<< $blockdev->{driver} >> and a reference to the image, e.g.
+C<< $blockdev->{filename} >> for the C<file> driver. For files, the C<file> driver can be used. For
+host block devices, the C<host_device> driver can be used. The plugin must not set options like
+C<cache> or C<aio>. Those are managed by qemu-server and will be overwritten. For other available
+drivers and the exact specification of the options, see
+L<https://qemu.readthedocs.io/en/master/interop/qemu-qmp-ref.html#object-QMP-block-core.BlockdevOptions>
+
+While Perl does not have explicit types, the result will need to be converted to JSON later and
+match the QMP specification (see link above), so implicit types are important. In the return value,
+use C<JSON::true> and C<JSON::false> for booleans, C<"$value"> for strings, and C<int($value)> for
+integers.
+
+Arguments:
+
+=over
+
+=item C<$scfg>
+
+The hash reference with the storage configuration.
+
+=item C<$storeid>
+
+The storage ID.
+
+=item C<$volume>
+
+The volume name.
+
+=item C<$snapname>
+
+(optional) The snapshot name. Set when the associated snapshot should be opened
+rather than the volume itself.
+
+=back
+
+=cut
+sub qemu_blockdev_options {
+    my ($class, $scfg, $storeid, $volname, $snapname) = @_;
+
+    my $blockdev = {};
+
+    my ($path) = $class->path($scfg, $volname, $storeid, $snapname);
+
+    if ($path =~ m|^/|) {
+	# The 'file' driver only works for regular files. The check below is taken from
+	# block/file-posix.c:hdev_probe_device() in QEMU. Do not bother with detecting 'host_cdrom'
+	# devices here, those are not managed by the storage layer.
+	my $st = File::stat::stat($path);
+	my $driver = (S_ISCHR($st->mode) || S_ISBLK($st->mode)) ? 'host_device' : 'file';
+	$blockdev = { driver => $driver, filename => $path };
+    } else {
+	die "storage plugin doesn't implement qemu_blockdev_options() method\n";
+    }
+
+    return $blockdev;
+}
+
 # Used by storage plugins for external backup providers. See PVE::BackupProvider::Plugin for the API
 # the provider needs to implement.
 #
-- 
2.39.5



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


  parent reply	other threads:[~2025-05-09 14:15 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-05-09 14:15 [pve-devel] [RFC qemu/pve-storage] storage plugin " Fiona Ebner
2025-05-09 14:15 ` [pve-devel] [RFC qemu 1/1] block/rbd: add @keyring-file option to BlockdevOptionsRbd Fiona Ebner
2025-05-12 10:57   ` DERUMIER, Alexandre via pve-devel
     [not found]   ` <dfc78aa17b9c1c8496fa74cb6e6d2517337b65c0.camel@groupe-cyllene.com>
2025-05-12 11:25     ` Fiona Ebner
2025-05-12 13:39       ` DERUMIER, Alexandre via pve-devel
     [not found]       ` <330ddb6da2469b425acda6ceb9cdaf5a510a854f.camel@groupe-cyllene.com>
2025-05-12 14:36         ` Fiona Ebner
2025-05-12 14:53           ` DERUMIER, Alexandre via pve-devel
2025-05-09 14:15 ` Fiona Ebner [this message]
2025-05-23  8:19   ` [pve-devel] [RFC storage 1/3] plugin: add method to get qemu blockdevice options for volume DERUMIER, Alexandre via pve-devel
2025-05-23  8:30   ` DERUMIER, Alexandre via pve-devel
     [not found]   ` <eeb11ec08d36c3a6f5290134158e91ad7be8b432.camel@groupe-cyllene.com>
2025-05-23  8:32     ` Fiona Ebner
2025-05-23  8:42       ` DERUMIER, Alexandre via pve-devel
     [not found]       ` <2efc51be0c973a3055e8214beef06ea9a1c6583b.camel@groupe-cyllene.com>
2025-05-23  8:46         ` Fiona Ebner
     [not found]   ` <175dd76aa95365010c8448bdd15eddf30aa39641.camel@groupe-cyllene.com>
2025-05-23  8:38     ` Fiona Ebner
2025-05-23  8:50       ` DERUMIER, Alexandre via pve-devel
     [not found]       ` <67db7959a03a391df39e9b5af24edc2bed48a21d.camel@groupe-cyllene.com>
2025-05-23  8:54         ` Fiona Ebner
2025-05-23  9:15           ` DERUMIER, Alexandre via pve-devel
     [not found]           ` <abbb8159177112d0f1f44d1dccc8fc3907bccb73.camel@groupe-cyllene.com>
2025-05-23  9:18             ` Fiona Ebner
2025-05-23  9:23               ` DERUMIER, Alexandre via pve-devel
2025-05-23  9:34               ` DERUMIER, Alexandre via pve-devel
     [not found]               ` <abebd4ee7f1197d9e549203355c9482bd7b1004a.camel@groupe-cyllene.com>
2025-05-23  9:53                 ` Fiona Ebner
2025-05-23 10:30                   ` DERUMIER, Alexandre via pve-devel
2025-05-09 14:15 ` [pve-devel] [RFC storage 2/3] iscsi direct plugin: implement method to get qemu blockdevice options Fiona Ebner
2025-05-12 13:14   ` Fiona Ebner
2025-05-09 14:15 ` [pve-devel] [RFC storage 3/3] rbd plugin: implement new " Fiona Ebner
2025-05-09 14:21 ` [pve-devel] [RFC qemu/pve-storage] storage plugin method to get qemu blockdevice options for volume Fiona Ebner

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=20250509141532.111458-3-f.ebner@proxmox.com \
    --to=f.ebner@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.
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal