|
|
1.1 root 1: /*
2: * Phase 1b of fsck - Rescan for more Dups
3: */
4:
5: #include "fsck.h"
6:
7: phase1b()
8: {
9: if (!qflag)
10: printf("Phase 1b: Rescan for more Dups\n");
11: buildtable();
12: iscanb();
13: }
14:
15: buildtable()
16: {
17: unsigned cntr=0;
18: daddr_t bn;
19:
20: while (cntr<totdups) {
21: bn = dupblck[cntr++];
22: markdup(bn);
23: }
24: }
25:
26: iscanb()
27: {
28: register daddr_t bn;
29: register struct dinode *dip;
30: register ino_t ino;
31: int i;
32:
33: ino = 1;
34:
35: for (bn=INODEI; bn<isize; bn++) {
36: if (testblock(bn)) { /* block is bad via inode 1 */
37: ino += INOPB;
38: continue;
39: }
40: bread(bn, databuf);
41: dip = (struct dinode *) databuf;
42: for (i=0; i<INOPB; i++) {
43: candino(dip);
44: if (inuse(dip) == TRUE)
45: ckblksb(dip, ino);
46: ino++;
47: dip++;
48: }
49: }
50: }
51:
52: /*
53: * Check the blocks associated with the given inode to find the
54: * remaining duplicate blocks
55: */
56:
57: ckblksb(dip, ino)
58: register struct dinode *dip;
59: register ino_t ino;
60: {
61: daddr_t addrs[NADDR], bn;
62: int i, lev, naddr;
63: int mode;
64:
65: mode = dip->di_mode & IFMT;
66:
67: if ( (mode == IFREG) || (mode == IFDIR) )
68: l3tol(addrs, dip->di_addr, naddr=NADDR);
69: else if ( mode == IFPIPE )
70: l3tol(addrs, dip->di_addr, naddr=ND);
71: else
72: return;
73:
74: for(i=0; i<naddr; i++)
75: for (lev=0; lev<4; lev++)
76: if (i < offsets[lev]) {
77: if ( (bn=addrs[i]) != 0 ) {
78: dblocksb(bn, ino, lev);
79: break;
80: }
81: }
82: }
83:
84: /*
85: * Checks recursively the blocks pointed at via
86: * the inode list of blocks. 'bn' is the block number,
87: * 'ino' is the inode referencing it, and 'lev' is the
88: * level 0 == direct ... 3 = triple-indirect
89: */
90:
91: dblocksb(bn, ino, lev)
92: daddr_t bn;
93: ino_t ino;
94: int lev;
95: {
96: char buf[BSIZE];
97: int i;
98: daddr_t *bnptr;
99:
100: if ( cdupb(bn, ino) == OK ) {
101: if (lev--==0)
102: return(OK);
103: bread(bn, buf);
104: bnptr = (long *) buf;
105: for (i=0; i<NBN; i++) {
106: bn = bnptr[i];
107: candaddr(bn);
108: if ( bn != 0 )
109: dblocksb(bn, ino, lev);
110: }
111: }
112: }
113:
114: /*
115: * Check the given block number for duplicate reference.
116: */
117:
118: cdupb(bn, ino)
119: daddr_t bn;
120: ino_t ino;
121: {
122: if ( bn >= fsize )
123: return(STOP);
124: if ( !testdup(bn) ) {
125: if ( ino == 1 ) /* bad block inode, let's mark it */
126: markdup(bn); /* so we never read it again */
127: return(OK);
128: }
129:
130: if (!fflag)
131: orflags(ino, IBAD_IDUP);
132: printf("Dup Block %lu, i-number = %u\n", bn, ino);
133:
134: return(STOP);
135: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.