From 151fecfb72a0d602dfe79790602ef64b4e241574 Mon Sep 17 00:00:00 2001
From: hc <hc@nodka.com>
Date: Mon, 19 Feb 2024 01:51:07 +0000
Subject: [PATCH] export RK_PA3
---
kernel/fs/crypto/bio.c | 77 ++++++++++++++++++--------------------
1 files changed, 37 insertions(+), 40 deletions(-)
diff --git a/kernel/fs/crypto/bio.c b/kernel/fs/crypto/bio.c
index 642b9d6..b048a0e 100644
--- a/kernel/fs/crypto/bio.c
+++ b/kernel/fs/crypto/bio.c
@@ -29,9 +29,9 @@
void fscrypt_decrypt_bio(struct bio *bio)
{
struct bio_vec *bv;
- int i;
+ struct bvec_iter_all iter_all;
- bio_for_each_segment_all(bv, bio, i) {
+ bio_for_each_segment_all(bv, bio, iter_all) {
struct page *page = bv->bv_page;
int ret = fscrypt_decrypt_pagecache_blocks(page, bv->bv_len,
bv->bv_offset);
@@ -41,51 +41,48 @@
}
EXPORT_SYMBOL(fscrypt_decrypt_bio);
-static int fscrypt_zeroout_range_inlinecrypt(const struct inode *inode,
- pgoff_t lblk,
- sector_t pblk, unsigned int len)
+static int fscrypt_zeroout_range_inline_crypt(const struct inode *inode,
+ pgoff_t lblk, sector_t pblk,
+ unsigned int len)
{
const unsigned int blockbits = inode->i_blkbits;
- const unsigned int blocks_per_page_bits = PAGE_SHIFT - blockbits;
- const unsigned int blocks_per_page = 1 << blocks_per_page_bits;
- unsigned int i;
+ const unsigned int blocks_per_page = 1 << (PAGE_SHIFT - blockbits);
struct bio *bio;
- int ret, err;
+ int ret, err = 0;
+ int num_pages = 0;
/* This always succeeds since __GFP_DIRECT_RECLAIM is set. */
bio = bio_alloc(GFP_NOFS, BIO_MAX_PAGES);
- do {
- bio_set_dev(bio, inode->i_sb->s_bdev);
- bio->bi_iter.bi_sector = pblk << (blockbits - 9);
- bio_set_op_attrs(bio, REQ_OP_WRITE, 0);
- fscrypt_set_bio_crypt_ctx(bio, inode, lblk, GFP_NOFS);
+ while (len) {
+ unsigned int blocks_this_page = min(len, blocks_per_page);
+ unsigned int bytes_this_page = blocks_this_page << blockbits;
- i = 0;
- do {
- unsigned int blocks_this_page =
- min(len, blocks_per_page);
- unsigned int bytes_this_page =
- blocks_this_page << blockbits;
-
- ret = bio_add_page(bio, ZERO_PAGE(0),
- bytes_this_page, 0);
- if (WARN_ON(ret != bytes_this_page)) {
- err = -EIO;
- goto out;
- }
- lblk += blocks_this_page;
- pblk += blocks_this_page;
- len -= blocks_this_page;
- } while (++i != BIO_MAX_PAGES && len != 0 &&
- fscrypt_mergeable_bio(bio, inode, lblk));
-
- err = submit_bio_wait(bio);
- if (err)
+ if (num_pages == 0) {
+ fscrypt_set_bio_crypt_ctx(bio, inode, lblk, GFP_NOFS);
+ bio_set_dev(bio, inode->i_sb->s_bdev);
+ bio->bi_iter.bi_sector =
+ pblk << (blockbits - SECTOR_SHIFT);
+ bio_set_op_attrs(bio, REQ_OP_WRITE, 0);
+ }
+ ret = bio_add_page(bio, ZERO_PAGE(0), bytes_this_page, 0);
+ if (WARN_ON(ret != bytes_this_page)) {
+ err = -EIO;
goto out;
- bio_reset(bio);
- } while (len != 0);
- err = 0;
+ }
+ num_pages++;
+ len -= blocks_this_page;
+ lblk += blocks_this_page;
+ pblk += blocks_this_page;
+ if (num_pages == BIO_MAX_PAGES || !len ||
+ !fscrypt_mergeable_bio(bio, inode, lblk)) {
+ err = submit_bio_wait(bio);
+ if (err)
+ goto out;
+ bio_reset(bio);
+ num_pages = 0;
+ }
+ }
out:
bio_put(bio);
return err;
@@ -126,8 +123,8 @@
return 0;
if (fscrypt_inode_uses_inline_crypto(inode))
- return fscrypt_zeroout_range_inlinecrypt(inode, lblk, pblk,
- len);
+ return fscrypt_zeroout_range_inline_crypt(inode, lblk, pblk,
+ len);
BUILD_BUG_ON(ARRAY_SIZE(pages) > BIO_MAX_PAGES);
nr_pages = min_t(unsigned int, ARRAY_SIZE(pages),
--
Gitblit v1.6.2