122052Sdist /* 222052Sdist * Copyright (c) 1980 Regents of the University of California. 322052Sdist * All rights reserved. The Berkeley software License Agreement 422052Sdist * specifies the terms and conditions for redistribution. 522052Sdist */ 622052Sdist 716266Smckusick #ifndef lint 8*38337Smckusick static char sccsid[] = "@(#)pass4.c 5.4 (Berkeley) 06/26/89"; 922052Sdist #endif not lint 1016266Smckusick 1116266Smckusick #include <sys/param.h> 12*38337Smckusick #include <sys/time.h> 13*38337Smckusick #include <sys/vnode.h> 14*38337Smckusick #include <ufs/inode.h> 15*38337Smckusick #include <ufs/fs.h> 1616266Smckusick #include "fsck.h" 1716266Smckusick 1816266Smckusick int pass4check(); 1916266Smckusick 2016266Smckusick pass4() 2116266Smckusick { 2221759Smckusick register ino_t inumber; 2321759Smckusick register struct zlncnt *zlnp; 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; 4526479Smckusick free(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: 5717937Smckusick case FCLEAR: 5816266Smckusick clri(&idesc, "BAD/DUP", 1); 5916266Smckusick break; 6026480Smckusick 6126480Smckusick case USTATE: 6226480Smckusick break; 6326480Smckusick 6426480Smckusick default: 6526480Smckusick errexit("BAD STATE %d FOR INODE I=%d", 6626480Smckusick statemap[inumber], inumber); 6716266Smckusick } 6816266Smckusick } 6916266Smckusick } 7016266Smckusick 7116266Smckusick pass4check(idesc) 7216266Smckusick register struct inodesc *idesc; 7316266Smckusick { 7421744Smckusick register struct dups *dlp; 7516266Smckusick int nfrags, res = KEEPON; 7616266Smckusick daddr_t blkno = idesc->id_blkno; 7716266Smckusick 7816266Smckusick for (nfrags = idesc->id_numfrags; nfrags > 0; blkno++, nfrags--) { 7921744Smckusick if (outrange(blkno, 1)) { 8016266Smckusick res = SKIP; 8121744Smckusick } else if (getbmap(blkno)) { 8221744Smckusick for (dlp = duplist; dlp; dlp = dlp->next) { 8321744Smckusick if (dlp->dup != blkno) 8421744Smckusick continue; 8521744Smckusick dlp->dup = duplist->dup; 8621744Smckusick dlp = duplist; 8721744Smckusick duplist = duplist->next; 8826479Smckusick free(dlp); 8921744Smckusick break; 9021744Smckusick } 9121744Smckusick if (dlp == 0) { 9221744Smckusick clrbmap(blkno); 9321744Smckusick n_blks--; 9421744Smckusick } 9516266Smckusick } 9616266Smckusick } 9716266Smckusick return (res); 9816266Smckusick } 99