| .. | .. |
|---|
| 29 | 29 | void fscrypt_decrypt_bio(struct bio *bio) |
|---|
| 30 | 30 | { |
|---|
| 31 | 31 | struct bio_vec *bv; |
|---|
| 32 | | - int i; |
|---|
| 32 | + struct bvec_iter_all iter_all; |
|---|
| 33 | 33 | |
|---|
| 34 | | - bio_for_each_segment_all(bv, bio, i) { |
|---|
| 34 | + bio_for_each_segment_all(bv, bio, iter_all) { |
|---|
| 35 | 35 | struct page *page = bv->bv_page; |
|---|
| 36 | 36 | int ret = fscrypt_decrypt_pagecache_blocks(page, bv->bv_len, |
|---|
| 37 | 37 | bv->bv_offset); |
|---|
| .. | .. |
|---|
| 41 | 41 | } |
|---|
| 42 | 42 | EXPORT_SYMBOL(fscrypt_decrypt_bio); |
|---|
| 43 | 43 | |
|---|
| 44 | | -static int fscrypt_zeroout_range_inlinecrypt(const struct inode *inode, |
|---|
| 45 | | - pgoff_t lblk, |
|---|
| 46 | | - sector_t pblk, unsigned int len) |
|---|
| 44 | +static int fscrypt_zeroout_range_inline_crypt(const struct inode *inode, |
|---|
| 45 | + pgoff_t lblk, sector_t pblk, |
|---|
| 46 | + unsigned int len) |
|---|
| 47 | 47 | { |
|---|
| 48 | 48 | const unsigned int blockbits = inode->i_blkbits; |
|---|
| 49 | | - const unsigned int blocks_per_page_bits = PAGE_SHIFT - blockbits; |
|---|
| 50 | | - const unsigned int blocks_per_page = 1 << blocks_per_page_bits; |
|---|
| 51 | | - unsigned int i; |
|---|
| 49 | + const unsigned int blocks_per_page = 1 << (PAGE_SHIFT - blockbits); |
|---|
| 52 | 50 | struct bio *bio; |
|---|
| 53 | | - int ret, err; |
|---|
| 51 | + int ret, err = 0; |
|---|
| 52 | + int num_pages = 0; |
|---|
| 54 | 53 | |
|---|
| 55 | 54 | /* This always succeeds since __GFP_DIRECT_RECLAIM is set. */ |
|---|
| 56 | 55 | bio = bio_alloc(GFP_NOFS, BIO_MAX_PAGES); |
|---|
| 57 | 56 | |
|---|
| 58 | | - do { |
|---|
| 59 | | - bio_set_dev(bio, inode->i_sb->s_bdev); |
|---|
| 60 | | - bio->bi_iter.bi_sector = pblk << (blockbits - 9); |
|---|
| 61 | | - bio_set_op_attrs(bio, REQ_OP_WRITE, 0); |
|---|
| 62 | | - fscrypt_set_bio_crypt_ctx(bio, inode, lblk, GFP_NOFS); |
|---|
| 57 | + while (len) { |
|---|
| 58 | + unsigned int blocks_this_page = min(len, blocks_per_page); |
|---|
| 59 | + unsigned int bytes_this_page = blocks_this_page << blockbits; |
|---|
| 63 | 60 | |
|---|
| 64 | | - i = 0; |
|---|
| 65 | | - do { |
|---|
| 66 | | - unsigned int blocks_this_page = |
|---|
| 67 | | - min(len, blocks_per_page); |
|---|
| 68 | | - unsigned int bytes_this_page = |
|---|
| 69 | | - blocks_this_page << blockbits; |
|---|
| 70 | | - |
|---|
| 71 | | - ret = bio_add_page(bio, ZERO_PAGE(0), |
|---|
| 72 | | - bytes_this_page, 0); |
|---|
| 73 | | - if (WARN_ON(ret != bytes_this_page)) { |
|---|
| 74 | | - err = -EIO; |
|---|
| 75 | | - goto out; |
|---|
| 76 | | - } |
|---|
| 77 | | - lblk += blocks_this_page; |
|---|
| 78 | | - pblk += blocks_this_page; |
|---|
| 79 | | - len -= blocks_this_page; |
|---|
| 80 | | - } while (++i != BIO_MAX_PAGES && len != 0 && |
|---|
| 81 | | - fscrypt_mergeable_bio(bio, inode, lblk)); |
|---|
| 82 | | - |
|---|
| 83 | | - err = submit_bio_wait(bio); |
|---|
| 84 | | - if (err) |
|---|
| 61 | + if (num_pages == 0) { |
|---|
| 62 | + fscrypt_set_bio_crypt_ctx(bio, inode, lblk, GFP_NOFS); |
|---|
| 63 | + bio_set_dev(bio, inode->i_sb->s_bdev); |
|---|
| 64 | + bio->bi_iter.bi_sector = |
|---|
| 65 | + pblk << (blockbits - SECTOR_SHIFT); |
|---|
| 66 | + bio_set_op_attrs(bio, REQ_OP_WRITE, 0); |
|---|
| 67 | + } |
|---|
| 68 | + ret = bio_add_page(bio, ZERO_PAGE(0), bytes_this_page, 0); |
|---|
| 69 | + if (WARN_ON(ret != bytes_this_page)) { |
|---|
| 70 | + err = -EIO; |
|---|
| 85 | 71 | goto out; |
|---|
| 86 | | - bio_reset(bio); |
|---|
| 87 | | - } while (len != 0); |
|---|
| 88 | | - err = 0; |
|---|
| 72 | + } |
|---|
| 73 | + num_pages++; |
|---|
| 74 | + len -= blocks_this_page; |
|---|
| 75 | + lblk += blocks_this_page; |
|---|
| 76 | + pblk += blocks_this_page; |
|---|
| 77 | + if (num_pages == BIO_MAX_PAGES || !len || |
|---|
| 78 | + !fscrypt_mergeable_bio(bio, inode, lblk)) { |
|---|
| 79 | + err = submit_bio_wait(bio); |
|---|
| 80 | + if (err) |
|---|
| 81 | + goto out; |
|---|
| 82 | + bio_reset(bio); |
|---|
| 83 | + num_pages = 0; |
|---|
| 84 | + } |
|---|
| 85 | + } |
|---|
| 89 | 86 | out: |
|---|
| 90 | 87 | bio_put(bio); |
|---|
| 91 | 88 | return err; |
|---|
| .. | .. |
|---|
| 126 | 123 | return 0; |
|---|
| 127 | 124 | |
|---|
| 128 | 125 | if (fscrypt_inode_uses_inline_crypto(inode)) |
|---|
| 129 | | - return fscrypt_zeroout_range_inlinecrypt(inode, lblk, pblk, |
|---|
| 130 | | - len); |
|---|
| 126 | + return fscrypt_zeroout_range_inline_crypt(inode, lblk, pblk, |
|---|
| 127 | + len); |
|---|
| 131 | 128 | |
|---|
| 132 | 129 | BUILD_BUG_ON(ARRAY_SIZE(pages) > BIO_MAX_PAGES); |
|---|
| 133 | 130 | nr_pages = min_t(unsigned int, ARRAY_SIZE(pages), |
|---|