Annotation of coherent/b/etc/fsck/phase6.c, revision 1.1

1.1     ! root        1: /*
        !             2:  *     phase 6 of fsck - Salvage Free List
        !             3:  */
        !             4: 
        !             5: #include "fsck.h"
        !             6: 
        !             7: static unsigned char *maptab;  /* table of interleave offsets  */
        !             8: static daddr_t mapbot;         /* minimum block number to interleave map */
        !             9: static daddr_t maptop;         /* maximum block number to interleave map */
        !            10: static short   m,n;            /* interleave factors   */
        !            11: #define        DEF_N   1               /* default values       */
        !            12: #define        DEF_M   1               
        !            13: daddr_t        freeblks;               /* number free blocks left to write out */
        !            14: daddr_t        blknm;                  /* current block number we are working with */
        !            15: struct fblk *fblkp;            /* pointer to free block list */
        !            16: daddr_t        *dp;                    /* pointer to block entry in free list block */
        !            17: 
        !            18: phase6()
        !            19: {
        !            20:        if (!fixerup) {
        !            21:                return;
        !            22:        }
        !            23: 
        !            24:        if (!qflag)
        !            25:                printf("Phase 6 : Salvage Free List\n");
        !            26:        if ( maketable() == BAD )
        !            27:                return;
        !            28:        writefree();
        !            29:        free(maptab);
        !            30: }
        !            31: 
        !            32: maketable()
        !            33: {
        !            34:        register int i;
        !            35:        register int ratio;
        !            36: 
        !            37:        m = sbp->s_m;
        !            38:        n = sbp->s_n;
        !            39: 
        !            40:        if ( (n > MAXINTN) || (m > n) || (n%m != 0) ) {
        !            41:                printf("Invalid interleave factors in superblock.\n");
        !            42:                printf("Default free-block list spacing assumed.\n");
        !            43:                sbp->s_n = n = DEF_N;
        !            44:                sbp->s_m = m = DEF_M;
        !            45:        }
        !            46: 
        !            47:        if ( (maptab = malloc(n)) == NULL ) {
        !            48:                printf("Can't malloc space for interleave table.\n");
        !            49:                printf("Free-block list is not rebuilt.\n");
        !            50:                return(BAD);
        !            51:        }
        !            52: 
        !            53:        mapbot = (isize + n - 1)/n*n;
        !            54:        maptop = fsize/n*n;
        !            55:        ratio = n/m;
        !            56:        for (i=0; i<n; i++)
        !            57:                maptab[i] = (i/ratio) + (i%ratio)*m;
        !            58: 
        !            59:        return(GOOD);
        !            60: }
        !            61: 
        !            62: writefree()
        !            63: {
        !            64:        register daddr_t bn;
        !            65:        daddr_t blk, bmap();
        !            66:        short num;
        !            67: 
        !            68:        sbpfix = TRUE;
        !            69:        freeblks = totfree;
        !            70:        blknm = SUPERI;
        !            71:        fblkp = (struct fblk *) &sbp->s_nfree;
        !            72:        fblkp->df_nfree = num = (freeblks < NICFREE) ? freeblks : NICFREE;
        !            73:        freeblks -= num;
        !            74:        dp = &fblkp->df_free[num];
        !            75:        for (bn=isize; bn<fsize; bn++) {
        !            76:                blk = bmap(bn);
        !            77:                if ( !testblock(blk) ) 
        !            78:                        if ( addfree(blk) == STOP )
        !            79:                                break;
        !            80:        }
        !            81: }
        !            82: 
        !            83: addfree(bn)
        !            84: daddr_t bn;
        !            85: {
        !            86:        short num;
        !            87: 
        !            88:        *--dp = bn;
        !            89:        if (dp > &fblkp->df_free[0])
        !            90:                return(OK);
        !            91: 
        !            92:        if ( blknm != SUPERI ) {
        !            93:                canwfblk(fblkp);
        !            94:                bwrite(blknm, databuf);
        !            95:        }
        !            96: 
        !            97:        bclear(databuf, BSIZE);
        !            98:        if (freeblks == 0) {
        !            99:                bwrite(bn, databuf);
        !           100:                return(STOP);
        !           101:        }
        !           102:        blknm = bn;
        !           103:        fblkp = (struct fblk *) databuf;
        !           104:        fblkp->df_nfree = num = (freeblks < NICFREE) ? freeblks : NICFREE;
        !           105:        freeblks -= num;
        !           106:        dp = &fblkp->df_free[num];
        !           107:        return(OK);
        !           108: }
        !           109: 
        !           110: daddr_t
        !           111: bmap(blk)
        !           112: register daddr_t blk;
        !           113: {
        !           114:        short i;
        !           115: 
        !           116:        if ( (blk>=mapbot) && (blk<maptop) ) {
        !           117:                i = blk%n;
        !           118:                blk -= i;
        !           119:                blk += maptab[i];
        !           120:        }
        !           121:        return(blk);
        !           122: }
        !           123: 
        !           124: canwfblk(fbp)
        !           125: register struct fblk *fbp;
        !           126: {
        !           127:        register short i;
        !           128: 
        !           129:        for (i=0; i<fbp->df_nfree; i++)
        !           130:                candaddr(fbp->df_free[i]);
        !           131:        canshort(fbp->df_nfree);
        !           132: }

unix.superglobalmegacorp.com

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