|
|
1.1 root 1: /*
2: * Copyright (c) 1980 Regents of the University of California.
3: * All rights reserved. The Berkeley software License Agreement
4: * specifies the terms and conditions for redistribution.
5: */
6:
7: #ifndef lint
8: static char sccsid[] = "@(#)icheck.c 5.1 (Berkeley) 5/28/85";
9: #endif not lint
10:
11:
12: /*
13: * icheck
14: */
15: #define NB 500
16: #define MAXFN 500
17: #define MAXNINDIR (MAXBSIZE / sizeof (daddr_t))
18:
19: #ifndef STANDALONE
20: #include <stdio.h>
21: #endif
22: #ifndef SIMFS
23: #include <sys/param.h>
24: #include <sys/inode.h>
25: #include <sys/fs.h>
26: #else
27: #include "../h/param.h"
28: #include "../h/inode.h"
29: #include "../h/fs.h"
30: #endif
31:
32: union {
33: struct fs sb;
34: char pad[MAXBSIZE];
35: } sbun;
36: #define sblock sbun.sb
37:
38: union {
39: struct cg cg;
40: char pad[MAXBSIZE];
41: } cgun;
42: #define cgrp cgun.cg
43:
44: struct dinode itab[MAXIPG];
45: daddr_t blist[NB];
46: daddr_t fsblist[NB];
47: char *bmap;
48:
49: int mflg;
50: int sflg;
51: int dflg;
52: int fi;
53: ino_t ino;
54: int cginit;
55:
56: ino_t nrfile;
57: ino_t ndfile;
58: ino_t nbfile;
59: ino_t ncfile;
60: ino_t nlfile;
61:
62: daddr_t nblock;
63: daddr_t nfrag;
64: daddr_t nindir;
65: daddr_t niindir;
66:
67: daddr_t nffree;
68: daddr_t nbfree;
69:
70: daddr_t ndup;
71:
72: int nerror;
73:
74: extern int inside[], around[];
75: extern unsigned char *fragtbl[];
76:
77: long atol();
78: #ifndef STANDALONE
79: char *malloc();
80: char *calloc();
81: #endif
82:
83: main(argc, argv)
84: int argc;
85: char *argv[];
86: {
87: register i;
88: long n;
89:
90: blist[0] = -1;
91: #ifndef STANDALONE
92: while (--argc) {
93: argv++;
94: if (**argv=='-')
95: switch ((*argv)[1]) {
96: case 'd':
97: dflg++;
98: continue;
99:
100: case 'm':
101: mflg++;
102: continue;
103:
104: case 's':
105: sflg++;
106: continue;
107:
108: case 'b':
109: for(i=0; i<NB; i++) {
110: n = atol(argv[1]);
111: if(n == 0)
112: break;
113: blist[i] = n;
114: argv++;
115: argc--;
116: }
117: blist[i] = -1;
118: continue;
119:
120: default:
121: printf("Bad flag\n");
122: }
123: check(*argv);
124: }
125: #else
126: {
127: static char fname[128];
128:
129: printf("File: ");
130: gets(fname);
131: check(fname);
132: }
133: #endif
134: return(nerror);
135: }
136:
137: check(file)
138: char *file;
139: {
140: register i, j, c;
141: daddr_t d, cgd, cbase, b;
142: long n;
143: char buf[BUFSIZ];
144:
145: fi = open(file, sflg ? 2 : 0);
146: if (fi < 0) {
147: perror(file);
148: nerror |= 04;
149: return;
150: }
151: printf("%s:\n", file);
152: nrfile = 0;
153: ndfile = 0;
154: ncfile = 0;
155: nbfile = 0;
156: nlfile = 0;
157:
158: nblock = 0;
159: nfrag = 0;
160: nindir = 0;
161: niindir = 0;
162:
163: ndup = 0;
164: #ifndef STANDALONE
165: sync();
166: #endif
167: getsb(&sblock, file);
168: if (nerror)
169: return;
170: for (n=0; blist[n] != -1; n++)
171: fsblist[n] = dbtofsb(&sblock, blist[n]);
172: ino = 0;
173: n = roundup(howmany(sblock.fs_size, NBBY), sizeof(short));
174: #ifdef STANDALONE
175: bmap = NULL;
176: #else
177: bmap = malloc((unsigned)n);
178: #endif
179: if (bmap==NULL) {
180: printf("Not enough core; duplicates unchecked\n");
181: dflg++;
182: if (sflg) {
183: printf("No Updates\n");
184: sflg = 0;
185: }
186: }
187: ino = 0;
188: cginit = 1;
189: if (!dflg) {
190: for (i = 0; i < (unsigned)n; i++)
191: bmap[i] = 0;
192: for (c = 0; c < sblock.fs_ncg; c++) {
193: cgd = cgtod(&sblock, c);
194: if (c == 0)
195: d = cgbase(&sblock, c);
196: else
197: d = cgsblock(&sblock, c);
198: sprintf(buf, "spare super block %d", c);
199: for (; d < cgd; d += sblock.fs_frag)
200: chk(d, buf, sblock.fs_bsize);
201: d = cgimin(&sblock, c);
202: sprintf(buf, "cylinder group %d", c);
203: while (cgd < d) {
204: chk(cgd, buf, sblock.fs_bsize);
205: cgd += sblock.fs_frag;
206: }
207: d = cgdmin(&sblock, c);
208: i = INOPB(&sblock);
209: for (; cgd < d; cgd += sblock.fs_frag) {
210: sprintf(buf, "inodes %d-%d", ino, ino + i);
211: chk(cgd, buf, sblock.fs_bsize);
212: ino += i;
213: }
214: if (c == 0) {
215: d += howmany(sblock.fs_cssize, sblock.fs_fsize);
216: for (; cgd < d; cgd++)
217: chk(cgd, "csum", sblock.fs_fsize);
218: }
219: }
220: }
221: ino = 0;
222: cginit = 0;
223: for (c = 0; c < sblock.fs_ncg; c++) {
224: bread(fsbtodb(&sblock, cgimin(&sblock, c)), (char *)itab,
225: sblock.fs_ipg * sizeof (struct dinode));
226: for (j=0; j < sblock.fs_ipg; j++) {
227: pass1(&itab[j]);
228: ino++;
229: }
230: }
231: ino = 0;
232: #ifndef STANDALONE
233: sync();
234: #endif
235: if (sflg) {
236: makecg();
237: close(fi);
238: #ifndef STANDALONE
239: if (bmap)
240: free(bmap);
241: #endif
242: return;
243: }
244: nffree = 0;
245: nbfree = 0;
246: for (c = 0; c < sblock.fs_ncg; c++) {
247: cbase = cgbase(&sblock, c);
248: bread(fsbtodb(&sblock, cgtod(&sblock, c)), (char *)&cgrp,
249: sblock.fs_cgsize);
250: if (cgrp.cg_magic != CG_MAGIC)
251: printf("cg %d: bad magic number\n", c);
252: for (b = 0; b < sblock.fs_fpg; b += sblock.fs_frag) {
253: if (isblock(&sblock, cgrp.cg_free,
254: b / sblock.fs_frag)) {
255: nbfree++;
256: chk(cbase+b, "free block", sblock.fs_bsize);
257: } else {
258: for (d = 0; d < sblock.fs_frag; d++)
259: if (isset(cgrp.cg_free, b+d)) {
260: chk(cbase+b+d, "free frag", sblock.fs_fsize);
261: nffree++;
262: }
263: }
264: }
265: }
266: close(fi);
267: #ifndef STANDALONE
268: if (bmap)
269: free(bmap);
270: #endif
271:
272: i = nrfile + ndfile + ncfile + nbfile + nlfile;
273: #ifndef STANDALONE
274: printf("files %6u (r=%u,d=%u,b=%u,c=%u,sl=%u)\n",
275: i, nrfile, ndfile, nbfile, ncfile, nlfile);
276: #else
277: printf("files %u (r=%u,d=%u,b=%u,c=%u,sl=%u)\n",
278: i, nrfile, ndfile, nbfile, ncfile, nlfile);
279: #endif
280: n = (nblock + nindir + niindir) * sblock.fs_frag + nfrag;
281: #ifdef STANDALONE
282: printf("used %ld (i=%ld,ii=%ld,b=%ld,f=%ld)\n",
283: n, nindir, niindir, nblock, nfrag);
284: printf("free %ld (b=%ld,f=%ld)\n", nffree + sblock.fs_frag * nbfree,
285: nbfree, nffree);
286: #else
287: printf("used %7ld (i=%ld,ii=%ld,b=%ld,f=%ld)\n",
288: n, nindir, niindir, nblock, nfrag);
289: printf("free %7ld (b=%ld,f=%ld)\n", nffree + sblock.fs_frag * nbfree,
290: nbfree, nffree);
291: #endif
292: if(!dflg) {
293: n = 0;
294: for (d = 0; d < sblock.fs_size; d++)
295: if(!duped(d, sblock.fs_fsize)) {
296: if(mflg)
297: printf("%ld missing\n", d);
298: n++;
299: }
300: printf("missing%5ld\n", n);
301: }
302: }
303:
304: pass1(ip)
305: register struct dinode *ip;
306: {
307: daddr_t ind1[MAXNINDIR];
308: daddr_t ind2[MAXNINDIR];
309: daddr_t db, ib;
310: register int i, j, k, siz;
311: int lbn;
312: char buf[BUFSIZ];
313:
314: i = ip->di_mode & IFMT;
315: if(i == 0)
316: return;
317: switch (i) {
318: case IFCHR:
319: ncfile++;
320: return;
321: case IFBLK:
322: nbfile++;
323: return;
324: case IFDIR:
325: ndfile++;
326: break;
327: case IFREG:
328: nrfile++;
329: break;
330: case IFLNK:
331: nlfile++;
332: break;
333: default:
334: printf("bad mode %u\n", ino);
335: return;
336: }
337: for (i = 0; i < NDADDR; i++) {
338: db = ip->di_db[i];
339: if (db == 0)
340: continue;
341: siz = dblksize(&sblock, ip, i);
342: sprintf(buf, "logical data block %d", i);
343: chk(db, buf, siz);
344: if (siz == sblock.fs_bsize)
345: nblock++;
346: else
347: nfrag += howmany(siz, sblock.fs_fsize);
348: }
349: for(i = 0; i < NIADDR; i++) {
350: ib = ip->di_ib[i];
351: if (ib == 0)
352: continue;
353: if (chk(ib, "1st indirect", sblock.fs_bsize))
354: continue;
355: bread(fsbtodb(&sblock, ib), (char *)ind1, sblock.fs_bsize);
356: nindir++;
357: for (j = 0; j < NINDIR(&sblock); j++) {
358: ib = ind1[j];
359: if (ib == 0)
360: continue;
361: if (i == 0) {
362: lbn = NDADDR + j;
363: siz = dblksize(&sblock, ip, lbn);
364: sprintf(buf, "logical data block %d", lbn);
365: chk(ib, buf, siz);
366: if (siz == sblock.fs_bsize)
367: nblock++;
368: else
369: nfrag += howmany(siz, sblock.fs_fsize);
370: continue;
371: }
372: if (chk(ib, "2nd indirect", sblock.fs_bsize))
373: continue;
374: bread(fsbtodb(&sblock, ib), (char *)ind2,
375: sblock.fs_bsize);
376: niindir++;
377: for (k = 0; k < NINDIR(&sblock); k++) {
378: ib = ind2[k];
379: if (ib == 0)
380: continue;
381: lbn = NDADDR + NINDIR(&sblock) * (i + j) + k;
382: siz = dblksize(&sblock, ip, lbn);
383: sprintf(buf, "logical data block %d", lbn);
384: chk(ib, buf, siz);
385: if (siz == sblock.fs_bsize)
386: nblock++;
387: else
388: nfrag += howmany(siz, sblock.fs_fsize);
389: }
390: }
391: }
392: }
393:
394: chk(bno, s, size)
395: daddr_t bno;
396: char *s;
397: int size;
398: {
399: register n, cg;
400: int frags;
401:
402: cg = dtog(&sblock, bno);
403: if (cginit == 0 && bno >= sblock.fs_frag * sblock.fs_size) {
404: printf("%ld bad; inode=%u, class=%s\n", bno, ino, s);
405: return(1);
406: }
407: frags = numfrags(&sblock, size);
408: if (frags == sblock.fs_frag) {
409: if (duped(bno, size)) {
410: printf("%ld dup block; inode=%u, class=%s\n",
411: bno, ino, s);
412: ndup += sblock.fs_frag;
413: }
414: } else {
415: for (n = 0; n < frags; n++) {
416: if (duped(bno + n, sblock.fs_fsize)) {
417: printf("%ld dup frag; inode=%u, class=%s\n",
418: bno, ino, s);
419: ndup++;
420: }
421: }
422: }
423: for (n=0; blist[n] != -1; n++)
424: if (fsblist[n] >= bno && fsblist[n] < bno + frags)
425: printf("%ld arg; frag %d of %d, inode=%u, class=%s\n",
426: blist[n], fsblist[n] - bno, frags, ino, s);
427: return(0);
428: }
429:
430: duped(bno, size)
431: daddr_t bno;
432: int size;
433: {
434: if(dflg)
435: return(0);
436: if (size != sblock.fs_fsize && size != sblock.fs_bsize)
437: printf("bad size %d to duped\n", size);
438: if (size == sblock.fs_fsize) {
439: if (isset(bmap, bno))
440: return(1);
441: setbit(bmap, bno);
442: return (0);
443: }
444: if (bno % sblock.fs_frag != 0)
445: printf("bad bno %d to duped\n", bno);
446: if (isblock(&sblock, bmap, bno/sblock.fs_frag))
447: return (1);
448: setblock(&sblock, bmap, bno/sblock.fs_frag);
449: return(0);
450: }
451:
452: makecg()
453: {
454: int c, blk;
455: daddr_t dbase, d, dlower, dupper, dmax;
456: long i, j, s;
457: register struct csum *cs;
458: register struct dinode *dp;
459:
460: sblock.fs_cstotal.cs_nbfree = 0;
461: sblock.fs_cstotal.cs_nffree = 0;
462: sblock.fs_cstotal.cs_nifree = 0;
463: sblock.fs_cstotal.cs_ndir = 0;
464: for (c = 0; c < sblock.fs_ncg; c++) {
465: dbase = cgbase(&sblock, c);
466: dmax = dbase + sblock.fs_fpg;
467: if (dmax > sblock.fs_size) {
468: for ( ; dmax >= sblock.fs_size; dmax--)
469: clrbit(cgrp.cg_free, dmax - dbase);
470: dmax++;
471: }
472: dlower = cgsblock(&sblock, c) - dbase;
473: dupper = cgdmin(&sblock, c) - dbase;
474: cs = &sblock.fs_cs(&sblock, c);
475: cgrp.cg_time = time(0);
476: cgrp.cg_magic = CG_MAGIC;
477: cgrp.cg_cgx = c;
478: if (c == sblock.fs_ncg - 1)
479: cgrp.cg_ncyl = sblock.fs_ncyl % sblock.fs_cpg;
480: else
481: cgrp.cg_ncyl = sblock.fs_cpg;
482: cgrp.cg_niblk = sblock.fs_ipg;
483: cgrp.cg_ndblk = dmax - dbase;
484: cgrp.cg_cs.cs_ndir = 0;
485: cgrp.cg_cs.cs_nffree = 0;
486: cgrp.cg_cs.cs_nbfree = 0;
487: cgrp.cg_cs.cs_nifree = 0;
488: cgrp.cg_rotor = 0;
489: cgrp.cg_frotor = 0;
490: cgrp.cg_irotor = 0;
491: for (i = 0; i < sblock.fs_frag; i++)
492: cgrp.cg_frsum[i] = 0;
493: bread(fsbtodb(&sblock, cgimin(&sblock, c)), (char *)itab,
494: sblock.fs_ipg * sizeof(struct dinode));
495: for (i = 0; i < sblock.fs_ipg; i++) {
496: cgrp.cg_cs.cs_nifree++;
497: clrbit(cgrp.cg_iused, i);
498: dp = &itab[i];
499: if ((dp->di_mode & IFMT) != 0) {
500: if ((dp->di_mode & IFMT) == IFDIR)
501: cgrp.cg_cs.cs_ndir++;
502: cgrp.cg_cs.cs_nifree--;
503: setbit(cgrp.cg_iused, i);
504: continue;
505: }
506: }
507: while (i < MAXIPG) {
508: clrbit(cgrp.cg_iused, i);
509: i++;
510: }
511: if (c == 0)
512: for (i = 0; i < ROOTINO; i++) {
513: setbit(cgrp.cg_iused, i);
514: cgrp.cg_cs.cs_nifree--;
515: }
516: for (s = 0; s < MAXCPG; s++) {
517: cgrp.cg_btot[s] = 0;
518: for (i = 0; i < NRPOS; i++)
519: cgrp.cg_b[s][i] = 0;
520: }
521: if (c == 0) {
522: dupper += howmany(sblock.fs_cssize, sblock.fs_fsize);
523: }
524: for (d = dlower; d < dupper; d++)
525: clrbit(cgrp.cg_free, d);
526: for (d = 0; (d + sblock.fs_frag) <= dmax - dbase;
527: d += sblock.fs_frag) {
528: j = 0;
529: for (i = 0; i < sblock.fs_frag; i++) {
530: if (!isset(bmap, dbase + d + i)) {
531: setbit(cgrp.cg_free, d + i);
532: j++;
533: } else
534: clrbit(cgrp.cg_free, d+i);
535: }
536: if (j == sblock.fs_frag) {
537: cgrp.cg_cs.cs_nbfree++;
538: cgrp.cg_btot[cbtocylno(&sblock, d)]++;
539: cgrp.cg_b[cbtocylno(&sblock, d)]
540: [cbtorpos(&sblock, d)]++;
541: } else if (j > 0) {
542: cgrp.cg_cs.cs_nffree += j;
543: blk = blkmap(&sblock, cgrp.cg_free, d);
544: fragacct(&sblock, blk, cgrp.cg_frsum, 1);
545: }
546: }
547: for (j = d; d < dmax - dbase; d++) {
548: if (!isset(bmap, dbase + d)) {
549: setbit(cgrp.cg_free, d);
550: cgrp.cg_cs.cs_nffree++;
551: } else
552: clrbit(cgrp.cg_free, d);
553: }
554: for (; d % sblock.fs_frag != 0; d++)
555: clrbit(cgrp.cg_free, d);
556: if (j != d) {
557: blk = blkmap(&sblock, cgrp.cg_free, j);
558: fragacct(&sblock, blk, cgrp.cg_frsum, 1);
559: }
560: for (d /= sblock.fs_frag; d < MAXBPG(&sblock); d ++)
561: clrblock(&sblock, cgrp.cg_free, d);
562: sblock.fs_cstotal.cs_nffree += cgrp.cg_cs.cs_nffree;
563: sblock.fs_cstotal.cs_nbfree += cgrp.cg_cs.cs_nbfree;
564: sblock.fs_cstotal.cs_nifree += cgrp.cg_cs.cs_nifree;
565: sblock.fs_cstotal.cs_ndir += cgrp.cg_cs.cs_ndir;
566: *cs = cgrp.cg_cs;
567: bwrite(fsbtodb(&sblock, cgtod(&sblock, c)), &cgrp,
568: sblock.fs_cgsize);
569: }
570: for (i = 0, j = 0; i < sblock.fs_cssize; i += sblock.fs_bsize, j++) {
571: bwrite(fsbtodb(&sblock, sblock.fs_csaddr + j * sblock.fs_frag),
572: (char *)sblock.fs_csp[j],
573: sblock.fs_cssize - i < sblock.fs_bsize ?
574: sblock.fs_cssize - i : sblock.fs_bsize);
575: }
576: sblock.fs_ronly = 0;
577: sblock.fs_fmod = 0;
578: bwrite(SBLOCK, (char *)&sblock, SBSIZE);
579: }
580:
581: /*
582: * update the frsum fields to reflect addition or deletion
583: * of some frags
584: */
585: fragacct(fs, fragmap, fraglist, cnt)
586: struct fs *fs;
587: int fragmap;
588: long fraglist[];
589: int cnt;
590: {
591: int inblk;
592: register int field, subfield;
593: register int siz, pos;
594:
595: inblk = (int)(fragtbl[fs->fs_frag][fragmap] << 1);
596: fragmap <<= 1;
597: for (siz = 1; siz < fs->fs_frag; siz++) {
598: if ((inblk & (1 << (siz + (fs->fs_frag % NBBY)))) == 0)
599: continue;
600: field = around[siz];
601: subfield = inside[siz];
602: for (pos = siz; pos <= fs->fs_frag; pos++) {
603: if ((fragmap & field) == subfield) {
604: fraglist[siz] += cnt;
605: pos += siz;
606: field <<= siz;
607: subfield <<= siz;
608: }
609: field <<= 1;
610: subfield <<= 1;
611: }
612: }
613: }
614:
615: getsb(fs, file)
616: register struct fs *fs;
617: char *file;
618: {
619: int i, j, size;
620:
621: if (bread(SBLOCK, fs, SBSIZE)) {
622: printf("bad super block");
623: perror(file);
624: nerror |= 04;
625: return;
626: }
627: if (fs->fs_magic != FS_MAGIC) {
628: printf("%s: bad magic number\n", file);
629: nerror |= 04;
630: return;
631: }
632: for (i = 0, j = 0; i < sblock.fs_cssize; i += sblock.fs_bsize, j++) {
633: size = sblock.fs_cssize - i < sblock.fs_bsize ?
634: sblock.fs_cssize - i : sblock.fs_bsize;
635: sblock.fs_csp[j] = (struct csum *)calloc(1, size);
636: bread(fsbtodb(fs, fs->fs_csaddr + (j * fs->fs_frag)),
637: (char *)fs->fs_csp[j], size);
638: }
639: }
640:
641: bwrite(blk, buf, size)
642: char *buf;
643: daddr_t blk;
644: register size;
645: {
646: if (lseek(fi, blk * DEV_BSIZE, 0) < 0) {
647: perror("FS SEEK");
648: return(1);
649: }
650: if (write(fi, buf, size) != size) {
651: perror("FS WRITE");
652: return(1);
653: }
654: return (0);
655: }
656:
657: bread(bno, buf, cnt)
658: daddr_t bno;
659: char *buf;
660: {
661: register i;
662:
663: lseek(fi, bno * DEV_BSIZE, 0);
664: if ((i = read(fi, buf, cnt)) != cnt) {
665: if (sflg) {
666: printf("No Update\n");
667: sflg = 0;
668: }
669: for(i=0; i<sblock.fs_bsize; i++)
670: buf[i] = 0;
671: return (1);
672: }
673: return (0);
674: }
675:
676: /*
677: * check if a block is available
678: */
679: isblock(fs, cp, h)
680: struct fs *fs;
681: unsigned char *cp;
682: int h;
683: {
684: unsigned char mask;
685:
686: switch (fs->fs_frag) {
687: case 8:
688: return (cp[h] == 0xff);
689: case 4:
690: mask = 0x0f << ((h & 0x1) << 2);
691: return ((cp[h >> 1] & mask) == mask);
692: case 2:
693: mask = 0x03 << ((h & 0x3) << 1);
694: return ((cp[h >> 2] & mask) == mask);
695: case 1:
696: mask = 0x01 << (h & 0x7);
697: return ((cp[h >> 3] & mask) == mask);
698: default:
699: #ifdef STANDALONE
700: printf("isblock bad fs_frag %d\n", fs->fs_frag);
701: #else
702: fprintf(stderr, "isblock bad fs_frag %d\n", fs->fs_frag);
703: #endif
704: return;
705: }
706: }
707:
708: /*
709: * take a block out of the map
710: */
711: clrblock(fs, cp, h)
712: struct fs *fs;
713: unsigned char *cp;
714: int h;
715: {
716: switch ((fs)->fs_frag) {
717: case 8:
718: cp[h] = 0;
719: return;
720: case 4:
721: cp[h >> 1] &= ~(0x0f << ((h & 0x1) << 2));
722: return;
723: case 2:
724: cp[h >> 2] &= ~(0x03 << ((h & 0x3) << 1));
725: return;
726: case 1:
727: cp[h >> 3] &= ~(0x01 << (h & 0x7));
728: return;
729: default:
730: #ifdef STANDALONE
731: printf("clrblock bad fs_frag %d\n", fs->fs_frag);
732: #else
733: fprintf(stderr, "clrblock bad fs_frag %d\n", fs->fs_frag);
734: #endif
735: return;
736: }
737: }
738:
739: /*
740: * put a block into the map
741: */
742: setblock(fs, cp, h)
743: struct fs *fs;
744: unsigned char *cp;
745: int h;
746: {
747: switch (fs->fs_frag) {
748: case 8:
749: cp[h] = 0xff;
750: return;
751: case 4:
752: cp[h >> 1] |= (0x0f << ((h & 0x1) << 2));
753: return;
754: case 2:
755: cp[h >> 2] |= (0x03 << ((h & 0x3) << 1));
756: return;
757: case 1:
758: cp[h >> 3] |= (0x01 << (h & 0x7));
759: return;
760: default:
761: #ifdef STANDALONE
762: printf("setblock bad fs_frag %d\n", fs->fs_frag);
763: #else
764: fprintf(stderr, "setblock bad fs_frag %d\n", fs->fs_frag);
765: #endif
766: return;
767: }
768: }
769:
770: /* tables.c 4.1 82/03/25 */
771:
772: /* merged into kernel: tables.c 2.1 3/25/82 */
773:
774: /* last monet version: partab.c 4.2 81/03/08 */
775:
776: /*
777: * bit patterns for identifying fragments in the block map
778: * used as ((map & around) == inside)
779: */
780: int around[9] = {
781: 0x3, 0x7, 0xf, 0x1f, 0x3f, 0x7f, 0xff, 0x1ff, 0x3ff
782: };
783: int inside[9] = {
784: 0x0, 0x2, 0x6, 0xe, 0x1e, 0x3e, 0x7e, 0xfe, 0x1fe
785: };
786:
787: /*
788: * given a block map bit pattern, the frag tables tell whether a
789: * particular size fragment is available.
790: *
791: * used as:
792: * if ((1 << (size - 1)) & fragtbl[fs->fs_frag][map] {
793: * at least one fragment of the indicated size is available
794: * }
795: *
796: * These tables are used by the scanc instruction on the VAX to
797: * quickly find an appropriate fragment.
798: */
799:
800: unsigned char fragtbl124[256] = {
801: 0x00, 0x16, 0x16, 0x2a, 0x16, 0x16, 0x26, 0x4e,
802: 0x16, 0x16, 0x16, 0x3e, 0x2a, 0x3e, 0x4e, 0x8a,
803: 0x16, 0x16, 0x16, 0x3e, 0x16, 0x16, 0x36, 0x5e,
804: 0x16, 0x16, 0x16, 0x3e, 0x3e, 0x3e, 0x5e, 0x9e,
805: 0x16, 0x16, 0x16, 0x3e, 0x16, 0x16, 0x36, 0x5e,
806: 0x16, 0x16, 0x16, 0x3e, 0x3e, 0x3e, 0x5e, 0x9e,
807: 0x2a, 0x3e, 0x3e, 0x2a, 0x3e, 0x3e, 0x2e, 0x6e,
808: 0x3e, 0x3e, 0x3e, 0x3e, 0x2a, 0x3e, 0x6e, 0xaa,
809: 0x16, 0x16, 0x16, 0x3e, 0x16, 0x16, 0x36, 0x5e,
810: 0x16, 0x16, 0x16, 0x3e, 0x3e, 0x3e, 0x5e, 0x9e,
811: 0x16, 0x16, 0x16, 0x3e, 0x16, 0x16, 0x36, 0x5e,
812: 0x16, 0x16, 0x16, 0x3e, 0x3e, 0x3e, 0x5e, 0x9e,
813: 0x26, 0x36, 0x36, 0x2e, 0x36, 0x36, 0x26, 0x6e,
814: 0x36, 0x36, 0x36, 0x3e, 0x2e, 0x3e, 0x6e, 0xae,
815: 0x4e, 0x5e, 0x5e, 0x6e, 0x5e, 0x5e, 0x6e, 0x4e,
816: 0x5e, 0x5e, 0x5e, 0x7e, 0x6e, 0x7e, 0x4e, 0xce,
817: 0x16, 0x16, 0x16, 0x3e, 0x16, 0x16, 0x36, 0x5e,
818: 0x16, 0x16, 0x16, 0x3e, 0x3e, 0x3e, 0x5e, 0x9e,
819: 0x16, 0x16, 0x16, 0x3e, 0x16, 0x16, 0x36, 0x5e,
820: 0x16, 0x16, 0x16, 0x3e, 0x3e, 0x3e, 0x5e, 0x9e,
821: 0x16, 0x16, 0x16, 0x3e, 0x16, 0x16, 0x36, 0x5e,
822: 0x16, 0x16, 0x16, 0x3e, 0x3e, 0x3e, 0x5e, 0x9e,
823: 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x7e,
824: 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x7e, 0xbe,
825: 0x2a, 0x3e, 0x3e, 0x2a, 0x3e, 0x3e, 0x2e, 0x6e,
826: 0x3e, 0x3e, 0x3e, 0x3e, 0x2a, 0x3e, 0x6e, 0xaa,
827: 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x7e,
828: 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x7e, 0xbe,
829: 0x4e, 0x5e, 0x5e, 0x6e, 0x5e, 0x5e, 0x6e, 0x4e,
830: 0x5e, 0x5e, 0x5e, 0x7e, 0x6e, 0x7e, 0x4e, 0xce,
831: 0x8a, 0x9e, 0x9e, 0xaa, 0x9e, 0x9e, 0xae, 0xce,
832: 0x9e, 0x9e, 0x9e, 0xbe, 0xaa, 0xbe, 0xce, 0x8a,
833: };
834:
835: unsigned char fragtbl8[256] = {
836: 0x00, 0x01, 0x01, 0x02, 0x01, 0x01, 0x02, 0x04,
837: 0x01, 0x01, 0x01, 0x03, 0x02, 0x03, 0x04, 0x08,
838: 0x01, 0x01, 0x01, 0x03, 0x01, 0x01, 0x03, 0x05,
839: 0x02, 0x03, 0x03, 0x02, 0x04, 0x05, 0x08, 0x10,
840: 0x01, 0x01, 0x01, 0x03, 0x01, 0x01, 0x03, 0x05,
841: 0x01, 0x01, 0x01, 0x03, 0x03, 0x03, 0x05, 0x09,
842: 0x02, 0x03, 0x03, 0x02, 0x03, 0x03, 0x02, 0x06,
843: 0x04, 0x05, 0x05, 0x06, 0x08, 0x09, 0x10, 0x20,
844: 0x01, 0x01, 0x01, 0x03, 0x01, 0x01, 0x03, 0x05,
845: 0x01, 0x01, 0x01, 0x03, 0x03, 0x03, 0x05, 0x09,
846: 0x01, 0x01, 0x01, 0x03, 0x01, 0x01, 0x03, 0x05,
847: 0x03, 0x03, 0x03, 0x03, 0x05, 0x05, 0x09, 0x11,
848: 0x02, 0x03, 0x03, 0x02, 0x03, 0x03, 0x02, 0x06,
849: 0x03, 0x03, 0x03, 0x03, 0x02, 0x03, 0x06, 0x0a,
850: 0x04, 0x05, 0x05, 0x06, 0x05, 0x05, 0x06, 0x04,
851: 0x08, 0x09, 0x09, 0x0a, 0x10, 0x11, 0x20, 0x40,
852: 0x01, 0x01, 0x01, 0x03, 0x01, 0x01, 0x03, 0x05,
853: 0x01, 0x01, 0x01, 0x03, 0x03, 0x03, 0x05, 0x09,
854: 0x01, 0x01, 0x01, 0x03, 0x01, 0x01, 0x03, 0x05,
855: 0x03, 0x03, 0x03, 0x03, 0x05, 0x05, 0x09, 0x11,
856: 0x01, 0x01, 0x01, 0x03, 0x01, 0x01, 0x03, 0x05,
857: 0x01, 0x01, 0x01, 0x03, 0x03, 0x03, 0x05, 0x09,
858: 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x07,
859: 0x05, 0x05, 0x05, 0x07, 0x09, 0x09, 0x11, 0x21,
860: 0x02, 0x03, 0x03, 0x02, 0x03, 0x03, 0x02, 0x06,
861: 0x03, 0x03, 0x03, 0x03, 0x02, 0x03, 0x06, 0x0a,
862: 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x07,
863: 0x02, 0x03, 0x03, 0x02, 0x06, 0x07, 0x0a, 0x12,
864: 0x04, 0x05, 0x05, 0x06, 0x05, 0x05, 0x06, 0x04,
865: 0x05, 0x05, 0x05, 0x07, 0x06, 0x07, 0x04, 0x0c,
866: 0x08, 0x09, 0x09, 0x0a, 0x09, 0x09, 0x0a, 0x0c,
867: 0x10, 0x11, 0x11, 0x12, 0x20, 0x21, 0x40, 0x80,
868: };
869:
870: /*
871: * the actual fragtbl array
872: */
873: unsigned char *fragtbl[MAXFRAG + 1] = {
874: 0, fragtbl124, fragtbl124, 0, fragtbl124, 0, 0, 0, fragtbl8,
875: };
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.