int vmcmd_map_pagedvn(struct lwp *l, struct exec_vmcmd *cmd) { struct uvm_object *uobj; struct vnode *vp = cmd->ev_vp; struct proc *p = l->l_proc; int error; vm_prot_t prot, maxprot; KASSERT(vp->v_iflag & VI_TEXT); /* * map the vnode in using uvm_map. */ if (cmd->ev_len == 0) return(0); if (cmd->ev_offset & PAGE_MASK) return(EINVAL); if (cmd->ev_addr & PAGE_MASK) return(EINVAL); if (cmd->ev_len & PAGE_MASK) return(EINVAL); prot = cmd->ev_prot; maxprot = UVM_PROT_ALL; #ifdef PAX_MPROTECT pax_mprotect(l, &prot, &maxprot); #endif /* PAX_MPROTECT */ /* * check the file system's opinion about mmapping the file */ error = VOP_MMAP(vp, prot, l->l_cred); if (error) return error; if ((vp->v_vflag & VV_MAPPED) == 0) { vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); vp->v_vflag |= VV_MAPPED; VOP_UNLOCK(vp, 0); } /* * do the map, reference the object for this map entry */ uobj = &vp->v_uobj; vref(vp); error = uvm_map(&p->p_vmspace->vm_map, &cmd->ev_addr, cmd->ev_len, uobj, cmd->ev_offset, 0, UVM_MAPFLAG(prot, maxprot, UVM_INH_COPY, UVM_ADV_NORMAL, UVM_FLAG_COPYONW|UVM_FLAG_FIXED)); if (error) { uobj->pgops->pgo_detach(uobj); } return error; }
static int unionfs_mmap(void *v) { struct vop_mmap_args *ap = v; struct unionfs_node *unp; struct vnode *tvp; unp = VTOUNIONFS(ap->a_vp); tvp = (unp->un_uppervp != NULLVP ? unp->un_uppervp : unp->un_lowervp); return VOP_MMAP(tvp, ap->a_prot, ap->a_cred); }
int RUMP_VOP_MMAP(struct vnode *vp, int prot, struct kauth_cred *cred) { int error; rump_schedule(); error = VOP_MMAP(vp, prot, cred); rump_unschedule(); return error; }
int vnode_fop_mmap( FILE_T *fp, struct vm_area_struct *mem_p ) { INODE_T *ip = fp->f_dentry->d_inode; int err = 0; loff_t len; loff_t offset = mem_p->vm_pgoff << PAGE_CACHE_SHIFT; loff_t maxoffset = MVFS_MAXOFF_T; VNODE_T *vp; struct mmap_ctx ctx; CALL_DATA_T cd; /* make sure offset, len are within our range */ if (!(fp->f_flags & O_LARGEFILE)) maxoffset = MAX_NON_LFS; len = mem_p->vm_end - mem_p->vm_start; if (offset < 0) return -EINVAL; if (offset >= maxoffset || (offset + len) < 0 || (offset + len) >= maxoffset) { return -EOVERFLOW; } ASSERT(MDKI_INOISMVFS(ip)); vp = ITOV(ip); if (vp->v_type != VREG) return -ENODEV; ctx.file = fp; ctx.mem = mem_p; mdki_linux_init_call_data(&cd); err = VOP_MMAP(vp, vma_to_sharing(mem_p), vma_to_rwx(mem_p), &cd, &ctx); mdki_linux_destroy_call_data(&cd); MDKI_TRACE(TRACE_MAP, "vp=%p mflags=%x prot=%x error=%d\n", vp, vma_to_sharing(mem_p), vma_to_rwx(mem_p), err); return mdki_errno_unix_to_linux(err); }