| 2842 | */ |
| 2843 | |
| 2844 | int |
| 2845 | vfs_cache_lookup(struct vop_lookup_args *ap) |
| 2846 | { |
| 2847 | struct vnode *dvp; |
| 2848 | int error; |
| 2849 | struct vnode **vpp = ap->a_vpp; |
| 2850 | struct componentname *cnp = ap->a_cnp; |
| 2851 | int flags = cnp->cn_flags; |
| 2852 | |
| 2853 | *vpp = NULL; |
| 2854 | dvp = ap->a_dvp; |
| 2855 | |
| 2856 | if (dvp->v_type != VDIR) |
| 2857 | return (ENOTDIR); |
| 2858 | |
| 2859 | if ((flags & ISLASTCN) && (dvp->v_mount->mnt_flag & MNT_RDONLY) && |
| 2860 | (cnp->cn_nameiop == DELETE || cnp->cn_nameiop == RENAME)) |
| 2861 | return (EROFS); |
| 2862 | |
| 2863 | error = vn_dir_check_exec(dvp, cnp); |
| 2864 | if (error != 0) |
| 2865 | return (error); |
| 2866 | |
| 2867 | error = cache_lookup(dvp, vpp, cnp, NULL, NULL); |
| 2868 | if (error == 0) |
| 2869 | return (VOP_CACHEDLOOKUP(dvp, vpp, cnp)); |
| 2870 | if (error == -1) |
| 2871 | return (0); |
| 2872 | return (error); |
| 2873 | } |
| 2874 | |
| 2875 | /* Implementation of the getcwd syscall. */ |
| 2876 | int |
no test coverage detected