vfs_symlink(9)
π« vfs_symlink(9) π«
okay so bestie, you've stumbled into the Kernel API Manual and we're talking about vfs_symlink(9) β the kernel-level glow-up that makes a symlink happen β¨ grab a strawberry drink, this one's actually not that deep π
πΈ NAME πΈ
vfs_symlink β literally just: create symlink π
π¦ SYNOPSIS π¦
int vfs_symlink (struct mnt_idmap *idmap , struct inode *dir , struct
dentry *dentry , const char *oldname , struct delegated_inode
*delegated_inode );
π ARGUMENTS π
idmapβ the idmap of the mount the inode was found from πΊοΈdirβ the inode of the parent directory (the mom of the situation, fr)dentryβ the dentry of the child symlink file πΆoldnameβ the name of the file to link to. that's your target, the main character the symlink points at πdelegated_inodeβ returns the victim inode, if the inode is delegated π yes, "victim" is the actual word, ngl that's giving dramatic
β¨ DESCRIPTION β¨
Create a symlink. that's it. that's the whole vibe check. π«Ά
but okay, here's the part where you actually gotta pay attention, so no scrolling past me:
If the inode has been found through an idmapped mount, the idmap of the vfsmount must be passed through idmap. This function will then take care to map the inode according to idmap before checking permissions π like it handles the translation for you, very generous of it.
On non-idmapped mounts β or if permission checking is to be performed on the raw inode β simply pass nop_mnt_idmap. no cap, that's the move π
bestie pls don't pass the wrong idmap. it's not giving "oopsie", it's giving "permission checking on the wrong inode" π
π SEE ALSO π
Kernel file ./fs/namei.c β and the whole friend group, in order, because we don't do partial lists here π
check_acl(9)acl_permission_check(9)generic_permission(9)do_inode_permission(9)sb_permission(9)inode_permission(9)path_get(9)path_put(9)path_connected(9)try_to_unlazy(9)try_to_unlazy_next(9)complete_walk(9)may_follow_link(9)safe_hardlink_source(9)may_linkat(9)may_create_in_sticky(9)lookup_fast(9)start_dirop(9)end_dirop(9)kern_path_parent(9)vfs_path_parent_lookup(9)vfs_path_lookup(9)try_lookup_noperm(9)lookup_noperm(9)lookup_one(9)lookup_one_unlocked(9)lookup_one_positive_killable(9)lookup_one_positive_unlocked(9)lookup_noperm_unlocked(9)start_creating(9)start_removing(9)start_creating_killable(9)start_removing_killable(9)start_creating_noperm(9)start_removing_noperm(9)start_creating_dentry(9)start_removing_dentry(9)__start_renaming(9)start_renaming(9)start_renaming_dentry(9)start_renaming_two_dentries(9)vfs_prepare_mode(9)vfs_create(9)atomic_open(9)vfs_lookup_open(9)vfs_tmpfile(9)kernel_tmpfile_open(9)end_creating_path(9)dentry_create(9)vfs_mknod(9)vfs_mkdir(9)vfs_rmdir(9)vfs_unlink(9)vfs_link(9)vfs_rename(9)vfs_readlink(9)vfs_get_link(9)page_get_link(9)page_put_link(9)
okay that's the whole page, you ate that π this little gem lives in ./fs, October 2026, and yes β it's vfs_symlink(9), no notes, iconic behavior, periodt ππ¦ mwah, go create some symlinks responsibly β¨
π¦ where this page comes from
- nixpkgs unstable: linux-manual 7.3.1
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms