static char sccsid
[] = "@(#)format.c 1.8 (Berkeley/CCI) 6/24/90";
boolean
read_bad_sector_map();
print("Starting format on ");
printf("controller %d, drive %d, ", cur
.controller
, cur
.drive
);
printf("type %s.\n", lab
->d_typename
);
if (lab
->d_nsectors
> MAXSECS_PER_TRK
||
lab
->d_ntracks
> MAXTRKS
) {
"Drive geometry (number of sectors or tracks) is too large;\n");
print("vdformat must be recompiled with larger value\n");
print("for MAXTRKS or MAXSECS_PER_TRK.\n");
_longjmp(abort_environ
, 1);
/* Read the flaw map from the disk (where ever it may be) */
if(read_bad_sector_map() == true) {
if(bad_map
->bs_id
!= D_INFO
->id
) {
print("Module serial numbers do not match!\n");
print("Use `info' to find the real serial number.\n");
_longjmp(abort_environ
, 1);
printf("Using serial number from drive, %d\n",
D_INFO
->id
= bad_map
->bs_id
;
clear_relocations(false);
bad_map
->bs_id
= D_INFO
->id
;
/* Re-Initialize bad sector map relocation pointers */
if(kill_processes
== true)
_longjmp(quit_environ
, 1);
/* format the disk surface */
format_relocation_area();
format_maintenence_area();
format_users_data_area();
verify_relocation_area();
verify_maintenence_area();
verify_users_data_area();
register long sector_count
;
dskaddr
.cylinder
= (short)(lab
->d_ncylinders
- NUMSYS
);
dskaddr
.sector
= (char)0;
sector_count
= (long)(NUMREL
* lab
->d_ntracks
* lab
->d_nsectors
);
format_sectors(&dskaddr
, &dskaddr
, NRM
, sector_count
);
register long sector_count
;
sector_count
= (long)(lab
->d_ntracks
* lab
->d_nsectors
);
dskaddr
.sector
= (char)0;
for(cyl
=0; cyl
< (lab
->d_ncylinders
- NUMSYS
); cyl
++) {
format_sectors(&dskaddr
, &dskaddr
, NRM
, sector_count
);
format_maintenence_area()
register long sector_count
;
dskaddr
.cylinder
= (short)(lab
->d_ncylinders
- NUMMNT
- NUMMAP
);
dskaddr
.sector
= (char)0;
sector_count
= (long)(NUMMNT
* lab
->d_ntracks
* lab
->d_nsectors
);
format_sectors(&dskaddr
, &dskaddr
, NRM
, sector_count
);
extern boolean
align_buf();
if(C_INFO
->type
== VDTYPE_SMDE
) {
access_dsk((char *)save
, &dskaddr
, VDOP_RDRAW
, 1, 1);
if(align_buf((unsigned long *)save
, CDCSYNC
) == false)
else if(access_dsk((char *)save
, &dskaddr
, VDOP_RD
, 1, 1)&HEADER_ERROR
)
** Vdformat_sectors is used to do the actual formatting of a block.
format_sectors(dskaddr
, hdraddr
, flags
, count
)
dskadr
*dskaddr
, *hdraddr
;
cur
.daddr
.cylinder
= dskaddr
->cylinder
& 0xfff;
cur
.daddr
.track
= dskaddr
->track
;
dcb
.opcode
= VDOP_FSECT
; /* format sector command */
dcb
.intflg
= DCBINT_NONE
;
dcb
.nxtdcb
= (struct dcb
*)0; /* end of chain */
dcb
.devselect
= (char)cur
.drive
| lab
->d_devflags
;
dcb
.trailcnt
= (char)(sizeof(struct trfmt
) / sizeof(long));
dcb
.trail
.fmtrail
.addr
= (char *)scratch
;
dcb
.trail
.fmtrail
.nsectors
= count
;
dcb
.trail
.fmtrail
.disk
.cylinder
= dskaddr
->cylinder
| flags
;
dcb
.trail
.fmtrail
.disk
.track
= dskaddr
->track
;
dcb
.trail
.fmtrail
.disk
.sector
= dskaddr
->sector
;
dcb
.trail
.fmtrail
.hdr
.cylinder
= hdraddr
->cylinder
| flags
;
dcb
.trail
.fmtrail
.hdr
.track
= hdraddr
->track
;
dcb
.trail
.fmtrail
.hdr
.sector
= hdraddr
->sector
;
VDGO(C_INFO
->addr
, (u_long
)&mdcb
, C_INFO
->type
);
poll((int)(((count
+849)/850)+120));
printf(" while formatting sectors.\n");
_longjmp(abort_environ
, 1);
if (dcb
.operrsta
& DCBS_HARD
)