* [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).