122049Sdist /* 239976Smckusick * Copyright (c) 1980, 1986 The Regents of the University of California. 339976Smckusick * All rights reserved. 439976Smckusick * 542702Sbostic * %sccs.include.redist.c% 622049Sdist */ 722049Sdist 816263Smckusick #ifndef lint 9*53703Smckusick static char sccsid[] = "@(#)pass1b.c 5.10 (Berkeley) 05/27/92"; 1039976Smckusick #endif /* not lint */ 1116263Smckusick 1216263Smckusick #include <sys/param.h> 13*53703Smckusick #include <sys/time.h> 1451532Sbostic #include <ufs/ufs/dinode.h> 1551532Sbostic #include <ufs/ffs/fs.h> 1644934Smckusick #include <string.h> 1716263Smckusick #include "fsck.h" 1816263Smckusick 1916263Smckusick int pass1bcheck(); 2021744Smckusick static struct dups *duphead; 2116263Smckusick 2216263Smckusick pass1b() 2316263Smckusick { 2416263Smckusick register int c, i; 2539973Smckusick register struct dinode *dp; 2616263Smckusick struct inodesc idesc; 2716263Smckusick ino_t inumber; 2816263Smckusick 2916263Smckusick bzero((char *)&idesc, sizeof(struct inodesc)); 3016263Smckusick idesc.id_type = ADDR; 3116263Smckusick idesc.id_func = pass1bcheck; 3221744Smckusick duphead = duplist; 3316263Smckusick inumber = 0; 3416263Smckusick for (c = 0; c < sblock.fs_ncg; c++) { 3516263Smckusick for (i = 0; i < sblock.fs_ipg; i++, inumber++) { 3620847Smckusick if (inumber < ROOTINO) 3720847Smckusick continue; 3816263Smckusick dp = ginode(inumber); 3916263Smckusick if (dp == NULL) 4016263Smckusick continue; 4116263Smckusick idesc.id_number = inumber; 4216263Smckusick if (statemap[inumber] != USTATE && 4316263Smckusick (ckinode(dp, &idesc) & STOP)) 4439973Smckusick return; 4516263Smckusick } 4616263Smckusick } 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--) { 5739973Smckusick if (chkrange(blkno, 1)) 5816263Smckusick res = SKIP; 5921744Smckusick for (dlp = duphead; dlp; dlp = dlp->next) { 6021744Smckusick if (dlp->dup == blkno) { 6139973Smckusick blkerror(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