Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit eab1df71 authored by David Howells's avatar David Howells Committed by Linus Torvalds
Browse files

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: default avatarDavid Howells <dhowells@redhat.com>
Acked-by: default avatarDave Kleikamp <shaggy@linux.vnet.ibm.com>
Acked-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 5451f79f
Loading
Loading
Loading
Loading
+16 −4
Original line number Original line Diff line number Diff line
@@ -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)
		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;
}
}


/*
/*
+1 −1
Original line number Original line Diff line number Diff line
@@ -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 *);
+14 −20
Original line number Original line Diff line number Diff line
@@ -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,


	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,11 +1518,9 @@ 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);
			iput(inode);
			parent = ERR_PTR(-EACCES);
	} else {
	} else {
		parent = d_alloc_anon(inode);
		parent = d_alloc_anon(inode);
		if (!parent) {
		if (!parent) {
@@ -1533,7 +1528,6 @@ struct dentry *jfs_get_parent(struct dentry *dentry)
			iput(inode);
			iput(inode);
		}
		}
	}
	}
	}


	return parent;
	return parent;
}
}
+9 −6
Original line number Original line Diff line number Diff line
@@ -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)
	 * 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)


	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)
	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,
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,