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

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

unix.superglobalmegacorp.com

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