Annotation of 43BSDReno/sbin/fsck/pass5.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * Copyright (c) 1980, 1986 The Regents of the University of California.
        !             3:  * All rights reserved.
        !             4:  *
        !             5:  * Redistribution and use in source and binary forms are permitted provided
        !             6:  * that: (1) source distributions retain this entire copyright notice and
        !             7:  * comment, and (2) distributions including binaries display the following
        !             8:  * acknowledgement:  ``This product includes software developed by the
        !             9:  * University of California, Berkeley and its contributors'' in the
        !            10:  * documentation or other materials provided with the distribution and in
        !            11:  * all advertising materials mentioning features or use of this software.
        !            12:  * Neither the name of the University nor the names of its contributors may
        !            13:  * be used to endorse or promote products derived from this software without
        !            14:  * specific prior written permission.
        !            15:  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
        !            16:  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
        !            17:  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
        !            18:  */
        !            19: 
        !            20: #ifndef lint
        !            21: static char sccsid[] = "@(#)pass5.c    5.13 (Berkeley) 7/20/90";
        !            22: #endif /* not lint */
        !            23: 
        !            24: #include <sys/param.h>
        !            25: #include <ufs/dinode.h>
        !            26: #include <ufs/fs.h>
        !            27: #include <string.h>
        !            28: #include "fsck.h"
        !            29: 
        !            30: pass5()
        !            31: {
        !            32:        int c, blk, frags, basesize, sumsize, mapsize, savednrpos;
        !            33:        register struct fs *fs = &sblock;
        !            34:        register struct cg *cg = &cgrp;
        !            35:        daddr_t dbase, dmax;
        !            36:        register daddr_t d;
        !            37:        register long i, j;
        !            38:        struct csum *cs;
        !            39:        time_t now;
        !            40:        struct csum cstotal;
        !            41:        struct inodesc idesc[3];
        !            42:        char buf[MAXBSIZE];
        !            43:        register struct cg *newcg = (struct cg *)buf;
        !            44:        struct ocg *ocg = (struct ocg *)buf;
        !            45: 
        !            46:        bzero((char *)newcg, (size_t)fs->fs_cgsize);
        !            47:        newcg->cg_niblk = fs->fs_ipg;
        !            48:        switch ((int)fs->fs_postblformat) {
        !            49: 
        !            50:        case FS_42POSTBLFMT:
        !            51:                basesize = (char *)(&ocg->cg_btot[0]) - (char *)(&ocg->cg_link);
        !            52:                sumsize = &ocg->cg_iused[0] - (char *)(&ocg->cg_btot[0]);
        !            53:                mapsize = &ocg->cg_free[howmany(fs->fs_fpg, NBBY)] -
        !            54:                        (u_char *)&ocg->cg_iused[0];
        !            55:                ocg->cg_magic = CG_MAGIC;
        !            56:                savednrpos = fs->fs_nrpos;
        !            57:                fs->fs_nrpos = 8;
        !            58:                break;
        !            59: 
        !            60:        case FS_DYNAMICPOSTBLFMT:
        !            61:                newcg->cg_btotoff =
        !            62:                        &newcg->cg_space[0] - (u_char *)(&newcg->cg_link);
        !            63:                newcg->cg_boff =
        !            64:                        newcg->cg_btotoff + fs->fs_cpg * sizeof(long);
        !            65:                newcg->cg_iusedoff = newcg->cg_boff + 
        !            66:                        fs->fs_cpg * fs->fs_nrpos * sizeof(short);
        !            67:                newcg->cg_freeoff =
        !            68:                        newcg->cg_iusedoff + howmany(fs->fs_ipg, NBBY);
        !            69:                newcg->cg_nextfreeoff = newcg->cg_freeoff +
        !            70:                        howmany(fs->fs_cpg * fs->fs_spc / NSPF(fs),
        !            71:                                NBBY);
        !            72:                newcg->cg_magic = CG_MAGIC;
        !            73:                basesize = &newcg->cg_space[0] - (u_char *)(&newcg->cg_link);
        !            74:                sumsize = newcg->cg_iusedoff - newcg->cg_btotoff;
        !            75:                mapsize = newcg->cg_nextfreeoff - newcg->cg_iusedoff;
        !            76:                break;
        !            77: 
        !            78:        default:
        !            79:                errexit("UNKNOWN ROTATIONAL TABLE FORMAT %d\n",
        !            80:                        fs->fs_postblformat);
        !            81:        }
        !            82:        bzero((char *)&idesc[0], sizeof idesc);
        !            83:        for (i = 0; i < 3; i++)
        !            84:                idesc[i].id_type = ADDR;
        !            85:        bzero((char *)&cstotal, sizeof(struct csum));
        !            86:        (void)time(&now);
        !            87:        j = blknum(fs, fs->fs_size + fs->fs_frag - 1);
        !            88:        for (i = fs->fs_size; i < j; i++)
        !            89:                setbmap(i);
        !            90:        for (c = 0; c < fs->fs_ncg; c++) {
        !            91:                getblk(&cgblk, cgtod(fs, c), fs->fs_cgsize);
        !            92:                if (!cg_chkmagic(cg))
        !            93:                        pfatal("CG %d: BAD MAGIC NUMBER\n", c);
        !            94:                dbase = cgbase(fs, c);
        !            95:                dmax = dbase + fs->fs_fpg;
        !            96:                if (dmax > fs->fs_size)
        !            97:                        dmax = fs->fs_size;
        !            98:                if (now > cg->cg_time)
        !            99:                        newcg->cg_time = cg->cg_time;
        !           100:                else
        !           101:                        newcg->cg_time = now;
        !           102:                newcg->cg_cgx = c;
        !           103:                if (c == fs->fs_ncg - 1)
        !           104:                        newcg->cg_ncyl = fs->fs_ncyl % fs->fs_cpg;
        !           105:                else
        !           106:                        newcg->cg_ncyl = fs->fs_cpg;
        !           107:                newcg->cg_ndblk = dmax - dbase;
        !           108:                newcg->cg_cs.cs_ndir = 0;
        !           109:                newcg->cg_cs.cs_nffree = 0;
        !           110:                newcg->cg_cs.cs_nbfree = 0;
        !           111:                newcg->cg_cs.cs_nifree = fs->fs_ipg;
        !           112:                if (cg->cg_rotor < newcg->cg_ndblk)
        !           113:                        newcg->cg_rotor = cg->cg_rotor;
        !           114:                else
        !           115:                        newcg->cg_rotor = 0;
        !           116:                if (cg->cg_frotor < newcg->cg_ndblk)
        !           117:                        newcg->cg_frotor = cg->cg_frotor;
        !           118:                else
        !           119:                        newcg->cg_frotor = 0;
        !           120:                if (cg->cg_irotor < newcg->cg_niblk)
        !           121:                        newcg->cg_irotor = cg->cg_irotor;
        !           122:                else
        !           123:                        newcg->cg_irotor = 0;
        !           124:                bzero((char *)&newcg->cg_frsum[0], sizeof newcg->cg_frsum);
        !           125:                bzero((char *)&cg_blktot(newcg)[0],
        !           126:                      (size_t)(sumsize + mapsize));
        !           127:                if (fs->fs_postblformat == FS_42POSTBLFMT)
        !           128:                        ocg->cg_magic = CG_MAGIC;
        !           129:                j = fs->fs_ipg * c;
        !           130:                for (i = 0; i < fs->fs_ipg; j++, i++) {
        !           131:                        switch (statemap[j]) {
        !           132: 
        !           133:                        case USTATE:
        !           134:                                break;
        !           135: 
        !           136:                        case DSTATE:
        !           137:                        case DCLEAR:
        !           138:                        case DFOUND:
        !           139:                                newcg->cg_cs.cs_ndir++;
        !           140:                                /* fall through */
        !           141: 
        !           142:                        case FSTATE:
        !           143:                        case FCLEAR:
        !           144:                                newcg->cg_cs.cs_nifree--;
        !           145:                                setbit(cg_inosused(newcg), i);
        !           146:                                break;
        !           147: 
        !           148:                        default:
        !           149:                                if (j < ROOTINO)
        !           150:                                        break;
        !           151:                                errexit("BAD STATE %d FOR INODE I=%d",
        !           152:                                    statemap[j], j);
        !           153:                        }
        !           154:                }
        !           155:                if (c == 0)
        !           156:                        for (i = 0; i < ROOTINO; i++) {
        !           157:                                setbit(cg_inosused(newcg), i);
        !           158:                                newcg->cg_cs.cs_nifree--;
        !           159:                        }
        !           160:                for (i = 0, d = dbase;
        !           161:                     d < dmax;
        !           162:                     d += fs->fs_frag, i += fs->fs_frag) {
        !           163:                        frags = 0;
        !           164:                        for (j = 0; j < fs->fs_frag; j++) {
        !           165:                                if (testbmap(d + j))
        !           166:                                        continue;
        !           167:                                setbit(cg_blksfree(newcg), i + j);
        !           168:                                frags++;
        !           169:                        }
        !           170:                        if (frags == fs->fs_frag) {
        !           171:                                newcg->cg_cs.cs_nbfree++;
        !           172:                                j = cbtocylno(fs, i);
        !           173:                                cg_blktot(newcg)[j]++;
        !           174:                                cg_blks(fs, newcg, j)[cbtorpos(fs, i)]++;
        !           175:                        } else if (frags > 0) {
        !           176:                                newcg->cg_cs.cs_nffree += frags;
        !           177:                                blk = blkmap(fs, cg_blksfree(newcg), i);
        !           178:                                fragacct(fs, blk, newcg->cg_frsum, 1);
        !           179:                        }
        !           180:                }
        !           181:                cstotal.cs_nffree += newcg->cg_cs.cs_nffree;
        !           182:                cstotal.cs_nbfree += newcg->cg_cs.cs_nbfree;
        !           183:                cstotal.cs_nifree += newcg->cg_cs.cs_nifree;
        !           184:                cstotal.cs_ndir += newcg->cg_cs.cs_ndir;
        !           185:                cs = &fs->fs_cs(fs, c);
        !           186:                if (bcmp((char *)&newcg->cg_cs, (char *)cs, sizeof *cs) != 0 &&
        !           187:                    dofix(&idesc[0], "FREE BLK COUNT(S) WRONG IN SUPERBLK")) {
        !           188:                        bcopy((char *)&newcg->cg_cs, (char *)cs, sizeof *cs);
        !           189:                        sbdirty();
        !           190:                }
        !           191:                if (cvtflag) {
        !           192:                        bcopy((char *)newcg, (char *)cg, (size_t)fs->fs_cgsize);
        !           193:                        cgdirty();
        !           194:                        continue;
        !           195:                }
        !           196:                if (bcmp(cg_inosused(newcg),
        !           197:                         cg_inosused(cg), mapsize) != 0 &&
        !           198:                    dofix(&idesc[1], "BLK(S) MISSING IN BIT MAPS")) {
        !           199:                        bcopy(cg_inosused(newcg), cg_inosused(cg),
        !           200:                              (size_t)mapsize);
        !           201:                        cgdirty();
        !           202:                }
        !           203:                if ((bcmp((char *)newcg, (char *)cg, basesize) != 0 ||
        !           204:                     bcmp((char *)&cg_blktot(newcg)[0],
        !           205:                          (char *)&cg_blktot(cg)[0], sumsize) != 0) &&
        !           206:                    dofix(&idesc[2], "SUMMARY INFORMATION BAD")) {
        !           207:                        bcopy((char *)newcg, (char *)cg, (size_t)basesize);
        !           208:                        bcopy((char *)&cg_blktot(newcg)[0],
        !           209:                              (char *)&cg_blktot(cg)[0], (size_t)sumsize);
        !           210:                        cgdirty();
        !           211:                }
        !           212:        }
        !           213:        if (fs->fs_postblformat == FS_42POSTBLFMT)
        !           214:                fs->fs_nrpos = savednrpos;
        !           215:        if (bcmp((char *)&cstotal, (char *)&fs->fs_cstotal, sizeof *cs) != 0
        !           216:            && dofix(&idesc[0], "FREE BLK COUNT(S) WRONG IN SUPERBLK")) {
        !           217:                bcopy((char *)&cstotal, (char *)&fs->fs_cstotal, sizeof *cs);
        !           218:                fs->fs_ronly = 0;
        !           219:                fs->fs_fmod = 0;
        !           220:                sbdirty();
        !           221:        }
        !           222: }

unix.superglobalmegacorp.com

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