[pve-devel] [PATCH storage v2 1/2] fix #3873: btrfs: check for correct subvolume taking snapshot
Fiona Ebner
f.ebner at proxmox.com
Wed Feb 19 10:24:32 CET 2025
Am 18.02.25 um 17:28 schrieb Maximiliano Sandoval:
> Suppose we are taking a snapshot of VM 100's disk-0. The
> dir_glob_foreach runs over $path=/subvolume/images/100, lists all
> snapshot names and appends their names to the path of the disk, e.g.
> /subvolume/images/vm-100-disk-0 at SNAP_NAME, but the original directory
> $path might contain a second disk `vm-100-disk-1` which is also listed
> by the dir_glib_foreach.
>
> This change adds a helper foreach_snapshot_of_subvol which only lists
> snapshots for the current volume.
>
> The helper is also implemented in the other place where we iterate over
> snapshots.
>
> Signed-off-by: Maximiliano Sandoval <m.sandoval at proxmox.com>
> ---
>
> Differences from v1:
> - Add a helper to run callback on each snapshot.
>
> src/PVE/Storage/BTRFSPlugin.pm | 25 +++++++++++++++++++------
> 1 file changed, 19 insertions(+), 6 deletions(-)
>
> diff --git a/src/PVE/Storage/BTRFSPlugin.pm b/src/PVE/Storage/BTRFSPlugin.pm
> index cadd9d1..d21c831 100644
> --- a/src/PVE/Storage/BTRFSPlugin.pm
> +++ b/src/PVE/Storage/BTRFSPlugin.pm
> @@ -419,6 +419,20 @@ my sub foreach_subvol : prototype($$) {
> })
> }
>
> +# Calls `$code->($volume, $snap_name)` for each snapshot of the subvolume.
> +my sub foreach_snapshot_of_subvol : prototype($$) {
We can just rename foreach_subvol() and the $BTRFS_VOL_REGEX instead of
adding this new wrapper. As already written in the review of v1, the
regex requires a snapshot to be present. This means the regex is a
misnomer and the foreach_subvol() helper already operates only on
snapshots and can also be renamed. It'd be more concise/straightforward
and otherwise, those remain confusing.
> + my ($subvol, $code) = @_;
> +
> + my $basename = basename($subvol);
> + my $dir = dirname($subvol);
> + foreach_subvol($dir, sub {
> + my ($volume, $name, $snap) = @_;
> + return if $name ne $basename;
> + return if !defined $snap;
> + $code->($volume, $snap);
> + });
> +}
> +
> sub free_image {
> my ($class, $storeid, $scfg, $volname, $isBase, $_format) = @_;
>
More information about the pve-devel
mailing list