Doesn't it simply remove the flag and proceed?

What happens if large nat bitmap is required (e.g., a lot of inodes)?

Sounds like we should actively detect it and stop it from proceeding,
not just discarding the flag.

On Fri, Apr 11, 2025 at 1:57 AM Chao Yu <c...@kernel.org> wrote:
>
> This reverts commit daa0f8b9e9b1eea6c85e5c169b809254d9d7074e.
>
> As Juhyung reported in [1]:
>
> Here's what I did:
> 1. Remounted to checkpoint=disable
> 2. Create a dm-snapshot of the current root device
> 3. Mount snapshot to replay the log
> 4. Unmount
> 5. Resize sector 487248896 to 486539264
> // ./resize.f2fs -d 3 -s -i /dev/mapper/snap -t 486539264
>
> Latest f2fs-tools was used:
> 33c5b9539af2 f2fs_io: add fragread command to evaluate fragmented
> buffer for reads
>
> This reproduced the mount and fsck failure.
>
> Mount log:
> [442431.020594] F2FS-fs (dm-2): invalid crc_offset: 0
> [442431.130055] F2FS-fs (dm-2): SIT is corrupted node# 13615201 vs 13616290
> [442431.139684] F2FS-fs (dm-2): Failed to initialize F2FS segment manager 
> (-117)
>
> I checked below testcases:
>
> truncate -s $((512*1024*1024*1024)) img
> mkfs.f2fs -f img $((256*1024*1024))
>
> Description             Test command                                    FSCK 
> output
> a) shrink w/ -s         resize.f2fs -s -i img -t $((128*1024*1024))     Fine
> b) expand w/ -s         resize.f2fs -s -i img -t $((1024*1024*1024))    
> Corrupted
> c) shrink w/o -s        resize.f2fs -i img -t $((128*1024*1024))        No run
> d) expand w/o -s        resize.f2fs -i img -t $((1024*1024*1024))       Fine
>
> Output from b):
> [ASSERT] (check_block_count:2299)  --> Wrong SIT valid blocks: segno=0x29400, 
> 0 vs. 13
>
> The root cause is: safe mode (-s option) is conflict w/ large nat bitmap 
> feature
> (-i option), since once we enable large nat bitmap, layout of checkpoint will 
> be
> changed [2], we must relocate nat/sit_bitmap to the end of new location of
> cp_checksum, however in safe mode, we won't change metadata of checkpoint, so 
> we
> need to keep nat/sit_bitmap as it is, which includes checksum data in its old
> location.
>
> Let's revert -i support for resize.f2fs first, and then reenable it after
> fix and well tested.
>
> Thanks a lot for the help from Juhyung, including providing reproducer and
> hints.
>
> [1] 
> https://lore.kernel.org/linux-f2fs-devel/cad14+f3d6ipobxegkzxxtsxcfwrkb9ph68jtuk3h9cn8ovl...@mail.gmail.com/
> [2] 
> https://lore.kernel.org/linux-f2fs-devel/20190514093340.40217-2-yuch...@huawei.com/
>
> Fixes: daa0f8b ("resize.f2fs: add option for large_nat_bitmap feature")
> Reported-by: Ju Hyung Park <qkrwngud...@gmail.com>
> Signed-off-by: Chao Yu <c...@kernel.org>
> ---
>  fsck/main.c   | 6 +-----
>  fsck/resize.c | 3 ---
>  2 files changed, 1 insertion(+), 8 deletions(-)
>
> diff --git a/fsck/main.c b/fsck/main.c
> index 524dbb1..af40613 100644
> --- a/fsck/main.c
> +++ b/fsck/main.c
> @@ -141,7 +141,6 @@ void resize_usage()
>         MSG(0, "[options]:\n");
>         MSG(0, "  -d debug level [default:0]\n");
>         MSG(0, "  -H support write hint\n");
> -       MSG(0, "  -i extended node bitmap, node ratio is 20%% by default\n");
>         MSG(0, "  -o overprovision percentage [default:auto]\n");
>         MSG(0, "  -s safe resize (Does not resize metadata)\n");
>         MSG(0, "  -t target sectors [default: device size]\n");
> @@ -602,7 +601,7 @@ void f2fs_parse_options(int argc, char *argv[])
>  #endif
>         } else if (!strcmp("resize.f2fs", prog)) {
>  #ifdef WITH_RESIZE
> -               const char *option_string = "d:fHst:io:V";
> +               const char *option_string = "d:fHst:o:V";
>
>                 c.func = RESIZE;
>                 while ((option = getopt(argc, argv, option_string)) != EOF) {
> @@ -637,9 +636,6 @@ void f2fs_parse_options(int argc, char *argv[])
>                                         ret = sscanf(optarg, "%"PRIx64"",
>                                                         &c.target_sectors);
>                                 break;
> -                       case 'i':
> -                               c.large_nat_bitmap = 1;
> -                               break;
>                         case 'o':
>                                 c.new_overprovision = atof(optarg);
>                                 break;
> diff --git a/fsck/resize.c b/fsck/resize.c
> index 9b3b071..2681b9f 100644
> --- a/fsck/resize.c
> +++ b/fsck/resize.c
> @@ -531,9 +531,6 @@ static void rebuild_checkpoint(struct f2fs_sb_info *sbi,
>
>         /* update nat_bits flag */
>         flags = update_nat_bits_flags(new_sb, cp, get_cp(ckpt_flags));
> -       if (c.large_nat_bitmap)
> -               flags |= CP_LARGE_NAT_BITMAP_FLAG;
> -
>         if (flags & CP_COMPACT_SUM_FLAG)
>                 flags &= ~CP_COMPACT_SUM_FLAG;
>         if (flags & CP_LARGE_NAT_BITMAP_FLAG)
> --
> 2.40.1
>


_______________________________________________
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

Reply via email to