ocfs2: Add missing iput() during error handling in ocfs2_dentry_attach_lock()
In ocfs2_dentry_attach_lock(), if unable to get the dentry lock, we need to call iput(inode) because a failure here means no d_instantiate(), which means the normally matching iput() will not be called during dput(dentry). This patch fixes the oops that accompanies the following message: (3996,1):dlm_empty_lockres:2708 ERROR: lockres W00000000000000000a1046b06a4382 still has local locks! kernel BUG in dlm_empty_lockres at /rpmbuild/smushran/BUILD/ocfs2-1.4.2/fs/ocfs2/dlm/dlmmaster.c:2709! Signed-off-by: Sunil Mushran <sunil.mushran@oracle.com> Signed-off-by: Joel Becker <joel.becker@oracle.com>
This commit is contained in:
parent
5b09b507da
commit
a5a0a63092
|
@ -290,6 +290,21 @@ out_attach:
|
||||||
else
|
else
|
||||||
mlog_errno(ret);
|
mlog_errno(ret);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* In case of error, manually free the allocation and do the iput().
|
||||||
|
* We need to do this because error here means no d_instantiate(),
|
||||||
|
* which means iput() will not be called during dput(dentry).
|
||||||
|
*/
|
||||||
|
if (ret < 0 && !alias) {
|
||||||
|
ocfs2_lock_res_free(&dl->dl_lockres);
|
||||||
|
BUG_ON(dl->dl_count != 1);
|
||||||
|
spin_lock(&dentry_attach_lock);
|
||||||
|
dentry->d_fsdata = NULL;
|
||||||
|
spin_unlock(&dentry_attach_lock);
|
||||||
|
kfree(dl);
|
||||||
|
iput(inode);
|
||||||
|
}
|
||||||
|
|
||||||
dput(alias);
|
dput(alias);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
|
Loading…
Reference in New Issue