mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-11-20 00:26:39 +08:00
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: David Howells <dhowells@redhat.com> Acked-by: Dave Kleikamp <shaggy@linux.vnet.ibm.com> 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:
parent
5451f79f5f
commit
eab1df71a0
@ -31,11 +31,21 @@
|
||||
#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)) {
|
||||
make_bad_inode(inode);
|
||||
return;
|
||||
struct inode *inode;
|
||||
int ret;
|
||||
|
||||
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)) {
|
||||
@ -55,6 +65,8 @@ void jfs_read_inode(struct inode *inode)
|
||||
inode->i_op = &jfs_file_inode_operations;
|
||||
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);
|
||||
extern int jfs_fsync(struct file *, struct dentry *, int);
|
||||
extern int jfs_ioctl(struct inode *, struct file *,
|
||||
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_write_inode(struct inode*, int);
|
||||
extern void jfs_delete_inode(struct inode *);
|
||||
|
@ -1462,12 +1462,10 @@ static struct dentry *jfs_lookup(struct inode *dip, struct dentry *dentry, struc
|
||||
}
|
||||
}
|
||||
|
||||
ip = iget(dip->i_sb, inum);
|
||||
if (ip == NULL || is_bad_inode(ip)) {
|
||||
ip = jfs_iget(dip->i_sb, inum);
|
||||
if (IS_ERR(ip)) {
|
||||
jfs_err("jfs_lookup: iget failed on inum %d", (uint) inum);
|
||||
if (ip)
|
||||
iput(ip);
|
||||
return ERR_PTR(-EACCES);
|
||||
return ERR_CAST(ip);
|
||||
}
|
||||
|
||||
dentry = d_splice_alias(ip, dentry);
|
||||
@ -1485,12 +1483,11 @@ static struct inode *jfs_nfs_get_inode(struct super_block *sb,
|
||||
|
||||
if (ino == 0)
|
||||
return ERR_PTR(-ESTALE);
|
||||
inode = iget(sb, ino);
|
||||
if (inode == NULL)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
inode = jfs_iget(sb, ino);
|
||||
if (IS_ERR(inode))
|
||||
return ERR_CAST(inode);
|
||||
|
||||
if (is_bad_inode(inode) ||
|
||||
(generation && inode->i_generation != generation)) {
|
||||
if (generation && inode->i_generation != generation) {
|
||||
iput(inode);
|
||||
return ERR_PTR(-ESTALE);
|
||||
}
|
||||
@ -1521,17 +1518,14 @@ struct dentry *jfs_get_parent(struct dentry *dentry)
|
||||
|
||||
parent_ino =
|
||||
le32_to_cpu(JFS_IP(dentry->d_inode)->i_dtroot.header.idotdot);
|
||||
inode = iget(sb, parent_ino);
|
||||
if (inode) {
|
||||
if (is_bad_inode(inode)) {
|
||||
inode = jfs_iget(sb, parent_ino);
|
||||
if (IS_ERR(inode)) {
|
||||
parent = ERR_CAST(inode);
|
||||
} else {
|
||||
parent = d_alloc_anon(inode);
|
||||
if (!parent) {
|
||||
parent = ERR_PTR(-ENOMEM);
|
||||
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)
|
||||
struct inode *inode;
|
||||
int rc;
|
||||
s64 newLVSize = 0;
|
||||
int flag;
|
||||
int flag, ret = -EINVAL;
|
||||
|
||||
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)
|
||||
* Initialize direct-mapping inode/address-space
|
||||
*/
|
||||
inode = new_inode(sb);
|
||||
if (inode == NULL)
|
||||
if (inode == NULL) {
|
||||
ret = -ENOMEM;
|
||||
goto out_kfree;
|
||||
}
|
||||
inode->i_ino = 0;
|
||||
inode->i_nlink = 1;
|
||||
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)
|
||||
|
||||
sb->s_magic = JFS_SUPER_MAGIC;
|
||||
|
||||
inode = iget(sb, ROOT_I);
|
||||
if (!inode || is_bad_inode(inode))
|
||||
inode = jfs_iget(sb, ROOT_I);
|
||||
if (IS_ERR(inode)) {
|
||||
ret = PTR_ERR(inode);
|
||||
goto out_no_root;
|
||||
}
|
||||
sb->s_root = d_alloc_root(inode);
|
||||
if (!sb->s_root)
|
||||
goto out_no_root;
|
||||
@ -536,7 +540,7 @@ out_kfree:
|
||||
if (sbi->nls_tab)
|
||||
unload_nls(sbi->nls_tab);
|
||||
kfree(sbi);
|
||||
return -EINVAL;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void jfs_write_super_lockfs(struct super_block *sb)
|
||||
@ -726,7 +730,6 @@ out:
|
||||
static const struct super_operations jfs_super_operations = {
|
||||
.alloc_inode = jfs_alloc_inode,
|
||||
.destroy_inode = jfs_destroy_inode,
|
||||
.read_inode = jfs_read_inode,
|
||||
.dirty_inode = jfs_dirty_inode,
|
||||
.write_inode = jfs_write_inode,
|
||||
.delete_inode = jfs_delete_inode,
|
||||
|
Loading…
Reference in New Issue
Block a user