linux-nfs.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] dcache: fix d_splice_alias handling of aliases
@ 2014-01-15 15:17 J. Bruce Fields
  2014-01-15 17:34 ` Miklos Szeredi
                   ` (2 more replies)
  0 siblings, 3 replies; 21+ messages in thread
From: J. Bruce Fields @ 2014-01-15 15:17 UTC (permalink / raw)
  To: Al Viro; +Cc: linux-fsdevel, linux-kernel, linux-nfs, Miklos Szeredi

From: "J. Bruce Fields" <bfields@redhat.com>

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 <bfields@redhat.com>
---
 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);
 
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 21+ messages in thread

end of thread, other threads:[~2014-02-06 17:04 UTC | newest]

Thread overview: 21+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-01-15 15:17 [PATCH] dcache: fix d_splice_alias handling of aliases J. Bruce Fields
2014-01-15 17:34 ` Miklos Szeredi
2014-01-15 17:57   ` J. Bruce Fields
2014-01-15 18:25     ` Miklos Szeredi
2014-01-16 15:41       ` J. Bruce Fields
2014-01-16 16:13         ` Miklos Szeredi
2014-01-16 16:10 ` J. Bruce Fields
2014-01-16 16:15   ` Steven Whitehouse
2014-01-16 16:44     ` J. Bruce Fields
2014-01-16 16:54       ` Bob Peterson
2014-01-16 18:51         ` J. Bruce Fields
2014-01-17 10:04           ` Steven Whitehouse
2014-01-17 18:04             ` J. Bruce Fields
2014-01-17 12:17 ` Christoph Hellwig
2014-01-17 15:39   ` J. Bruce Fields
2014-01-17 21:03     ` J. Bruce Fields
2014-01-17 21:26       ` J. Bruce Fields
2014-01-23 21:27         ` [PATCH] dcache: make d_splice_alias use d_materialise_unique J. Bruce Fields
2014-01-31 18:42           ` Al Viro
2014-01-31 19:47             ` J. Bruce Fields
2014-02-06 17:03               ` J. Bruce Fields

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).