All of lore.kernel.org
 help / color / mirror / Atom feed
From: Vasiliy Kovalev <kovalev@altlinux.org>
To: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	Sasha Levin <sashal@kernel.org>,
	stable@vger.kernel.org
Cc: lvc-project@linuxtesting.org, dutyrok@altlinux.org,
	gerben@altlinux.org, kovalev@altlinux.org
Subject: [PATCH 3/3] ext4: fix error message when rejecting the default hash
Date: Mon, 18 Nov 2024 13:20:50 +0300	[thread overview]
Message-ID: <20241118102050.16077-4-kovalev@altlinux.org> (raw)
In-Reply-To: <20241118102050.16077-1-kovalev@altlinux.org>

From: Gabriel Krisman Bertazi <krisman@suse.de>

[ Upstream commit a2187431c395cdfbf144e3536f25468c64fc7cfa ]

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>
Signed-off-by: Vasiliy Kovalev <kovalev@altlinux.org>
---
 fs/ext4/ext4.h  |  1 +
 fs/ext4/super.c | 28 +++++++++++++++++-----------
 2 files changed, 18 insertions(+), 11 deletions(-)

diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h
index 72abb8d6caf75..d5706aedf4fef 100644
--- a/fs/ext4/ext4.h
+++ b/fs/ext4/ext4.h
@@ -2449,6 +2449,7 @@ static inline __le16 ext4_rec_len_to_disk(unsigned len, unsigned blocksize)
 #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)
diff --git a/fs/ext4/super.c b/fs/ext4/super.c
index 68070b1859803..3e4b9bf101454 100644
--- a/fs/ext4/super.c
+++ b/fs/ext4/super.c
@@ -3559,14 +3559,6 @@ int ext4_feature_set_ok(struct super_block *sb, int readonly)
 	}
 #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;
 
@@ -5050,16 +5042,27 @@ static int ext4_load_super(struct super_block *sb, ext4_fsblk_t *lsb,
 	return ret;
 }
 
-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)
@@ -5077,6 +5080,7 @@ static void ext4_hash_info_init(struct super_block *sb)
 #endif
 		}
 	}
+	return 0;
 }
 
 static int __ext4_fill_super(struct fs_context *fc, struct super_block *sb)
@@ -5234,7 +5238,9 @@ static int __ext4_fill_super(struct fs_context *fc, struct super_block *sb)
 	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;
 
 	if (ext4_handle_clustersize(sb))
 		goto failed_mount;
-- 
2.33.8


WARNING: multiple messages have this Message-ID (diff)
From: Sasha Levin <sashal@kernel.org>
To: stable@vger.kernel.org
Cc: Vasiliy Kovalev <kovalev@altlinux.org>, Sasha Levin <sashal@kernel.org>
Subject: Re: [PATCH 3/3] ext4: fix error message when rejecting the default hash
Date: Mon, 18 Nov 2024 23:36:35 -0500	[thread overview]
Message-ID: <20241118102050.16077-4-kovalev@altlinux.org> (raw)
Message-ID: <20241119043635.g8uMBK5UglL8AI2bA8e9dlnTS8yntkUP1syTTSIvgjQ@z> (raw)
In-Reply-To: <20241118102050.16077-4-kovalev@altlinux.org>

[ Sasha's backport helper bot ]

Hi,

The upstream commit SHA1 provided is correct: a2187431c395cdfbf144e3536f25468c64fc7cfa

WARNING: Author mismatch between patch and upstream commit:
Backport author: Vasiliy Kovalev <kovalev@altlinux.org>
Commit author: Gabriel Krisman Bertazi <krisman@suse.de>

Commit in newer trees:

|-----------------|----------------------------------------------|
| 6.11.y          |  Present (different SHA1: b5778b2b428a)      |
|-----------------|----------------------------------------------|

Note: The patch differs from the upstream commit:
---
--- -	2024-11-18 22:36:26.886622930 -0500
+++ /tmp/tmp.pApf2ytKkR	2024-11-18 22:36:26.882290161 -0500
@@ -1,3 +1,5 @@
+[ Upstream commit a2187431c395cdfbf144e3536f25468c64fc7cfa ]
+
 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
@@ -11,16 +13,17 @@
 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>
+Signed-off-by: Vasiliy Kovalev <kovalev@altlinux.org>
 ---
  fs/ext4/ext4.h  |  1 +
- fs/ext4/super.c | 27 +++++++++++++++++----------
- 2 files changed, 18 insertions(+), 10 deletions(-)
+ fs/ext4/super.c | 28 +++++++++++++++++-----------
+ 2 files changed, 18 insertions(+), 11 deletions(-)
 
 diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h
-index 481ece3660eb7..7ac668d4ce83c 100644
+index 72abb8d6caf75..d5706aedf4fef 100644
 --- a/fs/ext4/ext4.h
 +++ b/fs/ext4/ext4.h
-@@ -2462,6 +2462,7 @@ static inline __le16 ext4_rec_len_to_disk(unsigned len, unsigned blocksize)
+@@ -2449,6 +2449,7 @@ static inline __le16 ext4_rec_len_to_disk(unsigned len, unsigned blocksize)
  #define DX_HASH_HALF_MD4_UNSIGNED	4
  #define DX_HASH_TEA_UNSIGNED		5
  #define DX_HASH_SIPHASH			6
@@ -29,13 +32,13 @@
  static inline u32 ext4_chksum(struct ext4_sb_info *sbi, u32 crc,
  			      const void *address, unsigned int length)
 diff --git a/fs/ext4/super.c b/fs/ext4/super.c
-index 58423e6bf3d07..adc5046fe9dd5 100644
+index 68070b1859803..3e4b9bf101454 100644
 --- a/fs/ext4/super.c
 +++ b/fs/ext4/super.c
-@@ -3583,13 +3583,6 @@ int ext4_feature_set_ok(struct super_block *sb, int readonly)
- 			 "mounted without CONFIG_UNICODE");
- 		return 0;
+@@ -3559,14 +3559,6 @@ int ext4_feature_set_ok(struct super_block *sb, int readonly)
  	}
+ #endif
+ 
 -	if (EXT4_SB(sb)->s_es->s_def_hash_version == DX_HASH_SIPHASH &&
 -	    !ext4_has_feature_casefold(sb)) {
 -		ext4_msg(sb, KERN_ERR,
@@ -43,10 +46,11 @@
 -			 "mounted with siphash");
 -		return 0;
 -	}
- 
+-
  	if (readonly)
  		return 1;
-@@ -5095,16 +5088,27 @@ static int ext4_load_super(struct super_block *sb, ext4_fsblk_t *lsb,
+ 
+@@ -5050,16 +5042,27 @@ static int ext4_load_super(struct super_block *sb, ext4_fsblk_t *lsb,
  	return ret;
  }
  
@@ -76,22 +80,25 @@
  	if (ext4_has_feature_dir_index(sb)) {
  		i = le32_to_cpu(es->s_flags);
  		if (i & EXT2_FLAGS_UNSIGNED_HASH)
-@@ -5122,6 +5126,7 @@ static void ext4_hash_info_init(struct super_block *sb)
+@@ -5077,6 +5080,7 @@ static void ext4_hash_info_init(struct super_block *sb)
  #endif
  		}
  	}
 +	return 0;
  }
  
- static int ext4_block_group_meta_init(struct super_block *sb, int silent)
-@@ -5257,7 +5262,9 @@ static int __ext4_fill_super(struct fs_context *fc, struct super_block *sb)
- 	if (err)
- 		goto failed_mount;
+ static int __ext4_fill_super(struct fs_context *fc, struct super_block *sb)
+@@ -5234,7 +5238,9 @@ static int __ext4_fill_super(struct fs_context *fc, struct super_block *sb)
+ 	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;
  
- 	err = ext4_handle_clustersize(sb);
- 	if (err)
+ 	if (ext4_handle_clustersize(sb))
+ 		goto failed_mount;
+-- 
+2.33.8
+
---

Results of testing on various branches:

| Branch                    | Patch Apply | Build Test |
|---------------------------|-------------|------------|
| stable/linux-6.11.y       |  Failed (branch not found)  |  N/A       |
| stable/linux-6.6.y        |  Failed (branch not found)  |  N/A       |
| stable/linux-6.1.y        |  Failed (branch not found)  |  N/A       |
| stable/linux-5.15.y       |  Failed (branch not found)  |  N/A       |
| stable/linux-5.10.y       |  Failed (branch not found)  |  N/A       |
| stable/linux-5.4.y        |  Failed (branch not found)  |  N/A       |
| stable/linux-4.19.y       |  Failed (branch not found)  |  N/A       |

  parent reply	other threads:[~2024-11-18 10:21 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-11-18 10:20 [PATCH 6.1.y 0/3] ext4: Fix warning related to siphash and ext4 filesystem mounting Vasiliy Kovalev
2024-11-18 10:20 ` [PATCH 1/3] ext4: factor out ext4_hash_info_init() Vasiliy Kovalev
2024-11-19  4:36   ` Sasha Levin
2024-11-18 10:20 ` [PATCH 2/3] ext4: filesystems without casefold feature cannot be mounted with siphash Vasiliy Kovalev
2024-11-19  4:36   ` Sasha Levin
2024-11-18 10:20 ` Vasiliy Kovalev [this message]
2024-11-19  4:36   ` [PATCH 3/3] ext4: fix error message when rejecting the default hash Sasha Levin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20241118102050.16077-4-kovalev@altlinux.org \
    --to=kovalev@altlinux.org \
    --cc=dutyrok@altlinux.org \
    --cc=gerben@altlinux.org \
    --cc=gregkh@linuxfoundation.org \
    --cc=lvc-project@linuxtesting.org \
    --cc=sashal@kernel.org \
    --cc=stable@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.