STATIC int linvfs_file_mmap( struct file *filp, struct vm_area_struct *vma) { struct inode *ip = filp->f_dentry->d_inode; vnode_t *vp = LINVFS_GET_VP(ip); vattr_t va = { .va_mask = XFS_AT_UPDATIME }; int error; if (vp->v_vfsp->vfs_flag & VFS_DMI) { xfs_mount_t *mp = XFS_VFSTOM(vp->v_vfsp); error = -XFS_SEND_MMAP(mp, vma, 0); if (error) return error; } vma->vm_ops = &linvfs_file_vm_ops; VOP_SETATTR(vp, &va, XFS_AT_UPDATIME, NULL, error); if (!error) vn_revalidate(vp); /* update Linux inode flags */ return 0; }
STATIC int xfs_vm_fault( struct vm_area_struct *vma, struct vm_fault *vmf) { struct inode *inode = vma->vm_file->f_path.dentry->d_inode; bhv_vnode_t *vp = vn_from_inode(inode); ASSERT_ALWAYS(vp->v_vfsp->vfs_flag & VFS_DMI); if (XFS_SEND_MMAP(XFS_VFSTOM(vp->v_vfsp), vma, 0)) return VM_FAULT_SIGBUS; return filemap_fault(vma, vmf); }
STATIC int xfs_vm_mprotect( struct vm_area_struct *vma, unsigned int newflags) { struct inode *inode = vma->vm_file->f_path.dentry->d_inode; struct xfs_mount *mp = XFS_M(inode->i_sb); int error = 0; if (mp->m_flags & XFS_MOUNT_DMAPI) { if ((vma->vm_flags & VM_MAYSHARE) && (newflags & VM_WRITE) && !(vma->vm_flags & VM_WRITE)) error = XFS_SEND_MMAP(mp, vma, VM_WRITE); } return error; }
STATIC int xfs_vm_mprotect( struct vm_area_struct *vma, unsigned int newflags) { vnode_t *vp = vn_from_inode(vma->vm_file->f_dentry->d_inode); int error = 0; if (vp->v_vfsp->vfs_flag & VFS_DMI) { if ((vma->vm_flags & VM_MAYSHARE) && (newflags & VM_WRITE) && !(vma->vm_flags & VM_WRITE)) { xfs_mount_t *mp = XFS_VFSTOM(vp->v_vfsp); error = XFS_SEND_MMAP(mp, vma, VM_WRITE); } } return error; }
STATIC struct page * xfs_vm_nopage( struct vm_area_struct *area, unsigned long address, int *type) { struct inode *inode = area->vm_file->f_dentry->d_inode; vnode_t *vp = vn_from_inode(inode); xfs_mount_t *mp = XFS_VFSTOM(vp->v_vfsp); int error; ASSERT_ALWAYS(vp->v_vfsp->vfs_flag & VFS_DMI); error = XFS_SEND_MMAP(mp, area, 0); if (error) return NULL; return filemap_nopage(area, address, type); }