lkml.org 
[lkml]   [2007]   [Oct]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 28/32] IGET: Stop UFS from using iget() and read_inode() [try #2]
    Date
    Stop the UFS filesystem from using iget() and read_inode().  Replace
    ufs_read_inode() with ufs_iget(), and call that instead of iget().
    ufs_iget() then uses iget_locked() directly and returns a proper error code
    instead of an inode in the event of an error.

    ufs_fill_super() returns any error incurred when getting the root inode
    instead of EINVAL.

    Signed-off-by: David Howells <dhowells@redhat.com>
    ---

    fs/ufs/inode.c | 34 ++++++++++++++++++++--------------
    fs/ufs/namei.c | 6 +++---
    fs/ufs/super.c | 14 +++++++++-----
    include/linux/ufs_fs.h | 2 +-
    4 files changed, 33 insertions(+), 23 deletions(-)

    diff --git a/fs/ufs/inode.c b/fs/ufs/inode.c
    index f18b791..d7c2d3c 100644
    --- a/fs/ufs/inode.c
    +++ b/fs/ufs/inode.c
    @@ -698,26 +698,30 @@ static int ufs2_read_inode(struct inode *inode, struct ufs2_inode *ufs2_inode)
    return 0;
    }

    -void ufs_read_inode(struct inode * inode)
    +struct inode *ufs_iget (struct super_block *sb, unsigned long ino)
    {
    - struct ufs_inode_info *ufsi = UFS_I(inode);
    - struct super_block * sb;
    - struct ufs_sb_private_info * uspi;
    + struct ufs_inode_info *ufsi;
    + struct ufs_sb_private_info * uspi = UFS_SB(sb)->s_uspi;
    struct buffer_head * bh;
    + struct inode *inode;
    int err;

    - UFSD("ENTER, ino %lu\n", inode->i_ino);
    -
    - sb = inode->i_sb;
    - uspi = UFS_SB(sb)->s_uspi;
    + UFSD("ENTER, ino %lu\n", ino);

    - if (inode->i_ino < UFS_ROOTINO ||
    - inode->i_ino > (uspi->s_ncg * uspi->s_ipg)) {
    + if (ino < UFS_ROOTINO || ino > (uspi->s_ncg * uspi->s_ipg)) {
    ufs_warning(sb, "ufs_read_inode", "bad inode number (%lu)\n",
    - inode->i_ino);
    - goto bad_inode;
    + ino);
    + return ERR_PTR(-EIO);
    }

    + inode = iget_locked(sb, ino);
    + if (!inode)
    + return ERR_PTR(-ENOMEM);
    + if (!(inode->i_state & I_NEW))
    + return inode;
    +
    + ufsi = UFS_I(inode);
    +
    bh = sb_bread(sb, uspi->s_sbbase + ufs_inotofsba(inode->i_ino));
    if (!bh) {
    ufs_warning(sb, "ufs_read_inode", "unable to read inode %lu\n",
    @@ -749,10 +753,12 @@ void ufs_read_inode(struct inode * inode)
    brelse(bh);

    UFSD("EXIT\n");
    - return;
    + unlock_new_inode(inode);
    + return inode;

    bad_inode:
    - make_bad_inode(inode);
    + iget_failed(inode);
    + return ERR_PTR(-EIO);
    }

    static void ufs1_update_inode(struct inode *inode, struct ufs_inode *ufs_inode)
    diff --git a/fs/ufs/namei.c b/fs/ufs/namei.c
    index a059ccd..a00cec1 100644
    --- a/fs/ufs/namei.c
    +++ b/fs/ufs/namei.c
    @@ -57,10 +57,10 @@ static struct dentry *ufs_lookup(struct inode * dir, struct dentry *dentry, stru
    lock_kernel();
    ino = ufs_inode_by_name(dir, dentry);
    if (ino) {
    - inode = iget(dir->i_sb, ino);
    - if (!inode) {
    + inode = ufs_iget(dir->i_sb, ino);
    + if (IS_ERR(inode)) {
    unlock_kernel();
    - return ERR_PTR(-EACCES);
    + return ERR_CAST(inode);
    }
    }
    unlock_kernel();
    diff --git a/fs/ufs/super.c b/fs/ufs/super.c
    index 38eb0b7..8e157ab 100644
    --- a/fs/ufs/super.c
    +++ b/fs/ufs/super.c
    @@ -613,6 +613,7 @@ static int ufs_fill_super(struct super_block *sb, void *data, int silent)
    unsigned block_size, super_block_size;
    unsigned flags;
    unsigned super_block_offset;
    + int ret = -EINVAL;

    uspi = NULL;
    ubh = NULL;
    @@ -1026,12 +1027,16 @@ magic_found:
    uspi->s_maxsymlinklen =
    fs32_to_cpu(sb, usb3->fs_un2.fs_44.fs_maxsymlinklen);

    - inode = iget(sb, UFS_ROOTINO);
    - if (!inode || is_bad_inode(inode))
    + inode = ufs_iget(sb, UFS_ROOTINO);
    + if (IS_ERR(inode)) {
    + ret = PTR_ERR(inode);
    goto failed;
    + }
    sb->s_root = d_alloc_root(inode);
    - if (!sb->s_root)
    + if (!sb->s_root) {
    + ret = -ENOMEM;
    goto dalloc_failed;
    + }

    ufs_setup_cstotal(sb);
    /*
    @@ -1053,7 +1058,7 @@ failed:
    kfree(sbi);
    sb->s_fs_info = NULL;
    UFSD("EXIT (FAILED)\n");
    - return -EINVAL;
    + return ret;

    failed_nomem:
    UFSD("EXIT (NOMEM)\n");
    @@ -1264,7 +1269,6 @@ static ssize_t ufs_quota_write(struct super_block *, int, const char *, size_t,
    static const struct super_operations ufs_super_ops = {
    .alloc_inode = ufs_alloc_inode,
    .destroy_inode = ufs_destroy_inode,
    - .read_inode = ufs_read_inode,
    .write_inode = ufs_write_inode,
    .delete_inode = ufs_delete_inode,
    .put_super = ufs_put_super,
    diff --git a/include/linux/ufs_fs.h b/include/linux/ufs_fs.h
    index daeba22..2a61fa3 100644
    --- a/include/linux/ufs_fs.h
    +++ b/include/linux/ufs_fs.h
    @@ -979,7 +979,7 @@ extern void ufs_free_inode (struct inode *inode);
    extern struct inode * ufs_new_inode (struct inode *, int);

    /* inode.c */
    -extern void ufs_read_inode (struct inode *);
    +extern struct inode *ufs_iget (struct super_block *, unsigned long);
    extern void ufs_put_inode (struct inode *);
    extern int ufs_write_inode (struct inode *, int);
    extern int ufs_sync_inode (struct 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-04 18:13    [W:0.029 / U:0.876 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site