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: Harry Yoo <harry.yoo@oracle.com>
Link: https://patch.msgid.link/20260113061845.159790-4-harry.yoo@oracle.com
Signed-off-by: Vlastimil Babka <vbabka@suse.cz>
This commit is contained in:
Harry Yoo 2026-01-13 15:18:39 +09:00 committed by Vlastimil Babka
parent a13b68d79d
commit 43d9bb4236

View file

@ -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;