On 2018年01月26日 13:12, Gu, Jinxiang wrote: > 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.
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*jg��������ݢj/���z�ޖ��2�ޙ���&�)ߡ�a�����G���h��j:+v���w�٥
>
signature.asc
Description: OpenPGP digital signature
