vfs_link(9)
π vfs_link β the Kernel API Manual tea, bestie π
okay so this is vfs_link(9) from the Kernel API Manual and it's literally the function that creates a new link. no cap, that's the whole vibe. let's get into it π
β¨ NAME β¨
vfs_link β create a new link πΈ
π¦ SYNOPSIS π¦
int vfs_link (struct dentry *old_dentry , struct mnt_idmap *idmap ,
struct inode *dir , struct dentry *new_dentry , struct delegated_inode
*delegated_inode );
π ARGUMENTS π
old_dentryβ the object to be linked, i.e. the thing we're linking from. the moment. the main character πidmapβ idmap of the mount. yes bestie it matters, keep reading πdirβ new parent. this is where the new link lives, it's giving new home energy π‘new_dentryβ where to create the new link. literally the spot πdelegated_inodeβ returns an inode needing a delegation break. dramatic, we know π
π₯ DESCRIPTION π₯
The caller must hold dir->i_rwsem exclusively. that's not optional, that's the rule, periodt π
If vfs_link discovers a delegation on the to-be-linked file in need of breaking, it will return -EWOULDBLOCK and return a reference to the inode in delegated_inode. The caller should then break the delegation and retry. Because breaking a delegation may take a long time, the caller should drop the i_rwsem before doing so. no cap, do not sit there holding the lock while you sort out your delegation drama π
Alternatively, a caller may pass NULL for delegated_inode. This may be appropriate for callers that expect the underlying filesystem not to be NFS exported. lowkey the "i don't want the extra paperwork" option β¨
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. On non-idmapped mounts or if permission checking is to be performed on the raw inode simply pass nop_mnt_idmap. so close to iconic behavior, the function handles the mapping for you π«Ά
β οΈ real talk: holddir->i_rwsemexclusively, drop it before breaking a delegation, and pick youridmapon purpose βnop_mnt_idmapif you're not idmapped or you want raw inode permission checks. iykyk.
π SEE ALSO π
Kernel file ./fs/namei.c and honestly the whole friend group:
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_symlink(9),vfs_rename(9),vfs_readlink(9),vfs_get_link(9),page_get_link(9),page_put_link(9)
they all ate, honestly π
and that's the whole page bestie π this one's from ./fs, dated October 2026 β go forth and link responsibly, mwah ππ¦
π¦ 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