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