aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYan <yanzheng@21cn.com>2008-02-01 14:58:07 -0500
committerChris Mason <chris.mason@oracle.com>2008-09-25 11:04:00 -0400
commit2f375ab9c55bf22bf77ed9e3082b93e77ea10f55 (patch)
treec51ceb5867351915e4466ecafbe88b8e8f575d89
parent60cde612c8eb51ba79dabb4088f149c6a9802fdf (diff)
downloadkernel_samsung_smdk4412-2f375ab9c55bf22bf77ed9e3082b93e77ea10f55.zip
kernel_samsung_smdk4412-2f375ab9c55bf22bf77ed9e3082b93e77ea10f55.tar.gz
kernel_samsung_smdk4412-2f375ab9c55bf22bf77ed9e3082b93e77ea10f55.tar.bz2
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>
-rw-r--r--fs/btrfs/ctree.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/fs/btrfs/ctree.c b/fs/btrfs/ctree.c
index cf32651..ef8809c 100644
--- a/fs/btrfs/ctree.c
+++ b/fs/btrfs/ctree.c
@@ -720,6 +720,9 @@ static int balance_level(struct btrfs_trans_handle *trans,
/* promote the child to a root */
child = read_node_slot(root, mid, 0);
BUG_ON(!child);
+ ret = btrfs_cow_block(trans, root, child, mid, 0, &child);
+ BUG_ON(ret);
+
root->node = child;
path->nodes[level] = NULL;
clean_tree_block(trans, root, mid);