Am 29.07.25 um 11:42 AM schrieb Shannon Sterz: > zfs itself does not track the refquota per snapshot so we need handle > this ourselves. otherwise rolling back a volume that has been resize > since the snapshot, will retain the new size. this is problematic, as > it means the value in the guest config does not longer match the size > of the disk on the storage. > > this implementation tries to do so by leveraging a user property per > snapshot. > > Reported-by: Lukas Wagner <l.wag...@proxmox.com> > Suggested-by: Fabian Grünbichler <f.gruenbich...@proxmox.com> > Signed-off-by: Shannon Sterz <s.st...@proxmox.com>
Reviewed-by: Fiona Ebner <f.eb...@proxmox.com> Tested-by: Fiona Ebner <f.eb...@proxmox.com> with some suggestions: > --- > src/PVE/Storage/ZFSPoolPlugin.pm | 44 +++++++++++++++++++++++++++++++- > 1 file changed, 43 insertions(+), 1 deletion(-) > > diff --git a/src/PVE/Storage/ZFSPoolPlugin.pm > b/src/PVE/Storage/ZFSPoolPlugin.pm > index cdf5868..d329abc 100644 > --- a/src/PVE/Storage/ZFSPoolPlugin.pm > +++ b/src/PVE/Storage/ZFSPoolPlugin.pm > @@ -482,9 +482,28 @@ sub volume_size_info { > sub volume_snapshot { > my ($class, $scfg, $storeid, $volname, $snap) = @_; > > - my $vname = ($class->parse_volname($volname))[1]; > + my (undef, $vname, undef, undef, undef, undef, $format) = > $class->parse_volname($volname); > > $class->zfs_request($scfg, undef, 'snapshot', > "$scfg->{pool}/$vname\@$snap"); > + > + # if this is a subvol, track refquota information via user properties. > zfs > + # does not track this property for snapshosts and consequently does not > roll > + # it back. so track this information manually. > + if ($format eq 'subvol') { > + my $refquota = $class->zfs_request( > + $scfg, undef, 'get', 'refquota', '-o', 'value', '-Hp', > "$scfg->{pool}/$vname", > + ); We have a dedicated zfs_get_properties() helper you could use, that should also avoid the need for chomp() > + > + chomp($refquota); > + > + $class->zfs_request( > + $scfg, > + undef, > + 'set', > + "pve-storage:refquota=${refquota}", > + "$scfg->{pool}/$vname\@$snap", Might be nice to create a variable for this and its other use in the function. > + ); > + } > } > > sub volume_snapshot_delete { > @@ -503,6 +522,29 @@ sub volume_snapshot_rollback { > > my $msg = $class->zfs_request($scfg, undef, 'rollback', > "$scfg->{pool}/$vname\@$snap"); > > + # if this is a subvol, check if we tracked the refquota manually via user > + # properties and if so, set it appropriatelly again. > + if ($format eq 'subvol') { > + my $refquota = $class->zfs_request( > + $scfg, > + undef, > + 'get', > + 'pve-storage:refquota', > + '-o', > + 'value', > + '-Hp', > + "$scfg->{pool}/$vname\@$snap", Might be nice to create a variable for this and its other use in the function. > + ); > + > + chomp($refquota); > + > + if ($refquota =~ m/^\d+$/) { > + $class->zfs_request( > + $scfg, undef, 'set', "refquota=${refquota}", > "$scfg->{pool}/$vname", > + ); > + } Maybe warn if it doesn't match the regex? > + } > + > # we have to unmount rollbacked subvols, to invalidate wrong kernel > # caches, they get mounted in activate volume again > # see zfs bug #10931 https://github.com/openzfs/zfs/issues/10931 _______________________________________________ pve-devel mailing list pve-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel