linux-btrfs.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 1/6] btrfs-progs: Use fs_info instead of root for BTRFS_LEAF_DATA_SIZE
@ 2018-01-26  3:22 Gu Jinxiang
  2018-01-26  3:22 ` [PATCH 2/6] btrfs-progs: Use fs_info instead of root for BTRFS_NODEPTRS_PER_BLOCK Gu Jinxiang
                   ` (5 more replies)
  0 siblings, 6 replies; 15+ messages in thread
From: Gu Jinxiang @ 2018-01-26  3:22 UTC (permalink / raw)
  To: linux-btrfs

Do a cleanup. Also make it consistent with kernel.
Use fs_info instead of root for BTRFS_LEAF_DATA_SIZE, since
maybe in some situation we do not know root, but just know fs_info.

Signed-off-by: Gu Jinxiang <gujx@cn.fujitsu.com>
---
 cmds-check.c              |  6 +++---
 convert/source-ext2.c     |  2 +-
 convert/source-reiserfs.c |  4 ++--
 ctree.c                   | 49 +++++++++++++++++++++++++++--------------------
 ctree.h                   | 10 ++++++----
 file-item.c               |  2 +-
 volumes.c                 |  2 +-
 7 files changed, 42 insertions(+), 33 deletions(-)

diff --git a/cmds-check.c b/cmds-check.c
index 7d6bbb07..b118ea71 100644
--- a/cmds-check.c
+++ b/cmds-check.c
@@ -7255,9 +7255,9 @@ again:
 		unsigned int shift = 0, offset;
 
 		if (i == 0 && btrfs_item_end_nr(buf, i) !=
-		    BTRFS_LEAF_DATA_SIZE(root)) {
+		    BTRFS_LEAF_DATA_SIZE(root->fs_info)) {
 			if (btrfs_item_end_nr(buf, i) >
-			    BTRFS_LEAF_DATA_SIZE(root)) {
+			    BTRFS_LEAF_DATA_SIZE(root->fs_info)) {
 				ret = delete_bogus_item(root, path, buf, i);
 				if (!ret)
 					goto again;
@@ -7266,7 +7266,7 @@ again:
 				ret = -EIO;
 				break;
 			}
-			shift = BTRFS_LEAF_DATA_SIZE(root) -
+			shift = BTRFS_LEAF_DATA_SIZE(root->fs_info) -
 				btrfs_item_end_nr(buf, i);
 		} else if (i > 0 && btrfs_item_end_nr(buf, i) !=
 			   btrfs_item_offset_nr(buf, i - 1)) {
diff --git a/convert/source-ext2.c b/convert/source-ext2.c
index e9277213..e5c2a943 100644
--- a/convert/source-ext2.c
+++ b/convert/source-ext2.c
@@ -520,7 +520,7 @@ static int ext2_copy_single_xattr(struct btrfs_trans_handle *trans,
 	}
 	strncpy(namebuf, xattr_prefix_table[name_index], XATTR_NAME_MAX);
 	strncat(namebuf, EXT2_EXT_ATTR_NAME(entry), entry->e_name_len);
-	if (name_len + datalen > BTRFS_LEAF_DATA_SIZE(root) -
+	if (name_len + datalen > BTRFS_LEAF_DATA_SIZE(root->fs_info) -
 	    sizeof(struct btrfs_item) - sizeof(struct btrfs_dir_item)) {
 		fprintf(stderr, "skip large xattr on inode %Lu name %.*s\n",
 			objectid - INO_OFFSET, name_len, namebuf);
diff --git a/convert/source-reiserfs.c b/convert/source-reiserfs.c
index be79d8e2..e3582bda 100644
--- a/convert/source-reiserfs.c
+++ b/convert/source-reiserfs.c
@@ -676,7 +676,7 @@ static int reiserfs_xattr_indirect_fn(reiserfs_filsys_t fs, u64 position,
 	size_t alloc = min(position + num_blocks * fs->fs_blocksize, size);
 	char *body;
 
-	if (size > BTRFS_LEAF_DATA_SIZE(xa_data->root) -
+	if (size > BTRFS_LEAF_DATA_SIZE(xa_data->root->fs_info) -
 	    sizeof(struct btrfs_item) - sizeof(struct btrfs_dir_item)) {
 		fprintf(stderr, "skip large xattr on objectid %llu name %.*s\n",
 			xa_data->target_oid, (int)xa_data->namelen,
@@ -714,7 +714,7 @@ static int reiserfs_xattr_direct_fn(reiserfs_filsys_t fs, __u64 position,
 	struct reiserfs_xattr_data *xa_data = data;
 	char *newbody;
 
-	if (size > BTRFS_LEAF_DATA_SIZE(xa_data->root) -
+	if (size > BTRFS_LEAF_DATA_SIZE(xa_data->root->fs_info) -
 	    sizeof(struct btrfs_item) - sizeof(struct btrfs_dir_item)) {
 		fprintf(stderr, "skip large xattr on objectid %llu name %.*s\n",
 			xa_data->target_oid, (int)xa_data->namelen,
diff --git a/ctree.c b/ctree.c
index f4cf006b..cb16c42c 100644
--- a/ctree.c
+++ b/ctree.c
@@ -415,7 +415,7 @@ static inline unsigned int leaf_data_end(struct btrfs_root *root,
 {
 	u32 nr = btrfs_header_nritems(leaf);
 	if (nr == 0)
-		return BTRFS_LEAF_DATA_SIZE(root);
+		return BTRFS_LEAF_DATA_SIZE(root->fs_info);
 	return btrfs_item_offset_nr(leaf, nr - 1);
 }
 
@@ -517,24 +517,26 @@ btrfs_check_leaf(struct btrfs_root *root, struct btrfs_disk_key *parent_key,
 			goto fail;
 		}
 		if (i == 0 && btrfs_item_end_nr(buf, i) !=
-		    BTRFS_LEAF_DATA_SIZE(root)) {
+		    BTRFS_LEAF_DATA_SIZE(root->fs_info)) {
 			ret = BTRFS_TREE_BLOCK_INVALID_OFFSETS;
 			fprintf(stderr, "bad item end %u wanted %u\n",
 				btrfs_item_end_nr(buf, i),
-				(unsigned)BTRFS_LEAF_DATA_SIZE(root));
+				(unsigned)BTRFS_LEAF_DATA_SIZE(root->fs_info));
 			goto fail;
 		}
 	}
 
 	for (i = 0; i < nritems; i++) {
-		if (btrfs_item_end_nr(buf, i) > BTRFS_LEAF_DATA_SIZE(root)) {
+		if (btrfs_item_end_nr(buf, i) >
+				BTRFS_LEAF_DATA_SIZE(root->fs_info)) {
 			btrfs_item_key(buf, &key, 0);
 			btrfs_print_key(&key);
 			fflush(stdout);
 			ret = BTRFS_TREE_BLOCK_INVALID_OFFSETS;
 			fprintf(stderr, "slot end outside of leaf %llu > %llu\n",
 				(unsigned long long)btrfs_item_end_nr(buf, i),
-				(unsigned long long)BTRFS_LEAF_DATA_SIZE(root));
+				(unsigned long long)BTRFS_LEAF_DATA_SIZE(
+					root->fs_info));
 			goto fail;
 		}
 	}
@@ -1621,7 +1623,7 @@ static int leaf_space_used(struct extent_buffer *l, int start, int nr)
  */
 int btrfs_leaf_free_space(struct btrfs_root *root, struct extent_buffer *leaf)
 {
-	u32 nodesize = (root ? BTRFS_LEAF_DATA_SIZE(root) : leaf->len);
+	u32 nodesize = (root ? BTRFS_LEAF_DATA_SIZE(root->fs_info) : leaf->len);
 	int nritems = btrfs_header_nritems(leaf);
 	int ret;
 	ret = nodesize - leaf_space_used(leaf, 0, nritems);
@@ -1742,11 +1744,11 @@ static int push_leaf_right(struct btrfs_trans_handle *trans, struct btrfs_root
 	memmove_extent_buffer(right,
 			      btrfs_leaf_data(right) + data_end - push_space,
 			      btrfs_leaf_data(right) + data_end,
-			      BTRFS_LEAF_DATA_SIZE(root) - data_end);
+			      BTRFS_LEAF_DATA_SIZE(root->fs_info) - data_end);
 
 	/* copy from the left data area */
 	copy_extent_buffer(right, left, btrfs_leaf_data(right) +
-		     BTRFS_LEAF_DATA_SIZE(root) - push_space,
+		     BTRFS_LEAF_DATA_SIZE(root->fs_info) - push_space,
 		     btrfs_leaf_data(left) + leaf_data_end(root, left),
 		     push_space);
 
@@ -1762,7 +1764,7 @@ static int push_leaf_right(struct btrfs_trans_handle *trans, struct btrfs_root
 	/* update the item pointers */
 	right_nritems += push_items;
 	btrfs_set_header_nritems(right, right_nritems);
-	push_space = BTRFS_LEAF_DATA_SIZE(root);
+	push_space = BTRFS_LEAF_DATA_SIZE(root->fs_info);
 	for (i = 0; i < right_nritems; i++) {
 		item = btrfs_item_nr(i);
 		push_space -= btrfs_item_size(right, item);
@@ -1881,7 +1883,7 @@ static int push_leaf_left(struct btrfs_trans_handle *trans, struct btrfs_root
 			   btrfs_item_nr_offset(0),
 			   push_items * sizeof(struct btrfs_item));
 
-	push_space = BTRFS_LEAF_DATA_SIZE(root) -
+	push_space = BTRFS_LEAF_DATA_SIZE(root->fs_info) -
 		     btrfs_item_offset_nr(right, push_items -1);
 
 	copy_extent_buffer(left, right, btrfs_leaf_data(left) +
@@ -1899,7 +1901,8 @@ static int push_leaf_left(struct btrfs_trans_handle *trans, struct btrfs_root
 		item = btrfs_item_nr(i);
 		ioff = btrfs_item_offset(left, item);
 		btrfs_set_item_offset(left, item,
-		      ioff - (BTRFS_LEAF_DATA_SIZE(root) - old_left_item_size));
+		      ioff - (BTRFS_LEAF_DATA_SIZE(root->fs_info) -
+			      old_left_item_size));
 	}
 	btrfs_set_header_nritems(left, old_left_nritems + push_items);
 
@@ -1913,7 +1916,8 @@ static int push_leaf_left(struct btrfs_trans_handle *trans, struct btrfs_root
 		push_space = btrfs_item_offset_nr(right, push_items - 1) -
 						  leaf_data_end(root, right);
 		memmove_extent_buffer(right, btrfs_leaf_data(right) +
-				      BTRFS_LEAF_DATA_SIZE(root) - push_space,
+				      BTRFS_LEAF_DATA_SIZE(root->fs_info) -
+				      push_space,
 				      btrfs_leaf_data(right) +
 				      leaf_data_end(root, right), push_space);
 
@@ -1924,7 +1928,7 @@ static int push_leaf_left(struct btrfs_trans_handle *trans, struct btrfs_root
 	}
 	right_nritems -= push_items;
 	btrfs_set_header_nritems(right, right_nritems);
-	push_space = BTRFS_LEAF_DATA_SIZE(root);
+	push_space = BTRFS_LEAF_DATA_SIZE(root->fs_info);
 	for (i = 0; i < right_nritems; i++) {
 		item = btrfs_item_nr(i);
 		push_space = push_space - btrfs_item_size(right, item);
@@ -1981,11 +1985,12 @@ static noinline int copy_for_split(struct btrfs_trans_handle *trans,
 			   nritems * sizeof(struct btrfs_item));
 
 	copy_extent_buffer(right, l,
-		     btrfs_leaf_data(right) + BTRFS_LEAF_DATA_SIZE(root) -
+		     btrfs_leaf_data(right) +
+		     BTRFS_LEAF_DATA_SIZE(root->fs_info) -
 		     data_copy_size, btrfs_leaf_data(l) +
 		     leaf_data_end(root, l), data_copy_size);
 
-	rt_data_off = BTRFS_LEAF_DATA_SIZE(root) -
+	rt_data_off = BTRFS_LEAF_DATA_SIZE(root->fs_info) -
 		      btrfs_item_end_nr(l, mid);
 
 	for (i = 0; i < nritems; i++) {
@@ -2046,7 +2051,7 @@ static noinline int split_leaf(struct btrfs_trans_handle *trans,
 	l = path->nodes[0];
 	slot = path->slots[0];
 	if (extend && data_size + btrfs_item_size_nr(l, slot) +
-	    sizeof(struct btrfs_item) > BTRFS_LEAF_DATA_SIZE(root))
+	    sizeof(struct btrfs_item) > BTRFS_LEAF_DATA_SIZE(root->fs_info))
 		return -EOVERFLOW;
 
 	/* first try to make some room by pushing left and right */
@@ -2081,21 +2086,22 @@ again:
 	if (mid <= slot) {
 		if (nritems == 1 ||
 		    leaf_space_used(l, mid, nritems - mid) + data_size >
-			BTRFS_LEAF_DATA_SIZE(root)) {
+			BTRFS_LEAF_DATA_SIZE(root->fs_info)) {
 			if (slot >= nritems) {
 				split = 0;
 			} else {
 				mid = slot;
 				if (mid != nritems &&
 				    leaf_space_used(l, mid, nritems - mid) +
-				    data_size > BTRFS_LEAF_DATA_SIZE(root)) {
+				    data_size >
+				    BTRFS_LEAF_DATA_SIZE(root->fs_info)) {
 					split = 2;
 				}
 			}
 		}
 	} else {
 		if (leaf_space_used(l, 0, mid) + data_size >
-			BTRFS_LEAF_DATA_SIZE(root)) {
+			BTRFS_LEAF_DATA_SIZE(root->fs_info)) {
 			if (!extend && data_size && slot == 0) {
 				split = 0;
 			} else if ((extend || !data_size) && slot == 0) {
@@ -2104,7 +2110,8 @@ again:
 				mid = slot;
 				if (mid != nritems &&
 				    leaf_space_used(l, mid, nritems - mid) +
-				    data_size > BTRFS_LEAF_DATA_SIZE(root)) {
+				    data_size >
+				    BTRFS_LEAF_DATA_SIZE(root->fs_info)) {
 					split = 2 ;
 				}
 			}
@@ -2729,7 +2736,7 @@ int btrfs_del_items(struct btrfs_trans_handle *trans, struct btrfs_root *root,
 		}
 
 		/* delete the leaf if it is mostly empty */
-		if (used < BTRFS_LEAF_DATA_SIZE(root) / 4) {
+		if (used < BTRFS_LEAF_DATA_SIZE(root->fs_info) / 4) {
 			/* push_leaf_left fixes the path.
 			 * make sure the path still points to our leaf
 			 * for possible call to del_ptr below
diff --git a/ctree.h b/ctree.h
index ef422ea6..11913efa 100644
--- a/ctree.h
+++ b/ctree.h
@@ -360,11 +360,12 @@ struct btrfs_header {
 			        sizeof(struct btrfs_header)) / \
 			        sizeof(struct btrfs_key_ptr))
 #define __BTRFS_LEAF_DATA_SIZE(bs) ((bs) - sizeof(struct btrfs_header))
-#define BTRFS_LEAF_DATA_SIZE(r) (__BTRFS_LEAF_DATA_SIZE(r->fs_info->nodesize))
-#define BTRFS_MAX_INLINE_DATA_SIZE(r) (BTRFS_LEAF_DATA_SIZE(r) - \
+#define BTRFS_LEAF_DATA_SIZE(fs_info) \
+				(__BTRFS_LEAF_DATA_SIZE(fs_info->nodesize))
+#define BTRFS_MAX_INLINE_DATA_SIZE(r) (BTRFS_LEAF_DATA_SIZE(r->fs_info) - \
 					sizeof(struct btrfs_item) - \
 					sizeof(struct btrfs_file_extent_item))
-#define BTRFS_MAX_XATTR_SIZE(r)	(BTRFS_LEAF_DATA_SIZE(r) - \
+#define BTRFS_MAX_XATTR_SIZE(r)	(BTRFS_LEAF_DATA_SIZE(r->fs_info) - \
 				 sizeof(struct btrfs_item) -\
 				 sizeof(struct btrfs_dir_item))
 
@@ -599,7 +600,8 @@ struct btrfs_extent_item_v0 {
 	__le32 refs;
 } __attribute__ ((__packed__));
 
-#define BTRFS_MAX_EXTENT_ITEM_SIZE(r) ((BTRFS_LEAF_DATA_SIZE(r) >> 4) - \
+#define BTRFS_MAX_EXTENT_ITEM_SIZE(r) \
+			((BTRFS_LEAF_DATA_SIZE(r->fs_info) >> 4) - \
 					sizeof(struct btrfs_item))
 #define BTRFS_MAX_EXTENT_SIZE		SZ_128M
 
diff --git a/file-item.c b/file-item.c
index 8e169e18..7b0ff358 100644
--- a/file-item.c
+++ b/file-item.c
@@ -27,7 +27,7 @@
 #include "crc32c.h"
 #include "internal.h"
 
-#define MAX_CSUM_ITEMS(r,size) ((((BTRFS_LEAF_DATA_SIZE(r) - \
+#define MAX_CSUM_ITEMS(r, size) ((((BTRFS_LEAF_DATA_SIZE(r->fs_info) - \
 			       sizeof(struct btrfs_item) * 2) / \
 			       size) - 1))
 int btrfs_insert_file_extent(struct btrfs_trans_handle *trans,
diff --git a/volumes.c b/volumes.c
index ce3a5405..034f5d45 100644
--- a/volumes.c
+++ b/volumes.c
@@ -837,7 +837,7 @@ error:
 	return ret;
 }
 
-#define BTRFS_MAX_DEVS(r) ((BTRFS_LEAF_DATA_SIZE(r)		\
+#define BTRFS_MAX_DEVS(r) ((BTRFS_LEAF_DATA_SIZE(r->fs_info)	\
 			- sizeof(struct btrfs_item)		\
 			- sizeof(struct btrfs_chunk))		\
 			/ sizeof(struct btrfs_stripe) + 1)
-- 
2.14.3




^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH 2/6] btrfs-progs: Use fs_info instead of root for BTRFS_NODEPTRS_PER_BLOCK
  2018-01-26  3:22 [PATCH 1/6] btrfs-progs: Use fs_info instead of root for BTRFS_LEAF_DATA_SIZE Gu Jinxiang
@ 2018-01-26  3:22 ` Gu Jinxiang
  2018-01-26  5:16   ` Qu Wenruo
  2018-01-26  3:22 ` [PATCH 3/6] btrfs-progs: Use fs_info instead of root for BTRFS_MAX_INLINE_DATA_SIZE Gu Jinxiang
                   ` (4 subsequent siblings)
  5 siblings, 1 reply; 15+ messages in thread
From: Gu Jinxiang @ 2018-01-26  3:22 UTC (permalink / raw)
  To: linux-btrfs

Do a cleanup. Also make it consistent with kernel.
Use fs_info instead of root for BTRFS_NODEPTRS_PER_BLOCK, since
maybe in some situation we do not know root, but just know fs_info.

Signed-off-by: Gu Jinxiang <gujx@cn.fujitsu.com>
---
 cmds-check.c |  4 ++--
 ctree.c      | 18 +++++++++---------
 ctree.h      |  3 +--
 print-tree.c |  2 +-
 quick-test.c |  2 +-
 5 files changed, 14 insertions(+), 15 deletions(-)

diff --git a/cmds-check.c b/cmds-check.c
index b118ea71..b94fab4f 100644
--- a/cmds-check.c
+++ b/cmds-check.c
@@ -2529,7 +2529,7 @@ static void account_bytes(struct btrfs_root *root, struct btrfs_path *path,
 	if (level == 0) {
 		btree_space_waste += btrfs_leaf_free_space(root, eb);
 	} else {
-		free_nrs = (BTRFS_NODEPTRS_PER_BLOCK(root) -
+		free_nrs = (BTRFS_NODEPTRS_PER_BLOCK(root->fs_info) -
 			    btrfs_header_nritems(eb));
 		btree_space_waste += free_nrs * sizeof(struct btrfs_key_ptr);
 	}
@@ -9504,7 +9504,7 @@ static int run_next_block(struct btrfs_root *root,
 				add_pending(pending, seen, ptr, size);
 			}
 		}
-		btree_space_waste += (BTRFS_NODEPTRS_PER_BLOCK(root) -
+		btree_space_waste += (BTRFS_NODEPTRS_PER_BLOCK(fs_info) -
 				      nritems) * sizeof(struct btrfs_key_ptr);
 	}
 	total_btree_bytes += buf->len;
diff --git a/ctree.c b/ctree.c
index cb16c42c..11d207e7 100644
--- a/ctree.c
+++ b/ctree.c
@@ -429,7 +429,7 @@ btrfs_check_node(struct btrfs_root *root, struct btrfs_disk_key *parent_key,
 	u32 nritems = btrfs_header_nritems(buf);
 	enum btrfs_tree_block_status ret = BTRFS_TREE_BLOCK_INVALID_NRITEMS;
 
-	if (nritems == 0 || nritems > BTRFS_NODEPTRS_PER_BLOCK(root))
+	if (nritems == 0 || nritems > BTRFS_NODEPTRS_PER_BLOCK(root->fs_info))
 		goto fail;
 
 	ret = BTRFS_TREE_BLOCK_INVALID_PARENT_KEY;
@@ -716,7 +716,7 @@ static int balance_level(struct btrfs_trans_handle *trans,
 		return ret;
 	}
 	if (btrfs_header_nritems(mid) >
-	    BTRFS_NODEPTRS_PER_BLOCK(root) / 4)
+	    BTRFS_NODEPTRS_PER_BLOCK(fs_info) / 4)
 		return 0;
 
 	left = read_node_slot(fs_info, parent, pslot - 1);
@@ -884,7 +884,7 @@ static int noinline push_nodes_for_insert(struct btrfs_trans_handle *trans,
 	if (extent_buffer_uptodate(left)) {
 		u32 left_nr;
 		left_nr = btrfs_header_nritems(left);
-		if (left_nr >= BTRFS_NODEPTRS_PER_BLOCK(root) - 1) {
+		if (left_nr >= BTRFS_NODEPTRS_PER_BLOCK(fs_info) - 1) {
 			wret = 1;
 		} else {
 			ret = btrfs_cow_block(trans, root, left, parent,
@@ -927,7 +927,7 @@ static int noinline push_nodes_for_insert(struct btrfs_trans_handle *trans,
 	if (extent_buffer_uptodate(right)) {
 		u32 right_nr;
 		right_nr = btrfs_header_nritems(right);
-		if (right_nr >= BTRFS_NODEPTRS_PER_BLOCK(root) - 1) {
+		if (right_nr >= BTRFS_NODEPTRS_PER_BLOCK(root->fs_info) - 1) {
 			wret = 1;
 		} else {
 			ret = btrfs_cow_block(trans, root, right,
@@ -1146,7 +1146,7 @@ again:
 			p->slots[level] = slot;
 			if ((p->search_for_split || ins_len > 0) &&
 			    btrfs_header_nritems(b) >=
-			    BTRFS_NODEPTRS_PER_BLOCK(root) - 3) {
+			    BTRFS_NODEPTRS_PER_BLOCK(fs_info) - 3) {
 				int sret = split_node(trans, root, p, level);
 				BUG_ON(sret > 0);
 				if (sret)
@@ -1292,7 +1292,7 @@ static int push_node_left(struct btrfs_trans_handle *trans,
 
 	src_nritems = btrfs_header_nritems(src);
 	dst_nritems = btrfs_header_nritems(dst);
-	push_items = BTRFS_NODEPTRS_PER_BLOCK(root) - dst_nritems;
+	push_items = BTRFS_NODEPTRS_PER_BLOCK(root->fs_info) - dst_nritems;
 	WARN_ON(btrfs_header_generation(src) != trans->transid);
 	WARN_ON(btrfs_header_generation(dst) != trans->transid);
 
@@ -1362,7 +1362,7 @@ static int balance_node_right(struct btrfs_trans_handle *trans,
 
 	src_nritems = btrfs_header_nritems(src);
 	dst_nritems = btrfs_header_nritems(dst);
-	push_items = BTRFS_NODEPTRS_PER_BLOCK(root) - dst_nritems;
+	push_items = BTRFS_NODEPTRS_PER_BLOCK(root->fs_info) - dst_nritems;
 	if (push_items <= 0) {
 		return 1;
 	}
@@ -1490,7 +1490,7 @@ static int insert_ptr(struct btrfs_trans_handle *trans, struct btrfs_root
 	nritems = btrfs_header_nritems(lower);
 	if (slot > nritems)
 		BUG();
-	if (nritems == BTRFS_NODEPTRS_PER_BLOCK(root))
+	if (nritems == BTRFS_NODEPTRS_PER_BLOCK(root->fs_info))
 		BUG();
 	if (slot < nritems) {
 		/* shift the items */
@@ -1539,7 +1539,7 @@ static int split_node(struct btrfs_trans_handle *trans, struct btrfs_root
 		ret = push_nodes_for_insert(trans, root, path, level);
 		c = path->nodes[level];
 		if (!ret && btrfs_header_nritems(c) <
-		    BTRFS_NODEPTRS_PER_BLOCK(root) - 3)
+		    BTRFS_NODEPTRS_PER_BLOCK(root->fs_info) - 3)
 			return 0;
 		if (ret < 0)
 			return ret;
diff --git a/ctree.h b/ctree.h
index 11913efa..9e9d3d22 100644
--- a/ctree.h
+++ b/ctree.h
@@ -356,8 +356,7 @@ struct btrfs_header {
 	u8 level;
 } __attribute__ ((__packed__));
 
-#define BTRFS_NODEPTRS_PER_BLOCK(r) (((r)->fs_info->nodesize - \
-			        sizeof(struct btrfs_header)) / \
+#define BTRFS_NODEPTRS_PER_BLOCK(fs_info) (BTRFS_LEAF_DATA_SIZE(fs_info) / \
 			        sizeof(struct btrfs_key_ptr))
 #define __BTRFS_LEAF_DATA_SIZE(bs) ((bs) - sizeof(struct btrfs_header))
 #define BTRFS_LEAF_DATA_SIZE(fs_info) \
diff --git a/print-tree.c b/print-tree.c
index d3fa8621..5f37ef3e 100644
--- a/print-tree.c
+++ b/print-tree.c
@@ -1359,7 +1359,7 @@ void btrfs_print_tree(struct btrfs_root *root, struct extent_buffer *eb, int fol
 	printf("node %llu level %d items %d free %u generation %llu owner %llu\n",
 	       (unsigned long long)eb->start,
 	        btrfs_header_level(eb), nr,
-		(u32)BTRFS_NODEPTRS_PER_BLOCK(root) - nr,
+		(u32)BTRFS_NODEPTRS_PER_BLOCK(root->fs_info) - nr,
 		(unsigned long long)btrfs_header_generation(eb),
 		(unsigned long long)btrfs_header_owner(eb));
 	print_uuids(eb);
diff --git a/quick-test.c b/quick-test.c
index b1e7999d..5da47c32 100644
--- a/quick-test.c
+++ b/quick-test.c
@@ -110,7 +110,7 @@ int main(int ac, char **av) {
 	printf("node %p level %d total ptrs %d free spc %lu\n", root->node,
 	        btrfs_header_level(root->node),
 		btrfs_header_nritems(root->node),
-		(unsigned long)BTRFS_NODEPTRS_PER_BLOCK(root) -
+		(unsigned long)BTRFS_NODEPTRS_PER_BLOCK(root->fs_info) -
 		btrfs_header_nritems(root->node));
 	printf("all searches good, deleting some items\n");
 	i = 0;
-- 
2.14.3




^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH 3/6] btrfs-progs: Use fs_info instead of root for BTRFS_MAX_INLINE_DATA_SIZE
  2018-01-26  3:22 [PATCH 1/6] btrfs-progs: Use fs_info instead of root for BTRFS_LEAF_DATA_SIZE Gu Jinxiang
  2018-01-26  3:22 ` [PATCH 2/6] btrfs-progs: Use fs_info instead of root for BTRFS_NODEPTRS_PER_BLOCK Gu Jinxiang
@ 2018-01-26  3:22 ` Gu Jinxiang
  2018-01-26  5:29   ` Qu Wenruo
  2018-01-26  3:22 ` [PATCH 4/6] btrfs-progs: Use fs_info instead of root for BTRFS_MAX_XATTR_SIZE Gu Jinxiang
                   ` (3 subsequent siblings)
  5 siblings, 1 reply; 15+ messages in thread
From: Gu Jinxiang @ 2018-01-26  3:22 UTC (permalink / raw)
  To: linux-btrfs

Do a cleanup. Also make it consistent with kernel.
Use fs_info instead of root for BTRFS_MAX_INLINE_DATA_SIZE, since
maybe in some situation we do not know root, but just know fs_info.

Signed-off-by: Gu Jinxiang <gujx@cn.fujitsu.com>
---
 convert/source-ext2.c     | 2 +-
 convert/source-reiserfs.c | 2 +-
 ctree.h                   | 2 +-
 mkfs/main.c               | 4 ++--
 4 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/convert/source-ext2.c b/convert/source-ext2.c
index e5c2a943..f5ecd8cf 100644
--- a/convert/source-ext2.c
+++ b/convert/source-ext2.c
@@ -309,7 +309,7 @@ static int ext2_create_file_extents(struct btrfs_trans_handle *trans,
 		goto fail;
 	if ((convert_flags & CONVERT_FLAG_INLINE_DATA) && data.first_block == 0
 	    && data.num_blocks > 0
-	    && inode_size <= BTRFS_MAX_INLINE_DATA_SIZE(root)) {
+	    && inode_size <= BTRFS_MAX_INLINE_DATA_SIZE(root->fs_info)) {
 		u64 num_bytes = data.num_blocks * sectorsize;
 		u64 disk_bytenr = data.disk_block * sectorsize;
 		u64 nbytes;
diff --git a/convert/source-reiserfs.c b/convert/source-reiserfs.c
index e3582bda..39d6f072 100644
--- a/convert/source-reiserfs.c
+++ b/convert/source-reiserfs.c
@@ -376,7 +376,7 @@ static int reiserfs_convert_tail(struct btrfs_trans_handle *trans,
 	u64 isize;
 	int ret;
 
-	if (length >= BTRFS_MAX_INLINE_DATA_SIZE(root))
+	if (length >= BTRFS_MAX_INLINE_DATA_SIZE(root->fs_info))
 		return convert_direct(trans, root, objectid, inode, body,
 				      length, offset, convert_flags);
 
diff --git a/ctree.h b/ctree.h
index 9e9d3d22..ace93cc3 100644
--- a/ctree.h
+++ b/ctree.h
@@ -361,7 +361,7 @@ struct btrfs_header {
 #define __BTRFS_LEAF_DATA_SIZE(bs) ((bs) - sizeof(struct btrfs_header))
 #define BTRFS_LEAF_DATA_SIZE(fs_info) \
 				(__BTRFS_LEAF_DATA_SIZE(fs_info->nodesize))
-#define BTRFS_MAX_INLINE_DATA_SIZE(r) (BTRFS_LEAF_DATA_SIZE(r->fs_info) - \
+#define BTRFS_MAX_INLINE_DATA_SIZE(fs_info) (BTRFS_LEAF_DATA_SIZE(fs_info) - \
 					sizeof(struct btrfs_item) - \
 					sizeof(struct btrfs_file_extent_item))
 #define BTRFS_MAX_XATTR_SIZE(r)	(BTRFS_LEAF_DATA_SIZE(r->fs_info) - \
diff --git a/mkfs/main.c b/mkfs/main.c
index d817ad8d..a301efc3 100644
--- a/mkfs/main.c
+++ b/mkfs/main.c
@@ -498,7 +498,7 @@ static int fill_inode_item(struct btrfs_trans_handle *trans,
 	}
 	if (S_ISREG(src->st_mode)) {
 		btrfs_set_stack_inode_size(dst, (u64)src->st_size);
-		if (src->st_size <= BTRFS_MAX_INLINE_DATA_SIZE(root))
+		if (src->st_size <= BTRFS_MAX_INLINE_DATA_SIZE(root->fs_info))
 			btrfs_set_stack_inode_nbytes(dst, src->st_size);
 		else {
 			blocks = src->st_size / sectorsize;
@@ -686,7 +686,7 @@ static int add_file_items(struct btrfs_trans_handle *trans,
 	if (st->st_size % sectorsize)
 		blocks += 1;
 
-	if (st->st_size <= BTRFS_MAX_INLINE_DATA_SIZE(root)) {
+	if (st->st_size <= BTRFS_MAX_INLINE_DATA_SIZE(root->fs_info)) {
 		char *buffer = malloc(st->st_size);
 
 		if (!buffer) {
-- 
2.14.3




^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH 4/6] btrfs-progs: Use fs_info instead of root for BTRFS_MAX_XATTR_SIZE
  2018-01-26  3:22 [PATCH 1/6] btrfs-progs: Use fs_info instead of root for BTRFS_LEAF_DATA_SIZE Gu Jinxiang
  2018-01-26  3:22 ` [PATCH 2/6] btrfs-progs: Use fs_info instead of root for BTRFS_NODEPTRS_PER_BLOCK Gu Jinxiang
  2018-01-26  3:22 ` [PATCH 3/6] btrfs-progs: Use fs_info instead of root for BTRFS_MAX_INLINE_DATA_SIZE Gu Jinxiang
@ 2018-01-26  3:22 ` Gu Jinxiang
  2018-01-26  5:31   ` Qu Wenruo
  2018-01-26  3:22 ` [PATCH 5/6] btrfs-progs: do clean up for redundancy value assignment Gu Jinxiang
                   ` (2 subsequent siblings)
  5 siblings, 1 reply; 15+ messages in thread
From: Gu Jinxiang @ 2018-01-26  3:22 UTC (permalink / raw)
  To: linux-btrfs

Do a cleanup. Also make it consistent with kernel.
Use fs_info instead of root for BTRFS_MAX_XATTR_SIZE, since
maybe in some situation we do not know root, but just know fs_info.

Signed-off-by: Gu Jinxiang <gujx@cn.fujitsu.com>
---
 ctree.h    | 2 +-
 dir-item.c | 3 ++-
 2 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/ctree.h b/ctree.h
index ace93cc3..c82e7547 100644
--- a/ctree.h
+++ b/ctree.h
@@ -364,7 +364,7 @@ struct btrfs_header {
 #define BTRFS_MAX_INLINE_DATA_SIZE(fs_info) (BTRFS_LEAF_DATA_SIZE(fs_info) - \
 					sizeof(struct btrfs_item) - \
 					sizeof(struct btrfs_file_extent_item))
-#define BTRFS_MAX_XATTR_SIZE(r)	(BTRFS_LEAF_DATA_SIZE(r->fs_info) - \
+#define BTRFS_MAX_XATTR_SIZE(fs_info)	(BTRFS_LEAF_DATA_SIZE(fs_info) - \
 				 sizeof(struct btrfs_item) -\
 				 sizeof(struct btrfs_dir_item))
 
diff --git a/dir-item.c b/dir-item.c
index 462546c0..0b7250c9 100644
--- a/dir-item.c
+++ b/dir-item.c
@@ -311,7 +311,8 @@ static int verify_dir_item(struct btrfs_root *root,
 
 	/* BTRFS_MAX_XATTR_SIZE is the same for all dir items */
 	if ((btrfs_dir_data_len(leaf, dir_item) +
-	     btrfs_dir_name_len(leaf, dir_item)) > BTRFS_MAX_XATTR_SIZE(root)) {
+	     btrfs_dir_name_len(leaf, dir_item)) >
+			BTRFS_MAX_XATTR_SIZE(root->fs_info)) {
 		fprintf(stderr, "invalid dir item name + data len: %u + %u\n",
 		       (unsigned)btrfs_dir_name_len(leaf, dir_item),
 		       (unsigned)btrfs_dir_data_len(leaf, dir_item));
-- 
2.14.3




^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH 5/6] btrfs-progs: do clean up for redundancy value assignment
  2018-01-26  3:22 [PATCH 1/6] btrfs-progs: Use fs_info instead of root for BTRFS_LEAF_DATA_SIZE Gu Jinxiang
                   ` (2 preceding siblings ...)
  2018-01-26  3:22 ` [PATCH 4/6] btrfs-progs: Use fs_info instead of root for BTRFS_MAX_XATTR_SIZE Gu Jinxiang
@ 2018-01-26  3:22 ` Gu Jinxiang
  2018-01-26  5:34   ` Qu Wenruo
  2018-01-26  3:22 ` [PATCH 6/6] btrfs-progs: remove no longer be used btrfs_alloc_extent Gu Jinxiang
  2018-01-26  3:37 ` [PATCH 1/6] btrfs-progs: Use fs_info instead of root for BTRFS_LEAF_DATA_SIZE Qu Wenruo
  5 siblings, 1 reply; 15+ messages in thread
From: Gu Jinxiang @ 2018-01-26  3:22 UTC (permalink / raw)
  To: linux-btrfs

Although skinny_metadata's type is int, its value just can be 0/1.
And if condition be true only when skinny_metadata equals 1,
so in if's executive part, set skinny_metadata to 1 is redundancy.
Remove it.

Signed-off-by: Gu Jinxiang <gujx@cn.fujitsu.com>
---
 extent-tree.c | 1 -
 1 file changed, 1 deletion(-)

diff --git a/extent-tree.c b/extent-tree.c
index 1ac312a6..53d31ab3 100644
--- a/extent-tree.c
+++ b/extent-tree.c
@@ -1005,7 +1005,6 @@ static int lookup_inline_extent_backref(struct btrfs_trans_handle *trans,
 		extra_size = -1;
 
 	if (owner < BTRFS_FIRST_FREE_OBJECTID && skinny_metadata) {
-		skinny_metadata = 1;
 		key.type = BTRFS_METADATA_ITEM_KEY;
 		key.offset = owner;
 	} else if (skinny_metadata) {
-- 
2.14.3




^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH 6/6] btrfs-progs: remove no longer be used btrfs_alloc_extent
  2018-01-26  3:22 [PATCH 1/6] btrfs-progs: Use fs_info instead of root for BTRFS_LEAF_DATA_SIZE Gu Jinxiang
                   ` (3 preceding siblings ...)
  2018-01-26  3:22 ` [PATCH 5/6] btrfs-progs: do clean up for redundancy value assignment Gu Jinxiang
@ 2018-01-26  3:22 ` Gu Jinxiang
  2018-01-26  5:32   ` Qu Wenruo
  2018-01-26  3:37 ` [PATCH 1/6] btrfs-progs: Use fs_info instead of root for BTRFS_LEAF_DATA_SIZE Qu Wenruo
  5 siblings, 1 reply; 15+ messages in thread
From: Gu Jinxiang @ 2018-01-26  3:22 UTC (permalink / raw)
  To: linux-btrfs

Do a cleanup.
Function btrfs_alloc_extent is no longer be used.
So let's remove it.

Signed-off-by: Gu Jinxiang <gujx@cn.fujitsu.com>
---
 ctree.h | 6 ------
 1 file changed, 6 deletions(-)

diff --git a/ctree.h b/ctree.h
index c82e7547..34d2505e 100644
--- a/ctree.h
+++ b/ctree.h
@@ -2487,12 +2487,6 @@ struct extent_buffer *btrfs_alloc_free_block(struct btrfs_trans_handle *trans,
 					u32 blocksize, u64 root_objectid,
 					struct btrfs_disk_key *key, int level,
 					u64 hint, u64 empty_size);
-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 empty_size, u64 hint_byte,
-		       u64 search_end, struct btrfs_key *ins, int data);
 int btrfs_lookup_extent_info(struct btrfs_trans_handle *trans,
 			     struct btrfs_root *root, u64 bytenr,
 			     u64 offset, int metadata, u64 *refs, u64 *flags);
-- 
2.14.3




^ permalink raw reply related	[flat|nested] 15+ messages in thread

* Re: [PATCH 1/6] btrfs-progs: Use fs_info instead of root for BTRFS_LEAF_DATA_SIZE
  2018-01-26  3:22 [PATCH 1/6] btrfs-progs: Use fs_info instead of root for BTRFS_LEAF_DATA_SIZE Gu Jinxiang
                   ` (4 preceding siblings ...)
  2018-01-26  3:22 ` [PATCH 6/6] btrfs-progs: remove no longer be used btrfs_alloc_extent Gu Jinxiang
@ 2018-01-26  3:37 ` Qu Wenruo
  2018-01-26  5:12   ` Gu, Jinxiang
  5 siblings, 1 reply; 15+ messages in thread
From: Qu Wenruo @ 2018-01-26  3:37 UTC (permalink / raw)
  To: Gu Jinxiang, linux-btrfs


[-- Attachment #1.1: Type: text/plain, Size: 13331 bytes --]



On 2018年01月26日 11:22, Gu Jinxiang wrote:
> Do a cleanup. Also make it consistent with kernel.
> Use fs_info instead of root for BTRFS_LEAF_DATA_SIZE, since
> maybe in some situation we do not know root, but just know fs_info.
> 
> Signed-off-by: Gu Jinxiang <gujx@cn.fujitsu.com>
> ---
>  cmds-check.c              |  6 +++---
>  convert/source-ext2.c     |  2 +-
>  convert/source-reiserfs.c |  4 ++--
>  ctree.c                   | 49 +++++++++++++++++++++++++++--------------------
>  ctree.h                   | 10 ++++++----
>  file-item.c               |  2 +-
>  volumes.c                 |  2 +-
>  7 files changed, 42 insertions(+), 33 deletions(-)
> 
> diff --git a/cmds-check.c b/cmds-check.c
> index 7d6bbb07..b118ea71 100644
> --- a/cmds-check.c
> +++ b/cmds-check.c
> @@ -7255,9 +7255,9 @@ again:
>  		unsigned int shift = 0, offset;
>  
>  		if (i == 0 && btrfs_item_end_nr(buf, i) !=
> -		    BTRFS_LEAF_DATA_SIZE(root)) {
> +		    BTRFS_LEAF_DATA_SIZE(root->fs_info)) {
>  			if (btrfs_item_end_nr(buf, i) >
> -			    BTRFS_LEAF_DATA_SIZE(root)) {
> +			    BTRFS_LEAF_DATA_SIZE(root->fs_info)) {
>  				ret = delete_bogus_item(root, path, buf, i);
>  				if (!ret)
>  					goto again;
> @@ -7266,7 +7266,7 @@ again:
>  				ret = -EIO;
>  				break;
>  			}
> -			shift = BTRFS_LEAF_DATA_SIZE(root) -
> +			shift = BTRFS_LEAF_DATA_SIZE(root->fs_info) -
>  				btrfs_item_end_nr(buf, i);
>  		} else if (i > 0 && btrfs_item_end_nr(buf, i) !=
>  			   btrfs_item_offset_nr(buf, i - 1)) {
> diff --git a/convert/source-ext2.c b/convert/source-ext2.c
> index e9277213..e5c2a943 100644
> --- a/convert/source-ext2.c
> +++ b/convert/source-ext2.c
> @@ -520,7 +520,7 @@ static int ext2_copy_single_xattr(struct btrfs_trans_handle *trans,
>  	}
>  	strncpy(namebuf, xattr_prefix_table[name_index], XATTR_NAME_MAX);
>  	strncat(namebuf, EXT2_EXT_ATTR_NAME(entry), entry->e_name_len);
> -	if (name_len + datalen > BTRFS_LEAF_DATA_SIZE(root) -
> +	if (name_len + datalen > BTRFS_LEAF_DATA_SIZE(root->fs_info) -
>  	    sizeof(struct btrfs_item) - sizeof(struct btrfs_dir_item)) {
>  		fprintf(stderr, "skip large xattr on inode %Lu name %.*s\n",
>  			objectid - INO_OFFSET, name_len, namebuf);
> diff --git a/convert/source-reiserfs.c b/convert/source-reiserfs.c
> index be79d8e2..e3582bda 100644
> --- a/convert/source-reiserfs.c
> +++ b/convert/source-reiserfs.c
> @@ -676,7 +676,7 @@ static int reiserfs_xattr_indirect_fn(reiserfs_filsys_t fs, u64 position,
>  	size_t alloc = min(position + num_blocks * fs->fs_blocksize, size);
>  	char *body;
>  
> -	if (size > BTRFS_LEAF_DATA_SIZE(xa_data->root) -
> +	if (size > BTRFS_LEAF_DATA_SIZE(xa_data->root->fs_info) -
>  	    sizeof(struct btrfs_item) - sizeof(struct btrfs_dir_item)) {
>  		fprintf(stderr, "skip large xattr on objectid %llu name %.*s\n",
>  			xa_data->target_oid, (int)xa_data->namelen,
> @@ -714,7 +714,7 @@ static int reiserfs_xattr_direct_fn(reiserfs_filsys_t fs, __u64 position,
>  	struct reiserfs_xattr_data *xa_data = data;
>  	char *newbody;
>  
> -	if (size > BTRFS_LEAF_DATA_SIZE(xa_data->root) -
> +	if (size > BTRFS_LEAF_DATA_SIZE(xa_data->root->fs_info) -
>  	    sizeof(struct btrfs_item) - sizeof(struct btrfs_dir_item)) {
>  		fprintf(stderr, "skip large xattr on objectid %llu name %.*s\n",
>  			xa_data->target_oid, (int)xa_data->namelen,
> diff --git a/ctree.c b/ctree.c
> index f4cf006b..cb16c42c 100644
> --- a/ctree.c
> +++ b/ctree.c
> @@ -415,7 +415,7 @@ static inline unsigned int leaf_data_end(struct btrfs_root *root,

Why not make this function to follow the parameters of kernel one?

Thanks,
Qu

>  {
>  	u32 nr = btrfs_header_nritems(leaf);
>  	if (nr == 0)
> -		return BTRFS_LEAF_DATA_SIZE(root);
> +		return BTRFS_LEAF_DATA_SIZE(root->fs_info);
>  	return btrfs_item_offset_nr(leaf, nr - 1);
>  }
>  
> @@ -517,24 +517,26 @@ btrfs_check_leaf(struct btrfs_root *root, struct btrfs_disk_key *parent_key,
>  			goto fail;
>  		}
>  		if (i == 0 && btrfs_item_end_nr(buf, i) !=
> -		    BTRFS_LEAF_DATA_SIZE(root)) {
> +		    BTRFS_LEAF_DATA_SIZE(root->fs_info)) {
>  			ret = BTRFS_TREE_BLOCK_INVALID_OFFSETS;
>  			fprintf(stderr, "bad item end %u wanted %u\n",
>  				btrfs_item_end_nr(buf, i),
> -				(unsigned)BTRFS_LEAF_DATA_SIZE(root));
> +				(unsigned)BTRFS_LEAF_DATA_SIZE(root->fs_info));
>  			goto fail;
>  		}
>  	}
>  
>  	for (i = 0; i < nritems; i++) {
> -		if (btrfs_item_end_nr(buf, i) > BTRFS_LEAF_DATA_SIZE(root)) {
> +		if (btrfs_item_end_nr(buf, i) >
> +				BTRFS_LEAF_DATA_SIZE(root->fs_info)) {
>  			btrfs_item_key(buf, &key, 0);
>  			btrfs_print_key(&key);
>  			fflush(stdout);
>  			ret = BTRFS_TREE_BLOCK_INVALID_OFFSETS;
>  			fprintf(stderr, "slot end outside of leaf %llu > %llu\n",
>  				(unsigned long long)btrfs_item_end_nr(buf, i),
> -				(unsigned long long)BTRFS_LEAF_DATA_SIZE(root));
> +				(unsigned long long)BTRFS_LEAF_DATA_SIZE(
> +					root->fs_info));
>  			goto fail;
>  		}
>  	}
> @@ -1621,7 +1623,7 @@ static int leaf_space_used(struct extent_buffer *l, int start, int nr)
>   */
>  int btrfs_leaf_free_space(struct btrfs_root *root, struct extent_buffer *leaf)
>  {
> -	u32 nodesize = (root ? BTRFS_LEAF_DATA_SIZE(root) : leaf->len);
> +	u32 nodesize = (root ? BTRFS_LEAF_DATA_SIZE(root->fs_info) : leaf->len);
>  	int nritems = btrfs_header_nritems(leaf);
>  	int ret;
>  	ret = nodesize - leaf_space_used(leaf, 0, nritems);
> @@ -1742,11 +1744,11 @@ static int push_leaf_right(struct btrfs_trans_handle *trans, struct btrfs_root
>  	memmove_extent_buffer(right,
>  			      btrfs_leaf_data(right) + data_end - push_space,
>  			      btrfs_leaf_data(right) + data_end,
> -			      BTRFS_LEAF_DATA_SIZE(root) - data_end);
> +			      BTRFS_LEAF_DATA_SIZE(root->fs_info) - data_end);
>  
>  	/* copy from the left data area */
>  	copy_extent_buffer(right, left, btrfs_leaf_data(right) +
> -		     BTRFS_LEAF_DATA_SIZE(root) - push_space,
> +		     BTRFS_LEAF_DATA_SIZE(root->fs_info) - push_space,
>  		     btrfs_leaf_data(left) + leaf_data_end(root, left),
>  		     push_space);
>  
> @@ -1762,7 +1764,7 @@ static int push_leaf_right(struct btrfs_trans_handle *trans, struct btrfs_root
>  	/* update the item pointers */
>  	right_nritems += push_items;
>  	btrfs_set_header_nritems(right, right_nritems);
> -	push_space = BTRFS_LEAF_DATA_SIZE(root);
> +	push_space = BTRFS_LEAF_DATA_SIZE(root->fs_info);
>  	for (i = 0; i < right_nritems; i++) {
>  		item = btrfs_item_nr(i);
>  		push_space -= btrfs_item_size(right, item);
> @@ -1881,7 +1883,7 @@ static int push_leaf_left(struct btrfs_trans_handle *trans, struct btrfs_root
>  			   btrfs_item_nr_offset(0),
>  			   push_items * sizeof(struct btrfs_item));
>  
> -	push_space = BTRFS_LEAF_DATA_SIZE(root) -
> +	push_space = BTRFS_LEAF_DATA_SIZE(root->fs_info) -
>  		     btrfs_item_offset_nr(right, push_items -1);
>  
>  	copy_extent_buffer(left, right, btrfs_leaf_data(left) +
> @@ -1899,7 +1901,8 @@ static int push_leaf_left(struct btrfs_trans_handle *trans, struct btrfs_root
>  		item = btrfs_item_nr(i);
>  		ioff = btrfs_item_offset(left, item);
>  		btrfs_set_item_offset(left, item,
> -		      ioff - (BTRFS_LEAF_DATA_SIZE(root) - old_left_item_size));
> +		      ioff - (BTRFS_LEAF_DATA_SIZE(root->fs_info) -
> +			      old_left_item_size));
>  	}
>  	btrfs_set_header_nritems(left, old_left_nritems + push_items);
>  
> @@ -1913,7 +1916,8 @@ static int push_leaf_left(struct btrfs_trans_handle *trans, struct btrfs_root
>  		push_space = btrfs_item_offset_nr(right, push_items - 1) -
>  						  leaf_data_end(root, right);
>  		memmove_extent_buffer(right, btrfs_leaf_data(right) +
> -				      BTRFS_LEAF_DATA_SIZE(root) - push_space,
> +				      BTRFS_LEAF_DATA_SIZE(root->fs_info) -
> +				      push_space,
>  				      btrfs_leaf_data(right) +
>  				      leaf_data_end(root, right), push_space);
>  
> @@ -1924,7 +1928,7 @@ static int push_leaf_left(struct btrfs_trans_handle *trans, struct btrfs_root
>  	}
>  	right_nritems -= push_items;
>  	btrfs_set_header_nritems(right, right_nritems);
> -	push_space = BTRFS_LEAF_DATA_SIZE(root);
> +	push_space = BTRFS_LEAF_DATA_SIZE(root->fs_info);
>  	for (i = 0; i < right_nritems; i++) {
>  		item = btrfs_item_nr(i);
>  		push_space = push_space - btrfs_item_size(right, item);
> @@ -1981,11 +1985,12 @@ static noinline int copy_for_split(struct btrfs_trans_handle *trans,
>  			   nritems * sizeof(struct btrfs_item));
>  
>  	copy_extent_buffer(right, l,
> -		     btrfs_leaf_data(right) + BTRFS_LEAF_DATA_SIZE(root) -
> +		     btrfs_leaf_data(right) +
> +		     BTRFS_LEAF_DATA_SIZE(root->fs_info) -
>  		     data_copy_size, btrfs_leaf_data(l) +
>  		     leaf_data_end(root, l), data_copy_size);
>  
> -	rt_data_off = BTRFS_LEAF_DATA_SIZE(root) -
> +	rt_data_off = BTRFS_LEAF_DATA_SIZE(root->fs_info) -
>  		      btrfs_item_end_nr(l, mid);
>  
>  	for (i = 0; i < nritems; i++) {
> @@ -2046,7 +2051,7 @@ static noinline int split_leaf(struct btrfs_trans_handle *trans,
>  	l = path->nodes[0];
>  	slot = path->slots[0];
>  	if (extend && data_size + btrfs_item_size_nr(l, slot) +
> -	    sizeof(struct btrfs_item) > BTRFS_LEAF_DATA_SIZE(root))
> +	    sizeof(struct btrfs_item) > BTRFS_LEAF_DATA_SIZE(root->fs_info))
>  		return -EOVERFLOW;
>  
>  	/* first try to make some room by pushing left and right */
> @@ -2081,21 +2086,22 @@ again:
>  	if (mid <= slot) {
>  		if (nritems == 1 ||
>  		    leaf_space_used(l, mid, nritems - mid) + data_size >
> -			BTRFS_LEAF_DATA_SIZE(root)) {
> +			BTRFS_LEAF_DATA_SIZE(root->fs_info)) {
>  			if (slot >= nritems) {
>  				split = 0;
>  			} else {
>  				mid = slot;
>  				if (mid != nritems &&
>  				    leaf_space_used(l, mid, nritems - mid) +
> -				    data_size > BTRFS_LEAF_DATA_SIZE(root)) {
> +				    data_size >
> +				    BTRFS_LEAF_DATA_SIZE(root->fs_info)) {
>  					split = 2;
>  				}
>  			}
>  		}
>  	} else {
>  		if (leaf_space_used(l, 0, mid) + data_size >
> -			BTRFS_LEAF_DATA_SIZE(root)) {
> +			BTRFS_LEAF_DATA_SIZE(root->fs_info)) {
>  			if (!extend && data_size && slot == 0) {
>  				split = 0;
>  			} else if ((extend || !data_size) && slot == 0) {
> @@ -2104,7 +2110,8 @@ again:
>  				mid = slot;
>  				if (mid != nritems &&
>  				    leaf_space_used(l, mid, nritems - mid) +
> -				    data_size > BTRFS_LEAF_DATA_SIZE(root)) {
> +				    data_size >
> +				    BTRFS_LEAF_DATA_SIZE(root->fs_info)) {
>  					split = 2 ;
>  				}
>  			}
> @@ -2729,7 +2736,7 @@ int btrfs_del_items(struct btrfs_trans_handle *trans, struct btrfs_root *root,
>  		}
>  
>  		/* delete the leaf if it is mostly empty */
> -		if (used < BTRFS_LEAF_DATA_SIZE(root) / 4) {
> +		if (used < BTRFS_LEAF_DATA_SIZE(root->fs_info) / 4) {
>  			/* push_leaf_left fixes the path.
>  			 * make sure the path still points to our leaf
>  			 * for possible call to del_ptr below
> diff --git a/ctree.h b/ctree.h
> index ef422ea6..11913efa 100644
> --- a/ctree.h
> +++ b/ctree.h
> @@ -360,11 +360,12 @@ struct btrfs_header {
>  			        sizeof(struct btrfs_header)) / \
>  			        sizeof(struct btrfs_key_ptr))
>  #define __BTRFS_LEAF_DATA_SIZE(bs) ((bs) - sizeof(struct btrfs_header))
> -#define BTRFS_LEAF_DATA_SIZE(r) (__BTRFS_LEAF_DATA_SIZE(r->fs_info->nodesize))
> -#define BTRFS_MAX_INLINE_DATA_SIZE(r) (BTRFS_LEAF_DATA_SIZE(r) - \
> +#define BTRFS_LEAF_DATA_SIZE(fs_info) \
> +				(__BTRFS_LEAF_DATA_SIZE(fs_info->nodesize))
> +#define BTRFS_MAX_INLINE_DATA_SIZE(r) (BTRFS_LEAF_DATA_SIZE(r->fs_info) - \
>  					sizeof(struct btrfs_item) - \
>  					sizeof(struct btrfs_file_extent_item))
> -#define BTRFS_MAX_XATTR_SIZE(r)	(BTRFS_LEAF_DATA_SIZE(r) - \
> +#define BTRFS_MAX_XATTR_SIZE(r)	(BTRFS_LEAF_DATA_SIZE(r->fs_info) - \
>  				 sizeof(struct btrfs_item) -\
>  				 sizeof(struct btrfs_dir_item))
>  
> @@ -599,7 +600,8 @@ struct btrfs_extent_item_v0 {
>  	__le32 refs;
>  } __attribute__ ((__packed__));
>  
> -#define BTRFS_MAX_EXTENT_ITEM_SIZE(r) ((BTRFS_LEAF_DATA_SIZE(r) >> 4) - \
> +#define BTRFS_MAX_EXTENT_ITEM_SIZE(r) \
> +			((BTRFS_LEAF_DATA_SIZE(r->fs_info) >> 4) - \
>  					sizeof(struct btrfs_item))
>  #define BTRFS_MAX_EXTENT_SIZE		SZ_128M
>  
> diff --git a/file-item.c b/file-item.c
> index 8e169e18..7b0ff358 100644
> --- a/file-item.c
> +++ b/file-item.c
> @@ -27,7 +27,7 @@
>  #include "crc32c.h"
>  #include "internal.h"
>  
> -#define MAX_CSUM_ITEMS(r,size) ((((BTRFS_LEAF_DATA_SIZE(r) - \
> +#define MAX_CSUM_ITEMS(r, size) ((((BTRFS_LEAF_DATA_SIZE(r->fs_info) - \
>  			       sizeof(struct btrfs_item) * 2) / \
>  			       size) - 1))
>  int btrfs_insert_file_extent(struct btrfs_trans_handle *trans,
> diff --git a/volumes.c b/volumes.c
> index ce3a5405..034f5d45 100644
> --- a/volumes.c
> +++ b/volumes.c
> @@ -837,7 +837,7 @@ error:
>  	return ret;
>  }
>  
> -#define BTRFS_MAX_DEVS(r) ((BTRFS_LEAF_DATA_SIZE(r)		\
> +#define BTRFS_MAX_DEVS(r) ((BTRFS_LEAF_DATA_SIZE(r->fs_info)	\
>  			- sizeof(struct btrfs_item)		\
>  			- sizeof(struct btrfs_chunk))		\
>  			/ sizeof(struct btrfs_stripe) + 1)
> 


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 520 bytes --]

^ permalink raw reply	[flat|nested] 15+ messages in thread

* RE: [PATCH 1/6] btrfs-progs: Use fs_info instead of root for BTRFS_LEAF_DATA_SIZE
  2018-01-26  3:37 ` [PATCH 1/6] btrfs-progs: Use fs_info instead of root for BTRFS_LEAF_DATA_SIZE Qu Wenruo
@ 2018-01-26  5:12   ` Gu, Jinxiang
  2018-01-26  5:21     ` Qu Wenruo
  0 siblings, 1 reply; 15+ messages in thread
From: Gu, Jinxiang @ 2018-01-26  5:12 UTC (permalink / raw)
  To: Qu Wenruo, linux-btrfs@vger.kernel.org

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain; charset="utf-8", Size: 14452 bytes --]

Hi,

> -----Original Message-----
> From: Qu Wenruo [mailto:quwenruo.btrfs@gmx.com]
> Sent: Friday, January 26, 2018 11:37 AM
> To: Gu, Jinxiang/顾 金香 <gujx@cn.fujitsu.com>;
> linux-btrfs@vger.kernel.org
> Subject: Re: [PATCH 1/6] btrfs-progs: Use fs_info instead of root for
> BTRFS_LEAF_DATA_SIZE
> 
> 
> 
> On 2018年01月26日 11:22, Gu Jinxiang wrote:
> > Do a cleanup. Also make it consistent with kernel.
> > Use fs_info instead of root for BTRFS_LEAF_DATA_SIZE, since maybe in
> > some situation we do not know root, but just know fs_info.
> >
> > Signed-off-by: Gu Jinxiang <gujx@cn.fujitsu.com>
> > ---
> >  cmds-check.c              |  6 +++---
> >  convert/source-ext2.c     |  2 +-
> >  convert/source-reiserfs.c |  4 ++--
> >  ctree.c                   | 49
> +++++++++++++++++++++++++++--------------------
> >  ctree.h                   | 10 ++++++----
> >  file-item.c               |  2 +-
> >  volumes.c                 |  2 +-
> >  7 files changed, 42 insertions(+), 33 deletions(-)
> >
> > diff --git a/cmds-check.c b/cmds-check.c index 7d6bbb07..b118ea71
> > 100644
> > --- a/cmds-check.c
> > +++ b/cmds-check.c
> > @@ -7255,9 +7255,9 @@ again:
> >  		unsigned int shift = 0, offset;
> >
> >  		if (i == 0 && btrfs_item_end_nr(buf, i) !=
> > -		    BTRFS_LEAF_DATA_SIZE(root)) {
> > +		    BTRFS_LEAF_DATA_SIZE(root->fs_info)) {
> >  			if (btrfs_item_end_nr(buf, i) >
> > -			    BTRFS_LEAF_DATA_SIZE(root)) {
> > +			    BTRFS_LEAF_DATA_SIZE(root->fs_info)) {
> >  				ret = delete_bogus_item(root, path, buf,
> i);
> >  				if (!ret)
> >  					goto again;
> > @@ -7266,7 +7266,7 @@ again:
> >  				ret = -EIO;
> >  				break;
> >  			}
> > -			shift = BTRFS_LEAF_DATA_SIZE(root) -
> > +			shift = BTRFS_LEAF_DATA_SIZE(root->fs_info) -
> >  				btrfs_item_end_nr(buf, i);
> >  		} else if (i > 0 && btrfs_item_end_nr(buf, i) !=
> >  			   btrfs_item_offset_nr(buf, i - 1)) { diff --git
> > a/convert/source-ext2.c b/convert/source-ext2.c index
> > e9277213..e5c2a943 100644
> > --- a/convert/source-ext2.c
> > +++ b/convert/source-ext2.c
> > @@ -520,7 +520,7 @@ static int ext2_copy_single_xattr(struct
> btrfs_trans_handle *trans,
> >  	}
> >  	strncpy(namebuf, xattr_prefix_table[name_index],
> XATTR_NAME_MAX);
> >  	strncat(namebuf, EXT2_EXT_ATTR_NAME(entry), entry->e_name_len);
> > -	if (name_len + datalen > BTRFS_LEAF_DATA_SIZE(root) -
> > +	if (name_len + datalen > BTRFS_LEAF_DATA_SIZE(root->fs_info) -
> >  	    sizeof(struct btrfs_item) - sizeof(struct btrfs_dir_item)) {
> >  		fprintf(stderr, "skip large xattr on inode %Lu
> name %.*s\n",
> >  			objectid - INO_OFFSET, name_len, namebuf); diff
> --git
> > a/convert/source-reiserfs.c b/convert/source-reiserfs.c index
> > be79d8e2..e3582bda 100644
> > --- a/convert/source-reiserfs.c
> > +++ b/convert/source-reiserfs.c
> > @@ -676,7 +676,7 @@ static int
> reiserfs_xattr_indirect_fn(reiserfs_filsys_t fs, u64 position,
> >  	size_t alloc = min(position + num_blocks * fs->fs_blocksize, size);
> >  	char *body;
> >
> > -	if (size > BTRFS_LEAF_DATA_SIZE(xa_data->root) -
> > +	if (size > BTRFS_LEAF_DATA_SIZE(xa_data->root->fs_info) -
> >  	    sizeof(struct btrfs_item) - sizeof(struct btrfs_dir_item)) {
> >  		fprintf(stderr, "skip large xattr on objectid %llu
> name %.*s\n",
> >  			xa_data->target_oid, (int)xa_data->namelen, @@
> -714,7 +714,7 @@
> > static int reiserfs_xattr_direct_fn(reiserfs_filsys_t fs, __u64
> position,
> >  	struct reiserfs_xattr_data *xa_data = data;
> >  	char *newbody;
> >
> > -	if (size > BTRFS_LEAF_DATA_SIZE(xa_data->root) -
> > +	if (size > BTRFS_LEAF_DATA_SIZE(xa_data->root->fs_info) -
> >  	    sizeof(struct btrfs_item) - sizeof(struct btrfs_dir_item)) {
> >  		fprintf(stderr, "skip large xattr on objectid %llu
> name %.*s\n",
> >  			xa_data->target_oid, (int)xa_data->namelen,
> diff --git a/ctree.c
> > b/ctree.c index f4cf006b..cb16c42c 100644
> > --- a/ctree.c
> > +++ b/ctree.c
> > @@ -415,7 +415,7 @@ static inline unsigned int leaf_data_end(struct
> > btrfs_root *root,
> 
> Why not make this function to follow the parameters of kernel one?

In mkfs procedure(i.e. function make_btrfs), need to use BTRFS_LEAF_DATA_SIZE to get the data size of a leaf,
however fs_info is not be initialed yet.
So, in progs, __BTRFS_LEAF_DATA_SIZE is designed for those situation. And BTRFS_LEAF_DATA_SIZE calls __BTRFS_LEAF_DATA_SIZE
by transfer fs_info->nodesize.

Thanks,
Gu

> 
> Thanks,
> Qu
> 
> >  {
> >  	u32 nr = btrfs_header_nritems(leaf);
> >  	if (nr == 0)
> > -		return BTRFS_LEAF_DATA_SIZE(root);
> > +		return BTRFS_LEAF_DATA_SIZE(root->fs_info);
> >  	return btrfs_item_offset_nr(leaf, nr - 1);  }
> >
> > @@ -517,24 +517,26 @@ btrfs_check_leaf(struct btrfs_root *root, struct
> btrfs_disk_key *parent_key,
> >  			goto fail;
> >  		}
> >  		if (i == 0 && btrfs_item_end_nr(buf, i) !=
> > -		    BTRFS_LEAF_DATA_SIZE(root)) {
> > +		    BTRFS_LEAF_DATA_SIZE(root->fs_info)) {
> >  			ret = BTRFS_TREE_BLOCK_INVALID_OFFSETS;
> >  			fprintf(stderr, "bad item end %u wanted %u\n",
> >  				btrfs_item_end_nr(buf, i),
> > -				(unsigned)BTRFS_LEAF_DATA_SIZE(root));
> > +
> 	(unsigned)BTRFS_LEAF_DATA_SIZE(root->fs_info));
> >  			goto fail;
> >  		}
> >  	}
> >
> >  	for (i = 0; i < nritems; i++) {
> > -		if (btrfs_item_end_nr(buf, i) >
> BTRFS_LEAF_DATA_SIZE(root)) {
> > +		if (btrfs_item_end_nr(buf, i) >
> > +				BTRFS_LEAF_DATA_SIZE(root->fs_info)) {
> >  			btrfs_item_key(buf, &key, 0);
> >  			btrfs_print_key(&key);
> >  			fflush(stdout);
> >  			ret = BTRFS_TREE_BLOCK_INVALID_OFFSETS;
> >  			fprintf(stderr, "slot end outside of leaf %llu
> > %llu\n",
> >  				(unsigned long
> long)btrfs_item_end_nr(buf, i),
> > -				(unsigned long
> long)BTRFS_LEAF_DATA_SIZE(root));
> > +				(unsigned long
> long)BTRFS_LEAF_DATA_SIZE(
> > +					root->fs_info));
> >  			goto fail;
> >  		}
> >  	}
> > @@ -1621,7 +1623,7 @@ static int leaf_space_used(struct extent_buffer
> *l, int start, int nr)
> >   */
> >  int btrfs_leaf_free_space(struct btrfs_root *root, struct
> > extent_buffer *leaf)  {
> > -	u32 nodesize = (root ? BTRFS_LEAF_DATA_SIZE(root) : leaf->len);
> > +	u32 nodesize = (root ? BTRFS_LEAF_DATA_SIZE(root->fs_info) :
> > +leaf->len);
> >  	int nritems = btrfs_header_nritems(leaf);
> >  	int ret;
> >  	ret = nodesize - leaf_space_used(leaf, 0, nritems); @@ -1742,11
> > +1744,11 @@ static int push_leaf_right(struct btrfs_trans_handle *trans,
> struct btrfs_root
> >  	memmove_extent_buffer(right,
> >  			      btrfs_leaf_data(right) + data_end -
> push_space,
> >  			      btrfs_leaf_data(right) + data_end,
> > -			      BTRFS_LEAF_DATA_SIZE(root) - data_end);
> > +			      BTRFS_LEAF_DATA_SIZE(root->fs_info) -
> data_end);
> >
> >  	/* copy from the left data area */
> >  	copy_extent_buffer(right, left, btrfs_leaf_data(right) +
> > -		     BTRFS_LEAF_DATA_SIZE(root) - push_space,
> > +		     BTRFS_LEAF_DATA_SIZE(root->fs_info) - push_space,
> >  		     btrfs_leaf_data(left) + leaf_data_end(root, left),
> >  		     push_space);
> >
> > @@ -1762,7 +1764,7 @@ static int push_leaf_right(struct
> btrfs_trans_handle *trans, struct btrfs_root
> >  	/* update the item pointers */
> >  	right_nritems += push_items;
> >  	btrfs_set_header_nritems(right, right_nritems);
> > -	push_space = BTRFS_LEAF_DATA_SIZE(root);
> > +	push_space = BTRFS_LEAF_DATA_SIZE(root->fs_info);
> >  	for (i = 0; i < right_nritems; i++) {
> >  		item = btrfs_item_nr(i);
> >  		push_space -= btrfs_item_size(right, item); @@ -1881,7
> +1883,7 @@
> > static int push_leaf_left(struct btrfs_trans_handle *trans, struct
> btrfs_root
> >  			   btrfs_item_nr_offset(0),
> >  			   push_items * sizeof(struct btrfs_item));
> >
> > -	push_space = BTRFS_LEAF_DATA_SIZE(root) -
> > +	push_space = BTRFS_LEAF_DATA_SIZE(root->fs_info) -
> >  		     btrfs_item_offset_nr(right, push_items -1);
> >
> >  	copy_extent_buffer(left, right, btrfs_leaf_data(left) + @@
> -1899,7
> > +1901,8 @@ static int push_leaf_left(struct btrfs_trans_handle *trans,
> struct btrfs_root
> >  		item = btrfs_item_nr(i);
> >  		ioff = btrfs_item_offset(left, item);
> >  		btrfs_set_item_offset(left, item,
> > -		      ioff - (BTRFS_LEAF_DATA_SIZE(root) -
> old_left_item_size));
> > +		      ioff - (BTRFS_LEAF_DATA_SIZE(root->fs_info) -
> > +			      old_left_item_size));
> >  	}
> >  	btrfs_set_header_nritems(left, old_left_nritems + push_items);
> >
> > @@ -1913,7 +1916,8 @@ static int push_leaf_left(struct btrfs_trans_handle
> *trans, struct btrfs_root
> >  		push_space = btrfs_item_offset_nr(right, push_items - 1)
> -
> >  						  leaf_data_end(root,
> right);
> >  		memmove_extent_buffer(right, btrfs_leaf_data(right) +
> > -				      BTRFS_LEAF_DATA_SIZE(root) -
> push_space,
> > +
> BTRFS_LEAF_DATA_SIZE(root->fs_info) -
> > +				      push_space,
> >  				      btrfs_leaf_data(right) +
> >  				      leaf_data_end(root, right),
> push_space);
> >
> > @@ -1924,7 +1928,7 @@ static int push_leaf_left(struct btrfs_trans_handle
> *trans, struct btrfs_root
> >  	}
> >  	right_nritems -= push_items;
> >  	btrfs_set_header_nritems(right, right_nritems);
> > -	push_space = BTRFS_LEAF_DATA_SIZE(root);
> > +	push_space = BTRFS_LEAF_DATA_SIZE(root->fs_info);
> >  	for (i = 0; i < right_nritems; i++) {
> >  		item = btrfs_item_nr(i);
> >  		push_space = push_space - btrfs_item_size(right, item);
> @@ -1981,11
> > +1985,12 @@ static noinline int copy_for_split(struct btrfs_trans_handle
> *trans,
> >  			   nritems * sizeof(struct btrfs_item));
> >
> >  	copy_extent_buffer(right, l,
> > -		     btrfs_leaf_data(right) +
> BTRFS_LEAF_DATA_SIZE(root) -
> > +		     btrfs_leaf_data(right) +
> > +		     BTRFS_LEAF_DATA_SIZE(root->fs_info) -
> >  		     data_copy_size, btrfs_leaf_data(l) +
> >  		     leaf_data_end(root, l), data_copy_size);
> >
> > -	rt_data_off = BTRFS_LEAF_DATA_SIZE(root) -
> > +	rt_data_off = BTRFS_LEAF_DATA_SIZE(root->fs_info) -
> >  		      btrfs_item_end_nr(l, mid);
> >
> >  	for (i = 0; i < nritems; i++) {
> > @@ -2046,7 +2051,7 @@ static noinline int split_leaf(struct
> btrfs_trans_handle *trans,
> >  	l = path->nodes[0];
> >  	slot = path->slots[0];
> >  	if (extend && data_size + btrfs_item_size_nr(l, slot) +
> > -	    sizeof(struct btrfs_item) > BTRFS_LEAF_DATA_SIZE(root))
> > +	    sizeof(struct btrfs_item) >
> BTRFS_LEAF_DATA_SIZE(root->fs_info))
> >  		return -EOVERFLOW;
> >
> >  	/* first try to make some room by pushing left and right */ @@
> > -2081,21 +2086,22 @@ again:
> >  	if (mid <= slot) {
> >  		if (nritems == 1 ||
> >  		    leaf_space_used(l, mid, nritems - mid) + data_size >
> > -			BTRFS_LEAF_DATA_SIZE(root)) {
> > +			BTRFS_LEAF_DATA_SIZE(root->fs_info)) {
> >  			if (slot >= nritems) {
> >  				split = 0;
> >  			} else {
> >  				mid = slot;
> >  				if (mid != nritems &&
> >  				    leaf_space_used(l, mid, nritems -
> mid) +
> > -				    data_size >
> BTRFS_LEAF_DATA_SIZE(root)) {
> > +				    data_size >
> > +
> BTRFS_LEAF_DATA_SIZE(root->fs_info)) {
> >  					split = 2;
> >  				}
> >  			}
> >  		}
> >  	} else {
> >  		if (leaf_space_used(l, 0, mid) + data_size >
> > -			BTRFS_LEAF_DATA_SIZE(root)) {
> > +			BTRFS_LEAF_DATA_SIZE(root->fs_info)) {
> >  			if (!extend && data_size && slot == 0) {
> >  				split = 0;
> >  			} else if ((extend || !data_size) && slot == 0)
> { @@ -2104,7
> > +2110,8 @@ again:
> >  				mid = slot;
> >  				if (mid != nritems &&
> >  				    leaf_space_used(l, mid, nritems -
> mid) +
> > -				    data_size >
> BTRFS_LEAF_DATA_SIZE(root)) {
> > +				    data_size >
> > +
> BTRFS_LEAF_DATA_SIZE(root->fs_info)) {
> >  					split = 2 ;
> >  				}
> >  			}
> > @@ -2729,7 +2736,7 @@ int btrfs_del_items(struct btrfs_trans_handle
> *trans, struct btrfs_root *root,
> >  		}
> >
> >  		/* delete the leaf if it is mostly empty */
> > -		if (used < BTRFS_LEAF_DATA_SIZE(root) / 4) {
> > +		if (used < BTRFS_LEAF_DATA_SIZE(root->fs_info) / 4) {
> >  			/* push_leaf_left fixes the path.
> >  			 * make sure the path still points to our leaf
> >  			 * for possible call to del_ptr below diff --git
> a/ctree.h
> > b/ctree.h index ef422ea6..11913efa 100644
> > --- a/ctree.h
> > +++ b/ctree.h
> > @@ -360,11 +360,12 @@ struct btrfs_header {
> >  			        sizeof(struct btrfs_header)) / \
> >  			        sizeof(struct btrfs_key_ptr))  #define
> > __BTRFS_LEAF_DATA_SIZE(bs) ((bs) - sizeof(struct btrfs_header))
> > -#define BTRFS_LEAF_DATA_SIZE(r)
> > (__BTRFS_LEAF_DATA_SIZE(r->fs_info->nodesize))
> > -#define BTRFS_MAX_INLINE_DATA_SIZE(r) (BTRFS_LEAF_DATA_SIZE(r) - \
> > +#define BTRFS_LEAF_DATA_SIZE(fs_info) \
> > +
> 	(__BTRFS_LEAF_DATA_SIZE(fs_info->nodesize))
> > +#define BTRFS_MAX_INLINE_DATA_SIZE(r)
> > +(BTRFS_LEAF_DATA_SIZE(r->fs_info) - \
> >  					sizeof(struct btrfs_item) - \
> >  					sizeof(struct
> btrfs_file_extent_item))
> > -#define BTRFS_MAX_XATTR_SIZE(r)	(BTRFS_LEAF_DATA_SIZE(r) - \
> > +#define BTRFS_MAX_XATTR_SIZE(r)
> 	(BTRFS_LEAF_DATA_SIZE(r->fs_info) - \
> >  				 sizeof(struct btrfs_item) -\
> >  				 sizeof(struct btrfs_dir_item))
> >
> > @@ -599,7 +600,8 @@ struct btrfs_extent_item_v0 {
> >  	__le32 refs;
> >  } __attribute__ ((__packed__));
> >
> > -#define BTRFS_MAX_EXTENT_ITEM_SIZE(r) ((BTRFS_LEAF_DATA_SIZE(r) >> 4)
> > - \
> > +#define BTRFS_MAX_EXTENT_ITEM_SIZE(r) \
> > +			((BTRFS_LEAF_DATA_SIZE(r->fs_info) >> 4) - \
> >  					sizeof(struct btrfs_item))
> >  #define BTRFS_MAX_EXTENT_SIZE		SZ_128M
> >
> > diff --git a/file-item.c b/file-item.c index 8e169e18..7b0ff358 100644
> > --- a/file-item.c
> > +++ b/file-item.c
> > @@ -27,7 +27,7 @@
> >  #include "crc32c.h"
> >  #include "internal.h"
> >
> > -#define MAX_CSUM_ITEMS(r,size) ((((BTRFS_LEAF_DATA_SIZE(r) - \
> > +#define MAX_CSUM_ITEMS(r, size) ((((BTRFS_LEAF_DATA_SIZE(r->fs_info)
> > +- \
> >  			       sizeof(struct btrfs_item) * 2) / \
> >  			       size) - 1))
> >  int btrfs_insert_file_extent(struct btrfs_trans_handle *trans, diff
> > --git a/volumes.c b/volumes.c index ce3a5405..034f5d45 100644
> > --- a/volumes.c
> > +++ b/volumes.c
> > @@ -837,7 +837,7 @@ error:
> >  	return ret;
> >  }
> >
> > -#define BTRFS_MAX_DEVS(r) ((BTRFS_LEAF_DATA_SIZE(r)		\
> > +#define BTRFS_MAX_DEVS(r) ((BTRFS_LEAF_DATA_SIZE(r->fs_info)	\
> >  			- sizeof(struct btrfs_item)		\
> >  			- sizeof(struct btrfs_chunk))		\
> >  			/ sizeof(struct btrfs_stripe) + 1)
> >



ÿôèº{.nÇ+‰·Ÿ®‰­†+%ŠËÿ±éݶ\x17¥Šwÿº{.nÇ+‰·¥Š{±ý»k~ÏâžØ^n‡r¡ö¦zË\x1aëh™¨è­Ú&£ûàz¿äz¹Þ—ú+€Ê+zf£¢·hšˆ§~†­†Ûiÿÿïêÿ‘êçz_è®\x0fæj:+v‰¨þ)ߣøm

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH 2/6] btrfs-progs: Use fs_info instead of root for BTRFS_NODEPTRS_PER_BLOCK
  2018-01-26  3:22 ` [PATCH 2/6] btrfs-progs: Use fs_info instead of root for BTRFS_NODEPTRS_PER_BLOCK Gu Jinxiang
@ 2018-01-26  5:16   ` Qu Wenruo
  2018-01-26  5:34     ` Gu, Jinxiang
  0 siblings, 1 reply; 15+ messages in thread
From: Qu Wenruo @ 2018-01-26  5:16 UTC (permalink / raw)
  To: Gu Jinxiang, linux-btrfs


[-- Attachment #1.1: Type: text/plain, Size: 6891 bytes --]



On 2018年01月26日 11:22, Gu Jinxiang wrote:
> Do a cleanup. Also make it consistent with kernel.
> Use fs_info instead of root for BTRFS_NODEPTRS_PER_BLOCK, since
> maybe in some situation we do not know root, but just know fs_info.
> 
> Signed-off-by: Gu Jinxiang <gujx@cn.fujitsu.com>
> ---
>  cmds-check.c |  4 ++--
>  ctree.c      | 18 +++++++++---------
>  ctree.h      |  3 +--
>  print-tree.c |  2 +-
>  quick-test.c |  2 +-
>  5 files changed, 14 insertions(+), 15 deletions(-)
> 
> diff --git a/cmds-check.c b/cmds-check.c
> index b118ea71..b94fab4f 100644
> --- a/cmds-check.c
> +++ b/cmds-check.c
> @@ -2529,7 +2529,7 @@ static void account_bytes(struct btrfs_root *root, struct btrfs_path *path,
>  	if (level == 0) {
>  		btree_space_waste += btrfs_leaf_free_space(root, eb);
>  	} else {
> -		free_nrs = (BTRFS_NODEPTRS_PER_BLOCK(root) -
> +		free_nrs = (BTRFS_NODEPTRS_PER_BLOCK(root->fs_info) -
>  			    btrfs_header_nritems(eb));
>  		btree_space_waste += free_nrs * sizeof(struct btrfs_key_ptr);
>  	}
> @@ -9504,7 +9504,7 @@ static int run_next_block(struct btrfs_root *root,
>  				add_pending(pending, seen, ptr, size);
>  			}
>  		}
> -		btree_space_waste += (BTRFS_NODEPTRS_PER_BLOCK(root) -
> +		btree_space_waste += (BTRFS_NODEPTRS_PER_BLOCK(fs_info) -
>  				      nritems) * sizeof(struct btrfs_key_ptr);
>  	}
>  	total_btree_bytes += buf->len;
> diff --git a/ctree.c b/ctree.c
> index cb16c42c..11d207e7 100644
> --- a/ctree.c
> +++ b/ctree.c
> @@ -429,7 +429,7 @@ btrfs_check_node(struct btrfs_root *root, struct btrfs_disk_key *parent_key,
>  	u32 nritems = btrfs_header_nritems(buf);
>  	enum btrfs_tree_block_status ret = BTRFS_TREE_BLOCK_INVALID_NRITEMS;
>  
> -	if (nritems == 0 || nritems > BTRFS_NODEPTRS_PER_BLOCK(root))
> +	if (nritems == 0 || nritems > BTRFS_NODEPTRS_PER_BLOCK(root->fs_info))
>  		goto fail;
>  
>  	ret = BTRFS_TREE_BLOCK_INVALID_PARENT_KEY;
> @@ -716,7 +716,7 @@ static int balance_level(struct btrfs_trans_handle *trans,
>  		return ret;
>  	}
>  	if (btrfs_header_nritems(mid) >
> -	    BTRFS_NODEPTRS_PER_BLOCK(root) / 4)
> +	    BTRFS_NODEPTRS_PER_BLOCK(fs_info) / 4)
>  		return 0;
>  
>  	left = read_node_slot(fs_info, parent, pslot - 1);
> @@ -884,7 +884,7 @@ static int noinline push_nodes_for_insert(struct btrfs_trans_handle *trans,
>  	if (extent_buffer_uptodate(left)) {
>  		u32 left_nr;
>  		left_nr = btrfs_header_nritems(left);
> -		if (left_nr >= BTRFS_NODEPTRS_PER_BLOCK(root) - 1) {
> +		if (left_nr >= BTRFS_NODEPTRS_PER_BLOCK(fs_info) - 1) {
>  			wret = 1;
>  		} else {
>  			ret = btrfs_cow_block(trans, root, left, parent,
> @@ -927,7 +927,7 @@ static int noinline push_nodes_for_insert(struct btrfs_trans_handle *trans,
>  	if (extent_buffer_uptodate(right)) {
>  		u32 right_nr;
>  		right_nr = btrfs_header_nritems(right);
> -		if (right_nr >= BTRFS_NODEPTRS_PER_BLOCK(root) - 1) {
> +		if (right_nr >= BTRFS_NODEPTRS_PER_BLOCK(root->fs_info) - 1) {
>  			wret = 1;
>  		} else {
>  			ret = btrfs_cow_block(trans, root, right,
> @@ -1146,7 +1146,7 @@ again:
>  			p->slots[level] = slot;
>  			if ((p->search_for_split || ins_len > 0) &&
>  			    btrfs_header_nritems(b) >=
> -			    BTRFS_NODEPTRS_PER_BLOCK(root) - 3) {
> +			    BTRFS_NODEPTRS_PER_BLOCK(fs_info) - 3) {
>  				int sret = split_node(trans, root, p, level);
>  				BUG_ON(sret > 0);
>  				if (sret)
> @@ -1292,7 +1292,7 @@ static int push_node_left(struct btrfs_trans_handle *trans,
>  
>  	src_nritems = btrfs_header_nritems(src);
>  	dst_nritems = btrfs_header_nritems(dst);
> -	push_items = BTRFS_NODEPTRS_PER_BLOCK(root) - dst_nritems;
> +	push_items = BTRFS_NODEPTRS_PER_BLOCK(root->fs_info) - dst_nritems;
>  	WARN_ON(btrfs_header_generation(src) != trans->transid);
>  	WARN_ON(btrfs_header_generation(dst) != trans->transid);
>  
> @@ -1362,7 +1362,7 @@ static int balance_node_right(struct btrfs_trans_handle *trans,
>  
>  	src_nritems = btrfs_header_nritems(src);
>  	dst_nritems = btrfs_header_nritems(dst);
> -	push_items = BTRFS_NODEPTRS_PER_BLOCK(root) - dst_nritems;
> +	push_items = BTRFS_NODEPTRS_PER_BLOCK(root->fs_info) - dst_nritems;
>  	if (push_items <= 0) {
>  		return 1;
>  	}
> @@ -1490,7 +1490,7 @@ static int insert_ptr(struct btrfs_trans_handle *trans, struct btrfs_root
>  	nritems = btrfs_header_nritems(lower);
>  	if (slot > nritems)
>  		BUG();
> -	if (nritems == BTRFS_NODEPTRS_PER_BLOCK(root))
> +	if (nritems == BTRFS_NODEPTRS_PER_BLOCK(root->fs_info))
>  		BUG();
>  	if (slot < nritems) {
>  		/* shift the items */
> @@ -1539,7 +1539,7 @@ static int split_node(struct btrfs_trans_handle *trans, struct btrfs_root
>  		ret = push_nodes_for_insert(trans, root, path, level);
>  		c = path->nodes[level];
>  		if (!ret && btrfs_header_nritems(c) <
> -		    BTRFS_NODEPTRS_PER_BLOCK(root) - 3)
> +		    BTRFS_NODEPTRS_PER_BLOCK(root->fs_info) - 3)
>  			return 0;
>  		if (ret < 0)
>  			return ret;
> diff --git a/ctree.h b/ctree.h
> index 11913efa..9e9d3d22 100644
> --- a/ctree.h
> +++ b/ctree.h
> @@ -356,8 +356,7 @@ struct btrfs_header {
>  	u8 level;
>  } __attribute__ ((__packed__));
>  
> -#define BTRFS_NODEPTRS_PER_BLOCK(r) (((r)->fs_info->nodesize - \
> -			        sizeof(struct btrfs_header)) / \
> +#define BTRFS_NODEPTRS_PER_BLOCK(fs_info) (BTRFS_LEAF_DATA_SIZE(fs_info) / \
>  			        sizeof(struct btrfs_key_ptr))

Why not declare it as inline function?
Since kernel code is using inline function.

Thanks,
Qu

>  #define __BTRFS_LEAF_DATA_SIZE(bs) ((bs) - sizeof(struct btrfs_header))
>  #define BTRFS_LEAF_DATA_SIZE(fs_info) \
> diff --git a/print-tree.c b/print-tree.c
> index d3fa8621..5f37ef3e 100644
> --- a/print-tree.c
> +++ b/print-tree.c
> @@ -1359,7 +1359,7 @@ void btrfs_print_tree(struct btrfs_root *root, struct extent_buffer *eb, int fol
>  	printf("node %llu level %d items %d free %u generation %llu owner %llu\n",
>  	       (unsigned long long)eb->start,
>  	        btrfs_header_level(eb), nr,
> -		(u32)BTRFS_NODEPTRS_PER_BLOCK(root) - nr,
> +		(u32)BTRFS_NODEPTRS_PER_BLOCK(root->fs_info) - nr,
>  		(unsigned long long)btrfs_header_generation(eb),
>  		(unsigned long long)btrfs_header_owner(eb));
>  	print_uuids(eb);
> diff --git a/quick-test.c b/quick-test.c
> index b1e7999d..5da47c32 100644
> --- a/quick-test.c
> +++ b/quick-test.c
> @@ -110,7 +110,7 @@ int main(int ac, char **av) {
>  	printf("node %p level %d total ptrs %d free spc %lu\n", root->node,
>  	        btrfs_header_level(root->node),
>  		btrfs_header_nritems(root->node),
> -		(unsigned long)BTRFS_NODEPTRS_PER_BLOCK(root) -
> +		(unsigned long)BTRFS_NODEPTRS_PER_BLOCK(root->fs_info) -
>  		btrfs_header_nritems(root->node));
>  	printf("all searches good, deleting some items\n");
>  	i = 0;
> 


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 520 bytes --]

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH 1/6] btrfs-progs: Use fs_info instead of root for BTRFS_LEAF_DATA_SIZE
  2018-01-26  5:12   ` Gu, Jinxiang
@ 2018-01-26  5:21     ` Qu Wenruo
  0 siblings, 0 replies; 15+ messages in thread
From: Qu Wenruo @ 2018-01-26  5:21 UTC (permalink / raw)
  To: Gu, Jinxiang, linux-btrfs@vger.kernel.org


[-- Attachment #1.1: Type: text/plain, Size: 15306 bytes --]



On 2018年01月26日 13:12, Gu, Jinxiang wrote:
> Hi,
> 
>> -----Original Message-----
>> From: Qu Wenruo [mailto:quwenruo.btrfs@gmx.com]
>> Sent: Friday, January 26, 2018 11:37 AM
>> To: Gu, Jinxiang/顾 金香 <gujx@cn.fujitsu.com>;
>> linux-btrfs@vger.kernel.org
>> Subject: Re: [PATCH 1/6] btrfs-progs: Use fs_info instead of root for
>> BTRFS_LEAF_DATA_SIZE
>>
>>
>>
>> On 2018年01月26日 11:22, Gu Jinxiang wrote:
>>> Do a cleanup. Also make it consistent with kernel.
>>> Use fs_info instead of root for BTRFS_LEAF_DATA_SIZE, since maybe in
>>> some situation we do not know root, but just know fs_info.
>>>
>>> Signed-off-by: Gu Jinxiang <gujx@cn.fujitsu.com>
>>> ---
>>>  cmds-check.c              |  6 +++---
>>>  convert/source-ext2.c     |  2 +-
>>>  convert/source-reiserfs.c |  4 ++--
>>>  ctree.c                   | 49
>> +++++++++++++++++++++++++++--------------------
>>>  ctree.h                   | 10 ++++++----
>>>  file-item.c               |  2 +-
>>>  volumes.c                 |  2 +-
>>>  7 files changed, 42 insertions(+), 33 deletions(-)
>>>
>>> diff --git a/cmds-check.c b/cmds-check.c index 7d6bbb07..b118ea71
>>> 100644
>>> --- a/cmds-check.c
>>> +++ b/cmds-check.c
>>> @@ -7255,9 +7255,9 @@ again:
>>>  		unsigned int shift = 0, offset;
>>>
>>>  		if (i == 0 && btrfs_item_end_nr(buf, i) !=
>>> -		    BTRFS_LEAF_DATA_SIZE(root)) {
>>> +		    BTRFS_LEAF_DATA_SIZE(root->fs_info)) {
>>>  			if (btrfs_item_end_nr(buf, i) >
>>> -			    BTRFS_LEAF_DATA_SIZE(root)) {
>>> +			    BTRFS_LEAF_DATA_SIZE(root->fs_info)) {
>>>  				ret = delete_bogus_item(root, path, buf,
>> i);
>>>  				if (!ret)
>>>  					goto again;
>>> @@ -7266,7 +7266,7 @@ again:
>>>  				ret = -EIO;
>>>  				break;
>>>  			}
>>> -			shift = BTRFS_LEAF_DATA_SIZE(root) -
>>> +			shift = BTRFS_LEAF_DATA_SIZE(root->fs_info) -
>>>  				btrfs_item_end_nr(buf, i);
>>>  		} else if (i > 0 && btrfs_item_end_nr(buf, i) !=
>>>  			   btrfs_item_offset_nr(buf, i - 1)) { diff --git
>>> a/convert/source-ext2.c b/convert/source-ext2.c index
>>> e9277213..e5c2a943 100644
>>> --- a/convert/source-ext2.c
>>> +++ b/convert/source-ext2.c
>>> @@ -520,7 +520,7 @@ static int ext2_copy_single_xattr(struct
>> btrfs_trans_handle *trans,
>>>  	}
>>>  	strncpy(namebuf, xattr_prefix_table[name_index],
>> XATTR_NAME_MAX);
>>>  	strncat(namebuf, EXT2_EXT_ATTR_NAME(entry), entry->e_name_len);
>>> -	if (name_len + datalen > BTRFS_LEAF_DATA_SIZE(root) -
>>> +	if (name_len + datalen > BTRFS_LEAF_DATA_SIZE(root->fs_info) -
>>>  	    sizeof(struct btrfs_item) - sizeof(struct btrfs_dir_item)) {
>>>  		fprintf(stderr, "skip large xattr on inode %Lu
>> name %.*s\n",
>>>  			objectid - INO_OFFSET, name_len, namebuf); diff
>> --git
>>> a/convert/source-reiserfs.c b/convert/source-reiserfs.c index
>>> be79d8e2..e3582bda 100644
>>> --- a/convert/source-reiserfs.c
>>> +++ b/convert/source-reiserfs.c
>>> @@ -676,7 +676,7 @@ static int
>> reiserfs_xattr_indirect_fn(reiserfs_filsys_t fs, u64 position,
>>>  	size_t alloc = min(position + num_blocks * fs->fs_blocksize, size);
>>>  	char *body;
>>>
>>> -	if (size > BTRFS_LEAF_DATA_SIZE(xa_data->root) -
>>> +	if (size > BTRFS_LEAF_DATA_SIZE(xa_data->root->fs_info) -
>>>  	    sizeof(struct btrfs_item) - sizeof(struct btrfs_dir_item)) {
>>>  		fprintf(stderr, "skip large xattr on objectid %llu
>> name %.*s\n",
>>>  			xa_data->target_oid, (int)xa_data->namelen, @@
>> -714,7 +714,7 @@
>>> static int reiserfs_xattr_direct_fn(reiserfs_filsys_t fs, __u64
>> position,
>>>  	struct reiserfs_xattr_data *xa_data = data;
>>>  	char *newbody;
>>>
>>> -	if (size > BTRFS_LEAF_DATA_SIZE(xa_data->root) -
>>> +	if (size > BTRFS_LEAF_DATA_SIZE(xa_data->root->fs_info) -
>>>  	    sizeof(struct btrfs_item) - sizeof(struct btrfs_dir_item)) {
>>>  		fprintf(stderr, "skip large xattr on objectid %llu
>> name %.*s\n",
>>>  			xa_data->target_oid, (int)xa_data->namelen,
>> diff --git a/ctree.c
>>> b/ctree.c index f4cf006b..cb16c42c 100644
>>> --- a/ctree.c
>>> +++ b/ctree.c
>>> @@ -415,7 +415,7 @@ static inline unsigned int leaf_data_end(struct
>>> btrfs_root *root,
>>
>> Why not make this function to follow the parameters of kernel one?
> 
> In mkfs procedure(i.e. function make_btrfs), need to use BTRFS_LEAF_DATA_SIZE to get the data size of a leaf,
> however fs_info is not be initialed yet.
> So, in progs, __BTRFS_LEAF_DATA_SIZE is designed for those situation. And BTRFS_LEAF_DATA_SIZE calls __BTRFS_LEAF_DATA_SIZE
> by transfer fs_info->nodesize.

I mean why function leaf_data_end() is not using btrfs_fs_info.

This function is static and not used outside of ctree.c, so it's not
possible to be called in mkfs/convert.

Thanks,
Qu

> 
> Thanks,
> Gu
> 
>>
>> Thanks,
>> Qu
>>
>>>  {
>>>  	u32 nr = btrfs_header_nritems(leaf);
>>>  	if (nr == 0)
>>> -		return BTRFS_LEAF_DATA_SIZE(root);
>>> +		return BTRFS_LEAF_DATA_SIZE(root->fs_info);
>>>  	return btrfs_item_offset_nr(leaf, nr - 1);  }
>>>
>>> @@ -517,24 +517,26 @@ btrfs_check_leaf(struct btrfs_root *root, struct
>> btrfs_disk_key *parent_key,
>>>  			goto fail;
>>>  		}
>>>  		if (i == 0 && btrfs_item_end_nr(buf, i) !=
>>> -		    BTRFS_LEAF_DATA_SIZE(root)) {
>>> +		    BTRFS_LEAF_DATA_SIZE(root->fs_info)) {
>>>  			ret = BTRFS_TREE_BLOCK_INVALID_OFFSETS;
>>>  			fprintf(stderr, "bad item end %u wanted %u\n",
>>>  				btrfs_item_end_nr(buf, i),
>>> -				(unsigned)BTRFS_LEAF_DATA_SIZE(root));
>>> +
>> 	(unsigned)BTRFS_LEAF_DATA_SIZE(root->fs_info));
>>>  			goto fail;
>>>  		}
>>>  	}
>>>
>>>  	for (i = 0; i < nritems; i++) {
>>> -		if (btrfs_item_end_nr(buf, i) >
>> BTRFS_LEAF_DATA_SIZE(root)) {
>>> +		if (btrfs_item_end_nr(buf, i) >
>>> +				BTRFS_LEAF_DATA_SIZE(root->fs_info)) {
>>>  			btrfs_item_key(buf, &key, 0);
>>>  			btrfs_print_key(&key);
>>>  			fflush(stdout);
>>>  			ret = BTRFS_TREE_BLOCK_INVALID_OFFSETS;
>>>  			fprintf(stderr, "slot end outside of leaf %llu
>>> %llu\n",
>>>  				(unsigned long
>> long)btrfs_item_end_nr(buf, i),
>>> -				(unsigned long
>> long)BTRFS_LEAF_DATA_SIZE(root));
>>> +				(unsigned long
>> long)BTRFS_LEAF_DATA_SIZE(
>>> +					root->fs_info));
>>>  			goto fail;
>>>  		}
>>>  	}
>>> @@ -1621,7 +1623,7 @@ static int leaf_space_used(struct extent_buffer
>> *l, int start, int nr)
>>>   */
>>>  int btrfs_leaf_free_space(struct btrfs_root *root, struct
>>> extent_buffer *leaf)  {
>>> -	u32 nodesize = (root ? BTRFS_LEAF_DATA_SIZE(root) : leaf->len);
>>> +	u32 nodesize = (root ? BTRFS_LEAF_DATA_SIZE(root->fs_info) :
>>> +leaf->len);
>>>  	int nritems = btrfs_header_nritems(leaf);
>>>  	int ret;
>>>  	ret = nodesize - leaf_space_used(leaf, 0, nritems); @@ -1742,11
>>> +1744,11 @@ static int push_leaf_right(struct btrfs_trans_handle *trans,
>> struct btrfs_root
>>>  	memmove_extent_buffer(right,
>>>  			      btrfs_leaf_data(right) + data_end -
>> push_space,
>>>  			      btrfs_leaf_data(right) + data_end,
>>> -			      BTRFS_LEAF_DATA_SIZE(root) - data_end);
>>> +			      BTRFS_LEAF_DATA_SIZE(root->fs_info) -
>> data_end);
>>>
>>>  	/* copy from the left data area */
>>>  	copy_extent_buffer(right, left, btrfs_leaf_data(right) +
>>> -		     BTRFS_LEAF_DATA_SIZE(root) - push_space,
>>> +		     BTRFS_LEAF_DATA_SIZE(root->fs_info) - push_space,
>>>  		     btrfs_leaf_data(left) + leaf_data_end(root, left),
>>>  		     push_space);
>>>
>>> @@ -1762,7 +1764,7 @@ static int push_leaf_right(struct
>> btrfs_trans_handle *trans, struct btrfs_root
>>>  	/* update the item pointers */
>>>  	right_nritems += push_items;
>>>  	btrfs_set_header_nritems(right, right_nritems);
>>> -	push_space = BTRFS_LEAF_DATA_SIZE(root);
>>> +	push_space = BTRFS_LEAF_DATA_SIZE(root->fs_info);
>>>  	for (i = 0; i < right_nritems; i++) {
>>>  		item = btrfs_item_nr(i);
>>>  		push_space -= btrfs_item_size(right, item); @@ -1881,7
>> +1883,7 @@
>>> static int push_leaf_left(struct btrfs_trans_handle *trans, struct
>> btrfs_root
>>>  			   btrfs_item_nr_offset(0),
>>>  			   push_items * sizeof(struct btrfs_item));
>>>
>>> -	push_space = BTRFS_LEAF_DATA_SIZE(root) -
>>> +	push_space = BTRFS_LEAF_DATA_SIZE(root->fs_info) -
>>>  		     btrfs_item_offset_nr(right, push_items -1);
>>>
>>>  	copy_extent_buffer(left, right, btrfs_leaf_data(left) + @@
>> -1899,7
>>> +1901,8 @@ static int push_leaf_left(struct btrfs_trans_handle *trans,
>> struct btrfs_root
>>>  		item = btrfs_item_nr(i);
>>>  		ioff = btrfs_item_offset(left, item);
>>>  		btrfs_set_item_offset(left, item,
>>> -		      ioff - (BTRFS_LEAF_DATA_SIZE(root) -
>> old_left_item_size));
>>> +		      ioff - (BTRFS_LEAF_DATA_SIZE(root->fs_info) -
>>> +			      old_left_item_size));
>>>  	}
>>>  	btrfs_set_header_nritems(left, old_left_nritems + push_items);
>>>
>>> @@ -1913,7 +1916,8 @@ static int push_leaf_left(struct btrfs_trans_handle
>> *trans, struct btrfs_root
>>>  		push_space = btrfs_item_offset_nr(right, push_items - 1)
>> -
>>>  						  leaf_data_end(root,
>> right);
>>>  		memmove_extent_buffer(right, btrfs_leaf_data(right) +
>>> -				      BTRFS_LEAF_DATA_SIZE(root) -
>> push_space,
>>> +
>> BTRFS_LEAF_DATA_SIZE(root->fs_info) -
>>> +				      push_space,
>>>  				      btrfs_leaf_data(right) +
>>>  				      leaf_data_end(root, right),
>> push_space);
>>>
>>> @@ -1924,7 +1928,7 @@ static int push_leaf_left(struct btrfs_trans_handle
>> *trans, struct btrfs_root
>>>  	}
>>>  	right_nritems -= push_items;
>>>  	btrfs_set_header_nritems(right, right_nritems);
>>> -	push_space = BTRFS_LEAF_DATA_SIZE(root);
>>> +	push_space = BTRFS_LEAF_DATA_SIZE(root->fs_info);
>>>  	for (i = 0; i < right_nritems; i++) {
>>>  		item = btrfs_item_nr(i);
>>>  		push_space = push_space - btrfs_item_size(right, item);
>> @@ -1981,11
>>> +1985,12 @@ static noinline int copy_for_split(struct btrfs_trans_handle
>> *trans,
>>>  			   nritems * sizeof(struct btrfs_item));
>>>
>>>  	copy_extent_buffer(right, l,
>>> -		     btrfs_leaf_data(right) +
>> BTRFS_LEAF_DATA_SIZE(root) -
>>> +		     btrfs_leaf_data(right) +
>>> +		     BTRFS_LEAF_DATA_SIZE(root->fs_info) -
>>>  		     data_copy_size, btrfs_leaf_data(l) +
>>>  		     leaf_data_end(root, l), data_copy_size);
>>>
>>> -	rt_data_off = BTRFS_LEAF_DATA_SIZE(root) -
>>> +	rt_data_off = BTRFS_LEAF_DATA_SIZE(root->fs_info) -
>>>  		      btrfs_item_end_nr(l, mid);
>>>
>>>  	for (i = 0; i < nritems; i++) {
>>> @@ -2046,7 +2051,7 @@ static noinline int split_leaf(struct
>> btrfs_trans_handle *trans,
>>>  	l = path->nodes[0];
>>>  	slot = path->slots[0];
>>>  	if (extend && data_size + btrfs_item_size_nr(l, slot) +
>>> -	    sizeof(struct btrfs_item) > BTRFS_LEAF_DATA_SIZE(root))
>>> +	    sizeof(struct btrfs_item) >
>> BTRFS_LEAF_DATA_SIZE(root->fs_info))
>>>  		return -EOVERFLOW;
>>>
>>>  	/* first try to make some room by pushing left and right */ @@
>>> -2081,21 +2086,22 @@ again:
>>>  	if (mid <= slot) {
>>>  		if (nritems == 1 ||
>>>  		    leaf_space_used(l, mid, nritems - mid) + data_size >
>>> -			BTRFS_LEAF_DATA_SIZE(root)) {
>>> +			BTRFS_LEAF_DATA_SIZE(root->fs_info)) {
>>>  			if (slot >= nritems) {
>>>  				split = 0;
>>>  			} else {
>>>  				mid = slot;
>>>  				if (mid != nritems &&
>>>  				    leaf_space_used(l, mid, nritems -
>> mid) +
>>> -				    data_size >
>> BTRFS_LEAF_DATA_SIZE(root)) {
>>> +				    data_size >
>>> +
>> BTRFS_LEAF_DATA_SIZE(root->fs_info)) {
>>>  					split = 2;
>>>  				}
>>>  			}
>>>  		}
>>>  	} else {
>>>  		if (leaf_space_used(l, 0, mid) + data_size >
>>> -			BTRFS_LEAF_DATA_SIZE(root)) {
>>> +			BTRFS_LEAF_DATA_SIZE(root->fs_info)) {
>>>  			if (!extend && data_size && slot == 0) {
>>>  				split = 0;
>>>  			} else if ((extend || !data_size) && slot == 0)
>> { @@ -2104,7
>>> +2110,8 @@ again:
>>>  				mid = slot;
>>>  				if (mid != nritems &&
>>>  				    leaf_space_used(l, mid, nritems -
>> mid) +
>>> -				    data_size >
>> BTRFS_LEAF_DATA_SIZE(root)) {
>>> +				    data_size >
>>> +
>> BTRFS_LEAF_DATA_SIZE(root->fs_info)) {
>>>  					split = 2 ;
>>>  				}
>>>  			}
>>> @@ -2729,7 +2736,7 @@ int btrfs_del_items(struct btrfs_trans_handle
>> *trans, struct btrfs_root *root,
>>>  		}
>>>
>>>  		/* delete the leaf if it is mostly empty */
>>> -		if (used < BTRFS_LEAF_DATA_SIZE(root) / 4) {
>>> +		if (used < BTRFS_LEAF_DATA_SIZE(root->fs_info) / 4) {
>>>  			/* push_leaf_left fixes the path.
>>>  			 * make sure the path still points to our leaf
>>>  			 * for possible call to del_ptr below diff --git
>> a/ctree.h
>>> b/ctree.h index ef422ea6..11913efa 100644
>>> --- a/ctree.h
>>> +++ b/ctree.h
>>> @@ -360,11 +360,12 @@ struct btrfs_header {
>>>  			        sizeof(struct btrfs_header)) / \
>>>  			        sizeof(struct btrfs_key_ptr))  #define
>>> __BTRFS_LEAF_DATA_SIZE(bs) ((bs) - sizeof(struct btrfs_header))
>>> -#define BTRFS_LEAF_DATA_SIZE(r)
>>> (__BTRFS_LEAF_DATA_SIZE(r->fs_info->nodesize))
>>> -#define BTRFS_MAX_INLINE_DATA_SIZE(r) (BTRFS_LEAF_DATA_SIZE(r) - \
>>> +#define BTRFS_LEAF_DATA_SIZE(fs_info) \
>>> +
>> 	(__BTRFS_LEAF_DATA_SIZE(fs_info->nodesize))
>>> +#define BTRFS_MAX_INLINE_DATA_SIZE(r)
>>> +(BTRFS_LEAF_DATA_SIZE(r->fs_info) - \
>>>  					sizeof(struct btrfs_item) - \
>>>  					sizeof(struct
>> btrfs_file_extent_item))
>>> -#define BTRFS_MAX_XATTR_SIZE(r)	(BTRFS_LEAF_DATA_SIZE(r) - \
>>> +#define BTRFS_MAX_XATTR_SIZE(r)
>> 	(BTRFS_LEAF_DATA_SIZE(r->fs_info) - \
>>>  				 sizeof(struct btrfs_item) -\
>>>  				 sizeof(struct btrfs_dir_item))
>>>
>>> @@ -599,7 +600,8 @@ struct btrfs_extent_item_v0 {
>>>  	__le32 refs;
>>>  } __attribute__ ((__packed__));
>>>
>>> -#define BTRFS_MAX_EXTENT_ITEM_SIZE(r) ((BTRFS_LEAF_DATA_SIZE(r) >> 4)
>>> - \
>>> +#define BTRFS_MAX_EXTENT_ITEM_SIZE(r) \
>>> +			((BTRFS_LEAF_DATA_SIZE(r->fs_info) >> 4) - \
>>>  					sizeof(struct btrfs_item))
>>>  #define BTRFS_MAX_EXTENT_SIZE		SZ_128M
>>>
>>> diff --git a/file-item.c b/file-item.c index 8e169e18..7b0ff358 100644
>>> --- a/file-item.c
>>> +++ b/file-item.c
>>> @@ -27,7 +27,7 @@
>>>  #include "crc32c.h"
>>>  #include "internal.h"
>>>
>>> -#define MAX_CSUM_ITEMS(r,size) ((((BTRFS_LEAF_DATA_SIZE(r) - \
>>> +#define MAX_CSUM_ITEMS(r, size) ((((BTRFS_LEAF_DATA_SIZE(r->fs_info)
>>> +- \
>>>  			       sizeof(struct btrfs_item) * 2) / \
>>>  			       size) - 1))
>>>  int btrfs_insert_file_extent(struct btrfs_trans_handle *trans, diff
>>> --git a/volumes.c b/volumes.c index ce3a5405..034f5d45 100644
>>> --- a/volumes.c
>>> +++ b/volumes.c
>>> @@ -837,7 +837,7 @@ error:
>>>  	return ret;
>>>  }
>>>
>>> -#define BTRFS_MAX_DEVS(r) ((BTRFS_LEAF_DATA_SIZE(r)		\
>>> +#define BTRFS_MAX_DEVS(r) ((BTRFS_LEAF_DATA_SIZE(r->fs_info)	\
>>>  			- sizeof(struct btrfs_item)		\
>>>  			- sizeof(struct btrfs_chunk))		\
>>>  			/ sizeof(struct btrfs_stripe) + 1)
>>>
> 
> 
> 
> N�����r��y���b�X��ǧv�^�)޺{.n�+����{�n�߲)���w*\x1fjg���\x1e�����ݢj/���z�ޖ��2�ޙ���&�)ߡ�a��\x7f��\x1e�G���h�\x0f�j:+v���w�٥
> 


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 520 bytes --]

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH 3/6] btrfs-progs: Use fs_info instead of root for BTRFS_MAX_INLINE_DATA_SIZE
  2018-01-26  3:22 ` [PATCH 3/6] btrfs-progs: Use fs_info instead of root for BTRFS_MAX_INLINE_DATA_SIZE Gu Jinxiang
@ 2018-01-26  5:29   ` Qu Wenruo
  0 siblings, 0 replies; 15+ messages in thread
From: Qu Wenruo @ 2018-01-26  5:29 UTC (permalink / raw)
  To: Gu Jinxiang, linux-btrfs


[-- Attachment #1.1: Type: text/plain, Size: 3816 bytes --]



On 2018年01月26日 11:22, Gu Jinxiang wrote:
> Do a cleanup. Also make it consistent with kernel.
> Use fs_info instead of root for BTRFS_MAX_INLINE_DATA_SIZE, since
> maybe in some situation we do not know root, but just know fs_info.
> 
> Signed-off-by: Gu Jinxiang <gujx@cn.fujitsu.com>
> ---
>  convert/source-ext2.c     | 2 +-
>  convert/source-reiserfs.c | 2 +-
>  ctree.h                   | 2 +-
>  mkfs/main.c               | 4 ++--
>  4 files changed, 5 insertions(+), 5 deletions(-)
> 
> diff --git a/convert/source-ext2.c b/convert/source-ext2.c
> index e5c2a943..f5ecd8cf 100644
> --- a/convert/source-ext2.c
> +++ b/convert/source-ext2.c
> @@ -309,7 +309,7 @@ static int ext2_create_file_extents(struct btrfs_trans_handle *trans,
>  		goto fail;
>  	if ((convert_flags & CONVERT_FLAG_INLINE_DATA) && data.first_block == 0
>  	    && data.num_blocks > 0
> -	    && inode_size <= BTRFS_MAX_INLINE_DATA_SIZE(root)) {
> +	    && inode_size <= BTRFS_MAX_INLINE_DATA_SIZE(root->fs_info)) {
>  		u64 num_bytes = data.num_blocks * sectorsize;
>  		u64 disk_bytenr = data.disk_block * sectorsize;
>  		u64 nbytes;
> diff --git a/convert/source-reiserfs.c b/convert/source-reiserfs.c
> index e3582bda..39d6f072 100644
> --- a/convert/source-reiserfs.c
> +++ b/convert/source-reiserfs.c
> @@ -376,7 +376,7 @@ static int reiserfs_convert_tail(struct btrfs_trans_handle *trans,
>  	u64 isize;
>  	int ret;
>  
> -	if (length >= BTRFS_MAX_INLINE_DATA_SIZE(root))
> +	if (length >= BTRFS_MAX_INLINE_DATA_SIZE(root->fs_info))
>  		return convert_direct(trans, root, objectid, inode, body,
>  				      length, offset, convert_flags);
>  
> diff --git a/ctree.h b/ctree.h
> index 9e9d3d22..ace93cc3 100644
> --- a/ctree.h
> +++ b/ctree.h
> @@ -361,7 +361,7 @@ struct btrfs_header {
>  #define __BTRFS_LEAF_DATA_SIZE(bs) ((bs) - sizeof(struct btrfs_header))
>  #define BTRFS_LEAF_DATA_SIZE(fs_info) \
>  				(__BTRFS_LEAF_DATA_SIZE(fs_info->nodesize))
> -#define BTRFS_MAX_INLINE_DATA_SIZE(r) (BTRFS_LEAF_DATA_SIZE(r->fs_info) - \
> +#define BTRFS_MAX_INLINE_DATA_SIZE(fs_info) (BTRFS_LEAF_DATA_SIZE(fs_info) - \
>  					sizeof(struct btrfs_item) - \
>  					sizeof(struct btrfs_file_extent_item))

I found this function is different from kernel one, not only in
declaration, but also result:

Kernel one is:
BTRFS_MAX_ITEM_SIZE(info) - BTRFS_FILE_EXTENT_INLINE_DATA_START

Which equals to:
BTRFS_LEAF_DATA_SIZE(info) - sizeof(struct btrfs_item) - 	
(offsetof(struct btrfs_file_extent_item, disk_bytenr))

However in btrfs-progs we have:
BTRFS_LEAF_DATA_SIZE(fs_info) - sizeof(struct btrfs_item) -
sizeof(struct btrfs_file_extent_item).

Although the btrfs-progs definition is safer, but for sake of
consistency, it's better to copy the whole kernel definition here.

Thanks,
Qu

>  #define BTRFS_MAX_XATTR_SIZE(r)	(BTRFS_LEAF_DATA_SIZE(r->fs_info) - \
> diff --git a/mkfs/main.c b/mkfs/main.c
> index d817ad8d..a301efc3 100644
> --- a/mkfs/main.c
> +++ b/mkfs/main.c
> @@ -498,7 +498,7 @@ static int fill_inode_item(struct btrfs_trans_handle *trans,
>  	}
>  	if (S_ISREG(src->st_mode)) {
>  		btrfs_set_stack_inode_size(dst, (u64)src->st_size);
> -		if (src->st_size <= BTRFS_MAX_INLINE_DATA_SIZE(root))
> +		if (src->st_size <= BTRFS_MAX_INLINE_DATA_SIZE(root->fs_info))
>  			btrfs_set_stack_inode_nbytes(dst, src->st_size);
>  		else {
>  			blocks = src->st_size / sectorsize;
> @@ -686,7 +686,7 @@ static int add_file_items(struct btrfs_trans_handle *trans,
>  	if (st->st_size % sectorsize)
>  		blocks += 1;
>  
> -	if (st->st_size <= BTRFS_MAX_INLINE_DATA_SIZE(root)) {
> +	if (st->st_size <= BTRFS_MAX_INLINE_DATA_SIZE(root->fs_info)) {
>  		char *buffer = malloc(st->st_size);
>  
>  		if (!buffer) {
> 


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 520 bytes --]

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH 4/6] btrfs-progs: Use fs_info instead of root for BTRFS_MAX_XATTR_SIZE
  2018-01-26  3:22 ` [PATCH 4/6] btrfs-progs: Use fs_info instead of root for BTRFS_MAX_XATTR_SIZE Gu Jinxiang
@ 2018-01-26  5:31   ` Qu Wenruo
  0 siblings, 0 replies; 15+ messages in thread
From: Qu Wenruo @ 2018-01-26  5:31 UTC (permalink / raw)
  To: Gu Jinxiang, linux-btrfs


[-- Attachment #1.1: Type: text/plain, Size: 1716 bytes --]



On 2018年01月26日 11:22, Gu Jinxiang wrote:
> Do a cleanup. Also make it consistent with kernel.
> Use fs_info instead of root for BTRFS_MAX_XATTR_SIZE, since
> maybe in some situation we do not know root, but just know fs_info.
> 
> Signed-off-by: Gu Jinxiang <gujx@cn.fujitsu.com>
> ---
>  ctree.h    | 2 +-
>  dir-item.c | 3 ++-
>  2 files changed, 3 insertions(+), 2 deletions(-)
> 
> diff --git a/ctree.h b/ctree.h
> index ace93cc3..c82e7547 100644
> --- a/ctree.h
> +++ b/ctree.h
> @@ -364,7 +364,7 @@ struct btrfs_header {
>  #define BTRFS_MAX_INLINE_DATA_SIZE(fs_info) (BTRFS_LEAF_DATA_SIZE(fs_info) - \
>  					sizeof(struct btrfs_item) - \
>  					sizeof(struct btrfs_file_extent_item))
> -#define BTRFS_MAX_XATTR_SIZE(r)	(BTRFS_LEAF_DATA_SIZE(r->fs_info) - \
> +#define BTRFS_MAX_XATTR_SIZE(fs_info)	(BTRFS_LEAF_DATA_SIZE(fs_info) - \
>  				 sizeof(struct btrfs_item) -\
>  				 sizeof(struct btrfs_dir_item))

For sake of consistency, it's better to copy kernel definition here.

Thanks,
Qu

>  
> diff --git a/dir-item.c b/dir-item.c
> index 462546c0..0b7250c9 100644
> --- a/dir-item.c
> +++ b/dir-item.c
> @@ -311,7 +311,8 @@ static int verify_dir_item(struct btrfs_root *root,
>  
>  	/* BTRFS_MAX_XATTR_SIZE is the same for all dir items */
>  	if ((btrfs_dir_data_len(leaf, dir_item) +
> -	     btrfs_dir_name_len(leaf, dir_item)) > BTRFS_MAX_XATTR_SIZE(root)) {
> +	     btrfs_dir_name_len(leaf, dir_item)) >
> +			BTRFS_MAX_XATTR_SIZE(root->fs_info)) {
>  		fprintf(stderr, "invalid dir item name + data len: %u + %u\n",
>  		       (unsigned)btrfs_dir_name_len(leaf, dir_item),
>  		       (unsigned)btrfs_dir_data_len(leaf, dir_item));
> 


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 520 bytes --]

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH 6/6] btrfs-progs: remove no longer be used btrfs_alloc_extent
  2018-01-26  3:22 ` [PATCH 6/6] btrfs-progs: remove no longer be used btrfs_alloc_extent Gu Jinxiang
@ 2018-01-26  5:32   ` Qu Wenruo
  0 siblings, 0 replies; 15+ messages in thread
From: Qu Wenruo @ 2018-01-26  5:32 UTC (permalink / raw)
  To: Gu Jinxiang, linux-btrfs


[-- Attachment #1.1: Type: text/plain, Size: 1156 bytes --]



On 2018年01月26日 11:22, Gu Jinxiang wrote:
> Do a cleanup.
> Function btrfs_alloc_extent is no longer be used.
> So let's remove it.
> 
> Signed-off-by: Gu Jinxiang <gujx@cn.fujitsu.com>

Reviewed-by: Qu Wenruo <wqu@suse.com>

Thanks,
Qu

> ---
>  ctree.h | 6 ------
>  1 file changed, 6 deletions(-)
> 
> diff --git a/ctree.h b/ctree.h
> index c82e7547..34d2505e 100644
> --- a/ctree.h
> +++ b/ctree.h
> @@ -2487,12 +2487,6 @@ struct extent_buffer *btrfs_alloc_free_block(struct btrfs_trans_handle *trans,
>  					u32 blocksize, u64 root_objectid,
>  					struct btrfs_disk_key *key, int level,
>  					u64 hint, u64 empty_size);
> -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 empty_size, u64 hint_byte,
> -		       u64 search_end, struct btrfs_key *ins, int data);
>  int btrfs_lookup_extent_info(struct btrfs_trans_handle *trans,
>  			     struct btrfs_root *root, u64 bytenr,
>  			     u64 offset, int metadata, u64 *refs, u64 *flags);
> 


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 520 bytes --]

^ permalink raw reply	[flat|nested] 15+ messages in thread

* RE: [PATCH 2/6] btrfs-progs: Use fs_info instead of root for BTRFS_NODEPTRS_PER_BLOCK
  2018-01-26  5:16   ` Qu Wenruo
@ 2018-01-26  5:34     ` Gu, Jinxiang
  0 siblings, 0 replies; 15+ messages in thread
From: Gu, Jinxiang @ 2018-01-26  5:34 UTC (permalink / raw)
  To: Qu Wenruo, linux-btrfs@vger.kernel.org

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain; charset="utf-8", Size: 7672 bytes --]

Hi,

> -----Original Message-----
> From: Qu Wenruo [mailto:quwenruo.btrfs@gmx.com]
> Sent: Friday, January 26, 2018 1:16 PM
> To: Gu, Jinxiang/顾 金香 <gujx@cn.fujitsu.com>;
> linux-btrfs@vger.kernel.org
> Subject: Re: [PATCH 2/6] btrfs-progs: Use fs_info instead of root for
> BTRFS_NODEPTRS_PER_BLOCK
> 
> 
> 
> On 2018年01月26日 11:22, Gu Jinxiang wrote:
> > Do a cleanup. Also make it consistent with kernel.
> > Use fs_info instead of root for BTRFS_NODEPTRS_PER_BLOCK, since maybe
> > in some situation we do not know root, but just know fs_info.
> >
> > Signed-off-by: Gu Jinxiang <gujx@cn.fujitsu.com>
> > ---
> >  cmds-check.c |  4 ++--
> >  ctree.c      | 18 +++++++++---------
> >  ctree.h      |  3 +--
> >  print-tree.c |  2 +-
> >  quick-test.c |  2 +-
> >  5 files changed, 14 insertions(+), 15 deletions(-)
> >
> > diff --git a/cmds-check.c b/cmds-check.c index b118ea71..b94fab4f
> > 100644
> > --- a/cmds-check.c
> > +++ b/cmds-check.c
> > @@ -2529,7 +2529,7 @@ static void account_bytes(struct btrfs_root *root,
> struct btrfs_path *path,
> >  	if (level == 0) {
> >  		btree_space_waste += btrfs_leaf_free_space(root, eb);
> >  	} else {
> > -		free_nrs = (BTRFS_NODEPTRS_PER_BLOCK(root) -
> > +		free_nrs = (BTRFS_NODEPTRS_PER_BLOCK(root->fs_info) -
> >  			    btrfs_header_nritems(eb));
> >  		btree_space_waste += free_nrs * sizeof(struct
> btrfs_key_ptr);
> >  	}
> > @@ -9504,7 +9504,7 @@ static int run_next_block(struct btrfs_root *root,
> >  				add_pending(pending, seen, ptr, size);
> >  			}
> >  		}
> > -		btree_space_waste += (BTRFS_NODEPTRS_PER_BLOCK(root) -
> > +		btree_space_waste += (BTRFS_NODEPTRS_PER_BLOCK(fs_info)
> -
> >  				      nritems) * sizeof(struct
> btrfs_key_ptr);
> >  	}
> >  	total_btree_bytes += buf->len;
> > diff --git a/ctree.c b/ctree.c
> > index cb16c42c..11d207e7 100644
> > --- a/ctree.c
> > +++ b/ctree.c
> > @@ -429,7 +429,7 @@ btrfs_check_node(struct btrfs_root *root, struct
> btrfs_disk_key *parent_key,
> >  	u32 nritems = btrfs_header_nritems(buf);
> >  	enum btrfs_tree_block_status ret =
> BTRFS_TREE_BLOCK_INVALID_NRITEMS;
> >
> > -	if (nritems == 0 || nritems > BTRFS_NODEPTRS_PER_BLOCK(root))
> > +	if (nritems == 0 || nritems >
> > +BTRFS_NODEPTRS_PER_BLOCK(root->fs_info))
> >  		goto fail;
> >
> >  	ret = BTRFS_TREE_BLOCK_INVALID_PARENT_KEY;
> > @@ -716,7 +716,7 @@ static int balance_level(struct btrfs_trans_handle
> *trans,
> >  		return ret;
> >  	}
> >  	if (btrfs_header_nritems(mid) >
> > -	    BTRFS_NODEPTRS_PER_BLOCK(root) / 4)
> > +	    BTRFS_NODEPTRS_PER_BLOCK(fs_info) / 4)
> >  		return 0;
> >
> >  	left = read_node_slot(fs_info, parent, pslot - 1); @@ -884,7 +884,7
> > @@ static int noinline push_nodes_for_insert(struct btrfs_trans_handle
> *trans,
> >  	if (extent_buffer_uptodate(left)) {
> >  		u32 left_nr;
> >  		left_nr = btrfs_header_nritems(left);
> > -		if (left_nr >= BTRFS_NODEPTRS_PER_BLOCK(root) - 1) {
> > +		if (left_nr >= BTRFS_NODEPTRS_PER_BLOCK(fs_info) - 1) {
> >  			wret = 1;
> >  		} else {
> >  			ret = btrfs_cow_block(trans, root, left, parent,
> @@ -927,7 +927,7
> > @@ static int noinline push_nodes_for_insert(struct btrfs_trans_handle
> *trans,
> >  	if (extent_buffer_uptodate(right)) {
> >  		u32 right_nr;
> >  		right_nr = btrfs_header_nritems(right);
> > -		if (right_nr >= BTRFS_NODEPTRS_PER_BLOCK(root) - 1) {
> > +		if (right_nr >= BTRFS_NODEPTRS_PER_BLOCK(root->fs_info)
> - 1) {
> >  			wret = 1;
> >  		} else {
> >  			ret = btrfs_cow_block(trans, root, right, @@
> -1146,7 +1146,7 @@
> > again:
> >  			p->slots[level] = slot;
> >  			if ((p->search_for_split || ins_len > 0) &&
> >  			    btrfs_header_nritems(b) >=
> > -			    BTRFS_NODEPTRS_PER_BLOCK(root) - 3) {
> > +			    BTRFS_NODEPTRS_PER_BLOCK(fs_info) - 3) {
> >  				int sret = split_node(trans, root, p,
> level);
> >  				BUG_ON(sret > 0);
> >  				if (sret)
> > @@ -1292,7 +1292,7 @@ static int push_node_left(struct
> > btrfs_trans_handle *trans,
> >
> >  	src_nritems = btrfs_header_nritems(src);
> >  	dst_nritems = btrfs_header_nritems(dst);
> > -	push_items = BTRFS_NODEPTRS_PER_BLOCK(root) - dst_nritems;
> > +	push_items = BTRFS_NODEPTRS_PER_BLOCK(root->fs_info) -
> dst_nritems;
> >  	WARN_ON(btrfs_header_generation(src) != trans->transid);
> >  	WARN_ON(btrfs_header_generation(dst) != trans->transid);
> >
> > @@ -1362,7 +1362,7 @@ static int balance_node_right(struct
> > btrfs_trans_handle *trans,
> >
> >  	src_nritems = btrfs_header_nritems(src);
> >  	dst_nritems = btrfs_header_nritems(dst);
> > -	push_items = BTRFS_NODEPTRS_PER_BLOCK(root) - dst_nritems;
> > +	push_items = BTRFS_NODEPTRS_PER_BLOCK(root->fs_info) -
> dst_nritems;
> >  	if (push_items <= 0) {
> >  		return 1;
> >  	}
> > @@ -1490,7 +1490,7 @@ static int insert_ptr(struct btrfs_trans_handle
> *trans, struct btrfs_root
> >  	nritems = btrfs_header_nritems(lower);
> >  	if (slot > nritems)
> >  		BUG();
> > -	if (nritems == BTRFS_NODEPTRS_PER_BLOCK(root))
> > +	if (nritems == BTRFS_NODEPTRS_PER_BLOCK(root->fs_info))
> >  		BUG();
> >  	if (slot < nritems) {
> >  		/* shift the items */
> > @@ -1539,7 +1539,7 @@ static int split_node(struct btrfs_trans_handle
> *trans, struct btrfs_root
> >  		ret = push_nodes_for_insert(trans, root, path, level);
> >  		c = path->nodes[level];
> >  		if (!ret && btrfs_header_nritems(c) <
> > -		    BTRFS_NODEPTRS_PER_BLOCK(root) - 3)
> > +		    BTRFS_NODEPTRS_PER_BLOCK(root->fs_info) - 3)
> >  			return 0;
> >  		if (ret < 0)
> >  			return ret;
> > diff --git a/ctree.h b/ctree.h
> > index 11913efa..9e9d3d22 100644
> > --- a/ctree.h
> > +++ b/ctree.h
> > @@ -356,8 +356,7 @@ struct btrfs_header {
> >  	u8 level;
> >  } __attribute__ ((__packed__));
> >
> > -#define BTRFS_NODEPTRS_PER_BLOCK(r) (((r)->fs_info->nodesize - \
> > -			        sizeof(struct btrfs_header)) / \
> > +#define BTRFS_NODEPTRS_PER_BLOCK(fs_info)
> > +(BTRFS_LEAF_DATA_SIZE(fs_info) / \
> >  			        sizeof(struct btrfs_key_ptr))
> 
> Why not declare it as inline function?
> Since kernel code is using inline function.
OK, you are right.
I will change it to inline function.
And so as BTRFS_NODEPTRS_PER_BLOCK and BTRFS_MAX_INLINE_DATA_SIZE.

Thanks,
Gu
> 
> Thanks,
> Qu
> 
> >  #define __BTRFS_LEAF_DATA_SIZE(bs) ((bs) - sizeof(struct
> > btrfs_header))  #define BTRFS_LEAF_DATA_SIZE(fs_info) \ diff --git
> > a/print-tree.c b/print-tree.c index d3fa8621..5f37ef3e 100644
> > --- a/print-tree.c
> > +++ b/print-tree.c
> > @@ -1359,7 +1359,7 @@ void btrfs_print_tree(struct btrfs_root *root,
> struct extent_buffer *eb, int fol
> >  	printf("node %llu level %d items %d free %u generation %llu
> owner %llu\n",
> >  	       (unsigned long long)eb->start,
> >  	        btrfs_header_level(eb), nr,
> > -		(u32)BTRFS_NODEPTRS_PER_BLOCK(root) - nr,
> > +		(u32)BTRFS_NODEPTRS_PER_BLOCK(root->fs_info) - nr,
> >  		(unsigned long long)btrfs_header_generation(eb),
> >  		(unsigned long long)btrfs_header_owner(eb));
> >  	print_uuids(eb);
> > diff --git a/quick-test.c b/quick-test.c index b1e7999d..5da47c32
> > 100644
> > --- a/quick-test.c
> > +++ b/quick-test.c
> > @@ -110,7 +110,7 @@ int main(int ac, char **av) {
> >  	printf("node %p level %d total ptrs %d free spc %lu\n", root->node,
> >  	        btrfs_header_level(root->node),
> >  		btrfs_header_nritems(root->node),
> > -		(unsigned long)BTRFS_NODEPTRS_PER_BLOCK(root) -
> > +		(unsigned long)BTRFS_NODEPTRS_PER_BLOCK(root->fs_info)
> -
> >  		btrfs_header_nritems(root->node));
> >  	printf("all searches good, deleting some items\n");
> >  	i = 0;
> >



ÿôèº{.nÇ+‰·Ÿ®‰­†+%ŠËÿ±éݶ\x17¥Šwÿº{.nÇ+‰·¥Š{±ý»k~ÏâžØ^n‡r¡ö¦zË\x1aëh™¨è­Ú&£ûàz¿äz¹Þ—ú+€Ê+zf£¢·hšˆ§~†­†Ûiÿÿïêÿ‘êçz_è®\x0fæj:+v‰¨þ)ߣøm

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH 5/6] btrfs-progs: do clean up for redundancy value assignment
  2018-01-26  3:22 ` [PATCH 5/6] btrfs-progs: do clean up for redundancy value assignment Gu Jinxiang
@ 2018-01-26  5:34   ` Qu Wenruo
  0 siblings, 0 replies; 15+ messages in thread
From: Qu Wenruo @ 2018-01-26  5:34 UTC (permalink / raw)
  To: Gu Jinxiang, linux-btrfs


[-- Attachment #1.1: Type: text/plain, Size: 908 bytes --]



On 2018年01月26日 11:22, Gu Jinxiang wrote:
> Although skinny_metadata's type is int, its value just can be 0/1.
> And if condition be true only when skinny_metadata equals 1,
> so in if's executive part, set skinny_metadata to 1 is redundancy.
> Remove it.
> 
> Signed-off-by: Gu Jinxiang <gujx@cn.fujitsu.com>

Reviewed-by: Qu Wenruo <wqu@suse.com>

Thanks,
Qu

> ---
>  extent-tree.c | 1 -
>  1 file changed, 1 deletion(-)
> 
> diff --git a/extent-tree.c b/extent-tree.c
> index 1ac312a6..53d31ab3 100644
> --- a/extent-tree.c
> +++ b/extent-tree.c
> @@ -1005,7 +1005,6 @@ static int lookup_inline_extent_backref(struct btrfs_trans_handle *trans,
>  		extra_size = -1;
>  
>  	if (owner < BTRFS_FIRST_FREE_OBJECTID && skinny_metadata) {
> -		skinny_metadata = 1;
>  		key.type = BTRFS_METADATA_ITEM_KEY;
>  		key.offset = owner;
>  	} else if (skinny_metadata) {
> 


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 520 bytes --]

^ permalink raw reply	[flat|nested] 15+ messages in thread

end of thread, other threads:[~2018-01-26  5:35 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-01-26  3:22 [PATCH 1/6] btrfs-progs: Use fs_info instead of root for BTRFS_LEAF_DATA_SIZE Gu Jinxiang
2018-01-26  3:22 ` [PATCH 2/6] btrfs-progs: Use fs_info instead of root for BTRFS_NODEPTRS_PER_BLOCK Gu Jinxiang
2018-01-26  5:16   ` Qu Wenruo
2018-01-26  5:34     ` Gu, Jinxiang
2018-01-26  3:22 ` [PATCH 3/6] btrfs-progs: Use fs_info instead of root for BTRFS_MAX_INLINE_DATA_SIZE Gu Jinxiang
2018-01-26  5:29   ` Qu Wenruo
2018-01-26  3:22 ` [PATCH 4/6] btrfs-progs: Use fs_info instead of root for BTRFS_MAX_XATTR_SIZE Gu Jinxiang
2018-01-26  5:31   ` Qu Wenruo
2018-01-26  3:22 ` [PATCH 5/6] btrfs-progs: do clean up for redundancy value assignment Gu Jinxiang
2018-01-26  5:34   ` Qu Wenruo
2018-01-26  3:22 ` [PATCH 6/6] btrfs-progs: remove no longer be used btrfs_alloc_extent Gu Jinxiang
2018-01-26  5:32   ` Qu Wenruo
2018-01-26  3:37 ` [PATCH 1/6] btrfs-progs: Use fs_info instead of root for BTRFS_LEAF_DATA_SIZE Qu Wenruo
2018-01-26  5:12   ` Gu, Jinxiang
2018-01-26  5:21     ` Qu Wenruo

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).