linux-btrfs.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Qu Wenruo <quwenruo.btrfs@gmx.com>
To: "Gu, Jinxiang" <gujx@cn.fujitsu.com>,
	"linux-btrfs@vger.kernel.org" <linux-btrfs@vger.kernel.org>
Subject: Re: [PATCH 1/6] btrfs-progs: Use fs_info instead of root for BTRFS_LEAF_DATA_SIZE
Date: Fri, 26 Jan 2018 13:21:03 +0800	[thread overview]
Message-ID: <9b0e8420-da7f-66e8-aa1c-e71995694bb0@gmx.com> (raw)
In-Reply-To: <516DDBE5B1D92D42BCF7A2E37F045A5D016B1249E5@G08CNEXMBPEKD02.g08.fujitsu.local>


[-- 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 --]

      reply	other threads:[~2018-01-26  5:21 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
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 message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=9b0e8420-da7f-66e8-aa1c-e71995694bb0@gmx.com \
    --to=quwenruo.btrfs@gmx.com \
    --cc=gujx@cn.fujitsu.com \
    --cc=linux-btrfs@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).