Annotation of researchv10no/cmd/worm/scsi/cold.c, revision 1.1.1.1

1.1       root        1: #define        _POSIX_SOURCE
                      2: #include       <stddef.h>
                      3: #include       <stdlib.h>
                      4: #include       <unistd.h>
                      5: #include       <stdio.h>
                      6: #include       <string.h>
                      7: #include       <ctype.h>
                      8: #include       "jukeface.h"
                      9: #include       "jukebox.h"
                     10: #include       "tcl.h"
                     11: #include       "generic/fns.h"
                     12: 
                     13: static sort(char *buf);
                     14: 
                     15: j_cold(Jukebox *j, char *type, char *err)
                     16: {
                     17:        int side;
                     18:        int drive, sh, nsh;
                     19:        int n;
                     20:        char vol_id[512];
                     21:        char *didit;
                     22: 
                     23:        if(j_drstatus(j, err))
                     24:                return(-1);
                     25:        if(j_shstatus(j, err))
                     26:                return(-1);
                     27:        /* first clear out nonexistent labels */
                     28:        n = 0;
                     29:        didit = (char *)malloc(j->nshelves*sizeof(char));
                     30:        for(sh = 0; sh < j->nshelves; sh++){
                     31:                if(j->shelves[sh]){
                     32:                        n++;
                     33:                        j->names[sh] = "there";
                     34:                } else
                     35:                        j->names[sh] = 0;
                     36:                didit[sh] = 0;
                     37:        }
                     38:        printf("%d disks in shelves.\n", n);
                     39:        /* second, clear the drives */
                     40:        for(sh = 0; sh < j->nshelves; sh++)
                     41:                if(j->shelves[sh] == 0)
                     42:                        break;
                     43:        for(drive = 0; drive < j->nluns; drive++){
                     44:                if(!j->luns[drive].occupied)
                     45:                        continue;               /* no disk in drive */
                     46:                if(j->luns[drive].shelf < 0){
                     47:                        if(j_dr_to_sh(drive, sh, SIDEA, err))
                     48:                                return(-1);
                     49:                        for(sh++; sh < j->nshelves; sh++)
                     50:                                if(j->shelves[sh] == 0)
                     51:                                        break;
                     52:                        n++;
                     53:                } else
                     54:                        if(j_dr_to_sh(drive, -1, SIDEA, err))
                     55:                                return(-1);
                     56:        }
                     57:        drive = j->nluns-1;
                     58:        if(isdigit(*type)){     /* just do one shelf */
                     59:                sh = atol(type);
                     60:                printf("single shelf %d reload\n", sh);
                     61:                if(j_rdshelves(j, err))
                     62:                        return(-1);
                     63:                if(getvol(sh, drive, vol_id, &side)){
                     64:                        strcpy(err, vol_id);
                     65:                        return(-1);
                     66:                }
                     67:                printf("%s@%d -> %d\n", vol_id, sh, sh);
                     68:                if(j_dr_to_sh(drive, -1, side, err) < 0)
                     69:                        return(-1);
                     70:                j->names[sh] = strdup(vol_id);
                     71:                j->shelves[sh] = 1;
                     72:                j_wrshelf = 1;
                     73:                return(0);
                     74:        }
                     75:        printf("reloading %d disks.\n", n);
                     76:        side = SIDEA;
                     77:        j_wrshelf = 1;
                     78:        for(sh = 0; sh < j->nshelves; sh++){
                     79:                if(didit[sh])
                     80:                        continue;
                     81:                j->names[sh] = 0;
                     82:                if(j->shelves[sh]){
                     83:                        printf("%d: ", sh); fflush(stdout);
                     84:                        if(getvol(sh, drive, vol_id, &side)){
                     85:                                strcpy(err, vol_id);
                     86:                                return(-1);
                     87:                        }
                     88:                        j->shelves[sh] = 0;
                     89:                        switch(*type)
                     90:                        {
                     91:                        case 'c':
                     92:                                for(nsh = 0; j->shelves[nsh]; nsh++)
                     93:                                        ;
                     94:                                break;
                     95:                        case 's':
                     96:                        case 'r':
                     97:                                while(j->shelves[nsh = nrand(j->nshelves)])
                     98:                                        ;
                     99:                                break;
                    100:                        case 'u':
                    101:                        default:
                    102:                                nsh = sh;
                    103:                                break;
                    104:                        }
                    105:                        printf("%s@%d -> %d\n", vol_id, sh, nsh);
                    106:                        if(j_dr_to_sh(drive, nsh, side, err) < 0)
                    107:                                return(-1);
                    108:                        j->names[nsh] = strdup(vol_id);
                    109:                        j->shelves[nsh] = 1;
                    110:                        didit[nsh] = 1;
                    111:                        sleep(5);
                    112:                }
                    113:        }
                    114:        printf("process any new disks.\n");
                    115:        if(j_warm(j, err))
                    116:                return(-1);
                    117: /*     if(type == 's')
                    118:                return(sort(err));
                    119: */
                    120:        return(0);
                    121: } 
                    122: 
                    123: getvol(int sh, int drive, char *vol_id, int *side)
                    124: {
                    125:        int i;
                    126:        char buf[512];
                    127: 
                    128:        if(j_sh_to_dr(sh, SIDEA, drive, vol_id) < 0)
                    129:                return(-1);
                    130:        if((i = j_rvolid(drive, buf)) < 0)
                    131:                goto softerr;
                    132:        if(i == 0)
                    133:                *side = SIDEA;
                    134:        else {
                    135:                *side = SIDEB;
                    136:                if(j_dr_to_sh(drive, sh, SIDEA, vol_id) < 0)
                    137:                        return(-1);
                    138:                if(j_sh_to_dr(sh, SIDEB, drive, vol_id) < 0)
                    139:                        return(-1);
                    140:                if((i = j_rvolid(drive, buf)) < 0)
                    141:                        goto softerr;
                    142:        }
                    143:        if(i > 0)
                    144:                strcpy(vol_id, UNALLOCATED);
                    145:        else {
                    146:                strcpy(vol_id, buf);
                    147:                i = strlen(vol_id)-1;
                    148:                if(i < 0){
                    149:                        sprintf(buf, "apparently good superblock but null vol_id");
                    150:                        goto softerr;
                    151:                } else if(vol_id[i] == 'a')
                    152:                        vol_id[i] = 0;
                    153:                else if(vol_id[i] == 'b'){
                    154:                        vol_id[i] = 0;
                    155:                        *side = !*side;
                    156:                } else {
                    157:                        sprintf(buf, "vol_id '%s' must end in a or b", vol_id);
                    158:                        strcpy(vol_id, buf);
                    159:                        return(-1);
                    160:                }
                    161:        }
                    162:        return(0);
                    163: softerr:
                    164:        *side = SIDEA;
                    165:        fprintf(stderr, "error in reading shelf %d: %s; proceeding\n", sh, buf);
                    166:        sprintf(vol_id, "DISK_ERROR%d", sh);
                    167:        j_reset();
                    168:        return(0);
                    169: }
                    170: #ifdef CRAP
                    171: static int index[j->nshelves];
                    172: static
                    173: cmp(int *a, int *b)
                    174: {
                    175:        char *sa = j->shelves[*a], *sb = j->shelves[*b];
                    176: 
                    177:        if((sa == 0) && (sb == 0)) return(0);
                    178:        if(sa == 0) return(-1);
                    179:        if(sb == 0) return(1);
                    180:        return(strcmp(sa, sb));
                    181: }
                    182: 
                    183: static char *disk[8];
                    184: 
                    185: static
                    186: sd(int a, int b, char *err)
                    187: {
                    188:        disk[b] = j->shelves[a];
                    189:        return(j->shelves_to_drive(a, SIDEB, b, err));
                    190: }
                    191: static
                    192: ds(int a, int b, char *err)
                    193: {
                    194:        j->shelves[b] = disk[a];
                    195:        return(j_drive_to_shelf(a, b, SIDEB, err));
                    196: }
                    197: 
                    198: static
                    199: sort(char *errbuf)
                    200: {
                    201:        int i, j, org;
                    202: 
                    203:        for(i = 0; i < j->nshelves; i++)
                    204:                index[i] = i;
                    205:        qsort(index, j->nshelves, sizeof index[0], cmp);
                    206:        for(i = 0; i < j->nshelves; i++){
                    207:                if(index[i] < 0) continue;
                    208:                if(sd(org = i, NLUN-1, errbuf) < 0)
                    209:                        return(-1);
                    210:                j = index[i];
                    211:                index[i] = -1;
                    212:                while(j != org){
                    213:                        if(sd(j, NLUN-2, errbuf) < 0)
                    214:                                return(-1);
                    215:                        if(ds(NLUN-2, i, errbuf) < 0)
                    216:                                return(-1);
                    217:                        i = j;
                    218:                        if(index[i] < 0)
                    219:                                break;
                    220:                        j = index[i];
                    221:                        index[i] = -1;
                    222:                }
                    223:                if(ds(NLUN-1, i, errbuf) < 0)
                    224:                        return(-1);
                    225:        }
                    226:        return(0);
                    227: }
                    228: #endif

unix.superglobalmegacorp.com

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