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

Function vop_stdvptocnp

freebsd/kern/vfs_default.c:820–945  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

818}
819
820int
821vop_stdvptocnp(struct vop_vptocnp_args *ap)
822{
823 struct vnode *vp = ap->a_vp;
824 struct vnode **dvp = ap->a_vpp;
825 struct ucred *cred;
826 char *buf = ap->a_buf;
827 size_t *buflen = ap->a_buflen;
828 char *dirbuf, *cpos;
829 int i, error, eofflag, dirbuflen, flags, locked, len, covered;
830 off_t off;
831 ino_t fileno;
832 struct vattr va;
833 struct nameidata nd;
834 struct thread *td;
835 struct dirent *dp;
836 struct vnode *mvp;
837
838 i = *buflen;
839 error = 0;
840 covered = 0;
841 td = curthread;
842 cred = td->td_ucred;
843
844 if (vp->v_type != VDIR)
845 return (ENOENT);
846
847 error = VOP_GETATTR(vp, &va, cred);
848 if (error)
849 return (error);
850
851 VREF(vp);
852 locked = VOP_ISLOCKED(vp);
853 VOP_UNLOCK(vp);
854 NDINIT_ATVP(&nd, LOOKUP, FOLLOW | LOCKSHARED | LOCKLEAF, UIO_SYSSPACE,
855 "..", vp, td);
856 flags = FREAD;
857 error = vn_open_cred(&nd, &flags, 0, VN_OPEN_NOAUDIT, cred, NULL);
858 if (error) {
859 vn_lock(vp, locked | LK_RETRY);
860 return (error);
861 }
862 NDFREE(&nd, NDF_ONLY_PNBUF);
863
864 mvp = *dvp = nd.ni_vp;
865
866 if (vp->v_mount != (*dvp)->v_mount &&
867 ((*dvp)->v_vflag & VV_ROOT) &&
868 ((*dvp)->v_mount->mnt_flag & MNT_UNION)) {
869 *dvp = (*dvp)->v_mount->mnt_vnodecovered;
870 VREF(mvp);
871 VOP_UNLOCK(mvp);
872 vn_close(mvp, FREAD, cred, td);
873 VREF(*dvp);
874 vn_lock(*dvp, LK_SHARED | LK_RETRY);
875 covered = 1;
876 }
877

Callers

nothing calls this directly

Calls 12

VOP_GETATTRFunction · 0.85
vn_open_credFunction · 0.85
vn_lockFunction · 0.85
NDFREEFunction · 0.85
mallocFunction · 0.85
get_next_direntFunction · 0.85
dirent_existsFunction · 0.85
vputFunction · 0.85
vn_closeFunction · 0.70
freeFunction · 0.70
vrefFunction · 0.70
vreleFunction · 0.70

Tested by

no test coverage detected