From mboxrd@z Thu Jan 1 00:00:00 1970 From: rohara@sourceware.org Date: 14 Dec 2006 21:18:10 -0000 Subject: [Cluster-devel] cluster/fence/agents/scsi fence_scsi.pl Message-ID: <20061214211810.12767.qmail@sourceware.org> List-Id: To: cluster-devel.redhat.com MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit CVSROOT: /cvs/cluster Module name: cluster Branch: RHEL5 Changes by: rohara at sourceware.org 2006-12-14 21:18:09 Modified files: fence/agents/scsi: fence_scsi.pl Log message: Attempt to register the node in the case where it must perform fence_scsi fencing but is not registered with the device(s) that must be fence. With SCSI persistent reservations, in order to do a "preempt and abort" (which we are using to fence a node), the node doing this operation must be registered with the device. This fix will check to see the the node that is performing the fencing is registered with the device(s). If it is not, then it attempts to register with the device(s) so that it can then continue with the fence operation normally. Note that this situation should never happen, especially if things are configured properly. Patches: http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/fence/agents/scsi/fence_scsi.pl.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.5.2.3&r2=1.5.2.4 --- cluster/fence/agents/scsi/fence_scsi.pl 2006/12/12 22:22:51 1.5.2.3 +++ cluster/fence/agents/scsi/fence_scsi.pl 2006/12/14 21:18:09 1.5.2.4 @@ -156,6 +156,38 @@ } } +sub get_key_list +{ + ($dev) = @_; + + my ($in, $out, $err); + my $cmd = "sg_persist -d $dev -i -k"; + my $pid = open3($in, $out, $err, $cmd) or die "$!\n"; + + waitpid($pid, 0); + + die "Unable to execute sg_persist.\n" if ($?>>8); + + while (<$out>) + { + chomp; + if ($_ =~ /^\s*0x/) + { + s/^\s+0x//; + s/\s+$//; + + my $key = sprintf("%8.8x", hex($_)); + $key_list{$key} = 1; + } + } + + close($in); + close($out); + close($err); + + return %key_list; +} + #sub get_scsi_devices #{ # my ($in, $out, $err); @@ -176,7 +208,7 @@ # if ($vg_attrs =~ /.*c$/) # { # $device =~ s/\(.*\)//; -# push @volumes, $device; +# push(@volumes, $device); # } # } # @@ -219,6 +251,29 @@ close($err); } +sub do_register +{ + ($dev, $key) = @_; + + my ($in, $out, $err); + my $cmd = "sg_persist -d $dev -o -G -S $key"; + my $pid = open3($in, $out, $err, $cmd) or die "$!\n"; + + waitpid($pid, 0); + + die "Unable to execute sg_persist.\n" if ($?>>8); + + while (<$out>) + { + chomp; + print "OUT: $_\n" if $opt_v; + } + + close($in); + close($out); + close($err); +} + sub fence_node { my $host_name = get_host_name(); @@ -226,12 +281,18 @@ my $host_key = get_key($host_name); my $node_key = get_key($node_name); - - my $cmd; + my ($in, $out, $err); foreach $dev (@volumes) { + my %key_list = get_key_list($dev); + + if (!$key_list{$host_key}) + { + do_register($dev, $host_key); + } + if ($host_key eq $node_key) { $cmd = "sg_persist -d $dev -o -G -K $host_key -S 0";