Annotation of coherent/d/etc/fsck/phase5.c, revision 1.1

1.1     ! root        1: /*
        !             2:  *     phase 5 of fsck - Check Free List
        !             3:  */
        !             4: 
        !             5: #include "fsck.h"
        !             6: 
        !             7: daddr_t        badcnt;                 /* Number of bad blocks in free list */
        !             8: daddr_t dupcnt;                        /* Number of dup blocks in free list */
        !             9: int    badflag;                /* Bad free list flag */
        !            10: int    fixerup;                /* Flag to salvage free list */
        !            11: 
        !            12: phase5()
        !            13: {
        !            14:        struct fblk *fbp;
        !            15:        unsigned size;
        !            16:        
        !            17:        if (!qflag)
        !            18:                printf("Phase 5 : Check Free List\n");
        !            19:        fbp = (struct fblk *) &sbp->s_nfree;
        !            20:        size = (unsigned) ((fsize+NBPC-1)/NBPC) * sizeof(char);
        !            21: #if SMALLMODEL
        !            22:        copyV(size);
        !            23: #else
        !            24:        memcpy(dupPtr, blockPtr, size);
        !            25: #endif
        !            26:        badcnt = dupcnt = 0;
        !            27:        badflag = FALSE;
        !            28:        freetrav(fbp);
        !            29:        fixerup = FALSE;
        !            30:        if (badflag || sflag) 
        !            31:                asksalvage();
        !            32: }
        !            33: 
        !            34: 
        !            35: #define        IGNORE  3               /* Return Possibilities from chk() */
        !            36: #define        ABORT   4               /* as well as perhaps GOOD and BAD */
        !            37: 
        !            38: freetrav(fbp)
        !            39: struct fblk *fbp;
        !            40: {
        !            41:        daddr_t total=0;
        !            42:        int i, flag;
        !            43: 
        !            44:        while ( fbp->df_nfree != 0 ) {
        !            45:                if ( (unsigned) fbp->df_nfree > NICFREE ) {
        !            46:                        badflag = TRUE;
        !            47:                        printf("Bad freeblock count.\n");
        !            48:                        break;
        !            49:                }
        !            50:                for (i=1; i<fbp->df_nfree; i++) {
        !            51:                        if ( (flag=chk(fbp->df_free[i])) == GOOD ) {
        !            52:                                total++;
        !            53:                                continue;
        !            54:                        }
        !            55:                        if (flag == BAD)
        !            56:                                continue;
        !            57:                        break;          /* break for IGNORE or ABORT    */
        !            58:                }
        !            59:                if ( (flag == IGNORE) || (flag == ABORT) )
        !            60:                        break;
        !            61:                if ( chk(fbp->df_free[0]) != GOOD )
        !            62:                        break;
        !            63:                total++;
        !            64:                bread(fbp->df_free[0], databuf);
        !            65:                fbp = (struct fblk *) databuf;
        !            66:                if ( !canfblk(fbp) ) {
        !            67:                        badflag = TRUE;
        !            68:                        printf("Bad freeblock count.\n");
        !            69:                        break;
        !            70:                }
        !            71:        }
        !            72: 
        !            73: #if 0
        !            74:        printf("Total traversed free blocks     = %U\n", total);         
        !            75:        printf("Total free blocks by Superblock = %U\n", sbp->s_tfree);  
        !            76:        printf("Running total free blocks       = %U\n", totfree);       
        !            77: #endif
        !            78: 
        !            79:        if ( flag == ABORT ) {          /* To Terminate fsck on this    */
        !            80:                badflag = FALSE;        /* File System, because of      */
        !            81:                return;                 /* excessive dup or bad blocks  */
        !            82:        }
        !            83: 
        !            84:        if ( sbp->s_tfree != totfree )
        !            85:                if ( (qflag==FALSE) && (daction!=NO) ) {
        !            86:                        printf("Free Block count wrong in superblock.  ");
        !            87:                        if ( action(fixit) == TRUE ) {
        !            88:                                sbp->s_tfree = totfree;
        !            89:                                sbpfix = TRUE;
        !            90:                        }
        !            91:                } else {
        !            92:                        sbp->s_tfree = totfree;
        !            93:                        sbpfix = TRUE;
        !            94:                }
        !            95: 
        !            96:        report("%U Bad Block%s in Free List\n", badcnt);
        !            97:        report("%U Dup Block%s in Free List\n", dupcnt);
        !            98:        report("%U Block%s missing\n", totfree - total);
        !            99: 
        !           100: }
        !           101: 
        !           102: report(message, num)
        !           103: char *message;
        !           104: daddr_t num;
        !           105: {
        !           106:        if ( num != 0 ) {
        !           107:                printf(message, num, ( (num>1) ? "s" : "" ) );
        !           108:                badflag = TRUE;
        !           109:        }
        !           110: }
        !           111: 
        !           112: chk(bn)
        !           113: register daddr_t bn;
        !           114: {
        !           115:        if ( (bn<isize) || (bn>=fsize) ) {
        !           116:                badflag = TRUE;
        !           117:                if (++badcnt > MAXBADFREE) 
        !           118:                        return( stopit("bad") );
        !           119:                return(BAD);
        !           120:        }
        !           121: 
        !           122:        if ( testdup(bn) ) {
        !           123:                badflag = TRUE;
        !           124:                if (++dupcnt > MAXDUPFREE)
        !           125:                        return( stopit("dup") );
        !           126:                return(BAD);
        !           127:        } else {
        !           128:                markdup(bn);
        !           129:                return(GOOD);
        !           130:        }
        !           131: }
        !           132:                        
        !           133: stopit(type)
        !           134: char *type;
        !           135: {
        !           136:        printf("Excessive %s blocks in free list ", type);
        !           137:        if ( query("(Continue)") == YES )
        !           138:                return(IGNORE);
        !           139:        else
        !           140:                return(ABORT);
        !           141: }
        !           142:                
        !           143:                
        !           144: canfblk(fbp)
        !           145: register struct fblk *fbp;
        !           146: {
        !           147:        register short i;
        !           148: 
        !           149:        canshort(fbp->df_nfree);
        !           150:        if ( (unsigned) fbp->df_nfree > NICFREE )
        !           151:                return(FALSE);
        !           152: 
        !           153:        for (i=0; i<fbp->df_nfree; i++)
        !           154:                candaddr(fbp->df_free[i]);
        !           155:        return(TRUE);
        !           156: }
        !           157: 
        !           158: asksalvage()
        !           159: {
        !           160:        if ( (daction!=NO) && (qflag || sflag) ) {
        !           161:                fixerup = TRUE;
        !           162:                return;
        !           163:        }
        !           164:        if ( action("Bad Free List (SALVAGE)") )
        !           165:                fixerup = TRUE;
        !           166: }

unix.superglobalmegacorp.com

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