From: Oleg Drokin <green@xxxxxxxxxxxxxx> The comment at the top of the function already permits it, just take out the assetrtion and update __d_add to be aware of this. Move the BUG_ON to d_add which is the other user of __d_add and presumably we do not want to allow hashed dentries as input there. Signed-off-by: Oleg Drokin <green@xxxxxxxxxxxxxx> --- So seeing how there's only one other __d_add user, I just moved the BUG_ON to d_add and allowed __d_add to not call _d_rehash if the dentry is already hashed. This seems to be working as expected and I don't see any problems with it. Of course I am probably missing some other important consideration ;) fs/dcache.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/fs/dcache.c b/fs/dcache.c index ad4a542..0e35049 100644 --- a/fs/dcache.c +++ b/fs/dcache.c @@ -2565,7 +2565,8 @@ static inline void __d_add(struct dentry *dentry, struct inode *inode) raw_write_seqcount_end(&dentry->d_seq); __fsnotify_d_instantiate(dentry); } - _d_rehash(dentry); + if (d_unhashed(dentry)) + _d_rehash(dentry); if (dir) end_dir_add(dir, n); spin_unlock(&dentry->d_lock); @@ -2584,6 +2585,8 @@ static inline void __d_add(struct dentry *dentry, struct inode *inode) void d_add(struct dentry *entry, struct inode *inode) { + BUG_ON(!d_unhashed(entry)); + if (inode) { security_d_instantiate(entry, inode); spin_lock(&inode->i_lock); @@ -2986,8 +2989,6 @@ struct dentry *d_splice_alias(struct inode *inode, struct dentry *dentry) if (IS_ERR(inode)) return ERR_CAST(inode); - BUG_ON(!d_unhashed(dentry)); - if (!inode) goto out; -- 2.1.0 -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html