- Added -resyncdev option to work with the new SCST resync_size option.
authormgandalf <mgandalf@d57e44dd-8a1f-0410-8b47-8ef2f437770f>
Thu, 16 Apr 2009 17:16:40 +0000 (17:16 +0000)
committermgandalf <mgandalf@d57e44dd-8a1f-0410-8b47-8ef2f437770f>
Thu, 16 Apr 2009 17:16:40 +0000 (17:16 +0000)
- SCST.pm: Added resyncDevice()
- SCST.pm: General cleanup.

git-svn-id: https://scst.svn.sourceforge.net/svnroot/scst/trunk@784 d57e44dd-8a1f-0410-8b47-8ef2f437770f

scstadmin/ChangeLog
scstadmin/scst-0.7.4/lib/SCST/SCST.pm
scstadmin/scstadmin

index c431b3f..aae494c 100644 (file)
@@ -1,3 +1,9 @@
+Changes since 1.0.6
+
+- Added -resyncdev option to work with the new SCST resync_size option.
+- SCST.pm: Added resyncDevice()
+- SCST.pm: General cleanup.
+
 Changes since 1.0.5
 
 - Fixed a removeDevice() case when using -ForceConfig.
index a4c73f1..49dc062 100644 (file)
@@ -2,7 +2,7 @@ package SCST::SCST;
 
 # Author:      Mark R. Buechler
 # License:     GPLv2
-# Copyright (c) 2005-2008 Mark R. Buechler
+# Copyright (c) 2005-2009 Mark R. Buechler
 
 use 5.005;
 use IO::Handle;
@@ -10,9 +10,6 @@ use IO::File;
 use strict;
 use Carp qw(cluck);
 
-my $TRUE  = 1;
-my $FALSE = 0;
-
 my $_SCST_DIR_           = '/proc/scsi_tgt';
 my $_SCST_IO_            = $_SCST_DIR_.'/scsi_tgt';
 my $_SCST_CDROM_IO_      = $_SCST_DIR_.'/dev_cdrom/dev_cdrom';
@@ -55,7 +52,7 @@ $IOTYPE_PHYSICAL    = 100;
 $IOTYPE_VIRTUAL     = 101;
 $IOTYPE_PERFORMANCE = 102;
 
-$VERSION = 0.7.7;
+$VERSION = 0.7.9;
 
 my $_SCST_MIN_MAJOR_   = 0;
 my $_SCST_MIN_MINOR_   = 9;
@@ -129,7 +126,7 @@ my %_AVAILABLE_OPTIONS_ = ('WRITE_THROUGH' => 'WRITE_THROUGH',
 sub new {
        my $this = shift;
        my $debug = shift;
-       my $badVersion = $TRUE;
+       my $badVersion = 1;
        
        my $class = ref($this) || $this;
        my $self = {};
@@ -143,9 +140,10 @@ sub new {
        my($major, $minor, $release) = split(/\./, $scstVersion, 3);
        ($release, undef) = split(/\-/, $release) if ($release =~ /\-/);
 
-       $badVersion = $FALSE if (($major > $_SCST_MIN_MAJOR_) ||
-                                (($major == $_SCST_MIN_MAJOR_) && ($minor > $_SCST_MIN_MINOR_)) ||
-                                (($major == $_SCST_MIN_MAJOR_) && ($minor == $_SCST_MIN_MINOR_) && ($release >= $_SCST_MIN_RELEASE_)));
+       $badVersion = 0 if (($major > $_SCST_MIN_MAJOR_) ||
+                           (($major == $_SCST_MIN_MAJOR_) && ($minor > $_SCST_MIN_MINOR_)) ||
+                           (($major == $_SCST_MIN_MAJOR_) && ($minor == $_SCST_MIN_MINOR_) &&
+                            ($release >= $_SCST_MIN_RELEASE_)));
 
        croak("This module requires at least SCST version $_SCST_MIN_MAJOR_\.$_SCST_MIN_MINOR_\.".
              "$_SCST_MIN_RELEASE_ and version $scstVersion was found") if ($badVersion);
@@ -157,7 +155,7 @@ sub scstVersion {
        my $self = shift;
 
        my $io = new IO::File $_SCST_VERSION_IO_, O_RDONLY;
-       return $TRUE if (!$io);
+       return 1 if (!$io);
 
        my $version = <$io>;
        chomp $version;
@@ -189,10 +187,10 @@ sub groupExists {
        my $groups = $self->groups();
 
        foreach my $_group (@{$groups}) {
-               return $TRUE if ($group eq $_group);
+               return 1 if ($group eq $_group);
        }
 
-       return $FALSE;
+       return 0;
 }
 
 sub addGroup {
@@ -205,7 +203,7 @@ sub addGroup {
 
        if (!$io) {
                $self->{'error'} = "addGroup(): Failed to open handler IO '$_SCST_IO_'";
-               return $TRUE;
+               return 1;
        }
 
        my $cmd = "add_group $group\n";
@@ -218,7 +216,7 @@ sub addGroup {
 
        close $io;
 
-       return $FALSE if ($self->{'debug'});
+       return 0 if ($self->{'debug'});
        return !$self->groupExists($group);
 }
 
@@ -232,7 +230,7 @@ sub removeGroup {
 
        if (!$io) {
                $self->{'error'} = "removeGroup(): Failed to open handler IO '$_SCST_IO_'";
-               return $TRUE;
+               return 1;
        }
 
        my $cmd = "del_group $group\n";
@@ -245,7 +243,7 @@ sub removeGroup {
 
        close $io;
 
-       return $FALSE if ($self->{'debug'});
+       return 0 if ($self->{'debug'});
        return $self->groupExists($group);
 }
 
@@ -253,7 +251,7 @@ sub sgvStats {
        my $self = shift;
        my $io = new IO::File $_SCST_SGV_STATS_, O_RDONLY;
        my %stats;
-       my $first = $TRUE;
+       my $first = 1;
 
        if (!$io) {
                $self->{'error'} = "sgvStats(): Failed to open handler IO '$_SCST_IO_'";
@@ -264,7 +262,7 @@ sub sgvStats {
                chomp $line;
 
                if ($first || !$line) {
-                       $first = $FALSE;
+                       $first = 0;
                        next;
                }
 
@@ -303,7 +301,7 @@ sub sessions {
        my $self = shift;
        my $io = new IO::File $_SCST_SESSIONS_, O_RDONLY;
        my %sessions;
-       my $first = $TRUE;
+       my $first = 1;
 
        if (!$io) {
                $self->{'error'} = "sessions(): Failed to open handler IO '$_SCST_IO_'";
@@ -314,7 +312,7 @@ sub sessions {
                chomp $line;
 
                if ($first) {
-                       $first = $FALSE;
+                       $first = 0;
                        next;
                }
 
@@ -332,7 +330,7 @@ sub devices {
        my $self = shift;
        my $io = new IO::File $_SCST_IO_, O_RDONLY;
        my %devices;
-       my $first = $TRUE;
+       my $first = 1;
 
        if (!$io) {
                $self->{'error'} = "devices(): Failed to open handler IO '$_SCST_IO_'";
@@ -343,7 +341,7 @@ sub devices {
                chomp $line;
 
                if ($first) {
-                       $first = $FALSE;
+                       $first = 0;
                        next;
                }
 
@@ -362,7 +360,7 @@ sub handlerDevices {
        my $self = shift;
        my $handler = shift;
        my $handler_io = $_IO_MAP_{$handler};
-       my $first = $TRUE;
+       my $first = 1;
        my $handler_name = $_REVERSE_MAP_{$handler};
        my %devices;
 
@@ -388,7 +386,7 @@ sub handlerDevices {
                chomp $line;
 
                if ($first) {
-                       $first = $FALSE;
+                       $first = 0;
                        next;
                }
 
@@ -425,9 +423,9 @@ sub handlerDeviceExists {
        my $devices = $self->handlerDevices($handler);
 
        return -1 if (!defined($devices));
-       return $TRUE if (defined($$devices{$device}));
+       return 1 if (defined($$devices{$device}));
 
-       return $FALSE;
+       return 0;
 }
 
 sub handlerType {
@@ -458,7 +456,6 @@ sub openDevice {
 
        ($options, $valid_opts) = $self->checkOptions($options);
 
-
        if (!$valid_opts) {
                $self->{'error'} = "openDevice(): Invalid option(s) '$options' given for device '$device'";
                return 1;
@@ -489,7 +486,7 @@ sub openDevice {
 
        my $rc = $self->handler_private($handler_io, $cmd);
 
-       return $FALSE if ($self->{'debug'});
+       return 0 if ($self->{'debug'});
        return $rc if ($rc);
 
        $rc = !$self->handlerDeviceExists($handler, $device);
@@ -513,12 +510,12 @@ sub closeDevice {
        if (!$handler_io) {
                $self->{'error'} = "closeDevice(): Failed to open handler IO '$handler_io'".
                  " or handler '$handler_name' ($handler) invalid";
-               return $TRUE;
+               return 1;
        }
 
        if (!$self->handlerExists($handler)) {
                $self->{'error'} = "closeDevice(): Handler '$handler_name' ($handler) does not exist";
-               return $TRUE;
+               return 1;
        }
 
        if (!$self->handlerDeviceExists($handler, $device)) {
@@ -530,7 +527,7 @@ sub closeDevice {
 
        my $rc = $self->handler_private($handler_io, $cmd);
 
-       return $FALSE if ($self->{'debug'});
+       return 0 if ($self->{'debug'});
        return $rc if ($rc);
 
        $rc = $self->handlerDeviceExists($handler, $device);
@@ -543,6 +540,39 @@ sub closeDevice {
        return $rc;
 }
 
+sub resyncDevice {
+       my $self = shift;
+       my $handler = shift;
+       my $device = shift;
+       my $handler_io = $_IO_MAP_{$handler};
+       my $handler_name = $_REVERSE_MAP_{$handler};
+
+       if (!$handler_io) {
+               $self->{'error'} = "resyncDevice(): Failed to open handler IO '$handler_io'".
+                 " or handler '$handler_name' ($handler) invalid";
+               return 1;
+       }
+
+       if (!$self->handlerExists($handler)) {
+               $self->{'error'} = "resyncDevice(): Handler '$handler_name' ($handler) does not exist";
+               return 1;
+       }
+
+       if (!$self->handlerDeviceExists($handler, $device)) {
+               $self->{'error'} = "resyncDevice(): Device '$device' does not exist";
+               return 2;
+       }
+
+       my $cmd = "resync_size $device\n";
+
+       my $rc = $self->handler_private($handler_io, $cmd);
+
+       return 0 if ($self->{'debug'});
+       return $rc if ($rc);
+
+       return $rc;
+}
+
 sub userExists {
        my $self = shift;
        my $user = shift;
@@ -553,10 +583,10 @@ sub userExists {
        return -1 if (!defined($users));
 
        foreach my $_user (@{$users}) {
-               return $TRUE if ($user eq $_user);
+               return 1 if ($user eq $_user);
        }
 
-       return $FALSE;
+       return 0;
 }
 
 sub users {
@@ -604,7 +634,7 @@ sub addUser {
 
        my $rc = $self->group_private($group, $_SCST_USERS_IO_, $cmd);
 
-       return $FALSE if ($self->{'debug'});
+       return 0 if ($self->{'debug'});
        return $rc if ($rc);
 
        $rc = !$self->userExists($user, $group);
@@ -636,7 +666,7 @@ sub removeUser {
 
        my $rc = $self->group_private($group, $_SCST_USERS_IO_, $cmd);
 
-       return $FALSE if ($self->{'debug'});
+       return 0 if ($self->{'debug'});
        return $rc if ($rc);
 
        $rc = $self->userExists($user, $group);
@@ -655,14 +685,14 @@ sub clearUsers {
 
        if (!$self->groupExists($group)) {
                $self->{'error'} = "clearUsers(): Group '$group' does not exist";
-               return $TRUE;
+               return 1;
        }
 
        my $cmd = "clear\n";
 
        my $rc = $self->group_private($group, $_SCST_USERS_IO_, $cmd);
 
-       return $FALSE if ($self->{'debug'});
+       return 0 if ($self->{'debug'});
 
        if ($rc) {
                $self->{'error'} = "clearUsers(): An error occured while clearing users from ".
@@ -682,10 +712,10 @@ sub handlerExists {
        my $handlers = $self->handlers();
 
        foreach my $_handler (@{$handlers}) {
-               return $TRUE if ($handler eq $_handler);
+               return 1 if ($handler eq $_handler);
        }
 
-       return $FALSE;
+       return 0;
 }
 
 sub handlers {
@@ -718,19 +748,19 @@ sub groupDeviceExists {
        return -1 if (!defined($devices));
 
        if (defined($lun)) {
-               return $TRUE if ($$devices{$device} eq $lun);
+               return 1 if ($$devices{$device} eq $lun);
        } else {
-               return $TRUE if (defined($$devices{$device}));
+               return 1 if (defined($$devices{$device}));
        }
 
-       return $FALSE;
+       return 0;
 }
 
 sub groupDevices {
        my $self = shift;
        my $group = shift;
        my %devices;
-       my $first = $TRUE;
+       my $first = 1;
 
        if (!$self->groupExists($group)) {
                $self->{'error'} = "groupDevices(): Group '$group' does not exist";
@@ -749,7 +779,7 @@ sub groupDevices {
                chomp $line;
 
                if ($first) {
-                       $first = $FALSE;
+                       $first = 0;
                        next;
                }
 
@@ -771,7 +801,7 @@ sub assignDeviceToGroup {
 
        if (!$self->groupExists($group)) {
                $self->{'error'} = "assignDeviceToGroup(): Group '$group' does not exist";
-               return $TRUE;
+               return 1;
        }
 
        if ($self->groupDeviceExists($device, $group, $lun)) {
@@ -784,7 +814,7 @@ sub assignDeviceToGroup {
 
        my $rc = $self->group_private($group, $_SCST_DEVICES_IO_, $cmd);
 
-       return $FALSE if ($self->{'debug'});
+       return 0 if ($self->{'debug'});
        return $rc if ($rc);
 
        $rc = !$self->groupDeviceExists($device, $group, $lun);
@@ -807,12 +837,12 @@ sub assignDeviceToHandler {
        if (!$handler_io) {
                $self->{'error'} = "assignDeviceToHandler(): Failed to open handler IO '$handler_io' or ".
                  "handler '$handler_name' ($handler) invalid";
-               return $TRUE;
+               return 1;
        }
 
        if (!$self->handlerExists($handler)) {
                $self->{'error'} = "assignDeviceToHandler(): Handler '$handler_name' ($handler) does not exist";
-               return $TRUE;
+               return 1;
        }
 
        if ($self->handlerDeviceExists($handler, $device)) {
@@ -825,7 +855,7 @@ sub assignDeviceToHandler {
 
        my $rc = $self->scst_private($cmd);
 
-       return $FALSE if ($self->{'debug'});
+       return 0 if ($self->{'debug'});
        return $rc if($rc);
 
        $rc = !$self->handlerDeviceExists($handler, $device);
@@ -845,7 +875,7 @@ sub removeDeviceFromGroup {
 
        if (!$self->groupExists($group)) {
                $self->{'error'} = "removeDeviceFromGroup(): Group '$group' does not exist";
-               return $TRUE;
+               return 1;
        }
 
        if (!$self->groupDeviceExists($device, $group)) {
@@ -857,7 +887,7 @@ sub removeDeviceFromGroup {
 
        my $rc = $self->group_private($group, $_SCST_DEVICES_IO_, $cmd);
 
-       return $FALSE if ($self->{'debug'});
+       return 0 if ($self->{'debug'});
        return $rc if ($rc);
 
        $rc = $self->groupDeviceExists($device, $group);
@@ -874,13 +904,13 @@ sub clearGroupDevices {
        my $self = shift;
        my $group = shift;
 
-       return $TRUE if (!$self->groupExists($group));
+       return 1 if (!$self->groupExists($group));
 
        my $cmd = "clear\n";
 
        my $rc = $self->group_private($group, $_SCST_DEVICES_IO_, $cmd);
 
-       return $FALSE if ($self->{'debug'});
+       return 0 if ($self->{'debug'});
 
        if ($rc) {
                $self->{'error'} = "clearGroupDevices(): An error occured while clearing devices from ".
@@ -902,7 +932,7 @@ sub handler_private {
 
        if (!$io) {
                cluck("WARNING: SCST/SCST.pm: Failed to open handler IO $handler_io, assuming disabled");
-               return $FALSE;
+               return 0;
        }
 
        if ($self->{'debug'}) {
@@ -913,7 +943,7 @@ sub handler_private {
 
        close $io;
 
-       return $FALSE;
+       return 0;
 }
 
 sub scst_private {
@@ -924,7 +954,7 @@ sub scst_private {
 
        if (!$io) {
                $self->{'error'} = "SCST/SCST.pm: Failed to open handler IO '$_SCST_IO_'";
-               return $TRUE;
+               return 1;
        }
 
        if ($self->{'debug'}) {
@@ -935,7 +965,7 @@ sub scst_private {
 
        close $io;
 
-       return $FALSE;
+       return 0;
 }
 
 sub group_private {
@@ -948,7 +978,7 @@ sub group_private {
 
        if (!$io) {
                $self->{'error'} = "SCST/SCST.pm: Failed to open handler IO '".$_SCST_GROUPS_DIR_."/$group/".$file."'";
-               return $TRUE;
+               return 1;
        }
 
        if ($self->{'debug'}) {
@@ -959,7 +989,7 @@ sub group_private {
 
        close $io;
 
-       return $FALSE;
+       return 0;
 }
 
 sub checkOptions {
@@ -967,15 +997,15 @@ sub checkOptions {
        my $options = shift;
        my $o_string;
        my $b_string;
-       my $bad = $FALSE;
+       my $bad = 0;
 
-       return undef, $TRUE if (!$options);
+       return undef, 1 if (!$options);
 
        foreach my $option (split(/[\s+|\,]/, $options)) {
                my $map = $_AVAILABLE_OPTIONS_{$option};
 
                if (!$map) {
-                       $bad = $TRUE;
+                       $bad = 1;
                        $b_string .= ",$option";
                } else {
                        $o_string .= ",$map";
@@ -984,12 +1014,12 @@ sub checkOptions {
 
        if ($bad) {
                $b_string =~ s/^\,//;
-               return $b_string, $FALSE;
+               return $b_string, 0;
        }
 
        $o_string =~ s/^\,//;
 
-       return $o_string, $TRUE;
+       return $o_string, 1;
 }
 
 sub errorString {
index aad8ca9..be9fa9a 100755 (executable)
@@ -1,11 +1,11 @@
 #!/usr/bin/perl
-$Version  = 'SCST Configurator v1.0.5';
+$Version  = 'SCST Configurator v1.0.6';
 
 # Configures SCST
 #
 # Author:       Mark R. Buechler
 # License:      GPLv2
-# Copyright (c) 2005-2007 Mark R. Buechler
+# Copyright (c) 2005-2009 Mark R. Buechler
 
 sub usage
   {
@@ -24,16 +24,18 @@ Target Driver Operations
      -enable <wwn|host>   : Enable target mode for driver at specified WWN or host.
      -disable <wwn|host>  : Disable target mode for driver at specified WWN or host.
 
-Devices Operations
+Device Operations
      -adddev <device>     : Adds a device to a handler.
          -handler <handler>
          -path <path>
          -options <options>
          -blocksize <bytes>
+     -resyncdev <device>  : Resync the size of a device with the initiator(s).
+         -handler <handler>
      -RemoveDev <device>  : Remove a device from a handler.
          -handler <handler>
  
-Users Operations
+User Operations
      -adduser <user>      : Adds a user to a security group.
          -group <group>
      -RemoveUser <user>   : Delete a user from a security group.
@@ -41,11 +43,11 @@ Users Operations
      -ClearUsers          : Clear all users from a given security group.
          -group <group>
 
-Groups Operations
+Group Operations
      -addgroup <group>    : Add a given group to available security groups.
      -RemoveGroup <group> : Remove a give group from available security groups.
      
-Assignments Operations
+Assignment Operations
      -assigndev <device>  : Assign a given device to a security group.
          -group <group>
          -lun <lun>
@@ -169,6 +171,7 @@ sub getArgs {
        my $showSessions;
        my $addDev;
        my $devPath;
+       my $resyncDev;
        my $removeDev;
        my $addUser;
        my $removeUser;
@@ -204,6 +207,7 @@ sub getArgs {
                            'addgroup=s'        => \$addGroup,
                            'RemoveGroup=s'     => \$removeGroup,
                            'assigndev=s'       => \$assignDev,
+                           'resyncdev=s'       => \$resyncDev,
                            'ReleaseDev=s'      => \$releaseDev,
                            'ClearDevs'         => \$clearDevs,
                            'handler=s'         => \$handler,
@@ -250,6 +254,11 @@ sub getArgs {
                usage();
        }
 
+       if ($resyncDev && !$handler) {
+               print "Please specify -handler with -resyncdev.\n\n";
+               usage();
+       }
+
        if ($removeDev && !$handler) {
                print "Please specify -handler with -RemoveDev.\n\n";
                usage();
@@ -298,8 +307,8 @@ sub getArgs {
        $enable =~ tr/A-Z/a-z/; $disable =~ tr/A-Z/a-z/;
        $options =~ tr/a-z/A-Z/ if ($options);
 
-       if ((defined($showSessions) + defined($addDev) + defined($removeDev) +
-            defined($addUser) + defined($enable) + defined($disable) +
+       if ((defined($showSessions) + defined($addDev) + defined($resyncDev) +
+            defined($removeDev)+ defined($addUser) + defined($enable) + defined($disable) +
             defined($removeUser) + defined($clearUsers) + defined($assignDev) +
             defined($releaseDev) + defined($clearDevs) + defined($applyConfig) +
             defined($clearConfig) + defined($writeConfig) + defined($checkConfig)) > 1) {
@@ -310,9 +319,9 @@ sub getArgs {
        $applyConfig = $_DEF_CONFIG_ if (defined($applyConfig) && !$applyConfig);
        $checkConfig = $_DEF_CONFIG_ if (defined($checkConfig) && !$checkConfig);
 
-       return ($enable, $disable, $addDev, $devPath, $devLun, $removeDev, $addUser, $removeUser,
-               $clearUsers, $addGroup, $removeGroup, $assignDev, $releaseDev, $clearDevs,
-               $handler, $group, $options, $blocksize, $applyConfig, $forceConfig,
+       return ($enable, $disable, $addDev, $devPath, $devLun, $resyncDev, $removeDev, $addUser,
+               $removeUser, $clearUsers, $addGroup, $removeGroup, $assignDev, $releaseDev,
+               $clearDevs, $handler, $group, $options, $blocksize, $applyConfig, $forceConfig,
                $clearConfig, $writeConfig, $checkConfig, $showSessions);
 }
 
@@ -324,9 +333,9 @@ sub main {
        # We need to run as root
        if ( $> ) {die("This program must run as root.\n");}
 
-       my ($enable, $disable, $addDev, $devPath, $devLun, $removeDev, $addUser, $removeUser,
-           $clearUsers, $addGroup, $removeGroup, $assignDev, $releaseDev, $clearDevs,
-           $handler, $group, $options, $blocksize, $applyConfig, $forceConfig,
+       my ($enable, $disable, $addDev, $devPath, $devLun, $resyncDev, $removeDev, $addUser,
+           $removeUser, $clearUsers, $addGroup, $removeGroup, $assignDev, $releaseDev,
+           $clearDevs, $handler, $group, $options, $blocksize, $applyConfig, $forceConfig,
            $clearConfig, $writeConfig, $checkConfig, $showSessions) = getArgs();
 
        $SCST = new SCST::SCST($_DEBUG_);
@@ -367,6 +376,10 @@ sub main {
                        $rc = addDevice($handler, $addDev, $devPath, $options, $blocksize);
                        last SWITCH;
                };
+               $resyncDev && do {
+                       $rc = resyncDevice($handler, $resyncDev);
+                       last SWITCH;
+               };
                $removeDev && do {
                        $rc = removeDevice($handler, $removeDev);
                        last SWITCH;
@@ -1040,6 +1053,29 @@ sub addDevice {
        return $FALSE;
 }
 
+sub resyncDevice {
+       my $handler = shift;
+       my $device = shift;
+
+       my $_handler = $_HANDLER_MAP_{$handler};
+       my $htype = $SCST->handlerType($_handler);
+
+       if (!defined($$DEVICES{$device})) {
+               print "WARNING: Device '$device' not defined.\n";
+               return $TRUE;
+       }
+
+       print "\t-> Resync'ing virtual device '$device'..\n";
+
+       if ($SCST->resyncDevice($_handler, $device)) {
+               print "WARNING: Failed to resync virtual device '$device': ".
+                 $SCST->errorString()."\n";
+               return $TRUE;
+       }
+
+       return $FALSE;
+}
+
 sub removeDevice {
        my $handler = shift;
        my $device = shift;