[PATCH] erofs: use inode_set_cached_link()
Hongbo Li
lihongbo22 at huawei.com
Wed Jan 28 18:16:08 AEDT 2026
On 2026/1/28 12:58, Gao Xiang wrote:
> Symlink lengths are now cached in in-memory inodes directly so that
> readlink can be sped up.
>
> Signed-off-by: Gao Xiang <hsiangkao at linux.alibaba.com>
Reviewed-by: Hongbo Li <lihongbo22 at huawei.com>
Thanks,
Hongbo
> ---
> fs/erofs/inode.c | 28 +++++++++++++++-------------
> 1 file changed, 15 insertions(+), 13 deletions(-)
>
> diff --git a/fs/erofs/inode.c b/fs/erofs/inode.c
> index 2e02d4b466ce..6afe487eb9be 100644
> --- a/fs/erofs/inode.c
> +++ b/fs/erofs/inode.c
> @@ -8,21 +8,23 @@
> #include <linux/compat.h>
> #include <trace/events/erofs.h>
>
> -static int erofs_fill_symlink(struct inode *inode, void *kaddr,
> - unsigned int m_pofs)
> +static int erofs_fill_symlink(struct inode *inode, void *bptr, unsigned int ofs)
> {
> struct erofs_inode *vi = EROFS_I(inode);
> - loff_t off;
> -
> - m_pofs += vi->xattr_isize;
> - /* check if it cannot be handled with fast symlink scheme */
> - if (vi->datalayout != EROFS_INODE_FLAT_INLINE ||
> - check_add_overflow(m_pofs, inode->i_size, &off) ||
> - off > i_blocksize(inode))
> - return 0;
> -
> - inode->i_link = kmemdup_nul(kaddr + m_pofs, inode->i_size, GFP_KERNEL);
> - return inode->i_link ? 0 : -ENOMEM;
> + char *link;
> + loff_t end;
> +
> + ofs += vi->xattr_isize;
> + /* check whether the symlink data is small enough to be inlined */
> + if (vi->datalayout == EROFS_INODE_FLAT_INLINE &&
> + !check_add_overflow(ofs, inode->i_size, &end) &&
> + end <= i_blocksize(inode)) {
> + link = kmemdup_nul(bptr + ofs, inode->i_size, GFP_KERNEL);
> + if (!link)
> + return -ENOMEM;
> + inode_set_cached_link(inode, link, inode->i_size);
> + }
> + return 0;
> }
>
> static int erofs_read_inode(struct inode *inode)
More information about the Linux-erofs
mailing list