From patchwork Wed Jan 7 23:44:19 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Glass X-Patchwork-Id: 1341 Return-Path: X-Original-To: u-boot-concept@u-boot.org Delivered-To: u-boot-concept@u-boot.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1767829656; bh=SrKjzAIsLpLGdvAdAgiJa1zpSdQQPyhFE6Lj0s0x/Dc=; h=From:To:Date:In-Reply-To:References:CC:Subject:List-Id: List-Archive:List-Help:List-Owner:List-Post:List-Subscribe: List-Unsubscribe:From; b=T0XxyqqG02UvB8ldQRXZknWlP/MpaHwTiXWMEXE3tncY8GEB79A0fPa+HvUpc7Rqo z/7MqkelIbeDg9ivy31ydPIKW2jNVWYskTXaB/Yxklr0AQxECA8zeGrOIztL+c+i0X QYSQtz5vvHMLNEApjOjRQiwVA5iSg9kHBtOBLx6gFmFkXrvggTGxF1LBCJsbCFNzJT cyEcfk9ZEmamIwIir0N3mch+6KyozID0aGerTm2SXG12McF92Tpi6uRjpxidepm1LR /eW02gHvn3agGstucNgDirWPxbMwMsmufnbm+fdlFoJgIQ5lotsYF6oGx9q20wO1Jw 7EVIOpOuLkxrA== Received: from localhost (localhost [127.0.0.1]) by mail.u-boot.org (Postfix) with ESMTP id 3C442691A8 for ; Wed, 7 Jan 2026 16:47:36 -0700 (MST) X-Virus-Scanned: Debian amavis at Received: from mail.u-boot.org ([127.0.0.1]) by localhost (mail.u-boot.org [127.0.0.1]) (amavis, port 10024) with ESMTP id hjBeBiIKtexP for ; Wed, 7 Jan 2026 16:47:36 -0700 (MST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1767829656; bh=SrKjzAIsLpLGdvAdAgiJa1zpSdQQPyhFE6Lj0s0x/Dc=; h=From:To:Date:In-Reply-To:References:CC:Subject:List-Id: List-Archive:List-Help:List-Owner:List-Post:List-Subscribe: List-Unsubscribe:From; b=T0XxyqqG02UvB8ldQRXZknWlP/MpaHwTiXWMEXE3tncY8GEB79A0fPa+HvUpc7Rqo z/7MqkelIbeDg9ivy31ydPIKW2jNVWYskTXaB/Yxklr0AQxECA8zeGrOIztL+c+i0X QYSQtz5vvHMLNEApjOjRQiwVA5iSg9kHBtOBLx6gFmFkXrvggTGxF1LBCJsbCFNzJT cyEcfk9ZEmamIwIir0N3mch+6KyozID0aGerTm2SXG12McF92Tpi6uRjpxidepm1LR /eW02gHvn3agGstucNgDirWPxbMwMsmufnbm+fdlFoJgIQ5lotsYF6oGx9q20wO1Jw 7EVIOpOuLkxrA== Received: from mail.u-boot.org (localhost [127.0.0.1]) by mail.u-boot.org (Postfix) with ESMTP id 11EB569195 for ; Wed, 7 Jan 2026 16:47:36 -0700 (MST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1767829652; bh=rsG8di6MD30y25XbqX8qPT303sb/0+nmopdAtwSEPq8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=EFc8z6RMtvD56vuI5m+mJGWw1hEDTYSgx1UC8imz/JrbCnjEEIE8sGJOCZG9fztUB FbIfPeD27ee2R7Fon5T8CCHaaCHwhPLmK4OaM2oDXpGJqXJSf0oRNcsoR9MdOu8cP8 1/m7GDoJ3p1FWcFOlmhAleK3jPBtOPehOSGTIEAiUCd2xEOcAxGMmxijpdZqZUtWLC ekkbDguU+JfZ7j1Pqt22ZuT/P4mUPeyrHpcYTv/iXFKVvXvP4UEyvP5hYuQlwr3vPv HfAAGZjOUk05G0E/H2Fj9122g2jjfaeXI+l12xU9J8TGhqvDna3J8Q6ThgRKanNSY/ PVCuODSLPTtVw== Received: from localhost (localhost [127.0.0.1]) by mail.u-boot.org (Postfix) with ESMTP id 9A093691A2; Wed, 7 Jan 2026 16:47:32 -0700 (MST) X-Virus-Scanned: Debian amavis at Received: from mail.u-boot.org ([127.0.0.1]) by localhost (mail.u-boot.org [127.0.0.1]) (amavis, port 10026) with ESMTP id 2YAKlt27g71j; Wed, 7 Jan 2026 16:47:32 -0700 (MST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1767829651; bh=8pKTeYH0GLbCLXrYRpcUbiHk/kQ8q8aTPoD2F5Xjmtc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=fx0LjA6R+YMnNSUMTBQKqXHr1lCdyMBNzmaGuCFU+aGnf++3NRJcxW4bDGVhidlZ7 LTAqnv+UFahHIm3jJcS85GYQJeUsNMur55HBWPGAR4VAZ6Zkz8z7n6fwUS+0R6geu4 Nwk+8NAhbAaaCOy5zHpOjJvrZPWenRTRlmjkHmi5y3V7zG3xyHj+1FxMDD4b7DLw9f yQW8StiwSX0rSNFuE0YuKvvmaBeN4R+FQ8xFOwdlBNPrCE8F/hw3CUb2JAB8xtHAx+ OIy/Z0P7/plyxOpRpz4g1imd5inh1hzogF+YLF6czweii17Akejg5u0sOYf4erpPpI dMzp0YKQodNPQ== Received: from u-boot.org (unknown [73.34.74.121]) by mail.u-boot.org (Postfix) with ESMTPSA id 8D8AA69146; Wed, 7 Jan 2026 16:47:31 -0700 (MST) From: Simon Glass To: U-Boot Concept Date: Wed, 7 Jan 2026 16:44:19 -0700 Message-ID: <20260107234426.3508161-10-sjg@u-boot.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260107234426.3508161-1-sjg@u-boot.org> References: <20260107234426.3508161-1-sjg@u-boot.org> MIME-Version: 1.0 Message-ID-Hash: 2TCN6PM6VFLIBDI5ZYSMUJYTM6TO3IUF X-Message-ID-Hash: 2TCN6PM6VFLIBDI5ZYSMUJYTM6TO3IUF X-MailFrom: sjg@u-boot.org X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: Heinrich Schuchardt , Simon Glass , "Claude Opus 4 . 5" X-Mailman-Version: 3.3.10 Precedence: list Subject: [Concept] [PATCH 9/9] fs: ext4l: Use conversion macros in inode.c List-Id: Discussion and patches related to U-Boot Concept Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: Simon Glass Update inode.c to use the block conversion macros and other helpers to align with the Linux kernel implementation: - Add wbc_to_tag() helper to ext4_uboot.h matching the Linux kernel version from include/linux/writeback.h - Use EXT4_LBLK_TO_B() for logical block to byte conversion - Use EXT4_PG_TO_LBLK() for page index to logical block conversion - Use EXT4_LBLK_TO_PG() for logical block to page conversion - Use folio_next_pos() instead of folio_pos() + folio_size() - Use i_blocksize() instead of (1 << blkbits) - Remove now-unused blkbits and bpp_bits local variables - Add WARN_ON_ONCE() check in ext4_block_write_begin() These changes make the code more consistent with Linux and reduce the line count difference. Co-developed-by: Claude Opus 4.5 Signed-off-by: Simon Glass --- fs/ext4l/ext4_uboot.h | 7 +++++++ fs/ext4l/inode.c | 41 +++++++++++++++++------------------------ 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/fs/ext4l/ext4_uboot.h b/fs/ext4l/ext4_uboot.h index 2487d6fc70f..c013b9605a4 100644 --- a/fs/ext4l/ext4_uboot.h +++ b/fs/ext4l/ext4_uboot.h @@ -1337,6 +1337,13 @@ typedef unsigned int xa_mark_t; #define PAGECACHE_TAG_TOWRITE 1 #define PAGECACHE_TAG_WRITEBACK 2 +static inline xa_mark_t wbc_to_tag(struct writeback_control *wbc) +{ + if (wbc->sync_mode == WB_SYNC_ALL || wbc->tagged_writepages) + return PAGECACHE_TAG_TOWRITE; + return PAGECACHE_TAG_DIRTY; +} + /* blk_plug - block I/O plugging stub */ struct blk_plug { int dummy; diff --git a/fs/ext4l/inode.c b/fs/ext4l/inode.c index 12f1333660f..2c60eaefa14 100644 --- a/fs/ext4l/inode.c +++ b/fs/ext4l/inode.c @@ -1140,8 +1140,7 @@ int ext4_block_write_begin(handle_t *handle, struct folio *folio, unsigned block_start, block_end; sector_t block; int err = 0; - unsigned blocksize = inode->i_sb->s_blocksize; - unsigned bbits; + unsigned int blocksize = i_blocksize(inode); struct buffer_head *bh, *head, *wait[2]; int nr_wait = 0; int i; @@ -1150,12 +1149,12 @@ int ext4_block_write_begin(handle_t *handle, struct folio *folio, BUG_ON(!folio_test_locked(folio)); BUG_ON(to > folio_size(folio)); BUG_ON(from > to); + WARN_ON_ONCE(blocksize > folio_size(folio)); head = folio_buffers(folio); if (!head) head = create_empty_buffers(folio, blocksize, 0); - bbits = ilog2(blocksize); - block = (sector_t)folio->index << (PAGE_SHIFT - bbits); + block = EXT4_PG_TO_LBLK(inode, folio->index); for (bh = head, block_start = 0; bh != head || !block_start; block++, block_start = block_end, bh = bh->b_this_page) { @@ -1296,8 +1295,8 @@ retry_grab: if (IS_ERR(folio)) return PTR_ERR(folio); - if (pos + len > folio_pos(folio) + folio_size(folio)) - len = folio_pos(folio) + folio_size(folio) - pos; + if (len > folio_next_pos(folio) - pos) + len = folio_next_pos(folio) - pos; from = offset_in_folio(folio, pos); to = from + len; @@ -2202,7 +2201,6 @@ static int mpage_process_folio(struct mpage_da_data *mpd, struct folio *folio, ext4_lblk_t lblk = *m_lblk; ext4_fsblk_t pblock = *m_pblk; int err = 0; - int blkbits = mpd->inode->i_blkbits; ssize_t io_end_size = 0; struct ext4_io_end_vec *io_end_vec = ext4_last_io_end_vec(io_end); @@ -2228,7 +2226,8 @@ static int mpage_process_folio(struct mpage_da_data *mpd, struct folio *folio, err = PTR_ERR(io_end_vec); goto out; } - io_end_vec->offset = (loff_t)mpd->map.m_lblk << blkbits; + io_end_vec->offset = EXT4_LBLK_TO_B(mpd->inode, + mpd->map.m_lblk); } *map_bh = true; goto out; @@ -2238,7 +2237,7 @@ static int mpage_process_folio(struct mpage_da_data *mpd, struct folio *folio, bh->b_blocknr = pblock++; } clear_buffer_unwritten(bh); - io_end_size += (1 << blkbits); + io_end_size += i_blocksize(mpd->inode); } while (lblk++, (bh = bh->b_this_page) != head); io_end_vec->size += io_end_size; @@ -2268,15 +2267,14 @@ static int mpage_map_and_submit_buffers(struct mpage_da_data *mpd) struct folio_batch fbatch; unsigned nr, i; struct inode *inode = mpd->inode; - int bpp_bits = PAGE_SHIFT - inode->i_blkbits; pgoff_t start, end; ext4_lblk_t lblk; ext4_fsblk_t pblock; int err; bool map_bh = false; - start = mpd->map.m_lblk >> bpp_bits; - end = (mpd->map.m_lblk + mpd->map.m_len - 1) >> bpp_bits; + start = EXT4_LBLK_TO_PG(inode, mpd->map.m_lblk); + end = EXT4_LBLK_TO_PG(inode, mpd->map.m_lblk + mpd->map.m_len - 1); pblock = mpd->map.m_pblk; folio_batch_init(&fbatch); @@ -2287,7 +2285,7 @@ static int mpage_map_and_submit_buffers(struct mpage_da_data *mpd) for (i = 0; i < nr; i++) { struct folio *folio = fbatch.folios[i]; - lblk = folio->index << bpp_bits; + lblk = EXT4_PG_TO_LBLK(inode, folio->index); err = mpage_process_folio(mpd, folio, &lblk, &pblock, &map_bh); /* @@ -2590,16 +2588,12 @@ static int mpage_prepare_extent_to_map(struct mpage_da_data *mpd) pgoff_t end = mpd->end_pos >> PAGE_SHIFT; xa_mark_t tag; int i, err = 0; - int blkbits = mpd->inode->i_blkbits; ext4_lblk_t lblk; struct buffer_head *head; handle_t *handle = NULL; int bpp = ext4_journal_blocks_per_folio(mpd->inode); - if (mpd->wbc->sync_mode == WB_SYNC_ALL || mpd->wbc->tagged_writepages) - tag = PAGECACHE_TAG_TOWRITE; - else - tag = PAGECACHE_TAG_DIRTY; + tag = wbc_to_tag(mpd->wbc); mpd->map.m_len = 0; mpd->next_pos = mpd->start_pos; @@ -2629,7 +2623,7 @@ static int mpage_prepare_extent_to_map(struct mpage_da_data *mpd) */ if (mpd->wbc->sync_mode == WB_SYNC_NONE && mpd->wbc->nr_to_write <= - mpd->map.m_len >> (PAGE_SHIFT - blkbits)) + EXT4_LBLK_TO_PG(mpd->inode, mpd->map.m_len)) goto out; /* If we can't merge this page, we are done. */ @@ -2681,7 +2675,7 @@ static int mpage_prepare_extent_to_map(struct mpage_da_data *mpd) if (mpd->map.m_len == 0) mpd->start_pos = folio_pos(folio); - mpd->next_pos = folio_pos(folio) + folio_size(folio); + mpd->next_pos = folio_next_pos(folio); /* * Writeout when we cannot modify metadata is simple. * Just submit the page. For data=journal mode we @@ -2707,8 +2701,7 @@ static int mpage_prepare_extent_to_map(struct mpage_da_data *mpd) mpage_folio_done(mpd, folio); } else { /* Add all dirty buffers to mpd */ - lblk = ((ext4_lblk_t)folio->index) << - (PAGE_SHIFT - blkbits); + lblk = EXT4_PG_TO_LBLK(mpd->inode, folio->index); head = folio_buffers(folio); err = mpage_process_page_bufs(mpd, head, head, lblk); @@ -3123,8 +3116,8 @@ retry: if (IS_ERR(folio)) return PTR_ERR(folio); - if (pos + len > folio_pos(folio) + folio_size(folio)) - len = folio_pos(folio) + folio_size(folio) - pos; + if (len > folio_next_pos(folio) - pos) + len = folio_next_pos(folio) - pos; ret = ext4_block_write_begin(NULL, folio, pos, len, ext4_da_get_block_prep);