My submission was rejected previously because I was not a member of
pve-devel mailing list.  I added myself to this list and I'm now
re-submitting my patches.
From 753d826597851ef8bd55b7359ff7ee1c5b579920 Mon Sep 17 00:00:00 2001
From: Chris Allen <ca.al...@gmail.com>
Date: Fri, 28 Feb 2014 23:56:02 -0800
Subject: [PATCH 1/6] Added sparse zvol support to ZFS.

To enable, add "sparse" to the ZFS storage section, you wish to use it on, in "/etc/pve/storage.pm"

Signed-off-by: Chris Allen <Chris Allen>
---
 PVE/Storage/ZFSPlugin.pm |   21 ++++++++++++++++-----
 1 file changed, 16 insertions(+), 5 deletions(-)

diff --git a/PVE/Storage/ZFSPlugin.pm b/PVE/Storage/ZFSPlugin.pm
index 4a8e9e4..2d422d7 100644
--- a/PVE/Storage/ZFSPlugin.pm
+++ b/PVE/Storage/ZFSPlugin.pm
@@ -249,8 +249,13 @@ sub zfs_resize_lu {
 
 sub zfs_create_zvol {
     my ($scfg, $zvol, $size) = @_;
+    
+    my $sparse = '';
+    if ($scfg->{sparse}) {
+        $sparse = '-s';
+    }
 
-    zfs_request($scfg, undef, 'create', '-b', $scfg->{blocksize}, '-V', "${size}k", "$scfg->{pool}/$zvol");
+    zfs_request($scfg, undef, 'create', $sparse, '-b', $scfg->{blocksize}, '-V', "${size}k", "$scfg->{pool}/$zvol");
 }
 
 sub zfs_delete_zvol {
@@ -319,10 +324,15 @@ sub properties {
         description => "iscsi provider",
         type => 'string',
     },
-        blocksize => {
-            description => "block size",
-            type => 'string',
-        }
+    blocksize => {
+        description => "block size",
+        type => 'string',
+    },
+    sparse => {
+        description => "use sparse volumes",
+        type => 'boolean',
+	optional => 1,
+    }
     };
 }
 
@@ -335,6 +345,7 @@ sub options {
     pool => { fixed => 1 },
     blocksize => { fixed => 1 },
     iscsiprovider => { fixed => 1 },
+    sparse => { optional => 1 },
     content => { optional => 1 },
     };
 }
-- 
1.7.10.4

From 8551dfb1a5aa7447480b7abf9e5b581eba567092 Mon Sep 17 00:00:00 2001
From: Chris Allen <Chris Allen>
Date: Mon, 10 Mar 2014 12:07:35 -0700
Subject: [PATCH 2/6] Added "nowritecache" option to ZFS storage plugin. Turns
 off write caching on Comstar and Istgt LUNs created by
 the plugin. Has no effect on IET, as IET always uses
 write-through caching for blockio volumes not in
 read-only mode.


Signed-off-by: Chris Allen <Chris Allen>
---
 PVE/Storage/LunCmd/Comstar.pm |    6 +++++-
 PVE/Storage/LunCmd/Istgt.pm   |   16 +++++++++++++---
 PVE/Storage/ZFSPlugin.pm      |    9 ++++++++-
 3 files changed, 26 insertions(+), 5 deletions(-)

diff --git a/PVE/Storage/LunCmd/Comstar.pm b/PVE/Storage/LunCmd/Comstar.pm
index 45ad6a5..aa1c614 100644
--- a/PVE/Storage/LunCmd/Comstar.pm
+++ b/PVE/Storage/LunCmd/Comstar.pm
@@ -50,11 +50,15 @@ sub run_lun_command {
     };
 
     if ($method eq 'create_lu') {
+        my $wcd = 'false'; 
+        if ($scfg->{nowritecache}) {
+          $wcd = 'true';
+	}
         my $prefix = '600144f';
         my $digest = md5_hex($params[0]);
         $digest =~ /(\w{7}(.*))/;
         $guid = "$prefix$2";
-        @params = ('-p', 'wcd=false', '-p', "guid=$guid", @params);
+        @params = ('-p', "wcd=$wcd", '-p', "guid=$guid", @params);
     } elsif ($method eq 'modify_lu') {
         @params = ('-s', @params);
     } elsif ($method eq 'list_view') {
diff --git a/PVE/Storage/LunCmd/Istgt.pm b/PVE/Storage/LunCmd/Istgt.pm
index 9bbdfa0..b386b5d 100644
--- a/PVE/Storage/LunCmd/Istgt.pm
+++ b/PVE/Storage/LunCmd/Istgt.pm
@@ -173,6 +173,11 @@ my $lun_dumper = sub {
     foreach my $conf (@{$SETTINGS->{$lun}->{luns}}) {
         $config .=  "$conf->{lun} Storage " . $conf->{Storage};
         $config .= ' ' . $size_with_unit->($conf->{Size}) . "\n";
+        foreach ($conf->{options}) {
+            if ($_) {
+                $config .=  "$conf->{lun} Option " . $_ . "\n";
+            }
+        }
     }
     $config .= "\n";
 
@@ -228,16 +233,21 @@ my $free_lu_name = sub {
 };
 
 my $make_lun = sub {
-    my ($path) = @_;
+    my ($scfg, $path) = @_;
 
     my $target = $SETTINGS->{current};
     die 'Maximum number of LUNs per target is 63' if scalar @{$SETTINGS->{$target}->{luns}} >= $MAX_LUNS;
 
+    my @options = ();
     my $lun = $get_lu_name->($target);
+    if ($scfg->{nowritecache}) {
+        push @options, "WriteCache Disable";     
+    }
     my $conf = {
         lun => $lun,
         Storage => $path,
         Size => 'AUTO',
+        options => @options,
     };
     push @{$SETTINGS->{$target}->{luns}}, $conf;
 
@@ -274,7 +284,7 @@ my $parser = sub {
         } elsif ($lun) {
             next if (($_ =~ /^\s*#/) || ($_ =~ /^\s*$/));
             if ($_ =~ /^\s*(\w+)\s+(.+)\s*/) {
-                #next if $2 =~ /^Option.*/;
+                next if $2 =~ /^Option.*/;
                 $SETTINGS->{$lun}->{$1} = $2;
                 $SETTINGS->{$lun}->{$1} =~ s/^\s+|\s+$|"\s*//g;
             } else {
@@ -349,7 +359,7 @@ my $create_lun = sub {
         die "$params[0]: LUN exists";
     }
     my $lun = $params[0];
-    $lun = $make_lun->($lun);
+    $lun = $make_lun->($scfg, $lun);
     my $config = $lun_dumper->($SETTINGS->{current});
     open(my $fh, '>', $file) or die "Could not open file '$file' $!";
 
diff --git a/PVE/Storage/ZFSPlugin.pm b/PVE/Storage/ZFSPlugin.pm
index 2d422d7..302d2d6 100644
--- a/PVE/Storage/ZFSPlugin.pm
+++ b/PVE/Storage/ZFSPlugin.pm
@@ -328,10 +328,16 @@ sub properties {
         description => "block size",
         type => 'string',
     },
+    # this will disable write caching on comstar and istgt.
+    # it is not implemented for iet. iet blockio always operates with 
+    # writethrough caching when not in readonly mode
+    nowritecache => {
+        description => "disable write caching on the target",
+        type => 'boolean',
+    },
     sparse => {
         description => "use sparse volumes",
         type => 'boolean',
-	optional => 1,
     }
     };
 }
@@ -345,6 +351,7 @@ sub options {
     pool => { fixed => 1 },
     blocksize => { fixed => 1 },
     iscsiprovider => { fixed => 1 },
+    nowritecache => { optional => 1 },
     sparse => { optional => 1 },
     content => { optional => 1 },
     };
-- 
1.7.10.4

From d363050104e0ba0767cef34d8ad140cd4c953707 Mon Sep 17 00:00:00 2001
From: Chris Allen <Chris Allen>
Date: Mon, 10 Mar 2014 13:06:09 -0700
Subject: [PATCH 3/6] Fixed command substitution and output redirection in
 Istgt module to work in csh - the default shell in
 FreeBSD. Changed Istgt "restart" to "onerestart". This
 way a running istgt daemon will always restart whether
 or not it is enabled in rc.conf.


Signed-off-by: Chris Allen <Chris Allen>
---
 PVE/Storage/LunCmd/Istgt.pm |    4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/PVE/Storage/LunCmd/Istgt.pm b/PVE/Storage/LunCmd/Istgt.pm
index b386b5d..2d59ef3 100644
--- a/PVE/Storage/LunCmd/Istgt.pm
+++ b/PVE/Storage/LunCmd/Istgt.pm
@@ -430,14 +430,14 @@ my $add_view = sub {
     my $cmdmap;
 
     if (@params && $params[0] eq 'restart') {
-        @params = ('restart', '1>&2', '>', '/dev/null');
+        @params = ('onerestart', '>&', '/dev/null');
         $cmdmap = {
             cmd => 'ssh',
             method => $DAEMON,
             params => \@params,
         };
     } else {
-        @params = ('-HUP', '$(cat '. "$SETTINGS->{pidfile})");
+        @params = ('-HUP', '`cat '. "$SETTINGS->{pidfile}`");
         $cmdmap = {
             cmd => 'ssh',
             method => 'kill',
-- 
1.7.10.4

From b3a474daeb456029f6c970b949d88ee8a7f283c3 Mon Sep 17 00:00:00 2001
From: Chris Allen <Chris Allen>
Date: Tue, 11 Mar 2014 10:46:24 -0700
Subject: [PATCH 4/6] Fixed Istgt LUN Options handling.


Signed-off-by: Chris Allen <Chris Allen>
---
 PVE/Storage/LunCmd/Istgt.pm |   38 ++++++++++++++++++++++++--------------
 1 file changed, 24 insertions(+), 14 deletions(-)

diff --git a/PVE/Storage/LunCmd/Istgt.pm b/PVE/Storage/LunCmd/Istgt.pm
index 2d59ef3..c17d1c8 100644
--- a/PVE/Storage/LunCmd/Istgt.pm
+++ b/PVE/Storage/LunCmd/Istgt.pm
@@ -284,9 +284,15 @@ my $parser = sub {
         } elsif ($lun) {
             next if (($_ =~ /^\s*#/) || ($_ =~ /^\s*$/));
             if ($_ =~ /^\s*(\w+)\s+(.+)\s*/) {
-                next if $2 =~ /^Option.*/;
-                $SETTINGS->{$lun}->{$1} = $2;
-                $SETTINGS->{$lun}->{$1} =~ s/^\s+|\s+$|"\s*//g;
+                my $arg1 = $1;
+                $2 =~ s/^\s+|\s+$|"\s*//g;
+                if ($2 =~ /^Storage\s*(.+)/i) {
+                    $SETTINGS->{$lun}->{$arg1}->{storage} = $1;
+                } elsif ($2 =~ /^Option\s*(.+)/i) {
+                    push @{$SETTINGS->{$lun}->{$arg1}->{options}}, $1;
+                } else {
+                    $SETTINGS->{$lun}->{$arg1} = $2;
+                }
             } else {
                 die "$line: parse error [$_]";
             }
@@ -305,19 +311,23 @@ my $parser = sub {
             my $lu = ();
             while ((my $key, my $val) = each(%{$SETTINGS->{"LogicalUnit$i"}})) {
                 if ($key =~ /^LUN\d+/) {
-                    if ($val =~ /^Storage\s+([\w\/\-]+)\s+(\w+)/) {
-                        my $storage = $1;
-                        my $size = $parse_size->($2);
-                        my $conf = undef;
-                        if ($storage =~ /^$base\/$scfg->{pool}\/([\w\-]+)$/) {
-                            $conf = {
-                                lun => $key,
-                                Storage => $storage,
-                                Size => $size,
-                            };
+                    $val->{storage} =~ /^([\w\/\-]+)\s+(\w+)/;
+                    my $storage = $1;
+                    my $size = $parse_size->($2);
+                    my $conf = undef;
+                    my @options = ();
+                    if ($val->{options}) {
+                        @options = @{$val->{options}};
+                    }
+                    if ($storage =~ /^$base\/$scfg->{pool}\/([\w\-]+)$/) {
+                        $conf = {
+                            lun => $key,
+                            Storage => $storage,
+                            Size => $size,
+                            options => @options,
                         }
-                        push @$lu, $conf if $conf;
                     }
+                    push @$lu, $conf if $conf;
                     delete $SETTINGS->{"LogicalUnit$i"}->{$key};
                 }
             }
-- 
1.7.10.4

From afdb500927b634d962dd131208be2a239519c6c4 Mon Sep 17 00:00:00 2001
From: Chris Allen <Chris Allen>
Date: Tue, 11 Mar 2014 15:07:53 -0700
Subject: [PATCH 5/6] Added target-group and host-group options for ZFS
 comstar views.  Use "comstar_tg" and "comstar_hg" in
 "/etc/pve/storage.pm".


Signed-off-by: Chris Allen <Chris Allen>
---
 PVE/Storage/LunCmd/Comstar.pm |    9 +++++++++
 PVE/Storage/ZFSPlugin.pm      |   12 +++++++++++-
 2 files changed, 20 insertions(+), 1 deletion(-)

diff --git a/PVE/Storage/LunCmd/Comstar.pm b/PVE/Storage/LunCmd/Comstar.pm
index aa1c614..1b079f0 100644
--- a/PVE/Storage/LunCmd/Comstar.pm
+++ b/PVE/Storage/LunCmd/Comstar.pm
@@ -66,6 +66,15 @@ sub run_lun_command {
     } elsif ($method eq 'list_lu') {
         $guid = $params[0];
         @params = undef;
+    } elsif ($method eq 'add_view') {
+        if ($scfg->{comstar_tg}) {
+          unshift @params, $scfg->{comstar_tg};
+          unshift @params, '--target-group';
+	}
+        if ($scfg->{comstar_hg}) {
+          unshift @params, $scfg->{comstar_hg};
+          unshift @params, '--host-group';
+	}
     }
 
     my $cmdmap = $get_lun_cmd_map->($method);
diff --git a/PVE/Storage/ZFSPlugin.pm b/PVE/Storage/ZFSPlugin.pm
index 302d2d6..208e718 100644
--- a/PVE/Storage/ZFSPlugin.pm
+++ b/PVE/Storage/ZFSPlugin.pm
@@ -338,7 +338,15 @@ sub properties {
     sparse => {
         description => "use sparse volumes",
         type => 'boolean',
-    }
+    },
+    comstar_tg => {
+        description => "target group for comstar views",
+        type => 'string',
+    },
+    comstar_hg => {
+        description => "host group for comstar views",
+        type => 'string',
+    },
     };
 }
 
@@ -353,6 +361,8 @@ sub options {
     iscsiprovider => { fixed => 1 },
     nowritecache => { optional => 1 },
     sparse => { optional => 1 },
+    comstar_hg => { optional => 1 },
+    comstar_tg => { optional => 1 },
     content => { optional => 1 },
     };
 }
-- 
1.7.10.4

From d749f409743f02c89d8aaa04b2726b3b10a8e41a Mon Sep 17 00:00:00 2001
From: Chris Allen <Chris Allen>
Date: Tue, 11 Mar 2014 17:32:17 -0700
Subject: [PATCH 6/6] Added code to abort a snapshot rollback in ZFS if the
 snapshot selected is not the most recent.  This is to
 avoid lu deletion when trying to rollback to a snapshot
 that isn't the newest.


Signed-off-by: Chris Allen <Chris Allen>
---
 PVE/Storage/ZFSPlugin.pm |   15 +++++++++++++++
 1 file changed, 15 insertions(+)

diff --git a/PVE/Storage/ZFSPlugin.pm b/PVE/Storage/ZFSPlugin.pm
index 208e718..cb733d1 100644
--- a/PVE/Storage/ZFSPlugin.pm
+++ b/PVE/Storage/ZFSPlugin.pm
@@ -607,6 +607,21 @@ sub volume_snapshot {
 sub volume_snapshot_rollback {
     my ($class, $scfg, $storeid, $volname, $snap) = @_;
 
+    # abort rollback if snapshot is not the latest
+    my @params = ('-t', 'snapshot', '-o', 'name', '-s', 'creation');
+    my $text = zfs_request($scfg, undef, 'list', @params);
+    my @snapshots = split(/\n/, $text);
+    my $recentsnap = undef;
+    foreach (@snapshots) {
+        if (/$scfg->{pool}\/$volname/) {
+            s/^.*@//;
+            $recentsnap = $_;
+        } 
+    }
+    if ($snap ne $recentsnap) {
+        die "cannot rollback, more recent snapshots exist\n";
+    }
+
     zfs_delete_lu($scfg, $volname);
 
     zfs_request($scfg, undef, 'rollback', "$scfg->{pool}/$volname\@$snap");
-- 
1.7.10.4

_______________________________________________
pve-devel mailing list
pve-devel@pve.proxmox.com
http://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

Reply via email to