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