Annotation of 42BSD/etc/icheck.c, revision 1.1.1.1

1.1       root        1: static char *sccsid = "@(#)icheck.c    2.4 (Berkeley) 11/18/82";
                      2: 
                      3: /*
                      4:  * icheck
                      5:  */
                      6: #define        NB      500
                      7: #define        MAXFN   500
                      8: #define        MAXNINDIR       (MAXBSIZE / sizeof (daddr_t))
                      9: 
                     10: #ifndef STANDALONE
                     11: #include <stdio.h>
                     12: #endif
                     13: #ifndef SIMFS
                     14: #include <sys/param.h>
                     15: #include <sys/inode.h>
                     16: #include <sys/fs.h>
                     17: #else
                     18: #include "../h/param.h"
                     19: #include "../h/inode.h"
                     20: #include "../h/fs.h"
                     21: #endif
                     22: 
                     23: union {
                     24:        struct  fs sb;
                     25:        char pad[MAXBSIZE];
                     26: } sbun;
                     27: #define        sblock sbun.sb
                     28: 
                     29: union {
                     30:        struct  cg cg;
                     31:        char pad[MAXBSIZE];
                     32: } cgun;
                     33: #define        cgrp cgun.cg
                     34: 
                     35: struct dinode  itab[MAXIPG];
                     36: daddr_t        blist[NB];
                     37: daddr_t        fsblist[NB];
                     38: char   *bmap;
                     39: 
                     40: int    mflg;
                     41: int    sflg;
                     42: int    dflg;
                     43: int    fi;
                     44: ino_t  ino;
                     45: int    cginit;
                     46: 
                     47: ino_t  nrfile;
                     48: ino_t  ndfile;
                     49: ino_t  nbfile;
                     50: ino_t  ncfile;
                     51: ino_t  nlfile;
                     52: 
                     53: daddr_t        nblock;
                     54: daddr_t        nfrag;
                     55: daddr_t        nindir;
                     56: daddr_t        niindir;
                     57: 
                     58: daddr_t        nffree;
                     59: daddr_t        nbfree;
                     60: 
                     61: daddr_t        ndup;
                     62: 
                     63: int    nerror;
                     64: 
                     65: extern int inside[], around[];
                     66: extern unsigned char *fragtbl[];
                     67: 
                     68: long   atol();
                     69: #ifndef STANDALONE
                     70: char   *malloc();
                     71: char   *calloc();
                     72: #endif
                     73: 
                     74: main(argc, argv)
                     75:        int argc;
                     76:        char *argv[];
                     77: {
                     78:        register i;
                     79:        long n;
                     80: 
                     81:        blist[0] = -1;
                     82: #ifndef STANDALONE
                     83:        while (--argc) {
                     84:                argv++;
                     85:                if (**argv=='-')
                     86:                switch ((*argv)[1]) {
                     87:                case 'd':
                     88:                        dflg++;
                     89:                        continue;
                     90: 
                     91:                case 'm':
                     92:                        mflg++;
                     93:                        continue;
                     94: 
                     95:                case 's':
                     96:                        sflg++;
                     97:                        continue;
                     98: 
                     99:                case 'b':
                    100:                        for(i=0; i<NB; i++) {
                    101:                                n = atol(argv[1]);
                    102:                                if(n == 0)
                    103:                                        break;
                    104:                                blist[i] = n;
                    105:                                argv++;
                    106:                                argc--;
                    107:                        }
                    108:                        blist[i] = -1;
                    109:                        continue;
                    110: 
                    111:                default:
                    112:                        printf("Bad flag\n");
                    113:                }
                    114:                check(*argv);
                    115:        }
                    116: #else
                    117:        {
                    118:                static char fname[128];
                    119: 
                    120:                printf("File: ");
                    121:                gets(fname);
                    122:                check(fname);
                    123:        }
                    124: #endif
                    125:        return(nerror);
                    126: }
                    127: 
                    128: check(file)
                    129:        char *file;
                    130: {
                    131:        register i, j, c;
                    132:        daddr_t d, cgd, cbase, b;
                    133:        long n;
                    134:        char buf[BUFSIZ];
                    135: 
                    136:        fi = open(file, sflg ? 2 : 0);
                    137:        if (fi < 0) {
                    138:                perror(file);
                    139:                nerror |= 04;
                    140:                return;
                    141:        }
                    142:        printf("%s:\n", file);
                    143:        nrfile = 0;
                    144:        ndfile = 0;
                    145:        ncfile = 0;
                    146:        nbfile = 0;
                    147:        nlfile = 0;
                    148: 
                    149:        nblock = 0;
                    150:        nfrag = 0;
                    151:        nindir = 0;
                    152:        niindir = 0;
                    153: 
                    154:        ndup = 0;
                    155: #ifndef STANDALONE
                    156:        sync();
                    157: #endif
                    158:        getsb(&sblock, file);
                    159:        if (nerror)
                    160:                return;
                    161:        for (n=0; blist[n] != -1; n++)
                    162:                fsblist[n] = dbtofsb(&sblock, blist[n]);
                    163:        ino = 0;
                    164:        n = roundup(howmany(sblock.fs_size, NBBY), sizeof(short));
                    165: #ifdef STANDALONE
                    166:        bmap = NULL;
                    167: #else
                    168:        bmap = malloc((unsigned)n);
                    169: #endif
                    170:        if (bmap==NULL) {
                    171:                printf("Not enough core; duplicates unchecked\n");
                    172:                dflg++;
                    173:                if (sflg) {
                    174:                        printf("No Updates\n");
                    175:                        sflg = 0;
                    176:                }
                    177:        }
                    178:        ino = 0;
                    179:        cginit = 1;
                    180:        if (!dflg) {
                    181:                for (i = 0; i < (unsigned)n; i++)
                    182:                        bmap[i] = 0;
                    183:                for (c = 0; c < sblock.fs_ncg; c++) {
                    184:                        cgd = cgtod(&sblock, c);
                    185:                        if (c == 0)
                    186:                                d = cgbase(&sblock, c);
                    187:                        else
                    188:                                d = cgsblock(&sblock, c);
                    189:                        sprintf(buf, "spare super block %d", c);
                    190:                        for (; d < cgd; d += sblock.fs_frag)
                    191:                                chk(d, buf, sblock.fs_bsize);
                    192:                        d = cgimin(&sblock, c);
                    193:                        sprintf(buf, "cylinder group %d", c);
                    194:                        while (cgd < d) {
                    195:                                chk(cgd, buf, sblock.fs_bsize);
                    196:                                cgd += sblock.fs_frag;
                    197:                        }
                    198:                        d = cgdmin(&sblock, c);
                    199:                        i = INOPB(&sblock);
                    200:                        for (; cgd < d; cgd += sblock.fs_frag) {
                    201:                                sprintf(buf, "inodes %d-%d", ino, ino + i);
                    202:                                chk(cgd, buf, sblock.fs_bsize);
                    203:                                ino += i;
                    204:                        }
                    205:                        if (c == 0) {
                    206:                                d += howmany(sblock.fs_cssize, sblock.fs_fsize);
                    207:                                for (; cgd < d; cgd++)
                    208:                                        chk(cgd, "csum", sblock.fs_fsize);
                    209:                        }
                    210:                }
                    211:        }
                    212:        ino = 0;
                    213:        cginit = 0;
                    214:        for (c = 0; c < sblock.fs_ncg; c++) {
                    215:                bread(fsbtodb(&sblock, cgimin(&sblock, c)), (char *)itab,
                    216:                    sblock.fs_ipg * sizeof (struct dinode));
                    217:                for (j=0; j < sblock.fs_ipg; j++) {
                    218:                        pass1(&itab[j]);
                    219:                        ino++;
                    220:                }
                    221:        }
                    222:        ino = 0;
                    223: #ifndef STANDALONE
                    224:        sync();
                    225: #endif
                    226:        if (sflg) {
                    227:                makecg();
                    228:                close(fi);
                    229: #ifndef STANDALONE
                    230:                if (bmap)
                    231:                        free(bmap);
                    232: #endif
                    233:                return;
                    234:        }
                    235:        nffree = 0;
                    236:        nbfree = 0;
                    237:        for (c = 0; c < sblock.fs_ncg; c++) {
                    238:                cbase = cgbase(&sblock, c);
                    239:                bread(fsbtodb(&sblock, cgtod(&sblock, c)), (char *)&cgrp,
                    240:                        sblock.fs_cgsize);
                    241:                if (cgrp.cg_magic != CG_MAGIC)
                    242:                        printf("cg %d: bad magic number\n", c);
                    243:                for (b = 0; b < sblock.fs_fpg; b += sblock.fs_frag) {
                    244:                        if (isblock(&sblock, cgrp.cg_free,
                    245:                            b / sblock.fs_frag)) {
                    246:                                nbfree++;
                    247:                                chk(cbase+b, "free block", sblock.fs_bsize);
                    248:                        } else {
                    249:                                for (d = 0; d < sblock.fs_frag; d++)
                    250:                                        if (isset(cgrp.cg_free, b+d)) {
                    251:                                                chk(cbase+b+d, "free frag", sblock.fs_fsize);
                    252:                                                nffree++;
                    253:                                        }
                    254:                        }
                    255:                }
                    256:        }
                    257:        close(fi);
                    258: #ifndef STANDALONE
                    259:        if (bmap)
                    260:                free(bmap);
                    261: #endif
                    262: 
                    263:        i = nrfile + ndfile + ncfile + nbfile + nlfile;
                    264: #ifndef STANDALONE
                    265:        printf("files %6u (r=%u,d=%u,b=%u,c=%u,sl=%u)\n",
                    266:                i, nrfile, ndfile, nbfile, ncfile, nlfile);
                    267: #else
                    268:        printf("files %u (r=%u,d=%u,b=%u,c=%u,sl=%u)\n",
                    269:                i, nrfile, ndfile, nbfile, ncfile, nlfile);
                    270: #endif
                    271:        n = (nblock + nindir + niindir) * sblock.fs_frag + nfrag;
                    272: #ifdef STANDALONE
                    273:        printf("used %ld (i=%ld,ii=%ld,b=%ld,f=%ld)\n",
                    274:                n, nindir, niindir, nblock, nfrag);
                    275:        printf("free %ld (b=%ld,f=%ld)\n", nffree + sblock.fs_frag * nbfree,
                    276:            nbfree, nffree);
                    277: #else
                    278:        printf("used %7ld (i=%ld,ii=%ld,b=%ld,f=%ld)\n",
                    279:                n, nindir, niindir, nblock, nfrag);
                    280:        printf("free %7ld (b=%ld,f=%ld)\n", nffree + sblock.fs_frag * nbfree,
                    281:            nbfree, nffree);
                    282: #endif
                    283:        if(!dflg) {
                    284:                n = 0;
                    285:                for (d = 0; d < sblock.fs_size; d++)
                    286:                        if(!duped(d, sblock.fs_fsize)) {
                    287:                                if(mflg)
                    288:                                        printf("%ld missing\n", d);
                    289:                                n++;
                    290:                        }
                    291:                printf("missing%5ld\n", n);
                    292:        }
                    293: }
                    294: 
                    295: pass1(ip)
                    296:        register struct dinode *ip;
                    297: {
                    298:        daddr_t ind1[MAXNINDIR];
                    299:        daddr_t ind2[MAXNINDIR];
                    300:        daddr_t db, ib;
                    301:        register int i, j, k, siz;
                    302:        int lbn;
                    303:        char buf[BUFSIZ];
                    304: 
                    305:        i = ip->di_mode & IFMT;
                    306:        if(i == 0)
                    307:                return;
                    308:        switch (i) {
                    309:        case IFCHR:
                    310:                ncfile++;
                    311:                return;
                    312:        case IFBLK:
                    313:                nbfile++;
                    314:                return;
                    315:        case IFDIR:
                    316:                ndfile++;
                    317:                break;
                    318:        case IFREG:
                    319:                nrfile++;
                    320:                break;
                    321:        case IFLNK:
                    322:                nlfile++;
                    323:                break;
                    324:        default:
                    325:                printf("bad mode %u\n", ino);
                    326:                return;
                    327:        }
                    328:        for (i = 0; i < NDADDR; i++) {
                    329:                db = ip->di_db[i];
                    330:                if (db == 0)
                    331:                        continue;
                    332:                siz = dblksize(&sblock, ip, i);
                    333:                sprintf(buf, "logical data block %d", i);
                    334:                chk(db, buf, siz);
                    335:                if (siz == sblock.fs_bsize)
                    336:                        nblock++;
                    337:                else
                    338:                        nfrag += howmany(siz, sblock.fs_fsize);
                    339:        }
                    340:        for(i = 0; i < NIADDR; i++) {
                    341:                ib = ip->di_ib[i];
                    342:                if (ib == 0)
                    343:                        continue;
                    344:                if (chk(ib, "1st indirect", sblock.fs_bsize))
                    345:                        continue;
                    346:                bread(fsbtodb(&sblock, ib), (char *)ind1, sblock.fs_bsize);
                    347:                nindir++;
                    348:                for (j = 0; j < NINDIR(&sblock); j++) {
                    349:                        ib = ind1[j];
                    350:                        if (ib == 0)
                    351:                                continue;
                    352:                        if (i == 0) {
                    353:                                lbn = NDADDR + j;
                    354:                                siz = dblksize(&sblock, ip, lbn);
                    355:                                sprintf(buf, "logical data block %d", lbn);
                    356:                                chk(ib, buf, siz);
                    357:                                if (siz == sblock.fs_bsize)
                    358:                                        nblock++;
                    359:                                else
                    360:                                        nfrag += howmany(siz, sblock.fs_fsize);
                    361:                                continue;
                    362:                        }
                    363:                        if (chk(ib, "2nd indirect", sblock.fs_bsize))
                    364:                                continue;
                    365:                        bread(fsbtodb(&sblock, ib), (char *)ind2,
                    366:                                sblock.fs_bsize);
                    367:                        niindir++;
                    368:                        for (k = 0; k < NINDIR(&sblock); k++) {
                    369:                                ib = ind2[k];
                    370:                                if (ib == 0)
                    371:                                        continue;
                    372:                                lbn = NDADDR + NINDIR(&sblock) * (i + j) + k;
                    373:                                siz = dblksize(&sblock, ip, lbn);
                    374:                                sprintf(buf, "logical data block %d", lbn);
                    375:                                chk(ib, buf, siz);
                    376:                                if (siz == sblock.fs_bsize)
                    377:                                        nblock++;
                    378:                                else
                    379:                                        nfrag += howmany(siz, sblock.fs_fsize);
                    380:                        }
                    381:                }
                    382:        }
                    383: }
                    384: 
                    385: chk(bno, s, size)
                    386:        daddr_t bno;
                    387:        char *s;
                    388:        int size;
                    389: {
                    390:        register n, cg;
                    391:        int frags;
                    392: 
                    393:        cg = dtog(&sblock, bno);
                    394:        if (cginit == 0 && bno >= sblock.fs_frag * sblock.fs_size) {
                    395:                printf("%ld bad; inode=%u, class=%s\n", bno, ino, s);
                    396:                return(1);
                    397:        }
                    398:        frags = numfrags(&sblock, size);
                    399:        if (frags == sblock.fs_frag) {
                    400:                if (duped(bno, size)) {
                    401:                        printf("%ld dup block; inode=%u, class=%s\n",
                    402:                            bno, ino, s);
                    403:                        ndup += sblock.fs_frag;
                    404:                }
                    405:        } else {
                    406:                for (n = 0; n < frags; n++) {
                    407:                        if (duped(bno + n, sblock.fs_fsize)) {
                    408:                                printf("%ld dup frag; inode=%u, class=%s\n",
                    409:                                    bno, ino, s);
                    410:                                ndup++;
                    411:                        }
                    412:                }
                    413:        }
                    414:        for (n=0; blist[n] != -1; n++)
                    415:                if (fsblist[n] >= bno && fsblist[n] < bno + frags)
                    416:                        printf("%ld arg; frag %d of %d, inode=%u, class=%s\n",
                    417:                                blist[n], fsblist[n] - bno, frags, ino, s);
                    418:        return(0);
                    419: }
                    420: 
                    421: duped(bno, size)
                    422:        daddr_t bno;
                    423:        int size;
                    424: {
                    425:        if(dflg)
                    426:                return(0);
                    427:        if (size != sblock.fs_fsize && size != sblock.fs_bsize)
                    428:                printf("bad size %d to duped\n", size);
                    429:        if (size == sblock.fs_fsize) {
                    430:                if (isset(bmap, bno))
                    431:                        return(1);
                    432:                setbit(bmap, bno);
                    433:                return (0);
                    434:        }
                    435:        if (bno % sblock.fs_frag != 0)
                    436:                printf("bad bno %d to duped\n", bno);
                    437:        if (isblock(&sblock, bmap, bno/sblock.fs_frag))
                    438:                return (1);
                    439:        setblock(&sblock, bmap, bno/sblock.fs_frag);
                    440:        return(0);
                    441: }
                    442: 
                    443: makecg()
                    444: {
                    445:        int c, blk;
                    446:        daddr_t dbase, d, dlower, dupper, dmax;
                    447:        long i, j, s;
                    448:        register struct csum *cs;
                    449:        register struct dinode *dp;
                    450: 
                    451:        sblock.fs_cstotal.cs_nbfree = 0;
                    452:        sblock.fs_cstotal.cs_nffree = 0;
                    453:        sblock.fs_cstotal.cs_nifree = 0;
                    454:        sblock.fs_cstotal.cs_ndir = 0;
                    455:        for (c = 0; c < sblock.fs_ncg; c++) {
                    456:                dbase = cgbase(&sblock, c);
                    457:                dmax = dbase + sblock.fs_fpg;
                    458:                if (dmax > sblock.fs_size) {
                    459:                        for ( ; dmax >= sblock.fs_size; dmax--)
                    460:                                clrbit(cgrp.cg_free, dmax - dbase);
                    461:                        dmax++;
                    462:                }
                    463:                dlower = cgsblock(&sblock, c) - dbase;
                    464:                dupper = cgdmin(&sblock, c) - dbase;
                    465:                cs = &sblock.fs_cs(&sblock, c);
                    466:                cgrp.cg_time = time(0);
                    467:                cgrp.cg_magic = CG_MAGIC;
                    468:                cgrp.cg_cgx = c;
                    469:                if (c == sblock.fs_ncg - 1)
                    470:                        cgrp.cg_ncyl = sblock.fs_ncyl % sblock.fs_cpg;
                    471:                else
                    472:                        cgrp.cg_ncyl = sblock.fs_cpg;
                    473:                cgrp.cg_niblk = sblock.fs_ipg;
                    474:                cgrp.cg_ndblk = dmax - dbase;
                    475:                cgrp.cg_cs.cs_ndir = 0;
                    476:                cgrp.cg_cs.cs_nffree = 0;
                    477:                cgrp.cg_cs.cs_nbfree = 0;
                    478:                cgrp.cg_cs.cs_nifree = 0;
                    479:                cgrp.cg_rotor = 0;
                    480:                cgrp.cg_frotor = 0;
                    481:                cgrp.cg_irotor = 0;
                    482:                for (i = 0; i < sblock.fs_frag; i++)
                    483:                        cgrp.cg_frsum[i] = 0;
                    484:                bread(fsbtodb(&sblock, cgimin(&sblock, c)), (char *)itab,
                    485:                      sblock.fs_ipg * sizeof(struct dinode));
                    486:                for (i = 0; i < sblock.fs_ipg; i++) {
                    487:                        cgrp.cg_cs.cs_nifree++;
                    488:                        clrbit(cgrp.cg_iused, i);
                    489:                        dp = &itab[i];
                    490:                        if ((dp->di_mode & IFMT) != 0) {
                    491:                                if ((dp->di_mode & IFMT) == IFDIR)
                    492:                                        cgrp.cg_cs.cs_ndir++;
                    493:                                cgrp.cg_cs.cs_nifree--;
                    494:                                setbit(cgrp.cg_iused, i);
                    495:                                continue;
                    496:                        }
                    497:                }
                    498:                while (i < MAXIPG) {
                    499:                        clrbit(cgrp.cg_iused, i);
                    500:                        i++;
                    501:                }
                    502:                if (c == 0)
                    503:                        for (i = 0; i < ROOTINO; i++) {
                    504:                                setbit(cgrp.cg_iused, i);
                    505:                                cgrp.cg_cs.cs_nifree--;
                    506:                        }
                    507:                for (s = 0; s < MAXCPG; s++) {
                    508:                        cgrp.cg_btot[s] = 0;
                    509:                        for (i = 0; i < NRPOS; i++)
                    510:                                cgrp.cg_b[s][i] = 0;
                    511:                }
                    512:                if (c == 0) {
                    513:                        dupper += howmany(sblock.fs_cssize, sblock.fs_fsize);
                    514:                }
                    515:                for (d = dlower; d < dupper; d++)
                    516:                        clrbit(cgrp.cg_free, d);
                    517:                for (d = 0; (d + sblock.fs_frag) <= dmax - dbase;
                    518:                    d += sblock.fs_frag) {
                    519:                        j = 0;
                    520:                        for (i = 0; i < sblock.fs_frag; i++) {
                    521:                                if (!isset(bmap, dbase + d + i)) {
                    522:                                        setbit(cgrp.cg_free, d + i);
                    523:                                        j++;
                    524:                                } else
                    525:                                        clrbit(cgrp.cg_free, d+i);
                    526:                        }
                    527:                        if (j == sblock.fs_frag) {
                    528:                                cgrp.cg_cs.cs_nbfree++;
                    529:                                cgrp.cg_btot[cbtocylno(&sblock, d)]++;
                    530:                                cgrp.cg_b[cbtocylno(&sblock, d)]
                    531:                                    [cbtorpos(&sblock, d)]++;
                    532:                        } else if (j > 0) {
                    533:                                cgrp.cg_cs.cs_nffree += j;
                    534:                                blk = blkmap(&sblock, cgrp.cg_free, d);
                    535:                                fragacct(&sblock, blk, cgrp.cg_frsum, 1);
                    536:                        }
                    537:                }
                    538:                for (j = d; d < dmax - dbase; d++) {
                    539:                        if (!isset(bmap, dbase + d)) {
                    540:                                setbit(cgrp.cg_free, d);
                    541:                                cgrp.cg_cs.cs_nffree++;
                    542:                        } else
                    543:                                clrbit(cgrp.cg_free, d);
                    544:                }
                    545:                for (; d % sblock.fs_frag != 0; d++)
                    546:                        clrbit(cgrp.cg_free, d);
                    547:                if (j != d) {
                    548:                        blk = blkmap(&sblock, cgrp.cg_free, j);
                    549:                        fragacct(&sblock, blk, cgrp.cg_frsum, 1);
                    550:                }
                    551:                for (d /= sblock.fs_frag; d < MAXBPG(&sblock); d ++)
                    552:                        clrblock(&sblock, cgrp.cg_free, d);
                    553:                sblock.fs_cstotal.cs_nffree += cgrp.cg_cs.cs_nffree;
                    554:                sblock.fs_cstotal.cs_nbfree += cgrp.cg_cs.cs_nbfree;
                    555:                sblock.fs_cstotal.cs_nifree += cgrp.cg_cs.cs_nifree;
                    556:                sblock.fs_cstotal.cs_ndir += cgrp.cg_cs.cs_ndir;
                    557:                *cs = cgrp.cg_cs;
                    558:                bwrite(fsbtodb(&sblock, cgtod(&sblock, c)), &cgrp,
                    559:                        sblock.fs_cgsize);
                    560:        }
                    561:        for (i = 0, j = 0; i < sblock.fs_cssize; i += sblock.fs_bsize, j++) {
                    562:                bwrite(fsbtodb(&sblock, sblock.fs_csaddr + j * sblock.fs_frag),
                    563:                    (char *)sblock.fs_csp[j],
                    564:                    sblock.fs_cssize - i < sblock.fs_bsize ?
                    565:                    sblock.fs_cssize - i : sblock.fs_bsize);
                    566:        }
                    567:        sblock.fs_ronly = 0;
                    568:        sblock.fs_fmod = 0;
                    569:        bwrite(SBLOCK, (char *)&sblock, SBSIZE);
                    570: }
                    571: 
                    572: /*
                    573:  * update the frsum fields to reflect addition or deletion 
                    574:  * of some frags
                    575:  */
                    576: fragacct(fs, fragmap, fraglist, cnt)
                    577:        struct fs *fs;
                    578:        int fragmap;
                    579:        long fraglist[];
                    580:        int cnt;
                    581: {
                    582:        int inblk;
                    583:        register int field, subfield;
                    584:        register int siz, pos;
                    585: 
                    586:        inblk = (int)(fragtbl[fs->fs_frag][fragmap] << 1);
                    587:        fragmap <<= 1;
                    588:        for (siz = 1; siz < fs->fs_frag; siz++) {
                    589:                if ((inblk & (1 << (siz + (fs->fs_frag % NBBY)))) == 0)
                    590:                        continue;
                    591:                field = around[siz];
                    592:                subfield = inside[siz];
                    593:                for (pos = siz; pos <= fs->fs_frag; pos++) {
                    594:                        if ((fragmap & field) == subfield) {
                    595:                                fraglist[siz] += cnt;
                    596:                                pos += siz;
                    597:                                field <<= siz;
                    598:                                subfield <<= siz;
                    599:                        }
                    600:                        field <<= 1;
                    601:                        subfield <<= 1;
                    602:                }
                    603:        }
                    604: }
                    605: 
                    606: getsb(fs, file)
                    607:        register struct fs *fs;
                    608:        char *file;
                    609: {
                    610:        int i, j, size;
                    611: 
                    612:        if (bread(SBLOCK, fs, SBSIZE)) {
                    613:                printf("bad super block");
                    614:                perror(file);
                    615:                nerror |= 04;
                    616:                return;
                    617:        }
                    618:        if (fs->fs_magic != FS_MAGIC) {
                    619:                printf("%s: bad magic number\n", file);
                    620:                nerror |= 04;
                    621:                return;
                    622:        }
                    623:        for (i = 0, j = 0; i < sblock.fs_cssize; i += sblock.fs_bsize, j++) {
                    624:                size = sblock.fs_cssize - i < sblock.fs_bsize ?
                    625:                    sblock.fs_cssize - i : sblock.fs_bsize;
                    626:                sblock.fs_csp[j] = (struct csum *)calloc(1, size);
                    627:                bread(fsbtodb(fs, fs->fs_csaddr + (j * fs->fs_frag)),
                    628:                      (char *)fs->fs_csp[j], size);
                    629:        }
                    630: }
                    631: 
                    632: bwrite(blk, buf, size)
                    633:        char *buf;
                    634:        daddr_t blk;
                    635:        register size;
                    636: {
                    637:        if (lseek(fi, blk * DEV_BSIZE, 0) < 0) {
                    638:                perror("FS SEEK");
                    639:                return(1);
                    640:        }
                    641:        if (write(fi, buf, size) != size) {
                    642:                perror("FS WRITE");
                    643:                return(1);
                    644:        }
                    645:        return (0);
                    646: }
                    647: 
                    648: bread(bno, buf, cnt)
                    649:        daddr_t bno;
                    650:        char *buf;
                    651: {
                    652:        register i;
                    653: 
                    654:        lseek(fi, bno * DEV_BSIZE, 0);
                    655:        if ((i = read(fi, buf, cnt)) != cnt) {
                    656:                if (sflg) {
                    657:                        printf("No Update\n");
                    658:                        sflg = 0;
                    659:                }
                    660:                for(i=0; i<sblock.fs_bsize; i++)
                    661:                        buf[i] = 0;
                    662:                return (1);
                    663:        }
                    664:        return (0);
                    665: }
                    666: 
                    667: /*
                    668:  * check if a block is available
                    669:  */
                    670: isblock(fs, cp, h)
                    671:        struct fs *fs;
                    672:        unsigned char *cp;
                    673:        int h;
                    674: {
                    675:        unsigned char mask;
                    676: 
                    677:        switch (fs->fs_frag) {
                    678:        case 8:
                    679:                return (cp[h] == 0xff);
                    680:        case 4:
                    681:                mask = 0x0f << ((h & 0x1) << 2);
                    682:                return ((cp[h >> 1] & mask) == mask);
                    683:        case 2:
                    684:                mask = 0x03 << ((h & 0x3) << 1);
                    685:                return ((cp[h >> 2] & mask) == mask);
                    686:        case 1:
                    687:                mask = 0x01 << (h & 0x7);
                    688:                return ((cp[h >> 3] & mask) == mask);
                    689:        default:
                    690: #ifdef STANDALONE
                    691:                printf("isblock bad fs_frag %d\n", fs->fs_frag);
                    692: #else
                    693:                fprintf(stderr, "isblock bad fs_frag %d\n", fs->fs_frag);
                    694: #endif
                    695:                return;
                    696:        }
                    697: }
                    698: 
                    699: /*
                    700:  * take a block out of the map
                    701:  */
                    702: clrblock(fs, cp, h)
                    703:        struct fs *fs;
                    704:        unsigned char *cp;
                    705:        int h;
                    706: {
                    707:        switch ((fs)->fs_frag) {
                    708:        case 8:
                    709:                cp[h] = 0;
                    710:                return;
                    711:        case 4:
                    712:                cp[h >> 1] &= ~(0x0f << ((h & 0x1) << 2));
                    713:                return;
                    714:        case 2:
                    715:                cp[h >> 2] &= ~(0x03 << ((h & 0x3) << 1));
                    716:                return;
                    717:        case 1:
                    718:                cp[h >> 3] &= ~(0x01 << (h & 0x7));
                    719:                return;
                    720:        default:
                    721: #ifdef STANDALONE
                    722:                printf("clrblock bad fs_frag %d\n", fs->fs_frag);
                    723: #else
                    724:                fprintf(stderr, "clrblock bad fs_frag %d\n", fs->fs_frag);
                    725: #endif
                    726:                return;
                    727:        }
                    728: }
                    729: 
                    730: /*
                    731:  * put a block into the map
                    732:  */
                    733: setblock(fs, cp, h)
                    734:        struct fs *fs;
                    735:        unsigned char *cp;
                    736:        int h;
                    737: {
                    738:        switch (fs->fs_frag) {
                    739:        case 8:
                    740:                cp[h] = 0xff;
                    741:                return;
                    742:        case 4:
                    743:                cp[h >> 1] |= (0x0f << ((h & 0x1) << 2));
                    744:                return;
                    745:        case 2:
                    746:                cp[h >> 2] |= (0x03 << ((h & 0x3) << 1));
                    747:                return;
                    748:        case 1:
                    749:                cp[h >> 3] |= (0x01 << (h & 0x7));
                    750:                return;
                    751:        default:
                    752: #ifdef STANDALONE
                    753:                printf("setblock bad fs_frag %d\n", fs->fs_frag);
                    754: #else
                    755:                fprintf(stderr, "setblock bad fs_frag %d\n", fs->fs_frag);
                    756: #endif
                    757:                return;
                    758:        }
                    759: }
                    760: 
                    761: /*     tables.c        4.1     82/03/25        */
                    762: 
                    763: /* merged into kernel: tables.c 2.1 3/25/82 */
                    764: 
                    765: /* last monet version: partab.c        4.2     81/03/08        */
                    766: 
                    767: /*
                    768:  * bit patterns for identifying fragments in the block map
                    769:  * used as ((map & around) == inside)
                    770:  */
                    771: int around[9] = {
                    772:        0x3, 0x7, 0xf, 0x1f, 0x3f, 0x7f, 0xff, 0x1ff, 0x3ff
                    773: };
                    774: int inside[9] = {
                    775:        0x0, 0x2, 0x6, 0xe, 0x1e, 0x3e, 0x7e, 0xfe, 0x1fe
                    776: };
                    777: 
                    778: /*
                    779:  * given a block map bit pattern, the frag tables tell whether a
                    780:  * particular size fragment is available. 
                    781:  *
                    782:  * used as:
                    783:  * if ((1 << (size - 1)) & fragtbl[fs->fs_frag][map] {
                    784:  *     at least one fragment of the indicated size is available
                    785:  * }
                    786:  *
                    787:  * These tables are used by the scanc instruction on the VAX to
                    788:  * quickly find an appropriate fragment.
                    789:  */
                    790: 
                    791: unsigned char fragtbl124[256] = {
                    792:        0x00, 0x16, 0x16, 0x2a, 0x16, 0x16, 0x26, 0x4e,
                    793:        0x16, 0x16, 0x16, 0x3e, 0x2a, 0x3e, 0x4e, 0x8a,
                    794:        0x16, 0x16, 0x16, 0x3e, 0x16, 0x16, 0x36, 0x5e,
                    795:        0x16, 0x16, 0x16, 0x3e, 0x3e, 0x3e, 0x5e, 0x9e,
                    796:        0x16, 0x16, 0x16, 0x3e, 0x16, 0x16, 0x36, 0x5e,
                    797:        0x16, 0x16, 0x16, 0x3e, 0x3e, 0x3e, 0x5e, 0x9e,
                    798:        0x2a, 0x3e, 0x3e, 0x2a, 0x3e, 0x3e, 0x2e, 0x6e,
                    799:        0x3e, 0x3e, 0x3e, 0x3e, 0x2a, 0x3e, 0x6e, 0xaa,
                    800:        0x16, 0x16, 0x16, 0x3e, 0x16, 0x16, 0x36, 0x5e,
                    801:        0x16, 0x16, 0x16, 0x3e, 0x3e, 0x3e, 0x5e, 0x9e,
                    802:        0x16, 0x16, 0x16, 0x3e, 0x16, 0x16, 0x36, 0x5e,
                    803:        0x16, 0x16, 0x16, 0x3e, 0x3e, 0x3e, 0x5e, 0x9e,
                    804:        0x26, 0x36, 0x36, 0x2e, 0x36, 0x36, 0x26, 0x6e,
                    805:        0x36, 0x36, 0x36, 0x3e, 0x2e, 0x3e, 0x6e, 0xae,
                    806:        0x4e, 0x5e, 0x5e, 0x6e, 0x5e, 0x5e, 0x6e, 0x4e,
                    807:        0x5e, 0x5e, 0x5e, 0x7e, 0x6e, 0x7e, 0x4e, 0xce,
                    808:        0x16, 0x16, 0x16, 0x3e, 0x16, 0x16, 0x36, 0x5e,
                    809:        0x16, 0x16, 0x16, 0x3e, 0x3e, 0x3e, 0x5e, 0x9e,
                    810:        0x16, 0x16, 0x16, 0x3e, 0x16, 0x16, 0x36, 0x5e,
                    811:        0x16, 0x16, 0x16, 0x3e, 0x3e, 0x3e, 0x5e, 0x9e,
                    812:        0x16, 0x16, 0x16, 0x3e, 0x16, 0x16, 0x36, 0x5e,
                    813:        0x16, 0x16, 0x16, 0x3e, 0x3e, 0x3e, 0x5e, 0x9e,
                    814:        0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x7e,
                    815:        0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x7e, 0xbe,
                    816:        0x2a, 0x3e, 0x3e, 0x2a, 0x3e, 0x3e, 0x2e, 0x6e,
                    817:        0x3e, 0x3e, 0x3e, 0x3e, 0x2a, 0x3e, 0x6e, 0xaa,
                    818:        0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x7e,
                    819:        0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x7e, 0xbe,
                    820:        0x4e, 0x5e, 0x5e, 0x6e, 0x5e, 0x5e, 0x6e, 0x4e,
                    821:        0x5e, 0x5e, 0x5e, 0x7e, 0x6e, 0x7e, 0x4e, 0xce,
                    822:        0x8a, 0x9e, 0x9e, 0xaa, 0x9e, 0x9e, 0xae, 0xce,
                    823:        0x9e, 0x9e, 0x9e, 0xbe, 0xaa, 0xbe, 0xce, 0x8a,
                    824: };
                    825: 
                    826: unsigned char fragtbl8[256] = {
                    827:        0x00, 0x01, 0x01, 0x02, 0x01, 0x01, 0x02, 0x04,
                    828:        0x01, 0x01, 0x01, 0x03, 0x02, 0x03, 0x04, 0x08,
                    829:        0x01, 0x01, 0x01, 0x03, 0x01, 0x01, 0x03, 0x05,
                    830:        0x02, 0x03, 0x03, 0x02, 0x04, 0x05, 0x08, 0x10,
                    831:        0x01, 0x01, 0x01, 0x03, 0x01, 0x01, 0x03, 0x05,
                    832:        0x01, 0x01, 0x01, 0x03, 0x03, 0x03, 0x05, 0x09,
                    833:        0x02, 0x03, 0x03, 0x02, 0x03, 0x03, 0x02, 0x06,
                    834:        0x04, 0x05, 0x05, 0x06, 0x08, 0x09, 0x10, 0x20,
                    835:        0x01, 0x01, 0x01, 0x03, 0x01, 0x01, 0x03, 0x05,
                    836:        0x01, 0x01, 0x01, 0x03, 0x03, 0x03, 0x05, 0x09,
                    837:        0x01, 0x01, 0x01, 0x03, 0x01, 0x01, 0x03, 0x05,
                    838:        0x03, 0x03, 0x03, 0x03, 0x05, 0x05, 0x09, 0x11,
                    839:        0x02, 0x03, 0x03, 0x02, 0x03, 0x03, 0x02, 0x06,
                    840:        0x03, 0x03, 0x03, 0x03, 0x02, 0x03, 0x06, 0x0a,
                    841:        0x04, 0x05, 0x05, 0x06, 0x05, 0x05, 0x06, 0x04,
                    842:        0x08, 0x09, 0x09, 0x0a, 0x10, 0x11, 0x20, 0x40,
                    843:        0x01, 0x01, 0x01, 0x03, 0x01, 0x01, 0x03, 0x05,
                    844:        0x01, 0x01, 0x01, 0x03, 0x03, 0x03, 0x05, 0x09,
                    845:        0x01, 0x01, 0x01, 0x03, 0x01, 0x01, 0x03, 0x05,
                    846:        0x03, 0x03, 0x03, 0x03, 0x05, 0x05, 0x09, 0x11,
                    847:        0x01, 0x01, 0x01, 0x03, 0x01, 0x01, 0x03, 0x05,
                    848:        0x01, 0x01, 0x01, 0x03, 0x03, 0x03, 0x05, 0x09,
                    849:        0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x07,
                    850:        0x05, 0x05, 0x05, 0x07, 0x09, 0x09, 0x11, 0x21,
                    851:        0x02, 0x03, 0x03, 0x02, 0x03, 0x03, 0x02, 0x06,
                    852:        0x03, 0x03, 0x03, 0x03, 0x02, 0x03, 0x06, 0x0a,
                    853:        0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x07,
                    854:        0x02, 0x03, 0x03, 0x02, 0x06, 0x07, 0x0a, 0x12,
                    855:        0x04, 0x05, 0x05, 0x06, 0x05, 0x05, 0x06, 0x04,
                    856:        0x05, 0x05, 0x05, 0x07, 0x06, 0x07, 0x04, 0x0c,
                    857:        0x08, 0x09, 0x09, 0x0a, 0x09, 0x09, 0x0a, 0x0c,
                    858:        0x10, 0x11, 0x11, 0x12, 0x20, 0x21, 0x40, 0x80,
                    859: };
                    860: 
                    861: /*
                    862:  * the actual fragtbl array
                    863:  */
                    864: unsigned char *fragtbl[MAXFRAG + 1] = {
                    865:        0, fragtbl124, fragtbl124, 0, fragtbl124, 0, 0, 0, fragtbl8,
                    866: };

unix.superglobalmegacorp.com

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