2 * icheck.c --- given a list of blocks, generate a list of inodes
4 * Copyright (C) 1994 Theodore Ts'o. This file may be redistributed
5 * under the terms of the GNU Public License.
18 #include <sys/types.h>
27 struct block_walk_struct
{
28 struct block_info
*barray
;
29 e2_blkcnt_t blocks_left
;
30 e2_blkcnt_t num_blocks
;
34 static int icheck_proc(ext2_filsys fs
EXT2FS_ATTR((unused
)),
36 e2_blkcnt_t blockcnt
EXT2FS_ATTR((unused
)),
37 blk64_t ref_block
EXT2FS_ATTR((unused
)),
38 int ref_offset
EXT2FS_ATTR((unused
)),
41 struct block_walk_struct
*bw
= (struct block_walk_struct
*) private;
44 for (i
=0; i
< bw
->num_blocks
; i
++) {
45 if (!bw
->barray
[i
].ino
&& bw
->barray
[i
].blk
== *block_nr
) {
46 bw
->barray
[i
].ino
= bw
->inode
;
56 void do_icheck(int argc
, char **argv
, int sci_idx
EXT2FS_ATTR((unused
)),
57 void *infop
EXT2FS_ATTR((unused
)))
59 struct block_walk_struct bw
;
60 struct block_info
*binfo
;
62 ext2_inode_scan scan
= 0;
64 struct ext2_inode inode
;
69 com_err(argv
[0], 0, "Usage: icheck <block number> ...");
72 if (check_fs_open(argv
[0]))
75 bw
.barray
= malloc(sizeof(struct block_info
) * argc
);
77 com_err("icheck", ENOMEM
,
78 "while allocating inode info array");
81 memset(bw
.barray
, 0, sizeof(struct block_info
) * argc
);
83 block_buf
= malloc(current_fs
->blocksize
* 3);
85 com_err("icheck", ENOMEM
, "while allocating block buffer");
89 for (i
=1; i
< argc
; i
++) {
90 if (strtoblk(argv
[0], argv
[i
], NULL
, &bw
.barray
[i
-1].blk
))
94 bw
.num_blocks
= bw
.blocks_left
= argc
-1;
96 retval
= ext2fs_open_inode_scan(current_fs
, 0, &scan
);
98 com_err("icheck", retval
, "while opening inode scan");
103 retval
= ext2fs_get_next_inode(scan
, &ino
, &inode
);
104 } while (retval
== EXT2_ET_BAD_BLOCK_IN_INODE_TABLE
);
106 com_err("icheck", retval
, "while starting inode scan");
113 if (!inode
.i_links_count
)
118 blk
= ext2fs_file_acl_block(current_fs
, &inode
);
120 icheck_proc(current_fs
, &blk
, 0,
122 if (bw
.blocks_left
== 0)
124 ext2fs_file_acl_block_set(current_fs
, &inode
, blk
);
127 if (!ext2fs_inode_has_valid_blocks2(current_fs
, &inode
))
130 * To handle filesystems touched by 0.3c extfs; can be
136 retval
= ext2fs_block_iterate3(current_fs
, ino
,
137 BLOCK_FLAG_READ_ONLY
, block_buf
,
140 com_err("icheck", retval
,
141 "while calling ext2fs_block_iterate");
145 if (bw
.blocks_left
== 0)
150 retval
= ext2fs_get_next_inode(scan
, &ino
, &inode
);
151 } while (retval
== EXT2_ET_BAD_BLOCK_IN_INODE_TABLE
);
153 com_err("icheck", retval
,
154 "while doing inode scan");
159 printf("Block\tInode number\n");
160 for (i
=0, binfo
= bw
.barray
; i
< bw
.num_blocks
; i
++, binfo
++) {
161 if (binfo
->ino
== 0) {
162 printf("%llu\t<block not found>\n", binfo
->blk
);
165 printf("%llu\t%u\n", binfo
->blk
, binfo
->ino
);
172 ext2fs_close_inode_scan(scan
);