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