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*39973Smckusick static char sccsid[] = "@(#)pass1b.c 5.5 (Berkeley) 02/01/90"; 922049Sdist #endif not lint 1016263Smckusick 1116263Smckusick #include <sys/param.h> 1239383Smckusick #include <ufs/dinode.h> 1338337Smckusick #include <ufs/fs.h> 1416263Smckusick #include "fsck.h" 1516263Smckusick 1616263Smckusick int pass1bcheck(); 1721744Smckusick static struct dups *duphead; 1816263Smckusick 1916263Smckusick pass1b() 2016263Smckusick { 2116263Smckusick register int c, i; 22*39973Smckusick register struct dinode *dp; 2316263Smckusick struct inodesc idesc; 2416263Smckusick ino_t inumber; 2516263Smckusick 2616263Smckusick bzero((char *)&idesc, sizeof(struct inodesc)); 2716263Smckusick idesc.id_type = ADDR; 2816263Smckusick idesc.id_func = pass1bcheck; 2921744Smckusick duphead = duplist; 3016263Smckusick inumber = 0; 3116263Smckusick for (c = 0; c < sblock.fs_ncg; c++) { 3216263Smckusick for (i = 0; i < sblock.fs_ipg; i++, inumber++) { 3320847Smckusick if (inumber < ROOTINO) 3420847Smckusick continue; 3516263Smckusick dp = ginode(inumber); 3616263Smckusick if (dp == NULL) 3716263Smckusick continue; 3816263Smckusick idesc.id_number = inumber; 3916263Smckusick if (statemap[inumber] != USTATE && 4016263Smckusick (ckinode(dp, &idesc) & STOP)) 41*39973Smckusick return; 4216263Smckusick } 4316263Smckusick } 4416263Smckusick } 4516263Smckusick 4616263Smckusick pass1bcheck(idesc) 4716263Smckusick register struct inodesc *idesc; 4816263Smckusick { 4921744Smckusick register struct dups *dlp; 5016263Smckusick int nfrags, res = KEEPON; 5116263Smckusick daddr_t blkno = idesc->id_blkno; 5216263Smckusick 5316263Smckusick for (nfrags = idesc->id_numfrags; nfrags > 0; blkno++, nfrags--) { 54*39973Smckusick if (chkrange(blkno, 1)) 5516263Smckusick res = SKIP; 5621744Smckusick for (dlp = duphead; dlp; dlp = dlp->next) { 5721744Smckusick if (dlp->dup == blkno) { 58*39973Smckusick blkerror(idesc->id_number, "DUP", blkno); 5921744Smckusick dlp->dup = duphead->dup; 6021744Smckusick duphead->dup = blkno; 6121744Smckusick duphead = duphead->next; 6216263Smckusick } 6321744Smckusick if (dlp == muldup) 6421744Smckusick break; 6521744Smckusick } 6621744Smckusick if (muldup == 0 || duphead == muldup->next) 6721744Smckusick return (STOP); 6816263Smckusick } 6916263Smckusick return (res); 7016263Smckusick } 71