1*16266Smckusick #ifndef lint 2*16266Smckusick static char version[] = "@(#)pass4.c 3.1 (Berkeley) 03/31/84"; 3*16266Smckusick #endif 4*16266Smckusick 5*16266Smckusick #include <sys/param.h> 6*16266Smckusick #include <sys/inode.h> 7*16266Smckusick #include <sys/fs.h> 8*16266Smckusick #include "fsck.h" 9*16266Smckusick 10*16266Smckusick int pass4check(); 11*16266Smckusick 12*16266Smckusick pass4() 13*16266Smckusick { 14*16266Smckusick register ino_t inumber, *blp; 15*16266Smckusick int n; 16*16266Smckusick struct inodesc idesc; 17*16266Smckusick 18*16266Smckusick bzero((char *)&idesc, sizeof(struct inodesc)); 19*16266Smckusick idesc.id_type = ADDR; 20*16266Smckusick idesc.id_func = pass4check; 21*16266Smckusick for (inumber = ROOTINO; inumber <= lastino; inumber++) { 22*16266Smckusick idesc.id_number = inumber; 23*16266Smckusick switch (statemap[inumber]) { 24*16266Smckusick 25*16266Smckusick case FSTATE: 26*16266Smckusick n = lncntp[inumber]; 27*16266Smckusick if (n) 28*16266Smckusick adjust(&idesc, (short)n); 29*16266Smckusick else { 30*16266Smckusick for (blp = badlncnt;blp < badlnp; blp++) 31*16266Smckusick if (*blp == inumber) { 32*16266Smckusick clri(&idesc, "UNREF", 1); 33*16266Smckusick break; 34*16266Smckusick } 35*16266Smckusick } 36*16266Smckusick break; 37*16266Smckusick 38*16266Smckusick case DSTATE: 39*16266Smckusick clri(&idesc, "UNREF", 1); 40*16266Smckusick break; 41*16266Smckusick 42*16266Smckusick case CLEAR: 43*16266Smckusick clri(&idesc, "BAD/DUP", 1); 44*16266Smckusick break; 45*16266Smckusick } 46*16266Smckusick } 47*16266Smckusick if (imax - ROOTINO - n_files != sblock.fs_cstotal.cs_nifree) { 48*16266Smckusick pwarn("FREE INODE COUNT WRONG IN SUPERBLK"); 49*16266Smckusick if (preen) 50*16266Smckusick printf(" (FIXED)\n"); 51*16266Smckusick if (preen || reply("FIX") == 1) { 52*16266Smckusick sblock.fs_cstotal.cs_nifree = imax - ROOTINO - n_files; 53*16266Smckusick sbdirty(); 54*16266Smckusick } 55*16266Smckusick } 56*16266Smckusick flush(&dfile, &fileblk); 57*16266Smckusick } 58*16266Smckusick 59*16266Smckusick pass4check(idesc) 60*16266Smckusick register struct inodesc *idesc; 61*16266Smckusick { 62*16266Smckusick register daddr_t *dlp; 63*16266Smckusick int nfrags, res = KEEPON; 64*16266Smckusick daddr_t blkno = idesc->id_blkno; 65*16266Smckusick 66*16266Smckusick for (nfrags = idesc->id_numfrags; nfrags > 0; blkno++, nfrags--) { 67*16266Smckusick if (outrange(blkno, 1)) 68*16266Smckusick res = SKIP; 69*16266Smckusick else if (getbmap(blkno)) { 70*16266Smckusick for (dlp = duplist; dlp < enddup; dlp++) 71*16266Smckusick if (*dlp == blkno) { 72*16266Smckusick *dlp = *--enddup; 73*16266Smckusick return (KEEPON); 74*16266Smckusick } 75*16266Smckusick clrbmap(blkno); 76*16266Smckusick n_blks--; 77*16266Smckusick } 78*16266Smckusick } 79*16266Smckusick return (res); 80*16266Smckusick } 81