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 4ec4a0d..52652b2 100644 --- a/src/PVE/Storage/Plugin.pm +++ b/src/PVE/Storage/Plugin.pm @@ -2009,6 +2009,9 @@ disk of a VM, containing its OMVF variables. =back +=item C<< $options->{'snapshot-name'} >>: (optional) The snapshot name. Set when the associated snapshot should be opened rather than the +volume itself. + =back =back @@ -2020,9 +2023,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 c40c845..800af68 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 e775dae..d5552ab 100644 --- a/src/PVE/Storage/ZFSPoolPlugin.pm +++ b/src/PVE/Storage/ZFSPoolPlugin.pm @@ -169,6 +169,8 @@ sub qemu_blockdev_options { die "volume '$volname' not usable as VM image\n" if $format ne 'raw'; + 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 };