116266Smckusick #ifndef lint 2*21759Smckusick static char version[] = "@(#)pass4.c 3.4 (Berkeley) 06/02/85"; 316266Smckusick #endif 416266Smckusick 516266Smckusick #include <sys/param.h> 616266Smckusick #include <sys/inode.h> 716266Smckusick #include <sys/fs.h> 816266Smckusick #include "fsck.h" 916266Smckusick 1016266Smckusick int pass4check(); 1116266Smckusick 1216266Smckusick pass4() 1316266Smckusick { 14*21759Smckusick register ino_t inumber; 15*21759Smckusick register struct zlncnt *zlnp; 16*21759Smckusick struct inodesc idesc; 1716266Smckusick int n; 1816266Smckusick 1916266Smckusick bzero((char *)&idesc, sizeof(struct inodesc)); 2016266Smckusick idesc.id_type = ADDR; 2116266Smckusick idesc.id_func = pass4check; 2216266Smckusick for (inumber = ROOTINO; inumber <= lastino; inumber++) { 2316266Smckusick idesc.id_number = inumber; 2416266Smckusick switch (statemap[inumber]) { 2516266Smckusick 2616266Smckusick case FSTATE: 2717937Smckusick case DFOUND: 2816266Smckusick n = lncntp[inumber]; 2916266Smckusick if (n) 3016266Smckusick adjust(&idesc, (short)n); 3116266Smckusick else { 32*21759Smckusick for (zlnp = zlnhead; zlnp; zlnp = zlnp->next) 33*21759Smckusick if (zlnp->zlncnt == inumber) { 3416266Smckusick clri(&idesc, "UNREF", 1); 3516266Smckusick break; 3616266Smckusick } 3716266Smckusick } 3816266Smckusick break; 3916266Smckusick 4016266Smckusick case DSTATE: 4116266Smckusick clri(&idesc, "UNREF", 1); 4216266Smckusick break; 4316266Smckusick 4417937Smckusick case DCLEAR: 4517937Smckusick case FCLEAR: 4616266Smckusick clri(&idesc, "BAD/DUP", 1); 4716266Smckusick break; 4816266Smckusick } 4916266Smckusick } 5016266Smckusick } 5116266Smckusick 5216266Smckusick pass4check(idesc) 5316266Smckusick register struct inodesc *idesc; 5416266Smckusick { 5521744Smckusick register struct dups *dlp; 5616266Smckusick int nfrags, res = KEEPON; 5716266Smckusick daddr_t blkno = idesc->id_blkno; 5816266Smckusick 5916266Smckusick for (nfrags = idesc->id_numfrags; nfrags > 0; blkno++, nfrags--) { 6021744Smckusick if (outrange(blkno, 1)) { 6116266Smckusick res = SKIP; 6221744Smckusick } else if (getbmap(blkno)) { 6321744Smckusick for (dlp = duplist; dlp; dlp = dlp->next) { 6421744Smckusick if (dlp->dup != blkno) 6521744Smckusick continue; 6621744Smckusick dlp->dup = duplist->dup; 6721744Smckusick dlp = duplist; 6821744Smckusick duplist = duplist->next; 69*21759Smckusick /* free(dlp); */ 7021744Smckusick break; 7121744Smckusick } 7221744Smckusick if (dlp == 0) { 7321744Smckusick clrbmap(blkno); 7421744Smckusick n_blks--; 7521744Smckusick } 7616266Smckusick } 7716266Smckusick } 7816266Smckusick return (res); 7916266Smckusick } 80