diff options
-rw-r--r-- | fs/btrfs/tree-log.c | 47 |
1 files changed, 25 insertions, 22 deletions
diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c index 964c583ea900..849b72985c74 100644 --- a/fs/btrfs/tree-log.c +++ b/fs/btrfs/tree-log.c | |||
@@ -2151,11 +2151,13 @@ static noinline int walk_down_log_tree(struct btrfs_trans_handle *trans, | |||
2151 | return ret; | 2151 | return ret; |
2152 | } | 2152 | } |
2153 | 2153 | ||
2154 | btrfs_tree_lock(next); | 2154 | if (trans) { |
2155 | btrfs_set_lock_blocking(next); | 2155 | btrfs_tree_lock(next); |
2156 | clean_tree_block(trans, root, next); | 2156 | btrfs_set_lock_blocking(next); |
2157 | btrfs_wait_tree_block_writeback(next); | 2157 | clean_tree_block(trans, root, next); |
2158 | btrfs_tree_unlock(next); | 2158 | btrfs_wait_tree_block_writeback(next); |
2159 | btrfs_tree_unlock(next); | ||
2160 | } | ||
2159 | 2161 | ||
2160 | WARN_ON(root_owner != | 2162 | WARN_ON(root_owner != |
2161 | BTRFS_TREE_LOG_OBJECTID); | 2163 | BTRFS_TREE_LOG_OBJECTID); |
@@ -2227,11 +2229,13 @@ static noinline int walk_up_log_tree(struct btrfs_trans_handle *trans, | |||
2227 | 2229 | ||
2228 | next = path->nodes[*level]; | 2230 | next = path->nodes[*level]; |
2229 | 2231 | ||
2230 | btrfs_tree_lock(next); | 2232 | if (trans) { |
2231 | btrfs_set_lock_blocking(next); | 2233 | btrfs_tree_lock(next); |
2232 | clean_tree_block(trans, root, next); | 2234 | btrfs_set_lock_blocking(next); |
2233 | btrfs_wait_tree_block_writeback(next); | 2235 | clean_tree_block(trans, root, next); |
2234 | btrfs_tree_unlock(next); | 2236 | btrfs_wait_tree_block_writeback(next); |
2237 | btrfs_tree_unlock(next); | ||
2238 | } | ||
2235 | 2239 | ||
2236 | WARN_ON(root_owner != BTRFS_TREE_LOG_OBJECTID); | 2240 | WARN_ON(root_owner != BTRFS_TREE_LOG_OBJECTID); |
2237 | ret = btrfs_free_and_pin_reserved_extent(root, | 2241 | ret = btrfs_free_and_pin_reserved_extent(root, |
@@ -2301,11 +2305,13 @@ static int walk_log_tree(struct btrfs_trans_handle *trans, | |||
2301 | 2305 | ||
2302 | next = path->nodes[orig_level]; | 2306 | next = path->nodes[orig_level]; |
2303 | 2307 | ||
2304 | btrfs_tree_lock(next); | 2308 | if (trans) { |
2305 | btrfs_set_lock_blocking(next); | 2309 | btrfs_tree_lock(next); |
2306 | clean_tree_block(trans, log, next); | 2310 | btrfs_set_lock_blocking(next); |
2307 | btrfs_wait_tree_block_writeback(next); | 2311 | clean_tree_block(trans, log, next); |
2308 | btrfs_tree_unlock(next); | 2312 | btrfs_wait_tree_block_writeback(next); |
2313 | btrfs_tree_unlock(next); | ||
2314 | } | ||
2309 | 2315 | ||
2310 | WARN_ON(log->root_key.objectid != | 2316 | WARN_ON(log->root_key.objectid != |
2311 | BTRFS_TREE_LOG_OBJECTID); | 2317 | BTRFS_TREE_LOG_OBJECTID); |
@@ -2608,13 +2614,10 @@ static void free_log_tree(struct btrfs_trans_handle *trans, | |||
2608 | .process_func = process_one_buffer | 2614 | .process_func = process_one_buffer |
2609 | }; | 2615 | }; |
2610 | 2616 | ||
2611 | if (trans) { | 2617 | ret = walk_log_tree(trans, log, &wc); |
2612 | ret = walk_log_tree(trans, log, &wc); | 2618 | /* I don't think this can happen but just in case */ |
2613 | 2619 | if (ret) | |
2614 | /* I don't think this can happen but just in case */ | 2620 | btrfs_abort_transaction(trans, log, ret); |
2615 | if (ret) | ||
2616 | btrfs_abort_transaction(trans, log, ret); | ||
2617 | } | ||
2618 | 2621 | ||
2619 | while (1) { | 2622 | while (1) { |
2620 | ret = find_first_extent_bit(&log->dirty_log_pages, | 2623 | ret = find_first_extent_bit(&log->dirty_log_pages, |