122049Sdist /*
261492Sbostic * Copyright (c) 1980, 1986, 1993
361492Sbostic * The Regents of the University of California. All rights reserved.
439976Smckusick *
542702Sbostic * %sccs.include.redist.c%
622049Sdist */
722049Sdist
816263Smckusick #ifndef lint
9*68992Sbostic static char sccsid[] = "@(#)pass1b.c 8.4 (Berkeley) 04/28/95";
1039976Smckusick #endif /* not lint */
1116263Smckusick
1216263Smckusick #include <sys/param.h>
1353703Smckusick #include <sys/time.h>
1468908Smckusick
1551532Sbostic #include <ufs/ufs/dinode.h>
1651532Sbostic #include <ufs/ffs/fs.h>
1768908Smckusick
1844934Smckusick #include <string.h>
1968908Smckusick
2016263Smckusick #include "fsck.h"
2116263Smckusick
2221744Smckusick static struct dups *duphead;
2368908Smckusick static int pass1bcheck __P((struct inodesc *));
2416263Smckusick
2568908Smckusick void
pass1b()2616263Smckusick pass1b()
2716263Smckusick {
2816263Smckusick register int c, i;
2939973Smckusick register struct dinode *dp;
3016263Smckusick struct inodesc idesc;
3116263Smckusick ino_t inumber;
3216263Smckusick
33*68992Sbostic memset(&idesc, 0, sizeof(struct inodesc));
3416263Smckusick idesc.id_type = ADDR;
3516263Smckusick idesc.id_func = pass1bcheck;
3621744Smckusick duphead = duplist;
3716263Smckusick inumber = 0;
3816263Smckusick for (c = 0; c < sblock.fs_ncg; c++) {
3916263Smckusick for (i = 0; i < sblock.fs_ipg; i++, inumber++) {
4020847Smckusick if (inumber < ROOTINO)
4120847Smckusick continue;
4216263Smckusick dp = ginode(inumber);
4316263Smckusick if (dp == NULL)
4416263Smckusick continue;
4516263Smckusick idesc.id_number = inumber;
4616263Smckusick if (statemap[inumber] != USTATE &&
4716263Smckusick (ckinode(dp, &idesc) & STOP))
4839973Smckusick return;
4916263Smckusick }
5016263Smckusick }
5116263Smckusick }
5216263Smckusick
5368908Smckusick static int
pass1bcheck(idesc)5416263Smckusick pass1bcheck(idesc)
5516263Smckusick register struct inodesc *idesc;
5616263Smckusick {
5721744Smckusick register struct dups *dlp;
5816263Smckusick int nfrags, res = KEEPON;
5968548Smckusick ufs_daddr_t blkno = idesc->id_blkno;
6016263Smckusick
6116263Smckusick for (nfrags = idesc->id_numfrags; nfrags > 0; blkno++, nfrags--) {
6239973Smckusick if (chkrange(blkno, 1))
6316263Smckusick res = SKIP;
6421744Smckusick for (dlp = duphead; dlp; dlp = dlp->next) {
6521744Smckusick if (dlp->dup == blkno) {
6639973Smckusick blkerror(idesc->id_number, "DUP", blkno);
6721744Smckusick dlp->dup = duphead->dup;
6821744Smckusick duphead->dup = blkno;
6921744Smckusick duphead = duphead->next;
7016263Smckusick }
7121744Smckusick if (dlp == muldup)
7221744Smckusick break;
7321744Smckusick }
7421744Smckusick if (muldup == 0 || duphead == muldup->next)
7521744Smckusick return (STOP);
7616263Smckusick }
7716263Smckusick return (res);
7816263Smckusick }
79