summaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorjoerg <joerg@FreeBSD.org>1997-02-02 11:39:51 +0000
committerjoerg <joerg@FreeBSD.org>1997-02-02 11:39:51 +0000
commit83fd3890e2944564d8e6eb55d99f243f36258026 (patch)
treef656c20da58530f9d51dee14c7b21344bfa65ad1 /tools
parentc83689767299dca540ff66826d2f54bbb73800ac (diff)
downloadFreeBSD-src-83fd3890e2944564d8e6eb55d99f243f36258026.zip
FreeBSD-src-83fd3890e2944564d8e6eb55d99f243f36258026.tar.gz
Add a tools to get at the primary or grown defect list of a SCSI disk.
Submitted by: dufault
Diffstat (limited to 'tools')
-rw-r--r--tools/tools/README1
-rw-r--r--tools/tools/scsi-defects/README3
-rwxr-xr-xtools/tools/scsi-defects/scsi-defects.pl94
3 files changed, 98 insertions, 0 deletions
diff --git a/tools/tools/README b/tools/tools/README
index fc13044..b965459 100644
--- a/tools/tools/README
+++ b/tools/tools/README
@@ -14,3 +14,4 @@ epfe extract printing filter examples from printing.sgml
tcl_bmake generates a bmake Makefile for src/lib/libtcl
kdrv KernelDriver; add/list/remove third-party kernel driver
source to/in/from a kernel source tree.
+scsi-defects Get at the primary or grown defect list of a SCSI disk.
diff --git a/tools/tools/scsi-defects/README b/tools/tools/scsi-defects/README
new file mode 100644
index 0000000..5e0a616
--- /dev/null
+++ b/tools/tools/scsi-defects/README
@@ -0,0 +1,3 @@
+Peter Dufault's tools to extract the primary or grown defect list from
+a SCSI disk, wrapped into Perl (for easier decoding of the list) by
+Joerg Wunsch.
diff --git a/tools/tools/scsi-defects/scsi-defects.pl b/tools/tools/scsi-defects/scsi-defects.pl
new file mode 100755
index 0000000..0827182
--- /dev/null
+++ b/tools/tools/scsi-defects/scsi-defects.pl
@@ -0,0 +1,94 @@
+#!/usr/bin/perl
+#
+# Copyright (C) 1997
+# Peter Dufault, Joerg Wunsch. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+#
+
+#
+# Read and decode a SCSI disk's primary or grown defect list.
+#
+
+sub usage
+{
+ die "usage: scsi-defects raw-device-name [Glist|Plist]\n";
+}
+
+
+#
+# Main
+#
+
+&usage if $#ARGV < 0 || $#ARGV > 1;
+
+$ENV{'PATH'} = "/bin:/usr/bin:/sbin:/usr/sbin";
+
+$dev = $ARGV[0];
+
+# generic device name given?
+if ($dev =~ /^[so]d\d+$/) { $dev = "/dev/r${dev}.ctl"; }
+
+#
+# Select what you want to read. PList include the primary defect list
+# from the factory. GList is grown defects only.
+#
+if ($#ARGV > 0) {
+ if ($ARGV[1] =~ /^[Gg]/) { $glist = 1; $plist = 0; }
+ elsif ($ARGV[1] =~ /^[Pp]/) { $glist = 0; $plist = 1; }
+ else { &usage; }
+} else {
+ $glist = 1; $plist = 0;
+}
+
+open(PIPE, "scsi -f $dev " .
+ "-c '{ Op code} 37 0 0:3 v:1 v:1 5:3 0 0 0 0 4:i2 0' $plist $glist " .
+ "-i 4 '{ stuff } *i2 { Defect list length } i2' |") ||
+ die "Cannot pipe to scsi(8)\n";
+chop($amnt = <PIPE>);
+close(PIPE);
+
+if ($amnt == 0) {
+ print "There are no defects (in this list).\n";
+ exit 0;
+}
+
+print "There are " . $amnt / 8 . " defects in this list.\n";
+
+$amnt += 4;
+
+open(PIPE, "scsi -f $dev " .
+ "-c '{ Op code} 37 0 0:3 v:1 v:1 5:3 0 0 0 0 v:i2 0' $plist $glist " .
+ "$amnt -i $amnt - |") ||
+ die "Cannot pipe to scsi(8)\n";
+
+read(PIPE, $buf, 4); # defect list header
+
+print "cylinder head sector\n";
+
+while(read(PIPE, $buf, 8)) {
+ ($cylhi, $cyllo, $head, $sec) = unpack("CnCN", $buf);
+ printf "%8u %4u %6u\n", $cylhi*65536+$cyllo, $head, $sec;
+}
+close(PIPE);
OpenPOWER on IntegriCloud