Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 33add0e3 authored by Joseph Qi's avatar Joseph Qi Committed by Linus Torvalds
Browse files

ocfs2: fix mutex_unlock and possible memory leak in ocfs2_remove_btree_range



In ocfs2_remove_btree_range, when calling ocfs2_lock_refcount_tree and
ocfs2_prepare_refcount_change_for_del failed, it goes to out and then
tries to call mutex_unlock without mutex_lock before.  And when calling
ocfs2_reserve_blocks_for_rec_trunc failed, it should free ref_tree
before return.

Signed-off-by: default avatarJoseph Qi <joseph.qi@huawei.com>
Reviewed-by: default avatarJie Liu <jeff.liu@oracle.com>
Cc: Joel Becker <jlbec@evilplan.org>
Cc: Mark Fasheh <mfasheh@suse.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 8fa9d17f
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -5655,7 +5655,7 @@ int ocfs2_remove_btree_range(struct inode *inode,
					       &ref_tree, NULL);
		if (ret) {
			mlog_errno(ret);
			goto out;
			goto bail;
		}

		ret = ocfs2_prepare_refcount_change_for_del(inode,
@@ -5666,7 +5666,7 @@ int ocfs2_remove_btree_range(struct inode *inode,
							    &extra_blocks);
		if (ret < 0) {
			mlog_errno(ret);
			goto out;
			goto bail;
		}
	}

@@ -5674,7 +5674,7 @@ int ocfs2_remove_btree_range(struct inode *inode,
						 extra_blocks);
	if (ret) {
		mlog_errno(ret);
		return ret;
		goto bail;
	}

	mutex_lock(&tl_inode->i_mutex);
@@ -5734,7 +5734,7 @@ int ocfs2_remove_btree_range(struct inode *inode,
	ocfs2_commit_trans(osb, handle);
out:
	mutex_unlock(&tl_inode->i_mutex);

bail:
	if (meta_ac)
		ocfs2_free_alloc_context(meta_ac);