I tried creating a targets.conf with multiple targets, all with the same outgoing account. Snippet from my targets.conf: <target iqn.1999-07.com.gurulabs:station1> backing-store /srv/iscsi-luns/station1 incominguser station1 letmein outgoinguser server1 itsreallyme </target> <target iqn.1999-07.com.gurulabs:station2> backing-store /srv/iscsi-luns/station2 incominguser station2 letmein outgoinguser server1 itsreallyme </target> <target iqn.1999-07.com.gurulabs:station3> backing-store /srv/iscsi-luns/station3 incominguser station3 letmein outgoinguser server1 itsreallyme </target> The current logic in tgt-admin doesn't having the same account (incoming or outgoing) defined on multiple targets. The current logic always deletes an account before adding which removes the account from any already defined targets. Attached is a tested patch to support the configuration above: --- /usr/sbin/tgt-admin.orig 2010-04-28 12:49:49.000000000 -0600 +++ /usr/sbin/tgt-admin 2010-04-28 13:42:16.000000000 -0600 @@ -92,6 +92,7 @@ my %tgtadm_output_name; my @largest_tid; my $next_tid; +my %existing_accounts; # Look up which targets are configured sub process_targets { @@ -121,6 +122,21 @@ $next_tid = $largest_tid[$#largest_tid]; } +sub process_accounts { + # We need to run as root + if ( $> ) { + die("You must be root to run this program.\n"); + } + + my @show_account = `tgtadm --op show --mode account`; + # Here, we create an array of accounts + foreach my $show_account_line (@show_account) { + if ( $show_account_line =~ m/^\s+(.*?)$/ ) { + $existing_accounts{$1} = 1; + } + } +} + # Parse config file(s) sub parse_configs { # Parse the config @@ -599,8 +615,12 @@ foreach my $incominguser (@value_arr) { my @userpass = split(/ /, $incominguser); check_value($userpass[1]); - execute("tgtadm --lld $driver --mode account --op delete --user=$userpass[0]"); - execute("tgtadm --lld $driver --mode account --op new --user=$userpass[0] --password=$userpass[1]"); + # Only delete or create account if it doesn't already exist + if (! exists $existing_accounts{$userpass[0]} ) { + execute("tgtadm --lld $driver --mode account --op delete --user=$userpass[0]"); + execute("tgtadm --lld $driver --mode account --op new --user=$userpass[0] --password=$userpass[1]"); + $existing_accounts{$userpass[0]} = 1; + } execute("tgtadm --lld $driver --mode account --op bind --tid=$next_tid --user=$userpass[0]"); } } @@ -613,8 +633,12 @@ } my @userpass = split(/ /, @$value[0]); check_value($userpass[1]); - execute("tgtadm --lld $driver --mode account --op delete --user=$userpass[0]"); - execute("tgtadm --lld $driver --mode account --op new --user=$userpass[0] --password=$userpass[1]"); + # Only delete or create account if it doesn't already exist + if (! exists $existing_accounts{$userpass[0]} ) { + execute("tgtadm --lld $driver --mode account --op delete --user=$userpass[0]"); + execute("tgtadm --lld $driver --mode account --op new --user=$userpass[0] --password=$userpass[1]"); + $existing_accounts{$userpass[0]} = 1; + } execute("tgtadm --lld $driver --mode account --op bind --tid=$next_tid --user=$userpass[0] --outgoing"); } @@ -1166,12 +1190,14 @@ if ($execute == 1) { process_targets; + process_accounts; parse_configs; add_targets; remove_targets; } elsif ($delete ne 0) { delete_targets; } elsif ($update ne 0) { + process_accounts; update_targets; } elsif ($dump == 1) { dump_config; -- To unsubscribe from this list: send the line "unsubscribe stgt" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html