提交 eab1df71 编写于 作者: D David Howells 提交者: Linus Torvalds

iget: stop JFS from using iget() and read_inode()

Stop the JFS filesystem from using iget() and read_inode().  Replace
jfs_read_inode() with jfs_iget(), and call that instead of iget().  jfs_iget()
then uses iget_locked() directly and returns a proper error code instead of an
inode in the event of an error.

jfs_fill_super() returns any error incurred when getting the root inode
instead of EINVAL.
Signed-off-by: NDavid Howells <dhowells@redhat.com>
Acked-by: NDave Kleikamp <shaggy@linux.vnet.ibm.com>
Acked-by: NChristoph Hellwig <hch@lst.de>
Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
上级 5451f79f
...@@ -31,11 +31,21 @@ ...@@ -31,11 +31,21 @@
#include "jfs_debug.h" #include "jfs_debug.h"
void jfs_read_inode(struct inode *inode) struct inode *jfs_iget(struct super_block *sb, unsigned long ino)
{ {
if (diRead(inode)) { struct inode *inode;
make_bad_inode(inode); int ret;
return;
inode = iget_locked(sb, ino);
if (!inode)
return ERR_PTR(-ENOMEM);
if (!(inode->i_state & I_NEW))
return inode;
ret = diRead(inode);
if (ret < 0) {
iget_failed(inode);
return ERR_PTR(ret);
} }
if (S_ISREG(inode->i_mode)) { if (S_ISREG(inode->i_mode)) {
...@@ -55,6 +65,8 @@ void jfs_read_inode(struct inode *inode) ...@@ -55,6 +65,8 @@ void jfs_read_inode(struct inode *inode)
inode->i_op = &jfs_file_inode_operations; inode->i_op = &jfs_file_inode_operations;
init_special_inode(inode, inode->i_mode, inode->i_rdev); init_special_inode(inode, inode->i_mode, inode->i_rdev);
} }
unlock_new_inode(inode);
return inode;
} }
/* /*
......
...@@ -24,7 +24,7 @@ extern struct inode *ialloc(struct inode *, umode_t); ...@@ -24,7 +24,7 @@ extern struct inode *ialloc(struct inode *, umode_t);
extern int jfs_fsync(struct file *, struct dentry *, int); extern int jfs_fsync(struct file *, struct dentry *, int);
extern int jfs_ioctl(struct inode *, struct file *, extern int jfs_ioctl(struct inode *, struct file *,
unsigned int, unsigned long); unsigned int, unsigned long);
extern void jfs_read_inode(struct inode *); extern struct inode *jfs_iget(struct super_block *, unsigned long);
extern int jfs_commit_inode(struct inode *, int); extern int jfs_commit_inode(struct inode *, int);
extern int jfs_write_inode(struct inode*, int); extern int jfs_write_inode(struct inode*, int);
extern void jfs_delete_inode(struct inode *); extern void jfs_delete_inode(struct inode *);
......
...@@ -1462,12 +1462,10 @@ static struct dentry *jfs_lookup(struct inode *dip, struct dentry *dentry, struc ...@@ -1462,12 +1462,10 @@ static struct dentry *jfs_lookup(struct inode *dip, struct dentry *dentry, struc
} }
} }
ip = iget(dip->i_sb, inum); ip = jfs_iget(dip->i_sb, inum);
if (ip == NULL || is_bad_inode(ip)) { if (IS_ERR(ip)) {
jfs_err("jfs_lookup: iget failed on inum %d", (uint) inum); jfs_err("jfs_lookup: iget failed on inum %d", (uint) inum);
if (ip) return ERR_CAST(ip);
iput(ip);
return ERR_PTR(-EACCES);
} }
dentry = d_splice_alias(ip, dentry); dentry = d_splice_alias(ip, dentry);
...@@ -1485,12 +1483,11 @@ static struct inode *jfs_nfs_get_inode(struct super_block *sb, ...@@ -1485,12 +1483,11 @@ static struct inode *jfs_nfs_get_inode(struct super_block *sb,
if (ino == 0) if (ino == 0)
return ERR_PTR(-ESTALE); return ERR_PTR(-ESTALE);
inode = iget(sb, ino); inode = jfs_iget(sb, ino);
if (inode == NULL) if (IS_ERR(inode))
return ERR_PTR(-ENOMEM); return ERR_CAST(inode);
if (is_bad_inode(inode) || if (generation && inode->i_generation != generation) {
(generation && inode->i_generation != generation)) {
iput(inode); iput(inode);
return ERR_PTR(-ESTALE); return ERR_PTR(-ESTALE);
} }
...@@ -1521,17 +1518,14 @@ struct dentry *jfs_get_parent(struct dentry *dentry) ...@@ -1521,17 +1518,14 @@ struct dentry *jfs_get_parent(struct dentry *dentry)
parent_ino = parent_ino =
le32_to_cpu(JFS_IP(dentry->d_inode)->i_dtroot.header.idotdot); le32_to_cpu(JFS_IP(dentry->d_inode)->i_dtroot.header.idotdot);
inode = iget(sb, parent_ino); inode = jfs_iget(sb, parent_ino);
if (inode) { if (IS_ERR(inode)) {
if (is_bad_inode(inode)) { parent = ERR_CAST(inode);
} else {
parent = d_alloc_anon(inode);
if (!parent) {
parent = ERR_PTR(-ENOMEM);
iput(inode); iput(inode);
parent = ERR_PTR(-EACCES);
} else {
parent = d_alloc_anon(inode);
if (!parent) {
parent = ERR_PTR(-ENOMEM);
iput(inode);
}
} }
} }
......
...@@ -414,7 +414,7 @@ static int jfs_fill_super(struct super_block *sb, void *data, int silent) ...@@ -414,7 +414,7 @@ static int jfs_fill_super(struct super_block *sb, void *data, int silent)
struct inode *inode; struct inode *inode;
int rc; int rc;
s64 newLVSize = 0; s64 newLVSize = 0;
int flag; int flag, ret = -EINVAL;
jfs_info("In jfs_read_super: s_flags=0x%lx", sb->s_flags); jfs_info("In jfs_read_super: s_flags=0x%lx", sb->s_flags);
...@@ -461,8 +461,10 @@ static int jfs_fill_super(struct super_block *sb, void *data, int silent) ...@@ -461,8 +461,10 @@ static int jfs_fill_super(struct super_block *sb, void *data, int silent)
* Initialize direct-mapping inode/address-space * Initialize direct-mapping inode/address-space
*/ */
inode = new_inode(sb); inode = new_inode(sb);
if (inode == NULL) if (inode == NULL) {
ret = -ENOMEM;
goto out_kfree; goto out_kfree;
}
inode->i_ino = 0; inode->i_ino = 0;
inode->i_nlink = 1; inode->i_nlink = 1;
inode->i_size = sb->s_bdev->bd_inode->i_size; inode->i_size = sb->s_bdev->bd_inode->i_size;
...@@ -494,9 +496,11 @@ static int jfs_fill_super(struct super_block *sb, void *data, int silent) ...@@ -494,9 +496,11 @@ static int jfs_fill_super(struct super_block *sb, void *data, int silent)
sb->s_magic = JFS_SUPER_MAGIC; sb->s_magic = JFS_SUPER_MAGIC;
inode = iget(sb, ROOT_I); inode = jfs_iget(sb, ROOT_I);
if (!inode || is_bad_inode(inode)) if (IS_ERR(inode)) {
ret = PTR_ERR(inode);
goto out_no_root; goto out_no_root;
}
sb->s_root = d_alloc_root(inode); sb->s_root = d_alloc_root(inode);
if (!sb->s_root) if (!sb->s_root)
goto out_no_root; goto out_no_root;
...@@ -536,7 +540,7 @@ static int jfs_fill_super(struct super_block *sb, void *data, int silent) ...@@ -536,7 +540,7 @@ static int jfs_fill_super(struct super_block *sb, void *data, int silent)
if (sbi->nls_tab) if (sbi->nls_tab)
unload_nls(sbi->nls_tab); unload_nls(sbi->nls_tab);
kfree(sbi); kfree(sbi);
return -EINVAL; return ret;
} }
static void jfs_write_super_lockfs(struct super_block *sb) static void jfs_write_super_lockfs(struct super_block *sb)
...@@ -726,7 +730,6 @@ static ssize_t jfs_quota_write(struct super_block *sb, int type, ...@@ -726,7 +730,6 @@ static ssize_t jfs_quota_write(struct super_block *sb, int type,
static const struct super_operations jfs_super_operations = { static const struct super_operations jfs_super_operations = {
.alloc_inode = jfs_alloc_inode, .alloc_inode = jfs_alloc_inode,
.destroy_inode = jfs_destroy_inode, .destroy_inode = jfs_destroy_inode,
.read_inode = jfs_read_inode,
.dirty_inode = jfs_dirty_inode, .dirty_inode = jfs_dirty_inode,
.write_inode = jfs_write_inode, .write_inode = jfs_write_inode,
.delete_inode = jfs_delete_inode, .delete_inode = jfs_delete_inode,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册