summaryrefslogtreecommitdiff
path: root/fs/ocfs2
diff options
context:
space:
mode:
authorTao Ma <boyu.mt@taobao.com>2010-12-20 16:21:11 +0800
committerJoel Becker <joel.becker@oracle.com>2010-12-22 18:34:42 -0800
commit1e6d9153df27923649976554d034a69ac7b28f95 (patch)
treedfb165957114d9cd6afd1ddbc316ff65d001bed1 /fs/ocfs2
parentcfc069d3fa24d7c6357e3b731e97f94db495bf0c (diff)
downloadlinux-3.10-1e6d9153df27923649976554d034a69ac7b28f95.tar.gz
linux-3.10-1e6d9153df27923649976554d034a69ac7b28f95.tar.bz2
linux-3.10-1e6d9153df27923649976554d034a69ac7b28f95.zip
ocfs2: Release buffer_head in case of error in ocfs2_double_lock.
In ocfs2_double_lock, when ocfs2_inode_lock for inode1 fails, we just unlock inode2 and return without releasing buffer we get from inode_lock(inode2). The good thing is that it is freed by the only caller ocfs2_rename when it exits. But I don't think this is a right way for error handling. We should free the buffer_head we get in ocfs2_double_lock before exit so that the caller doesn't need to take care of it. Signed-off-by: Tao Ma <boyu.mt@taobao.com> Signed-off-by: Joel Becker <joel.becker@oracle.com>
Diffstat (limited to 'fs/ocfs2')
-rw-r--r--fs/ocfs2/namei.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/fs/ocfs2/namei.c b/fs/ocfs2/namei.c
index ff5744e1e36..ca35f81a13b 100644
--- a/fs/ocfs2/namei.c
+++ b/fs/ocfs2/namei.c
@@ -1017,8 +1017,11 @@ static int ocfs2_double_lock(struct ocfs2_super *osb,
* An error return must mean that no cluster locks
* were held on function exit.
*/
- if (oi1->ip_blkno != oi2->ip_blkno)
+ if (oi1->ip_blkno != oi2->ip_blkno) {
ocfs2_inode_unlock(inode2, 1);
+ brelse(*bh2);
+ *bh2 = NULL;
+ }
if (status != -ENOENT)
mlog_errno(status);