Branch data Line data Source code
1 : : // SPDX-License-Identifier: GPL-2.0 2 : : /* 3 : : * This contains encryption functions for per-file encryption. 4 : : * 5 : : * Copyright (C) 2015, Google, Inc. 6 : : * Copyright (C) 2015, Motorola Mobility 7 : : * 8 : : * Written by Michael Halcrow, 2014. 9 : : * 10 : : * Filename encryption additions 11 : : * Uday Savagaonkar, 2014 12 : : * Encryption policy handling additions 13 : : * Ildar Muslukhov, 2014 14 : : * Add fscrypt_pullback_bio_page() 15 : : * Jaegeuk Kim, 2015. 16 : : * 17 : : * This has not yet undergone a rigorous security audit. 18 : : * 19 : : * The usage of AES-XTS should conform to recommendations in NIST 20 : : * Special Publication 800-38E and IEEE P1619/D16. 21 : : */ 22 : : 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" 28 : : 29 : 0 : static void __fscrypt_decrypt_bio(struct bio *bio, bool done) 30 : : { 31 : : struct bio_vec *bv; 32 : : struct bvec_iter_all iter_all; 33 : : 34 : 0 : bio_for_each_segment_all(bv, bio, iter_all) { 35 : 0 : struct page *page = bv->bv_page; 36 : 0 : int ret = fscrypt_decrypt_pagecache_blocks(page, bv->bv_len, 37 : : bv->bv_offset); 38 : 0 : if (ret) 39 : : SetPageError(page); 40 : 0 : else if (done) 41 : : SetPageUptodate(page); 42 : 0 : if (done) 43 : 0 : unlock_page(page); 44 : : } 45 : 0 : } 46 : : 47 : 0 : void fscrypt_decrypt_bio(struct bio *bio) 48 : : { 49 : 0 : __fscrypt_decrypt_bio(bio, false); 50 : 0 : } 51 : : EXPORT_SYMBOL(fscrypt_decrypt_bio); 52 : : 53 : 0 : static void completion_pages(struct work_struct *work) 54 : : { 55 : 0 : struct fscrypt_ctx *ctx = container_of(work, struct fscrypt_ctx, work); 56 : 0 : struct bio *bio = ctx->bio; 57 : : 58 : 0 : __fscrypt_decrypt_bio(bio, true); 59 : 0 : fscrypt_release_ctx(ctx); 60 : 0 : bio_put(bio); 61 : 0 : } 62 : : 63 : 0 : void fscrypt_enqueue_decrypt_bio(struct fscrypt_ctx *ctx, struct bio *bio) 64 : : { 65 : 0 : INIT_WORK(&ctx->work, completion_pages); 66 : 0 : ctx->bio = bio; 67 : 0 : fscrypt_enqueue_decrypt_work(&ctx->work); 68 : 0 : } 69 : : EXPORT_SYMBOL(fscrypt_enqueue_decrypt_bio); 70 : : 71 : 0 : int fscrypt_zeroout_range(const struct inode *inode, pgoff_t lblk, 72 : : sector_t pblk, unsigned int len) 73 : : { 74 : 0 : const unsigned int blockbits = inode->i_blkbits; 75 : 0 : const unsigned int blocksize = 1 << blockbits; 76 : : struct page *ciphertext_page; 77 : : struct bio *bio; 78 : : int ret, err = 0; 79 : : 80 : 0 : ciphertext_page = fscrypt_alloc_bounce_page(GFP_NOWAIT); 81 : 0 : if (!ciphertext_page) 82 : : return -ENOMEM; 83 : : 84 : 0 : while (len--) { 85 : 0 : err = fscrypt_crypt_block(inode, FS_ENCRYPT, lblk, 86 : : ZERO_PAGE(0), ciphertext_page, 87 : : blocksize, 0, GFP_NOFS); 88 : 0 : if (err) 89 : : goto errout; 90 : : 91 : : bio = bio_alloc(GFP_NOWAIT, 1); 92 : 0 : if (!bio) { 93 : : err = -ENOMEM; 94 : : goto errout; 95 : : } 96 : 0 : bio_set_dev(bio, inode->i_sb->s_bdev); 97 : 0 : bio->bi_iter.bi_sector = pblk << (blockbits - 9); 98 : : bio_set_op_attrs(bio, REQ_OP_WRITE, 0); 99 : 0 : ret = bio_add_page(bio, ciphertext_page, blocksize, 0); 100 : 0 : if (WARN_ON(ret != blocksize)) { 101 : : /* should never happen! */ 102 : 0 : bio_put(bio); 103 : : err = -EIO; 104 : 0 : goto errout; 105 : : } 106 : 0 : err = submit_bio_wait(bio); 107 : 0 : if (err == 0 && bio->bi_status) 108 : : err = -EIO; 109 : 0 : bio_put(bio); 110 : 0 : if (err) 111 : : goto errout; 112 : 0 : lblk++; 113 : 0 : pblk++; 114 : : } 115 : : err = 0; 116 : : errout: 117 : 0 : fscrypt_free_bounce_page(ciphertext_page); 118 : 0 : return err; 119 : : } 120 : : EXPORT_SYMBOL(fscrypt_zeroout_range);