iget: stop EXT3 from using iget() and read_inode()
Stop the EXT3 filesystem from using iget() and read_inode(). Replace ext3_read_inode() with ext3_iget(), and call that instead of iget(). ext3_iget() then uses iget_locked() directly and returns a proper error code instead of an inode in the event of an error. ext3_fill_super() returns any error incurred when getting the root inode instead of EINVAL. [akpm@linux-foundation.org: coding-style fixes] Signed-off-by: David Howells <dhowells@redhat.com> Acked-by: "Theodore Ts'o" <tytso@mit.edu> Acked-by: Jan Kara <jack@suse.cz> Cc: <linux-ext4@vger.kernel.org> Acked-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
committed by
Linus Torvalds
parent
52fcf70329
commit
473043dcee
@@ -649,11 +649,10 @@ static struct inode *ext3_nfs_get_inode(struct super_block *sb,
|
||||
* Currently we don't know the generation for parent directory, so
|
||||
* a generation of 0 means "accept any"
|
||||
*/
|
||||
inode = iget(sb, ino);
|
||||
if (inode == NULL)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
if (is_bad_inode(inode) ||
|
||||
(generation && inode->i_generation != generation)) {
|
||||
inode = ext3_iget(sb, ino);
|
||||
if (IS_ERR(inode))
|
||||
return ERR_CAST(inode);
|
||||
if (generation && inode->i_generation != generation) {
|
||||
iput(inode);
|
||||
return ERR_PTR(-ESTALE);
|
||||
}
|
||||
@@ -722,7 +721,6 @@ static struct quotactl_ops ext3_qctl_operations = {
|
||||
static const struct super_operations ext3_sops = {
|
||||
.alloc_inode = ext3_alloc_inode,
|
||||
.destroy_inode = ext3_destroy_inode,
|
||||
.read_inode = ext3_read_inode,
|
||||
.write_inode = ext3_write_inode,
|
||||
.dirty_inode = ext3_dirty_inode,
|
||||
.delete_inode = ext3_delete_inode,
|
||||
@@ -1378,8 +1376,8 @@ static void ext3_orphan_cleanup (struct super_block * sb,
|
||||
while (es->s_last_orphan) {
|
||||
struct inode *inode;
|
||||
|
||||
if (!(inode =
|
||||
ext3_orphan_get(sb, le32_to_cpu(es->s_last_orphan)))) {
|
||||
inode = ext3_orphan_get(sb, le32_to_cpu(es->s_last_orphan));
|
||||
if (IS_ERR(inode)) {
|
||||
es->s_last_orphan = 0;
|
||||
break;
|
||||
}
|
||||
@@ -1508,6 +1506,7 @@ static int ext3_fill_super (struct super_block *sb, void *data, int silent)
|
||||
int db_count;
|
||||
int i;
|
||||
int needs_recovery;
|
||||
int ret = -EINVAL;
|
||||
__le32 features;
|
||||
int err;
|
||||
|
||||
@@ -1877,19 +1876,24 @@ static int ext3_fill_super (struct super_block *sb, void *data, int silent)
|
||||
* so we can safely mount the rest of the filesystem now.
|
||||
*/
|
||||
|
||||
root = iget(sb, EXT3_ROOT_INO);
|
||||
sb->s_root = d_alloc_root(root);
|
||||
if (!sb->s_root) {
|
||||
root = ext3_iget(sb, EXT3_ROOT_INO);
|
||||
if (IS_ERR(root)) {
|
||||
printk(KERN_ERR "EXT3-fs: get root inode failed\n");
|
||||
iput(root);
|
||||
ret = PTR_ERR(root);
|
||||
goto failed_mount4;
|
||||
}
|
||||
if (!S_ISDIR(root->i_mode) || !root->i_blocks || !root->i_size) {
|
||||
dput(sb->s_root);
|
||||
sb->s_root = NULL;
|
||||
iput(root);
|
||||
printk(KERN_ERR "EXT3-fs: corrupt root inode, run e2fsck\n");
|
||||
goto failed_mount4;
|
||||
}
|
||||
sb->s_root = d_alloc_root(root);
|
||||
if (!sb->s_root) {
|
||||
printk(KERN_ERR "EXT3-fs: get root dentry failed\n");
|
||||
iput(root);
|
||||
ret = -ENOMEM;
|
||||
goto failed_mount4;
|
||||
}
|
||||
|
||||
ext3_setup_super (sb, es, sb->s_flags & MS_RDONLY);
|
||||
/*
|
||||
@@ -1941,7 +1945,7 @@ out_fail:
|
||||
sb->s_fs_info = NULL;
|
||||
kfree(sbi);
|
||||
lock_kernel();
|
||||
return -EINVAL;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1977,8 +1981,8 @@ static journal_t *ext3_get_journal(struct super_block *sb,
|
||||
* things happen if we iget() an unused inode, as the subsequent
|
||||
* iput() will try to delete it. */
|
||||
|
||||
journal_inode = iget(sb, journal_inum);
|
||||
if (!journal_inode) {
|
||||
journal_inode = ext3_iget(sb, journal_inum);
|
||||
if (IS_ERR(journal_inode)) {
|
||||
printk(KERN_ERR "EXT3-fs: no journal found.\n");
|
||||
return NULL;
|
||||
}
|
||||
@@ -1991,7 +1995,7 @@ static journal_t *ext3_get_journal(struct super_block *sb,
|
||||
|
||||
jbd_debug(2, "Journal inode found at %p: %Ld bytes\n",
|
||||
journal_inode, journal_inode->i_size);
|
||||
if (is_bad_inode(journal_inode) || !S_ISREG(journal_inode->i_mode)) {
|
||||
if (!S_ISREG(journal_inode->i_mode)) {
|
||||
printk(KERN_ERR "EXT3-fs: invalid journal inode.\n");
|
||||
iput(journal_inode);
|
||||
return NULL;
|
||||
|
Reference in New Issue
Block a user