static char *sccsid = "@(#)icheck.c 1.1 (Berkeley) 08/26/81"; /* * icheck */ #define NB 500 #define BITS 8 #define MAXFN 500 #ifndef STANDALONE #include #endif #include "../h/param.h" #include "../h/inode.h" #include "../h/ino.h" #include "../h/fs.h" #define setbit(a, i) ((a)[(i)/NBBY] |= 1<<((i)%NBBY)) #define clrbit(a, i) ((a)[(i)/NBBY] &= ~(1<<((i)%NBBY))) #define isset(a,i) ((a)[(i)/NBBY] & (1<<((i)%NBBY))) union { struct fs sb; char pad[BSIZE]; } sbun; #define sblock sbun.sb union { struct cg cg; char pad[BSIZE]; } cgun; #define cgrp cgun.cg struct dinode itab[MAXIPG]; daddr_t iaddr[NDADDR+NIADDR]; daddr_t blist[NB]; char *bmap; int sflg; int mflg; int dflg; int fi; ino_t ino; int cginit; ino_t nrfile; ino_t ndfile; ino_t nbfile; ino_t ncfile; ino_t nmcfile; daddr_t nblock; daddr_t nfrag; long szfrag; daddr_t nindir; long szindir; daddr_t niindir; daddr_t nffree; long szffree; daddr_t nbfree; daddr_t ndup; int nerror; long atol(); daddr_t alloc(); #ifndef STANDALONE char *malloc(); #endif main(argc, argv) char *argv[]; { register i; long n; blist[0] = -1; #ifndef STANDALONE while (--argc) { argv++; if (**argv=='-') switch ((*argv)[1]) { case 'd': dflg++; continue; case 'm': mflg++; continue; case 's': sflg++; continue; case 'b': for(i=0; idi_mode & IFMT; if(i == 0) { sblock.fs_nifree++; return; } switch (i) { case IFCHR: ncfile++; return; case IFBLK: nbfile++; return; case IFDIR: ndfile++; break; case IFREG: nrfile++; break; default: printf("bad mode %u\n", ino); return; } l3tol(iaddr, ip->di_addr, NDADDR+NIADDR); ndb = howmany(ip->di_size, BSIZE)-1; for(i=0; idi_size&BMASK)) { sz = howmany(ip->di_size - i * BSIZE, FSIZE); for (l = 0; l < sz; l++) chk(iaddr[i]+l, "data (frag)"); szfrag += sz; nfrag++; } else { for (l = 0; l < FRAG; l++) chk(iaddr[i]+l, "data (block)"); nblock++; } } for(i=NDADDR; idi_size-NDADDR*BSIZE), (NINDIR/FRAG) * BSIZE); if (sz > FRAG) sz = FRAG; } else sz = FRAG; for (j = 0; j < FRAG; j++) if (chk(iaddr[i]+j, "1st indirect")) continue; bread(iaddr[i], (char *)ind1, sz*FSIZE); nib = sz * (NINDIR/FRAG); for(j=0; j=FRAG*sblock.fs_size) { printf("%ld bad; inode=%u, class=%s\n", bno, ino, s); return(1); } if (duped(bno)) { printf("%ld dup; inode=%u, class=%s\n", bno, ino, s); ndup++; } for (n=0; blist[n] != -1; n++) if (bno == blist[n]) printf("%ld arg; inode=%u, class=%s\n", bno, ino, s); return(0); } duped(bno) daddr_t bno; { daddr_t d; register m, n; if(dflg) return(0); m = 1 << (bno%BITS); n = (bno/BITS); if(bmap[n] & m) return(1); bmap[n] |= m; return(0); } bread(bno, buf, cnt) daddr_t bno; char *buf; { register i; lseek(fi, bno*FSIZE, 0); if ((i = read(fi, buf, cnt)) != cnt) { if (sflg) { printf("No update\n"); sflg = 0; } for(i=0; i sblock.fs_size) dmax = sblock.fs_size; cs = &sblock.fs_cs[c]; cgrp.cg_time = time(0); cgrp.cg_magic = CG_MAGIC; cgrp.cg_cgx = c; cgrp.cg_ncyl = sblock.fs_cpg; cgrp.cg_niblk = sblock.fs_ipg; cgrp.cg_ndblk = dmax - dbase; cgrp.cg_ndir = 0; cgrp.cg_nffree = 0; cgrp.cg_nbfree = 0; cgrp.cg_nifree = 0; for (i = 0; i < sblock.fs_ipg; i++) switch (itab[i].di_mode&IFMT) { case 0: cgrp.cg_nifree++; clrbit(cgrp.cg_iused, i); continue; case IFDIR: cgrp.cg_ndir++; /* fall into ... */ default: setbit(cgrp.cg_iused, i); continue; } while (i < MAXIPG) { clrbit(cgrp.cg_iused, i); i++; } for (s = 0; s < MAXCPG; s++) for (i = 0; i < NRPOS; i++) cgrp.cg_b[s][i] = 0; dmin = cgdmin(c, &sblock) - dbase; if (c == 0) dmin += howmany(cssize(&sblock), BSIZE) * FRAG; for (d = 0; d < dmin; d++) clrbit(cgrp.cg_free, d); #define getbmap(i) isset(bmap, i) for (; (d + FRAG) <= dmax - dbase; d += FRAG) { j = 0; for (i = 0; i < FRAG; i++) { if (!getbmap(dbase+d+i)) { setbit(cgrp.cg_free, d+i); j++; } else clrbit(cgrp.cg_free, d+i); } if (j == FRAG) { cgrp.cg_nbfree++; s = d * NSPF; cgrp.cg_b[s/sblock.fs_spc] [s%sblock.fs_nsect*NRPOS/sblock.fs_nsect]++; } else cgrp.cg_nffree += j; } for (; d < dmax - dbase; d++) { if (!getbmap(dbase+d)) { setbit(cgrp.cg_free, d); cgrp.cg_nffree++; } else clrbit(cgrp.cg_free, d); } for (; d < MAXBPG; d++) clrbit(cgrp.cg_free, d); sblock.fs_nffree += cgrp.cg_nffree; sblock.fs_nbfree += cgrp.cg_nbfree; cs->cs_ndir = cgrp.cg_ndir; cs->cs_nifree = cgrp.cg_nifree; cs->cs_nbfree = cgrp.cg_nbfree; bwrite(cgtod(c, &sblock), (char *)&cgrp, sblock.fs_cgsize); } sblock.fs_ronly = 0; sblock.fs_fmod = 0; bwrite(SBLOCK, (char *)&sblock, sizeof (sblock)); lseek(fi, csaddr(&sblock)*FSIZE, 0); if (write(fi,(char *)sblock.fs_cs,cssize(&sblock)) != cssize(&sblock)) printf("write error %d\n", tell(fi)/BSIZE); }