path: corretly implement path to snapshots

This commit is contained in:
Dietmar Maurer
2015-08-27 12:03:46 +02:00
parent 1f79bb07f1
commit e67069eb58
8 changed files with 37 additions and 12 deletions

View File

@ -140,7 +140,9 @@ sub parse_volname {
} }
sub filesystem_path { sub filesystem_path {
my ($class, $scfg, $volname) = @_; my ($class, $scfg, $volname, $snapname) = @_;
die "drbd snapshot is not implemented\n" if defined($snapname);
my ($vtype, $name, $vmid) = $class->parse_volname($volname); my ($vtype, $name, $vmid) = $class->parse_volname($volname);

View File

@ -191,9 +191,15 @@ my $find_free_diskname = sub {
}; };
sub path { sub path {
my ($class, $scfg, $volname, $storeid) = @_; my ($class, $scfg, $volname, $storeid, $snapname) = @_;
my ($vtype, $name, $vmid) = $class->parse_volname($volname); my ($vtype, $name, $vmid, undef, undef, $isBase, $format) =
$class->parse_volname($volname);
# Note: qcow2/qed has internal snapshot, so path is always
# the same (with or without snapshot => same file).
die "can't snapshot this image format\n"
if defined($snapname) && $format !~ m/^(qcow2|qed)$/;
my $path = undef; my $path = undef;
if ($vtype eq 'images') { if ($vtype eq 'images') {

View File

@ -85,7 +85,10 @@ sub parse_volname {
} }
sub path { sub path {
my ($class, $scfg, $volname) = @_; my ($class, $scfg, $volname, $storeid, $snapname) = @_;
die "volume snapshot is not possible on iscsi device"
if defined($snapname);
my ($vtype, $lun, $vmid) = $class->parse_volname($volname); my ($vtype, $lun, $vmid) = $class->parse_volname($volname);

View File

@ -278,7 +278,9 @@ sub parse_volname {
} }
sub filesystem_path { sub filesystem_path {
my ($class, $scfg, $volname) = @_; my ($class, $scfg, $volname, $snapname) = @_;
die "snapshot is not possible on iscsi storage\n" if defined($snapname);
my ($vtype, $name, $vmid) = $class->parse_volname($volname); my ($vtype, $name, $vmid) = $class->parse_volname($volname);

View File

@ -228,7 +228,9 @@ sub parse_volname {
} }
sub filesystem_path { sub filesystem_path {
my ($class, $scfg, $volname) = @_; my ($class, $scfg, $volname, $snapname) = @_;
die "lvm snapshot is not implemented"if defined($snapname);
my ($vtype, $name, $vmid) = $class->parse_volname($volname); my ($vtype, $name, $vmid) = $class->parse_volname($volname);

View File

@ -403,9 +403,15 @@ sub get_subdir {
} }
sub filesystem_path { sub filesystem_path {
my ($class, $scfg, $volname, $storeid) = @_; my ($class, $scfg, $volname, $snapname) = @_;
my ($vtype, $name, $vmid) = $class->parse_volname($volname); my ($vtype, $name, $vmid, undef, undef, $isBase, $format) =
$class->parse_volname($volname);
# Note: qcow2/qed has internal snapshot, so path is always
# the same (with or without snapshot => same file).
die "can't snapshot this image format\n"
if defined($snapname) && $format !~ m/^(qcow2|qed)$/;
my $dir = $class->get_subdir($scfg, $vtype); my $dir = $class->get_subdir($scfg, $vtype);
@ -417,9 +423,9 @@ sub filesystem_path {
} }
sub path { sub path {
my ($class, $scfg, $volname, $storeid) = @_; my ($class, $scfg, $volname, $storeid, $snapname) = @_;
return $class->filesystem_path($scfg, $volname, $storeid); return $class->filesystem_path($scfg, $volname, $snapname);
} }
sub create_base { sub create_base {

View File

@ -208,7 +208,10 @@ sub options {
# Storage implementation # Storage implementation
sub path { sub path {
my ($class, $scfg, $volname) = @_; my ($class, $scfg, $volname, $storeid, $snapname) = @_;
die "direct access to snapshots not implemented"
if defined($snapname);
my ($vtype, $name, $vmid) = $class->parse_volname($volname); my ($vtype, $name, $vmid) = $class->parse_volname($volname);

View File

@ -141,7 +141,7 @@ sub parse_volname {
# virtual zfs methods (subclass can overwrite them) # virtual zfs methods (subclass can overwrite them)
sub path { sub path {
my ($class, $scfg, $volname) = @_; my ($class, $scfg, $volname, $storeid, $snapname) = @_;
my ($vtype, $name, $vmid) = $class->parse_volname($volname); my ($vtype, $name, $vmid) = $class->parse_volname($volname);
@ -154,6 +154,7 @@ sub path {
} else { } else {
$path = "/dev/zvol/$scfg->{pool}/$volname"; $path = "/dev/zvol/$scfg->{pool}/$volname";
} }
$path .= "\@$snapname" if defined($snapname);
} else { } else {
die "$vtype is not allowed in ZFSPool!"; die "$vtype is not allowed in ZFSPool!";
} }