|
@@ -237,4 +237,32 @@ static inline int fscrypt_prepare_rename(struct inode *old_dir,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * fscrypt_prepare_lookup - prepare to lookup a name in a possibly-encrypted directory
|
|
|
+ * @dir: directory being searched
|
|
|
+ * @dentry: filename being looked up
|
|
|
+ * @flags: lookup flags
|
|
|
+ *
|
|
|
+ * Prepare for ->lookup() in a directory which may be encrypted. Lookups can be
|
|
|
+ * done with or without the directory's encryption key; without the key,
|
|
|
+ * filenames are presented in encrypted form. Therefore, we'll try to set up
|
|
|
+ * the directory's encryption key, but even without it the lookup can continue.
|
|
|
+ *
|
|
|
+ * To allow invalidating stale dentries if the directory's encryption key is
|
|
|
+ * added later, we also install a custom ->d_revalidate() method and use the
|
|
|
+ * DCACHE_ENCRYPTED_WITH_KEY flag to indicate whether a given dentry is a
|
|
|
+ * plaintext name (flag set) or a ciphertext name (flag cleared).
|
|
|
+ *
|
|
|
+ * Return: 0 on success, -errno if a problem occurred while setting up the
|
|
|
+ * encryption key
|
|
|
+ */
|
|
|
+static inline int fscrypt_prepare_lookup(struct inode *dir,
|
|
|
+ struct dentry *dentry,
|
|
|
+ unsigned int flags)
|
|
|
+{
|
|
|
+ if (IS_ENCRYPTED(dir))
|
|
|
+ return __fscrypt_prepare_lookup(dir, dentry);
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
#endif /* _LINUX_FSCRYPT_H */
|