diff options
Diffstat (limited to 'fs/btrfs/transaction.c')
-rw-r--r-- | fs/btrfs/transaction.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c index 924af6f2aeac..968b84f17a19 100644 --- a/fs/btrfs/transaction.c +++ b/fs/btrfs/transaction.c | |||
@@ -430,7 +430,10 @@ static int update_cowonly_root(struct btrfs_trans_handle *trans, | |||
430 | u64 old_root_bytenr; | 430 | u64 old_root_bytenr; |
431 | struct btrfs_root *tree_root = root->fs_info->tree_root; | 431 | struct btrfs_root *tree_root = root->fs_info->tree_root; |
432 | 432 | ||
433 | btrfs_extent_post_op(trans, root); | ||
433 | btrfs_write_dirty_block_groups(trans, root); | 434 | btrfs_write_dirty_block_groups(trans, root); |
435 | btrfs_extent_post_op(trans, root); | ||
436 | |||
434 | while(1) { | 437 | while(1) { |
435 | old_root_bytenr = btrfs_root_bytenr(&root->root_item); | 438 | old_root_bytenr = btrfs_root_bytenr(&root->root_item); |
436 | if (old_root_bytenr == root->node->start) | 439 | if (old_root_bytenr == root->node->start) |
@@ -440,11 +443,15 @@ static int update_cowonly_root(struct btrfs_trans_handle *trans, | |||
440 | btrfs_set_root_level(&root->root_item, | 443 | btrfs_set_root_level(&root->root_item, |
441 | btrfs_header_level(root->node)); | 444 | btrfs_header_level(root->node)); |
442 | btrfs_set_root_generation(&root->root_item, trans->transid); | 445 | btrfs_set_root_generation(&root->root_item, trans->transid); |
446 | |||
447 | btrfs_extent_post_op(trans, root); | ||
448 | |||
443 | ret = btrfs_update_root(trans, tree_root, | 449 | ret = btrfs_update_root(trans, tree_root, |
444 | &root->root_key, | 450 | &root->root_key, |
445 | &root->root_item); | 451 | &root->root_item); |
446 | BUG_ON(ret); | 452 | BUG_ON(ret); |
447 | btrfs_write_dirty_block_groups(trans, root); | 453 | btrfs_write_dirty_block_groups(trans, root); |
454 | btrfs_extent_post_op(trans, root); | ||
448 | } | 455 | } |
449 | return 0; | 456 | return 0; |
450 | } | 457 | } |
@@ -459,15 +466,20 @@ int btrfs_commit_tree_roots(struct btrfs_trans_handle *trans, | |||
459 | struct list_head *next; | 466 | struct list_head *next; |
460 | struct extent_buffer *eb; | 467 | struct extent_buffer *eb; |
461 | 468 | ||
469 | btrfs_extent_post_op(trans, fs_info->tree_root); | ||
470 | |||
462 | eb = btrfs_lock_root_node(fs_info->tree_root); | 471 | eb = btrfs_lock_root_node(fs_info->tree_root); |
463 | btrfs_cow_block(trans, fs_info->tree_root, eb, NULL, 0, &eb, 0); | 472 | btrfs_cow_block(trans, fs_info->tree_root, eb, NULL, 0, &eb, 0); |
464 | btrfs_tree_unlock(eb); | 473 | btrfs_tree_unlock(eb); |
465 | free_extent_buffer(eb); | 474 | free_extent_buffer(eb); |
466 | 475 | ||
476 | btrfs_extent_post_op(trans, fs_info->tree_root); | ||
477 | |||
467 | while(!list_empty(&fs_info->dirty_cowonly_roots)) { | 478 | while(!list_empty(&fs_info->dirty_cowonly_roots)) { |
468 | next = fs_info->dirty_cowonly_roots.next; | 479 | next = fs_info->dirty_cowonly_roots.next; |
469 | list_del_init(next); | 480 | list_del_init(next); |
470 | root = list_entry(next, struct btrfs_root, dirty_list); | 481 | root = list_entry(next, struct btrfs_root, dirty_list); |
482 | |||
471 | update_cowonly_root(trans, root); | 483 | update_cowonly_root(trans, root); |
472 | } | 484 | } |
473 | return 0; | 485 | return 0; |