Changeset View
Changeset View
Standalone View
Standalone View
sys/fs/unionfs/union_vnops.c
Show First 20 Lines • Show All 1,692 Lines • ▼ Show 20 Lines | unionfs_getwritemount(struct vop_getwritemount_args *ap) | ||||
error = 0; | error = 0; | ||||
vp = ap->a_vp; | vp = ap->a_vp; | ||||
if (vp == NULLVP || (vp->v_mount->mnt_flag & MNT_RDONLY)) | if (vp == NULLVP || (vp->v_mount->mnt_flag & MNT_RDONLY)) | ||||
return (EACCES); | return (EACCES); | ||||
KASSERT_UNIONFS_VNODE(vp); | KASSERT_UNIONFS_VNODE(vp); | ||||
if ((ap->a_flags & V_NONBLOCKING) != 0) { | |||||
uvp = UNIONFSVPTOUPPERVP(vp); | uvp = UNIONFSVPTOUPPERVP(vp); | ||||
if (uvp == NULLVP && VREG == vp->v_type) | if (uvp == NULLVP && VREG == vp->v_type) | ||||
uvp = UNIONFSVPTOUPPERVP(VTOUNIONFS(vp)->un_dvp); | uvp = UNIONFSVPTOUPPERVP(VTOUNIONFS(vp)->un_dvp); | ||||
if (uvp == NULLVP) { | |||||
error = EAGAIN; | |||||
goto out; | |||||
} | |||||
error = VOP_GETWRITEMOUNT(uvp, ap->a_mpp, ap->a_flags); | |||||
goto out; | |||||
} | |||||
uvp = UNIONFSVPTOUPPERVP(vp); | |||||
if (uvp == NULLVP && VREG == vp->v_type) | |||||
uvp = UNIONFSVPTOUPPERVP(VTOUNIONFS(vp)->un_dvp); | |||||
if (uvp != NULLVP) | if (uvp != NULLVP) | ||||
error = VOP_GETWRITEMOUNT(uvp, ap->a_mpp); | error = VOP_GETWRITEMOUNT(uvp, ap->a_mpp, ap->a_flags); | ||||
else { | else { | ||||
VI_LOCK(vp); | VI_LOCK(vp); | ||||
if (vp->v_iflag & VI_FREE) | if (vp->v_iflag & VI_FREE) | ||||
error = EOPNOTSUPP; | error = EOPNOTSUPP; | ||||
else | else | ||||
error = EACCES; | error = EACCES; | ||||
VI_UNLOCK(vp); | VI_UNLOCK(vp); | ||||
} | } | ||||
out: | |||||
UNIONFS_INTERNAL_DEBUG("unionfs_getwritemount: leave (%d)\n", error); | UNIONFS_INTERNAL_DEBUG("unionfs_getwritemount: leave (%d)\n", error); | ||||
return (error); | return (error); | ||||
} | } | ||||
static int | static int | ||||
unionfs_inactive(struct vop_inactive_args *ap) | unionfs_inactive(struct vop_inactive_args *ap) | ||||
{ | { | ||||
▲ Show 20 Lines • Show All 835 Lines • Show Last 20 Lines |