|
|
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.