[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