On 2019/9/2 下午3:54, Nikolay Borisov wrote:
> 
> 
> On 2.09.19 г. 7:57 ч., Qu Wenruo wrote:
>> For orphan inodes, kernel won't update its nbytes and size since it's a
>> waste of time.
>>
>> So lowmem check can report false alert on some orphan inodes.
>>
>> Fix it by checking if the inode is an orphan before
>> complaining/repairing its nbytes.
>>
>> Signed-off-by: Qu Wenruo <w...@suse.com>
> 
> Is this the same fix as :
> https://patchwork.kernel.org/patch/11086471/ from josef, but for lowmem
> mode?

Yep.

Thanks,
Qu
> 
>> ---
>>  check/mode-lowmem.c | 14 +++++++++-----
>>  1 file changed, 9 insertions(+), 5 deletions(-)
>>
>> diff --git a/check/mode-lowmem.c b/check/mode-lowmem.c
>> index da6b6fd86ae3..5f7f101daab1 100644
>> --- a/check/mode-lowmem.c
>> +++ b/check/mode-lowmem.c
>> @@ -2519,6 +2519,7 @@ static int check_inode_item(struct btrfs_root *root, 
>> struct btrfs_path *path)
>>              return err;
>>      }
>>  
>> +    is_orphan = has_orphan_item(root, inode_id);
>>      ii = btrfs_item_ptr(node, slot, struct btrfs_inode_item);
>>      isize = btrfs_inode_size(node, ii);
>>      nbytes = btrfs_inode_nbytes(node, ii);
>> @@ -2672,19 +2673,22 @@ out:
>>              "root %llu INODE[%llu] nlink(%llu) not equal to 
>> inode_refs(%llu)",
>>                                    root->objectid, inode_id, nlink, refs);
>>                      }
>> -            } else if (!nlink) {
>> -                    is_orphan = has_orphan_item(root, inode_id);
>> -                    if (!is_orphan && repair)
>> +            } else if (!nlink && !is_orphan) {
>> +                    if (repair)
>>                              ret = repair_inode_orphan_item_lowmem(root,
>>                                                            path, inode_id);
>> -                    if (!is_orphan && (!repair || ret)) {
>> +                    if (!repair || ret) {
>>                              err |= ORPHAN_ITEM;
>>                              error("root %llu INODE[%llu] is orphan item",
>>                                    root->objectid, inode_id);
>>                      }
>>              }
>>  
>> -            if (nbytes != extent_size) {
>> +            /*
>> +             * For orhpan inode, updating nbytes/size is just a waste of
>> +             * time, so skip such repair and don't report them as error.
>> +             */
>> +            if (nbytes != extent_size && !is_orphan) {
>>                      if (repair) {
>>                              ret = repair_inode_nbytes_lowmem(root, path,
>>                                                       inode_id, extent_size);
>>

Reply via email to