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