mirror of
https://github.com/torvalds/linux.git
synced 2025-11-02 09:40:27 +02:00
fscrypt: Factor out a helper to configure the lookup dentry
Both fscrypt_prepare_lookup_partial and fscrypt_prepare_lookup will set DCACHE_NOKEY_NAME for dentries when the key is not available. Extract out a helper to set this flag in a single place, in preparation to also add the optimization that will disable ->d_revalidate if possible. Reviewed-by: Eric Biggers <ebiggers@google.com> Link: https://lore.kernel.org/r/20240221171412.10710-3-krisman@suse.de Signed-off-by: Gabriel Krisman Bertazi <krisman@suse.de>
This commit is contained in:
parent
2824083db7
commit
8b6bb995d3
2 changed files with 20 additions and 10 deletions
|
|
@ -102,11 +102,8 @@ int __fscrypt_prepare_lookup(struct inode *dir, struct dentry *dentry,
|
||||||
if (err && err != -ENOENT)
|
if (err && err != -ENOENT)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
if (fname->is_nokey_name) {
|
fscrypt_prepare_dentry(dentry, fname->is_nokey_name);
|
||||||
spin_lock(&dentry->d_lock);
|
|
||||||
dentry->d_flags |= DCACHE_NOKEY_NAME;
|
|
||||||
spin_unlock(&dentry->d_lock);
|
|
||||||
}
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(__fscrypt_prepare_lookup);
|
EXPORT_SYMBOL_GPL(__fscrypt_prepare_lookup);
|
||||||
|
|
@ -131,12 +128,10 @@ EXPORT_SYMBOL_GPL(__fscrypt_prepare_lookup);
|
||||||
int fscrypt_prepare_lookup_partial(struct inode *dir, struct dentry *dentry)
|
int fscrypt_prepare_lookup_partial(struct inode *dir, struct dentry *dentry)
|
||||||
{
|
{
|
||||||
int err = fscrypt_get_encryption_info(dir, true);
|
int err = fscrypt_get_encryption_info(dir, true);
|
||||||
|
bool is_nokey_name = (!err && !fscrypt_has_encryption_key(dir));
|
||||||
|
|
||||||
|
fscrypt_prepare_dentry(dentry, is_nokey_name);
|
||||||
|
|
||||||
if (!err && !fscrypt_has_encryption_key(dir)) {
|
|
||||||
spin_lock(&dentry->d_lock);
|
|
||||||
dentry->d_flags |= DCACHE_NOKEY_NAME;
|
|
||||||
spin_unlock(&dentry->d_lock);
|
|
||||||
}
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(fscrypt_prepare_lookup_partial);
|
EXPORT_SYMBOL_GPL(fscrypt_prepare_lookup_partial);
|
||||||
|
|
|
||||||
|
|
@ -261,6 +261,16 @@ static inline bool fscrypt_is_nokey_name(const struct dentry *dentry)
|
||||||
return dentry->d_flags & DCACHE_NOKEY_NAME;
|
return dentry->d_flags & DCACHE_NOKEY_NAME;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void fscrypt_prepare_dentry(struct dentry *dentry,
|
||||||
|
bool is_nokey_name)
|
||||||
|
{
|
||||||
|
if (is_nokey_name) {
|
||||||
|
spin_lock(&dentry->d_lock);
|
||||||
|
dentry->d_flags |= DCACHE_NOKEY_NAME;
|
||||||
|
spin_unlock(&dentry->d_lock);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* crypto.c */
|
/* crypto.c */
|
||||||
void fscrypt_enqueue_decrypt_work(struct work_struct *);
|
void fscrypt_enqueue_decrypt_work(struct work_struct *);
|
||||||
|
|
||||||
|
|
@ -425,6 +435,11 @@ static inline bool fscrypt_is_nokey_name(const struct dentry *dentry)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void fscrypt_prepare_dentry(struct dentry *dentry,
|
||||||
|
bool is_nokey_name)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
/* crypto.c */
|
/* crypto.c */
|
||||||
static inline void fscrypt_enqueue_decrypt_work(struct work_struct *work)
|
static inline void fscrypt_enqueue_decrypt_work(struct work_struct *work)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue