From: David Howells <dhowells@redhat.com>
To: hch@infradead.org, viro@ftp.linux.org.uk, torvalds@osdl.org,
akpm@osdl.org
Cc: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org,
dhowells@redhat.com
Subject: [PATCH 20/30] IGET: Stop JFS from using iget() and read_inode()
Date: Mon, 01 Oct 2007 14:11:04 +0100 [thread overview]
Message-ID: <20071001131104.29339.78301.stgit@warthog.procyon.org.uk> (raw)
In-Reply-To: <20071001130921.29339.72876.stgit@warthog.procyon.org.uk>
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>
---
fs/jfs/inode.c | 20 ++++++++++++++++----
fs/jfs/jfs_inode.h | 2 +-
fs/jfs/namei.c | 34 ++++++++++++++--------------------
fs/jfs/super.c | 15 +++++++++------
4 files changed, 40 insertions(+), 31 deletions(-)
diff --git a/fs/jfs/inode.c b/fs/jfs/inode.c
index 3467dde..5081e76 100644
--- a/fs/jfs/inode.c
+++ b/fs/jfs/inode.c
@@ -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;
}
/*
diff --git a/fs/jfs/jfs_inode.h b/fs/jfs/jfs_inode.h
index f0ec72b..71ea106 100644
--- a/fs/jfs/jfs_inode.h
+++ b/fs/jfs/jfs_inode.h
@@ -22,7 +22,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 *);
diff --git a/fs/jfs/namei.c b/fs/jfs/namei.c
index 932797b..c436c8a 100644
--- a/fs/jfs/namei.c
+++ b/fs/jfs/namei.c
@@ -1461,12 +1461,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_PTR(PTR_ERR(ip));
}
dentry = d_splice_alias(ip, dentry);
@@ -1487,12 +1485,11 @@ struct dentry *jfs_get_dentry(struct super_block *sb, void *vobjp)
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_PTR(PTR_ERR(inode));
- if (is_bad_inode(inode) ||
- (generation && inode->i_generation != generation)) {
+ if (generation && inode->i_generation != generation) {
result = ERR_PTR(-ESTALE);
goto out_iput;
}
@@ -1518,17 +1515,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_PTR(PTR_ERR(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);
- }
}
}
diff --git a/fs/jfs/super.c b/fs/jfs/super.c
index 4b372f5..f499634 100644
--- a/fs/jfs/super.c
+++ b/fs/jfs/super.c
@@ -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)
@@ -720,7 +724,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,
next prev parent reply other threads:[~2007-10-01 13:11 UTC|newest]
Thread overview: 48+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-10-01 13:09 [PATCH 00/30] Remove iget() and read_inode() David Howells
2007-10-01 13:09 ` [PATCH 01/30] IGET: Introduce a function to register iget failure David Howells
2007-10-01 13:09 ` [PATCH 02/30] IGET: Use iget_failed() in AFS David Howells
2007-10-01 13:09 ` [PATCH 03/30] IGET: Use iget_failed() in GFS2 David Howells
2007-10-01 13:09 ` [PATCH 04/30] IGET: Mark iget() and read_inode() as being obsolete David Howells
2007-10-01 13:09 ` [PATCH 05/30] IGET: Stop AFFS from using iget() and read_inode() David Howells
2007-10-01 13:09 ` [PATCH 06/30] IGET: Stop autofs " David Howells
2007-10-01 13:09 ` [PATCH 07/30] IGET: Stop BEFS " David Howells
2007-10-01 17:39 ` Zach Brown
2007-10-01 17:44 ` Linus Torvalds
2007-10-01 18:06 ` Christoph Hellwig
2007-10-01 18:18 ` Zach Brown
2007-10-01 18:19 ` Linus Torvalds
2007-10-02 12:32 ` David Howells
2007-10-02 13:02 ` Dave Kleikamp
2007-10-02 13:24 ` David Howells
2007-10-02 14:16 ` Dave Kleikamp
2007-10-01 13:10 ` [PATCH 08/30] IGET: Stop BFS " David Howells
2007-10-01 13:10 ` [PATCH 09/30] IGET: Stop CIFS " David Howells
2007-10-01 13:10 ` [PATCH 10/30] IGET: Stop EFS " David Howells
2007-10-01 13:10 ` [PATCH 11/30] IGET: Stop EXT2 " David Howells
2007-10-02 10:06 ` Jan Kara
2007-10-02 12:58 ` David Howells
2007-10-01 13:10 ` [PATCH 12/30] IGET: Stop EXT3 " David Howells
2007-10-02 10:24 ` Jan Kara
2007-10-02 10:28 ` Jan Kara
2007-10-02 13:16 ` David Howells
2007-10-01 13:10 ` [PATCH 13/30] IGET: Stop EXT4 " David Howells
2007-10-02 12:26 ` Jan Kara
2007-10-02 13:37 ` David Howells
2007-10-01 13:10 ` [PATCH 14/30] IGET: Stop FAT " David Howells
2007-10-01 13:10 ` [PATCH 15/30] IGET: Stop FreeVXFS " David Howells
2007-10-01 13:10 ` [PATCH 16/30] IGET: Stop FUSE " David Howells
2007-10-01 13:10 ` [PATCH 17/30] IGET: Stop HFSPLUS " David Howells
2007-10-01 13:10 ` [PATCH 18/30] IGET: Stop ISOFS from using read_inode() David Howells
2007-10-01 13:10 ` [PATCH 19/30] IGET: Stop JFFS2 from using iget() and read_inode() David Howells
2007-10-01 13:11 ` David Howells [this message]
2007-10-01 18:44 ` [PATCH 20/30] IGET: Stop JFS " Dave Kleikamp
2007-10-01 13:11 ` [PATCH 21/30] IGET: Stop the MINIX filesystem " David Howells
2007-10-01 13:11 ` [PATCH 22/30] IGET: Stop PROCFS " David Howells
2007-10-01 13:11 ` [PATCH 23/30] IGET: Stop QNX4 " David Howells
2007-10-01 13:11 ` [PATCH 24/30] IGET: Stop ROMFS " David Howells
2007-10-01 13:11 ` [PATCH 25/30] IGET: Stop the SYSV filesystem " David Howells
2007-10-01 13:11 ` [PATCH 26/30] IGET: Stop UFS " David Howells
2007-10-01 13:11 ` [PATCH 27/30] IGET: Stop OPENPROMFS " David Howells
2007-10-01 13:11 ` [PATCH 28/30] IGET: Stop HOSTFS " David Howells
2007-10-01 13:11 ` [PATCH 29/30] IGET: Stop HPPFS " David Howells
2007-10-01 13:11 ` [PATCH 30/30] IGET: Remove iget() and the read_inode() super op as being obsolete David Howells
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20071001131104.29339.78301.stgit@warthog.procyon.org.uk \
--to=dhowells@redhat.com \
--cc=akpm@osdl.org \
--cc=hch@infradead.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=torvalds@osdl.org \
--cc=viro@ftp.linux.org.uk \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).