1 #ifndef lint 2 static char version[] = "@(#)pass4.c 3.4 (Berkeley) 06/02/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; 15 register struct zlncnt *zlnp; 16 struct inodesc idesc; 17 int n; 18 19 bzero((char *)&idesc, sizeof(struct inodesc)); 20 idesc.id_type = ADDR; 21 idesc.id_func = pass4check; 22 for (inumber = ROOTINO; inumber <= lastino; inumber++) { 23 idesc.id_number = inumber; 24 switch (statemap[inumber]) { 25 26 case FSTATE: 27 case DFOUND: 28 n = lncntp[inumber]; 29 if (n) 30 adjust(&idesc, (short)n); 31 else { 32 for (zlnp = zlnhead; zlnp; zlnp = zlnp->next) 33 if (zlnp->zlncnt == inumber) { 34 clri(&idesc, "UNREF", 1); 35 break; 36 } 37 } 38 break; 39 40 case DSTATE: 41 clri(&idesc, "UNREF", 1); 42 break; 43 44 case DCLEAR: 45 case FCLEAR: 46 clri(&idesc, "BAD/DUP", 1); 47 break; 48 } 49 } 50 } 51 52 pass4check(idesc) 53 register struct inodesc *idesc; 54 { 55 register struct dups *dlp; 56 int nfrags, res = KEEPON; 57 daddr_t blkno = idesc->id_blkno; 58 59 for (nfrags = idesc->id_numfrags; nfrags > 0; blkno++, nfrags--) { 60 if (outrange(blkno, 1)) { 61 res = SKIP; 62 } else if (getbmap(blkno)) { 63 for (dlp = duplist; dlp; dlp = dlp->next) { 64 if (dlp->dup != blkno) 65 continue; 66 dlp->dup = duplist->dup; 67 dlp = duplist; 68 duplist = duplist->next; 69 /* free(dlp); */ 70 break; 71 } 72 if (dlp == 0) { 73 clrbmap(blkno); 74 n_blks--; 75 } 76 } 77 } 78 return (res); 79 } 80