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....@linux.alibaba.com>
>> ---
>> 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 majord...@vger.kernel.org
> 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 majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to