]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ext4: specify the free pointer offset for ext4_inode_cache
authorHarry Yoo <harry.yoo@oracle.com>
Tue, 13 Jan 2026 06:18:39 +0000 (15:18 +0900)
committerVlastimil Babka <vbabka@suse.cz>
Wed, 4 Feb 2026 09:05:35 +0000 (10:05 +0100)
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>
fs/ext4/super.c

index 87205660c5d026c3a73a64788757c288a03eaa5f..6f1c2c4978716de2d0f2bf25c6efaea8a0e48857 100644 (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;