Re: [PATCH] initramfs: Reduce hardlink hash allocation sizes

From: Jan Kara

Date: Tue Sep 22 2026 - 06:07:06 EST


On Sat 19-09-26 23:39:00, Thorsten Blum wrote:
> Each hardlink hash entry reserves N_ALIGN(PATH_MAX) bytes for its name.
> This makes every allocation larger than 4 KiB, placing it in the
> kmalloc-8k bucket even for short names.
>
> Use a flexible array with the already validated cpio name_len to reduce
> allocation sizes.
>
> Also use const for the read-only name parameter.
>
> Signed-off-by: Thorsten Blum <blum@xxxxxxxxxx>

...

> @@ -106,14 +106,15 @@ static char __init *find_link(int major, int minor, int ino,
> continue;
> return (*p)->name;
> }
> - q = kmalloc_obj(struct hash);
> +
> + q = kmalloc_flex(struct hash, name, nlen);
> if (!q)
> panic_show_mem("can't allocate link hash entry");
> q->major = major;
> q->minor = minor;
> q->ino = ino;
> q->mode = mode;
> - strscpy(q->name, name);
> + strscpy(q->name, name, nlen);
> q->next = NULL;
> *p = q;
> hardlink_seen = true;

What about the space for terminating \0 ? This way the stored 'name' will
be actually one character shorter because strscpy() will overwrite the last
character by \0. Or do I miss something?

Honza

> @@ -355,7 +356,7 @@ static void __init clean_path(char *path, umode_t fmode)
> static int __init maybe_link(void)
> {
> if (nlink >= 2) {
> - char *old = find_link(major, minor, ino, mode, collected);
> + char *old = find_link(major, minor, ino, mode, collected, name_len);
> if (old) {
> clean_path(collected, 0);
> return (init_link(old, collected) < 0) ? -1 : 1;
--
Jan Kara <jack@xxxxxxxx>
SUSE Labs, CR