ext4: kunit: use dynamic inode allocation
authorArnd Bergmann <arnd@arndb.de>
Tue, 27 Feb 2024 16:15:39 +0000 (17:15 +0100)
committerTheodore Ts'o <tytso@mit.edu>
Thu, 7 Mar 2024 18:32:54 +0000 (13:32 -0500)
Storing an inode structure on the stack pushes some functions over the warning
limit for stack frame size:

In file included from fs/ext4/mballoc.c:7039:
fs/ext4/mballoc-test.c:506:13: error: stack frame size (1032) exceeds limit (1024) in 'test_mark_diskspace_used' [-Werror,-Wframe-larger-than]
  506 | static void test_mark_diskspace_used(struct kunit *test)
      |             ^

Use kunit_kzalloc() for all inodes. There may be a better way to do it by
preallocating the inode, which would result in a larger rework.

Fixes: 2b81493f8eb6 ("ext4: Add unit test for ext4_mb_mark_diskspace_used")
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Reviewed-by: Kemeng Shi <shikemeng@huaweicloud.com>
Link: https://lore.kernel.org/r/20240227161548.2929881-1-arnd@kernel.org
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
fs/ext4/mballoc-test.c

index 12d0b22cabe1f02c21e74daadcfb0387fd775c45..3b43301054b6afa057cde96e08a2764023b8eccb 100644 (file)
@@ -332,14 +332,19 @@ static void mbt_kunit_exit(struct kunit *test)
 static void test_new_blocks_simple(struct kunit *test)
 {
        struct super_block *sb = (struct super_block *)test->priv;
-       struct inode inode = { .i_sb = sb, };
+       struct inode *inode;
        struct ext4_allocation_request ar;
        ext4_group_t i, goal_group = TEST_GOAL_GROUP;
        int err = 0;
        ext4_fsblk_t found;
        struct ext4_sb_info *sbi = EXT4_SB(sb);
 
-       ar.inode = &inode;
+       inode = kunit_kzalloc(test, sizeof(*inode), GFP_KERNEL);
+       if (!inode)
+               return;
+
+       inode->i_sb = sb;
+       ar.inode = inode;
 
        /* get block at goal */
        ar.goal = ext4_group_first_block_no(sb, goal_group);
@@ -441,15 +446,20 @@ test_free_blocks_simple_range(struct kunit *test, ext4_group_t goal_group,
 {
        struct super_block *sb = (struct super_block *)test->priv;
        struct ext4_sb_info *sbi = EXT4_SB(sb);
-       struct inode inode = { .i_sb = sb, };
+       struct inode *inode;
        ext4_fsblk_t block;
 
+       inode = kunit_kzalloc(test, sizeof(*inode), GFP_KERNEL);
+       if (!inode)
+               return;
+       inode->i_sb = sb;
+
        if (len == 0)
                return;
 
        block = ext4_group_first_block_no(sb, goal_group) +
                EXT4_C2B(sbi, start);
-       ext4_free_blocks_simple(&inode, block, len);
+       ext4_free_blocks_simple(inode, block, len);
        validate_free_blocks_simple(test, sb, goal_group, start, len);
        mbt_ctx_mark_used(sb, goal_group, 0, EXT4_CLUSTERS_PER_GROUP(sb));
 }
@@ -506,16 +516,21 @@ test_mark_diskspace_used_range(struct kunit *test,
 static void test_mark_diskspace_used(struct kunit *test)
 {
        struct super_block *sb = (struct super_block *)test->priv;
-       struct inode inode = { .i_sb = sb, };
+       struct inode *inode;
        struct ext4_allocation_context ac;
        struct test_range ranges[TEST_RANGE_COUNT];
        int i;
 
        mbt_generate_test_ranges(sb, ranges, TEST_RANGE_COUNT);
 
+       inode = kunit_kzalloc(test, sizeof(*inode), GFP_KERNEL);
+       if (!inode)
+               return;
+       inode->i_sb = sb;
+
        ac.ac_status = AC_STATUS_FOUND;
        ac.ac_sb = sb;
-       ac.ac_inode = &inode;
+       ac.ac_inode = inode;
        for (i = 0; i < TEST_RANGE_COUNT; i++)
                test_mark_diskspace_used_range(test, &ac, ranges[i].start,
                                               ranges[i].len);