static char *sccsid
= "@(#)icheck.c 1.13 (Berkeley) %G%";
#define MAXNINDIR (MAXBSIZE / sizeof (daddr_t))
struct dinode itab
[MAXIPG
];
extern int inside
[], around
[];
extern unsigned char *fragtbl
[];
daddr_t d
, cgd
, cbase
, b
;
fi
= open(file
, sflg
? 2 : 0);
n
= roundup(howmany(sblock
.fs_size
, NBBY
), sizeof(short));
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
+= sblock
.fs_frag
)
chk(d
, "badcg", sblock
.fs_bsize
);
chk(cgd
, "cg", sblock
.fs_bsize
);
for (; cgd
< d
; cgd
+= sblock
.fs_frag
)
chk(cgd
, "inode", sblock
.fs_bsize
);
d
+= howmany(sblock
.fs_cssize
, sblock
.fs_bsize
)
for (; cgd
< d
; cgd
+= sblock
.fs_frag
)
chk(cgd
, "csum", sblock
.fs_bsize
);
for (c
= 0; c
< sblock
.fs_ncg
; c
++) {
bread(fsbtodb(&sblock
, cgimin(c
,&sblock
)), (char *)itab
,
sblock
.fs_ipg
* sizeof (struct dinode
));
for (j
=0; j
< sblock
.fs_ipg
; j
++) {
for (c
= 0; c
< sblock
.fs_ncg
; c
++) {
cbase
= cgbase(c
,&sblock
);
bread(fsbtodb(&sblock
, cgtod(c
,&sblock
)), (char *)&cgrp
,
for (b
= 0; b
< sblock
.fs_fpg
; b
+= sblock
.fs_frag
) {
if (isblock(&sblock
, cgrp
.cg_free
,
chk(cbase
+b
, "block", sblock
.fs_bsize
);
for (d
= 0; d
< sblock
.fs_frag
; d
++)
if (isset(cgrp
.cg_free
, b
+d
)) {
chk(cbase
+b
+d
, "frag", sblock
.fs_fsize
);
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
+ nindir
+ niindir
) * sblock
.fs_frag
+ nfrag
;
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", nffree
+ sblock
.fs_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", nffree
+ sblock
.fs_frag
* nbfree
,
for (d
= 0; d
< sblock
.fs_size
; d
++)
if(!duped(d
, sblock
.fs_fsize
)) {
printf("%ld missing\n", d
);
printf("missing%5ld\n", n
);
register struct dinode
*ip
;
register int i
, j
, k
, siz
;
printf("bad mode %u\n", ino
);
for (i
= 0; i
< NDADDR
; i
++) {
siz
= dblksize(&sblock
, ip
, i
);
chk(db
, "data (block)", siz
);
if (siz
== sblock
.fs_bsize
)
nfrag
+= howmany(siz
, sblock
.fs_fsize
);
for(i
= 0; i
< NIADDR
; i
++) {
if (chk(ib
, "1st indirect", sblock
.fs_bsize
))
bread(fsbtodb(&sblock
, ib
), (char *)ind1
, sblock
.fs_bsize
);
for (j
= 0; j
< NINDIR(&sblock
); j
++) {
siz
= dblksize(&sblock
, ip
, NDADDR
+ j
);
chk(ib
, "data (large)", siz
);
if (siz
== sblock
.fs_bsize
)
nfrag
+= howmany(siz
, sblock
.fs_fsize
);
if (chk(ib
, "2nd indirect", sblock
.fs_bsize
))
bread(fsbtodb(&sblock
, ib
), (char *)ind2
,
for (k
= 0; k
< NINDIR(&sblock
); k
++) {
siz
= dblksize(&sblock
, ip
,
NDADDR
+ NINDIR(&sblock
) * (i
+ j
) + k
);
chk(ib
, "data (huge)", siz
);
if (siz
== sblock
.fs_bsize
)
nfrag
+= howmany(siz
, sblock
.fs_fsize
);
bno
<cgdmin(cg
,&sblock
) || bno
>= sblock
.fs_frag
* sblock
.fs_size
) {
printf("%ld bad; inode=%u, class=%s\n", bno
, ino
, s
);
if (size
== sblock
.fs_bsize
) {
printf("%ld dup block; inode=%u, class=%s\n",
for (n
= 0; n
< size
/ sblock
.fs_fsize
; n
++) {
if (duped(bno
+ n
, sblock
.fs_fsize
)) {
printf("%ld dup frag; inode=%u, class=%s\n",
for (n
=0; blist
[n
] != -1; n
++)
printf("%ld arg; inode=%u, class=%s\n", bno
, ino
, s
);
if (size
!= sblock
.fs_fsize
&& size
!= sblock
.fs_bsize
)
printf("bad size %d to duped\n", size
);
if (size
== sblock
.fs_fsize
) {
if (bno
% sblock
.fs_frag
!= 0)
printf("bad bno %d to duped\n", bno
);
if (isblock(&sblock
, bmap
, bno
/sblock
.fs_frag
))
setblock(&sblock
, bmap
, bno
/sblock
.fs_frag
);
daddr_t dbase
, d
, dmin
, dmax
;
register struct csum
*cs
;
register struct dinode
*dp
;
sblock
.fs_cstotal
.cs_nbfree
= 0;
sblock
.fs_cstotal
.cs_nffree
= 0;
sblock
.fs_cstotal
.cs_nifree
= 0;
sblock
.fs_cstotal
.cs_ndir
= 0;
for (c
= 0; c
< sblock
.fs_ncg
; c
++) {
dbase
= cgbase(c
, &sblock
);
dmax
= dbase
+ sblock
.fs_fpg
;
if (dmax
> sblock
.fs_size
)
dmin
= cgdmin(c
, &sblock
) - dbase
;
cs
= &sblock
.fs_cs(&sblock
, c
);
cgrp
.cg_magic
= CG_MAGIC
;
cgrp
.cg_ncyl
= sblock
.fs_cpg
;
cgrp
.cg_niblk
= sblock
.fs_ipg
;
cgrp
.cg_ndblk
= dmax
- dbase
;
cgrp
.cg_cs
.cs_nffree
= 0;
cgrp
.cg_cs
.cs_nbfree
= 0;
cgrp
.cg_cs
.cs_nifree
= 0;
for (i
= 0; i
< sblock
.fs_frag
; i
++)
bread(fsbtodb(&sblock
, cgimin(c
, &sblock
)), (char *)itab
,
sblock
.fs_ipg
* sizeof(struct dinode
));
for (i
= 0; i
< sblock
.fs_ipg
; i
++) {
if ((dp
->di_mode
& IFMT
) != 0) {
if ((dp
->di_mode
& IFMT
) == IFDIR
)
setbit(cgrp
.cg_iused
, i
);
clrbit(cgrp
.cg_iused
, i
);
clrbit(cgrp
.cg_iused
, i
);
for (i
= 0; i
< ROOTINO
; i
++) {
setbit(cgrp
.cg_iused
, i
);
for (s
= 0; s
< MAXCPG
; s
++)
for (i
= 0; i
< NRPOS
; i
++)
dmin
+= howmany(sblock
.fs_cssize
, sblock
.fs_bsize
) *
for (d
= 0; d
< dmin
; d
++)
for (; (d
+ sblock
.fs_frag
) <= dmax
- dbase
; d
+= sblock
.fs_frag
) {
for (i
= 0; i
< sblock
.fs_frag
; i
++) {
if (!isset(bmap
, dbase
+d
+i
)) {
setbit(cgrp
.cg_free
, d
+i
);
clrbit(cgrp
.cg_free
, d
+i
);
if (j
== sblock
.fs_frag
) {
cgrp
.cg_b
[cbtocylno(&sblock
, d
)]
[cbtorpos(&sblock
, d
)]++;
cgrp
.cg_cs
.cs_nffree
+= j
;
blk
= ((cgrp
.cg_free
[d
/ NBBY
] >> (d
% NBBY
)) &
(0xff >> (NBBY
- sblock
.fs_frag
)));
fragacct(&sblock
, blk
, cgrp
.cg_frsum
, 1);
for (j
= d
; d
< dmax
- dbase
; d
++) {
if (!isset(bmap
, dbase
+d
)) {
blk
= ((cgrp
.cg_free
[j
/ NBBY
] >> (j
% NBBY
)) &
(0xff >> (NBBY
- sblock
.fs_frag
)));
fragacct(&sblock
, blk
, cgrp
.cg_frsum
, 1);
for (; d
< MAXBPG(&sblock
); d
++)
sblock
.fs_cstotal
.cs_nffree
+= cgrp
.cg_cs
.cs_nffree
;
sblock
.fs_cstotal
.cs_nbfree
+= cgrp
.cg_cs
.cs_nbfree
;
sblock
.fs_cstotal
.cs_nifree
+= cgrp
.cg_cs
.cs_nifree
;
sblock
.fs_cstotal
.cs_ndir
+= cgrp
.cg_cs
.cs_ndir
;
bwrite(fsbtodb(&sblock
, cgtod(c
, &sblock
)), &cgrp
,
for (i
= 0; i
< howmany(sblock
.fs_cssize
, sblock
.fs_bsize
); i
++) {
sblock
.fs_csaddr
+ (i
* sblock
.fs_frag
)),
(char *)sblock
.fs_csp
[i
], sblock
.fs_bsize
);
bwrite(SBLOCK
, (char *)&sblock
, SBSIZE
);
* update the frsum fields to reflect addition or deletion
fragacct(fs
, fragmap
, fraglist
, cnt
)
register int field
, subfield
;
inblk
= (int)(fragtbl
[fs
->fs_frag
][fragmap
] << 1);
for (siz
= 1; siz
< fs
->fs_frag
; siz
++) {
if (((1 << siz
) & inblk
) == 0)
for (pos
= siz
; pos
<= fs
->fs_frag
; pos
++) {
if ((fragmap
& field
) == subfield
) {
if (bread(SBLOCK
, fs
, SBSIZE
)) {
printf("bad super block");
if (fs
->fs_magic
!= FS_MAGIC
) {
printf("%s: bad magic number\n", file
);
for (i
= 0; i
< howmany(fs
->fs_cssize
, fs
->fs_bsize
); i
++) {
fs
->fs_csp
[i
] = (struct csum
*)calloc(1, fs
->fs_bsize
);
bread(fsbtodb(fs
, fs
->fs_csaddr
+ (i
* fs
->fs_frag
)),
(char *)fs
->fs_csp
[i
], fs
->fs_bsize
);
if (lseek(fi
, blk
* DEV_BSIZE
, 0) < 0) {
if (write(fi
, buf
, size
) != size
) {
lseek(fi
, bno
* DEV_BSIZE
, 0);
if ((i
= read(fi
, buf
, cnt
)) != cnt
) {
for(i
=0; i
<sblock
.fs_bsize
; i
++)
mask
= 0x0f << ((h
& 0x1) << 2);
return ((cp
[h
>> 1] & mask
) == mask
);
mask
= 0x03 << ((h
& 0x3) << 1);
return ((cp
[h
>> 2] & mask
) == mask
);
mask
= 0x01 << (h
& 0x7);
return ((cp
[h
>> 3] & mask
) == mask
);
fprintf(stderr
, "isblock bad fs_frag %d\n", fs
->fs_frag
);
cp
[h
>> 1] |= (0x0f << ((h
& 0x1) << 2));
cp
[h
>> 2] |= (0x03 << ((h
& 0x3) << 1));
cp
[h
>> 3] |= (0x01 << (h
& 0x7));
fprintf(stderr
, "setblock bad fs_frag %d\n", fs
->fs_frag
);