[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <20250812072225.181798-2-chizhiling@163.com>
Date: Tue, 12 Aug 2025 15:22:24 +0800
From: Chi Zhiling <chizhiling@....com>
To: linux-fsdevel@...r.kernel.org,
linux-mm@...ck.org,
linux-kernel@...r.kernel.org
Cc: Alexander Viro <viro@...iv.linux.org.uk>,
Christian Brauner <brauner@...nel.org>,
Jan Kara <jack@...e.cz>,
Matthew Wilcox <willy@...radead.org>,
Andrew Morton <akpm@...ux-foundation.org>,
Namjae Jeon <linkinjeon@...nel.org>,
Sungjong Seo <sj1557.seo@...sung.com>,
Yuezhang Mo <yuezhang.mo@...y.com>,
Chi Zhiling <chizhiling@...inos.cn>
Subject: [PATCH 2/3] mpage: clean up do_mpage_readpage()
From: Chi Zhiling <chizhiling@...inos.cn>
Replace two loop iterations with direct calculations.
The variable nblocks now represents the number of avalid blocks we can
obtain from map_bh. no functional change.
Signed-off-by: Chi Zhiling <chizhiling@...inos.cn>
---
fs/mpage.c | 42 +++++++++++++++++-------------------------
1 file changed, 17 insertions(+), 25 deletions(-)
diff --git a/fs/mpage.c b/fs/mpage.c
index b6510b8dfa2b..a81a71de8f59 100644
--- a/fs/mpage.c
+++ b/fs/mpage.c
@@ -158,7 +158,6 @@ static struct bio *do_mpage_readpage(struct mpage_readpage_args *args)
struct buffer_head *map_bh = &args->map_bh;
sector_t block_in_file;
sector_t last_block;
- sector_t last_block_in_file;
sector_t first_block;
unsigned page_block;
unsigned first_hole = blocks_per_folio;
@@ -180,9 +179,8 @@ static struct bio *do_mpage_readpage(struct mpage_readpage_args *args)
block_in_file = folio_pos(folio) >> blkbits;
last_block = block_in_file + ((args->nr_pages * PAGE_SIZE) >> blkbits);
- last_block_in_file = (i_size_read(inode) + blocksize - 1) >> blkbits;
- if (last_block > last_block_in_file)
- last_block = last_block_in_file;
+ last_block = min_t(sector_t, last_block,
+ (i_size_read(inode) + blocksize - 1) >> blkbits);
page_block = 0;
/*
@@ -193,19 +191,15 @@ static struct bio *do_mpage_readpage(struct mpage_readpage_args *args)
block_in_file > args->first_logical_block &&
block_in_file < (args->first_logical_block + nblocks)) {
unsigned map_offset = block_in_file - args->first_logical_block;
- unsigned last = nblocks - map_offset;
first_block = map_bh->b_blocknr + map_offset;
- for (relative_block = 0; ; relative_block++) {
- if (relative_block == last) {
- clear_buffer_mapped(map_bh);
- break;
- }
- if (page_block == blocks_per_folio)
- break;
- page_block++;
- block_in_file++;
- }
+ nblocks -= map_offset;
+ if (nblocks > blocks_per_folio - page_block)
+ nblocks = blocks_per_folio - page_block;
+ else
+ clear_buffer_mapped(map_bh);
+ page_block += nblocks;
+ block_in_file += nblocks;
bdev = map_bh->b_bdev;
}
@@ -243,7 +237,7 @@ static struct bio *do_mpage_readpage(struct mpage_readpage_args *args)
map_buffer_to_folio(folio, map_bh, page_block);
goto confused;
}
-
+
if (first_hole != blocks_per_folio)
goto confused; /* hole -> non-hole */
@@ -252,16 +246,14 @@ static struct bio *do_mpage_readpage(struct mpage_readpage_args *args)
first_block = map_bh->b_blocknr;
else if (first_block + page_block != map_bh->b_blocknr)
goto confused;
+
nblocks = map_bh->b_size >> blkbits;
- for (relative_block = 0; ; relative_block++) {
- if (relative_block == nblocks) {
- clear_buffer_mapped(map_bh);
- break;
- } else if (page_block == blocks_per_folio)
- break;
- page_block++;
- block_in_file++;
- }
+ if (nblocks > blocks_per_folio - page_block)
+ nblocks = blocks_per_folio - page_block;
+ else
+ clear_buffer_mapped(map_bh);
+ page_block += nblocks;
+ block_in_file += nblocks;
bdev = map_bh->b_bdev;
}
--
2.43.0
Powered by blists - more mailing lists