Skip to contentSkip to conversation

btrfs: track changes to tree blocks' key

PATCH New Yan, Zheng 1 participant 1 message May 11, 2010 Btrfs file system

lore
Share & tools
lore

Yan, Zheng

author
#0 lore raw

PATCH 2/5 btrfs: track changes to tree blocks' key

update key stored in back-reference after tree block's key changes.

---

fs/btrfs/ctree.c +60 -9
diff -urp 2/fs/btrfs/ctree.c 3/fs/btrfs/ctree.c
@@ -348,10 +348,8 @@ static noinline int update_ref_for_cow(s
 			BUG_ON(ret);
 		}
 		if (new_flags != 0) {
-			ret = btrfs_set_disk_extent_flags(trans, root,
-							  buf->start,
-							  buf->len,
-							  new_flags, 0);
+			ret = btrfs_update_tree_block_info(trans, root, buf,
+							   NULL, new_flags, 0);
 			BUG_ON(ret);
 		}
 	} else {
@@ -1126,6 +1124,10 @@ static noinline int balance_level(struct
 			btrfs_node_key(right, &right_key, 0);
 			btrfs_set_node_key(parent, &right_key, pslot + 1);
 			btrfs_mark_buffer_dirty(parent);
+
+			wret = btrfs_update_tree_block_key(trans, root,
+							right, &right_key);
+			BUG_ON(wret);
 		}
 	}
 	if (btrfs_header_nritems(mid) == 1) {
@@ -1167,6 +1169,10 @@ static noinline int balance_level(struct
 		btrfs_node_key(mid, &mid_key, 0);
 		btrfs_set_node_key(parent, &mid_key, pslot);
 		btrfs_mark_buffer_dirty(parent);
+
+		wret = btrfs_update_tree_block_key(trans, root,
+						mid, &mid_key);
+		BUG_ON(wret);
 	}
 
 	/* update the path */
@@ -1266,6 +1272,11 @@ static noinline int push_nodes_for_inser
 			btrfs_node_key(mid, &disk_key, 0);
 			btrfs_set_node_key(parent, &disk_key, pslot);
 			btrfs_mark_buffer_dirty(parent);
+
+			wret = btrfs_update_tree_block_key(trans, root,
+							mid, &disk_key);
+			BUG_ON(wret);
+
 			if (btrfs_header_nritems(left) > orig_slot) {
 				path->nodes[level] = left;
 				path->slots[level + 1] -= 1;
@@ -1318,6 +1329,10 @@ static noinline int push_nodes_for_inser
 			btrfs_set_node_key(parent, &disk_key, pslot + 1);
 			btrfs_mark_buffer_dirty(parent);
 
+			wret = btrfs_update_tree_block_key(trans, root,
+							right, &disk_key);
+			BUG_ON(wret);
+
 			if (btrfs_header_nritems(mid) <= orig_slot) {
 				path->nodes[level] = right;
 				path->slots[level + 1] += 1;
@@ -1893,6 +1908,8 @@ static int fixup_low_keys(struct btrfs_t
 		btrfs_mark_buffer_dirty(path->nodes[i]);
 		if (tslot != 0)
 			break;
+		ret = btrfs_update_tree_block_key(trans, root, t, key);
+		BUG_ON(ret);
 	}
 	return ret;
 }
@@ -1927,9 +1944,13 @@ int btrfs_set_item_key_safe(struct btrfs
 	btrfs_cpu_key_to_disk(&disk_key, new_key);
 	btrfs_set_item_key(eb, &disk_key, slot);
 	btrfs_mark_buffer_dirty(eb);
-	if (slot == 0)
+	if (slot == 0) {
+		int ret;
+		btrfs_set_path_blocking(path);
+		ret = btrfs_update_tree_block_key(trans, root, eb, &disk_key);
+		BUG_ON(ret);
 		fixup_low_keys(trans, root, path, &disk_key, 1);
-
+	}
 	return 0;
 }
 
@@ -2312,6 +2333,7 @@ static noinline int __push_leaf_right(st
 	struct extent_buffer *upper = path->nodes[1];
 	struct btrfs_disk_key disk_key;
 	int slot;
+	int ret;
 	u32 i;
 	int push_space = 0;
 	int push_items = 0;
@@ -2439,6 +2461,9 @@ static noinline int __push_leaf_right(st
 	btrfs_set_node_key(upper, &disk_key, slot + 1);
 	btrfs_mark_buffer_dirty(upper);
 
+	ret = btrfs_update_tree_block_key(trans, root, right, &disk_key);
+	BUG_ON(ret);
+
 	/* then fixup the leaf pointer in the path */
 	if (path->slots[0] >= left_nritems) {
 		path->slots[0] -= left_nritems;
@@ -2677,6 +2702,10 @@ static noinline int __push_leaf_left(str
 	if (right_nritems) {
 		btrfs_mark_buffer_dirty(right);
 		btrfs_item_key(right, &disk_key, 0);
+		wret = btrfs_update_tree_block_key(trans, root, right,
+						   &disk_key);
+		BUG_ON(wret);
+
 		wret = fixup_low_keys(trans, root, path, &disk_key, 1);
 		if (wret)
 			ret = wret;
@@ -3324,8 +3353,13 @@ int btrfs_truncate_item(struct btrfs_tra
 		offset = btrfs_disk_key_offset(&disk_key);
 		btrfs_set_disk_key_offset(&disk_key, offset + size_diff);
 		btrfs_set_item_key(leaf, &disk_key, slot);
-		if (slot == 0)
+		if (slot == 0) {
+			btrfs_set_path_blocking(path);
+			ret = btrfs_update_tree_block_key(trans, root,
+							leaf, &disk_key);
+			BUG_ON(ret);
 			fixup_low_keys(trans, root, path, &disk_key, 1);
+		}
 	}
 
 	item = btrfs_item_nr(leaf, slot);
@@ -3561,6 +3595,11 @@ int btrfs_insert_some_items(struct btrfs
 	ret = 0;
 	if (slot == 0) {
 		btrfs_cpu_key_to_disk(&disk_key, cpu_key);
+
+		btrfs_set_path_blocking(path);
+		ret = btrfs_update_tree_block_key(trans, root, leaf,
+						  &disk_key);
+		BUG_ON(ret);
 		ret = fixup_low_keys(trans, root, path, &disk_key, 1);
 	}
 
@@ -3669,6 +3708,11 @@ setup_items_for_insert(struct btrfs_tran
 	if (slot == 0) {
 		struct btrfs_disk_key disk_key;
 		btrfs_cpu_key_to_disk(&disk_key, cpu_key);
+
+		btrfs_set_path_blocking(path);
+		ret = btrfs_update_tree_block_key(trans, root, leaf,
+						  &disk_key);
+		BUG_ON(ret);
 		ret = fixup_low_keys(trans, root, path, &disk_key, 1);
 	}
 	btrfs_unlock_up_safe(path, 1);
@@ -3775,8 +3819,11 @@ static int del_ptr(struct btrfs_trans_ha
 		btrfs_set_header_level(root->node, 0);
 	} else if (slot == 0) {
 		struct btrfs_disk_key disk_key;
-
 		btrfs_node_key(parent, &disk_key, 0);
+
+		ret = btrfs_update_tree_block_key(trans, root, parent,
+						  &disk_key);
+		BUG_ON(ret);
 		wret = fixup_low_keys(trans, root, path, &disk_key, level + 1);
 		if (wret)
 			ret = wret;
@@ -3893,8 +3940,12 @@ int btrfs_del_items(struct btrfs_trans_h
 		int used = leaf_space_used(leaf, 0, nritems);
 		if (slot == 0) {
 			struct btrfs_disk_key disk_key;
-
 			btrfs_item_key(leaf, &disk_key, 0);
+
+			btrfs_set_path_blocking(path);
+			wret = btrfs_update_tree_block_key(trans, root,
+							leaf, &disk_key);
+			BUG_ON(wret);
 			wret = fixup_low_keys(trans, root, path,
 					      &disk_key, 1);
 			if (wret)
fs/btrfs/ctree.h +8 -3
diff -urp 2/fs/btrfs/ctree.h 3/fs/btrfs/ctree.h
@@ -2013,10 +2013,15 @@ int btrfs_inc_ref(struct btrfs_trans_han
 		  struct extent_buffer *buf, int full_backref);
 int btrfs_dec_ref(struct btrfs_trans_handle *trans, struct btrfs_root *root,
 		  struct extent_buffer *buf, int full_backref);
-int btrfs_set_disk_extent_flags(struct btrfs_trans_handle *trans,
+int btrfs_update_tree_block_key(struct btrfs_trans_handle *trans,
 				struct btrfs_root *root,
-				u64 bytenr, u64 num_bytes, u64 flags,
-				int is_data);
+				struct extent_buffer *eb,
+				struct btrfs_disk_key *key);
+int btrfs_update_tree_block_info(struct btrfs_trans_handle *trans,
+				 struct btrfs_root *root,
+				 struct extent_buffer *eb,
+				 struct btrfs_disk_key *key,
+				 u64 flags_to_set, int update_gen);
 int btrfs_free_extent(struct btrfs_trans_handle *trans,
 		      struct btrfs_root *root,
 		      u64 bytenr, u64 num_bytes, u64 parent,
fs/btrfs/delayed-ref.c +3 -0
diff -urp 2/fs/btrfs/delayed-ref.c 3/fs/btrfs/delayed-ref.c
@@ -509,6 +509,9 @@ update_existing_head_ref(struct btrfs_de
 				       sizeof(ref->extent_op->key));
 				existing_ref->extent_op->update_key = 1;
 			}
+			if (ref->extent_op->update_gen)
+				existing_ref->extent_op->update_gen = 1;
+
 			if (ref->extent_op->update_flags) {
 				existing_ref->extent_op->flags_to_set |=
 					ref->extent_op->flags_to_set;
fs/btrfs/delayed-ref.h +1 -0
diff -urp 2/fs/btrfs/delayed-ref.h 3/fs/btrfs/delayed-ref.h
@@ -58,6 +58,7 @@ struct btrfs_delayed_extent_op {
 	struct btrfs_disk_key key;
 	u64 flags_to_set;
 	unsigned int update_key:1;
+	unsigned int update_gen:1;
 	unsigned int update_flags:1;
 	unsigned int is_data:1;
 };
fs/btrfs/extent-tree.c +76 -36

237 lines not on this page · raw message