Annotation of cci/sys/stand/vdfmt/verify.c, revision 1.1

1.1     ! root        1: #include       "vdfmt.h"
        !             2: 
        !             3: #define        quiet 0
        !             4: 
        !             5: /*
        !             6: **
        !             7: */
        !             8: 
        !             9: verify()
        !            10: {
        !            11:        extern boolean  read_bad_sector_map();
        !            12: 
        !            13:        cur.state = vfy;
        !            14:        print("Starting verification on ");
        !            15:        printf("controller %d, drive %d, ", cur.controller, cur.drive);
        !            16:        printf("type %s.\n",CURRENT->type_name);
        !            17: 
        !            18:        if(is_formatted() == true) {
        !            19:                if(read_bad_sector_map() == true) {
        !            20:                        if(bad_map->bs_id == D_INFO.id) {
        !            21:                                verify_users_data_area();
        !            22:                                return;
        !            23:                        }
        !            24:                }
        !            25:                print("I can't verify drives with old formats.\n");
        !            26:                return;
        !            27:        }
        !            28:        print("I can't verify unformatted drives.\n");
        !            29: }
        !            30: 
        !            31: 
        !            32: /*
        !            33: **
        !            34: */
        !            35: 
        !            36: load_verify_patterns()
        !            37: {
        !            38:        register int index;
        !            39: 
        !            40:        /* Init bad block pattern array */
        !            41:        for(index=0; index<TRKSIZ; index++) {
        !            42:                pattern_0[index] = CURRENT->fmt_pat[0];
        !            43:                pattern_1[index] = CURRENT->fmt_pat[1];
        !            44:                pattern_2[index] = CURRENT->fmt_pat[2];
        !            45:                pattern_3[index] = CURRENT->fmt_pat[3];
        !            46:                pattern_4[index] = CURRENT->fmt_pat[4];
        !            47:                pattern_5[index] = CURRENT->fmt_pat[5];
        !            48:                pattern_6[index] = CURRENT->fmt_pat[6];
        !            49:                pattern_7[index] = CURRENT->fmt_pat[7];
        !            50:                pattern_8[index] = CURRENT->fmt_pat[8];
        !            51:                pattern_9[index] = CURRENT->fmt_pat[9];
        !            52:                pattern_10[index] = CURRENT->fmt_pat[10];
        !            53:                pattern_11[index] = CURRENT->fmt_pat[11];
        !            54:                pattern_12[index] = CURRENT->fmt_pat[12];
        !            55:                pattern_13[index] = CURRENT->fmt_pat[13];
        !            56:                pattern_14[index] = CURRENT->fmt_pat[14];
        !            57:                pattern_15[index] = CURRENT->fmt_pat[15];
        !            58:        }
        !            59: }
        !            60: 
        !            61: 
        !            62: /*
        !            63: **
        !            64: */
        !            65: 
        !            66: verify_relocation_area()
        !            67: {
        !            68:        cur.substate = sub_vfy;
        !            69:        verify_cylinders((int)CURRENT->ncyl - NUMSYS, NUMREL, 16);
        !            70:        sync_bad_sector_map();
        !            71: }
        !            72: 
        !            73: 
        !            74: /*
        !            75: **
        !            76: */
        !            77: 
        !            78: verify_users_data_area()
        !            79: {
        !            80:        int     pats = ops_to_do[cur.controller][cur.drive].numpat;
        !            81: 
        !            82:        cur.substate = sub_vfy;
        !            83:        verify_cylinders(0, (int)CURRENT->ncyl - NUMSYS, pats);
        !            84:        sync_bad_sector_map();
        !            85: }
        !            86: 
        !            87: 
        !            88: /*
        !            89: **
        !            90: */
        !            91: 
        !            92: verify_maintainence_area()
        !            93: {
        !            94:        cur.substate = sub_vfy;
        !            95:        verify_cylinders(CURRENT->ncyl - NUMSYS + NUMREL, NUMMNT, 16);
        !            96:        sync_bad_sector_map();
        !            97: }
        !            98: 
        !            99: 
        !           100: /*
        !           101: **     verify_cylinders does full track certification for every track
        !           102: ** on the cylinder.  This is done for speed and minimal head movement.  If
        !           103: ** an error occurs on any single track the track is flagged for later
        !           104: ** verification by verify sectors.
        !           105: */
        !           106: 
        !           107: verify_cylinders(base_cyl, cyl_count, pats)
        !           108: int    base_cyl, cyl_count, pats;
        !           109: {
        !           110:        dskadr          dskaddr;
        !           111: 
        !           112:        /* verify each track of each cylinder */
        !           113:        for (dskaddr.cylinder=base_cyl; dskaddr.cylinder<(base_cyl+cyl_count);
        !           114:            dskaddr.cylinder++)
        !           115:                for (dskaddr.track=0; dskaddr.track<CURRENT->ntrak;
        !           116:                    dskaddr.track++)
        !           117:                        verify_track(&dskaddr, pats, quiet);
        !           118: }
        !           119: 
        !           120: 
        !           121: /*
        !           122: **     verify_track verifies a single track. If the full track write and
        !           123: ** compare operation fails then each sector is read individually to determin
        !           124: ** which sectors are really bad.  If a sector is bad it is flagged as bad by
        !           125: ** the verify sector routine.
        !           126: */
        !           127: 
        !           128: verify_track(dskaddr, pats, verbosity)
        !           129: dskadr *dskaddr;
        !           130: int    pats;
        !           131: int    verbosity;
        !           132: {
        !           133:        register int    index, i;
        !           134:        register int    count;
        !           135:        register long   before;
        !           136:        register long   *after;
        !           137:        register long   offset = CURRENT->secsize / sizeof(long);
        !           138:        int             pattern_count = pats;
        !           139: 
        !           140:        if(pats == 0)
        !           141:                return;
        !           142:        dskaddr->sector = (char)0;
        !           143:        access_dsk((char *)pattern_address[0], dskaddr, WD, CURRENT->nsec, 1);
        !           144:        for(index = 0; index < pattern_count; index++) {
        !           145:                if(!data_ok()) {
        !           146:                        if(dcb.operrsta & HEADER_ERROR)  {
        !           147:                                flag_sector(dskaddr, dcb.operrsta, verbosity);
        !           148:                                break;
        !           149:                        }
        !           150:                        if(dcb.operrsta & DATA_ERROR)
        !           151:                                pattern_count = 16;
        !           152:                }
        !           153:                access_dsk((char *)scratch,dskaddr,RD,CURRENT->nsec,1);
        !           154:                if(!data_ok()) {
        !           155:                        if(dcb.operrsta & HEADER_ERROR)  {
        !           156:                                flag_sector(dskaddr, dcb.operrsta, verbosity);
        !           157:                                break;
        !           158:                        }
        !           159:                        pattern_count = 16;
        !           160:                        for(i = 0; i < CURRENT->nsec; i++) {
        !           161:                                register long   *next;
        !           162: 
        !           163:                                dskaddr->sector = i;
        !           164:                                next = &scratch[i * offset];
        !           165:                                access_dsk((char *)next,dskaddr,RD,1,1);
        !           166:                                if(!data_ok()) {
        !           167:                                        flag_sector(dskaddr,
        !           168:                                            dcb.operrsta,verbosity);
        !           169:                                }
        !           170:                        }
        !           171:                        dskaddr->sector = (char)0;
        !           172:                }
        !           173:                if(index+1 < pattern_count)
        !           174:                        access_dsk((char *)pattern_address[index+1],
        !           175:                            dskaddr, WD, CURRENT->nsec, 0);
        !           176:                count = CURRENT->nsec * offset;
        !           177:                before = *pattern_address[index];
        !           178:                after = scratch;
        !           179:                for(i=0; i<count; i++) {
        !           180:                        if(before != *(after++)) {
        !           181:                                dskaddr->sector = i / offset;
        !           182:                                flag_sector(dskaddr, DATA_ERROR, verbosity);
        !           183:                        }
        !           184:                }
        !           185:                if(index+1 <= pattern_count) {
        !           186:                        poll(60);
        !           187:                        if(vdtimeout <= 0) {
        !           188:                                printf(" while verifing track.\n");
        !           189:                                _longjmp(abort_environ, 1);
        !           190:                        }
        !           191:                }
        !           192:                if(kill_processes == true) {
        !           193:                        sync_bad_sector_map();
        !           194:                        _longjmp(quit_environ, 1);
        !           195:                }
        !           196:        }
        !           197: }
        !           198: 
        !           199: 
        !           200: flag_sector(dskaddr, status, verbose)
        !           201: dskadr *dskaddr;
        !           202: long   status;
        !           203: int    verbose;
        !           204: {
        !           205:        fmt_err         error;
        !           206:        bs_entry        entry;
        !           207: 
        !           208:        indent();
        !           209:        if(verbose) {
        !           210:                print("Error at sector %d, status=0x%x.",
        !           211:                    to_sector(*dskaddr), status);
        !           212:                printf("  Sector will be relocated.\n");
        !           213:        }
        !           214:        if(is_in_map(dskaddr) == false) {
        !           215:                error.err_adr = *dskaddr;
        !           216:                error.err_stat = status;
        !           217:                entry = (*C_INFO.code_pos)(error);
        !           218:                add_flaw(&entry);
        !           219:        }
        !           220:        exdent(1);
        !           221: }

unix.superglobalmegacorp.com

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