1 // SPDX-License-Identifier: GPL-2.0
3 * This contains encryption functions for per-file encryption.
5 * Copyright (C) 2015, Google, Inc.
6 * Copyright (C) 2015, Motorola Mobility
8 * Written by Michael Halcrow, 2014.
10 * Filename encryption additions
11 * Uday Savagaonkar, 2014
12 * Encryption policy handling additions
13 * Ildar Muslukhov, 2014
14 * Add fscrypt_pullback_bio_page()
17 * This has not yet undergone a rigorous security audit.
19 * The usage of AES-XTS should conform to recommendations in NIST
20 * Special Publication 800-38E and IEEE P1619/D16.
23 #include <linux/pagemap.h>
24 #include <linux/module.h>
25 #include <linux/bio.h>
26 #include <linux/namei.h>
27 #include "fscrypt_private.h"
29 static void __fscrypt_decrypt_bio(struct bio
*bio
, bool done
)
34 bio_for_each_segment_all(bv
, bio
, i
) {
35 struct page
*page
= bv
->bv_page
;
36 int ret
= fscrypt_decrypt_page(page
->mapping
->host
, page
,
37 PAGE_SIZE
, 0, page
->index
);
43 SetPageUptodate(page
);
50 void fscrypt_decrypt_bio(struct bio
*bio
)
52 __fscrypt_decrypt_bio(bio
, false);
54 EXPORT_SYMBOL(fscrypt_decrypt_bio
);
56 static void completion_pages(struct work_struct
*work
)
58 struct fscrypt_ctx
*ctx
=
59 container_of(work
, struct fscrypt_ctx
, r
.work
);
60 struct bio
*bio
= ctx
->r
.bio
;
62 __fscrypt_decrypt_bio(bio
, true);
63 fscrypt_release_ctx(ctx
);
67 void fscrypt_enqueue_decrypt_bio(struct fscrypt_ctx
*ctx
, struct bio
*bio
)
69 INIT_WORK(&ctx
->r
.work
, completion_pages
);
71 fscrypt_enqueue_decrypt_work(&ctx
->r
.work
);
73 EXPORT_SYMBOL(fscrypt_enqueue_decrypt_bio
);
75 void fscrypt_pullback_bio_page(struct page
**page
, bool restore
)
77 struct fscrypt_ctx
*ctx
;
78 struct page
*bounce_page
;
80 /* The bounce data pages are unmapped. */
84 /* The bounce data page is unmapped. */
86 ctx
= (struct fscrypt_ctx
*)page_private(bounce_page
);
88 /* restore control page */
89 *page
= ctx
->w
.control_page
;
92 fscrypt_restore_control_page(bounce_page
);
94 EXPORT_SYMBOL(fscrypt_pullback_bio_page
);
96 int fscrypt_zeroout_range(const struct inode
*inode
, pgoff_t lblk
,
97 sector_t pblk
, unsigned int len
)
99 struct fscrypt_ctx
*ctx
;
100 struct page
*ciphertext_page
= NULL
;
104 BUG_ON(inode
->i_sb
->s_blocksize
!= PAGE_SIZE
);
106 ctx
= fscrypt_get_ctx(inode
, GFP_NOFS
);
110 ciphertext_page
= fscrypt_alloc_bounce_page(ctx
, GFP_NOWAIT
);
111 if (IS_ERR(ciphertext_page
)) {
112 err
= PTR_ERR(ciphertext_page
);
117 err
= fscrypt_do_page_crypto(inode
, FS_ENCRYPT
, lblk
,
118 ZERO_PAGE(0), ciphertext_page
,
119 PAGE_SIZE
, 0, GFP_NOFS
);
123 bio
= bio_alloc(GFP_NOWAIT
, 1);
128 bio_set_dev(bio
, inode
->i_sb
->s_bdev
);
129 bio
->bi_iter
.bi_sector
=
130 pblk
<< (inode
->i_sb
->s_blocksize_bits
- 9);
131 bio_set_op_attrs(bio
, REQ_OP_WRITE
, 0);
132 ret
= bio_add_page(bio
, ciphertext_page
,
133 inode
->i_sb
->s_blocksize
, 0);
134 if (ret
!= inode
->i_sb
->s_blocksize
) {
135 /* should never happen! */
141 err
= submit_bio_wait(bio
);
142 if (err
== 0 && bio
->bi_status
)
152 fscrypt_release_ctx(ctx
);
155 EXPORT_SYMBOL(fscrypt_zeroout_range
);