diff options
Diffstat (limited to 'fs/btrfs/ctree.c')
-rw-r--r-- | fs/btrfs/ctree.c | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/fs/btrfs/ctree.c b/fs/btrfs/ctree.c index 50aea8cb653a..f9cd40967d04 100644 --- a/fs/btrfs/ctree.c +++ b/fs/btrfs/ctree.c | |||
@@ -290,7 +290,6 @@ int noinline btrfs_cow_block(struct btrfs_trans_handle *trans, | |||
290 | struct extent_buffer **cow_ret, u64 prealloc_dest) | 290 | struct extent_buffer **cow_ret, u64 prealloc_dest) |
291 | { | 291 | { |
292 | u64 search_start; | 292 | u64 search_start; |
293 | u64 header_trans; | ||
294 | int ret; | 293 | int ret; |
295 | 294 | ||
296 | if (trans->transaction != root->fs_info->running_transaction) { | 295 | if (trans->transaction != root->fs_info->running_transaction) { |
@@ -304,9 +303,9 @@ int noinline btrfs_cow_block(struct btrfs_trans_handle *trans, | |||
304 | WARN_ON(1); | 303 | WARN_ON(1); |
305 | } | 304 | } |
306 | 305 | ||
307 | header_trans = btrfs_header_generation(buf); | ||
308 | spin_lock(&root->fs_info->hash_lock); | 306 | spin_lock(&root->fs_info->hash_lock); |
309 | if (header_trans == trans->transid && | 307 | if (btrfs_header_generation(buf) == trans->transid && |
308 | btrfs_header_owner(buf) == root->root_key.objectid && | ||
310 | !btrfs_header_flag(buf, BTRFS_HEADER_FLAG_WRITTEN)) { | 309 | !btrfs_header_flag(buf, BTRFS_HEADER_FLAG_WRITTEN)) { |
311 | *cow_ret = buf; | 310 | *cow_ret = buf; |
312 | spin_unlock(&root->fs_info->hash_lock); | 311 | spin_unlock(&root->fs_info->hash_lock); |
@@ -1300,6 +1299,7 @@ again: | |||
1300 | /* is a cow on this block not required */ | 1299 | /* is a cow on this block not required */ |
1301 | spin_lock(&root->fs_info->hash_lock); | 1300 | spin_lock(&root->fs_info->hash_lock); |
1302 | if (btrfs_header_generation(b) == trans->transid && | 1301 | if (btrfs_header_generation(b) == trans->transid && |
1302 | btrfs_header_owner(b) == root->root_key.objectid && | ||
1303 | !btrfs_header_flag(b, BTRFS_HEADER_FLAG_WRITTEN)) { | 1303 | !btrfs_header_flag(b, BTRFS_HEADER_FLAG_WRITTEN)) { |
1304 | spin_unlock(&root->fs_info->hash_lock); | 1304 | spin_unlock(&root->fs_info->hash_lock); |
1305 | goto cow_done; | 1305 | goto cow_done; |
@@ -1396,7 +1396,8 @@ cow_done: | |||
1396 | 1396 | ||
1397 | /* this is only true while dropping a snapshot */ | 1397 | /* this is only true while dropping a snapshot */ |
1398 | if (level == lowest_level) { | 1398 | if (level == lowest_level) { |
1399 | break; | 1399 | ret = 0; |
1400 | goto done; | ||
1400 | } | 1401 | } |
1401 | 1402 | ||
1402 | blocknr = btrfs_node_blockptr(b, slot); | 1403 | blocknr = btrfs_node_blockptr(b, slot); |