|
|
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[] = "@(#)pass4.c 5.10 (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 <stdlib.h> ! 28: #include <string.h> ! 29: #include "fsck.h" ! 30: ! 31: int pass4check(); ! 32: ! 33: pass4() ! 34: { ! 35: register ino_t inumber; ! 36: register struct zlncnt *zlnp; ! 37: struct dinode *dp; ! 38: struct inodesc idesc; ! 39: int n; ! 40: ! 41: bzero((char *)&idesc, sizeof(struct inodesc)); ! 42: idesc.id_type = ADDR; ! 43: idesc.id_func = pass4check; ! 44: for (inumber = ROOTINO; inumber <= lastino; inumber++) { ! 45: idesc.id_number = inumber; ! 46: switch (statemap[inumber]) { ! 47: ! 48: case FSTATE: ! 49: case DFOUND: ! 50: n = lncntp[inumber]; ! 51: if (n) ! 52: adjust(&idesc, (short)n); ! 53: else { ! 54: for (zlnp = zlnhead; zlnp; zlnp = zlnp->next) ! 55: if (zlnp->zlncnt == inumber) { ! 56: zlnp->zlncnt = zlnhead->zlncnt; ! 57: zlnp = zlnhead; ! 58: zlnhead = zlnhead->next; ! 59: free((char *)zlnp); ! 60: clri(&idesc, "UNREF", 1); ! 61: break; ! 62: } ! 63: } ! 64: break; ! 65: ! 66: case DSTATE: ! 67: clri(&idesc, "UNREF", 1); ! 68: break; ! 69: ! 70: case DCLEAR: ! 71: dp = ginode(inumber); ! 72: if (dp->di_size == 0) { ! 73: clri(&idesc, "ZERO LENGTH", 1); ! 74: break; ! 75: } ! 76: /* fall through */ ! 77: case FCLEAR: ! 78: clri(&idesc, "BAD/DUP", 1); ! 79: break; ! 80: ! 81: case USTATE: ! 82: break; ! 83: ! 84: default: ! 85: errexit("BAD STATE %d FOR INODE I=%d", ! 86: statemap[inumber], inumber); ! 87: } ! 88: } ! 89: } ! 90: ! 91: pass4check(idesc) ! 92: register struct inodesc *idesc; ! 93: { ! 94: register struct dups *dlp; ! 95: int nfrags, res = KEEPON; ! 96: daddr_t blkno = idesc->id_blkno; ! 97: ! 98: for (nfrags = idesc->id_numfrags; nfrags > 0; blkno++, nfrags--) { ! 99: if (chkrange(blkno, 1)) { ! 100: res = SKIP; ! 101: } else if (testbmap(blkno)) { ! 102: for (dlp = duplist; dlp; dlp = dlp->next) { ! 103: if (dlp->dup != blkno) ! 104: continue; ! 105: dlp->dup = duplist->dup; ! 106: dlp = duplist; ! 107: duplist = duplist->next; ! 108: free((char *)dlp); ! 109: break; ! 110: } ! 111: if (dlp == 0) { ! 112: clrbmap(blkno); ! 113: n_blks--; ! 114: } ! 115: } ! 116: } ! 117: return (res); ! 118: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.