lkml.org 
[lkml]   [2010]   [Jun]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[patch 20/52] 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@suse.de>
    ---
    fs/dcache.c | 23 +++++++++++------------
    1 file changed, 11 insertions(+), 12 deletions(-)

    Index: linux-2.6/fs/dcache.c
    ===================================================================
    --- linux-2.6.orig/fs/dcache.c
    +++ linux-2.6/fs/dcache.c
    @@ -1789,10 +1789,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);
    @@ -1803,7 +1808,6 @@ void d_delete(struct dentry * dentry)
    __d_drop(dentry);

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

    fsnotify_nameremove(dentry, isdir);
    }
    @@ -2116,14 +2120,15 @@ struct dentry *d_materialise_unique(stru

    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;

    @@ -2150,10 +2155,9 @@ struct dentry *d_materialise_unique(stru
    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:
    _d_rehash(actual);
    @@ -2167,10 +2171,6 @@ out_nolock:

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




    \
     
     \ /
      Last update: 2010-06-24 05:21    [W:0.030 / U:29.760 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site