|
|
1.1 ! root 1: #include "vdfmt.h" ! 2: ! 3: #define quiet 0 ! 4: ! 5: /* ! 6: ** ! 7: */ ! 8: ! 9: verify() ! 10: { ! 11: extern boolean read_bad_sector_map(); ! 12: ! 13: cur.state = vfy; ! 14: print("Starting verification on "); ! 15: printf("controller %d, drive %d, ", cur.controller, cur.drive); ! 16: printf("type %s.\n",CURRENT->type_name); ! 17: ! 18: if(is_formatted() == true) { ! 19: if(read_bad_sector_map() == true) { ! 20: if(bad_map->bs_id == D_INFO.id) { ! 21: verify_users_data_area(); ! 22: return; ! 23: } ! 24: } ! 25: print("I can't verify drives with old formats.\n"); ! 26: return; ! 27: } ! 28: print("I can't verify unformatted drives.\n"); ! 29: } ! 30: ! 31: ! 32: /* ! 33: ** ! 34: */ ! 35: ! 36: load_verify_patterns() ! 37: { ! 38: register int index; ! 39: ! 40: /* Init bad block pattern array */ ! 41: for(index=0; index<TRKSIZ; index++) { ! 42: pattern_0[index] = CURRENT->fmt_pat[0]; ! 43: pattern_1[index] = CURRENT->fmt_pat[1]; ! 44: pattern_2[index] = CURRENT->fmt_pat[2]; ! 45: pattern_3[index] = CURRENT->fmt_pat[3]; ! 46: pattern_4[index] = CURRENT->fmt_pat[4]; ! 47: pattern_5[index] = CURRENT->fmt_pat[5]; ! 48: pattern_6[index] = CURRENT->fmt_pat[6]; ! 49: pattern_7[index] = CURRENT->fmt_pat[7]; ! 50: pattern_8[index] = CURRENT->fmt_pat[8]; ! 51: pattern_9[index] = CURRENT->fmt_pat[9]; ! 52: pattern_10[index] = CURRENT->fmt_pat[10]; ! 53: pattern_11[index] = CURRENT->fmt_pat[11]; ! 54: pattern_12[index] = CURRENT->fmt_pat[12]; ! 55: pattern_13[index] = CURRENT->fmt_pat[13]; ! 56: pattern_14[index] = CURRENT->fmt_pat[14]; ! 57: pattern_15[index] = CURRENT->fmt_pat[15]; ! 58: } ! 59: } ! 60: ! 61: ! 62: /* ! 63: ** ! 64: */ ! 65: ! 66: verify_relocation_area() ! 67: { ! 68: cur.substate = sub_vfy; ! 69: verify_cylinders((int)CURRENT->ncyl - NUMSYS, NUMREL, 16); ! 70: sync_bad_sector_map(); ! 71: } ! 72: ! 73: ! 74: /* ! 75: ** ! 76: */ ! 77: ! 78: verify_users_data_area() ! 79: { ! 80: int pats = ops_to_do[cur.controller][cur.drive].numpat; ! 81: ! 82: cur.substate = sub_vfy; ! 83: verify_cylinders(0, (int)CURRENT->ncyl - NUMSYS, pats); ! 84: sync_bad_sector_map(); ! 85: } ! 86: ! 87: ! 88: /* ! 89: ** ! 90: */ ! 91: ! 92: verify_maintainence_area() ! 93: { ! 94: cur.substate = sub_vfy; ! 95: verify_cylinders(CURRENT->ncyl - NUMSYS + NUMREL, NUMMNT, 16); ! 96: sync_bad_sector_map(); ! 97: } ! 98: ! 99: ! 100: /* ! 101: ** verify_cylinders does full track certification for every track ! 102: ** on the cylinder. This is done for speed and minimal head movement. If ! 103: ** an error occurs on any single track the track is flagged for later ! 104: ** verification by verify sectors. ! 105: */ ! 106: ! 107: verify_cylinders(base_cyl, cyl_count, pats) ! 108: int base_cyl, cyl_count, pats; ! 109: { ! 110: dskadr dskaddr; ! 111: ! 112: /* verify each track of each cylinder */ ! 113: for (dskaddr.cylinder=base_cyl; dskaddr.cylinder<(base_cyl+cyl_count); ! 114: dskaddr.cylinder++) ! 115: for (dskaddr.track=0; dskaddr.track<CURRENT->ntrak; ! 116: dskaddr.track++) ! 117: verify_track(&dskaddr, pats, quiet); ! 118: } ! 119: ! 120: ! 121: /* ! 122: ** verify_track verifies a single track. If the full track write and ! 123: ** compare operation fails then each sector is read individually to determin ! 124: ** which sectors are really bad. If a sector is bad it is flagged as bad by ! 125: ** the verify sector routine. ! 126: */ ! 127: ! 128: verify_track(dskaddr, pats, verbosity) ! 129: dskadr *dskaddr; ! 130: int pats; ! 131: int verbosity; ! 132: { ! 133: register int index, i; ! 134: register int count; ! 135: register long before; ! 136: register long *after; ! 137: register long offset = CURRENT->secsize / sizeof(long); ! 138: int pattern_count = pats; ! 139: ! 140: if(pats == 0) ! 141: return; ! 142: dskaddr->sector = (char)0; ! 143: access_dsk((char *)pattern_address[0], dskaddr, WD, CURRENT->nsec, 1); ! 144: for(index = 0; index < pattern_count; index++) { ! 145: if(!data_ok()) { ! 146: if(dcb.operrsta & HEADER_ERROR) { ! 147: flag_sector(dskaddr, dcb.operrsta, verbosity); ! 148: break; ! 149: } ! 150: if(dcb.operrsta & DATA_ERROR) ! 151: pattern_count = 16; ! 152: } ! 153: access_dsk((char *)scratch,dskaddr,RD,CURRENT->nsec,1); ! 154: if(!data_ok()) { ! 155: if(dcb.operrsta & HEADER_ERROR) { ! 156: flag_sector(dskaddr, dcb.operrsta, verbosity); ! 157: break; ! 158: } ! 159: pattern_count = 16; ! 160: for(i = 0; i < CURRENT->nsec; i++) { ! 161: register long *next; ! 162: ! 163: dskaddr->sector = i; ! 164: next = &scratch[i * offset]; ! 165: access_dsk((char *)next,dskaddr,RD,1,1); ! 166: if(!data_ok()) { ! 167: flag_sector(dskaddr, ! 168: dcb.operrsta,verbosity); ! 169: } ! 170: } ! 171: dskaddr->sector = (char)0; ! 172: } ! 173: if(index+1 < pattern_count) ! 174: access_dsk((char *)pattern_address[index+1], ! 175: dskaddr, WD, CURRENT->nsec, 0); ! 176: count = CURRENT->nsec * offset; ! 177: before = *pattern_address[index]; ! 178: after = scratch; ! 179: for(i=0; i<count; i++) { ! 180: if(before != *(after++)) { ! 181: dskaddr->sector = i / offset; ! 182: flag_sector(dskaddr, DATA_ERROR, verbosity); ! 183: } ! 184: } ! 185: if(index+1 <= pattern_count) { ! 186: poll(60); ! 187: if(vdtimeout <= 0) { ! 188: printf(" while verifing track.\n"); ! 189: _longjmp(abort_environ, 1); ! 190: } ! 191: } ! 192: if(kill_processes == true) { ! 193: sync_bad_sector_map(); ! 194: _longjmp(quit_environ, 1); ! 195: } ! 196: } ! 197: } ! 198: ! 199: ! 200: flag_sector(dskaddr, status, verbose) ! 201: dskadr *dskaddr; ! 202: long status; ! 203: int verbose; ! 204: { ! 205: fmt_err error; ! 206: bs_entry entry; ! 207: ! 208: indent(); ! 209: if(verbose) { ! 210: print("Error at sector %d, status=0x%x.", ! 211: to_sector(*dskaddr), status); ! 212: printf(" Sector will be relocated.\n"); ! 213: } ! 214: if(is_in_map(dskaddr) == false) { ! 215: error.err_adr = *dskaddr; ! 216: error.err_stat = status; ! 217: entry = (*C_INFO.code_pos)(error); ! 218: add_flaw(&entry); ! 219: } ! 220: exdent(1); ! 221: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.