From: Gabriel Krisman Bertazi <krisman@suse.de>
To: ebiggers@kernel.org, viro@zeniv.linux.org.uk, jaegeuk@kernel.org,
tytso@mit.edu
Cc: amir73il@gmail.com, linux-ext4@vger.kernel.org,
linux-f2fs-devel@lists.sourceforge.net,
linux-fsdevel@vger.kernel.org,
Gabriel Krisman Bertazi <krisman@suse.de>
Subject: [PATCH v5 05/12] fscrypt: Drop d_revalidate once the key is added
Date: Mon, 29 Jan 2024 17:43:23 -0300 [thread overview]
Message-ID: <20240129204330.32346-6-krisman@suse.de> (raw)
In-Reply-To: <20240129204330.32346-1-krisman@suse.de>
From fscrypt perspective, once the key is available, the dentry will
remain valid until evicted for other reasons, since keyed dentries don't
require revalidation and, if the key is removed, the dentry is
forcefully evicted. Therefore, we don't need to keep revalidating them
repeatedly.
Obviously, we can only do this if fscrypt is the only thing requiring
revalidation for a dentry. For this reason, we only disable
d_revalidate if the .d_revalidate hook is fscrypt_d_revalidate itself.
It is safe to do it here because when moving the dentry to the
plain-text version, we are holding the d_lock. We might race with a
concurrent RCU lookup but this is harmless because, at worst, we will
get an extra d_revalidate on the keyed dentry, which is will find the
dentry is valid.
Signed-off-by: Gabriel Krisman Bertazi <krisman@suse.de>
---
Changes since v3:
- Fix null-ptr-deref for filesystems that don't support fscrypt (ktr)
Changes since v2:
- Do it when moving instead of when revalidating the dentry. (me)
Changes since v1:
- Improve commit message (Eric)
- Drop & in function comparison (Eric)
---
include/linux/fscrypt.h | 22 ++++++++++++++++------
1 file changed, 16 insertions(+), 6 deletions(-)
diff --git a/include/linux/fscrypt.h b/include/linux/fscrypt.h
index a22997b9f35c..c1e285053b3e 100644
--- a/include/linux/fscrypt.h
+++ b/include/linux/fscrypt.h
@@ -192,6 +192,8 @@ struct fscrypt_operations {
unsigned int *num_devs);
};
+int fscrypt_d_revalidate(struct dentry *dentry, unsigned int flags);
+
static inline struct fscrypt_inode_info *
fscrypt_get_inode_info(const struct inode *inode)
{
@@ -221,15 +223,24 @@ static inline bool fscrypt_needs_contents_encryption(const struct inode *inode)
}
/*
- * When d_splice_alias() moves a directory's no-key alias to its plaintext alias
- * as a result of the encryption key being added, DCACHE_NOKEY_NAME must be
- * cleared. Note that we don't have to support arbitrary moves of this flag
- * because fscrypt doesn't allow no-key names to be the source or target of a
- * rename().
+ * When d_splice_alias() moves a directory's no-key alias to its
+ * plaintext alias as a result of the encryption key being added,
+ * DCACHE_NOKEY_NAME must be cleared and there might be an opportunity
+ * to disable d_revalidate. Note that we don't have to support the
+ * inverse operation because fscrypt doesn't allow no-key names to be
+ * the source or target of a rename().
*/
static inline void fscrypt_handle_d_move(struct dentry *dentry)
{
dentry->d_flags &= ~DCACHE_NOKEY_NAME;
+
+ /*
+ * Save the d_revalidate call cost during VFS operations. We
+ * can do it because, when the key is available, the dentry
+ * can't go stale and the key won't go away without eviction.
+ */
+ if (dentry->d_op && dentry->d_op->d_revalidate == fscrypt_d_revalidate)
+ dentry->d_flags &= ~DCACHE_OP_REVALIDATE;
}
/**
@@ -368,7 +379,6 @@ int fscrypt_fname_disk_to_usr(const struct inode *inode,
bool fscrypt_match_name(const struct fscrypt_name *fname,
const u8 *de_name, u32 de_name_len);
u64 fscrypt_fname_siphash(const struct inode *dir, const struct qstr *name);
-int fscrypt_d_revalidate(struct dentry *dentry, unsigned int flags);
/* bio.c */
bool fscrypt_decrypt_bio(struct bio *bio);
--
2.43.0
next prev parent reply other threads:[~2024-01-29 20:43 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-01-29 20:43 [PATCH v5 00/12] Set casefold/fscrypt dentry operations through sb->s_d_op Gabriel Krisman Bertazi
2024-01-29 20:43 ` [PATCH v5 01/12] ovl: Reject mounting over case-insensitive directories Gabriel Krisman Bertazi
2024-01-31 0:22 ` Eric Biggers
2024-01-31 0:31 ` Gabriel Krisman Bertazi
2024-01-29 20:43 ` [PATCH v5 02/12] fscrypt: Factor out a helper to configure the lookup dentry Gabriel Krisman Bertazi
2024-01-31 0:29 ` Eric Biggers
2024-01-29 20:43 ` [PATCH v5 03/12] fscrypt: Call fscrypt_prepare_lookup_dentry on unencrypted dentries Gabriel Krisman Bertazi
2024-01-29 20:43 ` [PATCH v5 04/12] fscrypt: Drop d_revalidate for valid dentries during lookup Gabriel Krisman Bertazi
2024-01-31 0:47 ` Eric Biggers
2024-01-31 18:35 ` Gabriel Krisman Bertazi
2024-02-01 3:24 ` Eric Biggers
2024-02-02 14:50 ` Gabriel Krisman Bertazi
2024-02-09 14:03 ` Christian Brauner
2024-02-09 14:46 ` Gabriel Krisman Bertazi
2024-01-29 20:43 ` Gabriel Krisman Bertazi [this message]
2024-01-29 20:43 ` [PATCH v5 06/12] fscrypt: Ignore plaintext dentries during d_move Gabriel Krisman Bertazi
2024-01-31 0:55 ` Eric Biggers
2024-01-29 20:43 ` [PATCH v5 07/12] libfs: Merge encrypted_ci_dentry_ops and ci_dentry_ops Gabriel Krisman Bertazi
2024-01-31 1:00 ` Eric Biggers
2024-01-29 20:43 ` [PATCH v5 08/12] libfs: Add helper to choose dentry operations at mount-time Gabriel Krisman Bertazi
2024-01-29 20:43 ` [PATCH v5 09/12] ext4: Configure dentry operations at dentry-creation time Gabriel Krisman Bertazi
2024-02-02 15:56 ` Theodore Ts'o
2024-01-29 20:43 ` [PATCH v5 10/12] f2fs: " Gabriel Krisman Bertazi
2024-01-29 20:43 ` [PATCH v5 11/12] ubifs: " Gabriel Krisman Bertazi
2024-01-29 20:43 ` [PATCH v5 12/12] libfs: Drop generic_set_encrypted_ci_d_ops Gabriel Krisman Bertazi
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240129204330.32346-6-krisman@suse.de \
--to=krisman@suse.de \
--cc=amir73il@gmail.com \
--cc=ebiggers@kernel.org \
--cc=jaegeuk@kernel.org \
--cc=linux-ext4@vger.kernel.org \
--cc=linux-f2fs-devel@lists.sourceforge.net \
--cc=linux-fsdevel@vger.kernel.org \
--cc=tytso@mit.edu \
--cc=viro@zeniv.linux.org.uk \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is 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).