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

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

unix.superglobalmegacorp.com

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