linux-f2fs-devel.lists.sourceforge.net archive mirror
 help / color / mirror / Atom feed
* [f2fs-dev] [PATCH 0/8] Revert setting casefolding dentry operations through s_d_op
@ 2023-12-13 23:40 Gabriel Krisman Bertazi
  2023-12-13 23:40 ` [f2fs-dev] [PATCH 1/8] dcache: Add helper to disable d_revalidate for a specific dentry Gabriel Krisman Bertazi
                   ` (7 more replies)
  0 siblings, 8 replies; 12+ messages in thread
From: Gabriel Krisman Bertazi @ 2023-12-13 23:40 UTC (permalink / raw)
  To: viro, ebiggers, jaegeuk, tytso
  Cc: linux-fsdevel, Gabriel Krisman Bertazi, linux-ext4,
	linux-f2fs-devel

When case-insensitive and fscrypt were adapted to work together, we moved the
code that sets the dentry operations for case-insensitive dentries(d_hash and
d_compare) to happen from a helper inside ->lookup.  This is because fscrypt
wants to set d_revalidate only on some dentries, so it does it only for them in
d_revalidate.

But, case-insensitive hooks are actually set on all dentries in the filesystem,
so the natural place to do it is through s_d_op and let d_alloc handle it [1].
In addition, doing it inside the ->lookup is a problem for case-insensitive
dentries that are not created through ->lookup, like those coming
open-by-fhandle[2], which will not see the required d_ops.

This patchset therefore reverts to using sb->s_d_op to set the dentry operations
for case-insensitive filesystems.  In order to set case-insensitive hooks early
and not require every dentry to have d_revalidate in case-insensitive
filesystems, it introduces a patch suggested by Al Viro to disable d_revalidate
on some dentries on the fly.

It survives fstests encrypt and quick groups without regressions.  Based on v6.7-rc1.

[1] https://lore.kernel.org/linux-fsdevel/20231123195327.GP38156@ZenIV/
[2] https://lore.kernel.org/linux-fsdevel/20231123171255.GN38156@ZenIV/

Gabriel Krisman Bertazi (8):
  dcache: Add helper to disable d_revalidate for a specific dentry
  fscrypt: Drop d_revalidate if key is available
  libfs: Merge encrypted_ci_dentry_ops and ci_dentry_ops
  libfs: Expose generic_ci_dentry_ops outside of libfs
  ext4: Set the case-insensitive dentry operations through ->s_d_op
  f2fs: Set the case-insensitive dentry operations through ->s_d_op
  libfs: Don't support setting casefold operations during lookup
  fscrypt: Move d_revalidate configuration back into fscrypt

 fs/crypto/fname.c       |  9 +++++-
 fs/crypto/hooks.c       |  8 ++++++
 fs/dcache.c             | 10 +++++++
 fs/ext4/namei.c         |  1 -
 fs/ext4/super.c         |  3 ++
 fs/f2fs/namei.c         |  1 -
 fs/f2fs/super.c         |  3 ++
 fs/libfs.c              | 64 +++--------------------------------------
 fs/ubifs/dir.c          |  1 -
 include/linux/dcache.h  |  1 +
 include/linux/fs.h      |  2 +-
 include/linux/fscrypt.h | 10 +++----
 12 files changed, 43 insertions(+), 70 deletions(-)

-- 
2.43.0



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

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [f2fs-dev] [PATCH 1/8] dcache: Add helper to disable d_revalidate for a specific dentry
  2023-12-13 23:40 [f2fs-dev] [PATCH 0/8] Revert setting casefolding dentry operations through s_d_op Gabriel Krisman Bertazi
@ 2023-12-13 23:40 ` Gabriel Krisman Bertazi
  2023-12-13 23:40 ` [f2fs-dev] [PATCH 2/8] fscrypt: Drop d_revalidate if key is available Gabriel Krisman Bertazi
                   ` (6 subsequent siblings)
  7 siblings, 0 replies; 12+ messages in thread
From: Gabriel Krisman Bertazi @ 2023-12-13 23:40 UTC (permalink / raw)
  To: viro, ebiggers, jaegeuk, tytso
  Cc: linux-fsdevel, Gabriel Krisman Bertazi, linux-ext4,
	linux-f2fs-devel

Case-insensitive wants d_compare/d_hash for every dentry in the
filesystem, while fscrypt needs d_revalidate only for DCACHE_NOKEY_NAME.
This means we currently can't use sb->s_d_op to set case-insensitive
hooks in fscrypt+case-insensitive filesystems without paying the cost to
call d_revalidate for every dentry in the filesystem.

In preparation to doing exactly that, add a way to disable d_revalidate
later.

Suggested-by: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: Gabriel Krisman Bertazi <krisman@suse.de>
---
 fs/dcache.c            | 10 ++++++++++
 include/linux/dcache.h |  1 +
 2 files changed, 11 insertions(+)

diff --git a/fs/dcache.c b/fs/dcache.c
index c82ae731df9a..1f5464cd3bd1 100644
--- a/fs/dcache.c
+++ b/fs/dcache.c
@@ -1911,6 +1911,16 @@ struct dentry *d_alloc_name(struct dentry *parent, const char *name)
 }
 EXPORT_SYMBOL(d_alloc_name);
 
+void d_set_always_valid(struct dentry *dentry)
+{
+	if (!(dentry->d_flags & DCACHE_OP_REVALIDATE))
+		return;
+
+	spin_lock(&dentry->d_lock);
+	dentry->d_flags &= ~DCACHE_OP_REVALIDATE;
+	spin_unlock(&dentry->d_lock);
+}
+
 void d_set_d_op(struct dentry *dentry, const struct dentry_operations *op)
 {
 	WARN_ON_ONCE(dentry->d_op);
diff --git a/include/linux/dcache.h b/include/linux/dcache.h
index 3da2f0545d5d..d2ce151b2d8e 100644
--- a/include/linux/dcache.h
+++ b/include/linux/dcache.h
@@ -225,6 +225,7 @@ extern struct dentry * d_instantiate_anon(struct dentry *, struct inode *);
 extern void __d_drop(struct dentry *dentry);
 extern void d_drop(struct dentry *dentry);
 extern void d_delete(struct dentry *);
+extern void d_set_always_valid(struct dentry *dentry);
 extern void d_set_d_op(struct dentry *dentry, const struct dentry_operations *op);
 
 /* allocate/de-allocate */
-- 
2.43.0



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

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [f2fs-dev] [PATCH 2/8] fscrypt: Drop d_revalidate if key is available
  2023-12-13 23:40 [f2fs-dev] [PATCH 0/8] Revert setting casefolding dentry operations through s_d_op Gabriel Krisman Bertazi
  2023-12-13 23:40 ` [f2fs-dev] [PATCH 1/8] dcache: Add helper to disable d_revalidate for a specific dentry Gabriel Krisman Bertazi
@ 2023-12-13 23:40 ` Gabriel Krisman Bertazi
  2023-12-13 23:40 ` [f2fs-dev] [PATCH 3/8] libfs: Merge encrypted_ci_dentry_ops and ci_dentry_ops Gabriel Krisman Bertazi
                   ` (5 subsequent siblings)
  7 siblings, 0 replies; 12+ messages in thread
From: Gabriel Krisman Bertazi @ 2023-12-13 23:40 UTC (permalink / raw)
  To: viro, ebiggers, jaegeuk, tytso
  Cc: linux-fsdevel, Gabriel Krisman Bertazi, linux-ext4,
	linux-f2fs-devel

fscrypt dentries are always valid once the key is available.  Since the
key cannot be removed without evicting the dentry, we don't need to keep
retrying to revalidate it.

Signed-off-by: Gabriel Krisman Bertazi <krisman@suse.de>
---
 fs/crypto/fname.c | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/fs/crypto/fname.c b/fs/crypto/fname.c
index 7b3fc189593a..0457ba2d7d76 100644
--- a/fs/crypto/fname.c
+++ b/fs/crypto/fname.c
@@ -591,8 +591,15 @@ int fscrypt_d_revalidate(struct dentry *dentry, unsigned int flags)
 	 * reverting to no-key names without evicting the directory's inode
 	 * -- which implies eviction of the dentries in the directory.
 	 */
-	if (!(dentry->d_flags & DCACHE_NOKEY_NAME))
+	if (!(dentry->d_flags & DCACHE_NOKEY_NAME)) {
+		/*
+		 * If fscrypt is the only feature requiring
+		 * revalidation for this dentry, we can just disable it.
+		 */
+		if (dentry->d_op->d_revalidate == &fscrypt_d_revalidate)
+			d_set_always_valid(dentry);
 		return 1;
+	}
 
 	/*
 	 * No-key name; valid if the directory's key is still unavailable.
-- 
2.43.0



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

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [f2fs-dev] [PATCH 3/8] libfs: Merge encrypted_ci_dentry_ops and ci_dentry_ops
  2023-12-13 23:40 [f2fs-dev] [PATCH 0/8] Revert setting casefolding dentry operations through s_d_op Gabriel Krisman Bertazi
  2023-12-13 23:40 ` [f2fs-dev] [PATCH 1/8] dcache: Add helper to disable d_revalidate for a specific dentry Gabriel Krisman Bertazi
  2023-12-13 23:40 ` [f2fs-dev] [PATCH 2/8] fscrypt: Drop d_revalidate if key is available Gabriel Krisman Bertazi
@ 2023-12-13 23:40 ` Gabriel Krisman Bertazi
  2023-12-13 23:40 ` [f2fs-dev] [PATCH 4/8] libfs: Expose generic_ci_dentry_ops outside of libfs Gabriel Krisman Bertazi
                   ` (4 subsequent siblings)
  7 siblings, 0 replies; 12+ messages in thread
From: Gabriel Krisman Bertazi @ 2023-12-13 23:40 UTC (permalink / raw)
  To: viro, ebiggers, jaegeuk, tytso
  Cc: linux-fsdevel, Gabriel Krisman Bertazi, linux-ext4,
	linux-f2fs-devel

In preparation to get case-insensitive dentry operations from
sb->s_d_op again, use the same structure for case-insensitive
filesystems with and without fscrypt.

This means that on a casefolded filesystem without fscrypt, we end up
having to call fscrypt_d_revalidate once per dentry, which does the
function call extra cost.  We could avoid it by calling
d_set_always_valid in generic_set_encrypted_ci_d_ops, but this entire
function will go away in the following patches, and it is not worth the
extra complexity. Also, since the first fscrypt_d_revalidate will call
d_set_always_valid for us, we'll only have only pay the cost once, and
not per-lookup.

Signed-off-by: Gabriel Krisman Bertazi <krisman@suse.de>
---
 fs/libfs.c | 34 ++++++----------------------------
 1 file changed, 6 insertions(+), 28 deletions(-)

diff --git a/fs/libfs.c b/fs/libfs.c
index e9440d55073c..52c944173e57 100644
--- a/fs/libfs.c
+++ b/fs/libfs.c
@@ -1768,6 +1768,9 @@ static int generic_ci_d_hash(const struct dentry *dentry, struct qstr *str)
 static const struct dentry_operations generic_ci_dentry_ops = {
 	.d_hash = generic_ci_d_hash,
 	.d_compare = generic_ci_d_compare,
+#if defined(CONFIG_FS_ENCRYPTION)
+	.d_revalidate = fscrypt_d_revalidate,
+#endif
 };
 #endif
 
@@ -1777,14 +1780,6 @@ static const struct dentry_operations generic_encrypted_dentry_ops = {
 };
 #endif
 
-#if defined(CONFIG_FS_ENCRYPTION) && IS_ENABLED(CONFIG_UNICODE)
-static const struct dentry_operations generic_encrypted_ci_dentry_ops = {
-	.d_hash = generic_ci_d_hash,
-	.d_compare = generic_ci_d_compare,
-	.d_revalidate = fscrypt_d_revalidate,
-};
-#endif
-
 /**
  * generic_set_encrypted_ci_d_ops - helper for setting d_ops for given dentry
  * @dentry:	dentry to set ops on
@@ -1801,38 +1796,21 @@ static const struct dentry_operations generic_encrypted_ci_dentry_ops = {
  * Encryption works differently in that the only dentry operation it needs is
  * d_revalidate, which it only needs on dentries that have the no-key name flag.
  * The no-key flag can't be set "later", so we don't have to worry about that.
- *
- * Finally, to maximize compatibility with overlayfs (which isn't compatible
- * with certain dentry operations) and to avoid taking an unnecessary
- * performance hit, we use custom dentry_operations for each possible
- * combination rather than always installing all operations.
  */
 void generic_set_encrypted_ci_d_ops(struct dentry *dentry)
 {
-#ifdef CONFIG_FS_ENCRYPTION
-	bool needs_encrypt_ops = dentry->d_flags & DCACHE_NOKEY_NAME;
-#endif
 #if IS_ENABLED(CONFIG_UNICODE)
-	bool needs_ci_ops = dentry->d_sb->s_encoding;
-#endif
-#if defined(CONFIG_FS_ENCRYPTION) && IS_ENABLED(CONFIG_UNICODE)
-	if (needs_encrypt_ops && needs_ci_ops) {
-		d_set_d_op(dentry, &generic_encrypted_ci_dentry_ops);
+	if (dentry->d_sb->s_encoding) {
+		d_set_d_op(dentry, &generic_ci_dentry_ops);
 		return;
 	}
 #endif
 #ifdef CONFIG_FS_ENCRYPTION
-	if (needs_encrypt_ops) {
+	if (dentry->d_flags & DCACHE_NOKEY_NAME) {
 		d_set_d_op(dentry, &generic_encrypted_dentry_ops);
 		return;
 	}
 #endif
-#if IS_ENABLED(CONFIG_UNICODE)
-	if (needs_ci_ops) {
-		d_set_d_op(dentry, &generic_ci_dentry_ops);
-		return;
-	}
-#endif
 }
 EXPORT_SYMBOL(generic_set_encrypted_ci_d_ops);
 
-- 
2.43.0



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

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [f2fs-dev] [PATCH 4/8] libfs: Expose generic_ci_dentry_ops outside of libfs
  2023-12-13 23:40 [f2fs-dev] [PATCH 0/8] Revert setting casefolding dentry operations through s_d_op Gabriel Krisman Bertazi
                   ` (2 preceding siblings ...)
  2023-12-13 23:40 ` [f2fs-dev] [PATCH 3/8] libfs: Merge encrypted_ci_dentry_ops and ci_dentry_ops Gabriel Krisman Bertazi
@ 2023-12-13 23:40 ` Gabriel Krisman Bertazi
  2023-12-13 23:40 ` [f2fs-dev] [PATCH 5/8] ext4: Set the case-insensitive dentry operations through ->s_d_op Gabriel Krisman Bertazi
                   ` (3 subsequent siblings)
  7 siblings, 0 replies; 12+ messages in thread
From: Gabriel Krisman Bertazi @ 2023-12-13 23:40 UTC (permalink / raw)
  To: viro, ebiggers, jaegeuk, tytso
  Cc: linux-fsdevel, Gabriel Krisman Bertazi, linux-ext4,
	linux-f2fs-devel

In preparation to allow filesystems to set this through sb->s_d_op,
expose the symbol directly to the filesystems.

Signed-off-by: Gabriel Krisman Bertazi <krisman@suse.de>
---
 fs/libfs.c         | 2 +-
 include/linux/fs.h | 1 +
 2 files changed, 2 insertions(+), 1 deletion(-)

diff --git a/fs/libfs.c b/fs/libfs.c
index 52c944173e57..b8ecada3a5b2 100644
--- a/fs/libfs.c
+++ b/fs/libfs.c
@@ -1765,7 +1765,7 @@ static int generic_ci_d_hash(const struct dentry *dentry, struct qstr *str)
 	return 0;
 }
 
-static const struct dentry_operations generic_ci_dentry_ops = {
+const struct dentry_operations generic_ci_dentry_ops = {
 	.d_hash = generic_ci_d_hash,
 	.d_compare = generic_ci_d_compare,
 #if defined(CONFIG_FS_ENCRYPTION)
diff --git a/include/linux/fs.h b/include/linux/fs.h
index 98b7a7a8c42e..887a27d07f96 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -3202,6 +3202,7 @@ extern int generic_file_fsync(struct file *, loff_t, loff_t, int);
 extern int generic_check_addressable(unsigned, u64);
 
 extern void generic_set_encrypted_ci_d_ops(struct dentry *dentry);
+extern const struct dentry_operations generic_ci_dentry_ops;
 
 int may_setattr(struct mnt_idmap *idmap, struct inode *inode,
 		unsigned int ia_valid);
-- 
2.43.0



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

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [f2fs-dev] [PATCH 5/8] ext4: Set the case-insensitive dentry operations through ->s_d_op
  2023-12-13 23:40 [f2fs-dev] [PATCH 0/8] Revert setting casefolding dentry operations through s_d_op Gabriel Krisman Bertazi
                   ` (3 preceding siblings ...)
  2023-12-13 23:40 ` [f2fs-dev] [PATCH 4/8] libfs: Expose generic_ci_dentry_ops outside of libfs Gabriel Krisman Bertazi
@ 2023-12-13 23:40 ` Gabriel Krisman Bertazi
  2023-12-14 12:29   ` kernel test robot
  2023-12-13 23:40 ` [f2fs-dev] [PATCH 6/8] f2fs: " Gabriel Krisman Bertazi
                   ` (2 subsequent siblings)
  7 siblings, 1 reply; 12+ messages in thread
From: Gabriel Krisman Bertazi @ 2023-12-13 23:40 UTC (permalink / raw)
  To: viro, ebiggers, jaegeuk, tytso
  Cc: linux-fsdevel, Gabriel Krisman Bertazi, linux-ext4,
	linux-f2fs-devel

All dentries in a case-insensitive filesystem have the same set of
dentry operations.  Therefore, we should let VFS propagate them from
sb->s_d_op d_alloc instead of setting at lookup time.

This was already the case before commit bb9cd9106b22 ("fscrypt: Have
filesystems handle their d_ops"), but it was changed to set at
lookup-time to facilitate the integration with fscrypt.  But it's a
problem because dentries that don't get created through ->lookup() won't
have any visibility of the operations.  Let's revert to the previous
implementation.

Suggested-by: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: Gabriel Krisman Bertazi <krisman@suse.de>
---
 fs/ext4/namei.c | 6 +++++-
 fs/ext4/super.c | 3 +++
 2 files changed, 8 insertions(+), 1 deletion(-)

diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c
index d252935f9c8a..3c1208d5d85b 100644
--- a/fs/ext4/namei.c
+++ b/fs/ext4/namei.c
@@ -1762,7 +1762,11 @@ static struct buffer_head *ext4_lookup_entry(struct inode *dir,
 	struct buffer_head *bh;
 
 	err = ext4_fname_prepare_lookup(dir, dentry, &fname);
-	generic_set_encrypted_ci_d_ops(dentry);
+
+	/* Case-insensitive volumes set dentry ops through sb->s_d_op. */
+	if (!dir->i_sb->s_encoding)
+		generic_set_encrypted_ci_d_ops(dentry);
+
 	if (err == -ENOENT)
 		return NULL;
 	if (err)
diff --git a/fs/ext4/super.c b/fs/ext4/super.c
index c5fcf377ab1f..5ac1c9df9956 100644
--- a/fs/ext4/super.c
+++ b/fs/ext4/super.c
@@ -5493,6 +5493,9 @@ static int __ext4_fill_super(struct fs_context *fc, struct super_block *sb)
 		goto failed_mount4;
 	}
 
+	if (sb->s_encoding)
+		sb->s_d_op = &generic_ci_dentry_ops;
+
 	sb->s_root = d_make_root(root);
 	if (!sb->s_root) {
 		ext4_msg(sb, KERN_ERR, "get root dentry failed");
-- 
2.43.0



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

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [f2fs-dev] [PATCH 6/8] f2fs: Set the case-insensitive dentry operations through ->s_d_op
  2023-12-13 23:40 [f2fs-dev] [PATCH 0/8] Revert setting casefolding dentry operations through s_d_op Gabriel Krisman Bertazi
                   ` (4 preceding siblings ...)
  2023-12-13 23:40 ` [f2fs-dev] [PATCH 5/8] ext4: Set the case-insensitive dentry operations through ->s_d_op Gabriel Krisman Bertazi
@ 2023-12-13 23:40 ` Gabriel Krisman Bertazi
  2023-12-14 15:01   ` kernel test robot
  2023-12-13 23:40 ` [f2fs-dev] [PATCH 7/8] libfs: Don't support setting casefold operations during lookup Gabriel Krisman Bertazi
  2023-12-13 23:40 ` [f2fs-dev] [PATCH 8/8] fscrypt: Move d_revalidate configuration back into fscrypt Gabriel Krisman Bertazi
  7 siblings, 1 reply; 12+ messages in thread
From: Gabriel Krisman Bertazi @ 2023-12-13 23:40 UTC (permalink / raw)
  To: viro, ebiggers, jaegeuk, tytso
  Cc: linux-fsdevel, Gabriel Krisman Bertazi, linux-ext4,
	linux-f2fs-devel

All dentries in a case-insensitive filesystem have the same set of
dentry operations.  Therefore, we should let VFS propagate them from
sb->s_d_op d_alloc instead of setting at lookup time.

This was already the case before commit bb9cd9106b22 ("fscrypt: Have
filesystems handle their d_ops"), but it was changed to set at
lookup-time to facilitate the integration with fscrypt.  But it's a
problem because dentries that don't get created through ->lookup() won't
have any visibility of the operations.  Let's revert to the previous
implementation.

Suggested-by: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: Gabriel Krisman Bertazi <krisman@suse.de>
---
 fs/f2fs/namei.c | 6 +++++-
 fs/f2fs/super.c | 3 +++
 2 files changed, 8 insertions(+), 1 deletion(-)

diff --git a/fs/f2fs/namei.c b/fs/f2fs/namei.c
index d0053b0284d8..4053846e2cd3 100644
--- a/fs/f2fs/namei.c
+++ b/fs/f2fs/namei.c
@@ -532,7 +532,11 @@ static struct dentry *f2fs_lookup(struct inode *dir, struct dentry *dentry,
 	}
 
 	err = f2fs_prepare_lookup(dir, dentry, &fname);
-	generic_set_encrypted_ci_d_ops(dentry);
+
+	/* Case-insensitive volumes set dentry ops through sb->s_d_op. */
+	if (!dir->i_sb->s_encoding)
+		generic_set_encrypted_ci_d_ops(dentry);
+
 	if (err == -ENOENT)
 		goto out_splice;
 	if (err)
diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c
index 033af907c3b1..0a199eb5b01e 100644
--- a/fs/f2fs/super.c
+++ b/fs/f2fs/super.c
@@ -4663,6 +4663,9 @@ static int f2fs_fill_super(struct super_block *sb, void *data, int silent)
 		goto free_node_inode;
 	}
 
+	if (sb->s_encoding)
+		sb->s_d_op = &generic_ci_dentry_ops;
+
 	sb->s_root = d_make_root(root); /* allocate root dentry */
 	if (!sb->s_root) {
 		err = -ENOMEM;
-- 
2.43.0



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

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [f2fs-dev] [PATCH 7/8] libfs: Don't support setting casefold operations during lookup
  2023-12-13 23:40 [f2fs-dev] [PATCH 0/8] Revert setting casefolding dentry operations through s_d_op Gabriel Krisman Bertazi
                   ` (5 preceding siblings ...)
  2023-12-13 23:40 ` [f2fs-dev] [PATCH 6/8] f2fs: " Gabriel Krisman Bertazi
@ 2023-12-13 23:40 ` Gabriel Krisman Bertazi
  2023-12-13 23:40 ` [f2fs-dev] [PATCH 8/8] fscrypt: Move d_revalidate configuration back into fscrypt Gabriel Krisman Bertazi
  7 siblings, 0 replies; 12+ messages in thread
From: Gabriel Krisman Bertazi @ 2023-12-13 23:40 UTC (permalink / raw)
  To: viro, ebiggers, jaegeuk, tytso
  Cc: linux-fsdevel, Gabriel Krisman Bertazi, linux-ext4,
	linux-f2fs-devel

No filesystems depend on it anymore, and it is generally a bad idea.
Since all dentries should have the same set of dentry operations in
case-insensitive filesystems, it should be configured through ->s_d_op.

Signed-off-by: Gabriel Krisman Bertazi <krisman@suse.de>
---
 fs/libfs.c | 15 ---------------
 1 file changed, 15 deletions(-)

diff --git a/fs/libfs.c b/fs/libfs.c
index b8ecada3a5b2..41c02c003265 100644
--- a/fs/libfs.c
+++ b/fs/libfs.c
@@ -1784,27 +1784,12 @@ static const struct dentry_operations generic_encrypted_dentry_ops = {
  * generic_set_encrypted_ci_d_ops - helper for setting d_ops for given dentry
  * @dentry:	dentry to set ops on
  *
- * Casefolded directories need d_hash and d_compare set, so that the dentries
- * contained in them are handled case-insensitively.  Note that these operations
- * are needed on the parent directory rather than on the dentries in it, and
- * while the casefolding flag can be toggled on and off on an empty directory,
- * dentry_operations can't be changed later.  As a result, if the filesystem has
- * casefolding support enabled at all, we have to give all dentries the
- * casefolding operations even if their inode doesn't have the casefolding flag
- * currently (and thus the casefolding ops would be no-ops for now).
- *
  * Encryption works differently in that the only dentry operation it needs is
  * d_revalidate, which it only needs on dentries that have the no-key name flag.
  * The no-key flag can't be set "later", so we don't have to worry about that.
  */
 void generic_set_encrypted_ci_d_ops(struct dentry *dentry)
 {
-#if IS_ENABLED(CONFIG_UNICODE)
-	if (dentry->d_sb->s_encoding) {
-		d_set_d_op(dentry, &generic_ci_dentry_ops);
-		return;
-	}
-#endif
 #ifdef CONFIG_FS_ENCRYPTION
 	if (dentry->d_flags & DCACHE_NOKEY_NAME) {
 		d_set_d_op(dentry, &generic_encrypted_dentry_ops);
-- 
2.43.0



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

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [f2fs-dev] [PATCH 8/8] fscrypt: Move d_revalidate configuration back into fscrypt
  2023-12-13 23:40 [f2fs-dev] [PATCH 0/8] Revert setting casefolding dentry operations through s_d_op Gabriel Krisman Bertazi
                   ` (6 preceding siblings ...)
  2023-12-13 23:40 ` [f2fs-dev] [PATCH 7/8] libfs: Don't support setting casefold operations during lookup Gabriel Krisman Bertazi
@ 2023-12-13 23:40 ` Gabriel Krisman Bertazi
  2023-12-14 14:51   ` kernel test robot
  7 siblings, 1 reply; 12+ messages in thread
From: Gabriel Krisman Bertazi @ 2023-12-13 23:40 UTC (permalink / raw)
  To: viro, ebiggers, jaegeuk, tytso
  Cc: linux-fsdevel, Gabriel Krisman Bertazi, linux-ext4,
	linux-f2fs-devel

This partially reverts commit bb9cd9106b22 ("fscrypt: Have filesystems
handle their d_ops"), which moved this handler out of fscrypt and into
the filesystems, in preparation to support casefold and fscrypt
combinations.  Now that we set casefolding operations through
->s_d_op, move this back into fscrypt, where it belongs, but take care
to handle filesystems that set their own sb->s_d_op.

Signed-off-by: Gabriel Krisman Bertazi <krisman@suse.de>
---
 fs/crypto/hooks.c       |  8 ++++++++
 fs/ext4/namei.c         |  5 -----
 fs/f2fs/namei.c         |  5 -----
 fs/libfs.c              | 19 -------------------
 fs/ubifs/dir.c          |  1 -
 include/linux/fs.h      |  1 -
 include/linux/fscrypt.h | 10 +++++-----
 7 files changed, 13 insertions(+), 36 deletions(-)

diff --git a/fs/crypto/hooks.c b/fs/crypto/hooks.c
index 52504dd478d3..166837d5af29 100644
--- a/fs/crypto/hooks.c
+++ b/fs/crypto/hooks.c
@@ -94,6 +94,10 @@ int __fscrypt_prepare_rename(struct inode *old_dir, struct dentry *old_dentry,
 }
 EXPORT_SYMBOL_GPL(__fscrypt_prepare_rename);
 
+static const struct dentry_operations fscrypt_dentry_ops = {
+	.d_revalidate = fscrypt_d_revalidate,
+};
+
 int __fscrypt_prepare_lookup(struct inode *dir, struct dentry *dentry,
 			     struct fscrypt_name *fname)
 {
@@ -106,6 +110,10 @@ int __fscrypt_prepare_lookup(struct inode *dir, struct dentry *dentry,
 		spin_lock(&dentry->d_lock);
 		dentry->d_flags |= DCACHE_NOKEY_NAME;
 		spin_unlock(&dentry->d_lock);
+
+		/* Give preference to the filesystem hooks, if any. */
+		if (!dentry->d_op)
+			d_set_d_op(dentry, &fscrypt_dentry_ops);
 	}
 	return err;
 }
diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c
index 3c1208d5d85b..3f0b853a371e 100644
--- a/fs/ext4/namei.c
+++ b/fs/ext4/namei.c
@@ -1762,11 +1762,6 @@ static struct buffer_head *ext4_lookup_entry(struct inode *dir,
 	struct buffer_head *bh;
 
 	err = ext4_fname_prepare_lookup(dir, dentry, &fname);
-
-	/* Case-insensitive volumes set dentry ops through sb->s_d_op. */
-	if (!dir->i_sb->s_encoding)
-		generic_set_encrypted_ci_d_ops(dentry);
-
 	if (err == -ENOENT)
 		return NULL;
 	if (err)
diff --git a/fs/f2fs/namei.c b/fs/f2fs/namei.c
index 4053846e2cd3..b40c6c393bd6 100644
--- a/fs/f2fs/namei.c
+++ b/fs/f2fs/namei.c
@@ -532,11 +532,6 @@ static struct dentry *f2fs_lookup(struct inode *dir, struct dentry *dentry,
 	}
 
 	err = f2fs_prepare_lookup(dir, dentry, &fname);
-
-	/* Case-insensitive volumes set dentry ops through sb->s_d_op. */
-	if (!dir->i_sb->s_encoding)
-		generic_set_encrypted_ci_d_ops(dentry);
-
 	if (err == -ENOENT)
 		goto out_splice;
 	if (err)
diff --git a/fs/libfs.c b/fs/libfs.c
index 41c02c003265..4fed170dfe49 100644
--- a/fs/libfs.c
+++ b/fs/libfs.c
@@ -1780,25 +1780,6 @@ static const struct dentry_operations generic_encrypted_dentry_ops = {
 };
 #endif
 
-/**
- * generic_set_encrypted_ci_d_ops - helper for setting d_ops for given dentry
- * @dentry:	dentry to set ops on
- *
- * Encryption works differently in that the only dentry operation it needs is
- * d_revalidate, which it only needs on dentries that have the no-key name flag.
- * The no-key flag can't be set "later", so we don't have to worry about that.
- */
-void generic_set_encrypted_ci_d_ops(struct dentry *dentry)
-{
-#ifdef CONFIG_FS_ENCRYPTION
-	if (dentry->d_flags & DCACHE_NOKEY_NAME) {
-		d_set_d_op(dentry, &generic_encrypted_dentry_ops);
-		return;
-	}
-#endif
-}
-EXPORT_SYMBOL(generic_set_encrypted_ci_d_ops);
-
 /**
  * inode_maybe_inc_iversion - increments i_version
  * @inode: inode with the i_version that should be updated
diff --git a/fs/ubifs/dir.c b/fs/ubifs/dir.c
index 3b13c648d490..51b9a10a9851 100644
--- a/fs/ubifs/dir.c
+++ b/fs/ubifs/dir.c
@@ -205,7 +205,6 @@ static struct dentry *ubifs_lookup(struct inode *dir, struct dentry *dentry,
 	dbg_gen("'%pd' in dir ino %lu", dentry, dir->i_ino);
 
 	err = fscrypt_prepare_lookup(dir, dentry, &nm);
-	generic_set_encrypted_ci_d_ops(dentry);
 	if (err == -ENOENT)
 		return d_splice_alias(NULL, dentry);
 	if (err)
diff --git a/include/linux/fs.h b/include/linux/fs.h
index 887a27d07f96..e5ae21f9f637 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -3201,7 +3201,6 @@ extern int generic_file_fsync(struct file *, loff_t, loff_t, int);
 
 extern int generic_check_addressable(unsigned, u64);
 
-extern void generic_set_encrypted_ci_d_ops(struct dentry *dentry);
 extern const struct dentry_operations generic_ci_dentry_ops;
 
 int may_setattr(struct mnt_idmap *idmap, struct inode *inode,
diff --git a/include/linux/fscrypt.h b/include/linux/fscrypt.h
index 12f9e455d569..97a11280c2bd 100644
--- a/include/linux/fscrypt.h
+++ b/include/linux/fscrypt.h
@@ -961,11 +961,11 @@ static inline int fscrypt_prepare_rename(struct inode *old_dir,
  * key is available, then the lookup is assumed to be by plaintext name;
  * otherwise, it is assumed to be by no-key name.
  *
- * This will set DCACHE_NOKEY_NAME on the dentry if the lookup is by no-key
- * name.  In this case the filesystem must assign the dentry a dentry_operations
- * which contains fscrypt_d_revalidate (or contains a d_revalidate method that
- * calls fscrypt_d_revalidate), so that the dentry will be invalidated if the
- * directory's encryption key is later added.
+ * This also optionally installs a custom ->d_revalidate() method which will
+ * invalidate the dentry if it was created without the key and the key is later
+ * added.  If the filesystem provides its own ->d_op hooks, they will be used
+ * instead, but then the filesystem must make sure to call fscrypt_d_revalidate
+ * in its d_revalidate hook, to check if fscrypt considers the dentry stale.
  *
  * Return: 0 on success; -ENOENT if the directory's key is unavailable but the
  * filename isn't a valid no-key name, so a negative dentry should be created;
-- 
2.43.0



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

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* Re: [f2fs-dev] [PATCH 5/8] ext4: Set the case-insensitive dentry operations through ->s_d_op
  2023-12-13 23:40 ` [f2fs-dev] [PATCH 5/8] ext4: Set the case-insensitive dentry operations through ->s_d_op Gabriel Krisman Bertazi
@ 2023-12-14 12:29   ` kernel test robot
  0 siblings, 0 replies; 12+ messages in thread
From: kernel test robot @ 2023-12-14 12:29 UTC (permalink / raw)
  To: Gabriel Krisman Bertazi, viro, ebiggers, jaegeuk, tytso
  Cc: linux-fsdevel, linux-ext4, linux-f2fs-devel,
	Gabriel Krisman Bertazi, oe-kbuild-all

Hi Gabriel,

kernel test robot noticed the following build errors:

[auto build test ERROR on jaegeuk-f2fs/dev-test]
[also build test ERROR on jaegeuk-f2fs/dev tytso-ext4/dev linus/master v6.7-rc5 next-20231214]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Gabriel-Krisman-Bertazi/dcache-Add-helper-to-disable-d_revalidate-for-a-specific-dentry/20231214-074322
base:   https://git.kernel.org/pub/scm/linux/kernel/git/jaegeuk/f2fs.git dev-test
patch link:    https://lore.kernel.org/r/20231213234031.1081-6-krisman%40suse.de
patch subject: [PATCH 5/8] ext4: Set the case-insensitive dentry operations through ->s_d_op
config: arc-vdk_hs38_defconfig (https://download.01.org/0day-ci/archive/20231214/202312142039.u2475qPS-lkp@intel.com/config)
compiler: arc-elf-gcc (GCC) 13.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20231214/202312142039.u2475qPS-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202312142039.u2475qPS-lkp@intel.com/

All errors (new ones prefixed by >>):

   fs/ext4/super.c: In function '__ext4_fill_super':
>> fs/ext4/super.c:5496:15: error: 'struct super_block' has no member named 's_encoding'
    5496 |         if (sb->s_encoding)
         |               ^~


vim +5496 fs/ext4/super.c

  5215	
  5216	static int __ext4_fill_super(struct fs_context *fc, struct super_block *sb)
  5217	{
  5218		struct ext4_super_block *es = NULL;
  5219		struct ext4_sb_info *sbi = EXT4_SB(sb);
  5220		ext4_fsblk_t logical_sb_block;
  5221		struct inode *root;
  5222		int needs_recovery;
  5223		int err;
  5224		ext4_group_t first_not_zeroed;
  5225		struct ext4_fs_context *ctx = fc->fs_private;
  5226		int silent = fc->sb_flags & SB_SILENT;
  5227	
  5228		/* Set defaults for the variables that will be set during parsing */
  5229		if (!(ctx->spec & EXT4_SPEC_JOURNAL_IOPRIO))
  5230			ctx->journal_ioprio = DEFAULT_JOURNAL_IOPRIO;
  5231	
  5232		sbi->s_inode_readahead_blks = EXT4_DEF_INODE_READAHEAD_BLKS;
  5233		sbi->s_sectors_written_start =
  5234			part_stat_read(sb->s_bdev, sectors[STAT_WRITE]);
  5235	
  5236		err = ext4_load_super(sb, &logical_sb_block, silent);
  5237		if (err)
  5238			goto out_fail;
  5239	
  5240		es = sbi->s_es;
  5241		sbi->s_kbytes_written = le64_to_cpu(es->s_kbytes_written);
  5242	
  5243		err = ext4_init_metadata_csum(sb, es);
  5244		if (err)
  5245			goto failed_mount;
  5246	
  5247		ext4_set_def_opts(sb, es);
  5248	
  5249		sbi->s_resuid = make_kuid(&init_user_ns, le16_to_cpu(es->s_def_resuid));
  5250		sbi->s_resgid = make_kgid(&init_user_ns, le16_to_cpu(es->s_def_resgid));
  5251		sbi->s_commit_interval = JBD2_DEFAULT_MAX_COMMIT_AGE * HZ;
  5252		sbi->s_min_batch_time = EXT4_DEF_MIN_BATCH_TIME;
  5253		sbi->s_max_batch_time = EXT4_DEF_MAX_BATCH_TIME;
  5254	
  5255		/*
  5256		 * set default s_li_wait_mult for lazyinit, for the case there is
  5257		 * no mount option specified.
  5258		 */
  5259		sbi->s_li_wait_mult = EXT4_DEF_LI_WAIT_MULT;
  5260	
  5261		err = ext4_inode_info_init(sb, es);
  5262		if (err)
  5263			goto failed_mount;
  5264	
  5265		err = parse_apply_sb_mount_options(sb, ctx);
  5266		if (err < 0)
  5267			goto failed_mount;
  5268	
  5269		sbi->s_def_mount_opt = sbi->s_mount_opt;
  5270		sbi->s_def_mount_opt2 = sbi->s_mount_opt2;
  5271	
  5272		err = ext4_check_opt_consistency(fc, sb);
  5273		if (err < 0)
  5274			goto failed_mount;
  5275	
  5276		ext4_apply_options(fc, sb);
  5277	
  5278		err = ext4_encoding_init(sb, es);
  5279		if (err)
  5280			goto failed_mount;
  5281	
  5282		err = ext4_check_journal_data_mode(sb);
  5283		if (err)
  5284			goto failed_mount;
  5285	
  5286		sb->s_flags = (sb->s_flags & ~SB_POSIXACL) |
  5287			(test_opt(sb, POSIX_ACL) ? SB_POSIXACL : 0);
  5288	
  5289		/* i_version is always enabled now */
  5290		sb->s_flags |= SB_I_VERSION;
  5291	
  5292		err = ext4_check_feature_compatibility(sb, es, silent);
  5293		if (err)
  5294			goto failed_mount;
  5295	
  5296		err = ext4_block_group_meta_init(sb, silent);
  5297		if (err)
  5298			goto failed_mount;
  5299	
  5300		ext4_hash_info_init(sb);
  5301	
  5302		err = ext4_handle_clustersize(sb);
  5303		if (err)
  5304			goto failed_mount;
  5305	
  5306		err = ext4_check_geometry(sb, es);
  5307		if (err)
  5308			goto failed_mount;
  5309	
  5310		timer_setup(&sbi->s_err_report, print_daily_error_info, 0);
  5311		spin_lock_init(&sbi->s_error_lock);
  5312		INIT_WORK(&sbi->s_sb_upd_work, update_super_work);
  5313	
  5314		err = ext4_group_desc_init(sb, es, logical_sb_block, &first_not_zeroed);
  5315		if (err)
  5316			goto failed_mount3;
  5317	
  5318		err = ext4_es_register_shrinker(sbi);
  5319		if (err)
  5320			goto failed_mount3;
  5321	
  5322		sbi->s_stripe = ext4_get_stripe_size(sbi);
  5323		/*
  5324		 * It's hard to get stripe aligned blocks if stripe is not aligned with
  5325		 * cluster, just disable stripe and alert user to simpfy code and avoid
  5326		 * stripe aligned allocation which will rarely successes.
  5327		 */
  5328		if (sbi->s_stripe > 0 && sbi->s_cluster_ratio > 1 &&
  5329		    sbi->s_stripe % sbi->s_cluster_ratio != 0) {
  5330			ext4_msg(sb, KERN_WARNING,
  5331				 "stripe (%lu) is not aligned with cluster size (%u), "
  5332				 "stripe is disabled",
  5333				 sbi->s_stripe, sbi->s_cluster_ratio);
  5334			sbi->s_stripe = 0;
  5335		}
  5336		sbi->s_extent_max_zeroout_kb = 32;
  5337	
  5338		/*
  5339		 * set up enough so that it can read an inode
  5340		 */
  5341		sb->s_op = &ext4_sops;
  5342		sb->s_export_op = &ext4_export_ops;
  5343		sb->s_xattr = ext4_xattr_handlers;
  5344	#ifdef CONFIG_FS_ENCRYPTION
  5345		sb->s_cop = &ext4_cryptops;
  5346	#endif
  5347	#ifdef CONFIG_FS_VERITY
  5348		sb->s_vop = &ext4_verityops;
  5349	#endif
  5350	#ifdef CONFIG_QUOTA
  5351		sb->dq_op = &ext4_quota_operations;
  5352		if (ext4_has_feature_quota(sb))
  5353			sb->s_qcop = &dquot_quotactl_sysfile_ops;
  5354		else
  5355			sb->s_qcop = &ext4_qctl_operations;
  5356		sb->s_quota_types = QTYPE_MASK_USR | QTYPE_MASK_GRP | QTYPE_MASK_PRJ;
  5357	#endif
  5358		memcpy(&sb->s_uuid, es->s_uuid, sizeof(es->s_uuid));
  5359	
  5360		INIT_LIST_HEAD(&sbi->s_orphan); /* unlinked but open files */
  5361		mutex_init(&sbi->s_orphan_lock);
  5362	
  5363		ext4_fast_commit_init(sb);
  5364	
  5365		sb->s_root = NULL;
  5366	
  5367		needs_recovery = (es->s_last_orphan != 0 ||
  5368				  ext4_has_feature_orphan_present(sb) ||
  5369				  ext4_has_feature_journal_needs_recovery(sb));
  5370	
  5371		if (ext4_has_feature_mmp(sb) && !sb_rdonly(sb)) {
  5372			err = ext4_multi_mount_protect(sb, le64_to_cpu(es->s_mmp_block));
  5373			if (err)
  5374				goto failed_mount3a;
  5375		}
  5376	
  5377		err = -EINVAL;
  5378		/*
  5379		 * The first inode we look at is the journal inode.  Don't try
  5380		 * root first: it may be modified in the journal!
  5381		 */
  5382		if (!test_opt(sb, NOLOAD) && ext4_has_feature_journal(sb)) {
  5383			err = ext4_load_and_init_journal(sb, es, ctx);
  5384			if (err)
  5385				goto failed_mount3a;
  5386		} else if (test_opt(sb, NOLOAD) && !sb_rdonly(sb) &&
  5387			   ext4_has_feature_journal_needs_recovery(sb)) {
  5388			ext4_msg(sb, KERN_ERR, "required journal recovery "
  5389			       "suppressed and not mounted read-only");
  5390			goto failed_mount3a;
  5391		} else {
  5392			/* Nojournal mode, all journal mount options are illegal */
  5393			if (test_opt(sb, JOURNAL_ASYNC_COMMIT)) {
  5394				ext4_msg(sb, KERN_ERR, "can't mount with "
  5395					 "journal_async_commit, fs mounted w/o journal");
  5396				goto failed_mount3a;
  5397			}
  5398	
  5399			if (test_opt2(sb, EXPLICIT_JOURNAL_CHECKSUM)) {
  5400				ext4_msg(sb, KERN_ERR, "can't mount with "
  5401					 "journal_checksum, fs mounted w/o journal");
  5402				goto failed_mount3a;
  5403			}
  5404			if (sbi->s_commit_interval != JBD2_DEFAULT_MAX_COMMIT_AGE*HZ) {
  5405				ext4_msg(sb, KERN_ERR, "can't mount with "
  5406					 "commit=%lu, fs mounted w/o journal",
  5407					 sbi->s_commit_interval / HZ);
  5408				goto failed_mount3a;
  5409			}
  5410			if (EXT4_MOUNT_DATA_FLAGS &
  5411			    (sbi->s_mount_opt ^ sbi->s_def_mount_opt)) {
  5412				ext4_msg(sb, KERN_ERR, "can't mount with "
  5413					 "data=, fs mounted w/o journal");
  5414				goto failed_mount3a;
  5415			}
  5416			sbi->s_def_mount_opt &= ~EXT4_MOUNT_JOURNAL_CHECKSUM;
  5417			clear_opt(sb, JOURNAL_CHECKSUM);
  5418			clear_opt(sb, DATA_FLAGS);
  5419			clear_opt2(sb, JOURNAL_FAST_COMMIT);
  5420			sbi->s_journal = NULL;
  5421			needs_recovery = 0;
  5422		}
  5423	
  5424		if (!test_opt(sb, NO_MBCACHE)) {
  5425			sbi->s_ea_block_cache = ext4_xattr_create_cache();
  5426			if (!sbi->s_ea_block_cache) {
  5427				ext4_msg(sb, KERN_ERR,
  5428					 "Failed to create ea_block_cache");
  5429				err = -EINVAL;
  5430				goto failed_mount_wq;
  5431			}
  5432	
  5433			if (ext4_has_feature_ea_inode(sb)) {
  5434				sbi->s_ea_inode_cache = ext4_xattr_create_cache();
  5435				if (!sbi->s_ea_inode_cache) {
  5436					ext4_msg(sb, KERN_ERR,
  5437						 "Failed to create ea_inode_cache");
  5438					err = -EINVAL;
  5439					goto failed_mount_wq;
  5440				}
  5441			}
  5442		}
  5443	
  5444		/*
  5445		 * Get the # of file system overhead blocks from the
  5446		 * superblock if present.
  5447		 */
  5448		sbi->s_overhead = le32_to_cpu(es->s_overhead_clusters);
  5449		/* ignore the precalculated value if it is ridiculous */
  5450		if (sbi->s_overhead > ext4_blocks_count(es))
  5451			sbi->s_overhead = 0;
  5452		/*
  5453		 * If the bigalloc feature is not enabled recalculating the
  5454		 * overhead doesn't take long, so we might as well just redo
  5455		 * it to make sure we are using the correct value.
  5456		 */
  5457		if (!ext4_has_feature_bigalloc(sb))
  5458			sbi->s_overhead = 0;
  5459		if (sbi->s_overhead == 0) {
  5460			err = ext4_calculate_overhead(sb);
  5461			if (err)
  5462				goto failed_mount_wq;
  5463		}
  5464	
  5465		/*
  5466		 * The maximum number of concurrent works can be high and
  5467		 * concurrency isn't really necessary.  Limit it to 1.
  5468		 */
  5469		EXT4_SB(sb)->rsv_conversion_wq =
  5470			alloc_workqueue("ext4-rsv-conversion", WQ_MEM_RECLAIM | WQ_UNBOUND, 1);
  5471		if (!EXT4_SB(sb)->rsv_conversion_wq) {
  5472			printk(KERN_ERR "EXT4-fs: failed to create workqueue\n");
  5473			err = -ENOMEM;
  5474			goto failed_mount4;
  5475		}
  5476	
  5477		/*
  5478		 * The jbd2_journal_load will have done any necessary log recovery,
  5479		 * so we can safely mount the rest of the filesystem now.
  5480		 */
  5481	
  5482		root = ext4_iget(sb, EXT4_ROOT_INO, EXT4_IGET_SPECIAL);
  5483		if (IS_ERR(root)) {
  5484			ext4_msg(sb, KERN_ERR, "get root inode failed");
  5485			err = PTR_ERR(root);
  5486			root = NULL;
  5487			goto failed_mount4;
  5488		}
  5489		if (!S_ISDIR(root->i_mode) || !root->i_blocks || !root->i_size) {
  5490			ext4_msg(sb, KERN_ERR, "corrupt root inode, run e2fsck");
  5491			iput(root);
  5492			err = -EFSCORRUPTED;
  5493			goto failed_mount4;
  5494		}
  5495	
> 5496		if (sb->s_encoding)
  5497			sb->s_d_op = &generic_ci_dentry_ops;
  5498	
  5499		sb->s_root = d_make_root(root);
  5500		if (!sb->s_root) {
  5501			ext4_msg(sb, KERN_ERR, "get root dentry failed");
  5502			err = -ENOMEM;
  5503			goto failed_mount4;
  5504		}
  5505	
  5506		err = ext4_setup_super(sb, es, sb_rdonly(sb));
  5507		if (err == -EROFS) {
  5508			sb->s_flags |= SB_RDONLY;
  5509		} else if (err)
  5510			goto failed_mount4a;
  5511	
  5512		ext4_set_resv_clusters(sb);
  5513	
  5514		if (test_opt(sb, BLOCK_VALIDITY)) {
  5515			err = ext4_setup_system_zone(sb);
  5516			if (err) {
  5517				ext4_msg(sb, KERN_ERR, "failed to initialize system "
  5518					 "zone (%d)", err);
  5519				goto failed_mount4a;
  5520			}
  5521		}
  5522		ext4_fc_replay_cleanup(sb);
  5523	
  5524		ext4_ext_init(sb);
  5525	
  5526		/*
  5527		 * Enable optimize_scan if number of groups is > threshold. This can be
  5528		 * turned off by passing "mb_optimize_scan=0". This can also be
  5529		 * turned on forcefully by passing "mb_optimize_scan=1".
  5530		 */
  5531		if (!(ctx->spec & EXT4_SPEC_mb_optimize_scan)) {
  5532			if (sbi->s_groups_count >= MB_DEFAULT_LINEAR_SCAN_THRESHOLD)
  5533				set_opt2(sb, MB_OPTIMIZE_SCAN);
  5534			else
  5535				clear_opt2(sb, MB_OPTIMIZE_SCAN);
  5536		}
  5537	
  5538		err = ext4_mb_init(sb);
  5539		if (err) {
  5540			ext4_msg(sb, KERN_ERR, "failed to initialize mballoc (%d)",
  5541				 err);
  5542			goto failed_mount5;
  5543		}
  5544	
  5545		/*
  5546		 * We can only set up the journal commit callback once
  5547		 * mballoc is initialized
  5548		 */
  5549		if (sbi->s_journal)
  5550			sbi->s_journal->j_commit_callback =
  5551				ext4_journal_commit_callback;
  5552	
  5553		err = ext4_percpu_param_init(sbi);
  5554		if (err)
  5555			goto failed_mount6;
  5556	
  5557		if (ext4_has_feature_flex_bg(sb))
  5558			if (!ext4_fill_flex_info(sb)) {
  5559				ext4_msg(sb, KERN_ERR,
  5560				       "unable to initialize "
  5561				       "flex_bg meta info!");
  5562				err = -ENOMEM;
  5563				goto failed_mount6;
  5564			}
  5565	
  5566		err = ext4_register_li_request(sb, first_not_zeroed);
  5567		if (err)
  5568			goto failed_mount6;
  5569	
  5570		err = ext4_register_sysfs(sb);
  5571		if (err)
  5572			goto failed_mount7;
  5573	
  5574		err = ext4_init_orphan_info(sb);
  5575		if (err)
  5576			goto failed_mount8;
  5577	#ifdef CONFIG_QUOTA
  5578		/* Enable quota usage during mount. */
  5579		if (ext4_has_feature_quota(sb) && !sb_rdonly(sb)) {
  5580			err = ext4_enable_quotas(sb);
  5581			if (err)
  5582				goto failed_mount9;
  5583		}
  5584	#endif  /* CONFIG_QUOTA */
  5585	
  5586		/*
  5587		 * Save the original bdev mapping's wb_err value which could be
  5588		 * used to detect the metadata async write error.
  5589		 */
  5590		spin_lock_init(&sbi->s_bdev_wb_lock);
  5591		errseq_check_and_advance(&sb->s_bdev->bd_inode->i_mapping->wb_err,
  5592					 &sbi->s_bdev_wb_err);
  5593		EXT4_SB(sb)->s_mount_state |= EXT4_ORPHAN_FS;
  5594		ext4_orphan_cleanup(sb, es);
  5595		EXT4_SB(sb)->s_mount_state &= ~EXT4_ORPHAN_FS;
  5596		/*
  5597		 * Update the checksum after updating free space/inode counters and
  5598		 * ext4_orphan_cleanup. Otherwise the superblock can have an incorrect
  5599		 * checksum in the buffer cache until it is written out and
  5600		 * e2fsprogs programs trying to open a file system immediately
  5601		 * after it is mounted can fail.
  5602		 */
  5603		ext4_superblock_csum_set(sb);
  5604		if (needs_recovery) {
  5605			ext4_msg(sb, KERN_INFO, "recovery complete");
  5606			err = ext4_mark_recovery_complete(sb, es);
  5607			if (err)
  5608				goto failed_mount10;
  5609		}
  5610	
  5611		if (test_opt(sb, DISCARD) && !bdev_max_discard_sectors(sb->s_bdev))
  5612			ext4_msg(sb, KERN_WARNING,
  5613				 "mounting with \"discard\" option, but the device does not support discard");
  5614	
  5615		if (es->s_error_count)
  5616			mod_timer(&sbi->s_err_report, jiffies + 300*HZ); /* 5 minutes */
  5617	
  5618		/* Enable message ratelimiting. Default is 10 messages per 5 secs. */
  5619		ratelimit_state_init(&sbi->s_err_ratelimit_state, 5 * HZ, 10);
  5620		ratelimit_state_init(&sbi->s_warning_ratelimit_state, 5 * HZ, 10);
  5621		ratelimit_state_init(&sbi->s_msg_ratelimit_state, 5 * HZ, 10);
  5622		atomic_set(&sbi->s_warning_count, 0);
  5623		atomic_set(&sbi->s_msg_count, 0);
  5624	
  5625		return 0;
  5626	
  5627	failed_mount10:
  5628		ext4_quotas_off(sb, EXT4_MAXQUOTAS);
  5629	failed_mount9: __maybe_unused
  5630		ext4_release_orphan_info(sb);
  5631	failed_mount8:
  5632		ext4_unregister_sysfs(sb);
  5633		kobject_put(&sbi->s_kobj);
  5634	failed_mount7:
  5635		ext4_unregister_li_request(sb);
  5636	failed_mount6:
  5637		ext4_mb_release(sb);
  5638		ext4_flex_groups_free(sbi);
  5639		ext4_percpu_param_destroy(sbi);
  5640	failed_mount5:
  5641		ext4_ext_release(sb);
  5642		ext4_release_system_zone(sb);
  5643	failed_mount4a:
  5644		dput(sb->s_root);
  5645		sb->s_root = NULL;
  5646	failed_mount4:
  5647		ext4_msg(sb, KERN_ERR, "mount failed");
  5648		if (EXT4_SB(sb)->rsv_conversion_wq)
  5649			destroy_workqueue(EXT4_SB(sb)->rsv_conversion_wq);
  5650	failed_mount_wq:
  5651		ext4_xattr_destroy_cache(sbi->s_ea_inode_cache);
  5652		sbi->s_ea_inode_cache = NULL;
  5653	
  5654		ext4_xattr_destroy_cache(sbi->s_ea_block_cache);
  5655		sbi->s_ea_block_cache = NULL;
  5656	
  5657		if (sbi->s_journal) {
  5658			/* flush s_sb_upd_work before journal destroy. */
  5659			flush_work(&sbi->s_sb_upd_work);
  5660			jbd2_journal_destroy(sbi->s_journal);
  5661			sbi->s_journal = NULL;
  5662		}
  5663	failed_mount3a:
  5664		ext4_es_unregister_shrinker(sbi);
  5665	failed_mount3:
  5666		/* flush s_sb_upd_work before sbi destroy */
  5667		flush_work(&sbi->s_sb_upd_work);
  5668		del_timer_sync(&sbi->s_err_report);
  5669		ext4_stop_mmpd(sbi);
  5670		ext4_group_desc_free(sbi);
  5671	failed_mount:
  5672		if (sbi->s_chksum_driver)
  5673			crypto_free_shash(sbi->s_chksum_driver);
  5674	

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki


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

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [f2fs-dev] [PATCH 8/8] fscrypt: Move d_revalidate configuration back into fscrypt
  2023-12-13 23:40 ` [f2fs-dev] [PATCH 8/8] fscrypt: Move d_revalidate configuration back into fscrypt Gabriel Krisman Bertazi
@ 2023-12-14 14:51   ` kernel test robot
  0 siblings, 0 replies; 12+ messages in thread
From: kernel test robot @ 2023-12-14 14:51 UTC (permalink / raw)
  To: Gabriel Krisman Bertazi, viro, ebiggers, jaegeuk, tytso
  Cc: linux-fsdevel, linux-ext4, linux-f2fs-devel,
	Gabriel Krisman Bertazi, oe-kbuild-all

Hi Gabriel,

kernel test robot noticed the following build warnings:

[auto build test WARNING on jaegeuk-f2fs/dev-test]
[also build test WARNING on jaegeuk-f2fs/dev tytso-ext4/dev linus/master v6.7-rc5 next-20231214]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Gabriel-Krisman-Bertazi/dcache-Add-helper-to-disable-d_revalidate-for-a-specific-dentry/20231214-074322
base:   https://git.kernel.org/pub/scm/linux/kernel/git/jaegeuk/f2fs.git dev-test
patch link:    https://lore.kernel.org/r/20231213234031.1081-9-krisman%40suse.de
patch subject: [PATCH 8/8] fscrypt: Move d_revalidate configuration back into fscrypt
config: x86_64-randconfig-123-20231214 (https://download.01.org/0day-ci/archive/20231214/202312142213.uyrNJniX-lkp@intel.com/config)
compiler: clang version 16.0.4 (https://github.com/llvm/llvm-project.git ae42196bc493ffe877a7e3dff8be32035dea4d07)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20231214/202312142213.uyrNJniX-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202312142213.uyrNJniX-lkp@intel.com/

All warnings (new ones prefixed by >>):

>> fs/libfs.c:1778:39: warning: unused variable 'generic_encrypted_dentry_ops' [-Wunused-const-variable]
   static const struct dentry_operations generic_encrypted_dentry_ops = {
                                         ^
   1 warning generated.


vim +/generic_encrypted_dentry_ops +1778 fs/libfs.c

608af703519a58 Daniel Rosenberg 2020-11-19  1776  
608af703519a58 Daniel Rosenberg 2020-11-19  1777  #ifdef CONFIG_FS_ENCRYPTION
608af703519a58 Daniel Rosenberg 2020-11-19 @1778  static const struct dentry_operations generic_encrypted_dentry_ops = {
608af703519a58 Daniel Rosenberg 2020-11-19  1779  	.d_revalidate = fscrypt_d_revalidate,
608af703519a58 Daniel Rosenberg 2020-11-19  1780  };
608af703519a58 Daniel Rosenberg 2020-11-19  1781  #endif
608af703519a58 Daniel Rosenberg 2020-11-19  1782  

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki


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

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [f2fs-dev] [PATCH 6/8] f2fs: Set the case-insensitive dentry operations through ->s_d_op
  2023-12-13 23:40 ` [f2fs-dev] [PATCH 6/8] f2fs: " Gabriel Krisman Bertazi
@ 2023-12-14 15:01   ` kernel test robot
  0 siblings, 0 replies; 12+ messages in thread
From: kernel test robot @ 2023-12-14 15:01 UTC (permalink / raw)
  To: Gabriel Krisman Bertazi, viro, ebiggers, jaegeuk, tytso
  Cc: linux-fsdevel, linux-ext4, linux-f2fs-devel,
	Gabriel Krisman Bertazi, oe-kbuild-all

Hi Gabriel,

kernel test robot noticed the following build errors:

[auto build test ERROR on jaegeuk-f2fs/dev-test]
[also build test ERROR on jaegeuk-f2fs/dev tytso-ext4/dev linus/master v6.7-rc5 next-20231214]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Gabriel-Krisman-Bertazi/dcache-Add-helper-to-disable-d_revalidate-for-a-specific-dentry/20231214-074322
base:   https://git.kernel.org/pub/scm/linux/kernel/git/jaegeuk/f2fs.git dev-test
patch link:    https://lore.kernel.org/r/20231213234031.1081-7-krisman%40suse.de
patch subject: [PATCH 6/8] f2fs: Set the case-insensitive dentry operations through ->s_d_op
config: x86_64-buildonly-randconfig-002-20231214 (https://download.01.org/0day-ci/archive/20231214/202312142238.71N8cNUB-lkp@intel.com/config)
compiler: gcc-12 (Debian 12.2.0-14) 12.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20231214/202312142238.71N8cNUB-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202312142238.71N8cNUB-lkp@intel.com/

All errors (new ones prefixed by >>):

   fs/f2fs/super.c: In function 'f2fs_fill_super':
>> fs/f2fs/super.c:4669:15: error: 'struct super_block' has no member named 's_encoding'
    4669 |         if (sb->s_encoding)
         |               ^~


vim +4669 fs/f2fs/super.c

  4491	
  4492		sb->s_op = &f2fs_sops;
  4493	#ifdef CONFIG_FS_ENCRYPTION
  4494		sb->s_cop = &f2fs_cryptops;
  4495	#endif
  4496	#ifdef CONFIG_FS_VERITY
  4497		sb->s_vop = &f2fs_verityops;
  4498	#endif
  4499		sb->s_xattr = f2fs_xattr_handlers;
  4500		sb->s_export_op = &f2fs_export_ops;
  4501		sb->s_magic = F2FS_SUPER_MAGIC;
  4502		sb->s_time_gran = 1;
  4503		sb->s_flags = (sb->s_flags & ~SB_POSIXACL) |
  4504			(test_opt(sbi, POSIX_ACL) ? SB_POSIXACL : 0);
  4505		memcpy(&sb->s_uuid, raw_super->uuid, sizeof(raw_super->uuid));
  4506		sb->s_iflags |= SB_I_CGROUPWB;
  4507	
  4508		/* init f2fs-specific super block info */
  4509		sbi->valid_super_block = valid_super_block;
  4510	
  4511		/* disallow all the data/node/meta page writes */
  4512		set_sbi_flag(sbi, SBI_POR_DOING);
  4513	
  4514		err = f2fs_init_write_merge_io(sbi);
  4515		if (err)
  4516			goto free_bio_info;
  4517	
  4518		init_sb_info(sbi);
  4519	
  4520		err = f2fs_init_iostat(sbi);
  4521		if (err)
  4522			goto free_bio_info;
  4523	
  4524		err = init_percpu_info(sbi);
  4525		if (err)
  4526			goto free_iostat;
  4527	
  4528		if (F2FS_IO_ALIGNED(sbi)) {
  4529			sbi->write_io_dummy =
  4530				mempool_create_page_pool(2 * (F2FS_IO_SIZE(sbi) - 1), 0);
  4531			if (!sbi->write_io_dummy) {
  4532				err = -ENOMEM;
  4533				goto free_percpu;
  4534			}
  4535		}
  4536	
  4537		/* init per sbi slab cache */
  4538		err = f2fs_init_xattr_caches(sbi);
  4539		if (err)
  4540			goto free_io_dummy;
  4541		err = f2fs_init_page_array_cache(sbi);
  4542		if (err)
  4543			goto free_xattr_cache;
  4544	
  4545		/* get an inode for meta space */
  4546		sbi->meta_inode = f2fs_iget(sb, F2FS_META_INO(sbi));
  4547		if (IS_ERR(sbi->meta_inode)) {
  4548			f2fs_err(sbi, "Failed to read F2FS meta data inode");
  4549			err = PTR_ERR(sbi->meta_inode);
  4550			goto free_page_array_cache;
  4551		}
  4552	
  4553		err = f2fs_get_valid_checkpoint(sbi);
  4554		if (err) {
  4555			f2fs_err(sbi, "Failed to get valid F2FS checkpoint");
  4556			goto free_meta_inode;
  4557		}
  4558	
  4559		if (__is_set_ckpt_flags(F2FS_CKPT(sbi), CP_QUOTA_NEED_FSCK_FLAG))
  4560			set_sbi_flag(sbi, SBI_QUOTA_NEED_REPAIR);
  4561		if (__is_set_ckpt_flags(F2FS_CKPT(sbi), CP_DISABLED_QUICK_FLAG)) {
  4562			set_sbi_flag(sbi, SBI_CP_DISABLED_QUICK);
  4563			sbi->interval_time[DISABLE_TIME] = DEF_DISABLE_QUICK_INTERVAL;
  4564		}
  4565	
  4566		if (__is_set_ckpt_flags(F2FS_CKPT(sbi), CP_FSCK_FLAG))
  4567			set_sbi_flag(sbi, SBI_NEED_FSCK);
  4568	
  4569		/* Initialize device list */
  4570		err = f2fs_scan_devices(sbi);
  4571		if (err) {
  4572			f2fs_err(sbi, "Failed to find devices");
  4573			goto free_devices;
  4574		}
  4575	
  4576		err = f2fs_init_post_read_wq(sbi);
  4577		if (err) {
  4578			f2fs_err(sbi, "Failed to initialize post read workqueue");
  4579			goto free_devices;
  4580		}
  4581	
  4582		sbi->total_valid_node_count =
  4583					le32_to_cpu(sbi->ckpt->valid_node_count);
  4584		percpu_counter_set(&sbi->total_valid_inode_count,
  4585					le32_to_cpu(sbi->ckpt->valid_inode_count));
  4586		sbi->user_block_count = le64_to_cpu(sbi->ckpt->user_block_count);
  4587		sbi->total_valid_block_count =
  4588					le64_to_cpu(sbi->ckpt->valid_block_count);
  4589		sbi->last_valid_block_count = sbi->total_valid_block_count;
  4590		sbi->reserved_blocks = 0;
  4591		sbi->current_reserved_blocks = 0;
  4592		limit_reserve_root(sbi);
  4593		adjust_unusable_cap_perc(sbi);
  4594	
  4595		f2fs_init_extent_cache_info(sbi);
  4596	
  4597		f2fs_init_ino_entry_info(sbi);
  4598	
  4599		f2fs_init_fsync_node_info(sbi);
  4600	
  4601		/* setup checkpoint request control and start checkpoint issue thread */
  4602		f2fs_init_ckpt_req_control(sbi);
  4603		if (!f2fs_readonly(sb) && !test_opt(sbi, DISABLE_CHECKPOINT) &&
  4604				test_opt(sbi, MERGE_CHECKPOINT)) {
  4605			err = f2fs_start_ckpt_thread(sbi);
  4606			if (err) {
  4607				f2fs_err(sbi,
  4608				    "Failed to start F2FS issue_checkpoint_thread (%d)",
  4609				    err);
  4610				goto stop_ckpt_thread;
  4611			}
  4612		}
  4613	
  4614		/* setup f2fs internal modules */
  4615		err = f2fs_build_segment_manager(sbi);
  4616		if (err) {
  4617			f2fs_err(sbi, "Failed to initialize F2FS segment manager (%d)",
  4618				 err);
  4619			goto free_sm;
  4620		}
  4621		err = f2fs_build_node_manager(sbi);
  4622		if (err) {
  4623			f2fs_err(sbi, "Failed to initialize F2FS node manager (%d)",
  4624				 err);
  4625			goto free_nm;
  4626		}
  4627	
  4628		err = adjust_reserved_segment(sbi);
  4629		if (err)
  4630			goto free_nm;
  4631	
  4632		/* For write statistics */
  4633		sbi->sectors_written_start = f2fs_get_sectors_written(sbi);
  4634	
  4635		/* Read accumulated write IO statistics if exists */
  4636		seg_i = CURSEG_I(sbi, CURSEG_HOT_NODE);
  4637		if (__exist_node_summaries(sbi))
  4638			sbi->kbytes_written =
  4639				le64_to_cpu(seg_i->journal->info.kbytes_written);
  4640	
  4641		f2fs_build_gc_manager(sbi);
  4642	
  4643		err = f2fs_build_stats(sbi);
  4644		if (err)
  4645			goto free_nm;
  4646	
  4647		/* get an inode for node space */
  4648		sbi->node_inode = f2fs_iget(sb, F2FS_NODE_INO(sbi));
  4649		if (IS_ERR(sbi->node_inode)) {
  4650			f2fs_err(sbi, "Failed to read node inode");
  4651			err = PTR_ERR(sbi->node_inode);
  4652			goto free_stats;
  4653		}
  4654	
  4655		/* read root inode and dentry */
  4656		root = f2fs_iget(sb, F2FS_ROOT_INO(sbi));
  4657		if (IS_ERR(root)) {
  4658			f2fs_err(sbi, "Failed to read root inode");
  4659			err = PTR_ERR(root);
  4660			goto free_node_inode;
  4661		}
  4662		if (!S_ISDIR(root->i_mode) || !root->i_blocks ||
  4663				!root->i_size || !root->i_nlink) {
  4664			iput(root);
  4665			err = -EINVAL;
  4666			goto free_node_inode;
  4667		}
  4668	
> 4669		if (sb->s_encoding)
  4670			sb->s_d_op = &generic_ci_dentry_ops;
  4671	
  4672		sb->s_root = d_make_root(root); /* allocate root dentry */
  4673		if (!sb->s_root) {
  4674			err = -ENOMEM;
  4675			goto free_node_inode;
  4676		}
  4677	
  4678		err = f2fs_init_compress_inode(sbi);
  4679		if (err)
  4680			goto free_root_inode;
  4681	
  4682		err = f2fs_register_sysfs(sbi);
  4683		if (err)
  4684			goto free_compress_inode;
  4685	

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki


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

^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2023-12-14 15:02 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-12-13 23:40 [f2fs-dev] [PATCH 0/8] Revert setting casefolding dentry operations through s_d_op Gabriel Krisman Bertazi
2023-12-13 23:40 ` [f2fs-dev] [PATCH 1/8] dcache: Add helper to disable d_revalidate for a specific dentry Gabriel Krisman Bertazi
2023-12-13 23:40 ` [f2fs-dev] [PATCH 2/8] fscrypt: Drop d_revalidate if key is available Gabriel Krisman Bertazi
2023-12-13 23:40 ` [f2fs-dev] [PATCH 3/8] libfs: Merge encrypted_ci_dentry_ops and ci_dentry_ops Gabriel Krisman Bertazi
2023-12-13 23:40 ` [f2fs-dev] [PATCH 4/8] libfs: Expose generic_ci_dentry_ops outside of libfs Gabriel Krisman Bertazi
2023-12-13 23:40 ` [f2fs-dev] [PATCH 5/8] ext4: Set the case-insensitive dentry operations through ->s_d_op Gabriel Krisman Bertazi
2023-12-14 12:29   ` kernel test robot
2023-12-13 23:40 ` [f2fs-dev] [PATCH 6/8] f2fs: " Gabriel Krisman Bertazi
2023-12-14 15:01   ` kernel test robot
2023-12-13 23:40 ` [f2fs-dev] [PATCH 7/8] libfs: Don't support setting casefold operations during lookup Gabriel Krisman Bertazi
2023-12-13 23:40 ` [f2fs-dev] [PATCH 8/8] fscrypt: Move d_revalidate configuration back into fscrypt Gabriel Krisman Bertazi
2023-12-14 14:51   ` kernel test robot

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).