lkml.org 
[lkml]   [2010]   [Oct]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 09/21] fs: Factor inode hash operations into functions
    Date
    From: Dave Chinner <dchinner@redhat.com>

    Before replacing the inode hash locking with a more scalable
    mechanism, factor the removal of the inode from the hashes rather
    than open coding it in several places.

    Based on a patch originally from Nick Piggin.

    Signed-off-by: Dave Chinner <dchinner@redhat.com>
    Reviewed-by: Christoph Hellwig <hch@lst.de>
    ---
    fs/inode.c | 100 +++++++++++++++++++++++++++++++++--------------------------
    1 files changed, 56 insertions(+), 44 deletions(-)

    diff --git a/fs/inode.c b/fs/inode.c
    index 77b71ce..cfcafee 100644
    --- a/fs/inode.c
    +++ b/fs/inode.c
    @@ -359,6 +359,59 @@ void inode_lru_list_del(struct inode *inode)
    }
    }

    +static unsigned long hash(struct super_block *sb, unsigned long hashval)
    +{
    + unsigned long tmp;
    +
    + tmp = (hashval * (unsigned long)sb) ^ (GOLDEN_RATIO_PRIME + hashval) /
    + L1_CACHE_BYTES;
    + tmp = tmp ^ ((tmp ^ GOLDEN_RATIO_PRIME) >> I_HASHBITS);
    + return tmp & I_HASHMASK;
    +}
    +
    +/**
    + * __insert_inode_hash - hash an inode
    + * @inode: unhashed inode
    + * @hashval: unsigned long value used to locate this object in the
    + * inode_hashtable.
    + *
    + * Add an inode to the inode hash for this superblock.
    + */
    +void __insert_inode_hash(struct inode *inode, unsigned long hashval)
    +{
    + struct hlist_head *head = inode_hashtable + hash(inode->i_sb, hashval);
    + spin_lock(&inode_lock);
    + hlist_add_head(&inode->i_hash, head);
    + spin_unlock(&inode_lock);
    +}
    +EXPORT_SYMBOL(__insert_inode_hash);
    +
    +/**
    + * __remove_inode_hash - remove an inode from the hash
    + * @inode: inode to unhash
    + *
    + * Remove an inode from the superblock. inode->i_lock must be
    + * held.
    + */
    +static void __remove_inode_hash(struct inode *inode)
    +{
    + hlist_del_init(&inode->i_hash);
    +}
    +
    +/**
    + * remove_inode_hash - remove an inode from the hash
    + * @inode: inode to unhash
    + *
    + * Remove an inode from the superblock.
    + */
    +void remove_inode_hash(struct inode *inode)
    +{
    + spin_lock(&inode_lock);
    + hlist_del_init(&inode->i_hash);
    + spin_unlock(&inode_lock);
    +}
    +EXPORT_SYMBOL(remove_inode_hash);
    +
    void end_writeback(struct inode *inode)
    {
    might_sleep();
    @@ -406,7 +459,7 @@ static void dispose_list(struct list_head *head)
    evict(inode);

    spin_lock(&inode_lock);
    - hlist_del_init(&inode->i_hash);
    + __remove_inode_hash(inode);
    list_del_init(&inode->i_sb_list);
    spin_unlock(&inode_lock);

    @@ -658,16 +711,6 @@ repeat:
    return node ? inode : NULL;
    }

    -static unsigned long hash(struct super_block *sb, unsigned long hashval)
    -{
    - unsigned long tmp;
    -
    - tmp = (hashval * (unsigned long)sb) ^ (GOLDEN_RATIO_PRIME + hashval) /
    - L1_CACHE_BYTES;
    - tmp = tmp ^ ((tmp ^ GOLDEN_RATIO_PRIME) >> I_HASHBITS);
    - return tmp & I_HASHMASK;
    -}
    -
    static inline void
    __inode_add_to_lists(struct super_block *sb, struct hlist_head *head,
    struct inode *inode)
    @@ -1234,36 +1277,6 @@ int insert_inode_locked4(struct inode *inode, unsigned long hashval,
    }
    EXPORT_SYMBOL(insert_inode_locked4);

    -/**
    - * __insert_inode_hash - hash an inode
    - * @inode: unhashed inode
    - * @hashval: unsigned long value used to locate this object in the
    - * inode_hashtable.
    - *
    - * Add an inode to the inode hash for this superblock.
    - */
    -void __insert_inode_hash(struct inode *inode, unsigned long hashval)
    -{
    - struct hlist_head *head = inode_hashtable + hash(inode->i_sb, hashval);
    - spin_lock(&inode_lock);
    - hlist_add_head(&inode->i_hash, head);
    - spin_unlock(&inode_lock);
    -}
    -EXPORT_SYMBOL(__insert_inode_hash);
    -
    -/**
    - * remove_inode_hash - remove an inode from the hash
    - * @inode: inode to unhash
    - *
    - * Remove an inode from the superblock.
    - */
    -void remove_inode_hash(struct inode *inode)
    -{
    - spin_lock(&inode_lock);
    - hlist_del_init(&inode->i_hash);
    - spin_unlock(&inode_lock);
    -}
    -EXPORT_SYMBOL(remove_inode_hash);

    int generic_delete_inode(struct inode *inode)
    {
    @@ -1319,6 +1332,7 @@ static void iput_final(struct inode *inode)
    WARN_ON(inode->i_state & I_NEW);
    inode->i_state &= ~I_WILL_FREE;
    hlist_del_init(&inode->i_hash);
    + __remove_inode_hash(inode);
    }
    list_del_init(&inode->i_wb_list);
    WARN_ON(inode->i_state & I_NEW);
    @@ -1334,9 +1348,7 @@ static void iput_final(struct inode *inode)
    list_del_init(&inode->i_sb_list);
    spin_unlock(&inode_lock);
    evict(inode);
    - spin_lock(&inode_lock);
    - hlist_del_init(&inode->i_hash);
    - spin_unlock(&inode_lock);
    + remove_inode_hash(inode);
    wake_up_inode(inode);
    BUG_ON(inode->i_state != (I_FREEING | I_CLEAR));
    destroy_inode(inode);
    --
    1.7.1


    \
     
     \ /
      Last update: 2010-10-21 02:57    [W:0.049 / U:30.888 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site