Btrfs: cleanup reserved space when freeing tree log on error
[pandora-kernel.git] / fs / btrfs / tree-log.c
index 964c583..849b729 100644 (file)
@@ -2151,11 +2151,13 @@ static noinline int walk_down_log_tree(struct btrfs_trans_handle *trans,
                                        return ret;
                                }
 
-                               btrfs_tree_lock(next);
-                               btrfs_set_lock_blocking(next);
-                               clean_tree_block(trans, root, next);
-                               btrfs_wait_tree_block_writeback(next);
-                               btrfs_tree_unlock(next);
+                               if (trans) {
+                                       btrfs_tree_lock(next);
+                                       btrfs_set_lock_blocking(next);
+                                       clean_tree_block(trans, root, next);
+                                       btrfs_wait_tree_block_writeback(next);
+                                       btrfs_tree_unlock(next);
+                               }
 
                                WARN_ON(root_owner !=
                                        BTRFS_TREE_LOG_OBJECTID);
@@ -2227,11 +2229,13 @@ static noinline int walk_up_log_tree(struct btrfs_trans_handle *trans,
 
                                next = path->nodes[*level];
 
-                               btrfs_tree_lock(next);
-                               btrfs_set_lock_blocking(next);
-                               clean_tree_block(trans, root, next);
-                               btrfs_wait_tree_block_writeback(next);
-                               btrfs_tree_unlock(next);
+                               if (trans) {
+                                       btrfs_tree_lock(next);
+                                       btrfs_set_lock_blocking(next);
+                                       clean_tree_block(trans, root, next);
+                                       btrfs_wait_tree_block_writeback(next);
+                                       btrfs_tree_unlock(next);
+                               }
 
                                WARN_ON(root_owner != BTRFS_TREE_LOG_OBJECTID);
                                ret = btrfs_free_and_pin_reserved_extent(root,
@@ -2301,11 +2305,13 @@ static int walk_log_tree(struct btrfs_trans_handle *trans,
 
                        next = path->nodes[orig_level];
 
-                       btrfs_tree_lock(next);
-                       btrfs_set_lock_blocking(next);
-                       clean_tree_block(trans, log, next);
-                       btrfs_wait_tree_block_writeback(next);
-                       btrfs_tree_unlock(next);
+                       if (trans) {
+                               btrfs_tree_lock(next);
+                               btrfs_set_lock_blocking(next);
+                               clean_tree_block(trans, log, next);
+                               btrfs_wait_tree_block_writeback(next);
+                               btrfs_tree_unlock(next);
+                       }
 
                        WARN_ON(log->root_key.objectid !=
                                BTRFS_TREE_LOG_OBJECTID);
@@ -2608,13 +2614,10 @@ static void free_log_tree(struct btrfs_trans_handle *trans,
                .process_func = process_one_buffer
        };
 
-       if (trans) {
-               ret = walk_log_tree(trans, log, &wc);
-
-               /* I don't think this can happen but just in case */
-               if (ret)
-                       btrfs_abort_transaction(trans, log, ret);
-       }
+       ret = walk_log_tree(trans, log, &wc);
+       /* I don't think this can happen but just in case */
+       if (ret)
+               btrfs_abort_transaction(trans, log, ret);
 
        while (1) {
                ret = find_first_extent_bit(&log->dirty_log_pages,