|
|
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: /* Re-Initialize bad sector map relocation pointers */ ! 38: zero_bad_sector_map(); ! 39: write_bad_sector_map(); ! 40: if(kill_processes == true) ! 41: _longjmp(quit_environ, 1); ! 42: ! 43: /* format the disk surface */ ! 44: format_relocation_area(); ! 45: format_maintenence_area(); ! 46: format_users_data_area(); ! 47: ! 48: ! 49: /* verify the surface */ ! 50: verify_relocation_area(); ! 51: verify_maintenence_area(); ! 52: verify_users_data_area(); ! 53: ! 54: (void) writelabel(); ! 55: } ! 56: ! 57: ! 58: /* ! 59: ** ! 60: */ ! 61: ! 62: format_relocation_area() ! 63: { ! 64: register long sector_count; ! 65: dskadr dskaddr; ! 66: ! 67: cur.substate = sub_fmt; ! 68: dskaddr.cylinder = (short)(lab->d_ncylinders - NUMSYS); ! 69: dskaddr.track = (char)0; ! 70: dskaddr.sector = (char)0; ! 71: sector_count = (long)(NUMREL * lab->d_ntracks * lab->d_nsectors); ! 72: format_sectors(&dskaddr, &dskaddr, NRM, sector_count); ! 73: } ! 74: ! 75: ! 76: /* ! 77: ** ! 78: */ ! 79: ! 80: format_users_data_area() ! 81: { ! 82: register long sector_count; ! 83: dskadr dskaddr; ! 84: register int cyl; ! 85: ! 86: cur.substate = sub_fmt; ! 87: sector_count = (long)(lab->d_ntracks * lab->d_nsectors); ! 88: dskaddr.track = (char)0; ! 89: dskaddr.sector = (char)0; ! 90: for(cyl=0; cyl < (lab->d_ncylinders - NUMSYS); cyl++) { ! 91: dskaddr.cylinder = cyl; ! 92: format_sectors(&dskaddr, &dskaddr, NRM, sector_count); ! 93: if (kill_processes) ! 94: return; ! 95: } ! 96: } ! 97: ! 98: ! 99: /* ! 100: ** ! 101: */ ! 102: ! 103: format_maintenence_area() ! 104: { ! 105: register long sector_count; ! 106: dskadr dskaddr; ! 107: ! 108: cur.substate = sub_fmt; ! 109: dskaddr.cylinder = (short)(lab->d_ncylinders - NUMMNT - NUMMAP); ! 110: dskaddr.track = (char)0; ! 111: dskaddr.sector = (char)0; ! 112: sector_count = (long)(NUMMNT * lab->d_ntracks * lab->d_nsectors); ! 113: format_sectors(&dskaddr, &dskaddr, NRM, sector_count); ! 114: } ! 115: ! 116: ! 117: /* ! 118: ** ! 119: */ ! 120: ! 121: boolean is_formatted() ! 122: { ! 123: extern boolean align_buf(); ! 124: dskadr dskaddr; ! 125: ! 126: dskaddr.cylinder = 0; ! 127: dskaddr.track = 0; ! 128: dskaddr.sector = 0; ! 129: if(C_INFO->type == VDTYPE_SMDE) { ! 130: access_dsk((char *)save, &dskaddr, VDOP_RDRAW, 1, 1); ! 131: if(align_buf((unsigned long *)save, CDCSYNC) == false) ! 132: return true; ! 133: return false; ! 134: } ! 135: else if(access_dsk((char *)save, &dskaddr, VDOP_RD, 1, 1)&HEADER_ERROR) ! 136: return false; ! 137: return true; ! 138: } ! 139: ! 140: ! 141: /* ! 142: ** Vdformat_sectors is used to do the actual formatting of a block. ! 143: */ ! 144: ! 145: format_sectors(dskaddr, hdraddr, flags, count) ! 146: dskadr *dskaddr, *hdraddr; ! 147: short flags; ! 148: long count; ! 149: { ! 150: cur.daddr.cylinder = dskaddr->cylinder & 0xfff; ! 151: cur.daddr.track = dskaddr->track; ! 152: dcb.opcode = VDOP_FSECT; /* format sector command */ ! 153: dcb.intflg = DCBINT_NONE; ! 154: dcb.nxtdcb = (struct dcb *)0; /* end of chain */ ! 155: dcb.operrsta = 0; ! 156: dcb.devselect = (char)cur.drive; ! 157: dcb.trailcnt = (char)(sizeof(struct trfmt) / sizeof(long)); ! 158: dcb.trail.fmtrail.addr = (char *)scratch; ! 159: dcb.trail.fmtrail.nsectors = count; ! 160: dcb.trail.fmtrail.disk.cylinder = dskaddr->cylinder | flags; ! 161: dcb.trail.fmtrail.disk.track = dskaddr->track; ! 162: dcb.trail.fmtrail.disk.sector = dskaddr->sector; ! 163: dcb.trail.fmtrail.hdr.cylinder = hdraddr->cylinder | flags; ! 164: dcb.trail.fmtrail.hdr.track = hdraddr->track; ! 165: dcb.trail.fmtrail.hdr.sector = hdraddr->sector; ! 166: mdcb.mdcb_head = &dcb; ! 167: mdcb.mdcb_status = 0; ! 168: VDGO(C_INFO->addr, (u_long)&mdcb, C_INFO->type); ! 169: poll((int)(((count+849)/850)+120)); ! 170: if(vdtimeout <= 0) { ! 171: printf(" while formatting sectors.\n"); ! 172: _longjmp(abort_environ, 1); ! 173: } ! 174: if (dcb.operrsta & DCBS_HARD) ! 175: vd_error("format"); ! 176: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.