vm_mmap.c (177253) | vm_mmap.c (177458) |
---|---|
1/*- 2 * Copyright (c) 1988 University of Utah. 3 * Copyright (c) 1991, 1993 4 * The Regents of the University of California. All rights reserved. 5 * 6 * This code is derived from software contributed to Berkeley by 7 * the Systems Programming Group of the University of Utah Computer 8 * Science Department. --- 27 unchanged lines hidden (view full) --- 36 * @(#)vm_mmap.c 8.4 (Berkeley) 1/12/94 37 */ 38 39/* 40 * Mapped file (mmap) interface to VM 41 */ 42 43#include <sys/cdefs.h> | 1/*- 2 * Copyright (c) 1988 University of Utah. 3 * Copyright (c) 1991, 1993 4 * The Regents of the University of California. All rights reserved. 5 * 6 * This code is derived from software contributed to Berkeley by 7 * the Systems Programming Group of the University of Utah Computer 8 * Science Department. --- 27 unchanged lines hidden (view full) --- 36 * @(#)vm_mmap.c 8.4 (Berkeley) 1/12/94 37 */ 38 39/* 40 * Mapped file (mmap) interface to VM 41 */ 42 43#include <sys/cdefs.h> |
44__FBSDID("$FreeBSD: head/sys/vm/vm_mmap.c 177253 2008-03-16 10:58:09Z rwatson $"); | 44__FBSDID("$FreeBSD: head/sys/vm/vm_mmap.c 177458 2008-03-20 16:08:42Z kib $"); |
45 46#include "opt_compat.h" 47#include "opt_hwpmc_hooks.h" 48#include "opt_mac.h" 49 50#include <sys/param.h> 51#include <sys/systm.h> 52#include <sys/kernel.h> --- 1102 unchanged lines hidden (view full) --- 1155vm_mmap_vnode(struct thread *td, vm_size_t objsize, 1156 vm_prot_t prot, vm_prot_t *maxprotp, int *flagsp, 1157 struct vnode *vp, vm_ooffset_t foff, vm_object_t *objp) 1158{ 1159 struct vattr va; 1160 void *handle; 1161 vm_object_t obj; 1162 struct mount *mp; | 45 46#include "opt_compat.h" 47#include "opt_hwpmc_hooks.h" 48#include "opt_mac.h" 49 50#include <sys/param.h> 51#include <sys/systm.h> 52#include <sys/kernel.h> --- 1102 unchanged lines hidden (view full) --- 1155vm_mmap_vnode(struct thread *td, vm_size_t objsize, 1156 vm_prot_t prot, vm_prot_t *maxprotp, int *flagsp, 1157 struct vnode *vp, vm_ooffset_t foff, vm_object_t *objp) 1158{ 1159 struct vattr va; 1160 void *handle; 1161 vm_object_t obj; 1162 struct mount *mp; |
1163 struct cdevsw *dsw; |
|
1163 int error, flags, type; 1164 int vfslocked; 1165 1166 mp = vp->v_mount; 1167 vfslocked = VFS_LOCK_GIANT(mp); 1168 if ((error = vget(vp, LK_EXCLUSIVE, td)) != 0) { 1169 VFS_UNLOCK_GIANT(vfslocked); 1170 return (error); --- 14 unchanged lines hidden (view full) --- 1185 vget(vp, LK_EXCLUSIVE, td); 1186 } 1187 type = OBJT_VNODE; 1188 handle = vp; 1189 } else if (vp->v_type == VCHR) { 1190 type = OBJT_DEVICE; 1191 handle = vp->v_rdev; 1192 | 1164 int error, flags, type; 1165 int vfslocked; 1166 1167 mp = vp->v_mount; 1168 vfslocked = VFS_LOCK_GIANT(mp); 1169 if ((error = vget(vp, LK_EXCLUSIVE, td)) != 0) { 1170 VFS_UNLOCK_GIANT(vfslocked); 1171 return (error); --- 14 unchanged lines hidden (view full) --- 1186 vget(vp, LK_EXCLUSIVE, td); 1187 } 1188 type = OBJT_VNODE; 1189 handle = vp; 1190 } else if (vp->v_type == VCHR) { 1191 type = OBJT_DEVICE; 1192 handle = vp->v_rdev; 1193 |
1193 /* XXX: lack thredref on device */ 1194 if(vp->v_rdev->si_devsw->d_flags & D_MMAP_ANON) { | 1194 dsw = dev_refthread(handle); 1195 if (dsw == NULL) { 1196 error = ENXIO; 1197 goto done; 1198 } 1199 if (dsw->d_flags & D_MMAP_ANON) { 1200 dev_relthread(handle); |
1195 *maxprotp = VM_PROT_ALL; 1196 *flagsp |= MAP_ANON; 1197 error = 0; 1198 goto done; 1199 } | 1201 *maxprotp = VM_PROT_ALL; 1202 *flagsp |= MAP_ANON; 1203 error = 0; 1204 goto done; 1205 } |
1206 dev_relthread(handle); |
|
1200 /* 1201 * cdevs does not provide private mappings of any kind. 1202 */ 1203 if ((*maxprotp & VM_PROT_WRITE) == 0 && 1204 (prot & PROT_WRITE) != 0) { 1205 error = EACCES; 1206 goto done; 1207 } --- 60 unchanged lines hidden (view full) --- 1268 * operations on cdevs. 1269 */ 1270int 1271vm_mmap_cdev(struct thread *td, vm_size_t objsize, 1272 vm_prot_t prot, vm_prot_t *maxprotp, int *flagsp, 1273 struct cdev *cdev, vm_ooffset_t foff, vm_object_t *objp) 1274{ 1275 vm_object_t obj; | 1207 /* 1208 * cdevs does not provide private mappings of any kind. 1209 */ 1210 if ((*maxprotp & VM_PROT_WRITE) == 0 && 1211 (prot & PROT_WRITE) != 0) { 1212 error = EACCES; 1213 goto done; 1214 } --- 60 unchanged lines hidden (view full) --- 1275 * operations on cdevs. 1276 */ 1277int 1278vm_mmap_cdev(struct thread *td, vm_size_t objsize, 1279 vm_prot_t prot, vm_prot_t *maxprotp, int *flagsp, 1280 struct cdev *cdev, vm_ooffset_t foff, vm_object_t *objp) 1281{ 1282 vm_object_t obj; |
1283 struct cdevsw *dsw; |
|
1276 int flags; 1277 1278 flags = *flagsp; 1279 | 1284 int flags; 1285 1286 flags = *flagsp; 1287 |
1280 /* XXX: lack thredref on device */ 1281 if (cdev->si_devsw->d_flags & D_MMAP_ANON) { | 1288 dsw = dev_refthread(cdev); 1289 if (dsw == NULL) 1290 return (ENXIO); 1291 if (dsw->d_flags & D_MMAP_ANON) { 1292 dev_relthread(cdev); |
1282 *maxprotp = VM_PROT_ALL; 1283 *flagsp |= MAP_ANON; 1284 return (0); 1285 } | 1293 *maxprotp = VM_PROT_ALL; 1294 *flagsp |= MAP_ANON; 1295 return (0); 1296 } |
1297 dev_relthread(cdev); |
|
1286 /* 1287 * cdevs does not provide private mappings of any kind. 1288 */ 1289 if ((*maxprotp & VM_PROT_WRITE) == 0 && 1290 (prot & PROT_WRITE) != 0) 1291 return (EACCES); 1292 if (flags & (MAP_PRIVATE|MAP_COPY)) 1293 return (EINVAL); --- 202 unchanged lines hidden --- | 1298 /* 1299 * cdevs does not provide private mappings of any kind. 1300 */ 1301 if ((*maxprotp & VM_PROT_WRITE) == 0 && 1302 (prot & PROT_WRITE) != 0) 1303 return (EACCES); 1304 if (flags & (MAP_PRIVATE|MAP_COPY)) 1305 return (EINVAL); --- 202 unchanged lines hidden --- |