static char sccsid
[] = "@(#)verify.c 1.5 (Berkeley/CCI) 6/7/88";
extern boolean
read_bad_sector_map();
print("Starting verification on ");
printf("controller %d, drive %d, ", cur
.controller
, cur
.drive
);
printf("type %s.\n", lab
->d_typename
);
if(is_formatted() == true) {
if(read_bad_sector_map() == true) {
if(bad_map
->bs_id
== D_INFO
->id
) {
verify_users_data_area();
print("I can't verify drives with old formats.\n");
print("I can't verify unformatted drives.\n");
register struct flawpat
*fp
= (struct flawpat
*)lab
->d_pat
;
/* Init bad block pattern array */
for(index
=0; index
<MAXTRKSIZ
; index
++) {
pattern_0
[index
] = fp
->fp_pat
[0];
pattern_1
[index
] = fp
->fp_pat
[1];
pattern_2
[index
] = fp
->fp_pat
[2];
pattern_3
[index
] = fp
->fp_pat
[3];
pattern_4
[index
] = fp
->fp_pat
[4];
pattern_5
[index
] = fp
->fp_pat
[5];
pattern_6
[index
] = fp
->fp_pat
[6];
pattern_7
[index
] = fp
->fp_pat
[7];
pattern_8
[index
] = fp
->fp_pat
[8];
pattern_9
[index
] = fp
->fp_pat
[9];
pattern_10
[index
] = fp
->fp_pat
[10];
pattern_12
[index
] = fp
->fp_pat
[12];
pattern_13
[index
] = fp
->fp_pat
[13];
pattern_14
[index
] = fp
->fp_pat
[14];
pattern_15
[index
] = fp
->fp_pat
[15];
verify_cylinders((int)lab
->d_ncylinders
- NUMSYS
, NUMREL
, 16);
int pats
= ops_to_do
[cur
.controller
][cur
.drive
].numpat
;
verify_cylinders(0, (int)lab
->d_ncylinders
- NUMSYS
, pats
);
verify_maintenence_area()
verify_cylinders(lab
->d_ncylinders
- NUMSYS
+ NUMREL
, NUMMNT
, 16);
** verify_cylinders does full track certification for every track
verify_cylinders(base_cyl
, cyl_count
, pats
)
int base_cyl
, cyl_count
, pats
;
/* verify each track of each cylinder */
for (dskaddr
.cylinder
= base_cyl
;
dskaddr
.cylinder
< base_cyl
+ cyl_count
; dskaddr
.cylinder
++)
for (dskaddr
.track
= 0; dskaddr
.track
< lab
->d_ntracks
;
verify_track(&dskaddr
, pats
, verbose
);
** verify_track verifies a single track. If a full-track write fails,
** the sector is flagged; if a full-track read fails, then each sector
** is read individually to determine which sectors are really bad.
** If a sector is bad it is flagged as bad by flag_sector.
verify_track(dskaddr
, pats
, verbosity
)
register long offset
= lab
->d_secsize
/ sizeof(long);
int pattern_count
= pats
;
dskaddr
->sector
= (char)0;
access_dsk((char *)pattern_address
[0], dskaddr
, VDOP_WD
,
for (index
= 0; index
< pattern_count
; index
++) {
if (dcb
.operrsta
& HEADER_ERROR
&&
C_INFO
->type
== VDTYPE_SMDE
) {
flag_sector(dskaddr
, dcb
.operrsta
,
dcb
.err_code
, "write", verbosity
);
* we presume that write errors will be detected
* on read or data compare,
* don't bother with extra testing.
if (dcb
.operrsta
& DATA_ERROR
)
* Write track a sector at a time,
* so that a write aborted on one sector
* doesn't cause compare errors on all
* subsequent sectors on the track.
for (i
= 0; i
< lab
->d_nsectors
; i
++) {
access_dsk((char *)pattern_address
[index
],
dskaddr
->sector
= (char)0;
access_dsk((char *)scratch
, dskaddr
, VDOP_RD
,
if (dcb
.operrsta
& HEADER_ERROR
) {
flag_sector(dskaddr
, dcb
.operrsta
,
dcb
.err_code
, "read", verbosity
);
for (i
= 0; i
< lab
->d_nsectors
; i
++) {
access_dsk((char *)&scratch
[i
* offset
],
flag_sector(dskaddr
, dcb
.operrsta
,
dcb
.err_code
, "read", verbosity
);
dskaddr
->sector
= (char)0;
if (index
+1 < pattern_count
)
access_dsk((char *)pattern_address
[index
+1],
dskaddr
, VDOP_WD
, lab
->d_nsectors
, 0);
count
= lab
->d_nsectors
* offset
;
before
= *pattern_address
[index
];
for (i
= 0; i
< count
; ) {
if (before
!= *(after
++)) {
dskaddr
->sector
= (char)(i
/ offset
);
flag_sector(dskaddr
, 0, 0,
"data compare", verbosity
);
i
= (dskaddr
->sector
+ 1) * offset
;
if (index
+1 < pattern_count
) {
printf(" while writing track.\n");
_longjmp(abort_environ
, 1);
if (kill_processes
== true) {
_longjmp(quit_environ
, 1);
/* check again in case of header error */
if (kill_processes
== true) {
_longjmp(quit_environ
, 1);
flag_sector(dskaddr
, status
, ecode
, func
, verbosity
)
error
.err_adr
= *dskaddr
;
(*C_INFO
->code_pos
)(&error
, &entry
);
result
= add_flaw(&entry
);
if (verbosity
!= 0 && result
!= 0) {
print("%s error at sector %d (cyl %d trk %d sect %d)",
func
, to_sector(*dskaddr
), dskaddr
->cylinder
,
dskaddr
->track
, dskaddr
->sector
);
print(" status=%b", status
, VDERRBITS
);
if (C_INFO
->type
== VDTYPE_SMDE
&& ecode
)
printf(", ecode=0x%x", ecode
);
print("%s will be relocated.\n",
(status
& HEADER_ERROR
&&
C_INFO
->type
== VDTYPE_SMDE
) ? "Track" : "Sector");
print("Sector cannot be relocated.\n");