| 818 | } |
| 819 | |
| 820 | int |
| 821 | vop_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 |
nothing calls this directly
no test coverage detected