diff options
author | Yan <yanzheng@21cn.com> | 2008-02-01 14:58:07 -0500 |
---|---|---|
committer | Chris Mason <chris.mason@oracle.com> | 2008-09-25 11:04:00 -0400 |
commit | 2f375ab9c55bf22bf77ed9e3082b93e77ea10f55 (patch) | |
tree | c51ceb5867351915e4466ecafbe88b8e8f575d89 /fs/btrfs/ctree.c | |
parent | 60cde612c8eb51ba79dabb4088f149c6a9802fdf (diff) |
Call btrfs_cow_block while lowering tree level.
When freeing root block of a tree, btrfs_free_extent' parameter
'ref_generation' is from root block itseft. When freeing non-root
block, 'ref_generation' is from its parent. so when converting a
non-root block to root block, we must guarantee its generation is
equal to its parent's generation.
Signed-off-by: Chris Mason <chris.mason@oracle.com>
Diffstat (limited to 'fs/btrfs/ctree.c')
-rw-r--r-- | fs/btrfs/ctree.c | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/fs/btrfs/ctree.c b/fs/btrfs/ctree.c index cf32651876bf..ef8809c1e69c 100644 --- a/fs/btrfs/ctree.c +++ b/fs/btrfs/ctree.c | |||
@@ -720,6 +720,9 @@ static int balance_level(struct btrfs_trans_handle *trans, | |||
720 | /* promote the child to a root */ | 720 | /* promote the child to a root */ |
721 | child = read_node_slot(root, mid, 0); | 721 | child = read_node_slot(root, mid, 0); |
722 | BUG_ON(!child); | 722 | BUG_ON(!child); |
723 | ret = btrfs_cow_block(trans, root, child, mid, 0, &child); | ||
724 | BUG_ON(ret); | ||
725 | |||
723 | root->node = child; | 726 | root->node = child; |
724 | path->nodes[level] = NULL; | 727 | path->nodes[level] = NULL; |
725 | clean_tree_block(trans, root, mid); | 728 | clean_tree_block(trans, root, mid); |