Linux EXT4 FS development
 help / color / mirror / Atom feed
* [tytso-ext4:pu 4/50] fs/ext4/xattr-test.c:1531:13: warning: stack frame size (2912) exceeds limit (2048) in 'test_xattr_credits_usage_expand_and_delete'
@ 2026-11-12  8:29 kernel test robot
  0 siblings, 0 replies; only message in thread
From: kernel test robot @ 2026-11-12  8:29 UTC (permalink / raw)
  To: Theodore Ts'o; +Cc: oe-kbuild-all, linux-ext4

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4.git pu
head:   246d715a48c25a74ac372dda5e10d8f69f89b50a
commit: 64b5dfde9364204d0284d8800174ba8bb23d963f [4/50] ext4: add KUnit tests for fs/ext4/xattr.c
config: loongarch-allyesconfig (https://download.01.org/0day-ci/archive/20261112/202611120955.8LvZI7rV-lkp@intel.com/config)
compiler: clang version 22.1.8 (https://github.com/llvm/llvm-project ca7933e47d3a3451d81e72ac174dcb5aa28b59d1)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20261112/202611120955.8LvZI7rV-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202611120955.8LvZI7rV-lkp@intel.com/

All warnings (new ones prefixed by >>):

>> fs/ext4/xattr-test.c:1531:13: warning: stack frame size (2912) exceeds limit (2048) in 'test_xattr_credits_usage_expand_and_delete' [-Wframe-larger-than]
    1531 | static void test_xattr_credits_usage_expand_and_delete(struct kunit *test)
         |             ^
   1 warning generated.


vim +/test_xattr_credits_usage_expand_and_delete +1531 fs/ext4/xattr-test.c

  1526	
  1527	/*
  1528	 * Test 10: ext4_get_inode_usage(), credit calculation, handle credit check,
  1529	 * ext4_expand_extra_isize_ea(), and ext4_xattr_delete_inode().
  1530	 */
> 1531	static void test_xattr_credits_usage_expand_and_delete(struct kunit *test)
  1532	{
  1533		struct xattr_test_ctx *ctx = test->priv;
  1534		struct inode *inode = &ctx->primary.ei.vfs_inode;
  1535		struct ext4_inode *raw = (struct ext4_inode *)ctx->primary.raw_buf;
  1536		journal_t fake_journal = {
  1537			.j_revoke_records_per_block = 64,
  1538		};
  1539		handle_t fake_handle = {
  1540			.h_reserved = 1,
  1541			.h_journal = &fake_journal,
  1542			.h_total_credits = 1,
  1543		};
  1544		const size_t large_len = 1000;
  1545		char *large_val;
  1546		char val28[28];
  1547		char buf[64];
  1548		qsize_t usage = 0;
  1549		int credits_create, credits_replace, credits_out = -1;
  1550		int ret;
  1551	
  1552		large_val = kunit_kmalloc(test, large_len, GFP_KERNEL);
  1553		KUNIT_ASSERT_NOT_NULL(test, large_val);
  1554		memset(large_val, 'L', large_len);
  1555	
  1556		/*
  1557		 * 1. Credit calculation and insufficient handle credits check
  1558		 */
  1559		credits_create = __ext4_xattr_set_credits(&ctx->sb, inode, NULL,
  1560							  100, true);
  1561		KUNIT_EXPECT_GT(test, credits_create, 0);
  1562	
  1563		ext4_set_feature_ea_inode(&ctx->sb);
  1564		credits_create = __ext4_xattr_set_credits(&ctx->sb, inode, NULL,
  1565							  1500, true);
  1566		credits_replace = __ext4_xattr_set_credits(&ctx->sb, inode, NULL,
  1567							   1500, false);
  1568		KUNIT_EXPECT_GT(test, credits_replace, credits_create);
  1569	
  1570		/* Without a journal (s_journal == NULL), credits_out is 0 */
  1571		ret = ext4_xattr_set_credits(inode, 1500, true, &credits_out);
  1572		KUNIT_EXPECT_EQ(test, ret, 0);
  1573		KUNIT_EXPECT_EQ(test, credits_out, 0);
  1574	
  1575		/* With s_journal set, ext4_xattr_set_credits() returns credits_create */
  1576		ctx->sbi.s_journal = &fake_journal;
  1577		ret = ext4_xattr_set_credits(inode, 1500, true, &credits_out);
  1578		ctx->sbi.s_journal = NULL;
  1579		KUNIT_EXPECT_EQ(test, ret, 0);
  1580		KUNIT_EXPECT_EQ(test, credits_out, credits_create);
  1581	
  1582		/* Handle with only 1 buffer credit (< credits) fails with -ENOSPC */
  1583		ret = ext4_xattr_set_handle(&fake_handle, inode, EXT4_XATTR_INDEX_USER,
  1584					    "k", "v", 1, XATTR_CREATE);
  1585		KUNIT_EXPECT_EQ(test, ret, -ENOSPC);
  1586	
  1587		/*
  1588		 * 2. ext4_expand_extra_isize_ea():
  1589		 * Put "keep" (4B -> 24B total) and "evict" (28B -> 52B total) in
  1590		 * ibody (88B usable, leaving 12B free).
  1591		 * First expand i_extra_isize from 32 -> 40 (8 bytes <= 12B free):
  1592		 * shifts ibody entries in-place without allocating an external block.
  1593		 * Then expand i_extra_isize from 40 -> 72 (32 bytes > 4B free):
  1594		 * "keep" (24 + 4 = 28 < 32) is too small alone, so "evict" (52 + 4 >= 32)
  1595		 * is moved to an external xattr block while "keep" stays in ibody!
  1596		 */
  1597		ext4_clear_feature_ea_inode(&ctx->sb);
  1598		ret = ext4_xattr_set(inode, EXT4_XATTR_INDEX_USER, "keep",
  1599				     "1234", 4, XATTR_CREATE);
  1600		KUNIT_ASSERT_EQ(test, ret, 0);
  1601		memset(val28, 'E', sizeof(val28));
  1602		ret = ext4_xattr_set(inode, EXT4_XATTR_INDEX_USER, "evict",
  1603				     val28, sizeof(val28), XATTR_CREATE);
  1604		KUNIT_ASSERT_EQ(test, ret, 0);
  1605		KUNIT_EXPECT_EQ(test, EXT4_I(inode)->i_file_acl, 0ULL);
  1606	
  1607		/* In-place ibody shift (32 -> 40) */
  1608		ret = ext4_expand_extra_isize_ea(inode, 40, raw, NULL);
  1609		KUNIT_ASSERT_EQ(test, ret, 0);
  1610		KUNIT_EXPECT_EQ(test, EXT4_I(inode)->i_extra_isize, (u16)40);
  1611		KUNIT_EXPECT_EQ(test, EXT4_I(inode)->i_file_acl, 0ULL);
  1612	
  1613		/* Eviction of "evict" to external block (40 -> 72) */
  1614		ret = ext4_expand_extra_isize_ea(inode, 72, raw, NULL);
  1615		KUNIT_ASSERT_EQ(test, ret, 0);
  1616		KUNIT_EXPECT_EQ(test, EXT4_I(inode)->i_extra_isize, (u16)72);
  1617		KUNIT_EXPECT_NE(test, EXT4_I(inode)->i_file_acl, 0ULL);
  1618	
  1619		/* Both "keep" (in ibody) and "evict" (in external block) remain readable */
  1620		KUNIT_EXPECT_EQ(test,
  1621				ext4_xattr_ibody_get(inode, EXT4_XATTR_INDEX_USER,
  1622						     "keep", buf, sizeof(buf)),
  1623				4);
  1624		KUNIT_EXPECT_EQ(test,
  1625				ext4_xattr_get(inode, EXT4_XATTR_INDEX_USER,
  1626					       "evict", buf, sizeof(buf)),
  1627				28);
  1628	
  1629		/*
  1630		 * 3. ext4_get_inode_usage() and ext4_xattr_delete_inode():
  1631		 * Add a 1000-byte EA inode attribute ("large_ea") and check that
  1632		 * ext4_get_inode_usage() accounts for 1 (parent inode) + 1 (EA inode)
  1633		 * = 2 inodes, and ext4_xattr_delete_inode() frees the external block
  1634		 * and drops the EA inode reference to 0.
  1635		 */
  1636		ext4_set_feature_ea_inode(&ctx->sb);
  1637		ret = ext4_xattr_set(inode, EXT4_XATTR_INDEX_USER, "large_ea",
  1638				     large_val, large_len, XATTR_CREATE);
  1639		KUNIT_ASSERT_EQ(test, ret, 0);
  1640	
  1641		down_read(&EXT4_I(inode)->xattr_sem);
  1642		ret = ext4_get_inode_usage(inode, &usage);
  1643		up_read(&EXT4_I(inode)->xattr_sem);
  1644		KUNIT_ASSERT_EQ(test, ret, 0);
  1645		KUNIT_EXPECT_EQ(test, usage, (qsize_t)2);
  1646	
  1647		ret = ext4_xattr_delete_inode(NULL, inode, 0);
  1648		KUNIT_ASSERT_EQ(test, ret, 0);
  1649		KUNIT_EXPECT_EQ(test, EXT4_I(inode)->i_file_acl, 0ULL);
  1650		KUNIT_EXPECT_EQ(test, ctx->ea_inodes[0].ei.vfs_inode.i_nlink, 0U);
  1651	}
  1652	

--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2026-11-12  8:30 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-11-12  8:29 [tytso-ext4:pu 4/50] fs/ext4/xattr-test.c:1531:13: warning: stack frame size (2912) exceeds limit (2048) in 'test_xattr_credits_usage_expand_and_delete' kernel test robot

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox