diff options
author | Eric Biggers <ebiggers@google.com> | 2017-10-09 12:15:39 -0700 |
---|---|---|
committer | Theodore Ts'o <tytso@mit.edu> | 2017-10-18 19:52:37 -0400 |
commit | d293c3e4e07334d761c88df9d68b3aa800a83dd9 (patch) | |
tree | 55b1b5b5befe49d2bc031fd6fb6fbc6aa5fcd0fc | |
parent | ffcc41829ae043d0830bcd4536812fec7e098d93 (diff) | |
download | linux-stable-d293c3e4e07334d761c88df9d68b3aa800a83dd9.tar.gz linux-stable-d293c3e4e07334d761c88df9d68b3aa800a83dd9.tar.bz2 linux-stable-d293c3e4e07334d761c88df9d68b3aa800a83dd9.zip |
fscrypt: new helper function - fscrypt_require_key()
Add a helper function which checks if an inode is encrypted, and if so,
tries to set up its encryption key. This is a pattern which is
duplicated in multiple places in each of ext4, f2fs, and ubifs --- for
example, when a regular file is asked to be opened or truncated.
Acked-by: Dave Chinner <dchinner@redhat.com>
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
-rw-r--r-- | include/linux/fscrypt.h | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/include/linux/fscrypt.h b/include/linux/fscrypt.h index d58e6a90cfe4..b3e2a5f93415 100644 --- a/include/linux/fscrypt.h +++ b/include/linux/fscrypt.h @@ -151,5 +151,30 @@ static inline bool fscrypt_has_encryption_key(const struct inode *inode) #include <linux/fscrypt_notsupp.h> #endif /* __FS_HAS_ENCRYPTION */ +/** + * fscrypt_require_key - require an inode's encryption key + * @inode: the inode we need the key for + * + * If the inode is encrypted, set up its encryption key if not already done. + * Then require that the key be present and return -ENOKEY otherwise. + * + * No locks are needed, and the key will live as long as the struct inode --- so + * it won't go away from under you. + * + * Return: 0 on success, -ENOKEY if the key is missing, or another -errno code + * if a problem occurred while setting up the encryption key. + */ +static inline int fscrypt_require_key(struct inode *inode) +{ + if (IS_ENCRYPTED(inode)) { + int err = fscrypt_get_encryption_info(inode); + + if (err) + return err; + if (!fscrypt_has_encryption_key(inode)) + return -ENOKEY; + } + return 0; +} #endif /* _LINUX_FSCRYPT_H */ |