From mboxrd@z Thu Jan 1 00:00:00 1970 From: Al Viro Subject: Re: [PATCH] fs: fold _d_rehash into d_rehash Date: Thu, 2 Oct 2014 18:49:47 +0100 Message-ID: <20141002174947.GV7996@ZenIV.linux.org.uk> References: <1412271264-32362-1-git-send-email-hch@lst.de> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Cc: linux-fsdevel@vger.kernel.org To: Christoph Hellwig Return-path: Received: from zeniv.linux.org.uk ([195.92.253.2]:35370 "EHLO ZenIV.linux.org.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752672AbaJBRts (ORCPT ); Thu, 2 Oct 2014 13:49:48 -0400 Content-Disposition: inline In-Reply-To: <1412271264-32362-1-git-send-email-hch@lst.de> Sender: linux-fsdevel-owner@vger.kernel.org List-ID: On Thu, Oct 02, 2014 at 07:34:24PM +0200, Christoph Hellwig wrote: FWIW, I already have something stronger in my tree. Look: the only reason to have separate __d_rehash() is doing it early in __d_move(). Move that past the place where we change names and locations and you get this: diff --git a/fs/dcache.c b/fs/dcache.c index e605b6d..2041261 100644 --- a/fs/dcache.c +++ b/fs/dcache.c @@ -2345,8 +2345,9 @@ again: } EXPORT_SYMBOL(d_delete); -static void __d_rehash(struct dentry * entry, struct hlist_bl_head *b) +static void __d_rehash(struct dentry *entry) { + struct hlist_bl_head *b = d_hash(entry->d_parent, entry->d_name.hash); BUG_ON(!d_unhashed(entry)); hlist_bl_lock(b); entry->d_flags |= DCACHE_RCUACCESS; @@ -2354,11 +2355,6 @@ static void __d_rehash(struct dentry * entry, struct hlist_bl_head *b) hlist_bl_unlock(b); } -static void _d_rehash(struct dentry * entry) -{ - __d_rehash(entry, d_hash(entry->d_parent, entry->d_name.hash)); -} - /** * d_rehash - add an entry back to the hash * @entry: dentry to add to the hash @@ -2369,7 +2365,7 @@ static void _d_rehash(struct dentry * entry) void d_rehash(struct dentry * entry) { spin_lock(&entry->d_lock); - _d_rehash(entry); + __d_rehash(entry); spin_unlock(&entry->d_lock); } EXPORT_SYMBOL(d_rehash); @@ -2545,17 +2541,12 @@ static void __d_move(struct dentry *dentry, struct dentry *target, * for the same hash queue because of how unlikely it is. */ __d_drop(dentry); - __d_rehash(dentry, d_hash(target->d_parent, target->d_name.hash)); /* * Unhash the target (d_delete() is not usable here). If exchanging * the two dentries, then rehash onto the other's hash queue. */ __d_drop(target); - if (exchange) { - __d_rehash(target, - d_hash(dentry->d_parent, dentry->d_name.hash)); - } /* Switch the names.. */ if (exchange) @@ -2579,6 +2570,9 @@ static void __d_move(struct dentry *dentry, struct dentry *target, fsnotify_d_move(target); fsnotify_d_move(dentry); } + __d_rehash(dentry); + if (exchange) + __d_rehash(target); write_seqcount_end(&target->d_seq); write_seqcount_end(&dentry->d_seq);