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

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

unix.superglobalmegacorp.com

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