Change zfs path when link clone are used

The new naming is coherent to Dir plugin.

So if we make an licked clone the parent will be coded in the path of the storage.
This commit is contained in:
Wolfgang Link
2016-03-31 09:10:22 +02:00
committed by Dietmar Maurer
parent 703de49ea9
commit 851658c3b0
2 changed files with 39 additions and 22 deletions

View File

@ -1051,6 +1051,7 @@ sub scan_zfs {
my $used = PVE::Storage::ZFSPoolPlugin::zfs_parse_size($used_str); my $used = PVE::Storage::ZFSPoolPlugin::zfs_parse_size($used_str);
# ignore subvolumes generated by our ZFSPoolPlugin # ignore subvolumes generated by our ZFSPoolPlugin
return if $pool =~ m!/subvol-\d+-[^/]+$!; return if $pool =~ m!/subvol-\d+-[^/]+$!;
return if $pool =~ m!/basevol-\d+-[^/]+$!;
push @$res, { pool => $pool, size => $size, free => $size-$used }; push @$res, { pool => $pool, size => $size, free => $size-$used };
} }
}); });

View File

@ -101,7 +101,7 @@ sub zfs_parse_zvol_list {
my $name = pop @parts; my $name = pop @parts;
my $pool = join('/', @parts); my $pool = join('/', @parts);
next unless $name =~ m!^(vm|base|subvol)-(\d+)-(\S+)$!; next unless $name =~ m!^(vm|base|subvol|basevol)-(\d+)-(\S+)$!;
$zvol->{owner} = $2; $zvol->{owner} = $2;
$zvol->{pool} = $pool; $zvol->{pool} = $pool;
@ -129,8 +129,8 @@ sub zfs_parse_zvol_list {
sub parse_volname { sub parse_volname {
my ($class, $volname) = @_; my ($class, $volname) = @_;
if ($volname =~ m/^(((base|vm)-(\d+)-\S+)\/)?((base)?(vm|subvol)?-(\d+)-\S+)$/) { if ($volname =~ m/^(((base|vm|basevol)-(\d+)-\S+)\/)?((base|basevol)?(vm|subvol)?-(\d+)-\S+)$/) {
my $format = $7 && $7 eq 'subvol' ? 'subvol' : 'raw'; my $format = ($7 && $7 eq 'subvol') || ( $6 && $6 eq 'basevol') ? 'subvol' : 'raw';
return ('images', $5, $8, $2, $4, $6, $format); return ('images', $5, $8, $2, $4, $6, $format);
} }
@ -149,9 +149,9 @@ sub path {
if ($vtype eq "images") { if ($vtype eq "images") {
if ($volname =~ m/^subvol-/) { if ($volname =~ m/^subvol-/) {
# fixme: we currently assume standard mount point?! # fixme: we currently assume standard mount point?!
$path = "/$scfg->{pool}/$volname"; $path = "/$scfg->{pool}/$name";
} else { } else {
$path = "/dev/zvol/$scfg->{pool}/$volname"; $path = "/dev/zvol/$scfg->{pool}/$name";
} }
$path .= "\@$snapname" if defined($snapname); $path .= "\@$snapname" if defined($snapname);
} else { } else {
@ -385,7 +385,7 @@ sub zfs_find_free_diskname {
foreach my $image (keys %$dat) { foreach my $image (keys %$dat) {
my $volname = $dat->{$image}->{name}; my $volname = $dat->{$image}->{name};
if ($volname =~ m/(vm|base|subvol)-$vmid-disk-(\d+)/){ if ($volname =~ m/(vm|base|subvol|basevol)-$vmid-disk-(\d+)/){
$disk_ids->{$2} = 1; $disk_ids->{$2} = 1;
} }
} }
@ -402,6 +402,8 @@ sub zfs_find_free_diskname {
sub zfs_get_latest_snapshot { sub zfs_get_latest_snapshot {
my ($class, $scfg, $volname) = @_; my ($class, $scfg, $volname) = @_;
my $vname = ($class->parse_volname($volname))[1];
# abort rollback if snapshot is not the latest # abort rollback if snapshot is not the latest
my @params = ('-t', 'snapshot', '-o', 'name', '-s', 'creation'); my @params = ('-t', 'snapshot', '-o', 'name', '-s', 'creation');
my $text = $class->zfs_request($scfg, undef, 'list', @params); my $text = $class->zfs_request($scfg, undef, 'list', @params);
@ -409,7 +411,7 @@ sub zfs_get_latest_snapshot {
my $recentsnap; my $recentsnap;
foreach (@snapshots) { foreach (@snapshots) {
if (/$scfg->{pool}\/$volname/) { if (/$scfg->{pool}\/$vname/) {
s/^.*@//; s/^.*@//;
$recentsnap = $_; $recentsnap = $_;
} }
@ -439,12 +441,11 @@ sub status {
sub volume_size_info { sub volume_size_info {
my ($class, $scfg, $storeid, $volname, $timeout) = @_; my ($class, $scfg, $storeid, $volname, $timeout) = @_;
my (undef, undef, undef, undef, undef, undef, $format) = my (undef, $vname, undef, undef, undef, undef, $format) =
$class->parse_volname($volname); $class->parse_volname($volname);
my $attr = $format eq 'subvol' ? 'refquota' : 'volsize'; my $attr = $format eq 'subvol' ? 'refquota' : 'volsize';
my $text = $class->zfs_request($scfg, undef, 'get', '-Hp', $attr, "$scfg->{pool}/$volname"); my $text = $class->zfs_request($scfg, undef, 'get', '-Hp', $attr, "$scfg->{pool}/$vname");
if ($text =~ /\s$attr\s(\d+)\s/) { if ($text =~ /\s$attr\s(\d+)\s/) {
return $1; return $1;
} }
@ -455,20 +456,26 @@ sub volume_size_info {
sub volume_snapshot { sub volume_snapshot {
my ($class, $scfg, $storeid, $volname, $snap) = @_; my ($class, $scfg, $storeid, $volname, $snap) = @_;
$class->zfs_request($scfg, undef, 'snapshot', "$scfg->{pool}/$volname\@$snap"); my $vname = ($class->parse_volname($volname))[1];
$class->zfs_request($scfg, undef, 'snapshot', "$scfg->{pool}/$vname\@$snap");
} }
sub volume_snapshot_delete { sub volume_snapshot_delete {
my ($class, $scfg, $storeid, $volname, $snap, $running) = @_; my ($class, $scfg, $storeid, $volname, $snap, $running) = @_;
$class->deactivate_volume($storeid, $scfg, $volname, $snap, {}); my $vname = ($class->parse_volname($volname))[1];
$class->zfs_request($scfg, undef, 'destroy', "$scfg->{pool}/$volname\@$snap");
$class->deactivate_volume($storeid, $scfg, $vname, $snap, {});
$class->zfs_request($scfg, undef, 'destroy', "$scfg->{pool}/$vname\@$snap");
} }
sub volume_snapshot_rollback { sub volume_snapshot_rollback {
my ($class, $scfg, $storeid, $volname, $snap) = @_; my ($class, $scfg, $storeid, $volname, $snap) = @_;
$class->zfs_request($scfg, undef, 'rollback', "$scfg->{pool}/$volname\@$snap"); my $vname = ($class->parse_volname($volname))[1];
$class->zfs_request($scfg, undef, 'rollback', "$scfg->{pool}/$vname\@$snap");
} }
sub volume_rollback_is_possible { sub volume_rollback_is_possible {
@ -526,9 +533,15 @@ sub clone_image {
my $name = $class->zfs_find_free_diskname($storeid, $scfg, $vmid, $format); my $name = $class->zfs_find_free_diskname($storeid, $scfg, $vmid, $format);
$class->zfs_request($scfg, undef, 'clone', "$scfg->{pool}/$basename\@$snap", "$scfg->{pool}/$name"); if ($format eq 'subvol') {
my $size = $class->zfs_request($scfg, undef, 'list', '-H', '-o', 'refquota', "$scfg->{pool}/$basename");
chomp($size);
$class->zfs_request($scfg, undef, 'clone', "$scfg->{pool}/$basename\@$snap", "$scfg->{pool}/$name", '-o', "refquota=$size");
} else {
$class->zfs_request($scfg, undef, 'clone', "$scfg->{pool}/$basename\@$snap", "$scfg->{pool}/$name");
}
return $name; return "$basename/$name";
} }
sub create_base { sub create_base {
@ -536,14 +549,17 @@ sub create_base {
my $snap = '__base__'; my $snap = '__base__';
my ($vtype, $name, $vmid, $basename, $basevmid, $isBase) = my ($vtype, $name, $vmid, $basename, $basevmid, $isBase, $format) =
$class->parse_volname($volname); $class->parse_volname($volname);
die "create_base not possible with base image\n" if $isBase; die "create_base not possible with base image\n" if $isBase;
my $newname = $name; my $newname = $name;
$newname =~ s/^vm-/base-/; if ( $format eq 'subvol' ) {
$newname =~ s/^subvol-/basevol-/;
} else {
$newname =~ s/^vm-/base-/;
}
my $newvolname = $basename ? "$basename/$newname" : "$newname"; my $newvolname = $basename ? "$basename/$newname" : "$newname";
$class->zfs_request($scfg, undef, 'rename', "$scfg->{pool}/$name", "$scfg->{pool}/$newname"); $class->zfs_request($scfg, undef, 'rename', "$scfg->{pool}/$name", "$scfg->{pool}/$newname");
@ -560,12 +576,12 @@ sub volume_resize {
my $new_size = int($size/1024); my $new_size = int($size/1024);
my (undef, undef, undef, undef, undef, undef, $format) = my (undef, $vname, undef, undef, undef, undef, $format) =
$class->parse_volname($volname); $class->parse_volname($volname);
my $attr = $format eq 'subvol' ? 'refquota' : 'volsize'; my $attr = $format eq 'subvol' ? 'refquota' : 'volsize';
$class->zfs_request($scfg, undef, 'set', "$attr=${new_size}k", "$scfg->{pool}/$volname"); $class->zfs_request($scfg, undef, 'set', "$attr=${new_size}k", "$scfg->{pool}/$vname");
return $new_size; return $new_size;
} }