* [PATCH RFC 1/7] fs: Expose name under lookup to d_revalidate hook
2022-06-01 20:44 [PATCH RFC 0/7] Support negative dentries on case-insensitive directories Gabriel Krisman Bertazi
@ 2022-06-01 20:44 ` Gabriel Krisman Bertazi
2022-06-01 20:44 ` [PATCH RFC 2/7] fs: Add DCACHE_CASEFOLD_LOOKUP flag Gabriel Krisman Bertazi
` (5 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Gabriel Krisman Bertazi @ 2022-06-01 20:44 UTC (permalink / raw)
To: viro, tytso, jaegeuk
Cc: ebiggers, linux-fsdevel, linux-ext4, linux-f2fs-devel,
Gabriel Krisman Bertazi, kernel
Negative dentries support on case-insensitive ext4/f2fs will require
access to the name under lookup to ensure it matches the dentry. This
adds an optional new flavor of cached dentry revalidation hook to expose
this extra parameter.
I'm fine with extending d_revalidate instead of adding a new hook, if
it is considered cleaner and the approach is accepted. I wrote a new
hook to simplify reviewing.
Signed-off-by: Gabriel Krisman Bertazi <krisman@collabora.com>
---
fs/dcache.c | 2 +-
fs/namei.c | 23 ++++++++++++++---------
include/linux/dcache.h | 1 +
3 files changed, 16 insertions(+), 10 deletions(-)
diff --git a/fs/dcache.c b/fs/dcache.c
index 93f4f5ee07bf..a0fe9e3676fb 100644
--- a/fs/dcache.c
+++ b/fs/dcache.c
@@ -1928,7 +1928,7 @@ void d_set_d_op(struct dentry *dentry, const struct dentry_operations *op)
dentry->d_flags |= DCACHE_OP_HASH;
if (op->d_compare)
dentry->d_flags |= DCACHE_OP_COMPARE;
- if (op->d_revalidate)
+ if (op->d_revalidate || op->d_revalidate_name)
dentry->d_flags |= DCACHE_OP_REVALIDATE;
if (op->d_weak_revalidate)
dentry->d_flags |= DCACHE_OP_WEAK_REVALIDATE;
diff --git a/fs/namei.c b/fs/namei.c
index 509657fdf4f5..b2a2e715c1a8 100644
--- a/fs/namei.c
+++ b/fs/namei.c
@@ -848,11 +848,16 @@ static bool try_to_unlazy_next(struct nameidata *nd, struct dentry *dentry, unsi
return false;
}
-static inline int d_revalidate(struct dentry *dentry, unsigned int flags)
+static inline int d_revalidate(struct dentry *dentry,
+ const struct qstr *name,
+ unsigned int flags)
{
- if (unlikely(dentry->d_flags & DCACHE_OP_REVALIDATE))
+
+ if (unlikely(dentry->d_flags & DCACHE_OP_REVALIDATE)) {
+ if (dentry->d_op->d_revalidate_name)
+ return dentry->d_op->d_revalidate_name(dentry, name, flags);
return dentry->d_op->d_revalidate(dentry, flags);
- else
+ } else
return 1;
}
@@ -1569,7 +1574,7 @@ static struct dentry *lookup_dcache(const struct qstr *name,
{
struct dentry *dentry = d_lookup(dir, name);
if (dentry) {
- int error = d_revalidate(dentry, flags);
+ int error = d_revalidate(dentry, name, flags);
if (unlikely(error <= 0)) {
if (!error)
d_invalidate(dentry);
@@ -1653,19 +1658,19 @@ static struct dentry *lookup_fast(struct nameidata *nd,
return ERR_PTR(-ECHILD);
*seqp = seq;
- status = d_revalidate(dentry, nd->flags);
+ status = d_revalidate(dentry, &nd->last, nd->flags);
if (likely(status > 0))
return dentry;
if (!try_to_unlazy_next(nd, dentry, seq))
return ERR_PTR(-ECHILD);
if (status == -ECHILD)
/* we'd been told to redo it in non-rcu mode */
- status = d_revalidate(dentry, nd->flags);
+ status = d_revalidate(dentry, &nd->last, nd->flags);
} else {
dentry = __d_lookup(parent, &nd->last);
if (unlikely(!dentry))
return NULL;
- status = d_revalidate(dentry, nd->flags);
+ status = d_revalidate(dentry, &nd->last, nd->flags);
}
if (unlikely(status <= 0)) {
if (!status)
@@ -1693,7 +1698,7 @@ static struct dentry *__lookup_slow(const struct qstr *name,
if (IS_ERR(dentry))
return dentry;
if (unlikely(!d_in_lookup(dentry))) {
- int error = d_revalidate(dentry, flags);
+ int error = d_revalidate(dentry, name, flags);
if (unlikely(error <= 0)) {
if (!error) {
d_invalidate(dentry);
@@ -3258,7 +3263,7 @@ static struct dentry *lookup_open(struct nameidata *nd, struct file *file,
if (d_in_lookup(dentry))
break;
- error = d_revalidate(dentry, nd->flags);
+ error = d_revalidate(dentry, &nd->last, nd->flags);
if (likely(error > 0))
break;
if (error)
diff --git a/include/linux/dcache.h b/include/linux/dcache.h
index f5bba51480b2..871f65c8ef7f 100644
--- a/include/linux/dcache.h
+++ b/include/linux/dcache.h
@@ -126,6 +126,7 @@ enum dentry_d_lock_class
struct dentry_operations {
int (*d_revalidate)(struct dentry *, unsigned int);
+ int (*d_revalidate_name)(struct dentry *, const struct qstr *, unsigned int);
int (*d_weak_revalidate)(struct dentry *, unsigned int);
int (*d_hash)(const struct dentry *, struct qstr *);
int (*d_compare)(const struct dentry *,
--
2.36.1
^ permalink raw reply related [flat|nested] 8+ messages in thread* [PATCH RFC 2/7] fs: Add DCACHE_CASEFOLD_LOOKUP flag
2022-06-01 20:44 [PATCH RFC 0/7] Support negative dentries on case-insensitive directories Gabriel Krisman Bertazi
2022-06-01 20:44 ` [PATCH RFC 1/7] fs: Expose name under lookup to d_revalidate hook Gabriel Krisman Bertazi
@ 2022-06-01 20:44 ` Gabriel Krisman Bertazi
2022-06-01 20:44 ` [PATCH RFC 3/7] libfs: Validate negative dentries in case-insensitive directories Gabriel Krisman Bertazi
` (4 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Gabriel Krisman Bertazi @ 2022-06-01 20:44 UTC (permalink / raw)
To: viro, tytso, jaegeuk
Cc: ebiggers, linux-fsdevel, linux-ext4, linux-f2fs-devel,
Gabriel Krisman Bertazi, kernel
This flag marks a negative or positive dentry as being created after a
case-insensitive lookup operation. It is useful to differentiate
dentries this way to detect whether the negative dentry can be trusted
during a case-insensitive lookup.
Signed-off-by: Gabriel Krisman Bertazi <krisman@collabora.com>
---
fs/dcache.c | 7 +++++++
include/linux/dcache.h | 8 ++++++++
2 files changed, 15 insertions(+)
diff --git a/fs/dcache.c b/fs/dcache.c
index a0fe9e3676fb..518ddb7fbe0c 100644
--- a/fs/dcache.c
+++ b/fs/dcache.c
@@ -1958,6 +1958,13 @@ void d_set_fallthru(struct dentry *dentry)
}
EXPORT_SYMBOL(d_set_fallthru);
+void d_set_casefold_lookup(struct dentry *dentry)
+{
+ spin_lock(&dentry->d_lock);
+ dentry->d_flags |= DCACHE_CASEFOLD_LOOKUP;
+ spin_unlock(&dentry->d_lock);
+}
+
static unsigned d_flags_for_inode(struct inode *inode)
{
unsigned add_flags = DCACHE_REGULAR_TYPE;
diff --git a/include/linux/dcache.h b/include/linux/dcache.h
index 871f65c8ef7f..8b71c5e418c2 100644
--- a/include/linux/dcache.h
+++ b/include/linux/dcache.h
@@ -208,6 +208,7 @@ struct dentry_operations {
#define DCACHE_FALLTHRU 0x01000000 /* Fall through to lower layer */
#define DCACHE_NOKEY_NAME 0x02000000 /* Encrypted name encoded without key */
#define DCACHE_OP_REAL 0x04000000
+#define DCACHE_CASEFOLD_LOOKUP 0x08000000 /* Dentry comes from a casefold directory */
#define DCACHE_PAR_LOOKUP 0x10000000 /* being looked up (with parent locked shared) */
#define DCACHE_DENTRY_CURSOR 0x20000000
@@ -497,6 +498,13 @@ static inline bool d_is_fallthru(const struct dentry *dentry)
return dentry->d_flags & DCACHE_FALLTHRU;
}
+extern void d_set_casefold_lookup(struct dentry *dentry);
+
+static inline bool d_is_casefold_lookup(const struct dentry *dentry)
+{
+ return dentry->d_flags & DCACHE_CASEFOLD_LOOKUP;
+}
+
extern int sysctl_vfs_cache_pressure;
--
2.36.1
^ permalink raw reply related [flat|nested] 8+ messages in thread* [PATCH RFC 3/7] libfs: Validate negative dentries in case-insensitive directories
2022-06-01 20:44 [PATCH RFC 0/7] Support negative dentries on case-insensitive directories Gabriel Krisman Bertazi
2022-06-01 20:44 ` [PATCH RFC 1/7] fs: Expose name under lookup to d_revalidate hook Gabriel Krisman Bertazi
2022-06-01 20:44 ` [PATCH RFC 2/7] fs: Add DCACHE_CASEFOLD_LOOKUP flag Gabriel Krisman Bertazi
@ 2022-06-01 20:44 ` Gabriel Krisman Bertazi
2022-06-01 20:44 ` [PATCH RFC 4/7] libfs: Support revalidation of encrypted case-insensitive dentries Gabriel Krisman Bertazi
` (3 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Gabriel Krisman Bertazi @ 2022-06-01 20:44 UTC (permalink / raw)
To: viro, tytso, jaegeuk
Cc: ebiggers, linux-fsdevel, linux-ext4, linux-f2fs-devel,
Gabriel Krisman Bertazi, kernel
Introduce a dentry revalidation helper to be used by case-insensitive
filesystems to check if it is safe to reuse a negative dentry.
A negative dentry is safe to be reused on a case-insensitive lookup if
it was created during a case-insensitive lookup and this is not a lookup
that will instantiate a dentry. If this is a creation lookup, we also
need to make sure the name matches sensitively the name under lookup in
order to assure the name preserving semantics.
Signed-off-by: Gabriel Krisman Bertazi <krisman@collabora.com>
---
fs/libfs.c | 24 ++++++++++++++++++++++++
1 file changed, 24 insertions(+)
diff --git a/fs/libfs.c b/fs/libfs.c
index e64bdedef168..618a85c08aa7 100644
--- a/fs/libfs.c
+++ b/fs/libfs.c
@@ -1450,9 +1450,33 @@ static int generic_ci_d_hash(const struct dentry *dentry, struct qstr *str)
return 0;
}
+static inline int generic_ci_d_revalidate(struct dentry *dentry,
+ const struct qstr *name,
+ unsigned int flags)
+{
+ int is_creation = flags & (LOOKUP_CREATE | LOOKUP_RENAME_TARGET);
+
+ if (d_is_negative(dentry)) {
+ const struct dentry *parent = READ_ONCE(dentry->d_parent);
+ const struct inode *dir = READ_ONCE(parent->d_inode);
+
+ if (dir && needs_casefold(dir)) {
+ if (!d_is_casefold_lookup(dentry))
+ return 0;
+
+ if (is_creation &&
+ (dentry->d_name.len != name->len ||
+ memcmp(dentry->d_name.name, name->name, name->len)))
+ return 0;
+ }
+ }
+ return 1;
+}
+
static const struct dentry_operations generic_ci_dentry_ops = {
.d_hash = generic_ci_d_hash,
.d_compare = generic_ci_d_compare,
+ .d_revalidate_name = generic_ci_d_revalidate,
};
#endif
--
2.36.1
^ permalink raw reply related [flat|nested] 8+ messages in thread* [PATCH RFC 4/7] libfs: Support revalidation of encrypted case-insensitive dentries
2022-06-01 20:44 [PATCH RFC 0/7] Support negative dentries on case-insensitive directories Gabriel Krisman Bertazi
` (2 preceding siblings ...)
2022-06-01 20:44 ` [PATCH RFC 3/7] libfs: Validate negative dentries in case-insensitive directories Gabriel Krisman Bertazi
@ 2022-06-01 20:44 ` Gabriel Krisman Bertazi
2022-06-01 20:44 ` [PATCH RFC 5/7] libfs: Merge encrypted_ci_dentry_ops and ci_dentry_ops Gabriel Krisman Bertazi
` (2 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Gabriel Krisman Bertazi @ 2022-06-01 20:44 UTC (permalink / raw)
To: viro, tytso, jaegeuk
Cc: ebiggers, linux-fsdevel, linux-ext4, linux-f2fs-devel,
Gabriel Krisman Bertazi, kernel
Preserve the existing behavior for encrypted directories, by rejecting
negative dentries of encrypted+casefolded directories. This allows
generic_ci_d_revalidate to be used by filesystems with both features
enabled, as long as the directory is either casefolded or encrypted, but
not both at the same time.
Signed-off-by: Gabriel Krisman Bertazi <krisman@collabora.com>
---
fs/libfs.c | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/fs/libfs.c b/fs/libfs.c
index 618a85c08aa7..fe22738291e4 100644
--- a/fs/libfs.c
+++ b/fs/libfs.c
@@ -1461,6 +1461,9 @@ static inline int generic_ci_d_revalidate(struct dentry *dentry,
const struct inode *dir = READ_ONCE(parent->d_inode);
if (dir && needs_casefold(dir)) {
+ if (IS_ENCRYPTED(dir))
+ return 0;
+
if (!d_is_casefold_lookup(dentry))
return 0;
@@ -1470,7 +1473,8 @@ static inline int generic_ci_d_revalidate(struct dentry *dentry,
return 0;
}
}
- return 1;
+
+ return fscrypt_d_revalidate(dentry, flags);
}
static const struct dentry_operations generic_ci_dentry_ops = {
@@ -1490,7 +1494,7 @@ static const struct dentry_operations generic_encrypted_dentry_ops = {
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,
+ .d_revalidate_name = generic_ci_d_revalidate,
};
#endif
--
2.36.1
^ permalink raw reply related [flat|nested] 8+ messages in thread* [PATCH RFC 5/7] libfs: Merge encrypted_ci_dentry_ops and ci_dentry_ops
2022-06-01 20:44 [PATCH RFC 0/7] Support negative dentries on case-insensitive directories Gabriel Krisman Bertazi
` (3 preceding siblings ...)
2022-06-01 20:44 ` [PATCH RFC 4/7] libfs: Support revalidation of encrypted case-insensitive dentries Gabriel Krisman Bertazi
@ 2022-06-01 20:44 ` Gabriel Krisman Bertazi
2022-06-01 20:44 ` [PATCH RFC 6/7] ext4: Enable negative dentries on case-insensitive lookup Gabriel Krisman Bertazi
2022-06-01 20:44 ` [PATCH RFC 7/7] f2fs: " Gabriel Krisman Bertazi
6 siblings, 0 replies; 8+ messages in thread
From: Gabriel Krisman Bertazi @ 2022-06-01 20:44 UTC (permalink / raw)
To: viro, tytso, jaegeuk
Cc: ebiggers, linux-fsdevel, linux-ext4, linux-f2fs-devel,
Gabriel Krisman Bertazi, kernel
Now that casefold needs d_revalidate and calls fscrypt_d_revalidate
itself, generic_encrypt_ci_dentry_ops and generic_ci_dentry_ops are now
equivalent. Merge them together and simplify the setup code.
Signed-off-by: Gabriel Krisman Bertazi <krisman@collabora.com>
---
fs/libfs.c | 44 +++++++++++++-------------------------------
1 file changed, 13 insertions(+), 31 deletions(-)
diff --git a/fs/libfs.c b/fs/libfs.c
index fe22738291e4..9d91f471203a 100644
--- a/fs/libfs.c
+++ b/fs/libfs.c
@@ -1477,7 +1477,7 @@ static inline int generic_ci_d_revalidate(struct dentry *dentry,
return fscrypt_d_revalidate(dentry, flags);
}
-static const struct dentry_operations generic_ci_dentry_ops = {
+static const struct dentry_operations generic_encrypted_ci_dentry_ops = {
.d_hash = generic_ci_d_hash,
.d_compare = generic_ci_d_compare,
.d_revalidate_name = generic_ci_d_revalidate,
@@ -1490,26 +1490,20 @@ 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_name = generic_ci_d_revalidate,
-};
-#endif
-
/**
* 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).
+ * Casefolded directories need d_hash, d_compare and d_revalidate set, so
+ * that the dentries contained in them are handled case-insensitively,
+ * but implement support for fs_encryption. 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.
@@ -1522,29 +1516,17 @@ static const struct dentry_operations generic_encrypted_ci_dentry_ops = {
*/
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) {
+ if (dentry->d_sb->s_encoding) {
d_set_d_op(dentry, &generic_encrypted_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.36.1
^ permalink raw reply related [flat|nested] 8+ messages in thread* [PATCH RFC 6/7] ext4: Enable negative dentries on case-insensitive lookup
2022-06-01 20:44 [PATCH RFC 0/7] Support negative dentries on case-insensitive directories Gabriel Krisman Bertazi
` (4 preceding siblings ...)
2022-06-01 20:44 ` [PATCH RFC 5/7] libfs: Merge encrypted_ci_dentry_ops and ci_dentry_ops Gabriel Krisman Bertazi
@ 2022-06-01 20:44 ` Gabriel Krisman Bertazi
2022-06-01 20:44 ` [PATCH RFC 7/7] f2fs: " Gabriel Krisman Bertazi
6 siblings, 0 replies; 8+ messages in thread
From: Gabriel Krisman Bertazi @ 2022-06-01 20:44 UTC (permalink / raw)
To: viro, tytso, jaegeuk
Cc: ebiggers, linux-fsdevel, linux-ext4, linux-f2fs-devel,
Gabriel Krisman Bertazi, kernel
Instead of invalidating negative dentries during case-insensitive
lookups, mark them as such and let them be added to the dcache.
d_ci_revalidate is able to properly filter them out if necessary based
on the dentry casefold flag.
Signed-off-by: Gabriel Krisman Bertazi <krisman@collabora.com>
---
fs/ext4/namei.c | 35 ++++-------------------------------
1 file changed, 4 insertions(+), 31 deletions(-)
diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c
index 767b4bfe39c3..783ba0b186c1 100644
--- a/fs/ext4/namei.c
+++ b/fs/ext4/namei.c
@@ -1800,16 +1800,9 @@ static struct dentry *ext4_lookup(struct inode *dir, struct dentry *dentry, unsi
}
}
-#if IS_ENABLED(CONFIG_UNICODE)
- if (!inode && IS_CASEFOLDED(dir)) {
- /* Eventually we want to call d_add_ci(dentry, NULL)
- * for negative dentries in the encoding case as
- * well. For now, prevent the negative dentry
- * from being cached.
- */
- return NULL;
- }
-#endif
+ if (IS_ENABLED(CONFIG_UNICODE) && IS_CASEFOLDED(dir))
+ d_set_casefold_lookup(dentry);
+
return d_splice_alias(inode, dentry);
}
@@ -3126,17 +3119,6 @@ static int ext4_rmdir(struct inode *dir, struct dentry *dentry)
ext4_fc_track_unlink(handle, dentry);
retval = ext4_mark_inode_dirty(handle, dir);
-#if IS_ENABLED(CONFIG_UNICODE)
- /* VFS negative dentries are incompatible with Encoding and
- * Case-insensitiveness. Eventually we'll want avoid
- * invalidating the dentries here, alongside with returning the
- * negative dentries at ext4_lookup(), when it is better
- * supported by the VFS for the CI case.
- */
- if (IS_CASEFOLDED(dir))
- d_invalidate(dentry);
-#endif
-
end_rmdir:
brelse(bh);
if (handle)
@@ -3231,16 +3213,7 @@ static int ext4_unlink(struct inode *dir, struct dentry *dentry)
retval = __ext4_unlink(handle, dir, &dentry->d_name, d_inode(dentry));
if (!retval)
ext4_fc_track_unlink(handle, dentry);
-#if IS_ENABLED(CONFIG_UNICODE)
- /* VFS negative dentries are incompatible with Encoding and
- * Case-insensitiveness. Eventually we'll want avoid
- * invalidating the dentries here, alongside with returning the
- * negative dentries at ext4_lookup(), when it is better
- * supported by the VFS for the CI case.
- */
- if (IS_CASEFOLDED(dir))
- d_invalidate(dentry);
-#endif
+
if (handle)
ext4_journal_stop(handle);
--
2.36.1
^ permalink raw reply related [flat|nested] 8+ messages in thread* [PATCH RFC 7/7] f2fs: Enable negative dentries on case-insensitive lookup
2022-06-01 20:44 [PATCH RFC 0/7] Support negative dentries on case-insensitive directories Gabriel Krisman Bertazi
` (5 preceding siblings ...)
2022-06-01 20:44 ` [PATCH RFC 6/7] ext4: Enable negative dentries on case-insensitive lookup Gabriel Krisman Bertazi
@ 2022-06-01 20:44 ` Gabriel Krisman Bertazi
6 siblings, 0 replies; 8+ messages in thread
From: Gabriel Krisman Bertazi @ 2022-06-01 20:44 UTC (permalink / raw)
To: viro, tytso, jaegeuk
Cc: ebiggers, linux-fsdevel, linux-ext4, linux-f2fs-devel,
Gabriel Krisman Bertazi, kernel
Instead of invalidating negative dentries during case-insensitive
lookups, mark them as such and let them be added to the dcache.
d_ci_revalidate is able to properly filter them out if necessary based
on the dentry casefold flag.
Signed-off-by: Gabriel Krisman Bertazi <krisman@collabora.com>
---
fs/f2fs/namei.c | 23 ++---------------------
1 file changed, 2 insertions(+), 21 deletions(-)
diff --git a/fs/f2fs/namei.c b/fs/f2fs/namei.c
index 5ed79b29999f..6e970a6c3623 100644
--- a/fs/f2fs/namei.c
+++ b/fs/f2fs/namei.c
@@ -562,17 +562,8 @@ static struct dentry *f2fs_lookup(struct inode *dir, struct dentry *dentry,
goto out_iput;
}
out_splice:
-#if IS_ENABLED(CONFIG_UNICODE)
- if (!inode && IS_CASEFOLDED(dir)) {
- /* Eventually we want to call d_add_ci(dentry, NULL)
- * for negative dentries in the encoding case as
- * well. For now, prevent the negative dentry
- * from being cached.
- */
- trace_f2fs_lookup_end(dir, dentry, ino, err);
- return NULL;
- }
-#endif
+ if (IS_ENABLED(CONFIG_UNICODE) && IS_CASEFOLDED(dir))
+ d_set_casefold_lookup(dentry);
new = d_splice_alias(inode, dentry);
err = PTR_ERR_OR_ZERO(new);
trace_f2fs_lookup_end(dir, dentry, ino, !new ? -ENOENT : err);
@@ -623,16 +614,6 @@ static int f2fs_unlink(struct inode *dir, struct dentry *dentry)
goto fail;
}
f2fs_delete_entry(de, page, dir, inode);
-#if IS_ENABLED(CONFIG_UNICODE)
- /* VFS negative dentries are incompatible with Encoding and
- * Case-insensitiveness. Eventually we'll want avoid
- * invalidating the dentries here, alongside with returning the
- * negative dentries at f2fs_lookup(), when it is better
- * supported by the VFS for the CI case.
- */
- if (IS_CASEFOLDED(dir))
- d_invalidate(dentry);
-#endif
f2fs_unlock_op(sbi);
if (IS_DIRSYNC(dir))
--
2.36.1
^ permalink raw reply related [flat|nested] 8+ messages in thread