diff options
author | rgrimes <rgrimes@FreeBSD.org> | 1995-05-14 07:05:47 +0000 |
---|---|---|
committer | rgrimes <rgrimes@FreeBSD.org> | 1995-05-14 07:05:47 +0000 |
commit | 08e7f4be2f5c38b3ff12e69099c2b8067c5e3f6e (patch) | |
tree | 8d25761839ecf341eb8d5622e668bb459fae1e9c /usr.sbin/bad144 | |
parent | d8f95d425228ddc1787fc50431bffd26c6b4a884 (diff) | |
download | FreeBSD-src-08e7f4be2f5c38b3ff12e69099c2b8067c5e3f6e.zip FreeBSD-src-08e7f4be2f5c38b3ff12e69099c2b8067c5e3f6e.tar.gz |
Add bad144 -s option to scan entire slice of disk.
Obtained from: FreeBSD 1.1.5.1 (Just the scan function itself was added)
Diffstat (limited to 'usr.sbin/bad144')
-rw-r--r-- | usr.sbin/bad144/bad144.8 | 8 | ||||
-rw-r--r-- | usr.sbin/bad144/bad144.c | 102 |
2 files changed, 106 insertions, 4 deletions
diff --git a/usr.sbin/bad144/bad144.8 b/usr.sbin/bad144/bad144.8 index e3843de..97fc951 100644 --- a/usr.sbin/bad144/bad144.8 +++ b/usr.sbin/bad144/bad144.8 @@ -31,7 +31,7 @@ .\" .\" @(#)bad144.8 8.1 (Berkeley) 6/6/93 .\" -.Dd June 6, 1993 +.Dd May 13, 1995 .Dt BAD144 8 .Os BSD 4 .Sh NAME @@ -54,6 +54,10 @@ .Op Fl v .Ar disk .Op Ar bad ... +.Nm bad144 +.Op Fl s +.Op Fl v +.Ar disk .Sh DESCRIPTION .Nm Bad144 can be used to inspect the information stored on a disk that is used by @@ -86,6 +90,8 @@ the sectors have already been marked bad, or the system will not be notified that it should use the replacement sector. This option may be used while running multiuser; it is no longer necessary to perform format operations while running single-user. +.It Fl s +The entire disk is scanned for bad blocks. .It Fl v The entire process is described as it happens in gory detail if .Fl v diff --git a/usr.sbin/bad144/bad144.c b/usr.sbin/bad144/bad144.c index a36e236..7902cb3 100644 --- a/usr.sbin/bad144/bad144.c +++ b/usr.sbin/bad144/bad144.c @@ -71,13 +71,14 @@ static const char sccsid[] = "@(#)bad144.c 8.1 (Berkeley) 6/6/93"; #define RETRIES 10 /* number of retries on reading old sectors */ -int fflag, add, copy, verbose, nflag; +int fflag, add, copy, verbose, nflag, sflag; int dups; int badfile = -1; /* copy of badsector table to use, -1 if any */ #define MAXSECSIZE 1024 struct dkbad curbad, oldbad; #define DKBAD_MAGIC 0x4321 +char *buf; char label[BBSIZE]; daddr_t size; struct disklabel *dp; @@ -103,6 +104,7 @@ main(argc, argv) register struct bt_bad *bt; daddr_t sn, bn[DKBAD_MAXBAD]; int i, f, nbad, new, bad, errs; + daddr_t bstart, bend; argc--, argv++; while (argc > 0 && **argv == '-') { @@ -127,6 +129,9 @@ main(argc, argv) nflag++; verbose++; break; + case 's': /* scan partition */ + sflag++; + break; default: if (**argv >= '0' && **argv <= '4') { badfile = **argv - '0'; @@ -146,10 +151,12 @@ usage: "to read or overwrite bad-sector table, e.g.: bad144 hp0\n"); fprintf(stderr, "or bad144 -a [ -f ] [ -c ] disk bn ...\n"); + fprintf(stderr, "or bad144 -s [ -v ] disk\n"); fprintf(stderr, "where options are:\n"); fprintf(stderr, "\t-a add new bad sectors to the table\n"); fprintf(stderr, "\t-f reformat listed sectors as bad\n"); fprintf(stderr, "\t-c copy original sector to replacement\n"); + fprintf(stderr, "\t-s scan entire slice for bad sectors\n"); exit(1); } if (argv[0][0] != '/') @@ -178,6 +185,97 @@ usage: exit(7); } size = dp->d_secperunit; + + /* + * bstart is 0 since we should always be doing partition c of a slice + * bend is the size of the slice, less the bad block map track + * and the DKBAD_MAXBAD replacement blocks + */ + bstart = 0; + bend = size - (dp->d_nsectors + DKBAD_MAXBAD); + + if (verbose) { + printf("cyl: %ld, tracks: %ld, secs: %ld, " + "sec/cyl: %ld, start: %ld, end: %ld\n", + dp->d_ncylinders, dp->d_ntracks, dp->d_nsectors, + dp->d_secpercyl, bstart, bend); + } + + if (sflag) { /* search for bad sectors */ + int curr_sec, tries, n; + int spc = dp->d_secpercyl; + int ss = dp->d_secsize; + int trk = dp->d_nsectors; + int step; + + setbuf(stdout, NULL); + + if (buf == (char *)NULL) { + buf = malloc((unsigned)(trk*ss)); + if (buf == (char *)NULL) { + fprintf(stderr, "Out of memory\n"); + exit(20); + } + } + + printf("Starting scan of %s at cylinder %ld\n", + name, bstart/spc); + step = trk; + for (curr_sec = bstart; curr_sec < bend; curr_sec += step) { + int gotone = 0; + + if (verbose) { + if ((curr_sec % spc) == 0) + printf("\r%4d(%7d)", + curr_sec/spc, curr_sec); + } + for (tries = 0; tries < RETRIES; tries++) { + if (lseek(f, curr_sec * ss, L_SET) < 0) { + fprintf(stderr, + "\nbad144: can't seek sector, %d\n", + curr_sec); + gotone = 1; + } else + break; + } + if (gotone) { + fprintf(stderr, + "\nbad144: bad sector (seek), %d\n", + curr_sec); + step = 1; + continue; + } + if (step == trk) { + if ((n = read(f, buf, (ss*trk))) == (ss*trk)) { + continue; + } + } + /* switch to single sector reads */ + lseek(f, curr_sec * ss, L_SET); + step = 1; + for (tries = 0; tries < RETRIES; tries++) { + if ((n = read(f, buf, ss)) != ss) { + fprintf(stderr, + "\nbad144: can't read sector, + %d\n", curr_sec); + gotone = 1; + lseek(f, curr_sec * ss, L_SET); + } else { + if ((curr_sec % trk) == 0) { + step = trk; + } + break; + } + } + if (gotone) { + fprintf(stderr, + "\nbad144: bad sector (read), %d\n", + curr_sec); + continue; + } + } + } + argc--; argv++; if (argc == 0) { @@ -451,8 +549,6 @@ shift(f, new, old) } } -char *buf; - /* * Copy disk sector s1 to s2. */ |