From patchwork Wed Jan 15 15:17:49 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "J. Bruce Fields" X-Patchwork-Id: 3492191 Return-Path: X-Original-To: patchwork-linux-nfs@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork2.web.kernel.org (Postfix) with ESMTP id D017AC02DC for ; Wed, 15 Jan 2014 15:17:54 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id B9B3D2010B for ; Wed, 15 Jan 2014 15:17:53 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 7C6D4200E7 for ; Wed, 15 Jan 2014 15:17:52 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751754AbaAOPRu (ORCPT ); Wed, 15 Jan 2014 10:17:50 -0500 Received: from fieldses.org ([174.143.236.118]:43246 "EHLO fieldses.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751259AbaAOPRu (ORCPT ); Wed, 15 Jan 2014 10:17:50 -0500 Received: from bfields by fieldses.org with local (Exim 4.76) (envelope-from ) id 1W3SE1-00015B-AI; Wed, 15 Jan 2014 10:17:49 -0500 Date: Wed, 15 Jan 2014 10:17:49 -0500 To: Al Viro Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-nfs@vger.kernel.org, Miklos Szeredi Subject: [PATCH] dcache: fix d_splice_alias handling of aliases Message-ID: <20140115151749.GF23999@fieldses.org> MIME-Version: 1.0 Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) From: "J. Bruce Fields" Sender: linux-nfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org X-Spam-Status: No, score=-7.2 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=ham 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: "J. Bruce Fields" d_splice_alias can create duplicate directory aliases (in the !new case), or (in the new case) d_move without holding appropriate locks. d_materialise_unique deals with both of these problems. (The latter seems to be dealt by trylocks (see __d_unalias), which look like they could cause spurious lookup failures--but that's at least better than corrupting the dcache.) Signed-off-by: J. Bruce Fields --- fs/dcache.c | 25 +------------------------ 1 file changed, 1 insertion(+), 24 deletions(-) Only lightly tested.... If this is right, then we can also just ditch d_splice_alias completely, and clean up the various d_find_alias's. I think the only reason we have both d_splice_alias and d_materialise_unique is that the former was written for exportable filesystems and the latter for distributed filesystems. But we have at least one exportable filesystem (fuse) using d_materialise_unique. And I doubt d_splice_alias was ever completely correct even for on-disk filesystems. Am I missing some subtlety? --b. diff --git a/fs/dcache.c b/fs/dcache.c index 4bdb300..da82fa9 100644 --- a/fs/dcache.c +++ b/fs/dcache.c @@ -1926,33 +1926,10 @@ EXPORT_SYMBOL(d_obtain_alias); */ struct dentry *d_splice_alias(struct inode *inode, struct dentry *dentry) { - struct dentry *new = NULL; - if (IS_ERR(inode)) return ERR_CAST(inode); - if (inode && S_ISDIR(inode->i_mode)) { - spin_lock(&inode->i_lock); - new = __d_find_alias(inode, 1); - if (new) { - BUG_ON(!(new->d_flags & DCACHE_DISCONNECTED)); - spin_unlock(&inode->i_lock); - security_d_instantiate(new, inode); - d_move(new, dentry); - iput(inode); - } else { - /* already taking inode->i_lock, so d_add() by hand */ - __d_instantiate(dentry, inode); - spin_unlock(&inode->i_lock); - security_d_instantiate(dentry, inode); - d_rehash(dentry); - } - } else { - d_instantiate(dentry, inode); - if (d_unhashed(dentry)) - d_rehash(dentry); - } - return new; + return d_materialise_unique(dentry, inode); } EXPORT_SYMBOL(d_splice_alias);