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