]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
ocfs2: fix mutex_unlock and possible memory leak in ocfs2_remove_btree_range
authorJoseph Qi <joseph.qi@huawei.com>
Wed, 19 Jun 2013 00:05:39 +0000 (10:05 +1000)
committerStephen Rothwell <sfr@canb.auug.org.au>
Wed, 19 Jun 2013 07:12:48 +0000 (17:12 +1000)
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: Joseph Qi <joseph.qi@huawei.com>
Reviewed-by: Jie Liu <jeff.liu@oracle.com>
Cc: Joel Becker <jlbec@evilplan.org>
Cc: Mark Fasheh <mfasheh@suse.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
fs/ocfs2/alloc.c

index b8a9d87231b1badec1fb31f27c84265ca708aa55..17e6bdde96c5e4707a29906e207e981761ca49c8 100644 (file)
@@ -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 @@ out_commit:
        ocfs2_commit_trans(osb, handle);
 out:
        mutex_unlock(&tl_inode->i_mutex);
-
+bail:
        if (meta_ac)
                ocfs2_free_alloc_context(meta_ac);