lkml.org 
[lkml]   [2010]   [Nov]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Date
    Subject[PATCH 23/46] fs: dcache reduce dcache_inode_lock
    dcache_inode_lock can be avoided in d_delete() and d_materialise_unique()
    in cases where it is not required.

    Signed-off-by: Nick Piggin <npiggin@kernel.dk>
    ---
    fs/dcache.c | 24 ++++++++++++------------
    1 files changed, 12 insertions(+), 12 deletions(-)

    diff --git a/fs/dcache.c b/fs/dcache.c
    index 3e4f7c1..6fe387d 100644
    --- a/fs/dcache.c
    +++ b/fs/dcache.c
    @@ -1794,10 +1794,15 @@ void d_delete(struct dentry * dentry)
    /*
    * Are we the only user?
    */
    - spin_lock(&dcache_inode_lock);
    +again:
    spin_lock(&dentry->d_lock);
    isdir = S_ISDIR(dentry->d_inode->i_mode);
    if (dentry->d_count == 1) {
    + if (!spin_trylock(&dcache_inode_lock)) {
    + spin_unlock(&dentry->d_lock);
    + cpu_relax();
    + goto again;
    + }
    dentry->d_flags &= ~DCACHE_CANT_MOUNT;
    dentry_iput(dentry);
    fsnotify_nameremove(dentry, isdir);
    @@ -1808,7 +1813,6 @@ void d_delete(struct dentry * dentry)
    __d_drop(dentry);

    spin_unlock(&dentry->d_lock);
    - spin_unlock(&dcache_inode_lock);

    fsnotify_nameremove(dentry, isdir);
    }
    @@ -2106,14 +2110,15 @@ struct dentry *d_materialise_unique(struct dentry *dentry, struct inode *inode)

    BUG_ON(!d_unhashed(dentry));

    - spin_lock(&dcache_inode_lock);
    -
    if (!inode) {
    actual = dentry;
    __d_instantiate(dentry, NULL);
    - goto found_lock;
    + d_rehash(actual);
    + goto out_nolock;
    }

    + spin_lock(&dcache_inode_lock);
    +
    if (S_ISDIR(inode->i_mode)) {
    struct dentry *alias;

    @@ -2145,10 +2150,9 @@ struct dentry *d_materialise_unique(struct dentry *dentry, struct inode *inode)
    actual = __d_instantiate_unique(dentry, inode);
    if (!actual)
    actual = dentry;
    - else if (unlikely(!d_unhashed(actual)))
    - goto shouldnt_be_hashed;
    + else
    + BUG_ON(!d_unhashed(actual));

    -found_lock:
    spin_lock(&actual->d_lock);
    found:
    spin_lock(&dcache_hash_lock);
    @@ -2164,10 +2168,6 @@ out_nolock:

    iput(inode);
    return actual;
    -
    -shouldnt_be_hashed:
    - spin_unlock(&dcache_inode_lock);
    - BUG();
    }
    EXPORT_SYMBOL_GPL(d_materialise_unique);

    --
    1.7.1


    \
     
     \ /
      Last update: 2010-11-27 11:35    [W:0.023 / U:32.568 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site