- free(lncntp);
- if (dfile.mod) {
- if (preen) {
- if (hotroot)
- exit(4);
- } else {
- printf("\n***** FILE SYSTEM WAS MODIFIED *****\n");
- if (hotroot) {
- printf("\n***** BOOT UNIX (NO SYNC!) *****\n");
- exit(4);
- }
- }
- }
- sync(); /* ??? */
-}
-
-setup(dev)
- char *dev;
-{
- dev_t rootdev;
- struct stat statb;
- int super = bflag ? bflag : SBLOCK;
- int i, j, size;
- int c, d, cgd;
-
- bflag = 0;
- if (stat("/", &statb) < 0)
- errexit("Can't stat root\n");
- rootdev = statb.st_dev;
- if (stat(dev, &statb) < 0) {
- error("Can't stat %s\n", dev);
- return (0);
- }
- rawflg = 0;
- if ((statb.st_mode & S_IFMT) == S_IFBLK)
- ;
- else if ((statb.st_mode & S_IFMT) == S_IFCHR)
- rawflg++;
- else {
- if (reply("file is not a block or character device; OK") == 0)
- return (0);
- }
- if (rootdev == statb.st_rdev)
- hotroot++;
- if ((dfile.rfdes = open(dev, 0)) < 0) {
- error("Can't open %s\n", dev);
- return (0);
- }
- if (preen == 0)
- printf("** %s", dev);
- if (nflag || (dfile.wfdes = open(dev, 1)) < 0) {
- dfile.wfdes = -1;
- if (preen)
- pfatal("NO WRITE ACCESS");
- printf(" (NO WRITE)");
- }
- if (preen == 0)
- printf("\n");
- fixcg = 0; inosumbad = 0; offsumbad = 0; frsumbad = 0; sbsumbad = 0;
- dfile.mod = 0;
- n_files = n_blks = n_ffree = n_bfree = 0;
- muldup = enddup = &duplist[0];
- badlnp = &badlncnt[0];
- lfdir = 0;
- rplyflag = 0;
- initbarea(&sblk);
- initbarea(&fileblk);
- initbarea(&inoblk);
- initbarea(&cgblk);
- /*
- * Read in the super block and its summary info.
- */
- if (bread(&dfile, &sblock, super, SBSIZE) == 0)
- return (0);
- sblk.b_bno = super;
- sblk.b_size = SBSIZE;
- /*
- * run a few consistency checks of the super block
- */
- if (sblock.fs_magic != FS_MAGIC)
- { badsb("MAGIC NUMBER WRONG"); return (0); }
- if (sblock.fs_ncg < 1)
- { badsb("NCG OUT OF RANGE"); return (0); }
- if (sblock.fs_cpg < 1 || sblock.fs_cpg > MAXCPG)
- { badsb("CPG OUT OF RANGE"); return (0); }
- if (sblock.fs_nsect < 1)
- { badsb("NSECT < 1"); return (0); }
- if (sblock.fs_ntrak < 1)
- { badsb("NTRAK < 1"); return (0); }
- if (sblock.fs_spc != sblock.fs_nsect * sblock.fs_ntrak)
- { badsb("SPC DOES NOT JIVE w/NTRAK*NSECT"); return (0); }
- if (sblock.fs_ipg % INOPB(&sblock))
- { badsb("INODES NOT MULTIPLE OF A BLOCK"); return (0); }
- if (cgdmin(&sblock, 0) >= sblock.fs_cpg * sblock.fs_spc / NSPF(&sblock))
- { badsb("IMPLIES MORE INODE THAN DATA BLOCKS"); return (0); }
- if (sblock.fs_ncg * sblock.fs_cpg < sblock.fs_ncyl ||
- (sblock.fs_ncg - 1) * sblock.fs_cpg >= sblock.fs_ncyl)
- { badsb("NCYL DOES NOT JIVE WITH NCG*CPG"); return (0); }
- if (sblock.fs_fpg != sblock.fs_cpg * sblock.fs_spc / NSPF(&sblock))
- { badsb("FPG DOES NOT JIVE WITH CPG & SPC"); return (0); }
- if (sblock.fs_size * NSPF(&sblock) <=
- (sblock.fs_ncyl - 1) * sblock.fs_spc)
- { badsb("SIZE PREPOSTEROUSLY SMALL"); return (0); }
- if (sblock.fs_size * NSPF(&sblock) > sblock.fs_ncyl * sblock.fs_spc)
- { badsb("SIZE PREPOSTEROUSLY LARGE"); return (0); }
- /* rest we COULD repair... */
- if (sblock.fs_cgsize != fragroundup(&sblock,
- sizeof(struct cg) + howmany(sblock.fs_fpg, NBBY)))
- { badsb("CGSIZE INCORRECT"); return (0); }
- if (sblock.fs_cssize !=
- fragroundup(&sblock, sblock.fs_ncg * sizeof(struct csum)))
- { badsb("CSSIZE INCORRECT"); return (0); }
- fmax = sblock.fs_size;
- imax = sblock.fs_ncg * sblock.fs_ipg;
- n_bad = cgsblock(&sblock, 0); /* boot block plus dedicated sblock */
- /*
- * read in the summary info.
- */
- for (i = 0, j = 0; i < sblock.fs_cssize; i += sblock.fs_bsize, j++) {
- size = sblock.fs_cssize - i < sblock.fs_bsize ?
- sblock.fs_cssize - i : sblock.fs_bsize;
- sblock.fs_csp[j] = (struct csum *)calloc(1, size);
- bread(&dfile, (char *)sblock.fs_csp[j],
- fsbtodb(&sblock, sblock.fs_csaddr + j * sblock.fs_frag),
- size);
- }
- /*
- * allocate and initialize the necessary maps
- */
- bmapsz = roundup(howmany(fmax, NBBY), sizeof(short));
- blockmap = (char *)calloc(bmapsz, sizeof (char));
- if (blockmap == NULL) {
- printf("cannot alloc %d bytes for blockmap\n", bmapsz);
- exit(1);
- }
- freemap = (char *)calloc(bmapsz, sizeof (char));
- if (freemap == NULL) {
- printf("cannot alloc %d bytes for freemap\n", bmapsz);
- exit(1);
- }
- statemap = (char *)calloc(imax+1, sizeof(char));
- if (statemap == NULL) {
- printf("cannot alloc %d bytes for statemap\n", imax + 1);
- exit(1);
- }
- lncntp = (short *)calloc(imax+1, sizeof(short));
- if (lncntp == NULL) {
- printf("cannot alloc %d bytes for lncntp\n",
- (imax + 1) * sizeof(short));
- exit(1);
- }
- for (c = 0; c < sblock.fs_ncg; c++) {
- cgd = cgdmin(&sblock, c);
- if (c == 0) {
- d = cgbase(&sblock, c);
- cgd += howmany(sblock.fs_cssize, sblock.fs_fsize);
- } else
- d = cgsblock(&sblock, c);
- for (; d < cgd; d++)
- setbmap(d);
- }
-
- startinum = imax + 1;
- return (1);
-
-badsb:
- ckfini();
- return (0);
-}
-
-pass1()
-{
- register int c, i, n, j;
- register DINODE *dp;
- int savino, ndb, partial;
-
- pfunc = pass1check;
- inum = 0;
- n_blks += howmany(sblock.fs_cssize, sblock.fs_fsize);
- for (c = 0; c < sblock.fs_ncg; c++) {
- if (getblk(&cgblk, cgtod(&sblock, c), sblock.fs_cgsize) == 0)
- continue;
- if (cgrp.cg_magic != CG_MAGIC) {
- pfatal("cg %d: bad magic number\n", c);
- bzero((caddr_t)&cgrp, sblock.fs_cgsize);
- }
- n = 0;
- for (i = 0; i < sblock.fs_ipg; i++, inum++) {
- dp = ginode();
- if (dp == NULL)
- continue;
- n++;
- if (ALLOC) {
- if (!isset(cgrp.cg_iused, i)) {
- if (debug)
- printf("%d bad, not used\n",
- inum);
- inosumbad++;
- }
- n--;
- lastino = inum;
- if (ftypeok(dp) == 0)
- goto unknown;
- if (dp->di_size < 0) {
- if (debug)
- printf("bad size %d:",
- dp->di_size);
- goto unknown;
- }
- ndb = howmany(dp->di_size, sblock.fs_bsize);
- if (SPECIAL)
- ndb++;
- for (j = ndb; j < NDADDR; j++)
- if (dp->di_db[j] != 0) {
- if (debug)
- printf("bad direct addr:");
- goto unknown;
- }
- for (j = 0, ndb -= NDADDR; ndb > 0; j++)
- ndb /= NINDIR(&sblock);
- for (; j < NIADDR; j++)
- if (dp->di_ib[j] != 0) {
- if (debug)
- printf("bad indirect addr:");
- goto unknown;
- }
- n_files++;
- lncntp[inum] = dp->di_nlink;
- if (dp->di_nlink <= 0) {
- if (badlnp < &badlncnt[MAXLNCNT])
- *badlnp++ = inum;
- else {
- pfatal("LINK COUNT TABLE OVERFLOW");
- if (reply("CONTINUE") == 0)
- errexit("");
- }
- }
- statemap[inum] = DIRCT ? DSTATE : FSTATE;
- badblk = dupblk = 0; filsize = 0; maxblk = 0;
- ckinode(dp, ADDR);
- continue;
- unknown:
- pfatal("UNKNOWN FILE TYPE I=%u", inum);
- if (reply("CLEAR") == 1) {
- zapino(dp);
- inodirty();
- inosumbad++;
- }
- } else {
- if (isset(cgrp.cg_iused, i)) {
- if (debug)
- printf("%d bad, marked used\n",
- inum);
- inosumbad++;
- n--;
- }
- partial = 0;
- for (j = 0; j < NDADDR; j++)
- if (dp->di_db[j] != 0)
- partial++;
- for (j = 0; j < NIADDR; j++)
- if (dp->di_ib[j] != 0)
- partial++;
- if (partial || dp->di_mode != 0 ||
- dp->di_size != 0) {
- pfatal("PARTIALLY ALLOCATED INODE I=%u", inum);
- if (reply("CLEAR") == 1) {
- zapino(dp);
- inodirty();
- inosumbad++;
- }
- }
- }
- }
- if (n != cgrp.cg_cs.cs_nifree) {
- if (debug)
- printf("cg[%d].cg_cs.cs_nifree is %d; calc %d\n",
- c, cgrp.cg_cs.cs_nifree, n);
- inosumbad++;
- }
- if (cgrp.cg_cs.cs_nbfree != sblock.fs_cs(&sblock, c).cs_nbfree
- || cgrp.cg_cs.cs_nffree != sblock.fs_cs(&sblock, c).cs_nffree
- || cgrp.cg_cs.cs_nifree != sblock.fs_cs(&sblock, c).cs_nifree
- || cgrp.cg_cs.cs_ndir != sblock.fs_cs(&sblock, c).cs_ndir)
- sbsumbad++;
- }
-}
-
-pass1check(blk, size)
- daddr_t blk;
- int size;
-{
- register daddr_t *dlp;
- int res = KEEPON;
- int anyout;
-
- anyout = outrange(blk, size);
- for (; size > 0; blk++, size--) {
- if (anyout && outrange(blk, 1)) {
- blkerr("BAD", blk);
- if (++badblk >= MAXBAD) {
- pwarn("EXCESSIVE BAD BLKS I=%u", inum);
- if (preen)
- printf(" (SKIPPING)\n");
- else if (reply("CONTINUE") == 0)
- errexit("");
- return (STOP);
- }
- res = SKIP;
- } else if (getbmap(blk)) {
- blkerr("DUP", blk);
- if (++dupblk >= MAXDUP) {
- pwarn("EXCESSIVE DUP BLKS I=%u", inum);
- if (preen)
- printf(" (SKIPPING)\n");
- else if (reply("CONTINUE") == 0)
- errexit("");
- return (STOP);
- }
- if (enddup >= &duplist[DUPTBLSIZE]) {
- pfatal("DUP TABLE OVERFLOW.");
- if (reply("CONTINUE") == 0)
- errexit("");
- return (STOP);
- }
- for (dlp = duplist; dlp < muldup; dlp++)
- if (*dlp == blk) {
- *enddup++ = blk;
- break;
- }
- if (dlp >= muldup) {
- *enddup++ = *muldup;
- *muldup++ = blk;
- }
- } else {
- n_blks++;
- setbmap(blk);
- }
- filsize++;
- }
- return (res);
-}
-
-pass1b()
-{
- register int c, i;
- register DINODE *dp;
-
- pfunc = pass1bcheck;
- inum = 0;
- for (c = 0; c < sblock.fs_ncg; c++) {
- for (i = 0; i < sblock.fs_ipg; i++, inum++) {
- dp = ginode();
- if (dp == NULL)
- continue;
- if (statemap[inum] != USTATE &&
- (ckinode(dp, ADDR) & STOP))
- goto out1b;
- }
- }
-out1b:
- flush(&dfile, &inoblk);
-}
-
-pass1bcheck(blk, size)
- daddr_t blk;
- int size;
-{
- register daddr_t *dlp;
- int res = KEEPON;
-
- for (; size > 0; blk++, size--) {
- if (outrange(blk, 1))
- res = SKIP;
- for (dlp = duplist; dlp < muldup; dlp++)
- if (*dlp == blk) {
- blkerr("DUP", blk);
- *dlp = *--muldup;
- *muldup = blk;
- if (muldup == duplist)
- return (STOP);
- }
- }
- return (res);
-}
-
-pass2()
-{
- register DINODE *dp;
-
- inum = ROOTINO;
- thisname = pathp = pathname;
- pfunc = pass2check;
- switch (statemap[inum]) {
-
- case USTATE:
- errexit("ROOT INODE UNALLOCATED. TERMINATING.\n");
-
- case FSTATE:
- pfatal("ROOT INODE NOT DIRECTORY");
- if (reply("FIX") == 0 || (dp = ginode()) == NULL)
- errexit("");
- dp->di_mode &= ~IFMT;
- dp->di_mode |= IFDIR;
- inodirty();
- inosumbad++;
- statemap[inum] = DSTATE;
- /* fall into ... */
-
- case DSTATE:
- descend();
- break;
-
- case CLEAR:
- pfatal("DUPS/BAD IN ROOT INODE");
- printf("\n");
- if (reply("CONTINUE") == 0)
- errexit("");
- statemap[inum] = DSTATE;
- descend();
- }
-}
-
-pass2check(dirp)
- register DIRECT *dirp;
-{
- register char *p;
- register n;
- DINODE *dp;
-
- if ((inum = dirp->d_ino) == 0)
- return (KEEPON);
- thisname = pathp;
- for (p = dirp->d_name; p < &dirp->d_name[MAXNAMLEN]; )
- if ((*pathp++ = *p++) == 0) {
- --pathp;
- break;
- }
- *pathp = 0;
- n = 0;
- if (inum > imax || inum <= 0)
- n = direrr("I OUT OF RANGE");
- else {
-again:
- switch (statemap[inum]) {
- case USTATE:
- n = direrr("UNALLOCATED");
- break;
-
- case CLEAR:
- if ((n = direrr("DUP/BAD")) == 1)
- break;
- if ((dp = ginode()) == NULL)
- break;
- statemap[inum] = DIRCT ? DSTATE : FSTATE;
- goto again;
-
- case FSTATE:
- lncntp[inum]--;
- break;
-
- case DSTATE:
- lncntp[inum]--;
- descend();
- break;
- }
- }
- pathp = thisname;
- if (n == 0)
- return (KEEPON);
- dirp->d_ino = 0;
- return (KEEPON|ALTERD);
-}
-
-pass3()
-{
- ino_t savino;
- register DINODE *dp;
-
- for (inum = ROOTINO; inum <= lastino; inum++) {
- if (statemap[inum] == DSTATE) {
- pfunc = findino;
- srchname = "..";
- savino = inum;
- do {
- orphan = inum;
- if ((dp = ginode()) == NULL)
- break;
- filsize = dp->di_size;
- parentdir = 0;
- ckinode(dp, DATA);
- if ((inum = parentdir) == 0)
- break;
- } while (statemap[inum] == DSTATE);
- inum = orphan;
- if (linkup() == 1) {
- thisname = pathp = pathname;
- *pathp++ = '?';
- pfunc = pass2check;
- descend();
- }
- inum = savino;
- }
- }
-}
-
-pass4()
-{
- register int n;
- register ino_t *blp;
-
- pfunc = pass4check;
- for (inum = ROOTINO; inum <= lastino; inum++) {
- switch (statemap[inum]) {
-
- case FSTATE:
- n = lncntp[inum];
- if (n)
- adjust((short)n);
- else {
- for (blp = badlncnt;blp < badlnp; blp++)
- if (*blp == inum) {
- clri("UNREF", 1);
- break;
- }
- }
- break;
-
- case DSTATE:
- clri("UNREF", 1);
- break;
-
- case CLEAR:
- clri("BAD/DUP", 1);
- break;
- }
- }
- if (imax - ROOTINO - n_files != sblock.fs_cstotal.cs_nifree) {
- pwarn("FREE INODE COUNT WRONG IN SUPERBLK");
- if (preen)
- printf(" (FIXED)\n");
- if (preen || reply("FIX") == 1) {
- sblock.fs_cstotal.cs_nifree = imax - ROOTINO - n_files;
- sbdirty();
- }
- }
- flush(&dfile, &fileblk);
-}
-
-pass4check(blk, size)
- daddr_t blk;
-{
- register daddr_t *dlp;
- int res = KEEPON;
-
- for (; size > 0; blk++, size--) {
- if (outrange(blk, 1))
- res = SKIP;
- else if (getbmap(blk)) {
- for (dlp = duplist; dlp < enddup; dlp++)
- if (*dlp == blk) {
- *dlp = *--enddup;
- return (KEEPON);
- }
- clrbmap(blk);
- n_blks--;
- }
- }
- return (res);
-}
-
-pass5()
-{
- register int c, n, i, b, d;
- short bo[MAXCPG][NRPOS];
- long botot[MAXCPG];
- long frsum[MAXFRAG];
- int blk;
- daddr_t cbase;
- int blockbits = (1<<sblock.fs_frag)-1;
-
- bcopy(blockmap, freemap, (unsigned)bmapsz);
- dupblk = 0;
- n_index = sblock.fs_ncg * (cgdmin(&sblock, 0) - cgtod(&sblock, 0));
- for (c = 0; c < sblock.fs_ncg; c++) {
- cbase = cgbase(&sblock, c);
- bzero(botot, sizeof (botot));
- bzero(bo, sizeof (bo));
- bzero(frsum, sizeof (frsum));
- /*
- * need to account for the super blocks
- * which appear (inaccurately) bad
- */
- n_bad += cgtod(&sblock, c) - cgsblock(&sblock, c);
- if (getblk(&cgblk, cgtod(&sblock, c), sblock.fs_cgsize) == 0)
- continue;
- if (cgrp.cg_magic != CG_MAGIC) {
- pfatal("cg %d: bad magic number\n", c);
- bzero((caddr_t)&cgrp, sblock.fs_cgsize);
- }
- for (b = 0; b < sblock.fs_fpg; b += sblock.fs_frag) {
- blk = blkmap(&sblock, cgrp.cg_free, b);
- if (blk == 0)
- continue;
- if (blk == blockbits) {
- if (pass5check(cbase+b, sblock.fs_frag) == STOP)
- goto out5;
- /* this is clumsy ... */
- n_ffree -= sblock.fs_frag;
- n_bfree++;
- botot[cbtocylno(&sblock, b)]++;
- bo[cbtocylno(&sblock, b)]
- [cbtorpos(&sblock, b)]++;
- continue;
- }
- for (d = 0; d < sblock.fs_frag; d++)
- if ((blk & (1<<d)) &&
- pass5check(cbase+b+d,1) == STOP)
- goto out5;
- fragacct(&sblock, blk, frsum, 1);
- }
- if (bcmp(cgrp.cg_frsum, frsum, sizeof (frsum))) {
- if (debug)
- for (i = 0; i < sblock.fs_frag; i++)
- if (cgrp.cg_frsum[i] != frsum[i])
- printf("cg[%d].cg_frsum[%d] have %d calc %d\n",
- c, i, cgrp.cg_frsum[i], frsum[i]);
- frsumbad++;
- }
- if (bcmp(cgrp.cg_btot, botot, sizeof (botot))) {
- if (debug)
- for (n = 0; n < sblock.fs_cpg; n++)
- if (botot[n] != cgrp.cg_btot[n])
- printf("cg[%d].cg_btot[%d] have %d calc %d\n",
- c, n, cgrp.cg_btot[n], botot[n]);
- offsumbad++;
- }
- if (bcmp(cgrp.cg_b, bo, sizeof (bo))) {
- if (debug)
- for (i = 0; i < NRPOS; i++)
- if (bo[n][i] != cgrp.cg_b[n][i])
- printf("cg[%d].cg_b[%d][%d] have %d calc %d\n",
- c, n, i, cgrp.cg_b[n][i], bo[n][i]);
- offsumbad++;
- }
- }
-out5:
- if (dupblk)
- pwarn("%d DUP BLKS IN BIT MAPS\n", dupblk);
- if (fixcg == 0) {
- if ((b = n_blks+n_ffree+sblock.fs_frag*n_bfree+n_index+n_bad) != fmax) {
- pwarn("%ld BLK(S) MISSING\n", fmax - b);
- fixcg = 1;
- } else if (inosumbad + offsumbad + frsumbad + sbsumbad) {
- pwarn("SUMMARY INFORMATION %s%s%s%sBAD\n",
- inosumbad ? "(INODE FREE) " : "",
- offsumbad ? "(BLOCK OFFSETS) " : "",
- frsumbad ? "(FRAG SUMMARIES) " : "",
- sbsumbad ? "(SUPER BLOCK SUMMARIES) " : "");
- fixcg = 1;
- } else if (n_ffree != sblock.fs_cstotal.cs_nffree ||
- n_bfree != sblock.fs_cstotal.cs_nbfree) {
- pwarn("FREE BLK COUNT(S) WRONG IN SUPERBLK");
- if (preen)
- printf(" (FIXED)\n");
- if (preen || reply("FIX") == 1) {
- sblock.fs_cstotal.cs_nffree = n_ffree;
- sblock.fs_cstotal.cs_nbfree = n_bfree;
- sbdirty();
- }
- }
- }
- if (fixcg) {
- pwarn("BAD CYLINDER GROUPS");
- if (preen)
- printf(" (SALVAGED)\n");
- else if (reply("SALVAGE") == 0)
- fixcg = 0;
- }
-}
-
-pass5check(blk, size)
- daddr_t blk;
- int size;
-{
-
- if (outrange(blk, size)) {
- fixcg = 1;
- if (preen)
- pfatal("BAD BLOCKS IN BIT MAPS.");
- if (++badblk >= MAXBAD) {
- printf("EXCESSIVE BAD BLKS IN BIT MAPS.");
- if (reply("CONTINUE") == 0)
- errexit("");
- return (STOP);
- }
- }
- for (; size > 0; blk++, size--)
- if (getfmap(blk)) {
- fixcg = 1;
- ++dupblk;
- } else {
- n_ffree++;
- setfmap(blk);
- }
- return (KEEPON);
-}
-
-ckinode(dp, flg)
- DINODE *dp;
- register flg;
-{
- register daddr_t *ap;
- register ret;
- int (*func)(), n, ndb, size, offset;
- ino_t number = inum;
- DINODE dino;
-
- if (SPECIAL)
- return (KEEPON);
- dino = *dp;
- func = (flg == ADDR) ? pfunc : dirscan;
- ndb = howmany(dino.di_size, sblock.fs_bsize);
- for (ap = &dino.di_db[0]; ap < &dino.di_db[NDADDR]; ap++) {
- if (--ndb == 0 && (offset = blkoff(&sblock, dino.di_size)) != 0)
- size = numfrags(&sblock, fragroundup(&sblock, offset));
- else
- size = sblock.fs_frag;
- dnum = number;
- if (*ap && (ret = (*func)(*ap, size)) & STOP)
- return (ret);
- }
- for (ap = &dino.di_ib[0], n = 1; n <= 2; ap++, n++) {
- dnum = number;
- if (*ap) {
- ret = iblock(*ap, n, flg,
- dino.di_size - sblock.fs_bsize * NDADDR);
- if (ret & STOP)
- return (ret);
- }
- }
- return (KEEPON);
-}
-
-iblock(blk, ilevel, flg, isize)
- daddr_t blk;
- register ilevel;
- int isize;
-{
- register daddr_t *ap;
- register daddr_t *aplim;
- register int i, n;
- int (*func)(), nif;
- BUFAREA ib;
-
- if (flg == ADDR) {
- func = pfunc;
- if (((n = (*func)(blk, sblock.fs_frag)) & KEEPON) == 0)
- return (n);
- } else
- func = dirscan;
- if (outrange(blk, sblock.fs_frag)) /* protect thyself */
- return (SKIP);
- initbarea(&ib);
- if (getblk(&ib, blk, sblock.fs_bsize) == NULL)
- return (SKIP);
- ilevel--;
- if (ilevel == 0) {
- nif = lblkno(&sblock, isize) + 1;
- } else /* ilevel == 1 */ {
- nif = isize / (sblock.fs_bsize * NINDIR(&sblock)) + 1;
- }
- if (nif > NINDIR(&sblock))
- nif = NINDIR(&sblock);
- aplim = &ib.b_un.b_indir[nif];
- for (ap = ib.b_un.b_indir, i = 1; ap < aplim; ap++, i++)
- if (*ap) {
- if (ilevel > 0)
- n = iblock(*ap, ilevel, flg,
- isize - i*NINDIR(&sblock)*sblock.fs_bsize);
- else
- n = (*func)(*ap, sblock.fs_frag);
- if (n & STOP)
- return (n);
- }
- return (KEEPON);
-}
-
-outrange(blk, cnt)
- daddr_t blk;
- int cnt;
-{
- register int c;
-
- if ((unsigned)(blk+cnt) > fmax)
- return (1);
- c = dtog(&sblock, blk);
- if (blk < cgdmin(&sblock, c)) {
- if ((blk+cnt) > cgsblock(&sblock, c)) {
- if (debug) {
- printf("blk %d < cgdmin %d;",
- blk, cgdmin(&sblock, c));
- printf(" blk+cnt %d > cgsbase %d\n",
- blk+cnt, cgsblock(&sblock, c));
- }
- return (1);
- }
- } else {
- if ((blk+cnt) > cgbase(&sblock, c+1)) {
- if (debug) {
- printf("blk %d >= cgdmin %d;",
- blk, cgdmin(&sblock, c));
- printf(" blk+cnt %d > sblock.fs_fpg %d\n",
- blk+cnt, sblock.fs_fpg);
- }
- return (1);
- }
- }
- return (0);
-}
-
-blkerr(s, blk)
- daddr_t blk;
- char *s;
-{
-
- pfatal("%ld %s I=%u", blk, s, inum);
- printf("\n");
- statemap[inum] = CLEAR;
-}
-
-descend()
-{
- register DINODE *dp;
- register char *savname;
- off_t savsize;
-
- statemap[inum] = FSTATE;
- if ((dp = ginode()) == NULL)