--- /dev/null
+From stable+bounces-206366-greg=kroah.com@vger.kernel.org Thu Jan 8 17:18:35 2026
+From: Thadeu Lima de Souza Cascardo <cascardo@igalia.com>
+Date: Thu, 8 Jan 2026 12:04:28 -0300
+Subject: ext4: factor out ext4_hash_info_init()
+To: stable@vger.kernel.org
+Cc: Gabriel Krisman Bertazi <krisman@suse.de>, Jason Yan <yanaijie@huawei.com>, Theodore Ts'o <tytso@mit.edu>, Thadeu Lima de Souza Cascardo <cascardo@igalia.com>
+Message-ID: <20260108150429.3354837-2-cascardo@igalia.com>
+
+From: Jason Yan <yanaijie@huawei.com>
+
+commit db9345d9e6f075e1ec26afadf744078ead935fec upstream.
+
+Factor out ext4_hash_info_init() to simplify __ext4_fill_super(). No
+functional change.
+
+Signed-off-by: Jason Yan <yanaijie@huawei.com>
+Link: https://lore.kernel.org/r/20230323140517.1070239-2-yanaijie@huawei.com
+Signed-off-by: Theodore Ts'o <tytso@mit.edu>
+Stable-dep-of: a2187431c395 ("ext4: fix error message when rejecting the default hash")
+[cascardo: conflicts due to other parts of ext4_fill_super having been factored out]
+Signed-off-by: Thadeu Lima de Souza Cascardo <cascardo@igalia.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ fs/ext4/super.c | 50 ++++++++++++++++++++++++++++++--------------------
+ 1 file changed, 30 insertions(+), 20 deletions(-)
+
+--- a/fs/ext4/super.c
++++ b/fs/ext4/super.c
+@@ -3897,6 +3897,35 @@ static void ext4_setup_csum_trigger(stru
+ sbi->s_journal_triggers[type].tr_triggers.t_frozen = trigger;
+ }
+
++static void ext4_hash_info_init(struct super_block *sb)
++{
++ struct ext4_sb_info *sbi = EXT4_SB(sb);
++ struct ext4_super_block *es = sbi->s_es;
++ unsigned int i;
++
++ for (i = 0; i < 4; i++)
++ sbi->s_hash_seed[i] = le32_to_cpu(es->s_hash_seed[i]);
++
++ sbi->s_def_hash_version = es->s_def_hash_version;
++ if (ext4_has_feature_dir_index(sb)) {
++ i = le32_to_cpu(es->s_flags);
++ if (i & EXT2_FLAGS_UNSIGNED_HASH)
++ sbi->s_hash_unsigned = 3;
++ else if ((i & EXT2_FLAGS_SIGNED_HASH) == 0) {
++#ifdef __CHAR_UNSIGNED__
++ if (!sb_rdonly(sb))
++ es->s_flags |=
++ cpu_to_le32(EXT2_FLAGS_UNSIGNED_HASH);
++ sbi->s_hash_unsigned = 3;
++#else
++ if (!sb_rdonly(sb))
++ es->s_flags |=
++ cpu_to_le32(EXT2_FLAGS_SIGNED_HASH);
++#endif
++ }
++ }
++}
++
+ static int ext4_fill_super(struct super_block *sb, void *data, int silent)
+ {
+ struct dax_device *dax_dev = fs_dax_get_by_bdev(sb->s_bdev);
+@@ -4415,26 +4444,7 @@ static int ext4_fill_super(struct super_
+ sbi->s_addr_per_block_bits = ilog2(EXT4_ADDR_PER_BLOCK(sb));
+ sbi->s_desc_per_block_bits = ilog2(EXT4_DESC_PER_BLOCK(sb));
+
+- for (i = 0; i < 4; i++)
+- sbi->s_hash_seed[i] = le32_to_cpu(es->s_hash_seed[i]);
+- sbi->s_def_hash_version = es->s_def_hash_version;
+- if (ext4_has_feature_dir_index(sb)) {
+- i = le32_to_cpu(es->s_flags);
+- if (i & EXT2_FLAGS_UNSIGNED_HASH)
+- sbi->s_hash_unsigned = 3;
+- else if ((i & EXT2_FLAGS_SIGNED_HASH) == 0) {
+-#ifdef __CHAR_UNSIGNED__
+- if (!sb_rdonly(sb))
+- es->s_flags |=
+- cpu_to_le32(EXT2_FLAGS_UNSIGNED_HASH);
+- sbi->s_hash_unsigned = 3;
+-#else
+- if (!sb_rdonly(sb))
+- es->s_flags |=
+- cpu_to_le32(EXT2_FLAGS_SIGNED_HASH);
+-#endif
+- }
+- }
++ ext4_hash_info_init(sb);
+
+ /* Handle clustersize */
+ clustersize = BLOCK_SIZE << le32_to_cpu(es->s_log_cluster_size);
--- /dev/null
+From stable+bounces-206365-greg=kroah.com@vger.kernel.org Thu Jan 8 16:24:34 2026
+From: Thadeu Lima de Souza Cascardo <cascardo@igalia.com>
+Date: Thu, 8 Jan 2026 12:04:27 -0300
+Subject: ext4: filesystems without casefold feature cannot be mounted with siphash
+To: stable@vger.kernel.org
+Cc: Gabriel Krisman Bertazi <krisman@suse.de>, Lizhi Xu <lizhi.xu@windriver.com>, syzbot+340581ba9dceb7e06fb3@syzkaller.appspotmail.com, Theodore Ts'o <tytso@mit.edu>, Thadeu Lima de Souza Cascardo <cascardo@igalia.com>
+Message-ID: <20260108150429.3354837-1-cascardo@igalia.com>
+
+From: Lizhi Xu <lizhi.xu@windriver.com>
+
+commit 985b67cd86392310d9e9326de941c22fc9340eec upstream.
+
+When mounting the ext4 filesystem, if the default hash version is set to
+DX_HASH_SIPHASH but the casefold feature is not set, exit the mounting.
+
+Reported-by: syzbot+340581ba9dceb7e06fb3@syzkaller.appspotmail.com
+Signed-off-by: Lizhi Xu <lizhi.xu@windriver.com>
+Link: https://patch.msgid.link/20240605012335.44086-1-lizhi.xu@windriver.com
+Signed-off-by: Theodore Ts'o <tytso@mit.edu>
+[cascardo: small conflict fixup]
+Signed-off-by: Thadeu Lima de Souza Cascardo <cascardo@igalia.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ fs/ext4/super.c | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+--- a/fs/ext4/super.c
++++ b/fs/ext4/super.c
+@@ -3191,6 +3191,14 @@ int ext4_feature_set_ok(struct super_blo
+ }
+ #endif
+
++ if (EXT4_SB(sb)->s_es->s_def_hash_version == DX_HASH_SIPHASH &&
++ !ext4_has_feature_casefold(sb)) {
++ ext4_msg(sb, KERN_ERR,
++ "Filesystem without casefold feature cannot be "
++ "mounted with siphash");
++ return 0;
++ }
++
+ if (readonly)
+ return 1;
+
--- /dev/null
+From stable+bounces-206367-greg=kroah.com@vger.kernel.org Thu Jan 8 16:24:27 2026
+From: Thadeu Lima de Souza Cascardo <cascardo@igalia.com>
+Date: Thu, 8 Jan 2026 12:04:29 -0300
+Subject: ext4: fix error message when rejecting the default hash
+To: stable@vger.kernel.org
+Cc: Gabriel Krisman Bertazi <krisman@suse.de>, Theodore Ts'o <tytso@mit.edu>, Thadeu Lima de Souza Cascardo <cascardo@igalia.com>
+Message-ID: <20260108150429.3354837-3-cascardo@igalia.com>
+
+From: Gabriel Krisman Bertazi <krisman@suse.de>
+
+commit a2187431c395cdfbf144e3536f25468c64fc7cfa upstream.
+
+Commit 985b67cd8639 ("ext4: filesystems without casefold feature cannot
+be mounted with siphash") properly rejects volumes where
+s_def_hash_version is set to DX_HASH_SIPHASH, but the check and the
+error message should not look into casefold setup - a filesystem should
+never have DX_HASH_SIPHASH as the default hash. Fix it and, since we
+are there, move the check to ext4_hash_info_init.
+
+Fixes:985b67cd8639 ("ext4: filesystems without casefold feature cannot
+be mounted with siphash")
+
+Signed-off-by: Gabriel Krisman Bertazi <krisman@suse.de>
+Link: https://patch.msgid.link/87jzg1en6j.fsf_-_@mailhost.krisman.be
+Signed-off-by: Theodore Ts'o <tytso@mit.edu>
+[cascardo: conflicts due to other parts of ext4_fill_super having been factored out]
+Signed-off-by: Thadeu Lima de Souza Cascardo <cascardo@igalia.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ fs/ext4/ext4.h | 1 +
+ fs/ext4/super.c | 28 +++++++++++++++++-----------
+ 2 files changed, 18 insertions(+), 11 deletions(-)
+
+--- a/fs/ext4/ext4.h
++++ b/fs/ext4/ext4.h
+@@ -2443,6 +2443,7 @@ static inline __le16 ext4_rec_len_to_dis
+ #define DX_HASH_HALF_MD4_UNSIGNED 4
+ #define DX_HASH_TEA_UNSIGNED 5
+ #define DX_HASH_SIPHASH 6
++#define DX_HASH_LAST DX_HASH_SIPHASH
+
+ static inline u32 ext4_chksum(struct ext4_sb_info *sbi, u32 crc,
+ const void *address, unsigned int length)
+--- a/fs/ext4/super.c
++++ b/fs/ext4/super.c
+@@ -3191,14 +3191,6 @@ int ext4_feature_set_ok(struct super_blo
+ }
+ #endif
+
+- if (EXT4_SB(sb)->s_es->s_def_hash_version == DX_HASH_SIPHASH &&
+- !ext4_has_feature_casefold(sb)) {
+- ext4_msg(sb, KERN_ERR,
+- "Filesystem without casefold feature cannot be "
+- "mounted with siphash");
+- return 0;
+- }
+-
+ if (readonly)
+ return 1;
+
+@@ -3897,16 +3889,27 @@ static void ext4_setup_csum_trigger(stru
+ sbi->s_journal_triggers[type].tr_triggers.t_frozen = trigger;
+ }
+
+-static void ext4_hash_info_init(struct super_block *sb)
++static int ext4_hash_info_init(struct super_block *sb)
+ {
+ struct ext4_sb_info *sbi = EXT4_SB(sb);
+ struct ext4_super_block *es = sbi->s_es;
+ unsigned int i;
+
++ sbi->s_def_hash_version = es->s_def_hash_version;
++
++ if (sbi->s_def_hash_version > DX_HASH_LAST) {
++ ext4_msg(sb, KERN_ERR,
++ "Invalid default hash set in the superblock");
++ return -EINVAL;
++ } else if (sbi->s_def_hash_version == DX_HASH_SIPHASH) {
++ ext4_msg(sb, KERN_ERR,
++ "SIPHASH is not a valid default hash value");
++ return -EINVAL;
++ }
++
+ for (i = 0; i < 4; i++)
+ sbi->s_hash_seed[i] = le32_to_cpu(es->s_hash_seed[i]);
+
+- sbi->s_def_hash_version = es->s_def_hash_version;
+ if (ext4_has_feature_dir_index(sb)) {
+ i = le32_to_cpu(es->s_flags);
+ if (i & EXT2_FLAGS_UNSIGNED_HASH)
+@@ -3924,6 +3927,7 @@ static void ext4_hash_info_init(struct s
+ #endif
+ }
+ }
++ return 0;
+ }
+
+ static int ext4_fill_super(struct super_block *sb, void *data, int silent)
+@@ -4444,7 +4448,9 @@ static int ext4_fill_super(struct super_
+ sbi->s_addr_per_block_bits = ilog2(EXT4_ADDR_PER_BLOCK(sb));
+ sbi->s_desc_per_block_bits = ilog2(EXT4_DESC_PER_BLOCK(sb));
+
+- ext4_hash_info_init(sb);
++ err = ext4_hash_info_init(sb);
++ if (err)
++ goto failed_mount;
+
+ /* Handle clustersize */
+ clustersize = BLOCK_SIZE << le32_to_cpu(es->s_log_cluster_size);