/* * Copyright (c) 1980 Regents of the University of California. * All rights reserved. The Berkeley software License Agreement * specifies the terms and conditions for redistribution. */ #ifndef lint static char sccsid[] = "@(#)pass1b.c 5.1 (Berkeley) 6/5/85"; #endif not lint #include #include #include #include "fsck.h" int pass1bcheck(); static struct dups *duphead; pass1b() { register int c, i; register DINODE *dp; struct inodesc idesc; ino_t inumber; bzero((char *)&idesc, sizeof(struct inodesc)); idesc.id_type = ADDR; idesc.id_func = pass1bcheck; duphead = duplist; inumber = 0; for (c = 0; c < sblock.fs_ncg; c++) { for (i = 0; i < sblock.fs_ipg; i++, inumber++) { if (inumber < ROOTINO) continue; dp = ginode(inumber); if (dp == NULL) continue; idesc.id_number = inumber; if (statemap[inumber] != USTATE && (ckinode(dp, &idesc) & STOP)) goto out1b; } } out1b: flush(&dfile, &inoblk); } pass1bcheck(idesc) register struct inodesc *idesc; { register struct dups *dlp; int nfrags, res = KEEPON; daddr_t blkno = idesc->id_blkno; for (nfrags = idesc->id_numfrags; nfrags > 0; blkno++, nfrags--) { if (outrange(blkno, 1)) res = SKIP; for (dlp = duphead; dlp; dlp = dlp->next) { if (dlp->dup == blkno) { blkerr(idesc->id_number, "DUP", blkno); dlp->dup = duphead->dup; duphead->dup = blkno; duphead = duphead->next; } if (dlp == muldup) break; } if (muldup == 0 || duphead == muldup->next) return (STOP); } return (res); }