hc
2024-05-10 37f49e37ab4cb5d0bc4c60eb5c6d4dd57db767bb
kernel/fs/crypto/bio.c
....@@ -29,9 +29,9 @@
2929 void fscrypt_decrypt_bio(struct bio *bio)
3030 {
3131 struct bio_vec *bv;
32
- int i;
32
+ struct bvec_iter_all iter_all;
3333
34
- bio_for_each_segment_all(bv, bio, i) {
34
+ bio_for_each_segment_all(bv, bio, iter_all) {
3535 struct page *page = bv->bv_page;
3636 int ret = fscrypt_decrypt_pagecache_blocks(page, bv->bv_len,
3737 bv->bv_offset);
....@@ -41,51 +41,48 @@
4141 }
4242 EXPORT_SYMBOL(fscrypt_decrypt_bio);
4343
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)
4747 {
4848 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);
5250 struct bio *bio;
53
- int ret, err;
51
+ int ret, err = 0;
52
+ int num_pages = 0;
5453
5554 /* This always succeeds since __GFP_DIRECT_RECLAIM is set. */
5655 bio = bio_alloc(GFP_NOFS, BIO_MAX_PAGES);
5756
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;
6360
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;
8571 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
+ }
8986 out:
9087 bio_put(bio);
9188 return err;
....@@ -126,8 +123,8 @@
126123 return 0;
127124
128125 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);
131128
132129 BUILD_BUG_ON(ARRAY_SIZE(pages) > BIO_MAX_PAGES);
133130 nr_pages = min_t(unsigned int, ARRAY_SIZE(pages),