diff options
Diffstat (limited to 'fs/crypto/bio.c')
| -rw-r--r-- | fs/crypto/bio.c | 35 | 
1 files changed, 22 insertions, 13 deletions
diff --git a/fs/crypto/bio.c b/fs/crypto/bio.c index 0d5e6a569d58..0959044c5cee 100644 --- a/fs/crypto/bio.c +++ b/fs/crypto/bio.c @@ -26,15 +26,8 @@  #include <linux/namei.h>  #include "fscrypt_private.h" -/* - * Call fscrypt_decrypt_page on every single page, reusing the encryption - * context. - */ -static void completion_pages(struct work_struct *work) +static void __fscrypt_decrypt_bio(struct bio *bio, bool done)  { -	struct fscrypt_ctx *ctx = -		container_of(work, struct fscrypt_ctx, r.work); -	struct bio *bio = ctx->r.bio;  	struct bio_vec *bv;  	int i; @@ -46,22 +39,38 @@ static void completion_pages(struct work_struct *work)  		if (ret) {  			WARN_ON_ONCE(1);  			SetPageError(page); -		} else { +		} else if (done) {  			SetPageUptodate(page);  		} -		unlock_page(page); +		if (done) +			unlock_page(page);  	} +} + +void fscrypt_decrypt_bio(struct bio *bio) +{ +	__fscrypt_decrypt_bio(bio, false); +} +EXPORT_SYMBOL(fscrypt_decrypt_bio); + +static void completion_pages(struct work_struct *work) +{ +	struct fscrypt_ctx *ctx = +		container_of(work, struct fscrypt_ctx, r.work); +	struct bio *bio = ctx->r.bio; + +	__fscrypt_decrypt_bio(bio, true);  	fscrypt_release_ctx(ctx);  	bio_put(bio);  } -void fscrypt_decrypt_bio_pages(struct fscrypt_ctx *ctx, struct bio *bio) +void fscrypt_enqueue_decrypt_bio(struct fscrypt_ctx *ctx, struct bio *bio)  {  	INIT_WORK(&ctx->r.work, completion_pages);  	ctx->r.bio = bio; -	queue_work(fscrypt_read_workqueue, &ctx->r.work); +	fscrypt_enqueue_decrypt_work(&ctx->r.work);  } -EXPORT_SYMBOL(fscrypt_decrypt_bio_pages); +EXPORT_SYMBOL(fscrypt_enqueue_decrypt_bio);  void fscrypt_pullback_bio_page(struct page **page, bool restore)  {  | 
