Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751447AbWCCNif (ORCPT ); Fri, 3 Mar 2006 08:38:35 -0500 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1751443AbWCCNif (ORCPT ); Fri, 3 Mar 2006 08:38:35 -0500 Received: from mx1.redhat.com ([66.187.233.31]:26514 "EHLO mx1.redhat.com") by vger.kernel.org with ESMTP id S1751439AbWCCNie (ORCPT ); Fri, 3 Mar 2006 08:38:34 -0500 From: David Howells In-Reply-To: <25676.1141385408@warthog.cambridge.redhat.com> References: <25676.1141385408@warthog.cambridge.redhat.com> <20060302213356.7282.26463.stgit@warthog.cambridge.redhat.com> To: Linux filesystem caching discussion list Cc: torvalds@osdl.org, akpm@osdl.org, steved@redhat.com, trond.myklebust@fys.uio.no, aviro@redhat.com, linux-fsdevel@vger.kernel.org, nfsv4@linux-nfs.org, linux-kernel@vger.kernel.org Subject: [PATCH 7/5] Optimise d_find_alias() [try #2] X-Mailer: MH-E 7.92+cvs; nmh 1.1; GNU Emacs 22.0.50.4 Date: Fri, 03 Mar 2006 13:38:24 +0000 Message-ID: <29473.1141393104@warthog.cambridge.redhat.com> Sender: linux-kernel-owner@vger.kernel.org X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 1441 Lines: 46 The attached patch optimises d_find_alias() to only take the spinlock if there's anything in the the inode's alias list. If there isn't, it returns NULL immediately. With respect to the superblock sharing patch, this should reduce by one the number of times the dcache_lock is taken by nfs_lookup() for ordinary directory lookups. Only in the case where there's already a dentry for particular directory inode (such as might happen when another mountpoint is rooted at that dentry) will the lock then be taken the extra time. Signed-Off-By: David Howells --- fs/dcache.c | 11 +++++++---- 1 files changed, 7 insertions(+), 4 deletions(-) diff --git a/fs/dcache.c b/fs/dcache.c index 97e1e44..32051ba 100644 --- a/fs/dcache.c +++ b/fs/dcache.c @@ -325,10 +325,13 @@ static struct dentry * __d_find_alias(st struct dentry * d_find_alias(struct inode *inode) { - struct dentry *de; - spin_lock(&dcache_lock); - de = __d_find_alias(inode, 0); - spin_unlock(&dcache_lock); + struct dentry *de = NULL; + smp_rmb(); + if (!list_empty(&inode->i_dentry)) { + spin_lock(&dcache_lock); + de = __d_find_alias(inode, 0); + spin_unlock(&dcache_lock); + } return de; } - 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/