From: Su Yue <suy.fnst@cn.fujitsu.com>
To: Nikolay Borisov <nborisov@suse.com>, <linux-btrfs@vger.kernel.org>
Cc: <quwenruo.btrfs@gmx.com>
Subject: Re: [PATCH v2 02/17] btrfs-progs: lowmem check: record returned errors after walk_down_tree_v2()
Date: Tue, 2 Jan 2018 09:44:47 +0800 [thread overview]
Message-ID: <6572f6da-66f0-1156-1b7f-e00e25a1d997@cn.fujitsu.com> (raw)
In-Reply-To: <d4013361-64e4-39be-3866-5baba6597669@suse.com>
On 12/29/2017 07:17 PM, Nikolay Borisov wrote:
>
>
> On 20.12.2017 06:57, Su Yue wrote:
>> In lowmem mode with '--repair', check_chunks_and_extents_v2()
>> will fix accounting in block groups and clear the error
>> bit BG_ACCOUNTING_ERROR.
>> However, return value of check_btrfs_root() is 0 either 1 instead of
>> error bits.
>>
>> If extent tree is on error, lowmem repair always prints error and
>> returns nonzero value even the filesystem is fine after repair.
>>
>> So let @err contains bits after walk_down_tree_v2().
>>
>> Introduce FATAL_ERROR for lowmem mode to represents negative return
>> values since negative and positive can't not be mixed in bits operations.
>>
>> Signed-off-by: Su Yue <suy.fnst@cn.fujitsu.com>
>> ---
>> cmds-check.c | 13 +++++++------
>> 1 file changed, 7 insertions(+), 6 deletions(-)
>>
>> diff --git a/cmds-check.c b/cmds-check.c
>> index 309ac9553b3a..ebede26cef01 100644
>> --- a/cmds-check.c
>> +++ b/cmds-check.c
>> @@ -134,6 +134,7 @@ struct data_backref {
>> #define DIR_INDEX_MISMATCH (1<<19) /* INODE_INDEX found but not match */
>> #define DIR_COUNT_AGAIN (1<<20) /* DIR isize should be recalculated */
>> #define BG_ACCOUNTING_ERROR (1<<21) /* Block group accounting error */
>> +#define FATAL_ERROR (1<<22) /* fatal bit for errno */
>>
>> static inline struct data_backref* to_data_backref(struct extent_backref *back)
>> {
>> @@ -6556,7 +6557,7 @@ static struct data_backref *find_data_backref(struct extent_record *rec,
>> * otherwise means check fs tree(s) items relationship and
>> * @root MUST be a fs tree root.
>> * Returns 0 represents OK.
>> - * Returns not 0 represents error.
>> + * Returns > 0 represents error bits.
>> */
>
> What about the code in 'if (!check_all)' branch, check_fs_first_inode
> can return a negative value, hence check_btrfs_root can return a
> negative value. A negative value can also be returned from
> btrfs_search_slot.
>
> Clearly this patch needs to be thought out better
>
>> static int check_btrfs_root(struct btrfs_trans_handle *trans,
>> struct btrfs_root *root, unsigned int ext_ref,
>> @@ -6607,12 +6608,12 @@ static int check_btrfs_root(struct btrfs_trans_handle *trans,
>> while (1) {
>> ret = walk_down_tree_v2(trans, root, &path, &level, &nrefs,
>> ext_ref, check_all);
>> -
>> - err |= !!ret;
>> + if (ret > 0)
>> + err |= ret;
>>
>> /* if ret is negative, walk shall stop */
>> if (ret < 0) {
>> - ret = err;
>> + ret = err | FATAL_ERROR;
>> break;
>> }
>>
>> @@ -6636,12 +6637,12 @@ out:
>> * @ext_ref: the EXTENDED_IREF feature
>> *
>> * Return 0 if no error found.
>> - * Return <0 for error.
>> + * Return not 0 for error.
>> */
>> static int check_fs_root_v2(struct btrfs_root *root, unsigned int ext_ref)
>> {
>> reset_cached_block_groups(root->fs_info);
>> - return check_btrfs_root(NULL, root, ext_ref, 0);
>> + return !!check_btrfs_root(NULL, root, ext_ref, 0);
>> }
>
> You make the function effectively boolean, make this explicit by
> changing its return value to bool. Also the name and the boolean return
> makes the function REALLY confusing. I.e when should we return true or
In the past and present, check_fs_root_v2() always returns boolean.
So the old annotation "Return <0 for error." is wrong.
Here check_btrfs_root() returns error bits instead of boolean, so I
just make check_fs_root_v2() return boolean explictly.
> false? As it stands it return "false" on success and "true" otherwise,
> this is a mess...
>
Although it returns 1 or 0, IMHO, let it return inteager
is good enough.
Thanks,
Su
>
>>
>> /*
>>
>
>
next prev parent reply other threads:[~2018-01-02 1:40 UTC|newest]
Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-12-20 4:57 [PATCH v2 00/17] btrfs-progs: lowmem check: avoid extents overwrite Su Yue
2017-12-20 4:57 ` [PATCH v2 01/17] btrfs-progs: lowmem check: release path in repair_extent_data_item() Su Yue
2017-12-20 4:57 ` [PATCH v2 02/17] btrfs-progs: lowmem check: record returned errors after walk_down_tree_v2() Su Yue
2017-12-29 11:17 ` Nikolay Borisov
2018-01-02 1:44 ` Su Yue [this message]
2018-01-02 1:50 ` Su Yue
2017-12-20 4:57 ` [PATCH v2 03/17] btrfs-progs: lowmem check: assign @parent early in repair_extent_data_item() Su Yue
2017-12-20 4:57 ` [PATCH v2 04/17] btrfs-progs: lowmem check: exclude extents of metadata blocks Su Yue
2017-12-20 4:57 ` [PATCH v2 05/17] btrfs-progs: lowmem check: introduce modify_block_groups_cache() Su Yue
2017-12-20 5:38 ` Qu Wenruo
2017-12-20 4:57 ` [PATCH v2 06/17] btrfs-progs: lowmem check: introduce force_cow_in_new_chunk() Su Yue
2017-12-20 5:41 ` Qu Wenruo
2017-12-20 8:21 ` Su Yue
2017-12-20 8:37 ` Qu Wenruo
2017-12-21 6:51 ` Qu Wenruo
2017-12-21 7:06 ` Su Yue
2017-12-21 7:09 ` Su Yue
2017-12-21 7:12 ` Qu Wenruo
2017-12-26 8:17 ` Su Yue
2017-12-26 10:28 ` Qu Wenruo
2017-12-27 1:11 ` Su Yue
2018-01-09 7:44 ` Qu Wenruo
2017-12-20 4:57 ` [PATCH v2 07/17] btrfs-progs: lowmem check: introduce try_avoid_extents_overwrite() Su Yue
2017-12-20 5:46 ` Qu Wenruo
2017-12-20 4:57 ` [PATCH v2 08/17] btrfs-progs: lowmem check: exclude extents if init-extent-tree in lowmem Su Yue
2017-12-20 4:57 ` [PATCH v2 09/17] btrfs-progs: lowmem check: start to remove parameters @trans " Su Yue
2017-12-20 5:51 ` Qu Wenruo
2017-12-20 4:57 ` [PATCH v2 10/17] btrfs-progs: lowmem check: remove parameter @trans of delete_extent_item() Su Yue
2017-12-20 4:57 ` [PATCH v2 11/17] btrfs-progs: lowmem check: remove parameter @trans of repair_chunk_item() Su Yue
2017-12-20 4:57 ` [PATCH v2 12/17] btrfs-progs: lowmem check: remove parameter @trans of repair_extent_item() Su Yue
2017-12-20 4:57 ` [PATCH v2 13/17] btrfs-progs: lowmem check: remove parameter @trans of check_leaf_items() Su Yue
2017-12-20 4:57 ` [PATCH v2 14/17] btrfs-progs: lowmem check: remove parameter @trans of repair_tree_back_ref() Su Yue
2017-12-20 4:57 ` [PATCH v2 15/17] btrfs-progs: lowmem check: remove parameter @trans of check_btrfs_root() Su Yue
2017-12-20 4:57 ` [PATCH v2 16/17] btrfs-progs: lowmem check: introduce repair_block_accounting() Su Yue
2017-12-20 4:57 ` [PATCH v2 17/17] btrfs-progs: lowmem check: end of removing parameters @trans in lowmem Su Yue
2017-12-20 5:59 ` [PATCH v2 00/17] btrfs-progs: lowmem check: avoid extents overwrite Qu Wenruo
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=6572f6da-66f0-1156-1b7f-e00e25a1d997@cn.fujitsu.com \
--to=suy.fnst@cn.fujitsu.com \
--cc=linux-btrfs@vger.kernel.org \
--cc=nborisov@suse.com \
--cc=quwenruo.btrfs@gmx.com \
/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