From 00fcdca3026e5b76452b59f8b1cb173519c5ed97 Mon Sep 17 00:00:00 2001 From: Mark Buechler Date: Mon, 25 Jul 2011 18:25:48 +0000 Subject: [PATCH] - Finish out the new ALUA options to scstadmin. - Standardize the new options. - Bug fixes. git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@3753 d57e44dd-8a1f-0410-8b47-8ef2f437770f --- .../scst-0.9.10/lib/SCST/SCST.pm | 15 +- scstadmin/scstadmin.sysfs/scstadmin | 406 ++++++++++++++++-- 2 files changed, 382 insertions(+), 39 deletions(-) diff --git a/scstadmin/scstadmin.sysfs/scst-0.9.10/lib/SCST/SCST.pm b/scstadmin/scstadmin.sysfs/scst-0.9.10/lib/SCST/SCST.pm index e26660b8a..678a4503d 100644 --- a/scstadmin/scstadmin.sysfs/scst-0.9.10/lib/SCST/SCST.pm +++ b/scstadmin/scstadmin.sysfs/scst-0.9.10/lib/SCST/SCST.pm @@ -150,6 +150,7 @@ SCST_C_DGRP_ADD_GRP_FAIL => 134, SCST_C_DGRP_REM_GRP_FAIL => 135, SCST_C_DGRP_NO_GROUP => 136, SCST_C_DGRP_GROUP_EXISTS => 137, +SCST_C_DGRP_DEVICE_OTHER => 138, SCST_C_DGRP_BAD_ATTRIBUTES => 140, SCST_C_DGRP_ATTRIBUTE_STATIC => 141, @@ -259,6 +260,7 @@ my %VERBOSE_ERROR = ( (SCST_C_DGRP_REM_GRP_FAIL) => 'Failed to remove target group from device group. See "dmesg" for more information.', (SCST_C_DGRP_NO_GROUP) => 'No such target group exists within device group.', (SCST_C_DGRP_GROUP_EXISTS) => 'Target group already exists within device group.', +(SCST_C_DGRP_DEVICE_OTHER) => 'Device is already assigned to another device group.', (SCST_C_DGRP_BAD_ATTRIBUTES) => 'Bad attributes for device group.', (SCST_C_DGRP_ATTRIBUTE_STATIC) => 'Device group attribute specified is static.', @@ -1656,6 +1658,17 @@ sub addDeviceGroupDevice { return SCST_C_DGRP_DEVICE_EXISTS if ($rc == TRUE); return $rc if ($rc > 1); + # Check all device groups for this device + my $dgroups = $self->deviceGroups(); + + foreach my $dgroup (@{$dgroups}) { + my $devs = $self->deviceGroupDevices($dgroup); + + foreach my $dev (@{$devs}) { + return SCST_C_DGRP_DEVICE_OTHER if ($dev eq $device); + } + } + my ($path, $cmd); if (new_sysfs_interface()) { die("New /sys interface for device groups not yet supported."); @@ -1828,7 +1841,7 @@ sub removeTargetGroup { } else { $path = make_path(SCST_DEV_GROUP_DIR(), $group, SCST_DG_TGROUPS, SCST_MGMT_IO); } - $cmd .= "del $group"; + $cmd .= "del $tgroup"; my $io = new IO::File $path, O_WRONLY; diff --git a/scstadmin/scstadmin.sysfs/scstadmin b/scstadmin/scstadmin.sysfs/scstadmin index 0a6550360..5fb156496 100755 --- a/scstadmin/scstadmin.sysfs/scstadmin +++ b/scstadmin/scstadmin.sysfs/scstadmin @@ -26,9 +26,9 @@ General Operations Query Operations -list_handler [] : List all available handlers or specific . -list_device [] : List all open devices or specific . - -list_dgrp [] : List all device groups or specific . - -list_tgrp [] - [-target : List all target groups within a device group. + -list_dgrp [] : List all device groups or specific . + -list_tgrp [] : List all target groups within a device group. + [-dev_group ] -list_driver [] : List all available drivers or specific . -list_target [] : List all available targets or specific . [-driver ] @@ -36,23 +36,27 @@ Query Operations [-driver ] [-target ] +List Attribute Operations -list_scst_attr : List all attributes for SCST. -list_hnd_attr : List all attributes for a given handler. -list_dev_attr : List all attributes for a given device. -list_drv_attr : List all attributes for a given driver. - -list_dgrp_attr : List all attributes for a given device group. - -list_tgrp_attr - -target : List all attributes for a device group/target. + -list_dgrp_attr : List all attributes for a given device group. + -list_tgrp_attr : List all attributes for a device group/target. + -dev_group + -list_tinit_attr : List all attributes for a target group initiator. + -dev_group + -tgt_group -list_tgt_attr : List all attributes for a given driver/target. -driver -list_grp_attr : List all attributes for a given group. - -driver - -target + -driver + -target -list_lun_attr : List all attributes for a driver/target/lun. -driver -target [-group ] - -list_ini_attr : List all attributes for a driver/target/initiator + -list_init_attr : List all attributes for a driver/target/initiator -driver -target -group @@ -68,6 +72,15 @@ Set Attribute Operations -attributes -set_drv_attr : Sets driver attribute(s)

to value . -attributes + -set_dgrp_attr : List all attributes for a given device group. + -attributes + -set_tgrp_attr : List all attributes for a device group/target. + -dev_group + -attributes + -set_tinit_attr : List all attributes for a target group initiator. + -dev_group + -tgt_group + -attributes -set_tgt_attr : Sets target attribute(s)

to value . -driver -attributes @@ -80,7 +93,7 @@ Set Attribute Operations -target [-group ] -attributes - -set_ini_attr : Sets initiator attribute(s)

to value . + -set_init_attr : Sets initiator attribute(s)

to value . -driver -target -group @@ -109,12 +122,22 @@ Device Operations -handler Device Group Operations - -add_dgrp : Add device group . - -rem_dgrp : Remove device group . - -add_dgrp_dev - -device : Add device to device group . - -rem_dgrp_dev - -device : Remove device from device group . + -add_dgrp : Add device group . + -rem_dgrp : Remove device group . + -add_dgrp_dev + -dev_group : Add device to device group . + -rem_dgrp_dev + -dev_group : Remove device from device group . + -add_tgrp + -tgt_group : Add target group to device group . + -rem_tgrp + -dev_group : Remove target group from device group. + -add_tgrp_init + -dev_group + -tgt_group : Add initiator to specified target group. + -rem_tgrp_init + -dev_group + -tgt_group : Remove initiator from specified target group. Target Operations -add_target : Add a dynamic target to a capable driver. @@ -261,8 +284,9 @@ sub getArgs { my $listScstAttr; my $listHandlerAttr; my $listDeviceAttr; - my $listDevGroupAttr; + my $listDeviceGroupAttr; my $listTargetGroupAttr; + my $listTargetGroupInitAttr; my $listGroupAttr; my $listDriverAttr; my $listTargetAttr; @@ -272,6 +296,9 @@ sub getArgs { my $setScstAttr; my $setHandlerAttr; my $setDeviceAttr; + my $setDeviceGroupAttr; + my $setTargetGroupAttr; + my $setTargetGroupInitAttr; my $setDriverAttr; my $setTargetAttr; my $setGroupAttr; @@ -292,6 +319,11 @@ sub getArgs { my $addDevGroupDevice; my $removeDevGroupDevice; + my $addTargetGroup; + my $removeTargetGroup; + my $addTargetGroupInit; + my $removeTargetGroupInit; + my $addTarget; my $removeTarget; @@ -320,6 +352,8 @@ sub getArgs { my $group; my $to; my $device; + my $deviceGroup; + my $targetGroup; my $show_usage; my $nonkey; @@ -344,22 +378,26 @@ sub getArgs { 'list_scst_attr' => \$listScstAttr, 'list_hnd_attr=s' => \$listHandlerAttr, 'list_dev_attr=s' => \$listDeviceAttr, - 'list_dgrp_attr=s' => \$listDevGroupAttr, + 'list_dgrp_attr=s' => \$listDeviceGroupAttr, 'list_tgrp_attr=s' => \$listTargetGroupAttr, + 'list_tinit_attr=s' => \$listTargetGroupInitAttr, 'list_drv_attr=s' => \$listDriverAttr, 'list_tgt_attr=s' => \$listTargetAttr, 'list_grp_attr=s' => \$listGroupAttr, 'list_lun_attr=s' => \$listLunAttr, - 'list_ini_attr=s' => \$listInitiatorAttr, + 'list_init_attr=s' => \$listInitiatorAttr, 'set_scst_attr' => \$setScstAttr, 'set_hnd_attr=s' => \$setHandlerAttr, 'set_dev_attr=s' => \$setDeviceAttr, + 'set_dgrp_attr=s' => \$setDeviceGroupAttr, + 'set_tgrp_attr=s' => \$setTargetGroupAttr, + 'set_tinit_attr=s' => \$setTargetGroupInitAttr, 'set_drv_attr=s' => \$setDriverAttr, 'set_tgt_attr=s' => \$setTargetAttr, 'set_grp_attr=s' => \$setGroupAttr, 'set_lun_attr=s' => \$setLunAttr, - 'set_ini_attr=s' => \$setInitiatorAttr, + 'set_init_attr=s' => \$setInitiatorAttr, 'add_drv_attr=s' => \$addDriverAttr, 'add_tgt_attr=s' => \$addTargetAttr, @@ -375,6 +413,11 @@ sub getArgs { 'add_dgrp_dev=s' => \$addDevGroupDevice, 'rem_dgrp_dev=s' => \$removeDevGroupDevice, + 'add_tgrp=s' => \$addTargetGroup, + 'rem_tgrp=s' => \$removeTargetGroup, + 'add_tgrp_init=s' => \$addTargetGroupInit, + 'rem_tgrp_init=s' => \$removeTargetGroupInit, + 'add_target=s' => \$addTarget, 'rem_target=s' => \$removeTarget, @@ -403,6 +446,8 @@ sub getArgs { 'group=s' => \$group, 'to=s' => \$to, 'device=s' => \$device, + 'dev_group=s' => \$deviceGroup, + 'tgt_group=s' => \$targetGroup, 'h' => \$show_usage, 'help' => \$show_usage, @@ -430,14 +475,17 @@ sub getArgs { defined($listDriver) || defined($listTarget) || defined($listGroup) || defined($listSessions) || defined($listScstAttr) || defined($listHandlerAttr) || defined($listDeviceAttr) || defined($listDriverAttr) || defined($listTargetAttr) || defined($listGroupAttr) || defined($listLunAttr) || defined($listInitiatorAttr) || - defined($listDevGroupAttr) || defined($listTargetGroupAttr); + defined($listDeviceGroupAttr) || defined($listTargetGroupAttr) || defined($listTargetGroupInitAttr); my $set_mode = defined($setScstAttr) + defined($setHandlerAttr) + defined($setDeviceAttr) + defined($setDriverAttr) + defined($setTargetAttr) + defined($setGroupAttr) + - defined($setLunAttr) + defined($setInitiatorAttr); + defined($setLunAttr) + defined($setInitiatorAttr) + defined($setDeviceGroupAttr) + + defined($setTargetGroupAttr) + defined($setTargetGroupInitAttr); my $op_mode = defined($clearConfig) + defined($writeConfig) + defined($checkConfig) + defined($openDev) + defined($closeDev) + defined($addDevGroup) + defined($removeDevGroup) + + defined($addTargetGroup) + defined($removeTargetGroup) + + defined($addTargetGroupInit) + defined($removeTargetGroupInit) + defined($addGroup) + defined($removeGroup) + defined($addDevGroupDevice) + defined($removeDevGroupDevice) + defined($addInitiator) + defined($removeInitiator) + defined($clearInitiators) + defined($addDriverAttr) + defined($addTargetAttr) + defined($remDriverAttr) + defined($remTargetAttr) + @@ -455,6 +503,11 @@ sub getArgs { exit 1; } + if (defined($listTargetGroup) && ($deviceGroup eq '')) { + print "Please specify -dev_group with -list_tgrp.\n"; + exit 1; + } + if (defined($listTargetAttr) && ($driver eq '')) { print "Please specify -driver with -list_tgt_attr.\n"; exit 1; @@ -471,12 +524,17 @@ sub getArgs { } if (defined($listInitiatorAttr) && (($driver eq '') || ($target eq '') || ($group eq ''))) { - print "Please specify -driver, -target and -group with -list_ini_attr.\n"; + print "Please specify -driver, -target and -group with -list_init_attr.\n"; exit 1; } - if (defined($listTargetGroupAttr) && ($target eq '')) { - print "Please specify -target with -list_tgrp_attr.\n"; + if (defined($listTargetGroupAttr) && ($deviceGroup eq '')) { + print "Please specify -dev_group with -list_tgrp_attr.\n"; + exit 1; + } + + if (defined($listTargetGroupInitAttr) && (($deviceGroup eq '') || ($targetGroup eq ''))) { + print "Please specify -dev_group and -tgt_group with -list_tinit_attr.\n"; exit 1; } @@ -495,6 +553,21 @@ sub getArgs { exit 1; } + if (defined($setDeviceGroupAttr) && ($attributes eq '')) { + print "Please specify -attributes with -set_dgrp_attr.\n"; + exit 1; + } + + if (defined($setTargetGroupAttr) && (($deviceGroup eq '') || ($attributes eq ''))) { + print "Please specify -dev_group and -attributes with -set_tgrp_attr.\n"; + exit 1; + } + + if (defined($setTargetGroupInitAttr) && (($deviceGroup eq '') || ($targetGroup eq '') || ($attributes eq ''))) { + print "Please specify -dev_group -tgt_group and -attributes with -set_tinit_attr.\n"; + exit 1; + } + if (defined($setDriverAttr) && ($attributes eq '')) { print "Please specify -attributes with -set_drv_attr.\n"; exit 1; @@ -518,7 +591,7 @@ sub getArgs { if (defined($setInitiatorAttr) && (($driver eq '') || ($target eq '') || ($group eq '') || ($attributes eq ''))) { - print "Please specify -driver -target -group and -attributes with -set_ini_attr.\n"; + print "Please specify -driver -target -group and -attributes with -set_init_attr.\n"; exit 1; } @@ -589,8 +662,19 @@ sub getArgs { exit 1; } - if ((defined($addDevGroupDevice) || defined($removeDevGroupDevice)) && ($device eq '')) { - print "Please specify -device with -add_dgrp_dev/-rem_dgrp_dev.\n"; + if ((defined($addDevGroupDevice) || defined($removeDevGroupDevice)) && ($deviceGroup eq '')) { + print "Please specify -dev_group with -add_dgrp_dev/-rem_dgrp_dev.\n"; + exit 1; + } + + if ((defined($addTargetGroup) || defined($removeTargetGroup)) && ($deviceGroup eq '')) { + print "Please specify -dev_group with -add_tgrp/-rem_tgrp.\n"; + exit 1; + } + + if ((defined($addTargetGroupInit) || defined($removeTargetGroupInit)) && + (($deviceGroup eq '') || ($targetGroup eq ''))) { + print "Please specify -dev_group and -tgt_group with -add_tgrp_init/-rem_tgrp_init.\n"; exit 1; } @@ -614,19 +698,22 @@ sub getArgs { return ($applyConfig, $clearConfig, $writeConfig, $checkConfig, $listScstAttr, $listHandler, $listDevice, $listDeviceGroup, $listTargetGroup, $listDriver, $listTarget, $listGroup, - $listSessions, $listHandlerAttr, $listDeviceAttr, $listDriverAttr, $listTargetAttr, $listDevGroupAttr, $listTargetGroupAttr, + $listSessions, $listHandlerAttr, $listDeviceAttr, $listDriverAttr, $listTargetAttr, + $listDeviceGroupAttr, $listTargetGroupAttr, $listTargetGroupInitAttr, $listGroupAttr, $listLunAttr, $listInitiatorAttr, $setScstAttr, $setHandlerAttr, $setDeviceAttr, $setDriverAttr, $setTargetAttr, $setGroupAttr, $setLunAttr, $setInitiatorAttr, + $setDeviceGroupAttr, $setTargetGroupAttr, $setTargetGroupInitAttr, $addDriverAttr, $addTargetAttr, $remDriverAttr, $remTargetAttr, $openDev, $closeDev, $resyncDev, $addDevGroup, $removeDevGroup, $addDevGroupDevice, $removeDevGroupDevice, + $addTargetGroup, $removeTargetGroup, $addTargetGroupInit, $removeTargetGroupInit, $addTarget, $removeTarget, $addGroup, $removeGroup, $addInitiator, $removeInitiator, $moveInitiator, $clearInitiators, $addLun, $removeLun, $replaceLun, $clearLuns, $enableTarget, $disableTarget, $issueLip, $handler, \%_attributes, - $driver, $target, $group, $to, $device, + $driver, $target, $group, $to, $device,, $deviceGroup, $targetGroup, $nonkey, $force); } @@ -640,19 +727,22 @@ sub main { my ($applyConfig, $clearConfig, $writeConfig, $checkConfig, $listScstAttr, $listHandler, $listDevice, $listDeviceGroup, $listTargetGroup, $listDriver, $listTarget, $listGroup, - $listSessions, $listHandlerAttr, $listDeviceAttr, $listDriverAttr, $listTargetAttr, $listDevGroupAttr, $listTargetGroupAttr, + $listSessions, $listHandlerAttr, $listDeviceAttr, $listDriverAttr, $listTargetAttr, + $listDeviceGroupAttr, $listTargetGroupAttr, $listTargetGroupInitAttr, $listGroupAttr, $listLunAttr, $listInitiatorAttr, $setScstAttr, $setHandlerAttr, $setDeviceAttr, $setDriverAttr, $setTargetAttr, $setGroupAttr, $setLunAttr, $setInitiatorAttr, + $setDeviceGroupAttr, $setTargetGroupAttr, $setTargetGroupInitAttr, $addDriverAttr, $addTargetAttr, $remDriverAttr, $remTargetAttr, $openDev, $closeDev, $resyncDev, $addDevGroup, $removeDevGroup, $addDevGroupDevice, $removeDevGroupDevice, + $addTargetGroup, $removeTargetGroup, $addTargetGroupInit, $removeTargetGroupInit, $addTarget, $removeTarget, $addGroup, $removeGroup, $addInitiator, $removeInitiator, $moveInitiator, $clearInitiators, $addLun, $removeLun, $replaceLun, $clearLuns, $enableTarget, $disableTarget, $issueLip, $handler, $attributes, - $driver, $target, $group, $to, $device, + $driver, $target, $group, $to, $device, $deviceGroup, $targetGroup, $nonkey, $force) = getArgs(); $SCST = new SCST::SCST($_DEBUG_); @@ -701,7 +791,7 @@ sub main { $all_good = TRUE; }; defined($listTargetGroup) && do { - $rc = listTargetGroups($listTargetGroup, $target); + $rc = listTargetGroups($deviceGroup, $listTargetGroup); $all_good = TRUE; }; defined($listDriver) && do { @@ -752,12 +842,16 @@ sub main { $rc = listInitiatorAttributes($driver, $target, $group, $listInitiatorAttr, $nonkey); $all_good = TRUE; }; - defined($listDevGroupAttr) && do { - $rc = listDeviceGroupAttributes($listDevGroupAttr, $nonkey); + defined($listDeviceGroupAttr) && do { + $rc = listDeviceGroupAttributes($listDeviceGroupAttr, $nonkey); $all_good = TRUE; }; defined($listTargetGroupAttr) && do { - $rc = listTargetGroupAttributes($listTargetGroupAttr, $target, $nonkey); + $rc = listTargetGroupAttributes($deviceGroup, $listTargetGroupAttr, $nonkey); + $all_good = TRUE; + }; + defined($listTargetGroupInitAttr) && do { + $rc = listTargetGroupInitiatorAttributes($deviceGroup, $targetGroup, $listTargetGroupInitAttr, $nonkey); $all_good = TRUE; }; defined($setScstAttr) && do { @@ -816,6 +910,27 @@ sub main { print "\t-> Done, $changes change(s) made.\n"; last SWITCH; }; + defined($setDeviceGroupAttr) && do { + last if (prompt()); + print "\n-> Making requested changes.\n"; + my $changes = setDeviceGroupAttributes($setDeviceGroupAttr, $attributes, TRUE); + print "\t-> Done, $changes change(s) made.\n"; + last SWITCH; + }; + defined($setTargetGroupAttr) && do { + last if (prompt()); + print "\n-> Making requested changes.\n"; + my $changes = setTargetGroupAttributes($deviceGroup, $setTargetGroupAttr, $attributes, TRUE); + print "\t-> Done, $changes change(s) made.\n"; + last SWITCH; + }; + defined($setTargetGroupInitAttr) && do { + last if (prompt()); + print "\n-> Making requested changes.\n"; + my $changes = setTargetGroupInitiatorAttributes($deviceGroup, $targetGroup, $setTargetGroupInitAttr, $attributes, TRUE); + print "\t-> Done, $changes change(s) made.\n"; + last SWITCH; + }; defined($addDriverAttr) && do { print "\n-> Making requested changes.\n"; $rc = addDriverDynamicAttributes($addDriverAttr, $attributes); @@ -881,13 +996,37 @@ sub main { }; defined($addDevGroupDevice) && do { print "\n-> Making requested changes.\n"; - $rc = addDeviceGroupDevice($addDevGroupDevice, $device); + $rc = addDeviceGroupDevice($deviceGroup, $addDevGroupDevice); print "\t-> Done.\n"; last SWITCH; }; defined($removeDevGroupDevice) && do { print "\n-> Making requested changes.\n"; - $rc = removeDeviceGroupDevice($removeDevGroupDevice, $device, $force); + $rc = removeDeviceGroupDevice($deviceGroup, $removeDevGroupDevice, $force); + print "\t-> Done.\n"; + last SWITCH; + }; + defined($addTargetGroup) && do { + print "\n-> Making requested changes.\n"; + $rc = addTargetGroup($deviceGroup, $addTargetGroup); + print "\t-> Done.\n"; + last SWITCH; + }; + defined($removeTargetGroup) && do { + print "\n-> Making requested changes.\n"; + $rc = removeTargetGroup($deviceGroup, $removeTargetGroup, $force); + print "\t-> Done.\n"; + last SWITCH; + }; + defined($addTargetGroupInit) && do { + print "\n-> Making requested changes.\n"; + $rc = addTargetGroupInitiator($deviceGroup, $targetGroup, $addTargetGroupInit); + print "\t-> Done.\n"; + last SWITCH; + }; + defined($removeTargetGroupInit) && do { + print "\n-> Making requested changes.\n"; + $rc = removeTargetGroupInitiator($deviceGroup, $targetGroup, $removeTargetGroupInit, $force); print "\t-> Done.\n"; last SWITCH; }; @@ -3260,6 +3399,24 @@ sub listTargetGroupAttributes { return listAttributes($attributes, $nonkey); } +sub listTargetGroupInitiatorAttributes { + my $group = shift; + my $tgroup = shift; + my $init = shift; + my $nonkey = shift; + + my $attributes = $SCST->targetGroupInitiatorAttributes($group, $tgroup, $init); + + return TRUE if issueWarning($SCST->errorString()); + + if (!scalar(keys %{$attributes})) { + print "No such device group/target/initiator group '$group/$tgroup/$init' found.\n"; + return; + } + + return listAttributes($attributes, $nonkey); +} + sub listTargetGroupInitiatorAttributes { my $group = shift; my $tgroup = shift; @@ -3491,6 +3648,105 @@ sub setInitiatorAttributes { $_attributes, $error, \&setInitiatorAttribute, $showset); } +sub setDeviceGroupAttributes { + my $group = shift; + my $attributes = shift; + my $showset = shift; + + my $error = "\t-> WARNING: Device Group '$group' lacks the settable attribute '%s', ignoring.\n\n"; + + my $_attributes = $SCST->deviceGroupAttributes($group); + + return TRUE if issueWarning($SCST->errorString()); + + return setAttributes(undef, undef, undef, $group, $attributes, + $_attributes, $error, \&setDeviceGroupAttribute, $showset); +} + +sub setDeviceGroupAttribute { + shift; + shift; + shift; + my $group = shift; + my $attribute = shift; + my $value = shift; + + print "\t-> Setting Device Group attribute '$attribute' to value '$value' for ". + "device group '$group': "; + + my $rc = $SCST->setDeviceGroupAttribute($group, $attribute, $value); + print "done.\n"; + + return $rc; +} + +sub setTargetGroupAttributes { + my $group = shift; + my $tgroup = shift; + my $attributes = shift; + my $showset = shift; + + my $error = "\t-> WARNING: Target Group '$group/$tgroup' lacks the settable attribute '%s', ignoring.\n\n"; + + my $_attributes = $SCST->targetGroupAttributes($group, $tgroup); + + return TRUE if issueWarning($SCST->errorString()); + + return setAttributes(undef, undef, $group, $tgroup, $attributes, + $_attributes, $error, \&setTargetGroupAttribute, $showset); +} + +sub setTargetGroupAttribute { + shift; + shift; + my $group = shift; + my $tgroup = shift; + my $attribute = shift; + my $value = shift; + + print "\t-> Setting Target Group attribute '$attribute' to value '$value' for ". + "target group '$group/$tgroup': "; + + my $rc = $SCST->setTargetGroupAttribute($group, $tgroup, $attribute, $value); + print "done.\n"; + + return $rc; +} + +sub setTargetGroupInitiatorAttributes { + my $group = shift; + my $tgroup = shift; + my $init = shift; + my $attributes = shift; + my $showset = shift; + + my $error = "\t-> WARNING: Initiator '$group/$tgroup/$init' lacks the settable attribute '%s', ignoring.\n\n"; + + my $_attributes = $SCST->targetGroupInitiatorAttributes($group, $tgroup, $init); + + return TRUE if issueWarning($SCST->errorString()); + + return setAttributes(undef, $group, $tgroup, $init, $attributes, + $_attributes, $error, \&setTargetGroupInitiatorAttribute, $showset); +} + +sub setTargetGroupInitiatorAttribute { + shift; + my $group = shift; + my $tgroup = shift; + my $init = shift; + my $attribute = shift; + my $value = shift; + + print "\t-> Setting Initiator attribute '$attribute' to value '$value' for ". + "initiator '$group/$tgroup/$init': "; + + my $rc = $SCST->setTargetGroupInitiatorAttribute($group, $tgroup, $init, $attribute, $value); + print "done.\n"; + + return $rc; +} + # Sets any non-dynamic attributes sub setAttributes { my $level1 = shift; @@ -3965,6 +4221,37 @@ sub addDeviceGroup { return FALSE; } +sub addTargetGroup { + my $group = shift; + my $tgroup = shift; + + print "\t-> Adding new target group '$tgroup' to device group '$group': "; + + my $rc = $SCST->addTargetGroup($group, $tgroup); + + print "done.\n"; + + immediateExit($SCST->errorString($rc)) if ($rc); + + return FALSE; +} + +sub addTargetGroupInitiator { + my $group = shift; + my $tgroup = shift; + my $init = shift; + + print "\t-> Adding new target group/initiator '$tgroup/$init' to device group '$group': "; + + my $rc = $SCST->addTargetGroupInitiator($group, $tgroup, $init); + + print "done.\n"; + + immediateExit($SCST->errorString($rc)) if ($rc); + + return FALSE; +} + sub removeDeviceGroup { my $group = shift; my $force = shift; @@ -3991,6 +4278,49 @@ sub removeDeviceGroup { return FALSE; } +sub removeTargetGroup { + my $group = shift; + my $tgroup = shift; + my $force = shift; + + if (!$force) { + my $inits = $SCST->targetGroupInitiators($group, $tgroup); + + if ($#{$inits} > -1) { + print "\n"; + listTargetGroup($group, $tgroup); + immediateExit("Target group is still in use, aborting. Use -force to override."); + } + } + + print "\t-> Removing target group '$tgroup' from device group '$group': "; + + my $rc = $SCST->removeTargetGroup($group, $tgroup); + + print "done.\n"; + + immediateExit($SCST->errorString($rc)) if ($rc); + + return FALSE; +} + +sub removeTargetGroupInitiator { + my $group = shift; + my $tgroup = shift; + my $init = shift; + my $force = shift; + + print "\t-> Removing target group/initiator '$tgroup/$init' from device group '$group': "; + + my $rc = $SCST->removeTargetGroupInitiator($group, $tgroup, $init); + + print "done.\n"; + + immediateExit($SCST->errorString($rc)) if ($rc); + + return FALSE; +} + sub addDeviceGroupDevice { my $group = shift; my $device = shift;