122052Sdist /* 2*39976Smckusick * Copyright (c) 1980, 1986 The Regents of the University of California. 3*39976Smckusick * All rights reserved. 4*39976Smckusick * 5*39976Smckusick * Redistribution and use in source and binary forms are permitted 6*39976Smckusick * provided that the above copyright notice and this paragraph are 7*39976Smckusick * duplicated in all such forms and that any documentation, 8*39976Smckusick * advertising materials, and other materials related to such 9*39976Smckusick * distribution and use acknowledge that the software was developed 10*39976Smckusick * by the University of California, Berkeley. The name of the 11*39976Smckusick * University may not be used to endorse or promote products derived 12*39976Smckusick * from this software without specific prior written permission. 13*39976Smckusick * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR 14*39976Smckusick * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED 15*39976Smckusick * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 1622052Sdist */ 1722052Sdist 1816266Smckusick #ifndef lint 19*39976Smckusick static char sccsid[] = "@(#)pass4.c 5.7 (Berkeley) 02/01/90"; 20*39976Smckusick #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; 3321759Smckusick struct inodesc idesc; 3416266Smckusick int n; 3516266Smckusick 3616266Smckusick bzero((char *)&idesc, sizeof(struct inodesc)); 3716266Smckusick idesc.id_type = ADDR; 3816266Smckusick idesc.id_func = pass4check; 3916266Smckusick for (inumber = ROOTINO; inumber <= lastino; inumber++) { 4016266Smckusick idesc.id_number = inumber; 4116266Smckusick switch (statemap[inumber]) { 4216266Smckusick 4316266Smckusick case FSTATE: 4417937Smckusick case DFOUND: 4516266Smckusick n = lncntp[inumber]; 4616266Smckusick if (n) 4716266Smckusick adjust(&idesc, (short)n); 4816266Smckusick else { 4921759Smckusick for (zlnp = zlnhead; zlnp; zlnp = zlnp->next) 5021759Smckusick if (zlnp->zlncnt == inumber) { 5126479Smckusick zlnp->zlncnt = zlnhead->zlncnt; 5226479Smckusick zlnp = zlnhead; 5326479Smckusick zlnhead = zlnhead->next; 5439972Smckusick free((char *)zlnp); 5516266Smckusick clri(&idesc, "UNREF", 1); 5616266Smckusick break; 5716266Smckusick } 5816266Smckusick } 5916266Smckusick break; 6016266Smckusick 6116266Smckusick case DSTATE: 6216266Smckusick clri(&idesc, "UNREF", 1); 6316266Smckusick break; 6416266Smckusick 6517937Smckusick case DCLEAR: 6617937Smckusick case FCLEAR: 6716266Smckusick clri(&idesc, "BAD/DUP", 1); 6816266Smckusick break; 6926480Smckusick 7026480Smckusick case USTATE: 7126480Smckusick break; 7226480Smckusick 7326480Smckusick default: 7426480Smckusick errexit("BAD STATE %d FOR INODE I=%d", 7526480Smckusick statemap[inumber], inumber); 7616266Smckusick } 7716266Smckusick } 7816266Smckusick } 7916266Smckusick 8016266Smckusick pass4check(idesc) 8116266Smckusick register struct inodesc *idesc; 8216266Smckusick { 8321744Smckusick register struct dups *dlp; 8416266Smckusick int nfrags, res = KEEPON; 8516266Smckusick daddr_t blkno = idesc->id_blkno; 8616266Smckusick 8716266Smckusick for (nfrags = idesc->id_numfrags; nfrags > 0; blkno++, nfrags--) { 8839972Smckusick if (chkrange(blkno, 1)) { 8916266Smckusick res = SKIP; 9039972Smckusick } else if (testbmap(blkno)) { 9121744Smckusick for (dlp = duplist; dlp; dlp = dlp->next) { 9221744Smckusick if (dlp->dup != blkno) 9321744Smckusick continue; 9421744Smckusick dlp->dup = duplist->dup; 9521744Smckusick dlp = duplist; 9621744Smckusick duplist = duplist->next; 9739972Smckusick free((char *)dlp); 9821744Smckusick break; 9921744Smckusick } 10021744Smckusick if (dlp == 0) { 10121744Smckusick clrbmap(blkno); 10221744Smckusick n_blks--; 10321744Smckusick } 10416266Smckusick } 10516266Smckusick } 10616266Smckusick return (res); 10716266Smckusick } 108