Hi, > -----Original Message----- > From: Qu Wenruo [mailto:quwenruo.btrfs@xxxxxxx] > Sent: Friday, January 26, 2018 11:37 AM > To: Gu, Jinxiang/顾 金香 <gujx@xxxxxxxxxxxxxx>; > linux-btrfs@xxxxxxxxxxxxxxx > 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@xxxxxxxxxxxxxx> > > --- > > 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��������+%������w��{.n�����{����n�r������&��z�ޗ�zf���h���~����������_��+v���)ߣ�
