Annotation of 43BSDTahoe/etc/fsck/pass5.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[] = "@(#)pass5.c    5.5 (Berkeley) 5/7/88";
                      9: #endif not lint
                     10: 
                     11: #include <sys/param.h>
                     12: #include <sys/inode.h>
                     13: #include <sys/fs.h>
                     14: #include "fsck.h"
                     15: 
                     16: pass5()
                     17: {
                     18:        int c, blk, frags, basesize, sumsize, mapsize, savednrpos;
                     19:        register struct fs *fs = &sblock;
                     20:        register struct cg *cg = &cgrp;
                     21:        daddr_t dbase, dmax;
                     22:        register daddr_t d;
                     23:        register long i, j;
                     24:        struct csum *cs;
                     25:        time_t now;
                     26:        struct csum cstotal;
                     27:        struct inodesc idesc;
                     28:        char buf[MAXBSIZE];
                     29:        register struct cg *newcg = (struct cg *)buf;
                     30:        struct ocg *ocg = (struct ocg *)buf;
                     31: 
                     32:        bzero((char *)newcg, fs->fs_cgsize);
                     33:        newcg->cg_niblk = fs->fs_ipg;
                     34:        switch (fs->fs_postblformat) {
                     35: 
                     36:        case FS_42POSTBLFMT:
                     37:                basesize = (char *)(&ocg->cg_btot[0]) - (char *)(&ocg->cg_link);
                     38:                sumsize = &ocg->cg_iused[0] - (char *)(&ocg->cg_btot[0]);
                     39:                mapsize = &ocg->cg_free[howmany(fs->fs_fpg, NBBY)] -
                     40:                        (u_char *)&ocg->cg_iused[0];
                     41:                ocg->cg_magic = CG_MAGIC;
                     42:                savednrpos = fs->fs_nrpos;
                     43:                fs->fs_nrpos = 8;
                     44:                break;
                     45: 
                     46:        case FS_DYNAMICPOSTBLFMT:
                     47:                newcg->cg_btotoff =
                     48:                        &newcg->cg_space[0] - (u_char *)(&newcg->cg_link);
                     49:                newcg->cg_boff =
                     50:                        newcg->cg_btotoff + fs->fs_cpg * sizeof(long);
                     51:                newcg->cg_iusedoff = newcg->cg_boff + 
                     52:                        fs->fs_cpg * fs->fs_nrpos * sizeof(short);
                     53:                newcg->cg_freeoff =
                     54:                        newcg->cg_iusedoff + howmany(fs->fs_ipg, NBBY);
                     55:                newcg->cg_nextfreeoff = newcg->cg_freeoff +
                     56:                        howmany(fs->fs_cpg * fs->fs_spc / NSPF(fs),
                     57:                                NBBY);
                     58:                newcg->cg_magic = CG_MAGIC;
                     59:                basesize = &newcg->cg_space[0] - (u_char *)(&newcg->cg_link);
                     60:                sumsize = newcg->cg_iusedoff - newcg->cg_btotoff;
                     61:                mapsize = newcg->cg_nextfreeoff - newcg->cg_iusedoff;
                     62:                break;
                     63: 
                     64:        default:
                     65:                errexit("UNKNOWN ROTATIONAL TABLE FORMAT %d\n",
                     66:                        fs->fs_postblformat);
                     67:        }
                     68:        bzero((char *)&idesc, sizeof(struct inodesc));
                     69:        idesc.id_type = ADDR;
                     70:        bzero((char *)&cstotal, sizeof(struct csum));
                     71:        (void)time(&now);
                     72:        for (i = fs->fs_size; i < fragroundup(fs, fs->fs_size); i++)
                     73:                setbmap(i);
                     74:        for (c = 0; c < fs->fs_ncg; c++) {
                     75:                getblk(&cgblk, cgtod(fs, c), fs->fs_cgsize);
                     76:                if (!cg_chkmagic(cg))
                     77:                        pfatal("CG %d: BAD MAGIC NUMBER\n", c);
                     78:                dbase = cgbase(fs, c);
                     79:                dmax = dbase + fs->fs_fpg;
                     80:                if (dmax > fs->fs_size)
                     81:                        dmax = fs->fs_size;
                     82:                if (now > cg->cg_time)
                     83:                        newcg->cg_time = cg->cg_time;
                     84:                else
                     85:                        newcg->cg_time = now;
                     86:                newcg->cg_cgx = c;
                     87:                if (c == fs->fs_ncg - 1)
                     88:                        newcg->cg_ncyl = fs->fs_ncyl % fs->fs_cpg;
                     89:                else
                     90:                        newcg->cg_ncyl = fs->fs_cpg;
                     91:                newcg->cg_ndblk = dmax - dbase;
                     92:                newcg->cg_cs.cs_ndir = 0;
                     93:                newcg->cg_cs.cs_nffree = 0;
                     94:                newcg->cg_cs.cs_nbfree = 0;
                     95:                newcg->cg_cs.cs_nifree = fs->fs_ipg;
                     96:                if (cg->cg_rotor < newcg->cg_ndblk)
                     97:                        newcg->cg_rotor = cg->cg_rotor;
                     98:                else
                     99:                        newcg->cg_rotor = 0;
                    100:                if (cg->cg_frotor < newcg->cg_ndblk)
                    101:                        newcg->cg_frotor = cg->cg_frotor;
                    102:                else
                    103:                        newcg->cg_frotor = 0;
                    104:                if (cg->cg_irotor < newcg->cg_niblk)
                    105:                        newcg->cg_irotor = cg->cg_irotor;
                    106:                else
                    107:                        newcg->cg_irotor = 0;
                    108:                bzero((char *)&newcg->cg_frsum[0], sizeof newcg->cg_frsum);
                    109:                bzero((char *)&cg_blktot(newcg)[0], sumsize + mapsize);
                    110:                if (fs->fs_postblformat == FS_42POSTBLFMT)
                    111:                        ocg->cg_magic = CG_MAGIC;
                    112:                j = fs->fs_ipg * c;
                    113:                for (i = 0; i < fs->fs_ipg; j++, i++) {
                    114:                        switch (statemap[j]) {
                    115: 
                    116:                        case USTATE:
                    117:                                break;
                    118: 
                    119:                        case DSTATE:
                    120:                        case DCLEAR:
                    121:                        case DFOUND:
                    122:                                newcg->cg_cs.cs_ndir++;
                    123:                                /* fall through */
                    124: 
                    125:                        case FSTATE:
                    126:                        case FCLEAR:
                    127:                                newcg->cg_cs.cs_nifree--;
                    128:                                setbit(cg_inosused(newcg), i);
                    129:                                break;
                    130: 
                    131:                        default:
                    132:                                if (j < ROOTINO)
                    133:                                        break;
                    134:                                errexit("BAD STATE %d FOR INODE I=%d",
                    135:                                    statemap[j], j);
                    136:                        }
                    137:                }
                    138:                if (c == 0)
                    139:                        for (i = 0; i < ROOTINO; i++) {
                    140:                                setbit(cg_inosused(newcg), i);
                    141:                                newcg->cg_cs.cs_nifree--;
                    142:                        }
                    143:                for (i = 0, d = dbase;
                    144:                     d < dmax;
                    145:                     d += fs->fs_frag, i += fs->fs_frag) {
                    146:                        frags = 0;
                    147:                        for (j = 0; j < fs->fs_frag; j++) {
                    148:                                if (getbmap(d + j))
                    149:                                        continue;
                    150:                                setbit(cg_blksfree(newcg), i + j);
                    151:                                frags++;
                    152:                        }
                    153:                        if (frags == fs->fs_frag) {
                    154:                                newcg->cg_cs.cs_nbfree++;
                    155:                                j = cbtocylno(fs, i);
                    156:                                cg_blktot(newcg)[j]++;
                    157:                                cg_blks(fs, newcg, j)[cbtorpos(fs, i)]++;
                    158:                        } else if (frags > 0) {
                    159:                                newcg->cg_cs.cs_nffree += frags;
                    160:                                blk = blkmap(fs, cg_blksfree(newcg), i);
                    161:                                fragacct(fs, blk, newcg->cg_frsum, 1);
                    162:                        }
                    163:                }
                    164:                cstotal.cs_nffree += newcg->cg_cs.cs_nffree;
                    165:                cstotal.cs_nbfree += newcg->cg_cs.cs_nbfree;
                    166:                cstotal.cs_nifree += newcg->cg_cs.cs_nifree;
                    167:                cstotal.cs_ndir += newcg->cg_cs.cs_ndir;
                    168:                cs = &fs->fs_cs(fs, c);
                    169:                if (bcmp((char *)&newcg->cg_cs, (char *)cs, sizeof *cs) != 0 &&
                    170:                    dofix(&idesc, "FREE BLK COUNT(S) WRONG IN SUPERBLK")) {
                    171:                        bcopy((char *)&newcg->cg_cs, (char *)cs, sizeof *cs);
                    172:                        sbdirty();
                    173:                }
                    174:                if (cvtflag) {
                    175:                        bcopy((char *)newcg, (char *)cg, fs->fs_cgsize);
                    176:                        cgdirty();
                    177:                        continue;
                    178:                }
                    179:                if (bcmp(cg_inosused(newcg),
                    180:                         cg_inosused(cg), mapsize) != 0 &&
                    181:                    dofix(&idesc, "BLK(S) MISSING IN BIT MAPS")) {
                    182:                        bcopy(cg_inosused(newcg), cg_inosused(cg), mapsize);
                    183:                        cgdirty();
                    184:                }
                    185:                if ((bcmp((char *)newcg, (char *)cg, basesize) != 0 ||
                    186:                     bcmp((char *)&cg_blktot(newcg)[0],
                    187:                          (char *)&cg_blktot(cg)[0], sumsize) != 0) &&
                    188:                    dofix(&idesc, "SUMMARY INFORMATION BAD")) {
                    189:                        bcopy((char *)newcg, (char *)cg, basesize);
                    190:                        bcopy((char *)&cg_blktot(newcg)[0],
                    191:                              (char *)&cg_blktot(cg)[0], sumsize);
                    192:                        cgdirty();
                    193:                }
                    194:        }
                    195:        if (fs->fs_postblformat == FS_42POSTBLFMT)
                    196:                fs->fs_nrpos = savednrpos;
                    197:        if (bcmp((char *)&cstotal, (char *)&fs->fs_cstotal, sizeof *cs) != 0
                    198:            && dofix(&idesc, "FREE BLK COUNT(S) WRONG IN SUPERBLK")) {
                    199:                bcopy((char *)&cstotal, (char *)&fs->fs_cstotal, sizeof *cs);
                    200:                fs->fs_ronly = 0;
                    201:                fs->fs_fmod = 0;
                    202:                sbdirty();
                    203:        }
                    204: }

unix.superglobalmegacorp.com

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