diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2014-10-13 00:46:26 +0200 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2014-11-19 19:00:10 +0100 |
commit | 427c77d4619657c483c49b28ca1813bb33e857b0 (patch) | |
tree | 626cb6d8afe9d5b1408e470187e921aebd72fa1b /fs/dcache.c | |
parent | deal with deadlock in d_walk() (diff) | |
download | linux-427c77d4619657c483c49b28ca1813bb33e857b0.tar.xz linux-427c77d4619657c483c49b28ca1813bb33e857b0.zip |
d_add_ci() should just accept a hashed exact match if it finds one
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/dcache.c')
-rw-r--r-- | fs/dcache.c | 46 |
1 files changed, 7 insertions, 39 deletions
diff --git a/fs/dcache.c b/fs/dcache.c index e90aa825cc03..e605e90d0f0a 100644 --- a/fs/dcache.c +++ b/fs/dcache.c @@ -1888,51 +1888,19 @@ struct dentry *d_add_ci(struct dentry *dentry, struct inode *inode, * if not go ahead and create it now. */ found = d_hash_and_lookup(dentry->d_parent, name); - if (unlikely(IS_ERR(found))) - goto err_out; if (!found) { new = d_alloc(dentry->d_parent, name); if (!new) { found = ERR_PTR(-ENOMEM); - goto err_out; - } - - found = d_splice_alias(inode, new); - if (found) { - dput(new); - return found; - } - return new; - } - - /* - * If a matching dentry exists, and it's not negative use it. - * - * Decrement the reference count to balance the iget() done - * earlier on. - */ - if (found->d_inode) { - if (unlikely(found->d_inode != inode)) { - /* This can't happen because bad inodes are unhashed. */ - BUG_ON(!is_bad_inode(inode)); - BUG_ON(!is_bad_inode(found->d_inode)); + } else { + found = d_splice_alias(inode, new); + if (found) { + dput(new); + return found; + } + return new; } - iput(inode); - return found; } - - /* - * Negative dentry: instantiate it unless the inode is a directory and - * already has a dentry. - */ - new = d_splice_alias(inode, found); - if (new) { - dput(found); - found = new; - } - return found; - -err_out: iput(inode); return found; } |