Changeset View
Changeset View
Standalone View
Standalone View
head/sys/vm/vm_mmap.c
Show First 20 Lines • Show All 1,283 Lines • ▼ Show 20 Lines | if (obj->type == OBJT_VNODE && obj->handle != vp) { | ||||
* underlying fs. Tmpfs never bypasses. | * underlying fs. Tmpfs never bypasses. | ||||
*/ | */ | ||||
error = vget(vp, LK_SHARED, td); | error = vget(vp, LK_SHARED, td); | ||||
if (error != 0) | if (error != 0) | ||||
return (error); | return (error); | ||||
} | } | ||||
if (writex) { | if (writex) { | ||||
*writecounted = TRUE; | *writecounted = TRUE; | ||||
vnode_pager_update_writecount(obj, 0, objsize); | vm_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))) | ||||
goto done; | goto done; | ||||
#ifdef MAC | #ifdef MAC | ||||
Show All 39 Lines | #endif | ||||
*objp = obj; | *objp = obj; | ||||
*flagsp = flags; | *flagsp = flags; | ||||
vfs_mark_atime(vp, cred); | vfs_mark_atime(vp, cred); | ||||
done: | done: | ||||
if (error != 0 && *writecounted) { | if (error != 0 && *writecounted) { | ||||
*writecounted = FALSE; | *writecounted = FALSE; | ||||
vnode_pager_update_writecount(obj, objsize, 0); | vm_pager_update_writecount(obj, objsize, 0); | ||||
} | } | ||||
vput(vp); | vput(vp); | ||||
return (error); | return (error); | ||||
} | } | ||||
/* | /* | ||||
* vm_mmap_cdev() | * vm_mmap_cdev() | ||||
* | * | ||||
▲ Show 20 Lines • Show All 118 Lines • ▼ Show 20 Lines | vm_mmap(vm_map_t map, vm_offset_t *addr, vm_size_t size, vm_prot_t prot, | ||||
error = vm_mmap_object(map, addr, size, prot, maxprot, flags, object, | error = vm_mmap_object(map, addr, size, prot, maxprot, flags, object, | ||||
foff, writecounted, td); | foff, writecounted, td); | ||||
if (error != 0 && object != NULL) { | if (error != 0 && object != NULL) { | ||||
/* | /* | ||||
* If this mapping was accounted for in the vnode's | * If this mapping was accounted for in the vnode's | ||||
* writecount, then undo that now. | * writecount, then undo that now. | ||||
*/ | */ | ||||
if (writecounted) | if (writecounted) | ||||
vnode_pager_release_writecount(object, 0, size); | vm_pager_release_writecount(object, 0, size); | ||||
vm_object_deallocate(object); | vm_object_deallocate(object); | ||||
} | } | ||||
return (error); | return (error); | ||||
} | } | ||||
/* | /* | ||||
* Internal version of mmap that maps a specific VM object into an | * Internal version of mmap that maps a specific VM object into an | ||||
* map. Called by mmap for MAP_ANON, vm_mmap, shm_mmap, and vn_mmap. | * map. Called by mmap for MAP_ANON, vm_mmap, shm_mmap, and vn_mmap. | ||||
▲ Show 20 Lines • Show All 72 Lines • ▼ Show 20 Lines | vm_mmap_object(vm_map_t map, vm_offset_t *addr, vm_size_t size, vm_prot_t prot, | ||||
if (flags & MAP_NOSYNC) | if (flags & MAP_NOSYNC) | ||||
docow |= MAP_DISABLE_SYNCER; | docow |= MAP_DISABLE_SYNCER; | ||||
if (flags & MAP_NOCORE) | if (flags & MAP_NOCORE) | ||||
docow |= MAP_DISABLE_COREDUMP; | docow |= MAP_DISABLE_COREDUMP; | ||||
/* Shared memory is also shared with children. */ | /* Shared memory is also shared with children. */ | ||||
if (flags & MAP_SHARED) | if (flags & MAP_SHARED) | ||||
docow |= MAP_INHERIT_SHARE; | docow |= MAP_INHERIT_SHARE; | ||||
if (writecounted) | if (writecounted) | ||||
docow |= MAP_VN_WRITECOUNT; | docow |= MAP_WRITECOUNT; | ||||
if (flags & MAP_STACK) { | if (flags & MAP_STACK) { | ||||
if (object != NULL) | if (object != NULL) | ||||
return (EINVAL); | return (EINVAL); | ||||
docow |= MAP_STACK_GROWS_DOWN; | docow |= MAP_STACK_GROWS_DOWN; | ||||
} | } | ||||
if ((flags & MAP_EXCL) != 0) | if ((flags & MAP_EXCL) != 0) | ||||
docow |= MAP_CHECK_EXCL; | docow |= MAP_CHECK_EXCL; | ||||
if ((flags & MAP_GUARD) != 0) | if ((flags & MAP_GUARD) != 0) | ||||
▲ Show 20 Lines • Show All 67 Lines • Show Last 20 Lines |