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