On 2018年01月26日 13:12, Gu, Jinxiang wrote: > 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. 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�٥ >
Attachment:
signature.asc
Description: OpenPGP digital signature
