Annotation of 43BSDReno/sys/tahoestand/vdformat/format.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.