Commit 43d9bb42 authored by Harry Yoo's avatar Harry Yoo Committed by Vlastimil Babka
Browse files

ext4: specify the free pointer offset for ext4_inode_cache



Convert ext4_inode_cache to use the kmem_cache_args interface and
specify a free pointer offset.

Since ext4_inode_cache uses a constructor, the free pointer would be
placed after the object to prevent overwriting fields used by the
constructor.

However, some fields such as ->i_flags are not used by the constructor
and can safely be repurposed for the free pointer.

Specify the free pointer offset at i_flags to reduce the object size.

Signed-off-by: default avatarHarry Yoo <harry.yoo@oracle.com>
Link: https://patch.msgid.link/20260113061845.159790-4-harry.yoo@oracle.com


Signed-off-by: default avatarVlastimil Babka <vbabka@suse.cz>
parent a13b68d7
Loading
Loading
Loading
Loading
+13 −6
Original line number Diff line number Diff line
@@ -1491,12 +1491,19 @@ static void init_once(void *foo)

static int __init init_inodecache(void)
{
	ext4_inode_cachep = kmem_cache_create_usercopy("ext4_inode_cache",
				sizeof(struct ext4_inode_info), 0,
				SLAB_RECLAIM_ACCOUNT | SLAB_ACCOUNT,
				offsetof(struct ext4_inode_info, i_data),
				sizeof_field(struct ext4_inode_info, i_data),
				init_once);
	struct kmem_cache_args args = {
		.useroffset = offsetof(struct ext4_inode_info, i_data),
		.usersize = sizeof_field(struct ext4_inode_info, i_data),
		.use_freeptr_offset = true,
		.freeptr_offset = offsetof(struct ext4_inode_info, i_flags),
		.ctor = init_once,
	};

	ext4_inode_cachep = kmem_cache_create("ext4_inode_cache",
				sizeof(struct ext4_inode_info),
				&args,
				SLAB_RECLAIM_ACCOUNT | SLAB_ACCOUNT);

	if (ext4_inode_cachep == NULL)
		return -ENOMEM;
	return 0;