diff options
author | Christoph Hellwig <hch@tuxera.com> | 2010-10-01 05:43:41 +0200 |
---|---|---|
committer | Christoph Hellwig <hch@lst.de> | 2010-10-01 05:43:41 +0200 |
commit | fc4fff82104fa096eada73943fe5249500acd5fa (patch) | |
tree | 5fefc3512525a08d9a77723706cde96d001c167f /fs/hfsplus/super.c | |
parent | hfsplus: fix HFSPLUS_I calling convention (diff) | |
download | linux-fc4fff82104fa096eada73943fe5249500acd5fa.tar.xz linux-fc4fff82104fa096eada73943fe5249500acd5fa.zip |
hfsplus: clean up hfsplus_iget
Add a new hfsplus_system_read_inode for reading the special system inodes
and streamline the fastpath iget code.
Signed-off-by: Christoph Hellwig <hch@tuxera.com>
Diffstat (limited to 'fs/hfsplus/super.c')
-rw-r--r-- | fs/hfsplus/super.c | 77 |
1 files changed, 40 insertions, 37 deletions
diff --git a/fs/hfsplus/super.c b/fs/hfsplus/super.c index a7bf89e85b3b..bd09ea23435b 100644 --- a/fs/hfsplus/super.c +++ b/fs/hfsplus/super.c @@ -20,12 +20,42 @@ static void hfsplus_destroy_inode(struct inode *inode); #include "hfsplus_fs.h" +static int hfsplus_system_read_inode(struct inode *inode) +{ + struct hfsplus_vh *vhdr = HFSPLUS_SB(inode->i_sb)->s_vhdr; + + switch (inode->i_ino) { + case HFSPLUS_EXT_CNID: + hfsplus_inode_read_fork(inode, &vhdr->ext_file); + inode->i_mapping->a_ops = &hfsplus_btree_aops; + break; + case HFSPLUS_CAT_CNID: + hfsplus_inode_read_fork(inode, &vhdr->cat_file); + inode->i_mapping->a_ops = &hfsplus_btree_aops; + break; + case HFSPLUS_ALLOC_CNID: + hfsplus_inode_read_fork(inode, &vhdr->alloc_file); + inode->i_mapping->a_ops = &hfsplus_aops; + break; + case HFSPLUS_START_CNID: + hfsplus_inode_read_fork(inode, &vhdr->start_file); + break; + case HFSPLUS_ATTR_CNID: + hfsplus_inode_read_fork(inode, &vhdr->attr_file); + inode->i_mapping->a_ops = &hfsplus_btree_aops; + break; + default: + return -EIO; + } + + return 0; +} + struct inode *hfsplus_iget(struct super_block *sb, unsigned long ino) { struct hfs_find_data fd; - struct hfsplus_vh *vhdr; struct inode *inode; - long err = -EIO; + int err; inode = iget_locked(sb, ino); if (!inode) @@ -39,51 +69,24 @@ struct inode *hfsplus_iget(struct super_block *sb, unsigned long ino) HFSPLUS_I(inode)->rsrc_inode = NULL; atomic_set(&HFSPLUS_I(inode)->opencnt, 0); - if (inode->i_ino >= HFSPLUS_FIRSTUSER_CNID) { - read_inode: + if (inode->i_ino >= HFSPLUS_FIRSTUSER_CNID || + inode->i_ino == HFSPLUS_ROOT_CNID) { hfs_find_init(HFSPLUS_SB(inode->i_sb)->cat_tree, &fd); err = hfsplus_find_cat(inode->i_sb, inode->i_ino, &fd); if (!err) err = hfsplus_cat_read_inode(inode, &fd); hfs_find_exit(&fd); - if (err) - goto bad_inode; - goto done; + } else { + err = hfsplus_system_read_inode(inode); } - vhdr = HFSPLUS_SB(inode->i_sb)->s_vhdr; - switch(inode->i_ino) { - case HFSPLUS_ROOT_CNID: - goto read_inode; - case HFSPLUS_EXT_CNID: - hfsplus_inode_read_fork(inode, &vhdr->ext_file); - inode->i_mapping->a_ops = &hfsplus_btree_aops; - break; - case HFSPLUS_CAT_CNID: - hfsplus_inode_read_fork(inode, &vhdr->cat_file); - inode->i_mapping->a_ops = &hfsplus_btree_aops; - break; - case HFSPLUS_ALLOC_CNID: - hfsplus_inode_read_fork(inode, &vhdr->alloc_file); - inode->i_mapping->a_ops = &hfsplus_aops; - break; - case HFSPLUS_START_CNID: - hfsplus_inode_read_fork(inode, &vhdr->start_file); - break; - case HFSPLUS_ATTR_CNID: - hfsplus_inode_read_fork(inode, &vhdr->attr_file); - inode->i_mapping->a_ops = &hfsplus_btree_aops; - break; - default: - goto bad_inode; + + if (err) { + iget_failed(inode); + return ERR_PTR(err); } -done: unlock_new_inode(inode); return inode; - -bad_inode: - iget_failed(inode); - return ERR_PTR(err); } static int hfsplus_write_inode(struct inode *inode, |