Hi Andreas, Even better, I can sent you the deb packages? On June 15, 2017 10:20:32 AM GMT+02:00, Andreas Steinel <a.stei...@gmail.com> wrote: >Hi mir, > >have you a public git with all the changes? I'd like to try but I >don't want to extract all the patches from this list, try to figure >out which ones are already taken care of and manually apply them. > >Best, >LnxBil > >On Wed, Jun 14, 2017 at 9:55 PM, Michael Rasmussen <m...@datanom.net> >wrote: >> Signed-off-by: Michael Rasmussen <m...@datanom.net> >> --- >> PVE/Storage/FreeNASPlugin.pm | 129 >+++++++++++++++++++++++++------------------ >> 1 file changed, 74 insertions(+), 55 deletions(-) >> >> diff --git a/PVE/Storage/FreeNASPlugin.pm >b/PVE/Storage/FreeNASPlugin.pm >> index 0f2a56d..fee3d27 100644 >> --- a/PVE/Storage/FreeNASPlugin.pm >> +++ b/PVE/Storage/FreeNASPlugin.pm >> @@ -427,40 +427,38 @@ sub freenas_find_free_diskname { >> } >> >> sub freenas_get_lun_number { >> - my ($scfg, $volname, $snap) = @_; >> + my ($scfg, $volname) = @_; >> my $lunid = undef; >> >> - if ($volname =~ /^(vm|base)-\d+-disk-(\d+)$/ && ! defined $snap) >{ >> + if ($volname =~ /^(vm|base)-\d+-disk-(\d+)$/) { >> $lunid = $2 - 1; >> } elsif ($volname =~ /^vm-(\d+)-state/) { >> # Find id for temporary LUN >> - if ($snap) { >> - # TODO >> - # Required to be able to exposed read-only LUNs for >snapshot backup CT >> - } else { >> - my $target = freenas_get_target($scfg, $1); >> - my $id = $max_luns; >> - my $response = freenas_request($scfg, 'GET', >"services/iscsi/targettoextent?limit=$limit"); >> - die HTTP::Status::status_message($response) >if $response =~ /^\d+$/; >> - my $t2extents = decode_json($response); >> - >> - foreach my $t2extent (@$t2extents) { >> - next unless $t2extent->{iscsi_target} >== $target && >> - >$t2extent->{iscsi_lunid} + 1 > $max_luns && >> - >$t2extent->{iscsi_lunid} < $max_luns + $active_snaps; >> - my $eid = freenas_get_extent($scfg, >$volname); >> - if ($eid) { >> - $response = >freenas_request($scfg, 'GET', "services/iscsi/extent/$eid"); >> - die >HTTP::Status::status_message($response) if $response =~ /^\d+$/; >> - my $extent = >decode_json($response); >> - # Request to get lunid for an >existing lun >> - last if >$t2extent->{iscsi_extent} eq $eid; >> - } >> - $id++; >> + my $target = freenas_get_target($scfg, $1); >> + my $id = $max_luns; >> + my $response = freenas_request($scfg, 'GET', >"services/iscsi/targettoextent?limit=$limit"); >> + die HTTP::Status::status_message($response) if >$response =~ /^\d+$/; >> + my $t2extents = decode_json($response); >> + >> + foreach my $t2extent (@$t2extents) { >> + next unless $t2extent->{iscsi_target} == >$target && >> + >$t2extent->{iscsi_lunid} + 1 > $max_luns && >> + >$t2extent->{iscsi_lunid} < $max_luns + $active_snaps; >> + my $eid = freenas_get_extent($scfg, >$volname); >> + if ($eid) { >> + $response = freenas_request($scfg, >'GET', "services/iscsi/extent/$eid"); >> + die >HTTP::Status::status_message($response) if $response =~ /^\d+$/; >> + my $extent = decode_json($response); >> + # Request to get lunid for an >existing lun >> + last if $t2extent->{iscsi_extent} eq >$eid; >> } >> - die "Max snapshots (4) is reached" unless >($id - $max_luns) < $active_snaps; >> - $lunid = $id; >> - } >> + $id++; >> + } >> + die "Max snapshots (4) is reached" unless ($id - >$max_luns) < $active_snaps; >> + $lunid = $id; >> + } elsif ($volname =~ /^(vm|base)-\d+-disk-\d+\@vzdump$/) { >> + # Required to be able to exposed read-only LUNs for snapshot >backup CT >> + $lunid = $max_luns + $active_snaps; >> } >> >> return $lunid; >> @@ -891,12 +889,13 @@ sub list_images { >> >> sub path { >> my ($class, $scfg, $volname, $storeid, $snapname) = @_; >> - >> - die "direct access to snapshots not implemented" >> - if defined($snapname); >> + #die "direct access to snapshots not implemented" >> + #if defined($snapname); >> >> my ($vtype, $vname, $vmid) = $class->parse_volname($volname); >> >> + $vname = "$vname\@$snapname" if $snapname; >> + >> my $luns = get_active_luns($class, $storeid, $scfg, $vname); >> my $path = disk_by_path($scfg, $vname); >> >> @@ -1116,24 +1115,54 @@ sub volume_resize { >> >> sub volume_snapshot { >> my ($class, $scfg, $storeid, $volname, $snap) = @_; >> - >> - my $vname = ($class->parse_volname($volname))[1]; >> - >> + >> + my (undef, $vname, $vmid) = $class->parse_volname($volname); >> + >> my $data = { >> dataset => "$scfg->{pool}/$vname", >> name => $snap, >> }; >> - my $response = freenas_request($scfg, 'POST', >"storage/snapshot", encode_json($data)); >> + my $response = freenas_request($scfg, 'POST', >"storage/snapshot/", encode_json($data)); >> die HTTP::Status::status_message($response) if $response =~ >/^\d+$/; >> + >> + if ($snap) { >> + eval { >> + freenas_create_lun($scfg, $vmid, "$vname\@$snap"); >> + $class->activate_volume($storeid, $scfg, >"$vname\@$snap"); >> + }; >> + if ($@) { >> + die "$@ - unable to activate snapshot from remote >FreeNAS storage"; >> + } >> + } >> } >> >> sub volume_snapshot_delete { >> my ($class, $scfg, $storeid, $volname, $snap, $running) = @_; >> >> - my $vname = ($class->parse_volname($volname))[1]; >> - >> + my (undef, $vname, $vmid) = $class->parse_volname($volname); >> + >> + if ($snap) { >> + eval { >> + my $target = freenas_get_target($scfg, $vmid); >> + die "volume_snapshot_delete-> missing target" unless >$target; >> + my $extent = freenas_get_extent($scfg, >"$vname\@$snap"); >> + die "volume_snapshot_delete-> missing extent" unless >$extent; >> + my $tg2exent = freenas_get_target_to_exent($scfg, >$extent, $target); >> + die "volume_snapshot_delete-> missing target to >extent" unless $tg2exent; >> + my $lun = freenas_get_lun_number($scfg, >"$vname\@$snap"); >> + die "volume_snapshot_delete-> missing LUN" unless >defined $lun; >> + freenas_delete_target_to_exent($scfg, $tg2exent); >> + freenas_delete_extent($scfg, $extent); >> + }; >> + warn "$@ - unable to deactivate snapshot from remote >FreeNAS storage" if $@; >> + } >> + >> my $response = freenas_request($scfg, 'DELETE', >"storage/snapshot/$scfg->{pool}/$vname\@$snap"); >> die HTTP::Status::status_message($response) if $response =~ >/^\d+$/; >> + >> + if ($snap) { >> + $class->deactivate_volume($storeid, $scfg, >"$vname\@$snap"); >> + } >> } >> >> sub volume_snapshot_rollback { >> @@ -1232,16 +1261,11 @@ sub deactivate_storage { >> sub activate_volume { >> my ($class, $storeid, $scfg, $volname, $snapname, $cache) = @_; >> >> - # TODO: FreeNAS supports exposing a ro LUN from a snapshot >> - # ERROR: Backup of VM xyz failed - unable to activate >snapshot from remote zfs storage >> - # at /usr/share/perl5/PVE/Storage/ZFSPlugin.pm line 418. >> - # $vname\@$snapname >> - die "mode failure - unable to activate snapshot from remote >zfs storage" if $snapname; >> - >> - my (undef, $name) = $class->parse_volname($volname); >> + return if $snapname; # Activated when creating snapshot >> + >> + my $name = ($class->parse_volname($volname))[1]; >> >> my $active_luns = get_active_luns($class, $storeid, $scfg, >$name); >> - >> my $lun = freenas_get_lun_number($scfg, $name); >> $active_luns->{$lun} = "0:0:0:$lun"; >> >> @@ -1266,18 +1290,13 @@ sub activate_volume { >> # deactivate lun >> sub deactivate_volume { >> my ($class, $storeid, $scfg, $volname, $snapname, $cache) = @_; >> - >> - # TODO: FreeNAS supports exposing a ro LUN from a snapshot >> - # ERROR: Backup of VM xyz failed - unable to activate >snapshot from remote zfs storage >> - # at /usr/share/perl5/PVE/Storage/ZFSPlugin.pm line 418. >> - # $vname\@$snapname >> - die "mode failure - unable to deactivate snapshot from remote >zfs storage" if $snapname; >> - >> - my (undef, $name) = $class->parse_volname($volname); >> + >> + return if $snapname; # Deactivated when deleting snapshot >> + >> + my $name = ($class->parse_volname($volname))[1]; >> >> my $active_luns = get_active_luns($class, $storeid, $scfg, >$name); >> - >> - my $lun = freenas_get_lun_number($scfg, $name); >> + my $lun = freenas_get_lun_number($scfg, $name); >> delete $active_luns->{$lun}; >> >> eval { >> -- >> 2.1.4 >> >> >> ---- >> >> This mail was virus scanned and spam checked before delivery. >> This mail is also DKIM signed. See header dkim-signature. >> >> _______________________________________________ >> pve-devel mailing list >> pve-devel@pve.proxmox.com >> https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel >_______________________________________________ >pve-devel mailing list >pve-devel@pve.proxmox.com >https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
-- Sent from my Android phone with K-9 Mail. Please excuse my brevity. _______________________________________________ pve-devel mailing list pve-devel@pve.proxmox.com https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel