On 2018/10/8 下午5:28, Su Yue wrote:
> 
> 
> On 10/8/18 3:00 PM, Qu Wenruo wrote:
>> Add such check at check_dev_item(), since at that timing we're also
>> iterating dev extents for dev item accounting.
>>
>> Signed-off-by: Qu Wenruo <w...@suse.com>
>> ---
>>   check/mode-lowmem.c | 32 ++++++++++++++++++++++++++++++--
>>   1 file changed, 30 insertions(+), 2 deletions(-)
>>
>> diff --git a/check/mode-lowmem.c b/check/mode-lowmem.c
>> index 1bce44f5658a..d387423639e6 100644
>> --- a/check/mode-lowmem.c
>> +++ b/check/mode-lowmem.c
>> @@ -4065,6 +4065,8 @@ static int check_dev_item(struct btrfs_fs_info
>> *fs_info,
>>       u64 dev_id;
>>       u64 used;
>>       u64 total = 0;
>> +    u64 prev_devid = 0;
>> +    u64 prev_dev_ext_end = 0;
> 
> Those two new variables aren't assigned anymore in the patch...

Oh, what I'm doing... (palm face

I'll fix this with the test case bug.

Thanks for reviewing,
Qu

> 
> Thanks,
> Su
>>       int ret;
>>         dev_item = btrfs_item_ptr(eb, slot, struct btrfs_dev_item);
>> @@ -4086,8 +4088,16 @@ static int check_dev_item(struct btrfs_fs_info
>> *fs_info,
>>           return REFERENCER_MISSING;
>>       }
>>   -    /* Iterate dev_extents to calculate the used space of a device */
>> +    /*
>> +     * Iterate dev_extents to calculate the used space of a device
>> +     *
>> +     * Also make sure no dev extents overlap and end beyond device
>> boundary
>> +     */
>>       while (1) {
>> +        u64 devid;
>> +        u64 physical_offset;
>> +        u64 physical_len;
>> +
>>           if (path.slots[0] >= btrfs_header_nritems(path.nodes[0]))
>>               goto next;
>>   @@ -4099,7 +4109,25 @@ static int check_dev_item(struct
>> btrfs_fs_info *fs_info,
>>             ptr = btrfs_item_ptr(path.nodes[0], path.slots[0],
>>                        struct btrfs_dev_extent);
>> -        total += btrfs_dev_extent_length(path.nodes[0], ptr);
>> +        devid = key.objectid;
>> +        physical_offset = key.offset;
>> +        physical_len = btrfs_dev_extent_length(path.nodes[0], ptr);
>> +
>> +        if (prev_devid == devid && physical_offset < prev_dev_ext_end) {
>> +            error(
>> +"dev extent devid %llu offset %llu len %llu overlap with previous dev
>> extent end %llu",
>> +                  devid, physical_offset, physical_len,
>> +                  prev_dev_ext_end);
>> +            return ACCOUNTING_MISMATCH;
>> +        }
>> +        if (physical_offset + physical_len > total_bytes) {
>> +            error(
>> +"dev extent devid %llu offset %llu len %llu is beyond device boundary
>> %llu",
>> +                  devid, physical_offset, physical_len,
>> +                  total_bytes);
>> +            return ACCOUNTING_MISMATCH;
>> +        }
>> +        total += physical_len;
>>   next:
>>           ret = btrfs_next_item(dev_root, &path);
>>           if (ret)
>>
> 
> 

Reply via email to