122052Sdist /* 239976Smckusick * Copyright (c) 1980, 1986 The Regents of the University of California. 339976Smckusick * All rights reserved. 439976Smckusick * 539976Smckusick * Redistribution and use in source and binary forms are permitted 639976Smckusick * provided that the above copyright notice and this paragraph are 739976Smckusick * duplicated in all such forms and that any documentation, 839976Smckusick * advertising materials, and other materials related to such 939976Smckusick * distribution and use acknowledge that the software was developed 1039976Smckusick * by the University of California, Berkeley. The name of the 1139976Smckusick * University may not be used to endorse or promote products derived 1239976Smckusick * from this software without specific prior written permission. 1339976Smckusick * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR 1439976Smckusick * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED 1539976Smckusick * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 1622052Sdist */ 1722052Sdist 1816266Smckusick #ifndef lint 19*41134Smckusick static char sccsid[] = "@(#)pass4.c 5.8 (Berkeley) 04/29/90"; 2039976Smckusick #endif /* not lint */ 2116266Smckusick 2216266Smckusick #include <sys/param.h> 2339383Smckusick #include <ufs/dinode.h> 2438337Smckusick #include <ufs/fs.h> 2516266Smckusick #include "fsck.h" 2616266Smckusick 2716266Smckusick int pass4check(); 2816266Smckusick 2916266Smckusick pass4() 3016266Smckusick { 3121759Smckusick register ino_t inumber; 3221759Smckusick register struct zlncnt *zlnp; 33*41134Smckusick struct dinode *dp; 3421759Smckusick struct inodesc idesc; 3516266Smckusick int n; 3616266Smckusick 3716266Smckusick bzero((char *)&idesc, sizeof(struct inodesc)); 3816266Smckusick idesc.id_type = ADDR; 3916266Smckusick idesc.id_func = pass4check; 4016266Smckusick for (inumber = ROOTINO; inumber <= lastino; inumber++) { 4116266Smckusick idesc.id_number = inumber; 4216266Smckusick switch (statemap[inumber]) { 4316266Smckusick 4416266Smckusick case FSTATE: 4517937Smckusick case DFOUND: 4616266Smckusick n = lncntp[inumber]; 4716266Smckusick if (n) 4816266Smckusick adjust(&idesc, (short)n); 4916266Smckusick else { 5021759Smckusick for (zlnp = zlnhead; zlnp; zlnp = zlnp->next) 5121759Smckusick if (zlnp->zlncnt == inumber) { 5226479Smckusick zlnp->zlncnt = zlnhead->zlncnt; 5326479Smckusick zlnp = zlnhead; 5426479Smckusick zlnhead = zlnhead->next; 5539972Smckusick free((char *)zlnp); 5616266Smckusick clri(&idesc, "UNREF", 1); 5716266Smckusick break; 5816266Smckusick } 5916266Smckusick } 6016266Smckusick break; 6116266Smckusick 6216266Smckusick case DSTATE: 6316266Smckusick clri(&idesc, "UNREF", 1); 6416266Smckusick break; 6516266Smckusick 6617937Smckusick case DCLEAR: 67*41134Smckusick dp = ginode(inumber); 68*41134Smckusick if (dp->di_size == 0) { 69*41134Smckusick clri(&idesc, "ZERO LENGTH", 1); 70*41134Smckusick break; 71*41134Smckusick } 72*41134Smckusick /* fall through */ 7317937Smckusick case FCLEAR: 7416266Smckusick clri(&idesc, "BAD/DUP", 1); 7516266Smckusick break; 7626480Smckusick 7726480Smckusick case USTATE: 7826480Smckusick break; 7926480Smckusick 8026480Smckusick default: 8126480Smckusick errexit("BAD STATE %d FOR INODE I=%d", 8226480Smckusick statemap[inumber], inumber); 8316266Smckusick } 8416266Smckusick } 8516266Smckusick } 8616266Smckusick 8716266Smckusick pass4check(idesc) 8816266Smckusick register struct inodesc *idesc; 8916266Smckusick { 9021744Smckusick register struct dups *dlp; 9116266Smckusick int nfrags, res = KEEPON; 9216266Smckusick daddr_t blkno = idesc->id_blkno; 9316266Smckusick 9416266Smckusick for (nfrags = idesc->id_numfrags; nfrags > 0; blkno++, nfrags--) { 9539972Smckusick if (chkrange(blkno, 1)) { 9616266Smckusick res = SKIP; 9739972Smckusick } else if (testbmap(blkno)) { 9821744Smckusick for (dlp = duplist; dlp; dlp = dlp->next) { 9921744Smckusick if (dlp->dup != blkno) 10021744Smckusick continue; 10121744Smckusick dlp->dup = duplist->dup; 10221744Smckusick dlp = duplist; 10321744Smckusick duplist = duplist->next; 10439972Smckusick free((char *)dlp); 10521744Smckusick break; 10621744Smckusick } 10721744Smckusick if (dlp == 0) { 10821744Smckusick clrbmap(blkno); 10921744Smckusick n_blks--; 11021744Smckusick } 11116266Smckusick } 11216266Smckusick } 11316266Smckusick return (res); 11416266Smckusick } 115