use bread instead of getblk for summary info
[unix-history] / usr / src / sbin / icheck / icheck.c
CommitLineData
156b8f82 1static char *sccsid = "@(#)icheck.c 1.21 (Berkeley) %G%";
955f6ff8 2
b42940ce
KM
3/*
4 * icheck
5 */
6#define NB 500
b42940ce 7#define MAXFN 500
c312eebd 8#define MAXNINDIR (MAXBSIZE / sizeof (daddr_t))
b42940ce
KM
9
10#ifndef STANDALONE
11#include <stdio.h>
12#endif
13#include "../h/param.h"
14#include "../h/inode.h"
b42940ce
KM
15#include "../h/fs.h"
16
b42940ce
KM
17union {
18 struct fs sb;
b6407c9d 19 char pad[MAXBSIZE];
b42940ce
KM
20} sbun;
21#define sblock sbun.sb
22
23union {
24 struct cg cg;
b6407c9d 25 char pad[MAXBSIZE];
b42940ce
KM
26} cgun;
27#define cgrp cgun.cg
28
29struct dinode itab[MAXIPG];
b42940ce
KM
30daddr_t blist[NB];
31char *bmap;
32
b42940ce 33int mflg;
19f19804 34int sflg;
b42940ce
KM
35int dflg;
36int fi;
37ino_t ino;
38int cginit;
39
40ino_t nrfile;
41ino_t ndfile;
42ino_t nbfile;
43ino_t ncfile;
ea47352d 44ino_t nlfile;
b42940ce
KM
45
46daddr_t nblock;
47daddr_t nfrag;
b42940ce 48daddr_t nindir;
b42940ce
KM
49daddr_t niindir;
50
51daddr_t nffree;
b42940ce
KM
52daddr_t nbfree;
53
54daddr_t ndup;
55
56int nerror;
57
19f19804 58extern int inside[], around[];
b6407c9d 59extern unsigned char *fragtbl[];
19f19804 60
b42940ce 61long atol();
b42940ce
KM
62#ifndef STANDALONE
63char *malloc();
19f19804 64char *calloc();
b42940ce
KM
65#endif
66
67main(argc, argv)
19f19804
KM
68 int argc;
69 char *argv[];
b42940ce
KM
70{
71 register i;
72 long n;
73
74 blist[0] = -1;
75#ifndef STANDALONE
76 while (--argc) {
77 argv++;
78 if (**argv=='-')
79 switch ((*argv)[1]) {
80 case 'd':
81 dflg++;
82 continue;
83
84 case 'm':
85 mflg++;
86 continue;
87
19f19804
KM
88 case 's':
89 sflg++;
90 continue;
91
b42940ce
KM
92 case 'b':
93 for(i=0; i<NB; i++) {
94 n = atol(argv[1]);
95 if(n == 0)
96 break;
97 blist[i] = n;
98 argv++;
99 argc--;
100 }
101 blist[i] = -1;
102 continue;
103
104 default:
105 printf("Bad flag\n");
106 }
107 check(*argv);
108 }
109#else
110 {
111 static char fname[128];
112
113 printf("File: ");
114 gets(fname);
115 check(fname);
116 }
117#endif
118 return(nerror);
119}
120
121check(file)
19f19804 122 char *file;
b42940ce
KM
123{
124 register i, j, c;
125 daddr_t d, cgd, cbase, b;
126 long n;
127
19f19804 128 fi = open(file, sflg ? 2 : 0);
b42940ce 129 if (fi < 0) {
19f19804 130 perror(file);
b42940ce
KM
131 nerror |= 04;
132 return;
133 }
134 printf("%s:\n", file);
135 nrfile = 0;
136 ndfile = 0;
137 ncfile = 0;
138 nbfile = 0;
ea47352d 139 nlfile = 0;
b42940ce
KM
140
141 nblock = 0;
142 nfrag = 0;
b42940ce 143 nindir = 0;
b42940ce
KM
144 niindir = 0;
145
146 ndup = 0;
147#ifndef STANDALONE
148 sync();
149#endif
b6407c9d
KM
150 getsb(&sblock, file);
151 if (nerror)
b42940ce 152 return;
b42940ce 153 ino = 0;
19f19804 154 n = roundup(howmany(sblock.fs_size, NBBY), sizeof(short));
b42940ce
KM
155#ifdef STANDALONE
156 bmap = NULL;
157#else
158 bmap = malloc((unsigned)n);
159#endif
160 if (bmap==NULL) {
161 printf("Not enough core; duplicates unchecked\n");
162 dflg++;
19f19804
KM
163 if (sflg) {
164 printf("No Updates\n");
165 sflg = 0;
166 }
b42940ce
KM
167 }
168 ino = 0;
169 cginit = 1;
170 if(!dflg) {
171 for (i=0; i<(unsigned)n; i++)
172 bmap[i] = 0;
173 for (c=0; c < sblock.fs_ncg; c++) {
6994bf5d
KM
174 cgd = cgtod(&sblock, c);
175 for (d = cgbase(&sblock, c); d < cgd; d += sblock.fs_frag)
b6407c9d 176 chk(d, "badcg", sblock.fs_bsize);
6994bf5d 177 d = cgimin(&sblock, c);
b42940ce 178 while (cgd < d) {
b6407c9d
KM
179 chk(cgd, "cg", sblock.fs_bsize);
180 cgd += sblock.fs_frag;
b42940ce 181 }
6994bf5d 182 d = cgdmin(&sblock, c);
b6407c9d
KM
183 for (; cgd < d; cgd += sblock.fs_frag)
184 chk(cgd, "inode", sblock.fs_bsize);
b42940ce 185 if (c == 0) {
b6407c9d
KM
186 d += howmany(sblock.fs_cssize, sblock.fs_bsize)
187 * sblock.fs_frag;
188 for (; cgd < d; cgd += sblock.fs_frag)
189 chk(cgd, "csum", sblock.fs_bsize);
b42940ce
KM
190 }
191 }
192 }
193 cginit = 0;
194 for (c = 0; c < sblock.fs_ncg; c++) {
6994bf5d 195 bread(fsbtodb(&sblock, cgimin(&sblock, c)), (char *)itab,
b42940ce
KM
196 sblock.fs_ipg * sizeof (struct dinode));
197 for (j=0; j < sblock.fs_ipg; j++) {
198 pass1(&itab[j]);
199 ino++;
200 }
201 }
202 ino = 0;
203#ifndef STANDALONE
204 sync();
205#endif
19f19804
KM
206 if (sflg) {
207 makecg();
208 close(fi);
209#ifndef STANDALONE
210 if (bmap)
211 free(bmap);
212#endif
213 return;
214 }
b42940ce 215 nffree = 0;
b42940ce
KM
216 nbfree = 0;
217 for (c = 0; c < sblock.fs_ncg; c++) {
6994bf5d
KM
218 cbase = cgbase(&sblock, c);
219 bread(fsbtodb(&sblock, cgtod(&sblock, c)), (char *)&cgrp,
b6407c9d
KM
220 sblock.fs_cgsize);
221 for (b = 0; b < sblock.fs_fpg; b += sblock.fs_frag) {
222 if (isblock(&sblock, cgrp.cg_free,
223 b / sblock.fs_frag)) {
b42940ce 224 nbfree++;
b6407c9d 225 chk(cbase+b, "block", sblock.fs_bsize);
b42940ce 226 } else {
b6407c9d 227 for (d = 0; d < sblock.fs_frag; d++)
b42940ce 228 if (isset(cgrp.cg_free, b+d)) {
b6407c9d 229 chk(cbase+b+d, "frag", sblock.fs_fsize);
b42940ce 230 nffree++;
b42940ce
KM
231 }
232 }
233 }
234 }
235 close(fi);
236#ifndef STANDALONE
237 if (bmap)
238 free(bmap);
239#endif
240
ea47352d 241 i = nrfile + ndfile + ncfile + nbfile + nlfile;
b42940ce 242#ifndef STANDALONE
ea47352d
KM
243 printf("files %6u (r=%u,d=%u,b=%u,c=%u,sl=%u)\n",
244 i, nrfile, ndfile, nbfile, ncfile, nlfile);
b42940ce 245#else
ea47352d
KM
246 printf("files %u (r=%u,d=%u,b=%u,c=%u,sl=%u)\n",
247 i, nrfile, ndfile, nbfile, ncfile, nlfile);
b42940ce 248#endif
b6407c9d 249 n = (nblock + nindir + niindir) * sblock.fs_frag + nfrag;
b42940ce
KM
250#ifdef STANDALONE
251 printf("used %ld (i=%ld,ii=%ld,b=%ld,f=%ld)\n",
252 n, nindir, niindir, nblock, nfrag);
b6407c9d 253 printf("free %ld (b=%ld,f=%ld)\n", nffree + sblock.fs_frag * nbfree,
b42940ce
KM
254 nbfree, nffree);
255#else
256 printf("used %7ld (i=%ld,ii=%ld,b=%ld,f=%ld)\n",
257 n, nindir, niindir, nblock, nfrag);
b6407c9d 258 printf("free %7ld (b=%ld,f=%ld)\n", nffree + sblock.fs_frag * nbfree,
b42940ce
KM
259 nbfree, nffree);
260#endif
261 if(!dflg) {
262 n = 0;
955f6ff8 263 for (d = 0; d < sblock.fs_size; d++)
b6407c9d 264 if(!duped(d, sblock.fs_fsize)) {
b42940ce
KM
265 if(mflg)
266 printf("%ld missing\n", d);
267 n++;
268 }
269 printf("missing%5ld\n", n);
270 }
271}
272
273pass1(ip)
955f6ff8 274 register struct dinode *ip;
b42940ce 275{
b6407c9d
KM
276 daddr_t ind1[MAXNINDIR];
277 daddr_t ind2[MAXNINDIR];
07670f7d
KM
278 daddr_t db, ib;
279 register int i, j, k, siz;
b42940ce
KM
280
281 i = ip->di_mode & IFMT;
0947395d 282 if(i == 0)
b42940ce 283 return;
b42940ce
KM
284 switch (i) {
285 case IFCHR:
286 ncfile++;
287 return;
288 case IFBLK:
289 nbfile++;
290 return;
291 case IFDIR:
292 ndfile++;
293 break;
294 case IFREG:
295 nrfile++;
296 break;
ea47352d
KM
297 case IFLNK:
298 nlfile++;
299 break;
b42940ce
KM
300 default:
301 printf("bad mode %u\n", ino);
302 return;
303 }
955f6ff8
KM
304 for (i = 0; i < NDADDR; i++) {
305 db = ip->di_db[i];
306 if (db == 0)
b42940ce 307 continue;
b6407c9d 308 siz = dblksize(&sblock, ip, i);
07670f7d 309 chk(db, "data (block)", siz);
b6407c9d 310 if (siz == sblock.fs_bsize)
07670f7d
KM
311 nblock++;
312 else
b6407c9d 313 nfrag += howmany(siz, sblock.fs_fsize);
b42940ce 314 }
955f6ff8
KM
315 for(i = 0; i < NIADDR; i++) {
316 ib = ip->di_ib[i];
317 if(ib == 0)
318 continue;
b6407c9d 319 if (chk(ib, "1st indirect", sblock.fs_bsize))
b42940ce 320 continue;
b6407c9d 321 bread(fsbtodb(&sblock, ib), (char *)ind1, sblock.fs_bsize);
b42940ce 322 nindir++;
b6407c9d 323 for (j = 0; j < NINDIR(&sblock); j++) {
955f6ff8
KM
324 ib = ind1[j];
325 if (ib == 0)
b42940ce 326 continue;
955f6ff8 327 if (i == 0) {
b6407c9d 328 siz = dblksize(&sblock, ip, NDADDR + j);
07670f7d 329 chk(ib, "data (large)", siz);
b6407c9d 330 if (siz == sblock.fs_bsize)
07670f7d
KM
331 nblock++;
332 else
b6407c9d 333 nfrag += howmany(siz, sblock.fs_fsize);
b42940ce
KM
334 continue;
335 }
b6407c9d 336 if (chk(ib, "2nd indirect", sblock.fs_bsize))
955f6ff8 337 continue;
b6407c9d
KM
338 bread(fsbtodb(&sblock, ib), (char *)ind2,
339 sblock.fs_bsize);
b42940ce 340 niindir++;
b6407c9d 341 for (k = 0; k < NINDIR(&sblock); k++) {
955f6ff8
KM
342 ib = ind2[k];
343 if (ib == 0)
b42940ce 344 continue;
b6407c9d
KM
345 siz = dblksize(&sblock, ip,
346 NDADDR + NINDIR(&sblock) * (i + j) + k);
07670f7d 347 chk(ib, "data (huge)", siz);
b6407c9d 348 if (siz == sblock.fs_bsize)
07670f7d
KM
349 nblock++;
350 else
b6407c9d 351 nfrag += howmany(siz, sblock.fs_fsize);
b42940ce 352 }
b42940ce
KM
353 }
354 }
355}
356
07670f7d 357chk(bno, s, size)
955f6ff8
KM
358 daddr_t bno;
359 char *s;
07670f7d 360 int size;
b42940ce
KM
361{
362 register n, cg;
3352e84a 363 int frags;
b42940ce 364
6994bf5d 365 cg = dtog(&sblock, bno);
07670f7d 366 if (cginit==0 &&
6994bf5d 367 bno<cgdmin(&sblock, cg) || bno >= sblock.fs_frag * sblock.fs_size) {
b42940ce
KM
368 printf("%ld bad; inode=%u, class=%s\n", bno, ino, s);
369 return(1);
370 }
b6407c9d 371 if (size == sblock.fs_bsize) {
07670f7d
KM
372 if (duped(bno, size)) {
373 printf("%ld dup block; inode=%u, class=%s\n",
374 bno, ino, s);
b6407c9d 375 ndup += sblock.fs_frag;
07670f7d
KM
376 }
377 } else {
3352e84a
KM
378 frags = numfrags(&sblock, size);
379 for (n = 0; n < frags; n++) {
b6407c9d 380 if (duped(bno + n, sblock.fs_fsize)) {
07670f7d
KM
381 printf("%ld dup frag; inode=%u, class=%s\n",
382 bno, ino, s);
383 ndup++;
384 }
385 }
b42940ce
KM
386 }
387 for (n=0; blist[n] != -1; n++)
388 if (bno == blist[n])
389 printf("%ld arg; inode=%u, class=%s\n", bno, ino, s);
390 return(0);
391}
392
07670f7d 393duped(bno, size)
955f6ff8 394 daddr_t bno;
07670f7d 395 int size;
b42940ce 396{
b42940ce
KM
397 if(dflg)
398 return(0);
b6407c9d 399 if (size != sblock.fs_fsize && size != sblock.fs_bsize)
07670f7d 400 printf("bad size %d to duped\n", size);
b6407c9d 401 if (size == sblock.fs_fsize) {
955f6ff8
KM
402 if (isset(bmap, bno))
403 return(1);
404 setbit(bmap, bno);
405 return (0);
406 }
b6407c9d 407 if (bno % sblock.fs_frag != 0)
955f6ff8 408 printf("bad bno %d to duped\n", bno);
b6407c9d 409 if (isblock(&sblock, bmap, bno/sblock.fs_frag))
955f6ff8 410 return (1);
b6407c9d 411 setblock(&sblock, bmap, bno/sblock.fs_frag);
b42940ce
KM
412 return(0);
413}
414
19f19804
KM
415makecg()
416{
417 int c, blk;
418 daddr_t dbase, d, dmin, dmax;
419 long i, j, s;
420 register struct csum *cs;
421 register struct dinode *dp;
422
423 sblock.fs_cstotal.cs_nbfree = 0;
424 sblock.fs_cstotal.cs_nffree = 0;
425 sblock.fs_cstotal.cs_nifree = 0;
426 sblock.fs_cstotal.cs_ndir = 0;
19f19804 427 for (c = 0; c < sblock.fs_ncg; c++) {
6994bf5d 428 dbase = cgbase(&sblock, c);
19f19804 429 dmax = dbase + sblock.fs_fpg;
8f99f49c
KM
430 if (dmax > sblock.fs_size) {
431 for ( ; dmax >= sblock.fs_size; dmax--)
2e9860b5 432 clrbit(cgrp.cg_free, dmax - dbase);
8f99f49c
KM
433 dmax++;
434 }
2e9860b5 435 dmin = sblock.fs_dblkno;
b6407c9d 436 cs = &sblock.fs_cs(&sblock, c);
19f19804
KM
437 cgrp.cg_time = time(0);
438 cgrp.cg_magic = CG_MAGIC;
439 cgrp.cg_cgx = c;
440 cgrp.cg_ncyl = sblock.fs_cpg;
441 cgrp.cg_niblk = sblock.fs_ipg;
442 cgrp.cg_ndblk = dmax - dbase;
443 cgrp.cg_cs.cs_ndir = 0;
444 cgrp.cg_cs.cs_nffree = 0;
445 cgrp.cg_cs.cs_nbfree = 0;
446 cgrp.cg_cs.cs_nifree = 0;
447 cgrp.cg_rotor = dmin;
448 cgrp.cg_frotor = dmin;
449 cgrp.cg_irotor = 0;
b6407c9d 450 for (i = 0; i < sblock.fs_frag; i++)
19f19804 451 cgrp.cg_frsum[i] = 0;
6994bf5d 452 bread(fsbtodb(&sblock, cgimin(&sblock, c)), (char *)itab,
19f19804
KM
453 sblock.fs_ipg * sizeof(struct dinode));
454 for (i = 0; i < sblock.fs_ipg; i++) {
bf4c734c
KM
455 cgrp.cg_cs.cs_nifree++;
456 clrbit(cgrp.cg_iused, i);
19f19804 457 dp = &itab[i];
19f19804
KM
458 if ((dp->di_mode & IFMT) != 0) {
459 if ((dp->di_mode & IFMT) == IFDIR)
460 cgrp.cg_cs.cs_ndir++;
bf4c734c 461 cgrp.cg_cs.cs_nifree--;
19f19804
KM
462 setbit(cgrp.cg_iused, i);
463 continue;
464 }
19f19804
KM
465 }
466 while (i < MAXIPG) {
467 clrbit(cgrp.cg_iused, i);
468 i++;
469 }
8e5c1c7c
KM
470 if (c == 0)
471 for (i = 0; i < ROOTINO; i++) {
472 setbit(cgrp.cg_iused, i);
473 cgrp.cg_cs.cs_nifree--;
474 }
43f6367c
KM
475 for (s = 0; s < MAXCPG; s++) {
476 cgrp.cg_btot[s] = 0;
19f19804
KM
477 for (i = 0; i < NRPOS; i++)
478 cgrp.cg_b[s][i] = 0;
43f6367c 479 }
19f19804 480 if (c == 0) {
b6407c9d
KM
481 dmin += howmany(sblock.fs_cssize, sblock.fs_bsize) *
482 sblock.fs_frag;
19f19804
KM
483 }
484 for (d = 0; d < dmin; d++)
485 clrbit(cgrp.cg_free, d);
b6407c9d 486 for (; (d + sblock.fs_frag) <= dmax - dbase; d += sblock.fs_frag) {
19f19804 487 j = 0;
b6407c9d 488 for (i = 0; i < sblock.fs_frag; i++) {
19f19804
KM
489 if (!isset(bmap, dbase+d+i)) {
490 setbit(cgrp.cg_free, d+i);
491 j++;
492 } else
493 clrbit(cgrp.cg_free, d+i);
494 }
b6407c9d 495 if (j == sblock.fs_frag) {
19f19804 496 cgrp.cg_cs.cs_nbfree++;
43f6367c 497 cgrp.cg_btot[cbtocylno(&sblock, d)]++;
aca50d72
KM
498 cgrp.cg_b[cbtocylno(&sblock, d)]
499 [cbtorpos(&sblock, d)]++;
19f19804
KM
500 } else if (j > 0) {
501 cgrp.cg_cs.cs_nffree += j;
502 blk = ((cgrp.cg_free[d / NBBY] >> (d % NBBY)) &
b6407c9d
KM
503 (0xff >> (NBBY - sblock.fs_frag)));
504 fragacct(&sblock, blk, cgrp.cg_frsum, 1);
19f19804
KM
505 }
506 }
507 for (j = d; d < dmax - dbase; d++) {
508 if (!isset(bmap, dbase+d)) {
509 setbit(cgrp.cg_free, d);
510 cgrp.cg_cs.cs_nffree++;
511 } else
512 clrbit(cgrp.cg_free, d);
513 }
514 if (j != d) {
515 blk = ((cgrp.cg_free[j / NBBY] >> (j % NBBY)) &
b6407c9d
KM
516 (0xff >> (NBBY - sblock.fs_frag)));
517 fragacct(&sblock, blk, cgrp.cg_frsum, 1);
19f19804 518 }
b6407c9d 519 for (; d < MAXBPG(&sblock); d++)
19f19804
KM
520 clrbit(cgrp.cg_free, d);
521 sblock.fs_cstotal.cs_nffree += cgrp.cg_cs.cs_nffree;
522 sblock.fs_cstotal.cs_nbfree += cgrp.cg_cs.cs_nbfree;
523 sblock.fs_cstotal.cs_nifree += cgrp.cg_cs.cs_nifree;
524 sblock.fs_cstotal.cs_ndir += cgrp.cg_cs.cs_ndir;
525 *cs = cgrp.cg_cs;
6994bf5d 526 bwrite(fsbtodb(&sblock, cgtod(&sblock, c)), &cgrp,
b6407c9d 527 sblock.fs_cgsize);
19f19804 528 }
b6407c9d
KM
529 for (i = 0; i < howmany(sblock.fs_cssize, sblock.fs_bsize); i++) {
530 bwrite(fsbtodb(&sblock,
531 sblock.fs_csaddr + (i * sblock.fs_frag)),
532 (char *)sblock.fs_csp[i], sblock.fs_bsize);
19f19804
KM
533 }
534 sblock.fs_ronly = 0;
535 sblock.fs_fmod = 0;
c312eebd 536 bwrite(SBLOCK, (char *)&sblock, SBSIZE);
19f19804
KM
537}
538
539/*
540 * update the frsum fields to reflect addition or deletion
541 * of some frags
542 */
b6407c9d
KM
543fragacct(fs, fragmap, fraglist, cnt)
544 struct fs *fs;
19f19804
KM
545 int fragmap;
546 long fraglist[];
547 int cnt;
548{
549 int inblk;
550 register int field, subfield;
551 register int siz, pos;
552
b6407c9d 553 inblk = (int)(fragtbl[fs->fs_frag][fragmap] << 1);
19f19804 554 fragmap <<= 1;
b6407c9d 555 for (siz = 1; siz < fs->fs_frag; siz++) {
156b8f82 556 if ((inblk & (1 << (siz + (fs->fs_frag % NBBY)))) == 0)
19f19804
KM
557 continue;
558 field = around[siz];
559 subfield = inside[siz];
b6407c9d 560 for (pos = siz; pos <= fs->fs_frag; pos++) {
19f19804
KM
561 if ((fragmap & field) == subfield) {
562 fraglist[siz] += cnt;
563 pos += siz;
564 field <<= siz;
565 subfield <<= siz;
566 }
567 field <<= 1;
568 subfield <<= 1;
569 }
570 }
571}
572
b6407c9d
KM
573getsb(fs, file)
574 register struct fs *fs;
575 char *file;
576{
577 int i;
578
c312eebd 579 if (bread(SBLOCK, fs, SBSIZE)) {
b6407c9d
KM
580 printf("bad super block");
581 perror(file);
582 nerror |= 04;
583 return;
584 }
585 if (fs->fs_magic != FS_MAGIC) {
586 printf("%s: bad magic number\n", file);
587 nerror |= 04;
588 return;
589 }
590 for (i = 0; i < howmany(fs->fs_cssize, fs->fs_bsize); i++) {
591 fs->fs_csp[i] = (struct csum *)calloc(1, fs->fs_bsize);
592 bread(fsbtodb(fs, fs->fs_csaddr + (i * fs->fs_frag)),
593 (char *)fs->fs_csp[i], fs->fs_bsize);
594 }
595}
596
19f19804
KM
597bwrite(blk, buf, size)
598 char *buf;
599 daddr_t blk;
600 register size;
601{
b6407c9d 602 if (lseek(fi, blk * DEV_BSIZE, 0) < 0) {
19f19804
KM
603 perror("FS SEEK");
604 return(1);
605 }
606 if (write(fi, buf, size) != size) {
607 perror("FS WRITE");
608 return(1);
609 }
b6407c9d 610 return (0);
19f19804
KM
611}
612
b42940ce 613bread(bno, buf, cnt)
955f6ff8
KM
614 daddr_t bno;
615 char *buf;
b42940ce
KM
616{
617 register i;
618
b6407c9d 619 lseek(fi, bno * DEV_BSIZE, 0);
b42940ce 620 if ((i = read(fi, buf, cnt)) != cnt) {
19f19804
KM
621 if (sflg) {
622 printf("No Update\n");
623 sflg = 0;
624 }
b6407c9d 625 for(i=0; i<sblock.fs_bsize; i++)
b42940ce 626 buf[i] = 0;
b6407c9d
KM
627 return (1);
628 }
629 return (0);
630}
631
632/*
633 * block operations
634 */
635
636isblock(fs, cp, h)
637 struct fs *fs;
638 unsigned char *cp;
639 int h;
640{
641 unsigned char mask;
642
643 switch (fs->fs_frag) {
644 case 8:
645 return (cp[h] == 0xff);
646 case 4:
647 mask = 0x0f << ((h & 0x1) << 2);
648 return ((cp[h >> 1] & mask) == mask);
649 case 2:
650 mask = 0x03 << ((h & 0x3) << 1);
651 return ((cp[h >> 2] & mask) == mask);
652 case 1:
653 mask = 0x01 << (h & 0x7);
654 return ((cp[h >> 3] & mask) == mask);
655 default:
656 fprintf(stderr, "isblock bad fs_frag %d\n", fs->fs_frag);
657 return;
658 }
659}
660
661setblock(fs, cp, h)
662 struct fs *fs;
663 unsigned char *cp;
664 int h;
665{
666 switch (fs->fs_frag) {
667 case 8:
668 cp[h] = 0xff;
669 return;
670 case 4:
671 cp[h >> 1] |= (0x0f << ((h & 0x1) << 2));
672 return;
673 case 2:
674 cp[h >> 2] |= (0x03 << ((h & 0x3) << 1));
675 return;
676 case 1:
677 cp[h >> 3] |= (0x01 << (h & 0x7));
678 return;
679 default:
680 fprintf(stderr, "setblock bad fs_frag %d\n", fs->fs_frag);
681 return;
b42940ce
KM
682 }
683}