From patchwork Thu May 21 00:31:59 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Vinson Lee X-Patchwork-Id: 6451111 Return-Path: X-Original-To: patchwork-linux-fsdevel@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id E7CFE9F318 for ; Thu, 21 May 2015 00:32:17 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 0E2B620425 for ; Thu, 21 May 2015 00:32:17 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 0BC0520429 for ; Thu, 21 May 2015 00:32:16 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754315AbbEUAcO (ORCPT ); Wed, 20 May 2015 20:32:14 -0400 Received: from mail-pd0-f169.google.com ([209.85.192.169]:35875 "EHLO mail-pd0-f169.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753554AbbEUAcM (ORCPT ); Wed, 20 May 2015 20:32:12 -0400 Received: by pdfh10 with SMTP id h10so87556058pdf.3 for ; Wed, 20 May 2015 17:32:11 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=z8JFh5GbDyTFeAjAUnGzUvyw5sODfmBsvLqyclPfgYM=; b=J3gvkckAc32NMByvLtOl5QZK79AXvF3OyZalr5P8rXTXjCNX0zXKFovusOGbDSCeWw KGlFqJ9Zs6Dm3R01rrKUX/nInIzeHMxEH9fXT8UKriWOKaADopZYjndBznqD3zgYrjiI tY6sQjjypabLy8v9WhSa0XpspdVyRATzCR0alAcWy+k0fhEHCjYJPEi13+TA66GIQooB i81HaxzqAfarwmZE6XvgTdA00+P3g21OoN76+Xumau+YyacccFhDDNO+pSMarFgCsix5 T0NfuD5WaiJhTDXRUigc4qYVu61T7hx8GA3P3+LHhifalleU70mWioCOKcvoBt1O+PMX TBFg== X-Gm-Message-State: ALoCoQk6Wi0xlbuRjAS3DhDX+sWsqNMUTvPbYgqcCOmkzlE4qdkR6GalcJ/LDmN3H5gtP9uAfXVN X-Received: by 10.68.102.1 with SMTP id fk1mr157258pbb.56.1432168331138; Wed, 20 May 2015 17:32:11 -0700 (PDT) Received: from vinson-ubuntu.sf.office.twttr.net ([8.25.197.27]) by mx.google.com with ESMTPSA id c1sm17296247pdc.45.2015.05.20.17.32.10 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 20 May 2015 17:32:10 -0700 (PDT) From: Vinson Lee To: Greg KH , Cong Wang , viro@zeniv.linux.org.uk Cc: stable@vger.kernel.org, linux-fsdevel@vger.kernel.org, Vinson Lee Subject: [PATCH] fold d_kill() and d_free() Date: Wed, 20 May 2015 17:31:59 -0700 Message-Id: <1432168319-30261-2-git-send-email-vlee@twopensource.com> X-Mailer: git-send-email 2.1.0 In-Reply-To: <1432168319-30261-1-git-send-email-vlee@twopensource.com> References: <20150518174424.GA802@kroah.com> <1432168319-30261-1-git-send-email-vlee@twopensource.com> Sender: linux-fsdevel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-fsdevel@vger.kernel.org X-Spam-Status: No, score=-6.9 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, T_RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Al Viro commit 03b3b889e79cdb6b806fc0ba9be0d71c186bbfaa upstream. Signed-off-by: Al Viro [ vlee: Backported to 3.14. Adjusted context. ] Signed-off-by: Vinson Lee --- fs/dcache.c | 77 +++++++++++++++++++------------------------------------------ 1 file changed, 24 insertions(+), 53 deletions(-) diff --git a/fs/dcache.c b/fs/dcache.c index a9231c8..8486607 100644 --- a/fs/dcache.c +++ b/fs/dcache.c @@ -244,24 +244,6 @@ static void __d_free(struct rcu_head *head) kmem_cache_free(dentry_cache, dentry); } -/* - * no locks, please. - */ -static void d_free(struct dentry *dentry) -{ - WARN_ON(!hlist_unhashed(&dentry->d_u.d_alias)); - BUG_ON((int)dentry->d_lockref.count > 0); - this_cpu_dec(nr_dentry); - if (dentry->d_op && dentry->d_op->d_release) - dentry->d_op->d_release(dentry); - - /* if dentry was never visible to RCU, immediate free is OK */ - if (!(dentry->d_flags & DCACHE_RCUACCESS)) - __d_free(&dentry->d_u.d_rcu); - else - call_rcu(&dentry->d_u.d_rcu, __d_free); -} - /** * dentry_rcuwalk_barrier - invalidate in-progress rcu-walk lookups * @dentry: the target dentry @@ -419,40 +401,6 @@ static void dentry_lru_del(struct dentry *dentry) } /** - * d_kill - kill dentry and return parent - * @dentry: dentry to kill - * @parent: parent dentry - * - * The dentry must already be unhashed and removed from the LRU. - * - * If this is the root of the dentry tree, return NULL. - * - * dentry->d_lock and parent->d_lock must be held by caller, and are dropped by - * d_kill. - */ -static struct dentry *d_kill(struct dentry *dentry, struct dentry *parent) - __releases(dentry->d_lock) - __releases(parent->d_lock) - __releases(dentry->d_inode->i_lock) -{ - __list_del_entry(&dentry->d_child); - /* - * Inform d_walk() that we are no longer attached to the - * dentry tree - */ - dentry->d_flags |= DCACHE_DENTRY_KILLED; - if (parent) - spin_unlock(&parent->d_lock); - dentry_iput(dentry); - /* - * dentry_iput drops the locks, at which point nobody (except - * transient RCU lookups) can reach this dentry. - */ - d_free(dentry); - return parent; -} - -/** * d_drop - drop a dentry * @dentry: dentry to drop * @@ -545,7 +493,30 @@ relock: dentry_lru_del(dentry); /* if it was on the hash then remove it */ __d_drop(dentry); - return d_kill(dentry, parent); + list_del(&dentry->d_child); + /* + * Inform d_walk() that we are no longer attached to the + * dentry tree + */ + dentry->d_flags |= DCACHE_DENTRY_KILLED; + if (parent) + spin_unlock(&parent->d_lock); + dentry_iput(dentry); + /* + * dentry_iput drops the locks, at which point nobody (except + * transient RCU lookups) can reach this dentry. + */ + BUG_ON((int)dentry->d_lockref.count > 0); + this_cpu_dec(nr_dentry); + if (dentry->d_op && dentry->d_op->d_release) + dentry->d_op->d_release(dentry); + + /* if dentry was never visible to RCU, immediate free is OK */ + if (!(dentry->d_flags & DCACHE_RCUACCESS)) + __d_free(&dentry->d_u.d_rcu); + else + call_rcu(&dentry->d_u.d_rcu, __d_free); + return parent; } /*