[snip]
> 
>> +    }
>> +
>> +    read_extent_buffer(leaf, &ri, btrfs_item_ptr_offset(leaf, slot),
>> +                       sizeof(ri));
>> +
>> +    /* Generateion related */
> 
> typo here and a few more times below
> 
>> +    if (btrfs_root_generation(&ri) >
>> +        btrfs_super_generation(fs_info->super_copy) + 1) {
>> +            generic_err(leaf, slot,
>> +                    "invalid root generaetion, have %llu expect (0, %llu]",
>> +                        btrfs_root_generation(&ri),
>> +                        btrfs_super_generation(fs_info->super_copy) + 1);
>> +            return -EUCLEAN;
>> +    }
>> +    if (btrfs_root_generation_v2(&ri) >
>> +        btrfs_super_generation(fs_info->super_copy) + 1) {
>> +            generic_err(leaf, slot,
>> +            "invalid root v2 generaetion, have %llu expect (0, %llu]",
> 
> So (0, %llu] here means that it must be greater than zero, right? I'm
> not sure that everyone uses the same notation for open/closed notation.

AFAIK in tree checker it's all the same notation.

Or any better solution for that?

Thanks,
Qu

> 
>> +                        btrfs_root_generation_v2(&ri),
>> +                        btrfs_super_generation(fs_info->super_copy) + 1);
>> +            return -EUCLEAN;
>> +    }
>> +    if (btrfs_root_last_snapshot(&ri) >
>> +        btrfs_super_generation(fs_info->super_copy) + 1) {
>> +            generic_err(leaf, slot,
>> +            "invalid root last_snapshot, have %llu expect (0, %llu]",
>> +                        btrfs_root_last_snapshot(&ri),
>> +                        btrfs_super_generation(fs_info->super_copy) + 1);
>> +            return -EUCLEAN;
>> +    }
>> +
>> +    /* Alignment and level check */
>> +    if (!IS_ALIGNED(btrfs_root_bytenr(&ri), fs_info->sectorsize)) {
>> +            generic_err(leaf, slot,
>> +                    "invalid root bytenr, have %llu expect to be aligned to 
>> %u",
>> +                        btrfs_root_bytenr(&ri), fs_info->sectorsize);
>> +            return -EUCLEAN;
>> +    }
>> +    if (btrfs_root_level(&ri) >= BTRFS_MAX_LEVEL) {
>> +            generic_err(leaf, slot,
>> +                    "invalid root level, have %u expect [0, %u]",
>> +                        btrfs_root_level(&ri), BTRFS_MAX_LEVEL - 1);
>> +            return -EUCLEAN;
>> +    }
>> +    if (ri.drop_level >= BTRFS_MAX_LEVEL) {
>> +            generic_err(leaf, slot,
>> +                    "invalid root level, have %u expect [0, %u]",
>> +                        ri.drop_level, BTRFS_MAX_LEVEL - 1);
>> +            return -EUCLEAN;
>> +    }
>> +
>> +    /* Flags check */
>> +    if (btrfs_root_flags(&ri) & ~valid_root_flags) {
>> +            generic_err(leaf, slot,
>> +                    "invalid root flags, have 0x%llx expect mask 0x%llu",
> 
>                                                                      0x%llx
> 
>> +                        btrfs_root_flags(&ri), valid_root_flags);
>> +            return -EUCLEAN;
>> +    }
>> +    return 0;
>> +}
>> +
>>  /*
>>   * Common point to switch the item-specific validation.
>>   */
>> @@ -845,6 +934,9 @@ static int check_leaf_item(struct extent_buffer *leaf,
>>      case BTRFS_INODE_ITEM_KEY:
>>              ret = check_inode_item(leaf, key, slot);
>>              break;
>> +    case BTRFS_ROOT_ITEM_KEY:
>> +            ret = check_root_item(leaf, key, slot);
>> +            break;
>>      }
>>      return ret;
>>  }
>> -- 
>> 2.22.0

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to