Annotation of coherent/d/etc/fsck/phase1b.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  *     Phase 1b of fsck - Rescan for more Dups
                      3:  */
                      4: 
                      5: #include "fsck.h"
                      6: 
                      7: extern int     numdup;         /* declared in phase1.c */
                      8: 
                      9: phase1b()
                     10: {
                     11:        if (!qflag)
                     12:                printf("Phase 1b: Rescan for more Dups\n");
                     13:        buildtable();
                     14:        iscanb();
                     15: }
                     16: 
                     17: buildtable()
                     18: {
                     19:        unsigned cntr=0, numdiff=0;
                     20:        daddr_t bn;
                     21: 
                     22:        while (cntr<totdups) {
                     23:                bn = dupblck[cntr++];
                     24:                if (!testdup(bn)) {
                     25:                        markdup(bn);
                     26:                        numdiff++;
                     27:                }
                     28:        }
                     29:        totdups = numdiff;
                     30: }
                     31: 
                     32: iscanb()
                     33: {
                     34:        register daddr_t bn;
                     35:        register struct dinode *dip;
                     36:        register ino_t  ino;
                     37:        int i;
                     38: 
                     39:        ino = 1;
                     40: 
                     41:        for (bn=INODEI; bn<isize; bn++) {
                     42:                if (testblock(bn)) {            /* block is bad via inode 1 */
                     43:                        ino += INOPB;
                     44:                        continue;
                     45:                }
                     46:                bread(bn, databuf);
                     47:                dip = (struct dinode *) databuf;
                     48:                for (i=0; i<INOPB; i++) {
                     49:                        candino(dip);
                     50:                        if (inuse(dip) == TRUE) 
                     51:                                ckblksb(dip, ino);
                     52:                        if (totdups == 0)
                     53:                                return;                 
                     54:                        ino++;
                     55:                        dip++;
                     56:                }
                     57:        }
                     58: }
                     59: 
                     60: /*
                     61:  *     Check the blocks associated with the given inode to find the
                     62:  *     remaining duplicate blocks
                     63:  */
                     64: 
                     65: ckblksb(dip, ino)
                     66: register struct dinode *dip;
                     67: register ino_t ino;
                     68: {
                     69:        daddr_t addrs[NADDR];
                     70:        int i, lev;
                     71:        int mode;
                     72: 
                     73:        mode = dip->di_mode & IFMT;
                     74: 
                     75:        if ( (mode != IFREG) && (mode != IFDIR) )
                     76:                return;
                     77: 
                     78:        l3tol(addrs, dip->di_addr, NADDR);
                     79: 
                     80:        numdup = 0;                     /* num dup blocks so far THIS INODE */
                     81: 
                     82:        for(i=0; i<NADDR; i++)
                     83:                for (lev=0; lev<4; lev++) 
                     84:                        if (i < offsets[lev]) {
                     85:                                dblocksb(addrs[i], ino, lev);
                     86:                                break;
                     87:                        }
                     88: }
                     89: 
                     90: /*
                     91:  *     Checks recursively the blocks pointed at via
                     92:  *     the inode list of blocks.  'bn' is the block number,
                     93:  *     'ino' is the inode referencing it, and 'lev' is the
                     94:  *     level 0 == direct ... 3 = triple-indirect
                     95:  */
                     96: 
                     97: dblocksb(bn, ino, lev)
                     98: daddr_t        bn;
                     99: ino_t  ino;
                    100: int    lev;
                    101: {
                    102:        char buf[BSIZE];
                    103:        int  i;
                    104:        daddr_t *bnptr;
                    105: 
                    106:        if (bn == 0)
                    107:                return(OK);
                    108:                
                    109:        switch ( cdupb(bn, ino) ) {
                    110:        case OK:
                    111:                if (lev--==0)
                    112:                        return(OK);
                    113:                bread(bn, buf);
                    114:                bnptr = (long *) buf;
                    115:                for (i=0; i<NBN; i++) {
                    116:                        bn = bnptr[i];
                    117:                        candaddr(bn);
                    118:                        if ( dblocksb(bn, ino, lev) == STOP )
                    119:                                return(STOP);
                    120:                }
                    121:                return(OK);
                    122:        case STOP:
                    123:                return(STOP);
                    124:        }
                    125: }
                    126: 
                    127: /*
                    128:  *     Check the given block number for duplicate reference.
                    129:  */
                    130: 
                    131: cdupb(bn, ino)
                    132: daddr_t        bn;
                    133: ino_t  ino;
                    134: {
                    135:        if ( !testdup(bn) ) 
                    136:                return(OK);
                    137: 
                    138:        totdups--;
                    139:        unmarkdup(bn);
                    140:        if (!fflag)
                    141:                orflags(ino, IBAD_IDUP);
                    142:        printf("Dup Block %U, i-number = %u\n", bn, ino);
                    143: 
                    144:        return(STOP);
                    145: }

unix.superglobalmegacorp.com

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