122052Sdist /* 239976Smckusick * Copyright (c) 1980, 1986 The Regents of the University of California. 339976Smckusick * All rights reserved. 439976Smckusick * 5*42702Sbostic * %sccs.include.redist.c% 622052Sdist */ 722052Sdist 816266Smckusick #ifndef lint 9*42702Sbostic static char sccsid[] = "@(#)pass4.c 5.9 (Berkeley) 06/01/90"; 1039976Smckusick #endif /* not lint */ 1116266Smckusick 1216266Smckusick #include <sys/param.h> 1339383Smckusick #include <ufs/dinode.h> 1438337Smckusick #include <ufs/fs.h> 1516266Smckusick #include "fsck.h" 1616266Smckusick 1716266Smckusick int pass4check(); 1816266Smckusick 1916266Smckusick pass4() 2016266Smckusick { 2121759Smckusick register ino_t inumber; 2221759Smckusick register struct zlncnt *zlnp; 2341134Smckusick struct dinode *dp; 2421759Smckusick struct inodesc idesc; 2516266Smckusick int n; 2616266Smckusick 2716266Smckusick bzero((char *)&idesc, sizeof(struct inodesc)); 2816266Smckusick idesc.id_type = ADDR; 2916266Smckusick idesc.id_func = pass4check; 3016266Smckusick for (inumber = ROOTINO; inumber <= lastino; inumber++) { 3116266Smckusick idesc.id_number = inumber; 3216266Smckusick switch (statemap[inumber]) { 3316266Smckusick 3416266Smckusick case FSTATE: 3517937Smckusick case DFOUND: 3616266Smckusick n = lncntp[inumber]; 3716266Smckusick if (n) 3816266Smckusick adjust(&idesc, (short)n); 3916266Smckusick else { 4021759Smckusick for (zlnp = zlnhead; zlnp; zlnp = zlnp->next) 4121759Smckusick if (zlnp->zlncnt == inumber) { 4226479Smckusick zlnp->zlncnt = zlnhead->zlncnt; 4326479Smckusick zlnp = zlnhead; 4426479Smckusick zlnhead = zlnhead->next; 4539972Smckusick free((char *)zlnp); 4616266Smckusick clri(&idesc, "UNREF", 1); 4716266Smckusick break; 4816266Smckusick } 4916266Smckusick } 5016266Smckusick break; 5116266Smckusick 5216266Smckusick case DSTATE: 5316266Smckusick clri(&idesc, "UNREF", 1); 5416266Smckusick break; 5516266Smckusick 5617937Smckusick case DCLEAR: 5741134Smckusick dp = ginode(inumber); 5841134Smckusick if (dp->di_size == 0) { 5941134Smckusick clri(&idesc, "ZERO LENGTH", 1); 6041134Smckusick break; 6141134Smckusick } 6241134Smckusick /* fall through */ 6317937Smckusick case FCLEAR: 6416266Smckusick clri(&idesc, "BAD/DUP", 1); 6516266Smckusick break; 6626480Smckusick 6726480Smckusick case USTATE: 6826480Smckusick break; 6926480Smckusick 7026480Smckusick default: 7126480Smckusick errexit("BAD STATE %d FOR INODE I=%d", 7226480Smckusick statemap[inumber], inumber); 7316266Smckusick } 7416266Smckusick } 7516266Smckusick } 7616266Smckusick 7716266Smckusick pass4check(idesc) 7816266Smckusick register struct inodesc *idesc; 7916266Smckusick { 8021744Smckusick register struct dups *dlp; 8116266Smckusick int nfrags, res = KEEPON; 8216266Smckusick daddr_t blkno = idesc->id_blkno; 8316266Smckusick 8416266Smckusick for (nfrags = idesc->id_numfrags; nfrags > 0; blkno++, nfrags--) { 8539972Smckusick if (chkrange(blkno, 1)) { 8616266Smckusick res = SKIP; 8739972Smckusick } else if (testbmap(blkno)) { 8821744Smckusick for (dlp = duplist; dlp; dlp = dlp->next) { 8921744Smckusick if (dlp->dup != blkno) 9021744Smckusick continue; 9121744Smckusick dlp->dup = duplist->dup; 9221744Smckusick dlp = duplist; 9321744Smckusick duplist = duplist->next; 9439972Smckusick free((char *)dlp); 9521744Smckusick break; 9621744Smckusick } 9721744Smckusick if (dlp == 0) { 9821744Smckusick clrbmap(blkno); 9921744Smckusick n_blks--; 10021744Smckusick } 10116266Smckusick } 10216266Smckusick } 10316266Smckusick return (res); 10416266Smckusick } 105