xref: /csrg-svn/sbin/fsck/pass1b.c (revision 20847)
116263Smckusick #ifndef lint
2*20847Smckusick static char version[] = "@(#)pass1b.c	3.2 (Berkeley) 05/16/85";
316263Smckusick #endif
416263Smckusick 
516263Smckusick #include <sys/param.h>
616263Smckusick #include <sys/inode.h>
716263Smckusick #include <sys/fs.h>
816263Smckusick #include "fsck.h"
916263Smckusick 
1016263Smckusick int	pass1bcheck();
1116263Smckusick 
1216263Smckusick pass1b()
1316263Smckusick {
1416263Smckusick 	register int c, i;
1516263Smckusick 	register DINODE *dp;
1616263Smckusick 	struct inodesc idesc;
1716263Smckusick 	ino_t inumber;
1816263Smckusick 
1916263Smckusick 	bzero((char *)&idesc, sizeof(struct inodesc));
2016263Smckusick 	idesc.id_type = ADDR;
2116263Smckusick 	idesc.id_func = pass1bcheck;
2216263Smckusick 	inumber = 0;
2316263Smckusick 	for (c = 0; c < sblock.fs_ncg; c++) {
2416263Smckusick 		for (i = 0; i < sblock.fs_ipg; i++, inumber++) {
25*20847Smckusick 			if (inumber < ROOTINO)
26*20847Smckusick 				continue;
2716263Smckusick 			dp = ginode(inumber);
2816263Smckusick 			if (dp == NULL)
2916263Smckusick 				continue;
3016263Smckusick 			idesc.id_number = inumber;
3116263Smckusick 			if (statemap[inumber] != USTATE &&
3216263Smckusick 			    (ckinode(dp, &idesc) & STOP))
3316263Smckusick 				goto out1b;
3416263Smckusick 		}
3516263Smckusick 	}
3616263Smckusick out1b:
3716263Smckusick 	flush(&dfile, &inoblk);
3816263Smckusick }
3916263Smckusick 
4016263Smckusick pass1bcheck(idesc)
4116263Smckusick 	register struct inodesc *idesc;
4216263Smckusick {
4316263Smckusick 	register daddr_t *dlp;
4416263Smckusick 	int nfrags, res = KEEPON;
4516263Smckusick 	daddr_t blkno = idesc->id_blkno;
4616263Smckusick 
4716263Smckusick 	for (nfrags = idesc->id_numfrags; nfrags > 0; blkno++, nfrags--) {
4816263Smckusick 		if (outrange(blkno, 1))
4916263Smckusick 			res = SKIP;
5016263Smckusick 		for (dlp = duplist; dlp < muldup; dlp++)
5116263Smckusick 			if (*dlp == blkno) {
5216263Smckusick 				blkerr(idesc->id_number, "DUP", blkno);
5316263Smckusick 				*dlp = *--muldup;
5416263Smckusick 				*muldup = blkno;
5516263Smckusick 				if (muldup == duplist)
5616263Smckusick 					return (STOP);
5716263Smckusick 			}
5816263Smckusick 	}
5916263Smckusick 	return (res);
6016263Smckusick }
61