Skip to contentSkip to conversation

update nodatacow code

PATCH New Yan Zheng 1 participant 1 message Oct 27, 2008 Btrfs file system

lore
Share & tools
lore

Yan Zheng

author
#0 lore raw

PATCH 3/4 update nodatacow code

Hello,

This patch simplifies the nodatacow checker. If all references were created after the latest snapshot, then we can avoid COW safely. This patch also updates run_delalloc_nocow to do more fine-grained checking.

Regards

---

fs/btrfs/ctree.h +5 -3
diff -urp 3/fs/btrfs/ctree.h 4/fs/btrfs/ctree.h
@@ -445,6 +445,7 @@ struct btrfs_root_item {
 	__le64 bytenr;
 	__le64 byte_limit;
 	__le64 bytes_used;
+	__le64 last_snapshot;
 	__le32 flags;
 	__le32 refs;
 	struct btrfs_disk_key drop_progress;
@@ -1375,6 +1376,8 @@ BTRFS_SETGET_STACK_FUNCS(root_refs, stru
 BTRFS_SETGET_STACK_FUNCS(root_flags, struct btrfs_root_item, flags, 32);
 BTRFS_SETGET_STACK_FUNCS(root_used, struct btrfs_root_item, bytes_used, 64);
 BTRFS_SETGET_STACK_FUNCS(root_limit, struct btrfs_root_item, byte_limit, 64);
+BTRFS_SETGET_STACK_FUNCS(root_last_snapshot, struct btrfs_root_item,
+			 last_snapshot, 64);
 
 /* struct btrfs_super_block */
 BTRFS_SETGET_STACK_FUNCS(super_bytenr, struct btrfs_super_block, bytenr, 64);
@@ -1504,9 +1507,8 @@ int btrfs_update_pinned_extents(struct b
 				u64 bytenr, u64 num, int pin);
 int btrfs_drop_leaf_ref(struct btrfs_trans_handle *trans,
 			struct btrfs_root *root, struct extent_buffer *leaf);
-int btrfs_cross_ref_exists(struct btrfs_trans_handle *trans,
-			   struct btrfs_root *root,
-			   struct btrfs_key *key, u64 bytenr);
+int btrfs_cross_ref_exist(struct btrfs_trans_handle *trans,
+			  struct btrfs_root *root, u64 bytenr);
 int btrfs_extent_post_op(struct btrfs_trans_handle *trans,
 			 struct btrfs_root *root);
 int btrfs_copy_pinned(struct btrfs_root *root, struct extent_io_tree *copy);
fs/btrfs/extent-tree.c +18 -113

170 lines not on this page · raw message

fs/btrfs/inode.c +117 -81

225 lines not on this page · raw message

fs/btrfs/ordered-data.c +4 -3
diff -urp 3/fs/btrfs/ordered-data.c 4/fs/btrfs/ordered-data.c
@@ -165,7 +165,7 @@ static inline struct rb_node *tree_searc
  * inserted.
  */
 int btrfs_add_ordered_extent(struct inode *inode, u64 file_offset,
-			     u64 start, u64 len, int nocow)
+			     u64 start, u64 len, int type)
 {
 	struct btrfs_ordered_inode_tree *tree;
 	struct rb_node *node;
@@ -181,8 +181,9 @@ int btrfs_add_ordered_extent(struct inod
 	entry->start = start;
 	entry->len = len;
 	entry->inode = inode;
-	if (nocow)
-		set_bit(BTRFS_ORDERED_NOCOW, &entry->flags);
+
+	if (type == BTRFS_ORDERED_NOCOW)
+		set_bit(type, &entry->flags);
 
 	/* one ref for the tree */
 	atomic_set(&entry->refs, 1);
fs/btrfs/ordered-data.h +1 -1
diff -urp 3/fs/btrfs/ordered-data.h 4/fs/btrfs/ordered-data.h
@@ -127,7 +127,7 @@ int btrfs_remove_ordered_extent(struct i
 int btrfs_dec_test_ordered_pending(struct inode *inode,
 				       u64 file_offset, u64 io_size);
 int btrfs_add_ordered_extent(struct inode *inode, u64 file_offset,
-			     u64 start, u64 len, int nocow);
+			     u64 start, u64 len, int type);
 int btrfs_add_ordered_sum(struct inode *inode,
 			  struct btrfs_ordered_extent *entry,
 			  struct btrfs_ordered_sum *sum);
fs/btrfs/transaction.c +3 -0
diff -urp 3/fs/btrfs/transaction.c 4/fs/btrfs/transaction.c
@@ -751,6 +751,9 @@ static noinline int create_pending_snaps
 	if (ret)
 		goto fail;
 
+	btrfs_record_root_in_trans(root);
+	btrfs_set_root_last_snapshot(&root->root_item, trans->transid);
+
 	memcpy(new_root_item, &root->root_item, sizeof(*new_root_item));
 
 	key.objectid = objectid;