xref: /csrg-svn/sbin/fsck/pass1b.c (revision 38337)
122049Sdist /*
222049Sdist  * Copyright (c) 1980 Regents of the University of California.
322049Sdist  * All rights reserved.  The Berkeley software License Agreement
422049Sdist  * specifies the terms and conditions for redistribution.
522049Sdist  */
622049Sdist 
716263Smckusick #ifndef lint
8*38337Smckusick static char sccsid[] = "@(#)pass1b.c	5.3 (Berkeley) 06/26/89";
922049Sdist #endif not lint
1016263Smckusick 
1116263Smckusick #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>
1616263Smckusick #include "fsck.h"
1716263Smckusick 
1816263Smckusick int	pass1bcheck();
1921744Smckusick static  struct dups *duphead;
2016263Smckusick 
2116263Smckusick pass1b()
2216263Smckusick {
2316263Smckusick 	register int c, i;
2416263Smckusick 	register DINODE *dp;
2516263Smckusick 	struct inodesc idesc;
2616263Smckusick 	ino_t inumber;
2716263Smckusick 
2816263Smckusick 	bzero((char *)&idesc, sizeof(struct inodesc));
2916263Smckusick 	idesc.id_type = ADDR;
3016263Smckusick 	idesc.id_func = pass1bcheck;
3121744Smckusick 	duphead = duplist;
3216263Smckusick 	inumber = 0;
3316263Smckusick 	for (c = 0; c < sblock.fs_ncg; c++) {
3416263Smckusick 		for (i = 0; i < sblock.fs_ipg; i++, inumber++) {
3520847Smckusick 			if (inumber < ROOTINO)
3620847Smckusick 				continue;
3716263Smckusick 			dp = ginode(inumber);
3816263Smckusick 			if (dp == NULL)
3916263Smckusick 				continue;
4016263Smckusick 			idesc.id_number = inumber;
4116263Smckusick 			if (statemap[inumber] != USTATE &&
4216263Smckusick 			    (ckinode(dp, &idesc) & STOP))
4316263Smckusick 				goto out1b;
4416263Smckusick 		}
4516263Smckusick 	}
4634224Smckusick out1b:;
4716263Smckusick }
4816263Smckusick 
4916263Smckusick pass1bcheck(idesc)
5016263Smckusick 	register struct inodesc *idesc;
5116263Smckusick {
5221744Smckusick 	register struct dups *dlp;
5316263Smckusick 	int nfrags, res = KEEPON;
5416263Smckusick 	daddr_t blkno = idesc->id_blkno;
5516263Smckusick 
5616263Smckusick 	for (nfrags = idesc->id_numfrags; nfrags > 0; blkno++, nfrags--) {
5716263Smckusick 		if (outrange(blkno, 1))
5816263Smckusick 			res = SKIP;
5921744Smckusick 		for (dlp = duphead; dlp; dlp = dlp->next) {
6021744Smckusick 			if (dlp->dup == blkno) {
6116263Smckusick 				blkerr(idesc->id_number, "DUP", blkno);
6221744Smckusick 				dlp->dup = duphead->dup;
6321744Smckusick 				duphead->dup = blkno;
6421744Smckusick 				duphead = duphead->next;
6516263Smckusick 			}
6621744Smckusick 			if (dlp == muldup)
6721744Smckusick 				break;
6821744Smckusick 		}
6921744Smckusick 		if (muldup == 0 || duphead == muldup->next)
7021744Smckusick 			return (STOP);
7116263Smckusick 	}
7216263Smckusick 	return (res);
7316263Smckusick }
74