129540Ssam #ifndef lint 2*32662Skarels static char sccsid[] = "@(#)verify.c 1.4 (Berkeley/CCI) 11/23/87"; 329540Ssam #endif 429540Ssam 529540Ssam #include "vdfmt.h" 629540Ssam 729981Skarels #define verbose 1 829540Ssam 929540Ssam /* 1029540Ssam ** 1129540Ssam */ 1229540Ssam 1329540Ssam verify() 1429540Ssam { 1529540Ssam extern boolean read_bad_sector_map(); 1629540Ssam 1729540Ssam cur.state = vfy; 1829540Ssam print("Starting verification on "); 1929540Ssam printf("controller %d, drive %d, ", cur.controller, cur.drive); 20*32662Skarels printf("type %s.\n", lab->d_typename); 2129540Ssam 2229540Ssam if(is_formatted() == true) { 2329540Ssam if(read_bad_sector_map() == true) { 24*32662Skarels if(bad_map->bs_id == D_INFO->id) { 2529540Ssam verify_users_data_area(); 26*32662Skarels writelabel(); 2729540Ssam return; 2829540Ssam } 2929540Ssam } 3029540Ssam print("I can't verify drives with old formats.\n"); 3129540Ssam return; 3229540Ssam } 3329540Ssam print("I can't verify unformatted drives.\n"); 3429540Ssam } 3529540Ssam 3629540Ssam 3729540Ssam /* 3829540Ssam ** 3929540Ssam */ 4029540Ssam 4129540Ssam load_verify_patterns() 4229540Ssam { 4329540Ssam register int index; 44*32662Skarels register struct flawpat *fp = (struct flawpat *)lab->d_pat; 4529540Ssam 4629540Ssam /* Init bad block pattern array */ 47*32662Skarels for(index=0; index<MAXTRKSIZ; index++) { 4829540Ssam pattern_0[index] = fp->fp_pat[0]; 4929540Ssam pattern_1[index] = fp->fp_pat[1]; 5029540Ssam pattern_2[index] = fp->fp_pat[2]; 5129540Ssam pattern_3[index] = fp->fp_pat[3]; 5229540Ssam pattern_4[index] = fp->fp_pat[4]; 5329540Ssam pattern_5[index] = fp->fp_pat[5]; 5429540Ssam pattern_6[index] = fp->fp_pat[6]; 5529540Ssam pattern_7[index] = fp->fp_pat[7]; 5629540Ssam pattern_8[index] = fp->fp_pat[8]; 5729540Ssam pattern_9[index] = fp->fp_pat[9]; 5829540Ssam pattern_10[index] = fp->fp_pat[10]; 5929540Ssam pattern_12[index] = fp->fp_pat[12]; 6029540Ssam pattern_13[index] = fp->fp_pat[13]; 6129540Ssam pattern_14[index] = fp->fp_pat[14]; 6229540Ssam pattern_15[index] = fp->fp_pat[15]; 6329540Ssam } 6429540Ssam } 6529540Ssam 6629540Ssam 6729540Ssam /* 6829540Ssam ** 6929540Ssam */ 7029540Ssam 7129540Ssam verify_relocation_area() 7229540Ssam { 7329540Ssam cur.substate = sub_vfy; 74*32662Skarels verify_cylinders((int)lab->d_ncylinders - NUMSYS, NUMREL, 16); 7529540Ssam sync_bad_sector_map(); 7629540Ssam } 7729540Ssam 7829540Ssam 7929540Ssam /* 8029540Ssam ** 8129540Ssam */ 8229540Ssam 8329540Ssam verify_users_data_area() 8429540Ssam { 8529540Ssam int pats = ops_to_do[cur.controller][cur.drive].numpat; 8629540Ssam 8729540Ssam cur.substate = sub_vfy; 88*32662Skarels verify_cylinders(0, (int)lab->d_ncylinders - NUMSYS, pats); 8929540Ssam sync_bad_sector_map(); 9029540Ssam } 9129540Ssam 9229540Ssam 9329540Ssam /* 9429540Ssam ** 9529540Ssam */ 9629540Ssam 97*32662Skarels verify_maintenence_area() 9829540Ssam { 9929540Ssam cur.substate = sub_vfy; 100*32662Skarels verify_cylinders(lab->d_ncylinders - NUMSYS + NUMREL, NUMMNT, 16); 10129540Ssam sync_bad_sector_map(); 10229540Ssam } 10329540Ssam 10429540Ssam 10529540Ssam /* 10629540Ssam ** verify_cylinders does full track certification for every track 10729981Skarels ** on the cylinder. 10829540Ssam */ 10929540Ssam 11029540Ssam verify_cylinders(base_cyl, cyl_count, pats) 11129540Ssam int base_cyl, cyl_count, pats; 11229540Ssam { 11329540Ssam dskadr dskaddr; 11429540Ssam 11529981Skarels if (pats == 0) 11629981Skarels return; 11729540Ssam /* verify each track of each cylinder */ 11829981Skarels for (dskaddr.cylinder = base_cyl; 11929981Skarels dskaddr.cylinder < base_cyl + cyl_count; dskaddr.cylinder++) 120*32662Skarels for (dskaddr.track = 0; dskaddr.track < lab->d_ntracks; 12129540Ssam dskaddr.track++) 12229981Skarels verify_track(&dskaddr, pats, verbose); 12329540Ssam } 12429540Ssam 12529540Ssam 12629540Ssam /* 12729981Skarels ** verify_track verifies a single track. If a full-track write fails, 12829981Skarels ** the sector is flagged; if a full-track read fails, then each sector 12929981Skarels ** is read individually to determine which sectors are really bad. 13029981Skarels ** If a sector is bad it is flagged as bad by flag_sector. 13129540Ssam */ 13229540Ssam 13329540Ssam verify_track(dskaddr, pats, verbosity) 13429540Ssam dskadr *dskaddr; 13529540Ssam int pats; 13629540Ssam int verbosity; 13729540Ssam { 13829540Ssam register int index, i; 13929540Ssam register int count; 14029540Ssam register long before; 14129540Ssam register long *after; 142*32662Skarels register long offset = lab->d_secsize / sizeof(long); 14329540Ssam int pattern_count = pats; 14429981Skarels int sectorflagged = -1; 14529540Ssam 14629981Skarels if (pats == 0) 14729540Ssam return; 14829540Ssam dskaddr->sector = (char)0; 14931318Ssam access_dsk((char *)pattern_address[0], dskaddr, VDOP_WD, 150*32662Skarels lab->d_nsectors, 1); 15129981Skarels for (index = 0; index < pattern_count; index++) { 15229981Skarels if (!data_ok()) { 15329981Skarels if (dcb.operrsta & HEADER_ERROR) { 15429981Skarels 15529981Skarels flag_sector(dskaddr, dcb.operrsta, 15629981Skarels dcb.err_code, verbosity); 15729540Ssam break; 15829540Ssam } 15929981Skarels if (dcb.operrsta & DATA_ERROR) 16029540Ssam pattern_count = 16; 16129540Ssam } 16231318Ssam access_dsk((char *)scratch, dskaddr, VDOP_RD, 163*32662Skarels lab->d_nsectors, 1); 16429981Skarels if (!data_ok()) { 16529981Skarels if (dcb.operrsta & HEADER_ERROR) { 16629981Skarels flag_sector(dskaddr, dcb.operrsta, 16729981Skarels dcb.err_code, verbosity); 16829540Ssam break; 16929540Ssam } 170*32662Skarels for (i = 0; i < lab->d_nsectors; i++) { 17129540Ssam register long *next; 17229540Ssam 17329540Ssam dskaddr->sector = i; 17429540Ssam next = &scratch[i * offset]; 17531318Ssam access_dsk((char *)next, dskaddr, VDOP_RD, 1,1); 17629981Skarels if (!data_ok()) 17729981Skarels flag_sector(dskaddr, dcb.operrsta, 17829981Skarels dcb.err_code, verbosity); 17929540Ssam } 18029540Ssam dskaddr->sector = (char)0; 18129540Ssam } 18229981Skarels if (index+1 < pattern_count) 18329540Ssam access_dsk((char *)pattern_address[index+1], 184*32662Skarels dskaddr, VDOP_WD, lab->d_nsectors, 0); 185*32662Skarels count = lab->d_nsectors * offset; 18629540Ssam before = *pattern_address[index]; 18729540Ssam after = scratch; 18829981Skarels for (i = 0; i < count; i++) { 18929981Skarels if (before != *(after++)) { 19029981Skarels dskaddr->sector = (char)(i / offset); 19129981Skarels if (dskaddr->sector != sectorflagged) 19229981Skarels flag_sector(dskaddr, 0, 0, 19329981Skarels verbosity); 19429981Skarels sectorflagged = dskaddr->sector; 19529540Ssam } 19629540Ssam } 19729981Skarels if (index+1 < pattern_count) { 19829540Ssam poll(60); 19929981Skarels if (vdtimeout <= 0) { 20029540Ssam printf(" while verifing track.\n"); 20129540Ssam _longjmp(abort_environ, 1); 20229540Ssam } 20329540Ssam } 20429981Skarels if (kill_processes == true) { 20529540Ssam sync_bad_sector_map(); 20629540Ssam _longjmp(quit_environ, 1); 20729540Ssam } 20829540Ssam } 209*32662Skarels /* check again in case of header error */ 210*32662Skarels if (kill_processes == true) { 211*32662Skarels sync_bad_sector_map(); 212*32662Skarels _longjmp(quit_environ, 1); 213*32662Skarels } 21429540Ssam } 21529540Ssam 21629540Ssam 21729981Skarels flag_sector(dskaddr, status, ecode, verbosity) 21829540Ssam dskadr *dskaddr; 21929540Ssam long status; 22029981Skarels int ecode; 22129981Skarels int verbosity; 22229540Ssam { 22329540Ssam fmt_err error; 22429540Ssam bs_entry entry; 22529540Ssam 22629540Ssam indent(); 22729981Skarels if (verbosity != 0) { 22829981Skarels print("Error at sector %d (cyl %d trk %d sect %d),\n", 22929981Skarels to_sector(*dskaddr), dskaddr->cylinder, dskaddr->track, 23029981Skarels dskaddr->sector); 23129981Skarels if (status) 23231318Ssam print(" status=%b", status, VDERRBITS); 23329981Skarels else 23429981Skarels printf(" data comparison error"); 235*32662Skarels if (C_INFO->type == VDTYPE_SMDE && ecode) 23629981Skarels printf(", ecode=0x%x", ecode); 23729981Skarels printf(".\n Sector will be relocated.\n"); 23829540Ssam } 23929540Ssam if(is_in_map(dskaddr) == false) { 24029540Ssam error.err_adr = *dskaddr; 24129540Ssam error.err_stat = status; 242*32662Skarels entry = (*C_INFO->code_pos)(error); 24329540Ssam add_flaw(&entry); 24429540Ssam } 24529540Ssam exdent(1); 24629540Ssam } 247