Hi,
> -----Original Message-----
> From: Qu Wenruo [mailto:[email protected]]
> Sent: Friday, January 26, 2018 11:37 AM
> To: Gu, Jinxiang/顾 金香 <[email protected]>;
> [email protected]
> 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 <[email protected]>
> > ---
> > 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)
> >