Skip to contentSkip to conversation

Progs: Remove offset field from struct btrfs_extent_ref

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

lore
Share & tools
lore

Yan Zheng

author
#0 lore raw

PATCH 1/1 Progs: Remove offset field from struct btrfs_extent_ref

The offset field in struct btrfs_extent_ref records the position inside file that file extent is referenced by. In the new back reference system, which tree leaves hold reference to file extent are recorded explicitly. we can scan these tree leaves, so the offset field is not useful.

This patch also makes the back reference system check the objectid when extents are in deleting.

---

btrfsck.c +10 -19
index c697aaf..494a7a7 100644
@@ -42,7 +42,6 @@ struct extent_backref {
 	u64 root;
 	u64 generation;
 	u64 owner;
-	u64 offset;
 	u32 num_refs;
 	u32 found_ref;
 	int found_extent_tree;
@@ -159,14 +158,13 @@ static int all_backpointers_checked(struct extent_record *rec, int print_errs)
 			if (!print_errs)
 				goto out;
 			fprintf(stderr, "Backref %llu parent %llu"
-				" [%llu %llu %llu %llu %lu]"
+				" [%llu %llu %llu %lu]"
 				" not found in extent tree\n",
 				(unsigned long long)rec->start,
 				(unsigned long long)back->parent,
 				(unsigned long long)back->root,
 				(unsigned long long)back->generation,
 				(unsigned long long)back->owner,
-				(unsigned long long)back->offset,
 				(unsigned long)back->num_refs);
 		}
 		if (!back->found_ref) {
@@ -174,14 +172,13 @@ static int all_backpointers_checked(struct extent_record *rec, int print_errs)
 			if (!print_errs)
 				goto out;
 			fprintf(stderr, "Backref %llu parent %llu"
-				" [%llu %llu %llu %llu %lu]"
+				" [%llu %llu %llu %lu]"
 				" not referenced\n",
 				(unsigned long long)rec->start,
 				(unsigned long long)back->parent,
 				(unsigned long long)back->root,
 				(unsigned long long)back->generation,
 				(unsigned long long)back->owner,
-				(unsigned long long)back->offset,
 				(unsigned long)back->num_refs);
 		}
 		if (back->found_ref != back->num_refs) {
@@ -277,14 +274,13 @@ static struct extent_backref *find_backref(struct extent_record *rec,
 
 static struct extent_backref *alloc_backref(struct extent_record *rec,
 					    u64 parent, u64 root, u64 gen,
-					    u64 owner, u64 owner_offset)
+					    u64 owner)
 {
 	struct extent_backref *ref = malloc(sizeof(*ref));
 	ref->parent = parent;
 	ref->root = root;
 	ref->generation = gen;
 	ref->owner = owner;
-	ref->offset = owner_offset;
 	ref->num_refs = 0;
 	ref->found_extent_tree = 0;
 	ref->found_ref = 0;
@@ -370,7 +366,7 @@ static int add_extent_rec(struct cache_tree *extent_cache,
 
 static int add_backref(struct cache_tree *extent_cache, u64 bytenr,
 		       u64 parent, u64 root, u64 gen, u64 owner,
-		       u64 owner_offset, u32 num_refs, int found_ref)
+		       u32 num_refs, int found_ref)
 {
 	struct extent_record *rec;
 	struct extent_backref *back;
@@ -390,21 +386,19 @@ static int add_backref(struct cache_tree *extent_cache, u64 bytenr,
 	}
 	back = find_backref(rec, parent, root, gen);
 	if (!back)
-		back = alloc_backref(rec, parent, root, gen, owner,
-				     owner_offset);
+		back = alloc_backref(rec, parent, root, gen, owner);
 
 	if (found_ref) {
 		if (back->found_ref > 0 &&
 		    back->owner < BTRFS_FIRST_FREE_OBJECTID) {
 			fprintf(stderr, "Extent back ref already exists "
 				"for %llu parent %llu root %llu gen %llu "
-				"owner %llu offset %llu num_refs %lu\n",
+				"owner %llu num_refs %lu\n",
 				(unsigned long long)parent,
 				(unsigned long long)bytenr,
 				(unsigned long long)root,
 				(unsigned long long)gen,
 				(unsigned long long)owner,
-				(unsigned long long)owner_offset,
 				(unsigned long)num_refs);
 		}
 		BUG_ON(num_refs != 1);
@@ -413,13 +407,12 @@ static int add_backref(struct cache_tree *extent_cache, u64 bytenr,
 		if (back->found_extent_tree) {
 			fprintf(stderr, "Extent back ref already exists "
 				"for %llu parent %llu root %llu gen %llu "
-				"owner %llu offset %llu num_refs %lu\n",
+				"owner %llu num_refs %lu\n",
 				(unsigned long long)parent,
 				(unsigned long long)bytenr,
 				(unsigned long long)root,
 				(unsigned long long)gen,
 				(unsigned long long)owner,
-				(unsigned long long)owner_offset,
 				(unsigned long)num_refs);
 		}
 		back->num_refs = num_refs;
@@ -620,7 +613,6 @@ static int run_next_block(struct btrfs_root *root,
 					btrfs_ref_root(buf, ref),
 					btrfs_ref_generation(buf, ref),
 					btrfs_ref_objectid(buf, ref),
-					btrfs_ref_offset(buf, ref),
 					btrfs_ref_num_refs(buf, ref), 0);
 				continue;
 			}
@@ -651,8 +643,7 @@ static int run_next_block(struct btrfs_root *root,
 				    buf->start,
 				    btrfs_header_owner(buf),
 				    btrfs_header_generation(buf),
-				    btrfs_disk_key_objectid(&disk_key),
-				    btrfs_disk_key_offset(&disk_key), 1, 1);
+				    btrfs_disk_key_objectid(&disk_key), 1, 1);
 			BUG_ON(ret);
 		}
 	} else {
@@ -671,7 +662,7 @@ static int run_next_block(struct btrfs_root *root,
 			add_backref(extent_cache, ptr, buf->start,
 				btrfs_header_owner(buf),
 				btrfs_header_generation(buf),
-				level - 1, 0, 1, 1);
+				level - 1, 1, 1);
 
 			if (level > 1) {
 				add_pending(nodes, seen, ptr, size);
@@ -705,7 +696,7 @@ static int add_root_to_pending(struct extent_buffer *buf,
 
 	add_backref(extent_cache, buf->start, buf->start, root_objectid,
 		    btrfs_header_generation(buf),
-		    btrfs_header_level(buf), 0, 1, 1);
+		    btrfs_header_level(buf), 1, 1);
 	return 0;
 }
 
ctree.c +10 -10
index 925cafa..84ebf2b 100644
@@ -182,7 +182,7 @@ int __btrfs_cow_block(struct btrfs_trans_handle *trans,
 					  buf->len, buf->start,
 					  root->root_key.objectid,
 					  btrfs_header_generation(buf),
-					  0, 0, 1);
+					  level, 1);
 		}
 		free_extent_buffer(buf);
 		add_root_to_dirty_list(root);
@@ -196,7 +196,7 @@ int __btrfs_cow_block(struct btrfs_trans_handle *trans,
 		WARN_ON(btrfs_header_generation(parent) != trans->transid);
 		btrfs_free_extent(trans, root, buf->start, buf->len,
 				  parent_start, btrfs_header_owner(parent),
-				  btrfs_header_generation(parent), 0, 0, 1);
+				  btrfs_header_generation(parent), level, 1);
 	}
 	free_extent_buffer(buf);
 	btrfs_mark_buffer_dirty(cow);
@@ -694,8 +694,7 @@ static int balance_level(struct btrfs_trans_handle *trans,
 		ret = btrfs_update_extent_ref(trans, root, child->start,
 					      mid->start, child->start,
 					      root->root_key.objectid,
-					      trans->transid,
-					      level - 1, 0);
+					      trans->transid, level - 1);
 		BUG_ON(ret);
 
 		add_root_to_dirty_list(root);
@@ -706,7 +705,8 @@ static int balance_level(struct btrfs_trans_handle *trans,
 		free_extent_buffer(mid);
 		ret = btrfs_free_extent(trans, root, mid->start, mid->len,
 					mid->start, root->root_key.objectid,
-					btrfs_header_generation(mid), 0, 0, 1);
+					btrfs_header_generation(mid),
+					level, 1);
 		/* once for the root ptr */
 		free_extent_buffer(mid);
 		return ret;
@@ -770,7 +770,7 @@ static int balance_level(struct btrfs_trans_handle *trans,
 			wret = btrfs_free_extent(trans, root, bytenr,
 						 blocksize, parent->start,
 						 btrfs_header_owner(parent),
-						 generation, 0, 0, 1);
+						 generation, level, 1);
 			if (wret)
 				ret = wret;
 		} else {
@@ -818,7 +818,7 @@ static int balance_level(struct btrfs_trans_handle *trans,
 		wret = btrfs_free_extent(trans, root, bytenr, blocksize,
 					 parent->start,
 					 btrfs_header_owner(parent),
-					 root_gen, 0, 0, 1);
+					 root_gen, level, 1);
 		if (wret)
 			ret = wret;
 	} else {
@@ -1411,7 +1411,7 @@ static int noinline insert_new_root(struct btrfs_trans_handle *trans,
 	ret = btrfs_update_extent_ref(trans, root, lower->start,
 				      lower->start, c->start,
 				      root->root_key.objectid,
-				      trans->transid, level - 1, 0);
+				      trans->transid, level - 1);
 	BUG_ON(ret);
 
 	/* the super has an extra ref to root->node */
@@ -2520,7 +2520,7 @@ int btrfs_del_items(struct btrfs_trans_handle *trans, struct btrfs_root *root,
 					 leaf->start, leaf->len,
 					 path->nodes[1]->start,
 					 btrfs_header_owner(path->nodes[1]),
-					 root_gen, 0, 0, 1);
+					 root_gen, 0, 1);
 			if (wret)
 				ret = wret;
 		}
@@ -2575,7 +2575,7 @@ int btrfs_del_items(struct btrfs_trans_handle *trans, struct btrfs_root *root,
 				wret = btrfs_free_extent(trans, root, bytenr,
 					     blocksize, path->nodes[1]->start,
 					     btrfs_header_owner(path->nodes[1]),
-					     root_gen, 0, 0, 1);
+					     root_gen, 0, 1);
 				if (wret)
 					ret = wret;
 			} else {
ctree.h +4 -18
index fe5f2bf..90bd940 100644
@@ -351,7 +351,6 @@ struct btrfs_extent_ref {
 	__le64 root;
 	__le64 generation;
 	__le64 objectid;
-	__le64 offset;
 	__le32 num_refs;
 } __attribute__ ((__packed__));
 
@@ -921,7 +920,6 @@ static inline u8 *btrfs_dev_extent_chunk_tree_uuid(struct btrfs_dev_extent *dev)
 BTRFS_SETGET_FUNCS(ref_root, struct btrfs_extent_ref, root, 64);
 BTRFS_SETGET_FUNCS(ref_generation, struct btrfs_extent_ref, generation, 64);
 BTRFS_SETGET_FUNCS(ref_objectid, struct btrfs_extent_ref, objectid, 64);
-BTRFS_SETGET_FUNCS(ref_offset, struct btrfs_extent_ref, offset, 64);
 BTRFS_SETGET_FUNCS(ref_num_refs, struct btrfs_extent_ref, num_refs, 32);
 
 BTRFS_SETGET_STACK_FUNCS(stack_ref_root, struct btrfs_extent_ref, root, 64);
@@ -929,8 +927,6 @@ BTRFS_SETGET_STACK_FUNCS(stack_ref_generation, struct btrfs_extent_ref,
 			 generation, 64);
 BTRFS_SETGET_STACK_FUNCS(stack_ref_objectid, struct btrfs_extent_ref,
 			 objectid, 64);
-BTRFS_SETGET_STACK_FUNCS(stack_ref_offset, struct btrfs_extent_ref,
-			 offset, 64);
 BTRFS_SETGET_STACK_FUNCS(stack_ref_num_refs, struct btrfs_extent_ref,
 			 num_refs, 32);
 
@@ -1323,21 +1319,11 @@ struct extent_buffer *btrfs_alloc_free_block(struct btrfs_trans_handle *trans,
 					     int level,
 					     u64 hint,
 					     u64 empty_size);
-int btrfs_grow_extent_tree(struct btrfs_trans_handle *trans,
-			   struct btrfs_root *root, u64 new_size);
-int btrfs_shrink_extent_tree(struct btrfs_root *root, u64 new_size);
-int btrfs_insert_extent_backref(struct btrfs_trans_handle *trans,
-				 struct btrfs_root *root,
-				 struct btrfs_path *path,
-				 u64 bytenr, u64 parent,
-				 u64 root_objectid, u64 ref_generation,
-				 u64 owner, u64 owner_offset);
 int btrfs_alloc_extent(struct btrfs_trans_handle *trans,
 		       struct btrfs_root *root,
 		       u64 num_bytes, u64 parent,
 		       u64 root_objectid, u64 ref_generation,
-		       u64 owner, u64 owner_offset,
-		       u64 empty_size, u64 hint_byte,
+		       u64 owner, u64 empty_size, u64 hint_byte,
 		       u64 search_end, struct btrfs_key *ins, int data);
 int btrfs_inc_ref(struct btrfs_trans_handle *trans, struct btrfs_root *root,
 		  struct extent_buffer *orig_buf, struct extent_buffer *buf,
@@ -1348,7 +1334,7 @@ int btrfs_update_ref(struct btrfs_trans_handle *trans,
 int btrfs_free_extent(struct btrfs_trans_handle *trans, struct btrfs_root
 		      *root, u64 bytenr, u64 num_bytes, u64 parent,
 		      u64 root_objectid, u64 ref_generation,
-		      u64 owner_objectid, u64 owner_offset, int pin);
+		      u64 owner_objectid, int pin);
 int btrfs_finish_extent_commit(struct btrfs_trans_handle *trans,
 			       struct btrfs_root *root,
 			       struct extent_io_tree *unpin);
@@ -1356,12 +1342,12 @@ int btrfs_inc_extent_ref(struct btrfs_trans_handle *trans,
 				struct btrfs_root *root,
 				u64 bytenr, u64 num_bytes, u64 parent,
 				u64 root_objectid, u64 ref_generation,
-				u64 owner, u64 owner_offset);
+				u64 owner_objectid);
 int btrfs_update_extent_ref(struct btrfs_trans_handle *trans,
 			    struct btrfs_root *root, u64 bytenr,
 			    u64 orig_parent, u64 parent,
 			    u64 root_objectid, u64 ref_generation,
-			    u64 owner_objectid, u64 owner_offset);
+			    u64 owner_objectid);
 int btrfs_write_dirty_block_groups(struct btrfs_trans_handle *trans,
 				    struct btrfs_root *root);
 int btrfs_free_block_groups(struct btrfs_fs_info *info);
debug-tree.c +1 -2
index de295df..885962b 100644
@@ -58,13 +58,12 @@ static void print_extent_leaf(struct btrfs_root *root, struct extent_buffer *l)
 		case BTRFS_EXTENT_REF_KEY:
 			ref = btrfs_item_ptr(l, i, struct btrfs_extent_ref);
 			printf("%llu %llu extent back ref root %llu gen %llu "
-			       "owner %llu offset %llu num_refs %lu\n",
+			       "owner %llu num_refs %lu\n",
 			       (unsigned long long)last,
 			       (unsigned long long)last_len,
 			       (unsigned long long)btrfs_ref_root(l, ref),
 			       (unsigned long long)btrfs_ref_generation(l, ref),
 			       (unsigned long long)btrfs_ref_objectid(l, ref),
-			       (unsigned long long)btrfs_ref_offset(l, ref),
 			       (unsigned long)btrfs_ref_num_refs(l, ref));
 			break;
 		};
extent-tree.c +45 -65

335 lines not on this page · raw message

print-tree.c +1 -2
index ef85ef9..6c82c8a 100644
@@ -213,11 +213,10 @@ void btrfs_print_leaf(struct btrfs_root *root, struct extent_buffer *l)
 		case BTRFS_EXTENT_REF_KEY:
 			ref = btrfs_item_ptr(l, i, struct btrfs_extent_ref);
 			printf("\t\textent back ref root %llu gen %llu "
-			       "owner %llu offset %llu, num_refs %lu\n",
+			       "owner %llu num_refs %lu\n",
 			       (unsigned long long)btrfs_ref_root(l, ref),
 			       (unsigned long long)btrfs_ref_generation(l, ref),
 			       (unsigned long long)btrfs_ref_objectid(l, ref),
-			       (unsigned long long)btrfs_ref_offset(l, ref),
 			       (unsigned long)btrfs_ref_num_refs(l, ref));
 			break;
 		case BTRFS_CSUM_ITEM_KEY:
utils.c +0 -1
index 99223fb..d2cbebc 100644
@@ -225,7 +225,6 @@ int make_btrfs(int fd, const char *device, const char *label,
 		btrfs_set_ref_root(buf, extent_ref, ref_root);
 		btrfs_set_ref_generation(buf, extent_ref, 1);
 		btrfs_set_ref_objectid(buf, extent_ref, 0);
-		btrfs_set_ref_offset(buf, extent_ref, 0);
 		btrfs_set_ref_num_refs(buf, extent_ref, 1);
 		nritems++;
 	}