Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 1 Feb 1997 20:31:30 +0100
From:      j@uriah.heep.sax.de (J Wunsch)
To:        freebsd-scsi@FreeBSD.org (FreeBSD SCSI list)
Cc:        Don.Lewis@tsc.tdk.com (Don Lewis)
Subject:   Re: SCSI disk MEDIUM ERROR with a few twists
Message-ID:  <Mutt.19970201203130.j@uriah.heep.sax.de>
In-Reply-To: <199702011808.NAA16376@hda.hda.com>; from Peter Dufault on Feb 1, 1997 13:08:55 -0500
References:  <199702011537.HAA28985@salsa.gv.tsc.tdk.com> <199702011808.NAA16376@hda.hda.com>

next in thread | previous in thread | raw e-mail | index | archive | help
As Peter Dufault wrote:

> I also put together a defect list dumper for Satoshi when he was
> having some problems, so I'm putting that here too.

Neat!

I've combined both, since this is really easier to handle in Perl.

Maybe we should put this up under tools/?

#!/usr/bin/perl

sub usage
{
    die "usage: defect 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 from 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 from 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);

-- 
cheers, J"org

joerg_wunsch@uriah.heep.sax.de -- http://www.sax.de/~joerg/ -- NIC: JW11-RIPE
Never trust an operating system you don't have sources for. ;-)



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Mutt.19970201203130.j>