[<prev] [next>] [day] [month] [year] [list]
Message-ID: <20250725054922.3972265-1-chao@kernel.org>
Date: Fri, 25 Jul 2025 13:49:22 +0800
From: Chao Yu <chao@...nel.org>
To: jaegeuk@...nel.org
Cc: linux-f2fs-devel@...ts.sourceforge.net,
linux-kernel@...r.kernel.org,
Chao Yu <chao@...nel.org>
Subject: [PATCH v3] mkfs.f2fs: support -C [no]hashonly to control linear lookup fallback
It provides a way to disable linear lookup fallback during mkfs.
Behavior summary:
Android Distro
By default disabled enabled
Android case:
1.1) Disable linear lookup:
- mkfs.f2fs -f -g android -O casefold -C utf8:hashonly /dev/vdb
- dump.f2fs -d3 /dev/vdb |grep s_encoding_flags
s_encoding_flags [0x 2 : 2]
1.2) Enable linear lookup:
- mkfs.f2fs -f -g android -O casefold -C utf8:nohashonly /dev/vdb
- dump.f2fs -d3 /dev/vdb |grep s_encoding_flags
s_encoding_flags [0x 0 : 0]
1.3) By default:
- mkfs.f2fs -f -g android -O casefold -C utf8 /dev/vdb
Info: set default linear_lookup option: disable
- dump.f2fs -d3 /dev/vdb |grep s_encoding_flags
s_encoding_flags [0x 2 : 2]
Distro case:
2.1) Disable linear lookup:
- mkfs.f2fs -f -O casefold -C utf8:hashonly /dev/vdb
- dump.f2fs -d3 /dev/vdb |grep s_encoding_flags
s_encoding_flags [0x 2 : 2]
2.2) Enable linear lookup:
- mkfs.f2fs -f -O casefold -C utf8:nohashonly /dev/vdb
- dump.f2fs -d3 /dev/vdb |grep s_encoding_flags
s_encoding_flags [0x 0 : 0]
2.3) By default:
- mkfs.f2fs -f -O casefold -C utf8 /dev/vdb
- dump.f2fs -d3 /dev/vdb |grep s_encoding_flags
s_encoding_flags [0x 0 : 0]
Signed-off-by: Chao Yu <chao@...nel.org>
---
v3:
- honor [no]hashonly flag for Android case
- update testcase and output
include/f2fs_fs.h | 3 ++-
lib/libf2fs.c | 6 ++++++
man/mkfs.f2fs.8 | 9 ++++++++-
mkfs/f2fs_format.c | 11 +++++++++++
mkfs/f2fs_format_main.c | 3 ++-
5 files changed, 29 insertions(+), 3 deletions(-)
diff --git a/include/f2fs_fs.h b/include/f2fs_fs.h
index f7268d1..a8da8fa 100644
--- a/include/f2fs_fs.h
+++ b/include/f2fs_fs.h
@@ -1478,7 +1478,8 @@ enum {
/* feature list in Android */
enum {
- F2FS_FEATURE_NAT_BITS = 0x0001,
+ F2FS_FEATURE_NAT_BITS = 0x0001,
+ F2FS_FEATURE_LINEAR_LOOKUP = 0x0002,
};
/* nolinear lookup tune */
diff --git a/lib/libf2fs.c b/lib/libf2fs.c
index 2f012c8..1a496b7 100644
--- a/lib/libf2fs.c
+++ b/lib/libf2fs.c
@@ -1424,6 +1424,7 @@ static const struct enc_flags {
char *param;
} encoding_flags[] = {
{ F2FS_ENC_STRICT_MODE_FL, "strict" },
+ { F2FS_ENC_NO_COMPAT_FALLBACK_FL, "hashonly"}
};
/* Return a positive number < 0xff indicating the encoding magic number
@@ -1485,6 +1486,11 @@ int f2fs_str2encoding_flags(char **param, __u16 *flags)
*flags |= fl->flag;
}
+ if (fl->flag == F2FS_ENC_NO_COMPAT_FALLBACK_FL)
+ c.nolinear_lookup = neg ?
+ LINEAR_LOOKUP_ENABLE :
+ LINEAR_LOOKUP_DISABLE;
+
goto next_flag;
}
}
diff --git a/man/mkfs.f2fs.8 b/man/mkfs.f2fs.8
index 8b3b0cc..fcb227c 100644
--- a/man/mkfs.f2fs.8
+++ b/man/mkfs.f2fs.8
@@ -232,10 +232,17 @@ Use UTF-8 for casefolding.
.I flags:
.RS 1.2i
.TP 1.2i
-.B strict
+.B [no]strict
This flag specifies that invalid strings should be rejected by the filesystem.
Default is disabled.
.RE
+.RS 1.2i
+.TP 1.2i
+.B [no]hashonly
+This flag specifies that linear lookup fallback is off during lookup, to turn
+off linear lookup fallback, use nohashonly flag.
+For android case, it will disable linear lookup by default.
+.RE
.RE
.TP
.BI \-q
diff --git a/mkfs/f2fs_format.c b/mkfs/f2fs_format.c
index 2680bd3..04dfc20 100644
--- a/mkfs/f2fs_format.c
+++ b/mkfs/f2fs_format.c
@@ -671,6 +671,17 @@ static int f2fs_prepare_super_block(void)
memcpy(sb->init_version, c.version, VERSION_LEN);
if (c.feature & F2FS_FEATURE_CASEFOLD) {
+ /*
+ * if [no]hashonly option is not assigned, let's disable
+ * linear lookup fallback by default for Android case.
+ */
+ if ((c.nolinear_lookup == LINEAR_LOOKUP_DEFAULT) &&
+ (c.disabled_feature & F2FS_FEATURE_LINEAR_LOOKUP)) {
+ c.s_encoding_flags |= F2FS_ENC_NO_COMPAT_FALLBACK_FL;
+ MSG(0, "Info: set default linear_lookup option: %s\n",
+ c.s_encoding_flags & F2FS_ENC_NO_COMPAT_FALLBACK_FL ?
+ "disable" : "enable");
+ }
set_sb(s_encoding, c.s_encoding);
set_sb(s_encoding_flags, c.s_encoding_flags);
}
diff --git a/mkfs/f2fs_format_main.c b/mkfs/f2fs_format_main.c
index f0bec4f..8f8e975 100644
--- a/mkfs/f2fs_format_main.c
+++ b/mkfs/f2fs_format_main.c
@@ -143,7 +143,8 @@ static void add_default_options(void)
force_overwrite = 1;
c.wanted_sector_size = F2FS_BLKSIZE;
c.root_uid = c.root_gid = 0;
- c.disabled_feature |= F2FS_FEATURE_NAT_BITS;
+ c.disabled_feature |= F2FS_FEATURE_NAT_BITS |
+ F2FS_FEATURE_LINEAR_LOOKUP;
/* RO doesn't need any other features */
if (c.feature & F2FS_FEATURE_RO)
--
2.49.0
Powered by blists - more mailing lists