static char *sccsid
= "@(#)icheck.c 1.1 (Berkeley) %G%";
#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)))
struct dinode itab
[MAXIPG
];
daddr_t iaddr
[NDADDR
+NIADDR
];
daddr_t d
, cgd
, cbase
, b
;
fi
= open(file
, sflg
?2:0);
printf("cannot open %s\n", file
);
bread(SBLOCK
, (char *)&sblock
, BSIZE
);
if (sblock
.fs_magic
!= FS_MAGIC
) {
printf("%s: bad magic number\n", file
);
(struct csum
*)calloc(howmany(cssize(&sblock
), BSIZE
), BSIZE
);
lseek(fi
, csaddr(&sblock
)*FSIZE
, 0);
read(fi
, (char *)sblock
.fs_cs
, cssize(&sblock
));
n
= (sblock
.fs_size
*FRAG
+ BITS
-1) / BITS
;
bmap
= malloc((unsigned)n
);
printf("Not enough core; duplicates unchecked\n");
for (i
=0; i
<(unsigned)n
; i
++)
for (c
=0; c
< sblock
.fs_ncg
; c
++) {
for (d
= cgbase(c
, &sblock
); d
< cgd
; d
++)
d
+= howmany(cssize(&sblock
), BSIZE
) * FRAG
;
for (c
= 0; c
< sblock
.fs_ncg
; c
++) {
bread(cgimin(c
,&sblock
), (char *)itab
,
sblock
.fs_ipg
* sizeof (struct dinode
));
for (j
=0; j
< sblock
.fs_ipg
; j
++) {
bread(SBLOCK
, (char *)&sblock
, sizeof(sblock
));
for (c
= 0; c
< sblock
.fs_ncg
; c
++) {
cbase
= cgbase(c
,&sblock
);
bread(cgtod(c
,&sblock
), (char *)&cgrp
, sblock
.fs_cgsize
);
for (b
= 0; b
< sblock
.fs_fpg
; b
+= FRAG
) {
if (isblock(cgrp
.cg_free
, b
/ FRAG
)) {
for (d
= 0; d
< FRAG
; d
++)
for (d
= 0; d
< FRAG
; d
++)
if (isset(cgrp
.cg_free
, b
+d
)) {
i
= nrfile
+ ndfile
+ ncfile
+ nbfile
+ nmcfile
;
printf("files %6u (r=%u,d=%u,b=%u,c=%u,mc=%u)\n",
i
, nrfile
, ndfile
, nbfile
, ncfile
, nmcfile
);
printf("files %u (r=%u,d=%u,b=%u,c=%u,mc=%u)\n",
i
, nrfile
, ndfile
, nbfile
, ncfile
, nmcfile
);
n
= (nblock
+ niindir
) * FRAG
+ szfrag
+ szindir
;
printf("used %ld (i=%ld,ii=%ld,b=%ld,f=%ld)\n",
n
, nindir
, niindir
, nblock
, nfrag
);
printf("free %ld (b=%ld,f=%ld)\n", szffree
+ FRAG
* nbfree
,
printf("used %7ld (i=%ld,ii=%ld,b=%ld,f=%ld)\n",
n
, nindir
, niindir
, nblock
, nfrag
);
printf("free %7ld (b=%ld,f=%ld)\n", szffree
+ FRAG
* nbfree
,
for(d
=0; d
<sblock
.fs_size
; d
++)
printf("%ld missing\n", d
);
printf("missing%5ld\n", n
);
register struct dinode
*ip
;
int k
, l
, sz
, ni
, nib
, ndb
;
printf("bad mode %u\n", ino
);
l3tol(iaddr
, ip
->di_addr
, NDADDR
+NIADDR
);
ndb
= howmany(ip
->di_size
, BSIZE
)-1;
for(i
=0; i
<NDADDR
; i
++) {
if (i
==ndb
&& (ip
->di_size
&BMASK
)) {
sz
= howmany(ip
->di_size
- i
* BSIZE
, FSIZE
);
chk(iaddr
[i
]+l
, "data (frag)");
for (l
= 0; l
< FRAG
; l
++)
chk(iaddr
[i
]+l
, "data (block)");
for(i
=NDADDR
; i
<NDADDR
+NIADDR
;i
++) {
sz
= howmany((ip
->di_size
-NDADDR
*BSIZE
),
for (j
= 0; j
< FRAG
; j
++)
if (chk(iaddr
[i
]+j
, "1st indirect"))
bread(iaddr
[i
], (char *)ind1
, sz
*FSIZE
);
nib
= sz
* (NINDIR
/FRAG
);
for (l
= 0; l
< FRAG
; l
++)
chk(ind1
[j
]+l
, "data (large)");
for (l
= 0; l
< FRAG
; l
++)
if(chk(ind1
[j
], "2nd indirect"))
bread(ind1
[j
], (char *)ind2
, BSIZE
);
for(k
=0; k
<NINDIR
; k
++) {
for (l
= 0; l
< FRAG
; l
++)
chk(ind1
[j
]+l
, "data (huge)");
if (cginit
==0 && bno
<cgdmin(cg
,&sblock
) || bno
>=FRAG
*sblock
.fs_size
) {
printf("%ld bad; inode=%u, class=%s\n", bno
, ino
, s
);
printf("%ld dup; inode=%u, class=%s\n", bno
, ino
, s
);
for (n
=0; blist
[n
] != -1; n
++)
printf("%ld arg; inode=%u, class=%s\n", bno
, ino
, s
);
if ((i
= read(fi
, buf
, cnt
)) != cnt
) {
if (write(fi
, buf
, cnt
) != cnt
)
printf("write error %d\n", tell(fi
)/BSIZE
);
daddr_t dbase
, d
, dmin
, dmax
;
register struct csum
*cs
;
for (c
= 0; c
< sblock
.fs_ncg
; c
++) {
bread(cgimin(c
,&sblock
), (char *)itab
,
sblock
.fs_ipg
* sizeof (struct dinode
));
dbase
= cgbase(c
, &sblock
);
dmax
= dbase
+ sblock
.fs_fpg
;
if (dmax
> sblock
.fs_size
)
cgrp
.cg_magic
= CG_MAGIC
;
cgrp
.cg_ncyl
= sblock
.fs_cpg
;
cgrp
.cg_niblk
= sblock
.fs_ipg
;
cgrp
.cg_ndblk
= dmax
- dbase
;
for (i
= 0; i
< sblock
.fs_ipg
; i
++)
switch (itab
[i
].di_mode
&IFMT
) {
clrbit(cgrp
.cg_iused
, i
);
setbit(cgrp
.cg_iused
, i
);
clrbit(cgrp
.cg_iused
, i
);
for (s
= 0; s
< MAXCPG
; s
++)
for (i
= 0; i
< NRPOS
; i
++)
dmin
= cgdmin(c
, &sblock
) - dbase
;
dmin
+= howmany(cssize(&sblock
), BSIZE
) * FRAG
;
for (d
= 0; d
< dmin
; d
++)
#define getbmap(i) isset(bmap, i)
for (; (d
+ FRAG
) <= dmax
- dbase
; d
+= FRAG
) {
for (i
= 0; i
< FRAG
; i
++) {
if (!getbmap(dbase
+d
+i
)) {
setbit(cgrp
.cg_free
, d
+i
);
clrbit(cgrp
.cg_free
, d
+i
);
cgrp
.cg_b
[s
/sblock
.fs_spc
]
[s
%sblock
.fs_nsect
*NRPOS
/sblock
.fs_nsect
]++;
for (; d
< dmax
- dbase
; 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
);
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
);