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