xref: /csrg-svn/sbin/fsck/pass4.c (revision 21744)
116266Smckusick #ifndef lint
2*21744Smckusick static char version[] = "@(#)pass4.c	3.3 (Berkeley) 05/31/85";
316266Smckusick #endif
416266Smckusick 
516266Smckusick #include <sys/param.h>
616266Smckusick #include <sys/inode.h>
716266Smckusick #include <sys/fs.h>
816266Smckusick #include "fsck.h"
916266Smckusick 
1016266Smckusick int	pass4check();
1116266Smckusick 
1216266Smckusick pass4()
1316266Smckusick {
1416266Smckusick 	register ino_t inumber, *blp;
1516266Smckusick 	int n;
1616266Smckusick 	struct inodesc idesc;
1716266Smckusick 
1816266Smckusick 	bzero((char *)&idesc, sizeof(struct inodesc));
1916266Smckusick 	idesc.id_type = ADDR;
2016266Smckusick 	idesc.id_func = pass4check;
2116266Smckusick 	for (inumber = ROOTINO; inumber <= lastino; inumber++) {
2216266Smckusick 		idesc.id_number = inumber;
2316266Smckusick 		switch (statemap[inumber]) {
2416266Smckusick 
2516266Smckusick 		case FSTATE:
2617937Smckusick 		case DFOUND:
2716266Smckusick 			n = lncntp[inumber];
2816266Smckusick 			if (n)
2916266Smckusick 				adjust(&idesc, (short)n);
3016266Smckusick 			else {
3116266Smckusick 				for (blp = badlncnt;blp < badlnp; blp++)
3216266Smckusick 					if (*blp == inumber) {
3316266Smckusick 						clri(&idesc, "UNREF", 1);
3416266Smckusick 						break;
3516266Smckusick 					}
3616266Smckusick 			}
3716266Smckusick 			break;
3816266Smckusick 
3916266Smckusick 		case DSTATE:
4016266Smckusick 			clri(&idesc, "UNREF", 1);
4116266Smckusick 			break;
4216266Smckusick 
4317937Smckusick 		case DCLEAR:
4417937Smckusick 		case FCLEAR:
4516266Smckusick 			clri(&idesc, "BAD/DUP", 1);
4616266Smckusick 			break;
4716266Smckusick 		}
4816266Smckusick 	}
4916266Smckusick }
5016266Smckusick 
5116266Smckusick pass4check(idesc)
5216266Smckusick 	register struct inodesc *idesc;
5316266Smckusick {
54*21744Smckusick 	register struct dups *dlp;
5516266Smckusick 	int nfrags, res = KEEPON;
5616266Smckusick 	daddr_t blkno = idesc->id_blkno;
5716266Smckusick 
5816266Smckusick 	for (nfrags = idesc->id_numfrags; nfrags > 0; blkno++, nfrags--) {
59*21744Smckusick 		if (outrange(blkno, 1)) {
6016266Smckusick 			res = SKIP;
61*21744Smckusick 		} else if (getbmap(blkno)) {
62*21744Smckusick 			for (dlp = duplist; dlp; dlp = dlp->next) {
63*21744Smckusick 				if (dlp->dup != blkno)
64*21744Smckusick 					continue;
65*21744Smckusick 				dlp->dup = duplist->dup;
66*21744Smckusick 				dlp = duplist;
67*21744Smckusick 				duplist = duplist->next;
68*21744Smckusick 				free(dlp);
69*21744Smckusick 				break;
70*21744Smckusick 			}
71*21744Smckusick 			if (dlp == 0) {
72*21744Smckusick 				clrbmap(blkno);
73*21744Smckusick 				n_blks--;
74*21744Smckusick 			}
7516266Smckusick 		}
7616266Smckusick 	}
7716266Smckusick 	return (res);
7816266Smckusick }
79