Annotation of 43BSDTahoe/sys/tahoestand/vdformat/maps.c, revision 1.1.1.1

1.1       root        1: #ifndef lint
                      2: static char sccsid[] = "@(#)maps.c     1.7 (Berkeley/CCI) 6/7/88";
                      3: #endif
                      4: 
                      5: 
                      6: #include       "vdfmt.h"
                      7: 
                      8: 
                      9: /*
                     10: **
                     11: */
                     12: 
                     13: boolean align_buf(buf, sync)
                     14: unsigned long  *buf;
                     15: unsigned long  sync;
                     16: {
                     17:        register int    i, shift;
                     18: 
                     19:        /* find shift amount */
                     20:        for(shift=0; shift < 32; shift++) {
                     21:                if((*buf >> shift ) == sync) {
                     22:                        for(i=(512/sizeof(long))-1; i >= 0; i--) {
                     23:                                *(buf+i+1) |= *(buf+i) << (32 - shift);
                     24:                                *(buf+i) = *(buf+i) >> shift;
                     25:                        }
                     26:                        return true;
                     27:                }
                     28:        }
                     29:        return false;
                     30: }
                     31: 
                     32: 
                     33: /*
                     34: **     Looks for two maps in a row that are the same.
                     35: */
                     36: 
                     37: boolean
                     38: read_map(flags)
                     39: short  flags;
                     40: {
                     41:        register int    trk, i;
                     42:        dskadr          dskaddr;
                     43: 
                     44:        dskaddr.cylinder = (lab->d_ncylinders - 1) | flags;
                     45:        for(i=0; i < 100; i++)
                     46:                scratch[i] = -1;
                     47:        for(trk=0; trk < lab->d_ntracks; trk++) {
                     48:                dskaddr.track = trk;
                     49:                dskaddr.sector = 0;
                     50:                if(access_dsk((char *)save,&dskaddr, VDOP_RD,
                     51:                    lab->d_nsectors,1)& VDERR_HARD)
                     52:                        continue;
                     53:                if(bcmp((char *)scratch, (char *)save, bytes_trk) == true) {
                     54:                        bcopy((char *)save, (char *)bad_map, bytes_trk);
                     55:                        if(bad_map->bs_count <= MAX_FLAWS) {
                     56:                                for(i=0; i < bad_map->bs_count; i++) {
                     57:                                        if(bad_map->list[i].bs_cyl >=
                     58:                                            lab->d_ncylinders)
                     59:                                                break;
                     60:                                        if(bad_map->list[i].bs_trk >=
                     61:                                            lab->d_ntracks)
                     62:                                                break;
                     63:                                        if(bad_map->list[i].bs_offset >=
                     64:                                            lab->d_traksize)
                     65:                                                break;
                     66:                                }
                     67:                                if(i == bad_map->bs_count) {
                     68:                                        load_free_table();
                     69:                                        return true;
                     70:                                }
                     71:                        }
                     72:                        bzero(bad_map, bytes_trk);
                     73:                        bad_map->bs_id = 0;
                     74:                        bad_map->bs_max = MAX_FLAWS;
                     75:                }
                     76:                bcopy((char *)save, (char *)scratch, bytes_trk);
                     77:        }
                     78:        return false;
                     79: }
                     80: 
                     81: 
                     82: /*
                     83: **
                     84: */
                     85: 
                     86: boolean read_bad_sector_map()
                     87: {
                     88:        dskadr          dskaddr;
                     89: 
                     90:        dskaddr.cylinder = lab->d_ncylinders - 1;
                     91:        dskaddr.track = 0;
                     92:        dskaddr.sector = 0;
                     93:        /* start with nothing in map */
                     94:        bzero(bad_map, bytes_trk);
                     95:        bad_map->bs_id = 0;
                     96:        bad_map->bs_max = MAX_FLAWS;
                     97:        if (C_INFO->type == VDTYPE_SMDE) {
                     98:                access_dsk((char *)save, &dskaddr, VDOP_RDRAW, 1, 1);
                     99:                if (align_buf((unsigned long *)save, CDCSYNC) == true) {
                    100:                        read_flaw_map();
                    101:                        return (false);
                    102:                } else if (read_map(NRM) == true) {
                    103:                        return (true);
                    104:                } else {
                    105:                        get_smde_relocations();
                    106:                        return false;
                    107:                }
                    108:        } else {
                    109:                if (read_map(WPT) == true)
                    110:                        return (true);
                    111:                else {
                    112:                        get_relocations_the_hard_way();
                    113:                        return (false);
                    114:                }
                    115:        }
                    116: }
                    117: 
                    118: 
                    119: /*
                    120: **
                    121: */
                    122: 
                    123: get_relocations_the_hard_way()
                    124: {
                    125:        register int    cyl, trk;
                    126:        register int    status;
                    127:        dskadr          dskaddr;
                    128: 
                    129:        dskaddr.sector = 0;
                    130:        /* scan each sector to see if it is relocated and take note if it is */
                    131:        for(cyl=0; cyl < lab->d_ncylinders - NUMSYS; cyl++) {
                    132:                dskaddr.cylinder = cyl;
                    133:                for(trk=0; trk < lab->d_ntracks; trk++) {
                    134:                        dskaddr.track = trk;
                    135:                        status=access_dsk((char *)scratch, &dskaddr,
                    136:                            VDOP_RD, lab->d_nsectors, 1);
                    137:                        if(status & DCBS_ATA)
                    138:                                get_track_relocations(dskaddr);
                    139:                }
                    140:        }
                    141:        load_free_table();
                    142: }
                    143: 
                    144: 
                    145: /*
                    146: **
                    147: */
                    148: 
                    149: get_track_relocations(dskaddr)
                    150: dskadr dskaddr;
                    151: {
                    152:        register int    status;
                    153:        bs_entry        temp;
                    154:        fmt_err         error;
                    155:        
                    156:        for(dskaddr.sector=0; dskaddr.sector < lab->d_nsectors; dskaddr.sector++) {
                    157:                status = access_dsk((char *)scratch, &dskaddr, VDOP_RD, 1, 1);
                    158:                if(status & DCBS_ATA) {
                    159:                        error.err_adr = dskaddr;
                    160:                        error.err_stat = DATA_ERROR;
                    161:                        (*C_INFO->code_pos)(&error, &temp);
                    162:                        temp.bs_how = operator;
                    163:                        add_flaw(&temp);
                    164:                }
                    165:        }
                    166: }
                    167: 
                    168: 
                    169: /*
                    170: **
                    171: */
                    172: 
                    173: remove_user_relocations(entry)
                    174: bs_entry       *entry;
                    175: {
                    176:        register int    i, j;
                    177:        fmt_err         temp;
                    178:        fmt_err         error;
                    179:        register bs_entry *ptr; 
                    180: 
                    181:        (*C_INFO->decode_pos)(entry, &error);
                    182:        ptr = bad_map->list;
                    183:        for(i=0; i < bad_map->bs_count; i++) {
                    184:                if (ptr->bs_cyl != entry->bs_cyl ||
                    185:                    ptr->bs_trk != entry->bs_trk)
                    186:                        continue;
                    187:                (*C_INFO->decode_pos)(ptr, &temp);
                    188:                if((ptr->bs_how != flaw_map) &&
                    189:                    (temp.err_adr.cylinder == error.err_adr.cylinder) &&
                    190:                    (temp.err_adr.track == error.err_adr.track) &&
                    191:                    (temp.err_adr.sector == error.err_adr.sector)) {
                    192:                        if(temp.err_stat & HEADER_ERROR)
                    193:                                remove_track(&temp, ptr);
                    194:                        else
                    195:                                remove_sector(&temp, ptr);
                    196:                        for(j=i+1; j < bad_map->bs_count; j++)
                    197:                                bad_map->list[j-1] = bad_map->list[j];
                    198:                        bad_map->bs_count--;
                    199:                        return;
                    200:                }
                    201:                ptr++;
                    202:        }
                    203:        indent();
                    204:        print("Sector %d is not in bad sector map!\n",
                    205:            to_sector(error.err_adr));
                    206:        exdent(1);
                    207: }
                    208: 
                    209: clear_relocations(reformat)
                    210: boolean reformat;
                    211: {
                    212:        fmt_err         temp;
                    213:        register bs_entry *ptr1, *ptr2, *end;   
                    214:        int oldsub = cur.substate;
                    215: 
                    216:        cur.substate = sub_rel;
                    217:        ptr1 = bad_map->list;
                    218:        ptr2 = bad_map->list;
                    219:        end = &bad_map->list[bad_map->bs_count];
                    220:        for (; ptr1 < end; ptr1++) {
                    221:                if (ptr1->bs_how != flaw_map) {
                    222:                        if (reformat == true) {
                    223:                                (*C_INFO->decode_pos)(ptr1, &temp);
                    224:                                if(temp.err_stat & HEADER_ERROR)
                    225:                                        remove_track(&temp, ptr1);
                    226:                                else
                    227:                                        remove_sector(&temp, ptr1);
                    228:                        }
                    229:                        bad_map->bs_count--;
                    230:                } else {
                    231:                        if (ptr1 != ptr2)
                    232:                                *ptr2 = *ptr1;
                    233:                        ptr2++;
                    234:                }
                    235:        }
                    236:        cur.substate = oldsub;
                    237: }
                    238: 
                    239: 
                    240: /*
                    241: **
                    242: */
                    243: 
                    244: remove_sector(error, entry)
                    245: fmt_err                *error;
                    246: bs_entry       *entry;
                    247: {
                    248:        format_sectors(&error->err_adr, &error->err_adr, NRM, 1);
                    249:        format_sectors(&entry->bs_alt, &entry->bs_alt, NRM, 1);
                    250: }
                    251: 
                    252: 
                    253: /*
                    254: **
                    255: */
                    256: 
                    257: remove_track(error, entry)
                    258: fmt_err                *error;
                    259: bs_entry       *entry;
                    260: {
                    261:        format_sectors(&error->err_adr,&error->err_adr,NRM,(long)lab->d_nsectors);
                    262:        format_sectors(&entry->bs_alt,&entry->bs_alt,NRM,(long)lab->d_nsectors);
                    263: }
                    264: 
                    265: 
                    266: /*
                    267: **
                    268: */
                    269: 
                    270: write_bad_sector_map()
                    271: {
                    272:        register int    trk, sec;
                    273:        dskadr          dskaddr;
                    274: 
                    275:        dskaddr.cylinder = (lab->d_ncylinders - NUMMAP);
                    276:        for(trk=0; trk < lab->d_ntracks; trk++) {
                    277:                for(sec = 0; sec < lab->d_nsectors; sec++) {
                    278:                        bcopy((char *)bs_map_space + (sec * lab->d_secsize),
                    279:                            (char *)scratch, lab->d_secsize);
                    280:                        dskaddr.track = trk;
                    281:                        dskaddr.sector = sec;
                    282:                        format_sectors(&dskaddr, &dskaddr, WPT, 1);
                    283:                }
                    284:        }
                    285: }
                    286: 
                    287: 
                    288: /*
                    289: **
                    290: */
                    291: 
                    292: zero_bad_sector_map()
                    293: {
                    294:        bs_map          *bm = bad_map;
                    295:        register int    i;
                    296:        dskadr          zero;
                    297: 
                    298:        zero.cylinder = 0;
                    299:        zero.track = 0;
                    300:        zero.sector = 0;
                    301:        for(i=0; i < bm->bs_count; i++)
                    302:                bm->list[i].bs_alt = zero;
                    303:        load_free_table();
                    304: }
                    305: 
                    306: 
                    307: /*
                    308: **
                    309: */
                    310: 
                    311: read_flaw_map()
                    312: {
                    313:        register int    cyl, trk;
                    314:        dskadr          dskaddr;
                    315:        flaw            buffer;
                    316: 
                    317:        dskaddr.sector = 0;
                    318:        for  (cyl=0; cyl < lab->d_ncylinders; cyl++) {
                    319:                dskaddr.cylinder = cyl;
                    320:                for  (trk=0; trk < lab->d_ntracks; trk++) {
                    321:                        dskaddr.track = trk;
                    322:                        access_dsk(&buffer, &dskaddr, VDOP_RDRAW, 1, 1);
                    323:                        if(align_buf(&buffer, CDCSYNC) == true) {
                    324:                                add_flaw_entries(&buffer);
                    325:                                continue;
                    326:                        }
                    327:                }       
                    328:        }
                    329:        load_free_table();
                    330: }
                    331: 
                    332: 
                    333: /*
                    334: **
                    335: */
                    336: 
                    337: get_smde_relocations()
                    338: {
                    339:        register int    cyl, trk, sec;
                    340:        smde_hdr        buffer;
                    341:        dskadr          dskaddr;
                    342:        fmt_err         bad;
                    343:        bs_entry        temp;
                    344:        boolean         bad_track;
                    345: 
                    346:        /* Read any old drive relocations */
                    347:        for(cyl=0; cyl < NUMREL; cyl++) {
                    348:                dskaddr.cylinder = lab->d_ncylinders - NUMSYS + cyl;
                    349:                for(trk=0; trk < lab->d_ntracks; trk++) {
                    350:                        dskaddr.track = trk;
                    351:                        bad_track = true;
                    352:                        for(sec=0; sec < lab->d_nsectors; sec++) {
                    353:                                dskaddr.sector = sec;
                    354:                                access_dsk(&buffer, &dskaddr, VDOP_RDRAW, 1, 1);
                    355:                                if(align_buf(&buffer, SMDE1SYNC) == false) {
                    356:                                        bad_track = false;
                    357:                                        break;
                    358:                                }
                    359:                        }
                    360:                        if(bad_track == true) {
                    361:                                dskaddr.sector = 0;
                    362:                                bad.err_adr.cylinder = buffer.alt_cyl;
                    363:                                bad.err_adr.track = buffer.alt_trk;
                    364:                                bad.err_adr.sector = 0;
                    365:                                bad.err_stat = HEADER_ERROR;
                    366:                                (*C_INFO->code_pos)(&bad, &temp);
                    367:                                temp.bs_alt = dskaddr;
                    368:                                temp.bs_how = scanning;
                    369:                                add_flaw(&temp);
                    370:                                continue;
                    371:                        }
                    372:                        for(sec=0; sec < lab->d_nsectors; sec++) {
                    373:                                dskaddr.sector = sec;
                    374:                                access_dsk(&buffer, &dskaddr, VDOP_RDRAW, 1, 1);
                    375:                                if(align_buf(&buffer, SMDE1SYNC) == true) {
                    376:                                        bad.err_adr.cylinder = buffer.alt_cyl;
                    377:                                        bad.err_adr.track = buffer.alt_trk;
                    378:                                        bad.err_adr.sector = buffer.alt_sec;
                    379:                                        bad.err_stat = DATA_ERROR;
                    380:                                        (*C_INFO->code_pos)(&bad, &temp);
                    381:                                        temp.bs_alt = dskaddr;
                    382:                                        temp.bs_how = scanning;
                    383:                                        add_flaw(&temp);
                    384:                                }
                    385:                        }
                    386:                }
                    387:        }
                    388:        load_free_table();
                    389: }
                    390: 
                    391: 
                    392: /*
                    393: **
                    394: */
                    395: 
                    396: add_flaw_entries(buffer)
                    397: flaw   *buffer;
                    398: {
                    399:        register int    i;
                    400:        bs_entry        temp;
                    401: 
                    402:        temp.bs_cyl = buffer->flaw_cyl & 0x7fff; /* clear off bad track bit */
                    403:        temp.bs_trk = buffer->flaw_trk;
                    404:        for(i=0; i < 4; i++) {
                    405:                if(buffer->flaw_pos[i].flaw_length != 0) {
                    406:                        temp.bs_offset = buffer->flaw_pos[i].flaw_offset;
                    407:                        temp.bs_length = buffer->flaw_pos[i].flaw_length;
                    408:                        temp.bs_alt.cylinder = 0;
                    409:                        temp.bs_alt.track = 0;
                    410:                        temp.bs_alt.sector = 0;
                    411:                        temp.bs_how = flaw_map;
                    412:                        add_flaw(&temp);
                    413:                }
                    414:        }
                    415: }
                    416: 
                    417: 
                    418: cmp_entry(a, b)
                    419: bs_entry       *a;
                    420: bs_entry       *b;
                    421: {
                    422:        if(a->bs_cyl == b->bs_cyl) {
                    423:                if(a->bs_trk == b->bs_trk) {
                    424:                        if(a->bs_offset == b->bs_offset)
                    425:                                return 0;
                    426:                        else if(a->bs_offset < b->bs_offset)
                    427:                                return -1;
                    428:                 }
                    429:                else if(a->bs_trk < b->bs_trk)
                    430:                        return -1;
                    431:        }
                    432:        else if(a->bs_cyl < b->bs_cyl)
                    433:                return -1;
                    434:        return 1;
                    435: }
                    436: 
                    437: 
                    438: /*
                    439:  * Add flaw to map.
                    440:  * Return value:
                    441:  *   1 OK
                    442:  *   0 sector was in map
                    443:  *  -1 failure
                    444:  */
                    445: add_flaw(entry)
                    446: bs_entry       *entry;
                    447: {
                    448:        extern  int     cmp_entry();
                    449:        bs_map          *bm = bad_map;
                    450:        register int    i;
                    451: 
                    452:        if(bm->bs_count > MAX_FLAWS)
                    453:                return (-1);
                    454:        if (entry->bs_cyl >= lab->d_ncylinders ||
                    455:            entry->bs_trk >= lab->d_ntracks ||
                    456:            entry->bs_offset >= lab->d_traksize)
                    457:                return (-1);
                    458:        for(i=0; i < bm->bs_count; i++) {
                    459:                if(((bm->list[i].bs_cyl == entry->bs_cyl)) &&
                    460:                    (bm->list[i].bs_trk == entry->bs_trk) &&
                    461:                    (bm->list[i].bs_offset == entry->bs_offset)) {
                    462:                        if((int)bm->list[i].bs_how > (int)entry->bs_how)
                    463:                                bm->list[i].bs_how = entry->bs_how;
                    464:                        return (0);
                    465:                }
                    466:        }
                    467:        bm->list[i] = *entry;
                    468:        bm->list[i].bs_alt.cylinder = 0;
                    469:        bm->list[i].bs_alt.track = 0;
                    470:        bm->list[i].bs_alt.sector = 0;
                    471:        bm->bs_count++;
                    472:        qsort((char *)&(bm->list[0]), (unsigned)bm->bs_count,
                    473:            sizeof(bs_entry), cmp_entry);
                    474:        return (1);
                    475: }
                    476: 
                    477: 
                    478: /*
                    479: **     Is_in_map checks to see if a block is known to be bad already.
                    480: */
                    481: 
                    482: boolean is_in_map(dskaddr)
                    483: dskadr *dskaddr;
                    484: {
                    485:        register int    i;
                    486:        fmt_err         temp;
                    487: 
                    488:        for(i=0; i < bad_map->bs_count; i++) {
                    489:                (*C_INFO->decode_pos)(&bad_map->list[i], &temp);
                    490:                if((temp.err_adr.cylinder == dskaddr->cylinder) &&
                    491:                    (temp.err_adr.track == dskaddr->track) &&
                    492:                    (temp.err_adr.sector == dskaddr->sector)) {
                    493:                        return true;
                    494:                }
                    495:        }
                    496:        return false;
                    497: }
                    498: 
                    499: 
                    500: /*
                    501: **
                    502: */
                    503: 
                    504: print_bad_sector_list()
                    505: {
                    506:        register int    i;
                    507:        fmt_err         errloc;
                    508:        register bs_entry *bad;
                    509: 
                    510:        if(bad_map->bs_count == 0) {
                    511:                print("There are no bad sectors in bad sector map.\n");
                    512:                return;
                    513:        }
                    514:        print("The following sector%s known to be bad:\n",
                    515:            (bad_map->bs_count == 1) ? " is" : "s are");
                    516:        indent();
                    517:        for(i=0, bad = bad_map->list; i < bad_map->bs_count; i++, bad++) {
                    518:                (*C_INFO->decode_pos)(bad, &errloc);
                    519:                print("%s %d cn %d tn %d sn %d pos %d len %d ",
                    520:                        errloc.err_stat & HEADER_ERROR ? "Track@" : "Sector",
                    521:                        to_sector(errloc.err_adr),
                    522:                        bad->bs_cyl,
                    523:                        bad->bs_trk,
                    524:                        errloc.err_adr.sector,
                    525:                        bad->bs_offset,
                    526:                        bad->bs_length);
                    527:                if (bad->bs_how == flaw_map)
                    528:                        printf("(flawmap) ");
                    529:                else if (bad->bs_how == scanning)
                    530:                        printf("(verify) ");
                    531:                else
                    532:                        printf("(operator) ");
                    533:                if((bad->bs_alt.cylinder != 0) || (bad->bs_alt.track != 0) ||
                    534:                    (bad->bs_alt.sector != 0)) {
                    535:                        printf("-> ");
                    536:                        printf("cn %d tn %d sn %d", bad->bs_alt.cylinder,
                    537:                            bad->bs_alt.track, bad->bs_alt.sector);
                    538:                }
                    539:                printf("\n");
                    540:        }
                    541:        exdent(1);
                    542: }
                    543: 
                    544: 
                    545: /*
                    546: **     load_free_table checks each block in the bad block relocation area
                    547: ** to see if it is used. If it is, the free relocation block table is updated.
                    548: */
                    549: 
                    550: load_free_table()
                    551: {
                    552:        register int    i, j;
                    553:        fmt_err         temp;
                    554: 
                    555:        /* Clear free table before starting */
                    556:        for(i = 0; i < (lab->d_ntracks * NUMREL); i++) {
                    557:                for(j=0; j < lab->d_nsectors; j++)
                    558:                        free_tbl[i][j].free_status = NOTALLOCATED;
                    559:        }
                    560:        for(i=0; i < bad_map->bs_count; i++)
                    561:                if((bad_map->list[i].bs_alt.cylinder != 0) ||
                    562:                    (bad_map->list[i].bs_alt.track != 0) ||
                    563:                    (bad_map->list[i].bs_alt.sector != 0)) {
                    564:                        (*C_INFO->decode_pos)(&bad_map->list[i], &temp);
                    565:                        allocate(&(bad_map->list[i].bs_alt), temp.err_stat);
                    566:                }
                    567: }
                    568: 
                    569: 
                    570: /*
                    571: **     allocate marks a replacement sector as used.
                    572: */
                    573: 
                    574: allocate(dskaddr, status)
                    575: dskadr *dskaddr;
                    576: long   status;
                    577: {
                    578:        register int    trk, sec;
                    579: 
                    580:        trk = dskaddr->cylinder - (lab->d_ncylinders - NUMSYS);
                    581:        if((trk < 0) || (trk >= NUMREL))
                    582:                return;
                    583:        trk *= lab->d_ntracks;
                    584:        trk += dskaddr->track;
                    585:        if(status & HEADER_ERROR)
                    586:                for(sec=0; sec < lab->d_nsectors; sec++)
                    587:                        free_tbl[trk][sec].free_status = ALLOCATED;
                    588:        else
                    589:                free_tbl[trk][dskaddr->sector].free_status = ALLOCATED;
                    590: }
                    591: 
                    592: 
                    593: /*
                    594: **
                    595: */
                    596: 
                    597: boolean mapping_collision(entry)
                    598: bs_entry       *entry;
                    599: {
                    600:        register int    trk, sec;
                    601:        fmt_err         temp;
                    602: 
                    603:        trk = entry->bs_cyl - (lab->d_ncylinders - NUMSYS);
                    604:        if((trk < 0) || (trk >= NUMREL))
                    605:                return false;
                    606:        trk *= lab->d_ntracks;
                    607:        trk += entry->bs_trk;
                    608:        (*C_INFO->decode_pos)(entry, &temp);
                    609:        /* if this relocation should take up the whole track */
                    610:        if(temp.err_stat & HEADER_ERROR) {
                    611:                for(sec=0; sec < lab->d_nsectors; sec++)
                    612:                        if(free_tbl[trk][sec].free_status == ALLOCATED)
                    613:                                return true;
                    614:        }
                    615:        /* else just check the current sector */
                    616:        else {
                    617:                if(free_tbl[trk][temp.err_adr.sector].free_status == ALLOCATED)
                    618:                        return true;
                    619:        }
                    620:        return false;
                    621: }
                    622: 
                    623: 
                    624: /*
                    625: **
                    626: */
                    627: 
                    628: report_collision()
                    629: {
                    630:        indent();
                    631:        print("Sector resides in relocation area");
                    632:        printf("but it has a sector mapped to it already.\n");
                    633:        print("Please reformat disk with 0 patterns to eliminate problem.\n");
                    634:        exdent(1);
                    635: }
                    636: 
                    637: 
                    638: /*
                    639: **
                    640: */
                    641: 
                    642: add_user_relocations(entry)
                    643: bs_entry       *entry;
                    644: {
                    645:        fmt_err         error;
                    646:        
                    647:        (*C_INFO->decode_pos)(entry, &error);
                    648:        if(is_in_map(&error.err_adr) == false) {
                    649:                if(mapping_collision(entry) == true)
                    650:                        report_collision();
                    651:                entry->bs_how = operator;
                    652:                add_flaw(entry);
                    653:        }
                    654:        else {
                    655:                indent();
                    656:                print("Sector %d is already mapped out!\n",
                    657:                    to_sector(error.err_adr));
                    658:                exdent(1);
                    659:        }
                    660: }
                    661: 
                    662: 
                    663: /*
                    664: **     New_location allocates a replacement block given a bad block address.
                    665: **  The algorithm is fairly simple; it simply searches for the first
                    666: **  free sector that has the same sector number of the bad sector.  If no sector
                    667: **  is found then the drive should be considered bad because of a microcode bug
                    668: **  in the controller that forces us to use the same sector number as the bad
                    669: **  sector for relocation purposes.  Using different tracks and cylinders is ok
                    670: **  of course.
                    671: */
                    672: 
                    673: dskadr *new_location(entry)
                    674: bs_entry       *entry;
                    675: {
                    676:        register int    i, sec;
                    677:        static fmt_err  temp;
                    678:        static dskadr   newaddr;
                    679: 
                    680:        newaddr.cylinder = 0;
                    681:        newaddr.track = 0;
                    682:        newaddr.sector = 0;
                    683:        (*C_INFO->decode_pos)(entry, &temp);
                    684:        /* If it is ouside of the user's data area */
                    685:        if(entry->bs_cyl >= lab->d_ncylinders-NUMSYS) {
                    686:                /* if it is in the relocation area */
                    687:                if(entry->bs_cyl < (lab->d_ncylinders - NUMMAP - NUMMNT)) {
                    688:                        /* mark space as allocated */
                    689:                        allocate(&temp.err_adr, temp.err_stat);
                    690:                        return &temp.err_adr;
                    691:                }
                    692:                /* if it is in the map area forget about it */
                    693:                if(entry->bs_cyl != (lab->d_ncylinders - NUMMAP - NUMMNT))
                    694:                        return &temp.err_adr;
                    695:                /* otherwise treat maintainence cylinder normally */
                    696:        }
                    697:        if(temp.err_stat & (HEADER_ERROR)) {
                    698:                for(i = 0; i < (lab->d_ntracks * NUMREL); i++) {
                    699:                        for(sec=0; sec < lab->d_nsectors; sec++) {
                    700:                                if(free_tbl[i][sec].free_status == ALLOCATED)
                    701:                                        break;
                    702:                        }
                    703:                        if(sec == lab->d_nsectors) {
                    704:                                for(sec = 0; sec < lab->d_nsectors; sec++)
                    705:                                        free_tbl[i][sec].free_status=ALLOCATED;
                    706:                                newaddr.cylinder = i / lab->d_ntracks +
                    707:                                    (lab->d_ncylinders - NUMSYS);
                    708:                                newaddr.track = i % lab->d_ntracks;
                    709:                                break;
                    710:                        }
                    711:                }
                    712:        }
                    713:        else if(C_INFO->type == VDTYPE_VDDC) {
                    714:                for(i = 0; i < (lab->d_ntracks * NUMREL); i++) {
                    715:                        if(free_tbl[i][temp.err_adr.sector].free_status !=
                    716:                            ALLOCATED) {
                    717:                                free_tbl[i][temp.err_adr.sector].free_status =
                    718:                                    ALLOCATED;
                    719:                                newaddr.cylinder = i / lab->d_ntracks +
                    720:                                    (lab->d_ncylinders - NUMSYS);
                    721:                                newaddr.track = i % lab->d_ntracks;
                    722:                                newaddr.sector = temp.err_adr.sector;
                    723:                                break;
                    724:                        }       
                    725:                }
                    726:        }
                    727:        else {
                    728:                for(i = 0; i < (lab->d_ntracks * NUMREL); i++) {
                    729:                        for(sec=0; sec < lab->d_nsectors; sec++)
                    730:                                if(free_tbl[i][sec].free_status != ALLOCATED)
                    731:                                        break;
                    732:                        if(sec < lab->d_nsectors) {
                    733:                                free_tbl[i][sec].free_status = ALLOCATED;
                    734:                                newaddr.cylinder = i / lab->d_ntracks +
                    735:                                    (lab->d_ncylinders - NUMSYS);
                    736:                                newaddr.track = i % lab->d_ntracks;
                    737:                                newaddr.sector = sec;
                    738:                                break;
                    739:                        }
                    740:                }
                    741:        }
                    742:        return &newaddr;
                    743: }

unix.superglobalmegacorp.com

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