1 #ifndef lint 2 static char version[] = "@(#)pass4.c 3.2 (Berkeley) 02/08/85"; 3 #endif 4 5 #include <sys/param.h> 6 #include <sys/inode.h> 7 #include <sys/fs.h> 8 #include "fsck.h" 9 10 int pass4check(); 11 12 pass4() 13 { 14 register ino_t inumber, *blp; 15 int n; 16 struct inodesc idesc; 17 18 bzero((char *)&idesc, sizeof(struct inodesc)); 19 idesc.id_type = ADDR; 20 idesc.id_func = pass4check; 21 for (inumber = ROOTINO; inumber <= lastino; inumber++) { 22 idesc.id_number = inumber; 23 switch (statemap[inumber]) { 24 25 case FSTATE: 26 case DFOUND: 27 n = lncntp[inumber]; 28 if (n) 29 adjust(&idesc, (short)n); 30 else { 31 for (blp = badlncnt;blp < badlnp; blp++) 32 if (*blp == inumber) { 33 clri(&idesc, "UNREF", 1); 34 break; 35 } 36 } 37 break; 38 39 case DSTATE: 40 clri(&idesc, "UNREF", 1); 41 break; 42 43 case DCLEAR: 44 case FCLEAR: 45 clri(&idesc, "BAD/DUP", 1); 46 break; 47 } 48 } 49 } 50 51 pass4check(idesc) 52 register struct inodesc *idesc; 53 { 54 register daddr_t *dlp; 55 int nfrags, res = KEEPON; 56 daddr_t blkno = idesc->id_blkno; 57 58 for (nfrags = idesc->id_numfrags; nfrags > 0; blkno++, nfrags--) { 59 if (outrange(blkno, 1)) 60 res = SKIP; 61 else if (getbmap(blkno)) { 62 for (dlp = duplist; dlp < enddup; dlp++) 63 if (*dlp == blkno) { 64 *dlp = *--enddup; 65 return (KEEPON); 66 } 67 clrbmap(blkno); 68 n_blks--; 69 } 70 } 71 return (res); 72 } 73