xref: /csrg-svn/sbin/fsck/pass4.c (revision 38337)
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