lkml.org 
[lkml]   [2007]   [Oct]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 21/31] IGET: Stop JFS from using iget() and read_inode() [try #3]
    Date
    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>
    ---

    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..6915a3d 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_CAST(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_CAST(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_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);
    - }
    }
    }

    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,
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2007-10-11 00:25    [W:0.031 / U:59.088 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site