1 #ifndef lint 2 static char sccsid[] = "@(#)format.c 1.8 (Berkeley/CCI) 06/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 } 185