From 102a0743326a03cd1a1202ceda21e175b7d3575c Mon Sep 17 00:00:00 2001
From: hc <hc@nodka.com>
Date: Tue, 20 Feb 2024 01:20:52 +0000
Subject: [PATCH] add new system file

---
 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