diff options
Diffstat (limited to 'fs/ext2/ext2fs.c')
-rw-r--r-- | fs/ext2/ext2fs.c | 53 |
1 files changed, 32 insertions, 21 deletions
diff --git a/fs/ext2/ext2fs.c b/fs/ext2/ext2fs.c index 436f4a4..d54f60b 100644 --- a/fs/ext2/ext2fs.c +++ b/fs/ext2/ext2fs.c @@ -110,7 +110,7 @@ struct ext2_block_group { uint32_t inode_table_id; uint16_t free_blocks; uint16_t free_inodes; - uint16_t pad; + uint16_t used_dir_cnt; uint32_t reserved[3]; }; @@ -182,14 +182,22 @@ int indir2_blkno = -1; static int ext2fs_blockgroup (struct ext2_data *data, int group, struct ext2_block_group *blkgrp) { + unsigned int blkno; + unsigned int blkoff; + unsigned int desc_per_blk; + + desc_per_blk = EXT2_BLOCK_SIZE(data) / sizeof(struct ext2_block_group); + + blkno = __le32_to_cpu(data->sblock.first_data_block) + 1 + + group / desc_per_blk; + blkoff = (group % desc_per_blk) * sizeof(struct ext2_block_group); #ifdef DEBUG - printf ("ext2fs read blockgroup\n"); + printf ("ext2fs read %d group descriptor (blkno %d blkoff %d)\n", + group, blkno, blkoff); #endif - return (ext2fs_devread - (((__le32_to_cpu (data->sblock.first_data_block) + - 1) << LOG2_EXT2_BLOCK_SIZE (data)), - group * sizeof (struct ext2_block_group), - sizeof (struct ext2_block_group), (char *) blkgrp)); + return (ext2fs_devread (blkno << LOG2_EXT2_BLOCK_SIZE(data), + blkoff, sizeof(struct ext2_block_group), (char *)blkgrp)); + } @@ -203,34 +211,37 @@ static int ext2fs_read_inode unsigned int blkno; unsigned int blkoff; - /* It is easier to calculate if the first inode is 0. */ - ino--; #ifdef DEBUG printf ("ext2fs read inode %d\n", ino); #endif - status = ext2fs_blockgroup (data, - ino / - __le32_to_cpu (sblock->inodes_per_group), - &blkgrp); + /* It is easier to calculate if the first inode is 0. */ + ino--; + status = ext2fs_blockgroup (data, ino / __le32_to_cpu + (sblock->inodes_per_group), &blkgrp); if (status == 0) { return (0); } - inodes_per_block = EXT2_BLOCK_SIZE (data) / 128; - blkno = (ino % __le32_to_cpu (sblock->inodes_per_group)) / - inodes_per_block; - blkoff = (ino % __le32_to_cpu (sblock->inodes_per_group)) % - inodes_per_block; + + inodes_per_block = EXT2_BLOCK_SIZE(data) / __le16_to_cpu(sblock->inode_size); + +#ifdef DEBUG + printf ("ext2fs read inode blkno %d blkoff %d\n", blkno, blkoff); +#endif + + blkno = __le32_to_cpu (blkgrp.inode_table_id) + + (ino % __le32_to_cpu (sblock->inodes_per_group)) + / inodes_per_block; + blkoff = (ino % inodes_per_block) * __le16_to_cpu (sblock->inode_size); #ifdef DEBUG printf ("ext2fs read inode blkno %d blkoff %d\n", blkno, blkoff); #endif /* Read the inode. */ - status = ext2fs_devread (((__le32_to_cpu (blkgrp.inode_table_id) + - blkno) << LOG2_EXT2_BLOCK_SIZE (data)), - sizeof (struct ext2_inode) * blkoff, + status = ext2fs_devread (blkno << LOG2_EXT2_BLOCK_SIZE (data), blkoff, sizeof (struct ext2_inode), (char *) inode); if (status == 0) { return (0); } + return (1); } |