]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
5.15-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 9 Jan 2026 10:43:42 +0000 (11:43 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 9 Jan 2026 10:43:42 +0000 (11:43 +0100)
added patches:
ext4-factor-out-ext4_hash_info_init.patch
ext4-filesystems-without-casefold-feature-cannot-be-mounted-with-siphash.patch
ext4-fix-error-message-when-rejecting-the-default-hash.patch

queue-5.15/ext4-factor-out-ext4_hash_info_init.patch [new file with mode: 0644]
queue-5.15/ext4-filesystems-without-casefold-feature-cannot-be-mounted-with-siphash.patch [new file with mode: 0644]
queue-5.15/ext4-fix-error-message-when-rejecting-the-default-hash.patch [new file with mode: 0644]

diff --git a/queue-5.15/ext4-factor-out-ext4_hash_info_init.patch b/queue-5.15/ext4-factor-out-ext4_hash_info_init.patch
new file mode 100644 (file)
index 0000000..27dce4f
--- /dev/null
@@ -0,0 +1,92 @@
+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);
diff --git a/queue-5.15/ext4-filesystems-without-casefold-feature-cannot-be-mounted-with-siphash.patch b/queue-5.15/ext4-filesystems-without-casefold-feature-cannot-be-mounted-with-siphash.patch
new file mode 100644 (file)
index 0000000..6c104c3
--- /dev/null
@@ -0,0 +1,43 @@
+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;
diff --git a/queue-5.15/ext4-fix-error-message-when-rejecting-the-default-hash.patch b/queue-5.15/ext4-fix-error-message-when-rejecting-the-default-hash.patch
new file mode 100644 (file)
index 0000000..e6eada2
--- /dev/null
@@ -0,0 +1,109 @@
+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);