MCPcopy Create free account
hub / github.com/F-Stack/f-stack / kern_mkdirat

Function kern_mkdirat

freebsd/kern/vfs_syscalls.c:3749–3792  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

3747}
3748
3749int
3750kern_mkdirat(struct thread *td, int fd, const char *path, enum uio_seg segflg,
3751 int mode)
3752{
3753 struct mount *mp;
3754 struct vattr vattr;
3755 struct nameidata nd;
3756 int error;
3757
3758 AUDIT_ARG_MODE(mode);
3759restart:
3760 bwillwrite();
3761 NDINIT_ATRIGHTS(&nd, CREATE, LOCKPARENT | SAVENAME | AUDITVNODE1 |
3762 NC_NOMAKEENTRY | NC_KEEPPOSENTRY | FAILIFEXISTS | WILLBEDIR,
3763 segflg, path, fd, &cap_mkdirat_rights, td);
3764 if ((error = namei(&nd)) != 0)
3765 return (error);
3766 if (vn_start_write(nd.ni_dvp, &mp, V_NOWAIT) != 0) {
3767 NDFREE(&nd, NDF_ONLY_PNBUF);
3768 vput(nd.ni_dvp);
3769 if ((error = vn_start_write(NULL, &mp, V_XSLEEP | PCATCH)) != 0)
3770 return (error);
3771 goto restart;
3772 }
3773 VATTR_NULL(&vattr);
3774 vattr.va_type = VDIR;
3775 vattr.va_mode = (mode & ACCESSPERMS) &~ td->td_proc->p_pd->pd_cmask;
3776#ifdef MAC
3777 error = mac_vnode_check_create(td->td_ucred, nd.ni_dvp, &nd.ni_cnd,
3778 &vattr);
3779 if (error != 0)
3780 goto out;
3781#endif
3782 error = VOP_MKDIR(nd.ni_dvp, &nd.ni_vp, &nd.ni_cnd, &vattr);
3783#ifdef MAC
3784out:
3785#endif
3786 NDFREE(&nd, NDF_ONLY_PNBUF);
3787 VOP_VPUT_PAIR(nd.ni_dvp, error == 0 ? &nd.ni_vp : NULL, true);
3788 vn_finished_write(mp);
3789 if (error == ERELOOKUP)
3790 goto restart;
3791 return (error);
3792}
3793
3794/*
3795 * Remove a directory file.

Callers 2

sys_mkdirFunction · 0.85
sys_mkdiratFunction · 0.85

Calls 7

nameiFunction · 0.85
vn_start_writeFunction · 0.85
NDFREEFunction · 0.85
vputFunction · 0.85
mac_vnode_check_createFunction · 0.85
vn_finished_writeFunction · 0.85
bwillwriteFunction · 0.70

Tested by

no test coverage detected