From 4e32e631e520a549f1c0bf379d625b5e24c303a5 Mon Sep 17 00:00:00 2001 From: Al Viro Date: Sun, 17 Jul 2011 10:52:14 -0400 Subject: [PATCH] --- yaml --- r: 257402 b: refs/heads/master c: 4513d899c418ff69052420e29e354e4c64b3ef76 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/fs/dcache.c | 24 +++++------------------- 2 files changed, 6 insertions(+), 20 deletions(-) diff --git a/[refs] b/[refs] index 331da05315da..d75459b5eff1 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 6c673ab393bc18e8bff729cd04cf384d15e72a04 +refs/heads/master: 4513d899c418ff69052420e29e354e4c64b3ef76 diff --git a/trunk/fs/dcache.c b/trunk/fs/dcache.c index 2762804a140d..d1d6b3349ec7 100644 --- a/trunk/fs/dcache.c +++ b/trunk/fs/dcache.c @@ -1652,26 +1652,12 @@ struct dentry *d_add_ci(struct dentry *dentry, struct inode *inode, * Negative dentry: instantiate it unless the inode is a directory and * already has a dentry. */ - spin_lock(&inode->i_lock); - if (!S_ISDIR(inode->i_mode) || list_empty(&inode->i_dentry)) { - __d_instantiate(found, inode); - spin_unlock(&inode->i_lock); - security_d_instantiate(found, inode); - return found; + new = d_splice_alias(inode, found); + if (new) { + dput(found); + found = new; } - - /* - * In case a directory already has a (disconnected) entry grab a - * reference to it, move it in place and use it. - */ - new = list_entry(inode->i_dentry.next, struct dentry, d_alias); - __dget(new); - spin_unlock(&inode->i_lock); - security_d_instantiate(found, inode); - d_move(new, found); - iput(inode); - dput(found); - return new; + return found; err_out: iput(inode);