37 #include <sys/cpuvar.h>
38 #include <sys/kmem.h>
39 #include <sys/strsubr.h>
40 #include <sys/sysmacros.h>
41 #include <sys/frame.h>
42 #include <sys/stack.h>
43 #include <sys/proc.h>
44 #include <sys/priv.h>
45 #include <sys/policy.h>
46 #include <sys/ontrap.h>
47 #include <sys/vmsystm.h>
48 #include <sys/prsystm.h>
49
50 #include <vm/as.h>
51 #include <vm/seg.h>
52 #include <vm/seg_dev.h>
53 #include <vm/seg_vn.h>
54 #include <vm/seg_spt.h>
55 #include <vm/seg_kmem.h>
56
57 extern struct seg_ops segdev_ops; /* needs a header file */
58 extern struct seg_ops segspt_shmops; /* needs a header file */
59
60 static int
61 page_valid(struct seg *seg, caddr_t addr)
62 {
63 struct segvn_data *svd;
64 vnode_t *vp;
65 vattr_t vattr;
66
67 /*
68 * Fail if the page doesn't map to a page in the underlying
69 * mapped file, if an underlying mapped file exists.
70 */
71 vattr.va_mask = AT_SIZE;
72 if (seg->s_ops == &segvn_ops &&
73 segop_getvp(seg, addr, &vp) == 0 &&
74 vp != NULL && vp->v_type == VREG &&
75 VOP_GETATTR(vp, &vattr, 0, CRED(), NULL) == 0) {
76 u_offset_t size = roundup(vattr.va_size, (u_offset_t)PAGESIZE);
77 u_offset_t offset = segop_getoffset(seg, addr);
78
|
37 #include <sys/cpuvar.h>
38 #include <sys/kmem.h>
39 #include <sys/strsubr.h>
40 #include <sys/sysmacros.h>
41 #include <sys/frame.h>
42 #include <sys/stack.h>
43 #include <sys/proc.h>
44 #include <sys/priv.h>
45 #include <sys/policy.h>
46 #include <sys/ontrap.h>
47 #include <sys/vmsystm.h>
48 #include <sys/prsystm.h>
49
50 #include <vm/as.h>
51 #include <vm/seg.h>
52 #include <vm/seg_dev.h>
53 #include <vm/seg_vn.h>
54 #include <vm/seg_spt.h>
55 #include <vm/seg_kmem.h>
56
57 extern const struct seg_ops segdev_ops; /* needs a header file */
58 extern const struct seg_ops segspt_shmops; /* needs a header file */
59
60 static int
61 page_valid(struct seg *seg, caddr_t addr)
62 {
63 struct segvn_data *svd;
64 vnode_t *vp;
65 vattr_t vattr;
66
67 /*
68 * Fail if the page doesn't map to a page in the underlying
69 * mapped file, if an underlying mapped file exists.
70 */
71 vattr.va_mask = AT_SIZE;
72 if (seg->s_ops == &segvn_ops &&
73 segop_getvp(seg, addr, &vp) == 0 &&
74 vp != NULL && vp->v_type == VREG &&
75 VOP_GETATTR(vp, &vattr, 0, CRED(), NULL) == 0) {
76 u_offset_t size = roundup(vattr.va_size, (u_offset_t)PAGESIZE);
77 u_offset_t offset = segop_getoffset(seg, addr);
78
|