may_create_in_sticky(9)
π may_create_in_sticky(9) π
okay so this is a page from the Kernel API Manual (yes, the kernel has lore, and yes, it's iconic) β and it's about the bouncer at the door of your sticky directories π
β¨ NAME β¨
may_create_in_sticky β bestie, this is the little function that decides whether an O_CREAT open in a sticky directory should be allowed, or not, on files that already exist. vibe check for file creation, basically π
πΈ SYNOPSIS πΈ
int may_create_in_sticky (struct mnt_idmap *idmap , struct nameidata *nd
, struct inode *const inode );
π¦ ARGUMENTS π¦
idmapβ the idmap of the mount the inode was found from π«Άndβ thenameidatapathwalk data, i.e. all the path-walking loreinodeβ the inode of the file to open, the main character of this whole situation
π DESCRIPTION π
so the way this works is it blocks an O_CREAT open of a FIFO (or a regular file) when all of these are true, no cap:
sysctl_protected_fifos(orsysctl_protected_regular) is enabled β- the file already exists
- we are in a sticky directory π
- we don't own the file
- the owner of the directory doesn't own the file
- the directory is world writable
and here's the plot twist π β if sysctl_protected_fifos (or sysctl_protected_regular) is set to 2, the directory doesn't have to be world writable: being group writable will be enough. noted, periodt.
also, 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, which is honestly so thoughtful of it π. on non-idmapped mounts, or if permission checking is to be performed on the raw inode, simply pass nop_mnt_idmap.
returns0if the open is allowed,-veon error. that's it, that's the return π
π SEE ALSO π
Kernel file ./fs/namei.c β and here's the whole friend group, all of them, in order, because we don't leave anyone out π«Ά:
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)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_link(9)vfs_rename(9)vfs_readlink(9)vfs_get_link(9)page_get_link(9)page_put_link(9)
and that's the page, bestie β¨ it came from ./fs, dated October 2026 β so yeah, technically from the future, which is very main character energy of it ππ
π¦ 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