Chao Yu <c...@kernel.org> 于2025年4月11日周五 18:32写道:
>
> On 2025/4/11 10:07, Zhiguo Niu wrote:
> > Chao Yu via Linux-f2fs-devel <linux-f2fs-devel@lists.sourceforge.net>
> > 于2025年4月7日周一 10:11写道:
> >>
> >> Support a new option --nolinear-lookup=X for fsck.f2fs to tune
> >> linear lookup fallback conditionally, X=1: disable linear lookup,
> >> X=0: enable linear lookup.
> >>
> >> This can help to 1) add a regression testcase to check kernel
> >> whether linear lookup fallback has fixed unicode red heart lookup
> >> issue, 2) once unicode bug has been fixed, we can use this option
> >> to disable linear lookup for performance recovery.
> >>
> >> Cc: Daniel Lee <chul...@google.com>
> >> Signed-off-by: Chao Yu <c...@kernel.org>
> >> ---
> >> v2:
> >> - add description in fsck manual
> >>   fsck/fsck.c       | 26 +++++++++++++++++++++++++-
> >>   fsck/fsck.h       |  1 +
> >>   fsck/main.c       | 10 ++++++++++
> >>   include/f2fs_fs.h |  8 ++++++--
> >>   man/fsck.f2fs.8   |  3 +++
> >>   5 files changed, 45 insertions(+), 3 deletions(-)
> >>
> >> diff --git a/fsck/fsck.c b/fsck/fsck.c
> >> index 8155cbd..059ba61 100644
> >> --- a/fsck/fsck.c
> >> +++ b/fsck/fsck.c
> >> @@ -2357,6 +2357,30 @@ int fsck_chk_quota_files(struct f2fs_sb_info *sbi)
> >>          return ret;
> >>   }
> >>
> >> +void fsck_update_sb_flags(struct f2fs_sb_info *sbi)
> >> +{
> >> +       struct f2fs_super_block *sb = F2FS_RAW_SUPER(sbi);
> >> +       u16 flags = get_sb(s_encoding_flags);
> >> +
> >> +       if (c.nolinear_lookup) {
> >> +               if (!(flags & F2FS_ENC_NO_COMPAT_FALLBACK_FL)) {
> >> +                       flags |= F2FS_ENC_NO_COMPAT_FALLBACK_FL;
> >> +                       set_sb(s_encoding_flags, flags);
> >> +                       c.fix_on = 1;
> >> +                       c.invalid_sb |= SB_ENCODE_FLAG;
> >> +                       DBG(0, "Casefold: enable nolinear lookup\n");
> >> +               }
> >> +       } else {
> >> +               if (flags & F2FS_ENC_NO_COMPAT_FALLBACK_FL) {
> >> +                       flags &= ~F2FS_ENC_NO_COMPAT_FALLBACK_FL;
> >> +                       set_sb(s_encoding_flags, flags);
> >> +                       c.fix_on = 1;
> >> +                       c.invalid_sb |= SB_ENCODE_FLAG;
> >> +                       DBG(0, "Casefold: disable nolinear lookup\n");
> >> +               }
> >> +       }
> >> +}
> >> +
> >>   int fsck_chk_meta(struct f2fs_sb_info *sbi)
> >>   {
> >>          struct f2fs_fsck *fsck = F2FS_FSCK(sbi);
> >> @@ -3770,7 +3794,7 @@ int fsck_verify(struct f2fs_sb_info *sbi)
> >>                  if (c.invalid_sb & SB_FS_ERRORS)
> >>                          memset(sb->s_errors, 0, MAX_F2FS_ERRORS);
> >>
> >> -               if (c.invalid_sb & SB_NEED_FIX)
> >> +               if (c.invalid_sb & (SB_NEED_FIX | SB_ENCODE_FLAG))
> >>                          update_superblock(sb, SB_MASK_ALL);
> >>
> >>                  /* to return FSCK_ERROR_CORRECTED */
> >> diff --git a/fsck/fsck.h b/fsck/fsck.h
> >> index b581d3e..40cb6d9 100644
> >> --- a/fsck/fsck.h
> >> +++ b/fsck/fsck.h
> >> @@ -188,6 +188,7 @@ extern int fsck_chk_dentry_blk(struct f2fs_sb_info *, 
> >> int,
> >>   int fsck_chk_inline_dentries(struct f2fs_sb_info *, struct f2fs_node *,
> >>                  struct child_info *);
> >>   void fsck_chk_checkpoint(struct f2fs_sb_info *sbi);
> >> +void fsck_update_sb_flags(struct f2fs_sb_info *sbi);
> >>   int fsck_chk_meta(struct f2fs_sb_info *sbi);
> >>   void fsck_chk_and_fix_write_pointers(struct f2fs_sb_info *);
> >>   int fsck_chk_curseg_info(struct f2fs_sb_info *);
> >> diff --git a/fsck/main.c b/fsck/main.c
> >> index 47ba6c9..524dbb1 100644
> >> --- a/fsck/main.c
> >> +++ b/fsck/main.c
> >> @@ -91,6 +91,7 @@ void fsck_usage()
> >>          MSG(0, "  --no-kernel-check skips detecting kernel change\n");
> >>          MSG(0, "  --kernel-check checks kernel change\n");
> >>          MSG(0, "  --debug-cache to debug cache when -c is used\n");
> >> +       MSG(0, "  --nolinear-lookup=X X=1: disable linear lookup, X=0: 
> >> enable linear lookup\n");
> >>          exit(1);
> >>   }
> >>
> >> @@ -263,6 +264,7 @@ void f2fs_parse_options(int argc, char *argv[])
> >>                          {"no-kernel-check", no_argument, 0, 2},
> >>                          {"kernel-check", no_argument, 0, 3},
> >>                          {"debug-cache", no_argument, 0, 4},
> >> +                       {"nolinear-lookup", required_argument, 0, 5},
> >>                          {0, 0, 0, 0}
> >>                  };
> >>
> >> @@ -287,6 +289,12 @@ void f2fs_parse_options(int argc, char *argv[])
> >>                          case 4:
> >>                                  c.cache_config.dbg_en = true;
> >>                                  break;
> >> +                       case 5:
> >> +                               if (!optarg || !strcmp(optarg, "0"))
> >> +                                       c.nolinear_lookup = 0;
> >> +                               else
> >> +                                       c.nolinear_lookup = 1;
> >> +                               break;
> > Hi Chao
> > I also encountered the same performance regression problem in Android
> > device as kernel commit
> > 51dc491a0855("f2fs: support to disable linear lookup fallback") shown.
> >
> > so because we also need to update this commit about fsck to avoid
> > performance regressions.
> > Is it appropriate to set this parameter  disable linear_lookup by
> > default (c.nolinear_lookup = 1)?
> > This also fits most of the scenarios.
> > If other users want to enable this feature, they can control it
> > through parameters.
>
> Zhiguo,
>
> There are two conditions user will lost their file which has specified
> charactors, like red heart ❤️.
>
> case #1
> - create file named red_heart ❤️
> - apply 5c26d2f1d3f5 ("unicode: Don't special case ignorable code points")
> - stat red_heart ❤️ --> No such file or directory
>
> case #2
> - apply 5c26d2f1d3f5 ("unicode: Don't special case ignorable code points")
> - create file named red_heart ❤️
> - revert 5c26d2f1d3f5 ("unicode: Don't special case ignorable code points")
> - stat red_heart ❤️ --> No such file or directory
>
> If you does not matched any of above cases, I guess it's fine for you to
> disable linear fallback.
Hi Chao,
Yes, I did not encounter any of above cases. Thank you for your
detailed explanation
>
> I prefer to wait for the formal fix for specified unicode charactor
> handling, and then disable linear fallback, as I don't know the condition
> of our user.
Got it. thanks!
>
> > thanks!
> >>                          case 'a':
> >>                                  c.auto_fix = 1;
> >>                                  MSG(0, "Info: Automatic fix mode 
> >> enabled.\n");
> >> @@ -990,6 +998,8 @@ static int do_fsck(struct f2fs_sb_info *sbi)
> >>                          F2FS_FT_DIR, TYPE_INODE, &blk_cnt, &cbc, &child);
> >>          fsck_chk_quota_files(sbi);
> >>
> >> +       fsck_update_sb_flags(sbi);
> >> +
> >>          ret = fsck_verify(sbi);
> >>          fsck_free(sbi);
> >>
> >> diff --git a/include/f2fs_fs.h b/include/f2fs_fs.h
> >> index f206994..7e3f25b 100644
> >> --- a/include/f2fs_fs.h
> >> +++ b/include/f2fs_fs.h
> >> @@ -682,7 +682,8 @@ enum {
> >>   #define IS_DEVICE_ALIASING(fi) ((fi)->i_flags & 
> >> cpu_to_le32(F2FS_DEVICE_ALIAS_FL))
> >>
> >>   #define F2FS_ENC_UTF8_12_1     1
> >> -#define F2FS_ENC_STRICT_MODE_FL        (1 << 0)
> >> +#define F2FS_ENC_STRICT_MODE_FL                (1 << 0)
> >> +#define F2FS_ENC_NO_COMPAT_FALLBACK_FL (1 << 1)
> >>
> >>   /* This flag is used by node and meta inodes, and by recovery */
> >>   #define GFP_F2FS_ZERO  (GFP_NOFS | __GFP_ZERO)
> >> @@ -1467,7 +1468,9 @@ enum {
> >>   #define SB_ABNORMAL_STOP       0x2     /* s_stop_reason is set except 
> >> shutdown */
> >>   #define SB_FS_ERRORS           0x4     /* s_erros is set */
> >>   #define SB_INVALID             0x8     /* sb is invalid */
> >> -#define SB_NEED_FIX (SB_ABNORMAL_STOP | SB_FS_ERRORS | SB_INVALID)
> >> +#define SB_ENCODE_FLAG         0x16    /* encode_flag */
> >> +#define SB_NEED_FIX            (SB_ABNORMAL_STOP | SB_FS_ERRORS |      \
> >> +                               SB_INVALID | SB_ENCODE_FLAG)
> >>
> >>   #define MAX_CACHE_SUMS                 8
> >>
> >> @@ -1541,6 +1544,7 @@ struct f2fs_configuration {
> >>          int preserve_limits;            /* preserve quota limits */
> >>          int large_nat_bitmap;
> >>          int fix_chksum;                 /* fix old cp.chksum position */
> >> +       int nolinear_lookup;            /* disable linear lookup */
> >>          unsigned int feature;                   /* defined features */
> >>          unsigned int disabled_feature;  /* disabled feature, used for 
> >> Android only */
> >>          unsigned int quota_bits;        /* quota bits */
> >> diff --git a/man/fsck.f2fs.8 b/man/fsck.f2fs.8
> >> index e39a846..606e288 100644
> >> --- a/man/fsck.f2fs.8
> >> +++ b/man/fsck.f2fs.8
> >> @@ -67,6 +67,9 @@ Enable to show every directory entries in the partition.
> >>   Specify the level of debugging options.
> >>   The default number is 0, which shows basic debugging messages.
> >>   .TP
> >> +.BI \--nolinear-lookup
> >> +Tune linear lookup fallback, must specify an argument, 0: enable linear 
> >> lookup, 1: disable linear lookup.
> >> +.TP
> >>   .SH AUTHOR
> >>   Initial checking code was written by Byoung Geun Kim 
> >> <bgbg....@samsung.com>.
> >>   Jaegeuk Kim <jaeg...@kernel.org> reworked most parts of the codes to 
> >> support
> >> --
> >> 2.49.0
> >>
> >>
> >>
> >> _______________________________________________
> >> Linux-f2fs-devel mailing list
> >> Linux-f2fs-devel@lists.sourceforge.net
> >> https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel
>


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

Reply via email to