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