| Message ID | 20251107144249.435029-8-libaokun@huaweicloud.com |
|---|---|
| State | Superseded |
| Headers | show |
| Series | ext4: enable block size larger than page size | expand |
On Fri 07-11-25 22:42:32, libaokun@huaweicloud.com wrote: > From: Baokun Li <libaokun1@huawei.com> > > ext4_calculate_overhead() used a single page for its bitmap buffer, which > worked fine when PAGE_SIZE >= block size. However, with block size greater > than page size (BS > PS) support, the bitmap can exceed a single page. > > To address this, we now use kvmalloc() to allocate memory of the filesystem > block size, to properly support BS > PS. > > Suggested-by: Jan Kara <jack@suse.cz> > Signed-off-by: Baokun Li <libaokun1@huawei.com> > Reviewed-by: Zhang Yi <yi.zhang@huawei.com> Looks good. Feel free to add: Reviewed-by: Jan Kara <jack@suse.cz> Honza > --- > fs/ext4/super.c | 6 +++--- > 1 file changed, 3 insertions(+), 3 deletions(-) > > diff --git a/fs/ext4/super.c b/fs/ext4/super.c > index a6314a3de51d..0d32370a459a 100644 > --- a/fs/ext4/super.c > +++ b/fs/ext4/super.c > @@ -4189,7 +4189,7 @@ int ext4_calculate_overhead(struct super_block *sb) > unsigned int j_blocks, j_inum = le32_to_cpu(es->s_journal_inum); > ext4_group_t i, ngroups = ext4_get_groups_count(sb); > ext4_fsblk_t overhead = 0; > - char *buf = (char *) get_zeroed_page(GFP_NOFS); > + char *buf = kvmalloc(sb->s_blocksize, GFP_NOFS | __GFP_ZERO); > > if (!buf) > return -ENOMEM; > @@ -4214,7 +4214,7 @@ int ext4_calculate_overhead(struct super_block *sb) > blks = count_overhead(sb, i, buf); > overhead += blks; > if (blks) > - memset(buf, 0, PAGE_SIZE); > + memset(buf, 0, sb->s_blocksize); > cond_resched(); > } > > @@ -4237,7 +4237,7 @@ int ext4_calculate_overhead(struct super_block *sb) > } > sbi->s_overhead = overhead; > smp_wmb(); > - free_page((unsigned long) buf); > + kvfree(buf); > return 0; > } > > -- > 2.46.1 >
diff --git a/fs/ext4/super.c b/fs/ext4/super.c index a6314a3de51d..0d32370a459a 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c @@ -4189,7 +4189,7 @@ int ext4_calculate_overhead(struct super_block *sb) unsigned int j_blocks, j_inum = le32_to_cpu(es->s_journal_inum); ext4_group_t i, ngroups = ext4_get_groups_count(sb); ext4_fsblk_t overhead = 0; - char *buf = (char *) get_zeroed_page(GFP_NOFS); + char *buf = kvmalloc(sb->s_blocksize, GFP_NOFS | __GFP_ZERO); if (!buf) return -ENOMEM; @@ -4214,7 +4214,7 @@ int ext4_calculate_overhead(struct super_block *sb) blks = count_overhead(sb, i, buf); overhead += blks; if (blks) - memset(buf, 0, PAGE_SIZE); + memset(buf, 0, sb->s_blocksize); cond_resched(); } @@ -4237,7 +4237,7 @@ int ext4_calculate_overhead(struct super_block *sb) } sbi->s_overhead = overhead; smp_wmb(); - free_page((unsigned long) buf); + kvfree(buf); return 0; }