* Copyright (c) 1980 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
static char sccsid
[] = "@(#)icheck.c 5.4 (Berkeley) %G%";
#define MAXNINDIR (MAXBSIZE / sizeof (daddr_t))
struct dinode itab
[MAXBSIZE
/ sizeof(struct dinode
)];
daddr_t d
, cgd
, cbase
, b
;
for (n
=0; blist
[n
] != -1; n
++)
fsblist
[n
] = dbtofsb(&sblock
, blist
[n
]);
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
++) {
d
= cgsblock(&sblock
, c
);
(void)sprintf(buf
, "spare super block %d", c
);
for (; d
< cgd
; d
+= sblock
.fs_frag
)
chk(d
, buf
, sblock
.fs_bsize
);
(void)sprintf(buf
, "cylinder group %d", c
);
chk(cgd
, buf
, sblock
.fs_bsize
);
for (; cgd
< d
; cgd
+= sblock
.fs_frag
) {
(void)sprintf(buf
, "inodes %d-%d", ino
, ino
+ i
);
chk(cgd
, buf
, sblock
.fs_bsize
);
d
+= howmany(sblock
.fs_cssize
, sblock
.fs_fsize
);
chk(cgd
, "csum", sblock
.fs_fsize
);
for (c
= 0; c
< sblock
.fs_ncg
; c
++) {
i
< sblock
.fs_ipg
/ INOPF(&sblock
);
bread(fsbtodb(&sblock
, cgimin(&sblock
, c
) + i
),
(char *)itab
, sblock
.fs_bsize
);
for (j
= 0; j
< INOPB(&sblock
); j
++) {
for (c
= 0; c
< sblock
.fs_ncg
; c
++) {
cbase
= cgbase(&sblock
, c
);
bread(fsbtodb(&sblock
, cgtod(&sblock
, c
)), (char *)&cgrp
,
printf("cg %d: bad magic number\n", c
);
for (b
= 0; b
< sblock
.fs_fpg
; b
+= sblock
.fs_frag
) {
if (isblock(&sblock
, cg_blksfree(&cgrp
),
chk(cbase
+b
, "free block", sblock
.fs_bsize
);
for (d
= 0; d
< sblock
.fs_frag
; d
++)
if (isset(cg_blksfree(&cgrp
), b
+d
)) {
chk(cbase
+b
+d
, "free frag", sblock
.fs_fsize
);
i
= nrfile
+ ndfile
+ ncfile
+ nbfile
+ nlfile
+ nsfile
;
printf("files %6u (r=%u,d=%u,b=%u,c=%u,sl=%u,sock=%u)\n",
i
, nrfile
, ndfile
, nbfile
, ncfile
, nlfile
, nsfile
);
printf("files %u (r=%u,d=%u,b=%u,c=%u,sl=%u,sock=%u)\n",
i
, nrfile
, ndfile
, nbfile
, ncfile
, nlfile
, nsfile
);
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
);
(void)sprintf(buf
, "logical data block %d", i
);
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
, lbn
);
(void)sprintf(buf
, "logical data block %d", lbn
);
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
++) {
lbn
= NDADDR
+ NINDIR(&sblock
) * (i
+ j
) + k
;
siz
= dblksize(&sblock
, ip
, lbn
);
(void)sprintf(buf
, "logical data block %d", lbn
);
if (siz
== sblock
.fs_bsize
)
nfrag
+= howmany(siz
, sblock
.fs_fsize
);
if (cginit
== 0 && bno
>= sblock
.fs_frag
* sblock
.fs_size
) {
printf("%ld bad; inode=%u, class=%s\n", bno
, ino
, s
);
frags
= numfrags(&sblock
, size
);
if (frags
== sblock
.fs_frag
) {
printf("%ld dup block; inode=%u, class=%s\n",
for (n
= 0; n
< frags
; n
++) {
if (duped(bno
+ n
, sblock
.fs_fsize
)) {
printf("%ld dup frag; inode=%u, class=%s\n",
for (n
=0; blist
[n
] != -1; n
++)
if (fsblist
[n
] >= bno
&& fsblist
[n
] < bno
+ frags
)
printf("%ld arg; frag %d of %d, inode=%u, class=%s\n",
blist
[n
], fsblist
[n
] - bno
, frags
, 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
);
if (bread(SBOFF
, fs
, SBSIZE
)) {
printf("bad super block");
if (fs
->fs_magic
!= FS_MAGIC
) {
printf("%s: bad magic number\n", file
);
dev_bsize
= fs
->fs_fsize
/ fsbtodb(fs
, 1);
for (i
= 0, j
= 0; i
< sblock
.fs_cssize
; i
+= sblock
.fs_bsize
, j
++) {
size
= sblock
.fs_cssize
- i
< sblock
.fs_bsize
?
sblock
.fs_cssize
- i
: sblock
.fs_bsize
;
sblock
.fs_csp
[j
] = (struct csum
*)calloc(1, size
);
bread(fsbtodb(fs
, fs
->fs_csaddr
+ (j
* fs
->fs_frag
)),
(char *)fs
->fs_csp
[j
], size
);
lseek(fi
, bno
* dev_bsize
, 0);
if ((i
= read(fi
, buf
, cnt
)) != cnt
) {
for(i
=0; i
<sblock
.fs_bsize
; i
++)
* check if a block is available
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
);
printf("isblock bad fs_frag %d\n", fs
->fs_frag
);
fprintf(stderr
, "isblock bad fs_frag %d\n", fs
->fs_frag
);
* put a block into the map
cp
[h
>> 1] |= (0x0f << ((h
& 0x1) << 2));
cp
[h
>> 2] |= (0x03 << ((h
& 0x3) << 1));
cp
[h
>> 3] |= (0x01 << (h
& 0x7));
printf("setblock bad fs_frag %d\n", fs
->fs_frag
);
fprintf(stderr
, "setblock bad fs_frag %d\n", fs
->fs_frag
);