]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
ext4: support large block size in ext4_block_write_begin()
authorBaokun Li <libaokun1@huawei.com>
Fri, 21 Nov 2025 09:06:47 +0000 (17:06 +0800)
committerTheodore Ts'o <tytso@mit.edu>
Sat, 29 Nov 2025 03:35:27 +0000 (22:35 -0500)
Use the EXT4_PG_TO_LBLK() macro to convert folio indexes to blocks to avoid
negative left shifts after supporting blocksize greater than PAGE_SIZE.

Signed-off-by: Baokun Li <libaokun1@huawei.com>
Reviewed-by: Zhang Yi <yi.zhang@huawei.com>
Reviewed-by: Jan Kara <jack@suse.cz>
Reviewed-by: Ojaswin Mujoo <ojaswin@linux.ibm.com>
Message-ID: <20251121090654.631996-18-libaokun@huaweicloud.com>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
fs/ext4/inode.c

index 29259e10d78ec8deb6579849dd3e9f72f6d145bd..269c1ded169b6778b4edc65862f631fa55de5230 100644 (file)
@@ -1170,8 +1170,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;
@@ -1180,12 +1179,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) {