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