Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- static struct ext2_inode *ext2_get_inode(struct super_block *sb, ino_t ino,
- struct buffer_head **p)
- {
- struct buffer_head * bh;
- unsigned long block_group;
- unsigned long block;
- unsigned long offset;
- struct ext2_group_desc * gdp;
- *p = NULL;
- if ((ino != EXT2_ROOT_INO && ino < EXT2_FIRST_INO(sb)) ||
- ino > le32_to_cpu(EXT2_SB(sb)->s_es->s_inodes_count))
- goto Einval;
- block_group = (ino - 1) / EXT2_INODES_PER_GROUP(sb);
- gdp = ext2_get_group_desc(sb, block_group, NULL);
- if (!gdp)
- goto Egdp;
- /*
- * Figure out the offset within the block group inode table
- */
- offset = ((ino - 1) % EXT2_INODES_PER_GROUP(sb)) * EXT2_INODE_SIZE(sb);
- block = le32_to_cpu(gdp->bg_inode_table) +
- (offset >> EXT2_BLOCK_SIZE_BITS(sb));
- if (!(bh = sb_bread(sb, block)))
- goto Eio;
- *p = bh;
- offset &= (EXT2_BLOCK_SIZE(sb) - 1);
- return (struct ext2_inode *) (bh->b_data + offset);
- Einval:
- ext2_error(sb, "ext2_get_inode", "bad inode number: %lu",
- (unsigned long) ino);
- return ERR_PTR(-EINVAL);
- Eio:
- ext2_error(sb, "ext2_get_inode",
- "unable to read inode block - inode=%lu, block=%lu",
- (unsigned long) ino, block);
- Egdp:
- return ERR_PTR(-EIO);
- }
Add Comment
Please, Sign In to add comment