On June 26, 2025 4:40 pm, Fiona Ebner wrote: > This is mostly in preparation for external qcow2 snapshot support. > > For internal qcow2 snapshots, which currently are the only supported > variant, it is not possible to attach the snapshot only. If access to > that is required it will need to be handled differently, e.g. via a > FUSE/NBD export.
just for the avoidance of doubt since it's only implied and not spelled out explicitly - we don't do any such accesses at the moment, right? linked clones cannot be done for running VMs, full clones of snapshots don't happen within the running VM but via qemu-img convert, and nothing else besides replication (which is ZFS specific) and manual `pvesm export` calls (which are on the storage level by definition) directly reads from a storage snapshot? > > Signed-off-by: Fiona Ebner <f.eb...@proxmox.com> > --- > > No changes in v3. RFC, because it depends on the previous one. > > src/PVE/Storage/ISCSIDirectPlugin.pm | 3 +++ > src/PVE/Storage/Plugin.pm | 13 ++++++++++++- > src/PVE/Storage/RBDPlugin.pm | 2 ++ > src/PVE/Storage/ZFSPlugin.pm | 3 +++ > src/PVE/Storage/ZFSPoolPlugin.pm | 2 ++ > 5 files changed, 22 insertions(+), 1 deletion(-) > > diff --git a/src/PVE/Storage/ISCSIDirectPlugin.pm > b/src/PVE/Storage/ISCSIDirectPlugin.pm > index 12b894d..e0f8a62 100644 > --- a/src/PVE/Storage/ISCSIDirectPlugin.pm > +++ b/src/PVE/Storage/ISCSIDirectPlugin.pm > @@ -113,6 +113,9 @@ sub path { > sub qemu_blockdev_options { > my ($class, $scfg, $storeid, $volname, $options) = @_; > > + die "volume snapshot is not possible on iscsi device\n" > + if $options->{'snapshot-name'}; > + > my $lun = ($class->parse_volname($volname))[1]; > > return { > diff --git a/src/PVE/Storage/Plugin.pm b/src/PVE/Storage/Plugin.pm > index 7a274a3..e6892ec 100644 > --- a/src/PVE/Storage/Plugin.pm > +++ b/src/PVE/Storage/Plugin.pm > @@ -2004,6 +2004,11 @@ A hash reference with additional options. > > =over > > +=item C<< $options->{'snapshot-name'} >> > + > +(optional) The snapshot name. Set when the associated snapshot should be > opened rather than the > +volume itself. > + > =item C<< $options->{hints} >> > > A hash reference with hints indicating what the volume will be used for. > This can be safely ignored > @@ -2030,9 +2035,15 @@ sub qemu_blockdev_options { > > my $blockdev = {}; > > - my ($path) = $class->filesystem_path($scfg, $volname); > + my ($path) = $class->filesystem_path($scfg, $volname, > $options->{'snapshot-name'}); > > if ($path =~ m|^/|) { > + # For qcow2 and qed the path of a snapshot will be the same, but > it's not possible to attach > + # the snapshot alone. > + my $format = ($class->parse_volname($volname))[6]; > + die "cannot attach only the snapshot of a '$format' image\n" > + if $options->{'snapshot-name'} && ($format eq 'qcow2' || $format > eq 'qed'); > + > # 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. > diff --git a/src/PVE/Storage/RBDPlugin.pm b/src/PVE/Storage/RBDPlugin.pm > index 6b37ba3..cf3d354 100644 > --- a/src/PVE/Storage/RBDPlugin.pm > +++ b/src/PVE/Storage/RBDPlugin.pm > @@ -530,6 +530,7 @@ sub qemu_blockdev_options { > my ($name) = ($class->parse_volname($volname))[1]; > > if ($scfg->{krbd}) { > + $name .= '@' . $options->{'snapshot-name'} if > $options->{'snapshot-name'}; > my $rbd_dev_path = get_rbd_dev_path($scfg, $storeid, $name); > return { driver => 'host_device', filename => $rbd_dev_path }; > } > @@ -540,6 +541,7 @@ sub qemu_blockdev_options { > image => "$name", > }; > $blockdev->{namespace} = "$scfg->{namespace}" if > defined($scfg->{namespace}); > + $blockdev->{snapshot} = $options->{'snapshot-name'} if > $options->{'snapshot-name'}; > > $blockdev->{conf} = $cmd_option->{ceph_conf} if $cmd_option->{ceph_conf}; > > diff --git a/src/PVE/Storage/ZFSPlugin.pm b/src/PVE/Storage/ZFSPlugin.pm > index 0f64898..940d4f0 100644 > --- a/src/PVE/Storage/ZFSPlugin.pm > +++ b/src/PVE/Storage/ZFSPlugin.pm > @@ -250,6 +250,9 @@ sub path { > sub qemu_blockdev_options { > my ($class, $scfg, $storeid, $volname, $options) = @_; > > + die "direct access to snapshots not implemented\n" > + if $options->{'snapshot-name'}; > + > my $name = ($class->parse_volname($volname))[1]; > my $guid = $class->zfs_get_lu_name($scfg, $name); > my $lun = $class->zfs_get_lun_number($scfg, $guid); > diff --git a/src/PVE/Storage/ZFSPoolPlugin.pm > b/src/PVE/Storage/ZFSPoolPlugin.pm > index 677f88c..86f83a2 100644 > --- a/src/PVE/Storage/ZFSPoolPlugin.pm > +++ b/src/PVE/Storage/ZFSPoolPlugin.pm > @@ -165,6 +165,8 @@ sub path { > sub qemu_blockdev_options { > my ($class, $scfg, $storeid, $volname, $options) = @_; > > + die "cannot attach only the snapshot of a zvol\n" if > $options->{'snapshot-name'}; > + > my ($path) = $class->path($scfg, $volname, $storeid); > > my $blockdev = { driver => 'host_device', filename => $path }; > -- > 2.47.2 > > > > _______________________________________________ > pve-devel mailing list > pve-devel@lists.proxmox.com > https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel > > > _______________________________________________ pve-devel mailing list pve-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel