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

1.1     ! root        1: #include       "vdfmt.h"
        !             2: #include       "cmd.h"
        !             3: 
        !             4: /*
        !             5: **
        !             6: */
        !             7: 
        !             8: relocate()
        !             9: {
        !            10:        extern boolean  is_formatted();
        !            11: 
        !            12:        cur.state = rel;
        !            13:        print("Adding flaws to bad setor map on ");
        !            14:        printf("controller %d, drive %d, ", cur.controller, cur.drive);
        !            15:        printf("type %s.\n",CURRENT->type_name);
        !            16: 
        !            17:        indent();
        !            18:        if(is_formatted() == true) {
        !            19:                if(read_bad_sector_map() == true)
        !            20:                        if(bad_map->bs_id != D_INFO.id) {
        !            21:                                print("Drive serial numbers do not match!\n");
        !            22:                                exdent(1);
        !            23:                                _longjmp(abort_environ, 1);
        !            24:                        }
        !            25:                get_new_relocations();
        !            26:                sync_bad_sector_map();
        !            27:        }
        !            28:        else
        !            29:                print("Drive must be formatted befor relocations are done.\n");
        !            30:        exdent(1);
        !            31: }
        !            32: 
        !            33: 
        !            34: /*
        !            35: **
        !            36: */
        !            37: 
        !            38: rel_help()
        !            39: {
        !            40:        indent();
        !            41:        print("Relocation commands are in the following form:\n");
        !            42:        indent();
        !            43:        print("[a-h] (block)   -  UNIX file system format.\n");
        !            44:        print("SEctor (sector) -  Absolute sector number on disk.\n");
        !            45:        print("Track (track)   -  Absolute disk track number.\n");
        !            46:        print("(cylinder) (head) (offset) (length) - CDC flaw map format.\n");
        !            47:        print("STARt           -  Starts relocation process.\n\n");
        !            48:        exdent(2);
        !            49: }
        !            50: 
        !            51: 
        !            52: /*
        !            53: **
        !            54: */
        !            55: 
        !            56: get_new_relocations()
        !            57: {
        !            58:        char            line[256];
        !            59:        char            *ptr;
        !            60:        bs_entry        entry;
        !            61:        dskadr          dskaddr;
        !            62:        int             max_track;
        !            63: 
        !            64:        dskaddr.cylinder = CURRENT->ncyl - 1;
        !            65:        dskaddr.cylinder = CURRENT->ntrak - 1;
        !            66:        max_track = to_track(dskaddr);
        !            67:        for(;;) {
        !            68:                print("Location? ");
        !            69:                get_string_cmd(line, rel_help);
        !            70:                if(kill_processes == true)
        !            71:                        _longjmp(quit_environ, 1);
        !            72:                if(line[0] == '\0')
        !            73:                        continue;
        !            74:                ptr = line;
        !            75:                trim_white(ptr);
        !            76:                if(!strncmp(ptr, "he", 2) || !strncmp(ptr, "?", 1) ||
        !            77:                    !strncmp(ptr, "stat", 4) || !strncmp(ptr, "!", 1))
        !            78:                        continue;
        !            79:                indent();
        !            80:                if((*ptr >= 'a') && (*ptr <= 'h')) {
        !            81:                        register char   par = *(ptr++);
        !            82:                        register int    block = get_next_digit(ptr);
        !            83: 
        !            84:                        dskaddr = *from_unix((unsigned char)par,
        !            85:                            (unsigned int)block);
        !            86:                        if((dskaddr.cylinder == -1) || (block == -1)) {
        !            87:                                print("Invalid UNIX block number!\n");
        !            88:                                goto next;
        !            89:                        }
        !            90:                        print("Confirm block %d on file-system '%c'",block,par);
        !            91:                        if(get_yes_no("") == true) {
        !            92:                                entry=(*C_INFO.code_pos)(dskaddr,HEADER_ERROR);
        !            93:                                add_user_relocations(&entry);
        !            94:                        }
        !            95:                }
        !            96:                else if(*ptr == 't') {
        !            97:                        register int    trk = get_next_digit(ptr);
        !            98: 
        !            99:                        if((trk == -1) || (trk >= max_track)) {
        !           100:                                print("Invalid track number!\n");
        !           101:                                goto next;
        !           102:                        }
        !           103:                        print("Confirm track %d", trk);
        !           104:                        if(get_yes_no("") == true) {
        !           105:                                dskaddr = *from_track(trk);
        !           106:                                entry=(*C_INFO.code_pos)(dskaddr,HEADER_ERROR);
        !           107:                                add_user_relocations(&entry);
        !           108:                        }
        !           109:                }
        !           110:                else if(!strncmp(ptr, "se", 2)) {
        !           111:                        register int    sec = get_next_digit(ptr);
        !           112: 
        !           113:                        if((sec == -1) ||
        !           114:                            ((CURRENT->nsec*CURRENT->ntrak*CURRENT->ncyl)<sec)){
        !           115:                                print("Invalid sector number!\n");
        !           116:                                goto next;
        !           117:                        }
        !           118:                        print("Confirm sector %d", sec);
        !           119:                        if(get_yes_no("") == true) {
        !           120:                                dskaddr = *from_sector((unsigned int)sec);
        !           121:                                entry = (*C_INFO.code_pos)(dskaddr, DATA_ERROR);
        !           122:                                add_user_relocations(&entry);
        !           123:                        }
        !           124:                }
        !           125:                else if(is_digit(*ptr)) {
        !           126:                        entry.bs_cyl = get_next_digit(ptr);
        !           127:                        skipdigits(ptr);
        !           128:                        finddigit(ptr);
        !           129:                        entry.bs_trk = get_next_digit(ptr);
        !           130:                        skipdigits(ptr);
        !           131:                        finddigit(ptr);
        !           132:                        entry.bs_offset = get_next_digit(ptr);
        !           133:                        skipdigits(ptr);
        !           134:                        finddigit(ptr);
        !           135:                        entry.bs_length = get_next_digit(ptr);
        !           136:                        if((entry.bs_trk != -1) && (entry.bs_offset != -1) &&
        !           137:                            (entry.bs_length != -1)) {
        !           138:                                if(entry.bs_cyl >= CURRENT->ncyl)
        !           139:                                        print("Cylinder number to high!\n");
        !           140:                                else if(entry.bs_trk >= CURRENT->ntrak)
        !           141:                                        print("Head number to high!\n");
        !           142:                                else if(entry.bs_offset >= CURRENT->nbyte)
        !           143:                                        print("Offset too long!\n");
        !           144:                                else if(entry.bs_length == 0)
        !           145:                                        print("Can't have a 0 length error!\n");
        !           146:                                else {
        !           147:                                        print("Confirm  Cyl %d, ",entry.bs_cyl);
        !           148:                                        printf("Head %d, ", entry.bs_trk);
        !           149:                                        printf("offset %d, ", entry.bs_offset);
        !           150:                                        printf("length %d", entry.bs_length);
        !           151:                                        if(get_yes_no("") == true)
        !           152:                                                add_user_relocations(&entry);
        !           153:                                }
        !           154:                        }
        !           155:                        else
        !           156:                                goto bad;
        !           157:                }
        !           158:                else if(!strncmp(ptr, "star", 4)) {
        !           159:                        exdent(1);
        !           160:                        break;
        !           161:                }
        !           162:                else
        !           163: bad:                   print("What?\n");
        !           164: next:          exdent(1);
        !           165:        }
        !           166: }
        !           167: 
        !           168: dskadr check_track_for_relocations(entry, i)
        !           169: bs_entry       entry;
        !           170: register int   i;
        !           171: {
        !           172:        register int    j = i;
        !           173:        fmt_err         temp, cmp;
        !           174:        boolean         bad_track = false;
        !           175: 
        !           176:        cmp = (*C_INFO.decode_pos)(entry);
        !           177:        /* Check to see if a alternate track is or will be on this track */
        !           178:        while((bad_map->list[j].bs_cyl == entry.bs_cyl) &&
        !           179:            (bad_map->list[j].bs_trk == entry.bs_trk)) {
        !           180:                temp = (*C_INFO.decode_pos)(bad_map->list[j]);
        !           181:                if(temp.err_stat & HEADER_ERROR) {
        !           182:                        bad_track = true;
        !           183:                        /* if track was mapped out (it can't be us) */
        !           184:                        if(((bad_map->list[j].bs_alt.cylinder != 0)) ||
        !           185:                            (bad_map->list[j].bs_alt.track != 0) ||
        !           186:                            (bad_map->list[j].bs_alt.sector != 0)) {
        !           187:                                return cmp.err_adr;
        !           188:                        }
        !           189:                }
        !           190:                j++;
        !           191:        }
        !           192:        /*
        !           193:        **    If it was a bad track and it was not the current entry
        !           194:        ** that produced it then then map it
        !           195:        ** to itself and forget about it for now since it will be taken
        !           196:        ** care of later.
        !           197:        **
        !           198:        **    If it was the current entry return zero and the track will be
        !           199:        ** mapped out correctly.
        !           200:        */
        !           201:        if(bad_track == true) {
        !           202:                if(cmp.err_stat & HEADER_ERROR)
        !           203:                        return entry.bs_alt; /* better known as zero */
        !           204:                else
        !           205:                        return cmp.err_adr;
        !           206:        }
        !           207:        /*
        !           208:        **   if we made it through all the bad track stuff then check for
        !           209:        ** multiple errors on the same sector that are already mapped!
        !           210:        */
        !           211:        j = i;
        !           212:        while((bad_map->list[j].bs_cyl == entry.bs_cyl) &&
        !           213:            (bad_map->list[j].bs_trk == entry.bs_trk)) {
        !           214:                temp = (*C_INFO.decode_pos)(bad_map->list[j]);
        !           215:                if(temp.err_adr.sector == cmp.err_adr.sector) {
        !           216:                        /* if it is not really the current entry */
        !           217:                        if((bad_map->list[j].bs_offset != entry.bs_offset) ||
        !           218:                            (bad_map->list[j].bs_length != entry.bs_length)) { 
        !           219:                                /* if the sector is already mapped out */
        !           220:                                if(((bad_map->list[j].bs_alt.cylinder != 0)) ||
        !           221:                                    (bad_map->list[j].bs_alt.track != 0) ||
        !           222:                                    (bad_map->list[j].bs_alt.sector != 0)) {
        !           223:                                        return temp.err_adr;
        !           224:                                }
        !           225:                        }
        !           226:                }
        !           227:                j++;
        !           228:        }
        !           229:        return  entry.bs_alt;
        !           230: }
        !           231: 
        !           232: 
        !           233: /*
        !           234: **
        !           235: */
        !           236: 
        !           237: dskadr is_relocated(entry)
        !           238: bs_entry       entry;
        !           239: {
        !           240:        register int    i;
        !           241: 
        !           242:        for(i=0; i<bad_map->bs_count; i++)
        !           243:                if((bad_map->list[i].bs_cyl == entry.bs_cyl) &&
        !           244:                    (bad_map->list[i].bs_trk == entry.bs_trk))
        !           245:                        return check_track_for_relocations(entry, i);
        !           246:        return entry.bs_alt;
        !           247: }
        !           248: 
        !           249: 
        !           250: 
        !           251: /*
        !           252: **
        !           253: */
        !           254: 
        !           255: sync_bad_sector_map()
        !           256: {
        !           257:        register int    i;
        !           258:        dskadr          dskaddr;
        !           259: 
        !           260:        /*
        !           261:        ** do all the relocation cylinders first to allocate all flaws in
        !           262:        ** relocation area.
        !           263:        */
        !           264:        for(i=bad_map->bs_count-1; i>=0; i--) {
        !           265:                if((bad_map->list[i].bs_cyl >= CURRENT->ncyl-NUMSYS) &&
        !           266:                    (bad_map->list[i].bs_cyl < CURRENT->ncyl-NUMMAP-NUMMNT)) {
        !           267:                        if((bad_map->list[i].bs_alt.cylinder == 0) &&
        !           268:                            (bad_map->list[i].bs_alt.track == 0) &&
        !           269:                            (bad_map->list[i].bs_alt.sector == 0)) {
        !           270:                                bad_map->list[i].bs_alt = 
        !           271:                                    *new_location(&bad_map->list[i]);
        !           272:                        }
        !           273:                }
        !           274:        }
        !           275:        for(i=bad_map->bs_count-1; i>=0; i--) {
        !           276:                if((bad_map->list[i].bs_alt.cylinder == 0) &&
        !           277:                    (bad_map->list[i].bs_alt.track == 0) &&
        !           278:                    (bad_map->list[i].bs_alt.sector == 0)) {
        !           279:                        dskaddr = is_relocated(bad_map->list[i]);
        !           280:                        if((dskaddr.cylinder == 0) && (dskaddr.track == 0) &&
        !           281:                            (dskaddr.sector == 0)) {
        !           282:                                bad_map->list[i].bs_alt = 
        !           283:                                    *new_location(&bad_map->list[i]);
        !           284:                                do_relocation(bad_map->list[i]);
        !           285:                        }
        !           286:                        else
        !           287:                                bad_map->list[i].bs_alt = dskaddr;
        !           288:                }
        !           289:        }
        !           290:        write_bad_sector_map();
        !           291: }
        !           292: 
        !           293: 
        !           294: 
        !           295: /*
        !           296: **
        !           297: */
        !           298: 
        !           299: do_relocation(entry)
        !           300: bs_entry       entry;
        !           301: {
        !           302:        fmt_err temp;
        !           303: 
        !           304:        if(entry.bs_cyl >= CURRENT->ncyl-NUMSYS)
        !           305:                if(entry.bs_cyl != (CURRENT->ncyl - NUMMAP - NUMMNT))
        !           306:                        return;
        !           307:        temp = (*C_INFO.decode_pos)(entry);
        !           308:        if((entry.bs_alt.cylinder == 0) && (entry.bs_alt.track == 0) &&
        !           309:            (entry.bs_alt.sector == 0))
        !           310:                print_unix_block(temp.err_adr);
        !           311:        else if(temp.err_stat & HEADER_ERROR)
        !           312:                if(C_INFO.type == SMDCTLR) {
        !           313:                        print("Can't relocate tracks on VDDC controllers.\n");
        !           314:                        print_unix_block(temp.err_adr);
        !           315:                }
        !           316:                else
        !           317:                        relocate_track(entry);
        !           318:        else
        !           319:                relocate_sector(entry);
        !           320: }
        !           321: 
        !           322: 
        !           323: /*
        !           324: **
        !           325: */
        !           326: 
        !           327: relocate_sector(entry)
        !           328: bs_entry       entry;
        !           329: {
        !           330:        dskadr          phys, reloc;
        !           331:        fmt_err         temp;
        !           332:        register long   status;
        !           333: 
        !           334:        temp = (*C_INFO.decode_pos)(entry);
        !           335:        phys = temp.err_adr;
        !           336:        reloc = entry.bs_alt;
        !           337:        format_sectors(&phys, &reloc, RELOC_SECTOR, (long)1);
        !           338:        
        !           339:        format_sectors(&reloc, &phys, ALT_SECTOR, (long)1);
        !           340:        status = access_dsk((char *)save, &temp.err_adr, WD, 1, 1);
        !           341:        if(!((status & ALTACC) && !(status & (HRDERR |SFTERR)))) {
        !           342:                print("Sector relocation failed.  Status = 0x%x.\n", status);
        !           343:                print_unix_block(phys);
        !           344:        }
        !           345: }
        !           346: 
        !           347: 
        !           348: 
        !           349: /*
        !           350: **
        !           351: */
        !           352: 
        !           353: relocate_track(entry)
        !           354: bs_entry       entry;
        !           355: {
        !           356:        dskadr          phys, reloc;
        !           357:        fmt_err         temp;
        !           358:        register long   status;
        !           359: 
        !           360:        temp = (*C_INFO.decode_pos)(entry);
        !           361:        temp.err_adr.sector = 0;
        !           362:        phys = temp.err_adr;
        !           363:        reloc = entry.bs_alt;
        !           364:        reloc.sector = 0xff;
        !           365:        format_sectors(&phys, &reloc, RELOC_SECTOR, (long)CURRENT->nsec);
        !           366:        
        !           367:        reloc.sector = 0x00;
        !           368:        format_sectors(&reloc, &phys, ALT_SECTOR, (long)CURRENT->nsec);
        !           369:        status = access_dsk((char *)save, &temp.err_adr, WD, CURRENT->nsec, 1);
        !           370:        if(!((status & ALTACC) && !(status & (HRDERR | SFTERR)))) {
        !           371:                print("Track relocation failed.  Status = 0x%x.\n", status);
        !           372:                print_unix_block(phys);
        !           373:        }
        !           374: }
        !           375: 
        !           376: 
        !           377: 

unix.superglobalmegacorp.com

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