|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1980, 1986 The Regents of the University of California. ! 3: * All rights reserved. ! 4: * ! 5: * Redistribution and use in source and binary forms are permitted provided ! 6: * that: (1) source distributions retain this entire copyright notice and ! 7: * comment, and (2) distributions including binaries display the following ! 8: * acknowledgement: ``This product includes software developed by the ! 9: * University of California, Berkeley and its contributors'' in the ! 10: * documentation or other materials provided with the distribution and in ! 11: * all advertising materials mentioning features or use of this software. ! 12: * Neither the name of the University nor the names of its contributors may ! 13: * be used to endorse or promote products derived from this software without ! 14: * specific prior written permission. ! 15: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED ! 16: * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF ! 17: * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ! 18: */ ! 19: ! 20: #ifndef lint ! 21: static char sccsid[] = "@(#)pass1b.c 5.8 (Berkeley) 7/20/90"; ! 22: #endif /* not lint */ ! 23: ! 24: #include <sys/param.h> ! 25: #include <ufs/dinode.h> ! 26: #include <ufs/fs.h> ! 27: #include <string.h> ! 28: #include "fsck.h" ! 29: ! 30: int pass1bcheck(); ! 31: static struct dups *duphead; ! 32: ! 33: pass1b() ! 34: { ! 35: register int c, i; ! 36: register struct dinode *dp; ! 37: struct inodesc idesc; ! 38: ino_t inumber; ! 39: ! 40: bzero((char *)&idesc, sizeof(struct inodesc)); ! 41: idesc.id_type = ADDR; ! 42: idesc.id_func = pass1bcheck; ! 43: duphead = duplist; ! 44: inumber = 0; ! 45: for (c = 0; c < sblock.fs_ncg; c++) { ! 46: for (i = 0; i < sblock.fs_ipg; i++, inumber++) { ! 47: if (inumber < ROOTINO) ! 48: continue; ! 49: dp = ginode(inumber); ! 50: if (dp == NULL) ! 51: continue; ! 52: idesc.id_number = inumber; ! 53: if (statemap[inumber] != USTATE && ! 54: (ckinode(dp, &idesc) & STOP)) ! 55: return; ! 56: } ! 57: } ! 58: } ! 59: ! 60: pass1bcheck(idesc) ! 61: register struct inodesc *idesc; ! 62: { ! 63: register struct dups *dlp; ! 64: int nfrags, res = KEEPON; ! 65: daddr_t blkno = idesc->id_blkno; ! 66: ! 67: for (nfrags = idesc->id_numfrags; nfrags > 0; blkno++, nfrags--) { ! 68: if (chkrange(blkno, 1)) ! 69: res = SKIP; ! 70: for (dlp = duphead; dlp; dlp = dlp->next) { ! 71: if (dlp->dup == blkno) { ! 72: blkerror(idesc->id_number, "DUP", blkno); ! 73: dlp->dup = duphead->dup; ! 74: duphead->dup = blkno; ! 75: duphead = duphead->next; ! 76: } ! 77: if (dlp == muldup) ! 78: break; ! 79: } ! 80: if (muldup == 0 || duphead == muldup->next) ! 81: return (STOP); ! 82: } ! 83: return (res); ! 84: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.