|
|
1.1 ! root 1: #include "vdfmt.h" ! 2: ! 3: /* ! 4: ** ! 5: */ ! 6: ! 7: format() ! 8: { ! 9: boolean read_bad_sector_map(); ! 10: cur.state = fmt; ! 11: print("Starting format on "); ! 12: printf("controller %d, drive %d, ", cur.controller, cur.drive); ! 13: printf("type %s.\n",CURRENT->type_name); ! 14: ! 15: /* Read the flaw map from the disk (where ever it may be) */ ! 16: if(read_bad_sector_map() == true) { ! 17: if(bad_map->bs_id != D_INFO.id) { ! 18: print("Module serial numbers do not match!\n"); ! 19: print("Use `info' to find the real serial number.\n"); ! 20: _longjmp(abort_environ, 1); ! 21: } ! 22: } ! 23: else ! 24: bad_map->bs_id = D_INFO.id; ! 25: ! 26: /* Re-Initialize bad sector map relocation pointers */ ! 27: zero_bad_sector_map(); ! 28: write_bad_sector_map(); ! 29: if(kill_processes == true) ! 30: _longjmp(quit_environ, 1); ! 31: ! 32: /* format the disk surface */ ! 33: format_relocation_area(); ! 34: format_maintainence_area(); ! 35: format_users_data_area(); ! 36: if(kill_processes == true) ! 37: _longjmp(quit_environ, 1); ! 38: ! 39: ! 40: /* verify the surface */ ! 41: verify_relocation_area(); ! 42: verify_maintainence_area(); ! 43: verify_users_data_area(); ! 44: } ! 45: ! 46: ! 47: /* ! 48: ** ! 49: */ ! 50: ! 51: format_relocation_area() ! 52: { ! 53: register long sector_count; ! 54: dskadr dskaddr; ! 55: ! 56: cur.substate = sub_fmt; ! 57: dskaddr.cylinder = (short)(CURRENT->ncyl - NUMSYS); ! 58: dskaddr.track = (char)0; ! 59: dskaddr.sector = (char)0; ! 60: sector_count = (long)(NUMREL * CURRENT->ntrak * CURRENT->nsec); ! 61: format_sectors(&dskaddr, &dskaddr, NRM, sector_count); ! 62: } ! 63: ! 64: ! 65: /* ! 66: ** ! 67: */ ! 68: ! 69: format_users_data_area() ! 70: { ! 71: register long sector_count; ! 72: dskadr dskaddr; ! 73: register int cyl; ! 74: ! 75: cur.substate = sub_fmt; ! 76: sector_count = (long)(CURRENT->ntrak * CURRENT->nsec); ! 77: dskaddr.track = (char)0; ! 78: dskaddr.sector = (char)0; ! 79: for(cyl=0; cyl < (CURRENT->ncyl - NUMSYS); cyl++) { ! 80: dskaddr.cylinder = cyl; ! 81: format_sectors(&dskaddr, &dskaddr, NRM, sector_count); ! 82: } ! 83: } ! 84: ! 85: ! 86: /* ! 87: ** ! 88: */ ! 89: ! 90: format_maintainence_area() ! 91: { ! 92: register long sector_count; ! 93: dskadr dskaddr; ! 94: ! 95: cur.substate = sub_fmt; ! 96: dskaddr.cylinder = (short)(CURRENT->ncyl - NUMMNT - NUMMAP); ! 97: dskaddr.track = (char)0; ! 98: dskaddr.sector = (char)0; ! 99: sector_count = (long)(NUMMNT * CURRENT->ntrak * CURRENT->nsec); ! 100: format_sectors(&dskaddr, &dskaddr, NRM, sector_count); ! 101: } ! 102: ! 103: ! 104: /* ! 105: ** ! 106: */ ! 107: ! 108: boolean is_formatted() ! 109: { ! 110: extern boolean align_buf(); ! 111: dskadr dskaddr; ! 112: ! 113: dskaddr.cylinder = 0; ! 114: dskaddr.track = 0; ! 115: dskaddr.sector = 0; ! 116: if(C_INFO.type == SMD_ECTLR) { ! 117: access_dsk((char *)save, &dskaddr, RD_RAW, 1, 1); ! 118: if(align_buf((unsigned long *)save, CDCSYNC) == false) ! 119: return true; ! 120: return false; ! 121: } ! 122: else if(access_dsk((char *)save, &dskaddr, RD, 1, 1) & HEADER_ERROR) ! 123: return false; ! 124: return true; ! 125: } ! 126: ! 127: ! 128: /* ! 129: ** Vdformat_sectors is used to do the actual formatting of a block. ! 130: */ ! 131: ! 132: format_sectors(dskaddr, hdraddr, flags, count) ! 133: dskadr *dskaddr, *hdraddr; ! 134: short flags; ! 135: long count; ! 136: { ! 137: cur.daddr.cylinder = dskaddr->cylinder & 0xfff; ! 138: cur.daddr.track = dskaddr->track; ! 139: dcb.opcode = FSECT; /* format sector command */ ! 140: dcb.intflg = NOINT; ! 141: dcb.nxtdcb = (fmt_dcb *)0; /* end of chain */ ! 142: dcb.operrsta = 0; ! 143: dcb.devselect = (char)cur.drive; ! 144: dcb.trailcnt = (char)(sizeof(trfmt) / sizeof(long)); ! 145: dcb.trail.fmtrail.addr = (char *)scratch; ! 146: dcb.trail.fmtrail.nsectors = count; ! 147: dcb.trail.fmtrail.disk.cylinder = dskaddr->cylinder | flags; ! 148: dcb.trail.fmtrail.disk.track = dskaddr->track; ! 149: dcb.trail.fmtrail.disk.sector = dskaddr->sector; ! 150: dcb.trail.fmtrail.hdr.cylinder = hdraddr->cylinder | flags; ! 151: dcb.trail.fmtrail.hdr.track = hdraddr->track; ! 152: dcb.trail.fmtrail.hdr.sector = hdraddr->sector; ! 153: mdcb.firstdcb = &dcb; ! 154: mdcb.vddcstat = 0; ! 155: VDDC_ATTENTION(C_INFO.addr, &mdcb, C_INFO.type); ! 156: poll((int)(((count+849)/850)+120)); ! 157: if(vdtimeout <= 0) { ! 158: printf(" while formatting sectors.\n"); ! 159: _longjmp(abort_environ, 1); ! 160: } ! 161: } ! 162:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.