Changeset View
Changeset View
Standalone View
Standalone View
sys/vm/vm_mmap.c
Show First 20 Lines • Show All 1,196 Lines • ▼ Show 20 Lines | vm_mmap_vnode(struct thread *td, vm_size_t objsize, | ||||
vm_prot_t prot, vm_prot_t *maxprotp, int *flagsp, | vm_prot_t prot, vm_prot_t *maxprotp, int *flagsp, | ||||
struct vnode *vp, vm_ooffset_t *foffp, vm_object_t *objp, | struct vnode *vp, vm_ooffset_t *foffp, vm_object_t *objp, | ||||
boolean_t *writecounted) | boolean_t *writecounted) | ||||
{ | { | ||||
struct vattr va; | struct vattr va; | ||||
vm_object_t obj; | vm_object_t obj; | ||||
vm_ooffset_t foff; | vm_ooffset_t foff; | ||||
struct ucred *cred; | struct ucred *cred; | ||||
int error, flags, locktype; | int error, flags; | ||||
bool writex; | |||||
cred = td->td_ucred; | cred = td->td_ucred; | ||||
if ((*maxprotp & VM_PROT_WRITE) && (*flagsp & MAP_SHARED)) | writex = (*maxprotp & VM_PROT_WRITE) != 0 && | ||||
locktype = LK_EXCLUSIVE; | (*flagsp & MAP_SHARED) != 0; | ||||
else | if ((error = vget(vp, LK_SHARED, td)) != 0) | ||||
locktype = LK_SHARED; | |||||
if ((error = vget(vp, locktype, td)) != 0) | |||||
return (error); | return (error); | ||||
AUDIT_ARG_VNODE1(vp); | AUDIT_ARG_VNODE1(vp); | ||||
foff = *foffp; | foff = *foffp; | ||||
flags = *flagsp; | flags = *flagsp; | ||||
obj = vp->v_object; | obj = vp->v_object; | ||||
if (vp->v_type == VREG) { | if (vp->v_type == VREG) { | ||||
/* | /* | ||||
* Get the proper underlying object | * Get the proper underlying object | ||||
*/ | */ | ||||
if (obj == NULL) { | if (obj == NULL) { | ||||
error = EINVAL; | error = EINVAL; | ||||
goto done; | goto done; | ||||
} | } | ||||
if (obj->type == OBJT_VNODE && obj->handle != vp) { | if (obj->type == OBJT_VNODE && obj->handle != vp) { | ||||
vput(vp); | vput(vp); | ||||
vp = (struct vnode *)obj->handle; | vp = (struct vnode *)obj->handle; | ||||
/* | /* | ||||
* Bypass filesystems obey the mpsafety of the | * Bypass filesystems obey the mpsafety of the | ||||
* underlying fs. Tmpfs never bypasses. | * underlying fs. Tmpfs never bypasses. | ||||
*/ | */ | ||||
error = vget(vp, locktype, td); | error = vget(vp, LK_SHARED, td); | ||||
if (error != 0) | if (error != 0) | ||||
return (error); | return (error); | ||||
} | } | ||||
if (locktype == LK_EXCLUSIVE) { | if (writex) { | ||||
*writecounted = TRUE; | *writecounted = TRUE; | ||||
vnode_pager_update_writecount(obj, 0, objsize); | vnode_pager_update_writecount(obj, 0, objsize); | ||||
} | } | ||||
} else { | } else { | ||||
error = EINVAL; | error = EINVAL; | ||||
goto done; | goto done; | ||||
} | } | ||||
if ((error = VOP_GETATTR(vp, &va, cred))) | if ((error = VOP_GETATTR(vp, &va, cred))) | ||||
▲ Show 20 Lines • Show All 345 Lines • Show Last 20 Lines |