On 2018年05月18日 13:02, Nikolay Borisov wrote:
>
>
> On 18.05.2018 05:59, Liu Bo wrote:
>> As verify_level_key() is checked after verify_parent_transid(), i.e.
>>
>> if (verify_parent_transid())
>> ret = -EIO;
>> else if (verify_level_key())
>> ret = -EUCLEAN;
>>
>> if parent_transid is 0, verify_parent_transid() skips verifying
>> parent_transid and considers eb as valid, and if verify_level_key()
>> reports something wrong, we're not going to know if it's caused by
>> corrupted metadata or non-checkecd eb (e.g. stale eb).
>
> It's really unclear (from the changelog) how the stale eb ties with
> parent_transid. You should have explained the relationship between
> checking parenttransid and stale/non-stale ebs
It's in fact related to the fixing patch:
Btrfs: fix the corruption by reading stale btree blocks
But whatever, extra mention won't hurt.
>
>>
>> @parent_transid is able to tell whether the eb's generation has been
>> verified by the caller.
>
> It's really unclear why parent_transid is able to tell whether the
> generation is verified by the caller.
At least this looks pretty straightforward to me.
@parent_transid = 0 means no generation check, and @parent_transid != 0
means already checked.
So at least for this part I didn't get any confusion.
Thanks,
Qu
>
>>
>> Signed-off-by: Liu Bo <bo.liu@xxxxxxxxxxxxxxxxx>
>> ---
>> v2: - more explicit commit log.
>> - adjust the position shown in error msg.
>>
>> fs/btrfs/disk-io.c | 13 +++++++------
>> 1 file changed, 7 insertions(+), 6 deletions(-)
>>
>> diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c
>> index 60caa68c3618..ad865176a3ca 100644
>> --- a/fs/btrfs/disk-io.c
>> +++ b/fs/btrfs/disk-io.c
>> @@ -416,7 +416,7 @@ static int btrfs_check_super_csum(struct btrfs_fs_info *fs_info,
>>
>> static int verify_level_key(struct btrfs_fs_info *fs_info,
>> struct extent_buffer *eb, int level,
>> - struct btrfs_key *first_key)
>> + struct btrfs_key *first_key, u64 parent_transid)
>> {
>> int found_level;
>> struct btrfs_key found_key;
>> @@ -454,10 +454,11 @@ static int verify_level_key(struct btrfs_fs_info *fs_info,
>> if (ret) {
>> WARN_ON(1);
>> btrfs_err(fs_info,
>> -"tree first key mismatch detected, bytenr=%llu key expected=(%llu, %u, %llu) has=(%llu, %u, %llu)",
>> - eb->start, first_key->objectid, first_key->type,
>> - first_key->offset, found_key.objectid,
>> - found_key.type, found_key.offset);
>> +"tree first key mismatch detected, bytenr=%llu parent_transid=%llu key expected=(%llu, %u, %llu) has=(%llu, %u, %llu)",
>> + eb->start, parent_transid, first_key->objectid,
>> + first_key->type, first_key->offset,
>> + found_key.objectid, found_key.type,
>> + found_key.offset);
>> }
>> #endif
>> return ret;
>> @@ -493,7 +494,7 @@ static int btree_read_extent_buffer_pages(struct btrfs_fs_info *fs_info,
>> parent_transid, 0))
>> ret = -EIO;
>> else if (verify_level_key(fs_info, eb, level,
>> - first_key))
>> + first_key, parent_transid))
>> ret = -EUCLEAN;
>> else
>> break;
>>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html