deny allocation of a device which which mounted on the same device as rootfs. also deny the allocation of swap devices. add --allow-mounted flag for overriding this. Signed-off-by: Doron Shoham <dorons at voltaire.com> --- scripts/tgt-admin | 91 +++++++++++++++++++++++++++++++++++++++++++++++++--- 1 files changed, 85 insertions(+), 6 deletions(-) diff --git a/scripts/tgt-admin b/scripts/tgt-admin index 22c4725..6418d56 100755 --- a/scripts/tgt-admin +++ b/scripts/tgt-admin @@ -32,6 +32,8 @@ This tool configures tgt targets. (see "--ready help" for more info) --update <value> update configuration for all or selected targets (see "--update help" for more info) + --allow-mounted allow allocation of the device which rootfs is + mounted on -s, --show show all the targets -c, --conf <conf file> specify an alternative configuration file --ignore-errors continue even if tgtadm exits with non-zero code @@ -60,6 +62,7 @@ my $pretend = 0; my $dump = 0; my $verbose = 0; my $help = 0; +my $allow_mnt = 0; my $result = GetOptions ( "e|execute" => \$execute, "delete=s" => \$delete, @@ -73,6 +76,7 @@ my $result = GetOptions ( "p|pretend" => \$pretend, "dump" => \$dump, "v|verbose" => \$verbose, + "allow-mounted" => \$allow_mnt, "h|help" => \$help, ); @@ -92,6 +96,7 @@ my %tgtadm_output_tid; my %tgtadm_output_name; my @largest_tid; my $next_tid; +my @rootfs_dev; # Look up which targets are configured sub process_targets { @@ -273,13 +278,20 @@ sub process_options { foreach my $backing_store (@value_arr) { # Check if device exists - if ( -e $backing_store) { + if ( ! -e $backing_store) { + print "skipping device $backing_store\n"; + print "$backing_store does not exists - please check the configuration file\n"; + next; + } + + (my $can_alloc, my $dev) = check_device($backing_store); + if ($can_alloc) { execute("tgtadm --lld $driver --op new --mode logicalunit --tid $next_tid --lun $i -b $backing_store"); $i += 1; } else { - print("skipping device $backing_store\n"); - print("$backing_store does not exist - please check the configuration file\n"); + print "skipping device $backing_store\n"; + print "rootfs is mounted on this device: $dev\n"; } } } @@ -298,7 +310,14 @@ sub process_options { my $i = 1; foreach my $direct_store (@value_arr) { # Check if device exists - if ( -e $direct_store) { + if ( ! -e $direct_store) { + print "skipping device $direct_store\n" ; + print "$direct_store does not exists - please check the configuration file\n"; + next; + } + + (my $can_alloc, my $dev) = check_device($direct_store); + if ($can_alloc) { $inq=`sg_inq $direct_store`; if ($inq=~/Vendor identification:\s*(\w+)\s*\n*Product identification:\s*([\w\s\/\-]+)\n\s*\n*Product revision level:\s*(\w*)\s*\n*Unit serial number:\s*(\w+)/) { @@ -317,9 +336,10 @@ sub process_options { $i += 1; } else { - print("skipping device $direct_store\n"); - print("$direct_store does not exist - please check the configuration file\n"); + print "skipping device $direct_store\n"; + print "rootfs is mounted on this device: $dev \n"; } + } } @@ -829,6 +849,65 @@ sub execute { } } +#Check if a device can be allocated +sub check_device { + my $tmp_dev = $_[0]; + + # Check if allow_mnt flag is set + if (!$allow_mnt) { + # Check for rootfs devices + &find_rootfs_device(); + $tmp_dev =~ s/\d//g; + # Check if device is on the same disk as rootfs + if (grep {$_ eq $tmp_dev} @rootfs_dev) { + return (0,$tmp_dev); + } + } + return 1; +} + +# finds all the devices that rootfs is mounted on +sub find_rootfs_device { + my @files=("/etc/mtab","/proc/mounts"); + my @lines; + # read files + foreach my $file (@files){ + if (open(FH,"$file")) { + @lines=(@lines,<FH>); + close (FH); + } + } + + # parse files and finds all the device which mounted on / + foreach my $line (@lines){ + chomp $line; + if (($line=~/^\/dev\//) && ($line=~/ \/ /)){ + my @ln=split(' ',$line); + $ln[0]=~s/\d//g; + push(@rootfs_dev,$ln[0]); + } + } + + # read swap file + my $swap_file="/proc/swap"; + if (open(FH,"$swap_file")) { + @lines=<FH>; + close (FH); + } + # parse swap file and finds all the swap devices + foreach my $line (@lines){ + chomp $line; + if ($line=~/^\/dev\//) { + my @ln=split(' ',$line); + $ln[0]=~s/\d//g; + push(@rootfs_dev,$ln[0]); + } + } + # remove duplicate entries from @rootfs_dev + my %seen = (); + @rootfs_dev = grep { ! $seen{ $_ }++ } @rootfs_dev; +} + if ($execute == 1) { &process_targets; &parse_configs; -- 1.5.3.8 Hi, This is patch checks only /etc/mtab,/proc/mounts and /proc/swap. later we can add more tests. Thanks, Doron -- To unsubscribe from this list: send the line "unsubscribe stgt" in the body of a message to majordomo at vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html |