|
|
1.1 root 1: #define NI 16
2: #define NB 10
3: #define BITS 8
4: #define MAXFN 500
5:
6: #ifndef STANDALONE
7: #include <stdio.h>
8: #endif
9: #include <sys/param.h>
10: #include <sys/inode.h>
11: #include <sys/ino.h>
12: #include <sys/fblk.h>
13: #include <sys/filsys.h>
14:
15: struct filsys sblock;
16: struct dinode itab[INOPB*NI];
17: daddr_t iaddr[NADDR];
18: daddr_t blist[NB];
19: char *bmap;
20:
21: int sflg;
22: int mflg;
23: int dflg;
24: int fi;
25: ino_t ino;
26:
27: ino_t nrfile;
28: ino_t ndfile;
29: ino_t nbfile;
30: ino_t ncfile;
31:
32: daddr_t ndirect;
33: daddr_t nindir;
34: daddr_t niindir;
35: daddr_t niiindir;
36: daddr_t nfree;
37: daddr_t ndup;
38:
39: int nerror;
40:
41: long atol();
42: daddr_t alloc();
43: #ifndef STANDALONE
44: char *malloc();
45: #endif
46:
47: main(argc, argv)
48: char *argv[];
49: {
50: register i;
51: long n;
52:
53: blist[0] = -1;
54: #ifndef STANDALONE
55: while (--argc) {
56: argv++;
57: if (**argv=='-')
58: switch ((*argv)[1]) {
59: case 'd':
60: dflg++;
61: continue;
62:
63:
64: case 'm':
65: mflg++;
66: continue;
67:
68: case 's':
69: sflg++;
70: continue;
71:
72: case 'b':
73: for(i=0; i<NB; i++) {
74: n = atol(argv[1]);
75: if(n == 0)
76: break;
77: blist[i] = n;
78: argv++;
79: argc--;
80: }
81: blist[i] = -1;
82: continue;
83:
84: default:
85: printf("Bad flag\n");
86: }
87: check(*argv);
88: }
89: #else
90: {
91: static char fname[0];
92:
93: printf("File: ");
94: gets(fname);
95: check(fname);
96: }
97: #endif
98: return(nerror);
99: }
100:
101: check(file)
102: char *file;
103: {
104: register i, j;
105: ino_t mino;
106: daddr_t d;
107: long n;
108:
109: fi = open(file, sflg?2:0);
110: if (fi < 0) {
111: printf("cannot open %s\n", file);
112: nerror |= 04;
113: return;
114: }
115: printf("%s:\n", file);
116: nrfile = 0;
117: ndfile = 0;
118: ncfile = 0;
119: nbfile = 0;
120:
121: ndirect = 0;
122: nindir = 0;
123: niindir = 0;
124: niiindir = 0;
125:
126: ndup = 0;
127: #ifndef STANDALONE
128: sync();
129: #endif
130: bread((daddr_t)1, (char *)&sblock, sizeof(sblock));
131: mino = ((int)sblock.s_isize-2) * INOPB;
132: ino = 0;
133: n = (sblock.s_fsize - (int)sblock.s_isize + BITS-1) / BITS;
134: if (n != (unsigned)n) {
135: printf("Check fsize and isize: %ld, %u\n",
136: sblock.s_fsize, (int)sblock.s_isize);
137: }
138: #ifdef STANDALONE
139: bmap = NULL;
140: #else
141: bmap = malloc((unsigned)n);
142: #endif
143: if (bmap==NULL) {
144: printf("Not enough core; duplicates unchecked\n");
145: dflg++;
146: sflg = 0;
147: }
148: if(!dflg)
149: for(i=0; i<(unsigned)n; i++)
150: bmap[i] = 0;
151: for(i=2;; i+=NI) {
152: if(ino >= mino)
153: break;
154: bread((daddr_t)i, (char *)itab, sizeof(itab));
155: for(j=0; j<INOPB*NI; j++) {
156: if(ino >= mino)
157: break;
158: ino++;
159: pass1(&itab[j]);
160: }
161: }
162: ino = 0;
163: #ifndef STANDALONE
164: sync();
165: #endif
166: bread((daddr_t)1, (char *)&sblock, sizeof(sblock));
167: if (sflg) {
168: makefree();
169: close(fi);
170: #ifndef STANDALONE
171: if (bmap)
172: free(bmap);
173: #endif
174: return;
175: }
176: nfree = 0;
177: while(n = alloc()) {
178: if (chk(n, "free"))
179: break;
180: nfree++;
181: }
182: close(fi);
183: #ifndef STANDALONE
184: if (bmap)
185: free(bmap);
186: #endif
187:
188: i = nrfile + ndfile + ncfile + nbfile;
189: #ifndef STANDALONE
190: printf("files %6u (r=%u,d=%u,b=%u,c=%u)\n",
191: i, nrfile, ndfile, nbfile, ncfile);
192: #else
193: printf("files %u (r=%u,d=%u,b=%u,c=%u)\n",
194: i, nrfile, ndfile, nbfile, ncfile);
195: #endif
196: n = ndirect + nindir + niindir + niindir;
197: #ifdef STANDALONE
198: printf("used %ld (i=%ld,ii=%ld,iii=%ld,d=%ld)\n",
199: n, nindir, niindir, niiindir, ndirect);
200: printf("free %ld\n", nfree);
201: #else
202: printf("used %7ld (i=%ld,ii=%ld,iii=%ld,d=%ld)\n",
203: n, nindir, niindir, niiindir, ndirect);
204: printf("free %7ld\n", nfree);
205: #endif
206: if(!dflg) {
207: n = 0;
208: for(d=(int)sblock.s_isize; d<sblock.s_fsize; d++)
209: if(!duped(d)) {
210: if(mflg)
211: printf("%ld missing\n", d);
212: n++;
213: }
214: printf("missing%5ld\n", n);
215: }
216: }
217:
218: pass1(ip)
219: register struct dinode *ip;
220: {
221: daddr_t ind1[NINDIR];
222: daddr_t ind2[NINDIR];
223: daddr_t ind3[NINDIR];
224: register i, j;
225: int k, l;
226:
227: i = ip->di_mode & IFMT;
228: if(i == 0) {
229: sblock.s_tinode++;
230: return;
231: }
232: if(i == IFCHR) {
233: ncfile++;
234: return;
235: }
236: if(i == IFBLK) {
237: nbfile++;
238: return;
239: }
240: if(i == IFDIR)
241: ndfile++; else
242: if(i == IFREG)
243: nrfile++;
244: else {
245: printf("bad mode %u\n", ino);
246: return;
247: }
248: l3tol(iaddr, ip->di_addr, NADDR);
249: for(i=0; i<NADDR; i++) {
250: if(iaddr[i] == 0)
251: continue;
252: if(i < NADDR-3) {
253: ndirect++;
254: chk(iaddr[i], "data (small)");
255: continue;
256: }
257: nindir++;
258: if (chk(iaddr[i], "1st indirect"))
259: continue;
260: bread(iaddr[i], (char *)ind1, BSIZE);
261: for(j=0; j<NINDIR; j++) {
262: if(ind1[j] == 0)
263: continue;
264: if(i == NADDR-3) {
265: ndirect++;
266: chk(ind1[j], "data (large)");
267: continue;
268: }
269: niindir++;
270: if(chk(ind1[j], "2nd indirect"))
271: continue;
272: bread(ind1[j], (char *)ind2, BSIZE);
273: for(k=0; k<NINDIR; k++) {
274: if(ind2[k] == 0)
275: continue;
276: if(i == NADDR-2) {
277: ndirect++;
278: chk(ind2[k], "data (huge)");
279: continue;
280: }
281: niiindir++;
282: if(chk(ind2[k], "3rd indirect"))
283: continue;
284: bread(ind2[k], (char *)ind3, BSIZE);
285: for(l=0; l<NINDIR; l++)
286: if(ind3[l]) {
287: ndirect++;
288: chk(ind3[l], "data (garg)");
289: }
290: }
291: }
292: }
293: }
294:
295: chk(bno, s)
296: daddr_t bno;
297: char *s;
298: {
299: register n;
300:
301: if (bno<(int)sblock.s_isize || bno>=sblock.s_fsize) {
302: printf("%ld bad; inode=%u, class=%s\n", bno, ino, s);
303: return(1);
304: }
305: if(duped(bno)) {
306: printf("%ld dup; inode=%u, class=%s\n", bno, ino, s);
307: ndup++;
308: }
309: for (n=0; blist[n] != -1; n++)
310: if (bno == blist[n])
311: printf("%ld arg; inode=%u, class=%s\n", bno, ino, s);
312: return(0);
313: }
314:
315: duped(bno)
316: daddr_t bno;
317: {
318: daddr_t d;
319: register m, n;
320:
321: if(dflg)
322: return(0);
323: d = bno - (int)sblock.s_isize;
324: m = 1 << (d%BITS);
325: n = (d/BITS);
326: if(bmap[n] & m)
327: return(1);
328: bmap[n] |= m;
329: return(0);
330: }
331:
332: daddr_t
333: alloc()
334: {
335: int i;
336: daddr_t bno;
337: union {
338: char data[BSIZE];
339: struct fblk fb;
340: } buf;
341:
342: sblock.s_tfree--;
343: if (sblock.s_nfree<=0)
344: return(0);
345: if (sblock.s_nfree>NICFREE) {
346: printf("Bad free list, s.b. count = %d\n", sblock.s_nfree);
347: return(0);
348: }
349: bno = sblock.s_free[--sblock.s_nfree];
350: sblock.s_free[sblock.s_nfree] = (daddr_t)0;
351: if(bno == 0)
352: return(bno);
353: if(sblock.s_nfree <= 0) {
354: bread(bno, buf.data, BSIZE);
355: sblock.s_nfree = buf.df_nfree;
356: if (sblock.s_nfree<0 || sblock.s_nfree>NICFREE) {
357: printf("Bad free list, entry count of block %ld = %d\n",
358: bno, sblock.s_nfree);
359: sblock.s_nfree = 0;
360: return(0);
361: }
362: for(i=0; i<NICFREE; i++)
363: sblock.s_free[i] = buf.df_free[i];
364: }
365: return(bno);
366: }
367:
368: bfree(bno)
369: daddr_t bno;
370: {
371: union {
372: char data[BSIZE];
373: struct fblk fb;
374: } buf;
375: int i;
376:
377: sblock.s_tfree++;
378: if(sblock.s_nfree >= NICFREE) {
379: for(i=0; i<BSIZE; i++)
380: buf.data[i] = 0;
381: buf.df_nfree = sblock.s_nfree;
382: for(i=0; i<NICFREE; i++)
383: buf.df_free[i] = sblock.s_free[i];
384: bwrite(bno, buf.data);
385: sblock.s_nfree = 0;
386: }
387: sblock.s_free[sblock.s_nfree] = bno;
388: sblock.s_nfree++;
389: }
390:
391: bread(bno, buf, cnt)
392: daddr_t bno;
393: char *buf;
394: {
395: register i;
396:
397: lseek(fi, bno*BSIZE, 0);
398: if (read(fi, buf, cnt) != cnt) {
399: printf("read error %ld\n", bno);
400: if (sflg) {
401: printf("No update\n");
402: sflg = 0;
403: }
404: for(i=0; i<BSIZE; i++)
405: buf[i] = 0;
406: }
407: }
408:
409: bwrite(bno, buf)
410: daddr_t bno;
411: char *buf;
412: {
413:
414: lseek(fi, bno*BSIZE, 0);
415: if (write(fi, buf, BSIZE) != BSIZE)
416: printf("write error %ld\n", bno);
417: }
418:
419: makefree()
420: {
421: char flg[MAXFN];
422: int adr[MAXFN];
423: register i, j;
424: daddr_t f, d;
425: int m, n;
426:
427: n = sblock.s_n;
428: if(n <= 0 || n > MAXFN)
429: n = MAXFN;
430: sblock.s_n = n;
431: m = sblock.s_m;
432: if(m <= 0 || m > sblock.s_n)
433: m = 3;
434: sblock.s_m = m;
435:
436: for(i=0; i<n; i++)
437: flg[i] = 0;
438: i = 0;
439: for(j=0; j<n; j++) {
440: while(flg[i])
441: i = (i+1)%n;
442: adr[j] = i+1;
443: flg[i]++;
444: i = (i+m)%n;
445: }
446:
447: sblock.s_nfree = 0;
448: sblock.s_ninode = 0;
449: sblock.s_flock = 0;
450: sblock.s_ilock = 0;
451: sblock.s_fmod = 0;
452: sblock.s_ronly = 0;
453: #ifndef STANDALONE
454: time(&sblock.s_time);
455: #endif
456: sblock.s_tfree = 0;
457: sblock.s_tinode = 0;
458:
459: bfree((daddr_t)0);
460: d = sblock.s_fsize-1;
461: while(d%sblock.s_n)
462: d++;
463: for(; d > 0; d -= sblock.s_n)
464: for(i=0; i<sblock.s_n; i++) {
465: f = d - adr[i];
466: if(f < sblock.s_fsize && f >= (int)sblock.s_isize)
467: if(!duped(f))
468: bfree(f);
469: }
470: bwrite((daddr_t)1, (char *)&sblock);
471: #ifndef STANDALONE
472: sync();
473: #endif
474: return;
475: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.