xref: /csrg-svn/sbin/fsck/pass4.c (revision 22052)
1*22052Sdist /*
2*22052Sdist  * Copyright (c) 1980 Regents of the University of California.
3*22052Sdist  * All rights reserved.  The Berkeley software License Agreement
4*22052Sdist  * specifies the terms and conditions for redistribution.
5*22052Sdist  */
6*22052Sdist 
716266Smckusick #ifndef lint
8*22052Sdist static char sccsid[] = "@(#)pass4.c	5.1 (Berkeley) 06/05/85";
9*22052Sdist #endif not lint
1016266Smckusick 
1116266Smckusick #include <sys/param.h>
1216266Smckusick #include <sys/inode.h>
1316266Smckusick #include <sys/fs.h>
1416266Smckusick #include "fsck.h"
1516266Smckusick 
1616266Smckusick int	pass4check();
1716266Smckusick 
1816266Smckusick pass4()
1916266Smckusick {
2021759Smckusick 	register ino_t inumber;
2121759Smckusick 	register struct zlncnt *zlnp;
2221759Smckusick 	struct inodesc idesc;
2316266Smckusick 	int n;
2416266Smckusick 
2516266Smckusick 	bzero((char *)&idesc, sizeof(struct inodesc));
2616266Smckusick 	idesc.id_type = ADDR;
2716266Smckusick 	idesc.id_func = pass4check;
2816266Smckusick 	for (inumber = ROOTINO; inumber <= lastino; inumber++) {
2916266Smckusick 		idesc.id_number = inumber;
3016266Smckusick 		switch (statemap[inumber]) {
3116266Smckusick 
3216266Smckusick 		case FSTATE:
3317937Smckusick 		case DFOUND:
3416266Smckusick 			n = lncntp[inumber];
3516266Smckusick 			if (n)
3616266Smckusick 				adjust(&idesc, (short)n);
3716266Smckusick 			else {
3821759Smckusick 				for (zlnp = zlnhead; zlnp; zlnp = zlnp->next)
3921759Smckusick 					if (zlnp->zlncnt == inumber) {
4016266Smckusick 						clri(&idesc, "UNREF", 1);
4116266Smckusick 						break;
4216266Smckusick 					}
4316266Smckusick 			}
4416266Smckusick 			break;
4516266Smckusick 
4616266Smckusick 		case DSTATE:
4716266Smckusick 			clri(&idesc, "UNREF", 1);
4816266Smckusick 			break;
4916266Smckusick 
5017937Smckusick 		case DCLEAR:
5117937Smckusick 		case FCLEAR:
5216266Smckusick 			clri(&idesc, "BAD/DUP", 1);
5316266Smckusick 			break;
5416266Smckusick 		}
5516266Smckusick 	}
5616266Smckusick }
5716266Smckusick 
5816266Smckusick pass4check(idesc)
5916266Smckusick 	register struct inodesc *idesc;
6016266Smckusick {
6121744Smckusick 	register struct dups *dlp;
6216266Smckusick 	int nfrags, res = KEEPON;
6316266Smckusick 	daddr_t blkno = idesc->id_blkno;
6416266Smckusick 
6516266Smckusick 	for (nfrags = idesc->id_numfrags; nfrags > 0; blkno++, nfrags--) {
6621744Smckusick 		if (outrange(blkno, 1)) {
6716266Smckusick 			res = SKIP;
6821744Smckusick 		} else if (getbmap(blkno)) {
6921744Smckusick 			for (dlp = duplist; dlp; dlp = dlp->next) {
7021744Smckusick 				if (dlp->dup != blkno)
7121744Smckusick 					continue;
7221744Smckusick 				dlp->dup = duplist->dup;
7321744Smckusick 				dlp = duplist;
7421744Smckusick 				duplist = duplist->next;
7521759Smckusick 				/* free(dlp); */
7621744Smckusick 				break;
7721744Smckusick 			}
7821744Smckusick 			if (dlp == 0) {
7921744Smckusick 				clrbmap(blkno);
8021744Smckusick 				n_blks--;
8121744Smckusick 			}
8216266Smckusick 		}
8316266Smckusick 	}
8416266Smckusick 	return (res);
8516266Smckusick }
86