diff options
author | Sunil Mushran <sunil.mushran@oracle.com> | 2009-04-20 21:34:18 -0700 |
---|---|---|
committer | Joel Becker <joel.becker@oracle.com> | 2009-04-23 14:56:13 -0700 |
commit | a5a0a630922a2f6a774b6dac19f70cb5abd86bb0 (patch) | |
tree | 6f6106eff47a9d53971ad9fe7b408ac1ae8f12c5 /fs/ocfs2 | |
parent | 5b09b507daaa882d888b6cd78ee89ba9caace44b (diff) | |
download | lwn-a5a0a630922a2f6a774b6dac19f70cb5abd86bb0.tar.gz lwn-a5a0a630922a2f6a774b6dac19f70cb5abd86bb0.zip |
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>
Diffstat (limited to 'fs/ocfs2')
-rw-r--r-- | fs/ocfs2/dcache.c | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/fs/ocfs2/dcache.c b/fs/ocfs2/dcache.c index 7d604480557a..b574431a031d 100644 --- a/fs/ocfs2/dcache.c +++ b/fs/ocfs2/dcache.c @@ -290,6 +290,21 @@ out_attach: else 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); return ret; |