summaryrefslogtreecommitdiffstats
path: root/fs/crypto
diff options
context:
space:
mode:
authorDavid Gstir <david@sigma-star.at>2016-11-13 22:20:45 +0100
committerTheodore Ts'o <tytso@mit.edu>2016-11-13 18:53:10 -0500
commitb50f7b268bad8088dfe7579a65cd910d8cc5c40f (patch)
tree7a4db96f6779146e5b9df84bd7d1cbb0d10e1032 /fs/crypto
parent1c7dcf69eea3224474fe884a03b3e19b82d1101e (diff)
downloadlinux-b50f7b268bad8088dfe7579a65cd910d8cc5c40f.tar.gz
linux-b50f7b268bad8088dfe7579a65cd910d8cc5c40f.tar.bz2
linux-b50f7b268bad8088dfe7579a65cd910d8cc5c40f.zip
fscrypt: Allow fscrypt_decrypt_page() to function with non-writeback pages
Some filesystem might pass pages which do not have page->mapping->host set to the encrypted inode. We want the caller to explicitly pass the corresponding inode. Signed-off-by: David Gstir <david@sigma-star.at> Signed-off-by: Richard Weinberger <richard@nod.at> Signed-off-by: Theodore Ts'o <tytso@mit.edu>
Diffstat (limited to 'fs/crypto')
-rw-r--r--fs/crypto/crypto.c11
1 files changed, 6 insertions, 5 deletions
diff --git a/fs/crypto/crypto.c b/fs/crypto/crypto.c
index f38dc8aac2fe..222a70520565 100644
--- a/fs/crypto/crypto.c
+++ b/fs/crypto/crypto.c
@@ -271,7 +271,8 @@ EXPORT_SYMBOL(fscrypt_encrypt_page);
/**
* f2crypt_decrypt_page() - Decrypts a page in-place
- * @page: The page to decrypt. Must be locked.
+ * @inode: The encrypted inode to decrypt.
+ * @page: The page to decrypt. Must be locked.
*
* Decrypts page in-place using the ctx encryption context.
*
@@ -279,12 +280,12 @@ EXPORT_SYMBOL(fscrypt_encrypt_page);
*
* Return: Zero on success, non-zero otherwise.
*/
-int fscrypt_decrypt_page(struct page *page)
+int fscrypt_decrypt_page(struct inode *inode, struct page *page)
{
BUG_ON(!PageLocked(page));
- return do_page_crypto(page->mapping->host,
- FS_DECRYPT, page->index, page, page, GFP_NOFS);
+ return do_page_crypto(inode, FS_DECRYPT, page->index, page, page,
+ GFP_NOFS);
}
EXPORT_SYMBOL(fscrypt_decrypt_page);
@@ -419,7 +420,7 @@ static void completion_pages(struct work_struct *work)
bio_for_each_segment_all(bv, bio, i) {
struct page *page = bv->bv_page;
- int ret = fscrypt_decrypt_page(page);
+ int ret = fscrypt_decrypt_page(page->mapping->host, page);
if (ret) {
WARN_ON_ONCE(1);