diff options
Diffstat (limited to 'fs/ocfs2/dcache.c')
| -rw-r--r-- | fs/ocfs2/dcache.c | 12 | 
1 files changed, 12 insertions, 0 deletions
| diff --git a/fs/ocfs2/dcache.c b/fs/ocfs2/dcache.c index 2d016937fdda..42a61eecdacd 100644 --- a/fs/ocfs2/dcache.c +++ b/fs/ocfs2/dcache.c @@ -296,6 +296,18 @@ int ocfs2_dentry_attach_lock(struct dentry *dentry,  out_attach:  	spin_lock(&dentry_attach_lock); +	if (unlikely(dentry->d_fsdata && !alias)) { +		/* d_fsdata is set by a racing thread which is doing +		 * the same thing as this thread is doing. Leave the racing +		 * thread going ahead and we return here. +		 */ +		spin_unlock(&dentry_attach_lock); +		iput(dl->dl_inode); +		ocfs2_lock_res_free(&dl->dl_lockres); +		kfree(dl); +		return 0; +	} +  	dentry->d_fsdata = dl;  	dl->dl_count++;  	spin_unlock(&dentry_attach_lock); | 
