]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/blobdiff - fs/f2fs/checkpoint.c
UBUNTU: Ubuntu-5.15.0-39.42
[mirror_ubuntu-jammy-kernel.git] / fs / f2fs / checkpoint.c
index 7b02827242312d9c350c7db667b6c810e65666d2..1ff32926e1999daa26a954f2a3687b12f21b8043 100644 (file)
@@ -867,6 +867,7 @@ static struct page *validate_checkpoint(struct f2fs_sb_info *sbi,
        struct page *cp_page_1 = NULL, *cp_page_2 = NULL;
        struct f2fs_checkpoint *cp_block = NULL;
        unsigned long long cur_version = 0, pre_version = 0;
+       unsigned int cp_blocks;
        int err;
 
        err = get_checkpoint_version(sbi, cp_addr, &cp_block,
@@ -874,15 +875,16 @@ static struct page *validate_checkpoint(struct f2fs_sb_info *sbi,
        if (err)
                return NULL;
 
-       if (le32_to_cpu(cp_block->cp_pack_total_block_count) >
-                                       sbi->blocks_per_seg) {
+       cp_blocks = le32_to_cpu(cp_block->cp_pack_total_block_count);
+
+       if (cp_blocks > sbi->blocks_per_seg || cp_blocks <= F2FS_CP_PACKS) {
                f2fs_warn(sbi, "invalid cp_pack_total_block_count:%u",
                          le32_to_cpu(cp_block->cp_pack_total_block_count));
                goto invalid_cp;
        }
        pre_version = *version;
 
-       cp_addr += le32_to_cpu(cp_block->cp_pack_total_block_count) - 1;
+       cp_addr += cp_blocks - 1;
        err = get_checkpoint_version(sbi, cp_addr, &cp_block,
                                        &cp_page_2, version);
        if (err)
@@ -1305,8 +1307,8 @@ static void update_ckpt_flags(struct f2fs_sb_info *sbi, struct cp_control *cpc)
        unsigned long flags;
 
        if (cpc->reason & CP_UMOUNT) {
-               if (le32_to_cpu(ckpt->cp_pack_total_block_count) >
-                       sbi->blocks_per_seg - NM_I(sbi)->nat_bits_blocks) {
+               if (le32_to_cpu(ckpt->cp_pack_total_block_count) +
+                       NM_I(sbi)->nat_bits_blocks > sbi->blocks_per_seg) {
                        clear_ckpt_flags(sbi, CP_NAT_BITS_FLAG);
                        f2fs_notice(sbi, "Disable nat_bits due to no space");
                } else if (!is_set_ckpt_flags(sbi, CP_NAT_BITS_FLAG) &&