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.
17 #include <sys/types.h>
26 struct block_walk_struct {
27 struct block_info *barray;
28 e2_blkcnt_t blocks_left;
29 e2_blkcnt_t num_blocks;
33 static int icheck_proc(ext2_filsys fs EXT2FS_ATTR((unused)),
35 e2_blkcnt_t blockcnt EXT2FS_ATTR((unused)),
36 blk_t ref_block EXT2FS_ATTR((unused)),
37 int ref_offset EXT2FS_ATTR((unused)),
40 struct block_walk_struct *bw = (struct block_walk_struct *) private;
43 for (i=0; i < bw->num_blocks; i++) {
44 if (!bw->barray[i].ino && bw->barray[i].blk == *block_nr) {
45 bw->barray[i].ino = bw->inode;
55 void do_icheck(int argc, char **argv)
57 struct block_walk_struct bw;
58 struct block_info *binfo;
60 ext2_inode_scan scan = 0;
62 struct ext2_inode inode;
67 com_err(argv[0], 0, "Usage: icheck <block number> ...");
70 if (check_fs_open(argv[0]))
73 bw.barray = malloc(sizeof(struct block_info) * argc);
75 com_err("icheck", ENOMEM,
76 "while allocating inode info array");
79 memset(bw.barray, 0, sizeof(struct block_info) * argc);
81 block_buf = malloc(current_fs->blocksize * 3);
83 com_err("icheck", ENOMEM, "while allocating block buffer");
87 for (i=1; i < argc; i++) {
88 if (strtoblk(argv[0], argv[i], &bw.barray[i-1].blk))
92 bw.num_blocks = bw.blocks_left = argc-1;
94 retval = ext2fs_open_inode_scan(current_fs, 0, &scan);
96 com_err("icheck", retval, "while opening inode scan");
101 retval = ext2fs_get_next_inode(scan, &ino, &inode);
102 } while (retval == EXT2_ET_BAD_BLOCK_IN_INODE_TABLE);
104 com_err("icheck", retval, "while starting inode scan");
109 if (!inode.i_links_count)
114 if (inode.i_file_acl) {
115 icheck_proc(current_fs, &inode.i_file_acl, 0,
117 if (bw.blocks_left == 0)
121 if (!ext2fs_inode_has_valid_blocks(&inode))
124 * To handle filesystems touched by 0.3c extfs; can be
130 retval = ext2fs_block_iterate2(current_fs, ino, 0, block_buf,
133 com_err("icheck", retval,
134 "while calling ext2fs_block_iterate");
138 if (bw.blocks_left == 0)
143 retval = ext2fs_get_next_inode(scan, &ino, &inode);
144 } while (retval == EXT2_ET_BAD_BLOCK_IN_INODE_TABLE);
146 com_err("icheck", retval,
147 "while doing inode scan");
152 printf("Block\tInode number\n");
153 for (i=0, binfo = bw.barray; i < bw.num_blocks; i++, binfo++) {
154 if (binfo->ino == 0) {
155 printf("%u\t<block not found>\n", binfo->blk);
158 printf("%u\t%u\n", binfo->blk, binfo->ino);
166 ext2fs_close_inode_scan(scan);