- Fix really stupid mistake where config commits were using same path
[mirror/scst/.git] / scstadmin / SCST / SCST.pm
index c04788f..f591b59 100644 (file)
@@ -24,6 +24,7 @@ my $_SCST_TAPE_IO_       = $_SCST_DIR_.'/dev_tape/dev_tape';
 my $_SCST_TAPEP_IO_      = $_SCST_DIR_.'/dev_tape_perf/dev_tape_perf';
 my $_SCST_VDISK_IO_      = $_SCST_DIR_.'/vdisk/vdisk';
 my $_SCST_VCDROM_IO_     = $_SCST_DIR_.'/vcdrom/vcdrom';
+my $_SCST_PROCESSOR_IO_  = $_SCST_DIR_.'/dev_processor/dev_processor';
 my $_SCST_GROUPS_DIR_    = $_SCST_DIR_.'/groups';
 my $_SCST_SGV_STATS_     = $_SCST_DIR_.'/sgv';
 my $_SCST_SESSIONS_      = $_SCST_DIR_.'/sessions';
@@ -32,24 +33,28 @@ my $_SCST_VERSION_IO_    = $_SCST_DIR_.'/version';
 my $_SCST_USERS_IO_      = 'names';
 my $_SCST_DEVICES_IO_    = 'devices';
 
-my @_AVAILABLE_OPTIONS_  = ('WRITE_THROUGH', 'O_DIRECT', 'READ_ONLY', 'NULLIO', 'NV_CACHE');
-
 use vars qw(@ISA @EXPORT $VERSION $CDROM_TYPE $CHANGER_TYPE $DISK_TYPE $VDISK_TYPE
             $VCDROM_TYPE $DISKPERF_TYPE $MODISK_TYPE $MODISKPERF_TYPE $TAPE_TYPE
-            $TAPEPERF_TYPE);
-
-$CDROM_TYPE      = 1;
-$CHANGER_TYPE    = 2;
-$DISK_TYPE       = 3;
-$VDISK_TYPE      = 4;
-$VCDROM_TYPE     = 5;
-$DISKPERF_TYPE   = 6;
-$MODISK_TYPE     = 7;
-$MODISKPERF_TYPE = 8;
-$TAPE_TYPE       = 9;
-$TAPEPERF_TYPE   = 10;
-
-$VERSION = 0.6.1;
+            $TAPEPERF_TYPE $PROCESSOR_TYPE $IOTYPE_PHYSICAL $IOTYPE_VIRTUAL
+            $IOTYPE_PERFORMANCE);
+
+$CDROM_TYPE         = 1;
+$CHANGER_TYPE       = 2;
+$DISK_TYPE          = 3;
+$VDISK_TYPE         = 4;
+$VCDROM_TYPE        = 5;
+$DISKPERF_TYPE      = 6;
+$MODISK_TYPE        = 7;
+$MODISKPERF_TYPE    = 8;
+$TAPE_TYPE          = 9;
+$TAPEPERF_TYPE      = 10;
+$PROCESSOR_TYPE     = 11;
+
+$IOTYPE_PHYSICAL    = 100;
+$IOTYPE_VIRTUAL     = 101;
+$IOTYPE_PERFORMANCE = 102;
+
+$VERSION = 0.7.2;
 
 my $_SCST_MIN_MAJOR_   = 0;
 my $_SCST_MIN_MINOR_   = 9;
@@ -64,7 +69,8 @@ my %_IO_MAP_ = ($CDROM_TYPE => $_SCST_CDROM_IO_,
                $MODISK_TYPE => $_SCST_MODISK_IO_,
                $MODISKPERF_TYPE => $_SCST_MODISKP_IO_,
                $TAPE_TYPE => $_SCST_TAPE_IO_,
-               $TAPEPERF_TYPE => $_SCST_TAPEP_IO_);
+               $TAPEPERF_TYPE => $_SCST_TAPEP_IO_,
+               $PROCESSOR_TYPE => $_SCST_PROCESSOR_IO_);
 
 my %_TYPE_MAP_ = ('dev_cdrom' => $CDROM_TYPE,
                  'dev_changer' => $CHANGER_TYPE,
@@ -75,7 +81,42 @@ my %_TYPE_MAP_ = ('dev_cdrom' => $CDROM_TYPE,
                  'dev_modisk' => $MODISK_TYPE,
                  'dev_modisk_perf' => $MODISKPERF_TYPE,
                  'dev_tape' => $TAPE_TYPE,
-                 'dev_tape_perf' => $TAPEPERF_TYPE);
+                 'dev_tape_perf' => $TAPEPERF_TYPE,
+                 'dev_processor' => $PROCESSOR_TYPE);
+
+my %_REVERSE_MAP_ = ($CDROM_TYPE => 'dev_cdrom',
+                    $CHANGER_TYPE => 'dev_changer',
+                    $DISK_TYPE => 'dev_disk',
+                    $VDISK_TYPE => 'vdisk',
+                    $VCDROM_TYPE => 'vcdrom',
+                    $DISKPERF_TYPE => 'dev_disk_perf',
+                    $MODISK_TYPE => 'dev_modisk',
+                    $MODISKPERF_TYPE => 'dev_modisk_perf',
+                    $TAPE_TYPE => 'dev_tape',
+                    $TAPEPERF_TYPE => 'dev_tape_perf',
+                    $PROCESSOR_TYPE => 'dev_processor');
+
+my %_IO_TYPES_ = ($CDROM_TYPE => $IOTYPE_PHYSICAL,
+                 $CHANGER_TYPE => $IOTYPE_PHYSICAL,
+                 $DISK_TYPE => $IOTYPE_PHYSICAL,
+                 $VDISK_TYPE => $IOTYPE_VIRTUAL,
+                 $VCDROM_TYPE => $IOTYPE_VIRTUAL,
+                 $DISKPERF_TYPE => $IOTYPE_PERFORMANCE,
+                 $MODISK_TYPE => $IOTYPE_PHYSICAL,
+                 $MODISKPERF_TYPE => $IOTYPE_PERFORMANCE,
+                 $TAPE_TYPE => $IOTYPE_PHYSICAL,
+                 $TAPEPERF_TYPE => $IOTYPE_PERFORMANCE,
+                 $PROCESSOR_TYPE => $IOTYPE_PHYSICAL);
+
+my %_HANDLER_ALIASES_ = ('vdisk_blk' => 'vdisk');
+
+my %_AVAILABLE_OPTIONS_ = ('WRITE_THROUGH' => 'WRITE_THROUGH',
+                          'O_DIRECT'      => 'O_DIRECT',
+                          'READ_ONLY'     => 'READ_ONLY',
+                          'NULLIO'        => 'NULLIO',
+                          'NV_CACHE'      => 'NV_CACHE',
+                          'BLOCKIO'       => 'BLOCKIO',
+                          'BIO'           => 'BLOCKIO');
 
 sub new {
        my $this = shift;
@@ -299,6 +340,8 @@ sub devices {
                }
 
                my($vname, $handler) = split(/\s+/, $line);
+
+               $handler = $_HANDLER_ALIASES_{$handler} if ($_HANDLER_ALIASES_{$handler});
                $devices{$vname} = $_TYPE_MAP_{$handler};
        }
 
@@ -327,8 +370,8 @@ sub handlerDevices {
        my $io = new IO::File $handler_io, O_RDONLY;
 
        if (!$io) {
-               $self->{'error'} = "handlerDevices(): Failed to open handler IO $handler_io";
-               return undef;
+               print "WARNING: handlerDevices(): Failed to open handler IO $handler_io, assuming disabled.\n";
+               return \%devices; # Return an empty hash
        }
 
        while (my $line = <$io>) {
@@ -369,6 +412,20 @@ sub handlerDeviceExists {
        return $FALSE;
 }
 
+sub handlerType {
+       my $self = shift;
+       my $handler = shift;
+
+       my $type = $_IO_TYPES_{$handler};
+
+       if (!$type) {
+               $self->{'error'} = "handlerType(): Handler type for handler $handler not defined";
+               return undef;
+       }
+
+       return $type;
+}
+
 sub openDevice {
        my $self = shift;
        my $handler = shift;
@@ -377,9 +434,12 @@ sub openDevice {
        my $options = shift;
        my $blocksize = shift;
        my $handler_io = $_IO_MAP_{$handler};
+       my $valid_opts;
 
-       if ($self->checkOptions($options)) {
-               $self->{'error'} = "openDevice(): Invalid options '$options' given for device $device";
+       ($options, $valid_opts) = $self->checkOptions($options);
+
+       if (!$valid_opts) {
+               $self->{'error'} = "openDevice(): Invalid option(s) '$options' given for device $device";
                return $TRUE;
        }
 
@@ -437,7 +497,7 @@ sub closeDevice {
                return $TRUE;
        }
 
-       if ($self->handlerDeviceExists($handler, $device)) {
+       if (!$self->handlerDeviceExists($handler, $device)) {
                $self->{'error'} = "closeDevice(): Device $device is not open";
                return 2;
        }
@@ -594,6 +654,7 @@ sub clearUsers {
 sub handlerExists {
        my $self = shift;
        my $handler = shift;
+
        my $handlers = $self->handlers();
 
        foreach my $_handler (@{$handlers}) {
@@ -613,7 +674,7 @@ sub handlers {
 
        foreach my $entry (readdir($dirHandle)) {
                next if (($entry eq '.') || ($entry eq '..'));
-               if ((-d $_SCST_DIR_.'/'.$entry ) && (-f $_SCST_DIR_.'/'.$entry.'/'.$entry)) {
+               if ((-d $_SCST_DIR_.'/'.$entry ) && (-f $_SCST_DIR_.'/'.$entry.'/type')) {
                        push @handlers, $_TYPE_MAP_{$entry} if ($_TYPE_MAP_{$entry});
                }
        }
@@ -717,24 +778,25 @@ sub assignDeviceToHandler {
        my $device = shift;
        my $handler = shift;
        my $handler_io = $_IO_MAP_{$handler};
+       my $_handler = $_REVERSE_MAP_{$handler};
 
        if (!$handler_io) {
                $self->{'error'} = "assignDeviceToHandler(): Failed to open handler IO $handler_io or ".
-                 "handler $handler invalid";
+                 "handler $_handler($handler) invalid";
                return $TRUE;
        }
 
        if (!$self->handlerExists($handler)) {
-               $self->{'error'} = "assignDeviceToHandler(): Handler $handler does not exist";
+               $self->{'error'} = "assignDeviceToHandler(): Handler $_handler does not exist";
                return $TRUE;
        }
 
-       if ($self->handlerDeviceExists($device, $handler)) {
-               $self->{'error'} = "assignDeviceToHandler(): Device $device is already assigned to handler $handler";
+       if ($self->handlerDeviceExists($handler, $device)) {
+               $self->{'error'} = "assignDeviceToHandler(): Device $device is already assigned to handler $_handler";
                return 2;
        }
 
-       my $cmd = "assign $device $handler\n";
+       my $cmd = "assign $device $_handler\n";
 
        my $rc = $self->scst_private($cmd);
 
@@ -745,7 +807,7 @@ sub assignDeviceToHandler {
 
        if ($rc) {
                $self->{'error'} = "assignDeviceToHandler(): An error occured while assigning device $device ".
-                 "to handler $handler. See dmesg/kernel log for more information.";
+                 "to handler $_handler. See dmesg/kernel log for more information.";
        }
 
        return $rc;
@@ -814,8 +876,8 @@ sub handler_private {
        my $io = new IO::File $handler_io, O_WRONLY;
 
        if (!$io) {
-               $self->{'error'} = "SCST/SCST.pm: Failed to open handler IO $handler_io";
-               return $TRUE;
+               print "WARNING: SCST/SCST.pm: Failed to open handler IO $handler_io, assuming disabled.\n";
+               return $FALSE;
        }
 
        if ($self->{'debug'}) {
@@ -878,16 +940,19 @@ sub group_private {
 sub checkOptions {
        my $self = shift;
        my $options = shift;
+       my $o_string;
 
-       return if (!$options);
+       return undef, $TRUE if (!$options);
 
        foreach my $option (split(/\s+/, $options)) {
-               foreach my $avail (@_AVAILABLE_OPTIONS_) {
-                       return $FALSE if ($avail eq $option);
-               }
+               my $map = $_AVAILABLE_OPTIONS_{$option};
+               return undef, $FALSE if (!$map);
+               $o_string .= ",$map";
        }
 
-       return $TRUE;
+       $o_string =~ s/^\,//;
+
+       return $o_string, $TRUE;
 }
 
 sub errorString {
@@ -1039,6 +1104,18 @@ Arguments: (int) $handler, (string) $device
 
 Returns: (boolean) $deviceExists
 
+=item SCST::SCST->handlerType();
+
+Return the handler type for the specified handler. Handler types are:
+
+  SCST::SCST::IOTYPE_PHYSICAL
+  SCST::SCST::IOTYPE_VIRTUAL
+  SCST::SCST::IOTYPE_PERFORMANCE
+
+Arguments: (int) $handler
+
+Returns: (int) $handler_type
+
 =item SCST::SCST->openDevice();
 
 Opens an already existing specified device for the specified device handler.