Re: [RFC PATCH v8 1/2] vfs: add flags parameter to all ->mmap() handlers

From: Jan Kara
Date: Mon Sep 11 2017 - 05:50:28 EST


On Fri 08-09-17 12:35:08, Dan Williams wrote:
> We are running running short of vma->vm_flags. We can avoid needing a
> new VM_* flag in some cases if the original @flags submitted to mmap(2)
> is made available to the ->mmap() 'struct file_operations'
> implementation. For example, the proposed addition of MAP_DIRECT can be
> implemented without taking up a new vm_flags bit. Another motivation to
> avoid vm_flags is that they appear in /proc/$pid/smaps, and we have seen
> software that tries to dangerously (TOCTOU) read smaps to infer the
> behavior of a virtual address range. Lastly, we may want to reject mmap
> attempts on a per-mmap-call basis.
>
> This conversion was performed by the following semantic patch. There
> were a few manual edits for oddities like proc_reg_mmap, call_mmap,
> drm_gem_cma_mmap, and cxl_fd_mmap.

<snip>

> Cc: Takashi Iwai <tiwai@xxxxxxxx>
> Cc: Christoph Hellwig <hch@xxxxxx>
> Cc: David Airlie <airlied@xxxxxxxx>
> Cc: <dri-devel@xxxxxxxxxxxxxxxxxxxxx>
> Cc: Daniel Vetter <daniel.vetter@xxxxxxxxx>
> Cc: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx>
> Cc: Linus Torvalds <torvalds@xxxxxxxxxxxxxxxxxxxx>
> Cc: Mauro Carvalho Chehab <mchehab@xxxxxxxxxxxxxxxx>
> Cc: <linux-media@xxxxxxxxxxxxxxx>
> Cc: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx>
> Suggested-by: Jan Kara <jack@xxxxxxx>
> Signed-off-by: Julia Lawall <julia.lawall@xxxxxxx>
> Signed-off-by: Dan Williams <dan.j.williams@xxxxxxxxx>

I've skimmed through the patch and it looks sane. You can add:

Acked-by: Jan Kara <jack@xxxxxxx>

Honza

> ---
> arch/arc/kernel/arc_hostlink.c | 3 ++-
> arch/mips/kernel/vdso.c | 2 +-
> arch/powerpc/kernel/proc_powerpc.c | 3 ++-
> arch/powerpc/kvm/book3s_64_vio.c | 3 ++-
> arch/powerpc/platforms/cell/spufs/file.c | 21 +++++++++++++-------
> arch/powerpc/platforms/powernv/memtrace.c | 3 ++-
> arch/powerpc/platforms/powernv/opal-prd.c | 3 ++-
> arch/tile/mm/elf.c | 3 ++-
> arch/um/drivers/mmapper_kern.c | 3 ++-
> drivers/android/binder.c | 3 ++-
> drivers/auxdisplay/cfag12864bfb.c | 3 ++-
> drivers/auxdisplay/ht16k33.c | 3 ++-
> drivers/char/agp/frontend.c | 3 ++-
> drivers/char/bsr.c | 3 ++-
> drivers/char/hpet.c | 6 ++++--
> drivers/char/mbcs.c | 3 ++-
> drivers/char/mbcs.h | 3 ++-
> drivers/char/mem.c | 11 +++++++---
> drivers/char/mspec.c | 9 ++++++---
> drivers/char/uv_mmtimer.c | 6 ++++--
> drivers/dax/device.c | 3 ++-
> drivers/dma-buf/dma-buf.c | 11 +++++++---
> drivers/firewire/core-cdev.c | 3 ++-
> drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 3 ++-
> drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h | 3 ++-
> drivers/gpu/drm/amd/amdkfd/kfd_chardev.c | 5 +++--
> drivers/gpu/drm/armada/armada_gem.c | 3 ++-
> drivers/gpu/drm/ast/ast_drv.h | 3 ++-
> drivers/gpu/drm/ast/ast_ttm.c | 3 ++-
> drivers/gpu/drm/bochs/bochs.h | 3 ++-
> drivers/gpu/drm/bochs/bochs_fbdev.c | 2 +-
> drivers/gpu/drm/bochs/bochs_mm.c | 3 ++-
> drivers/gpu/drm/cirrus/cirrus_drv.h | 3 ++-
> drivers/gpu/drm/cirrus/cirrus_ttm.c | 3 ++-
> drivers/gpu/drm/drm_fb_cma_helper.c | 8 +++++---
> drivers/gpu/drm/drm_gem.c | 3 ++-
> drivers/gpu/drm/drm_gem_cma_helper.c | 8 +++++---
> drivers/gpu/drm/drm_prime.c | 5 +++--
> drivers/gpu/drm/drm_vm.c | 3 ++-
> drivers/gpu/drm/etnaviv/etnaviv_drv.h | 6 ++++--
> drivers/gpu/drm/etnaviv/etnaviv_gem.c | 11 ++++++----
> drivers/gpu/drm/etnaviv/etnaviv_gem.h | 3 ++-
> drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c | 9 +++++----
> drivers/gpu/drm/exynos/exynos_drm_fbdev.c | 2 +-
> drivers/gpu/drm/exynos/exynos_drm_gem.c | 10 ++++++----
> drivers/gpu/drm/exynos/exynos_drm_gem.h | 6 ++++--
> drivers/gpu/drm/gma500/framebuffer.c | 3 ++-
> drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h | 3 ++-
> drivers/gpu/drm/hisilicon/hibmc/hibmc_ttm.c | 3 ++-
> drivers/gpu/drm/i810/i810_dma.c | 3 ++-
> drivers/gpu/drm/i915/i915_gem_dmabuf.c | 6 ++++--
> drivers/gpu/drm/i915/selftests/mock_dmabuf.c | 4 +++-
> drivers/gpu/drm/mediatek/mtk_drm_gem.c | 8 +++++---
> drivers/gpu/drm/mediatek/mtk_drm_gem.h | 5 +++--
> drivers/gpu/drm/mgag200/mgag200_drv.h | 3 ++-
> drivers/gpu/drm/mgag200/mgag200_ttm.c | 3 ++-
> drivers/gpu/drm/msm/msm_drv.h | 6 ++++--
> drivers/gpu/drm/msm/msm_fbdev.c | 6 ++++--
> drivers/gpu/drm/msm/msm_gem.c | 5 +++--
> drivers/gpu/drm/msm/msm_gem_prime.c | 3 ++-
> drivers/gpu/drm/nouveau/nouveau_ttm.c | 5 +++--
> drivers/gpu/drm/nouveau/nouveau_ttm.h | 2 +-
> drivers/gpu/drm/omapdrm/omap_drv.h | 3 ++-
> drivers/gpu/drm/omapdrm/omap_gem.c | 5 +++--
> drivers/gpu/drm/omapdrm/omap_gem_dmabuf.c | 2 +-
> drivers/gpu/drm/qxl/qxl_drv.h | 6 ++++--
> drivers/gpu/drm/qxl/qxl_prime.c | 2 +-
> drivers/gpu/drm/qxl/qxl_ttm.c | 3 ++-
> drivers/gpu/drm/radeon/radeon_drv.c | 3 ++-
> drivers/gpu/drm/radeon/radeon_ttm.c | 3 ++-
> drivers/gpu/drm/rockchip/rockchip_drm_fbdev.c | 5 +++--
> drivers/gpu/drm/rockchip/rockchip_drm_gem.c | 7 ++++---
> drivers/gpu/drm/rockchip/rockchip_drm_gem.h | 5 +++--
> drivers/gpu/drm/tegra/gem.c | 9 ++++++---
> drivers/gpu/drm/tegra/gem.h | 3 ++-
> drivers/gpu/drm/udl/udl_dmabuf.c | 3 ++-
> drivers/gpu/drm/udl/udl_drv.h | 3 ++-
> drivers/gpu/drm/udl/udl_fb.c | 3 ++-
> drivers/gpu/drm/udl/udl_gem.c | 5 +++--
> drivers/gpu/drm/vc4/vc4_bo.c | 10 ++++++----
> drivers/gpu/drm/vc4/vc4_drv.h | 6 ++++--
> drivers/gpu/drm/vgem/vgem_drv.c | 10 ++++++----
> drivers/gpu/drm/virtio/virtgpu_drv.h | 6 ++++--
> drivers/gpu/drm/virtio/virtgpu_prime.c | 2 +-
> drivers/gpu/drm/virtio/virtgpu_ttm.c | 3 ++-
> drivers/gpu/drm/vmwgfx/vmwgfx_drv.h | 3 ++-
> drivers/gpu/drm/vmwgfx/vmwgfx_prime.c | 3 ++-
> drivers/gpu/drm/vmwgfx/vmwgfx_ttm_glue.c | 3 ++-
> drivers/hsi/clients/cmt_speech.c | 3 ++-
> drivers/hwtracing/intel_th/msu.c | 3 ++-
> drivers/hwtracing/stm/core.c | 3 ++-
> drivers/infiniband/core/uverbs_main.c | 3 ++-
> drivers/infiniband/hw/hfi1/file_ops.c | 6 ++++--
> drivers/infiniband/hw/qib/qib_file_ops.c | 5 +++--
> drivers/media/common/saa7146/saa7146_fops.c | 3 ++-
> drivers/media/pci/bt8xx/bttv-driver.c | 3 ++-
> drivers/media/pci/cx18/cx18-fileops.c | 3 ++-
> drivers/media/pci/cx18/cx18-fileops.h | 3 ++-
> drivers/media/pci/meye/meye.c | 3 ++-
> drivers/media/pci/zoran/zoran_driver.c | 2 +-
> drivers/media/platform/davinci/vpfe_capture.c | 3 ++-
> drivers/media/platform/exynos-gsc/gsc-m2m.c | 3 ++-
> drivers/media/platform/fsl-viu.c | 3 ++-
> drivers/media/platform/m2m-deinterlace.c | 3 ++-
> drivers/media/platform/mx2_emmaprp.c | 3 ++-
> drivers/media/platform/omap/omap_vout.c | 3 ++-
> drivers/media/platform/omap3isp/ispvideo.c | 3 ++-
> drivers/media/platform/s3c-camif/camif-capture.c | 3 ++-
> drivers/media/platform/s5p-mfc/s5p_mfc.c | 3 ++-
> drivers/media/platform/sh_veu.c | 3 ++-
> drivers/media/platform/soc_camera/soc_camera.c | 3 ++-
> drivers/media/platform/via-camera.c | 3 ++-
> drivers/media/usb/cpia2/cpia2_v4l.c | 3 ++-
> drivers/media/usb/cx231xx/cx231xx-417.c | 3 ++-
> drivers/media/usb/cx231xx/cx231xx-video.c | 3 ++-
> drivers/media/usb/gspca/gspca.c | 3 ++-
> drivers/media/usb/stkwebcam/stk-webcam.c | 3 ++-
> drivers/media/usb/tm6000/tm6000-video.c | 3 ++-
> drivers/media/usb/usbvision/usbvision-video.c | 3 ++-
> drivers/media/usb/uvc/uvc_v4l2.c | 3 ++-
> drivers/media/usb/zr364xx/zr364xx.c | 3 ++-
> drivers/media/v4l2-core/v4l2-dev.c | 5 +++--
> drivers/media/v4l2-core/v4l2-mem2mem.c | 3 ++-
> drivers/media/v4l2-core/videobuf2-dma-contig.c | 2 +-
> drivers/media/v4l2-core/videobuf2-dma-sg.c | 2 +-
> drivers/media/v4l2-core/videobuf2-v4l2.c | 3 ++-
> drivers/media/v4l2-core/videobuf2-vmalloc.c | 2 +-
> drivers/misc/aspeed-lpc-ctrl.c | 3 ++-
> drivers/misc/cxl/api.c | 5 +++--
> drivers/misc/cxl/cxl.h | 3 ++-
> drivers/misc/cxl/file.c | 3 ++-
> drivers/misc/genwqe/card_dev.c | 3 ++-
> drivers/misc/mic/scif/scif_fd.c | 3 ++-
> drivers/misc/mic/vop/vop_vringh.c | 3 ++-
> drivers/misc/sgi-gru/grufile.c | 3 ++-
> drivers/mtd/mtdchar.c | 3 ++-
> drivers/pci/proc.c | 3 ++-
> drivers/rapidio/devices/rio_mport_cdev.c | 3 ++-
> drivers/sbus/char/flash.c | 3 ++-
> drivers/sbus/char/jsflash.c | 3 ++-
> drivers/scsi/cxlflash/superpipe.c | 5 +++--
> drivers/scsi/sg.c | 3 ++-
> drivers/staging/android/ashmem.c | 3 ++-
> drivers/staging/android/ion/ion.c | 3 ++-
> drivers/staging/comedi/comedi_fops.c | 3 ++-
> .../staging/lustre/lustre/llite/llite_internal.h | 3 ++-
> drivers/staging/lustre/lustre/llite/llite_mmap.c | 5 +++--
> .../media/atomisp/pci/atomisp2/atomisp_fops.c | 6 ++++--
> drivers/staging/media/davinci_vpfe/vpfe_video.c | 3 ++-
> drivers/staging/media/omap4iss/iss_video.c | 3 ++-
> drivers/staging/vboxvideo/vbox_drv.h | 5 +++--
> drivers/staging/vboxvideo/vbox_prime.c | 3 ++-
> drivers/staging/vboxvideo/vbox_ttm.c | 3 ++-
> drivers/staging/vme/devices/vme_user.c | 3 ++-
> drivers/tee/tee_shm.c | 3 ++-
> drivers/uio/uio.c | 3 ++-
> drivers/usb/core/devio.c | 3 ++-
> drivers/usb/gadget/function/uvc_v4l2.c | 3 ++-
> drivers/usb/mon/mon_bin.c | 3 ++-
> drivers/vfio/vfio.c | 7 +++++--
> drivers/video/fbdev/68328fb.c | 6 ++++--
> drivers/video/fbdev/amba-clcd.c | 2 +-
> drivers/video/fbdev/aty/atyfb_base.c | 6 ++++--
> drivers/video/fbdev/au1100fb.c | 3 ++-
> drivers/video/fbdev/au1200fb.c | 3 ++-
> drivers/video/fbdev/bw2.c | 5 +++--
> drivers/video/fbdev/cg14.c | 5 +++--
> drivers/video/fbdev/cg3.c | 5 +++--
> drivers/video/fbdev/cg6.c | 5 +++--
> drivers/video/fbdev/controlfb.c | 4 ++--
> drivers/video/fbdev/core/fb_defio.c | 3 ++-
> drivers/video/fbdev/core/fbmem.c | 5 +++--
> drivers/video/fbdev/ep93xx-fb.c | 3 ++-
> drivers/video/fbdev/fb-puv3.c | 2 +-
> drivers/video/fbdev/ffb.c | 5 +++--
> drivers/video/fbdev/gbefb.c | 2 +-
> drivers/video/fbdev/igafb.c | 2 +-
> drivers/video/fbdev/leo.c | 5 +++--
> drivers/video/fbdev/omap/omapfb_main.c | 3 ++-
> drivers/video/fbdev/omap2/omapfb/omapfb-main.c | 3 ++-
> drivers/video/fbdev/p9100.c | 6 ++++--
> drivers/video/fbdev/ps3fb.c | 3 ++-
> drivers/video/fbdev/pxa3xx-gcu.c | 3 ++-
> drivers/video/fbdev/sa1100fb.c | 2 +-
> drivers/video/fbdev/sh_mobile_lcdcfb.c | 6 ++++--
> drivers/video/fbdev/smscufx.c | 3 ++-
> drivers/video/fbdev/tcx.c | 5 +++--
> drivers/video/fbdev/udlfb.c | 3 ++-
> drivers/video/fbdev/vermilion/vermilion.c | 3 ++-
> drivers/video/fbdev/vfb.c | 4 ++--
> drivers/xen/gntalloc.c | 3 ++-
> drivers/xen/gntdev.c | 3 ++-
> drivers/xen/privcmd.c | 3 ++-
> drivers/xen/xenbus/xenbus_dev_backend.c | 3 ++-
> drivers/xen/xenfs/xenstored.c | 3 ++-
> fs/9p/vfs_file.c | 10 ++++++----
> fs/aio.c | 3 ++-
> fs/btrfs/file.c | 4 +++-
> fs/ceph/addr.c | 3 ++-
> fs/ceph/super.h | 3 ++-
> fs/cifs/cifsfs.h | 6 ++++--
> fs/cifs/file.c | 10 ++++++----
> fs/coda/file.c | 5 +++--
> fs/ecryptfs/file.c | 5 +++--
> fs/ext2/file.c | 5 +++--
> fs/ext4/file.c | 3 ++-
> fs/f2fs/file.c | 3 ++-
> fs/fuse/file.c | 8 +++++---
> fs/gfs2/file.c | 3 ++-
> fs/hugetlbfs/inode.c | 3 ++-
> fs/kernfs/file.c | 3 ++-
> fs/ncpfs/mmap.c | 3 ++-
> fs/ncpfs/ncp_fs.h | 2 +-
> fs/nfs/file.c | 5 +++--
> fs/nfs/internal.h | 2 +-
> fs/nilfs2/file.c | 3 ++-
> fs/ocfs2/mmap.c | 3 ++-
> fs/ocfs2/mmap.h | 3 ++-
> fs/orangefs/file.c | 5 +++--
> fs/proc/inode.c | 7 ++++---
> fs/proc/vmcore.c | 6 ++++--
> fs/ramfs/file-nommu.c | 6 ++++--
> fs/romfs/mmap-nommu.c | 3 ++-
> fs/ubifs/file.c | 5 +++--
> fs/xfs/xfs_file.c | 2 +-
> include/drm/drm_drv.h | 3 ++-
> include/drm/drm_gem.h | 3 ++-
> include/drm/drm_gem_cma_helper.h | 6 ++++--
> include/drm/drm_legacy.h | 3 ++-
> include/linux/dma-buf.h | 5 +++--
> include/linux/fb.h | 6 ++++--
> include/linux/fs.h | 13 ++++++++----
> include/linux/mm.h | 2 +-
> include/media/v4l2-dev.h | 2 +-
> include/media/v4l2-mem2mem.h | 3 ++-
> include/media/videobuf2-v4l2.h | 3 ++-
> include/misc/cxl.h | 3 ++-
> ipc/shm.c | 5 +++--
> kernel/events/core.c | 3 ++-
> kernel/kcov.c | 3 ++-
> kernel/relay.c | 3 ++-
> mm/filemap.c | 15 ++++++++++----
> mm/mmap.c | 6 +++---
> mm/nommu.c | 4 ++--
> mm/shmem.c | 3 ++-
> net/socket.c | 6 ++++--
> security/selinux/selinuxfs.c | 6 ++++--
> sound/core/compress_offload.c | 3 ++-
> sound/core/hwdep.c | 3 ++-
> sound/core/info.c | 3 ++-
> sound/core/init.c | 3 ++-
> sound/core/oss/pcm_oss.c | 3 ++-
> sound/core/pcm_native.c | 3 ++-
> sound/oss/soundcard.c | 3 ++-
> sound/oss/swarm_cs4297a.c | 3 ++-
> virt/kvm/kvm_main.c | 3 ++-
> 256 files changed, 661 insertions(+), 374 deletions(-)
>
> diff --git a/arch/arc/kernel/arc_hostlink.c b/arch/arc/kernel/arc_hostlink.c
> index 47b2a17cc52a..09398a953cca 100644
> --- a/arch/arc/kernel/arc_hostlink.c
> +++ b/arch/arc/kernel/arc_hostlink.c
> @@ -18,7 +18,8 @@
>
> static unsigned char __HOSTLINK__[4 * PAGE_SIZE] __aligned(PAGE_SIZE);
>
> -static int arc_hl_mmap(struct file *fp, struct vm_area_struct *vma)
> +static int arc_hl_mmap(struct file *fp, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
>
> diff --git a/arch/mips/kernel/vdso.c b/arch/mips/kernel/vdso.c
> index 093517e85a6c..aa143d113aba 100644
> --- a/arch/mips/kernel/vdso.c
> +++ b/arch/mips/kernel/vdso.c
> @@ -111,7 +111,7 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
> base = mmap_region(NULL, STACK_TOP, PAGE_SIZE,
> VM_READ|VM_WRITE|VM_EXEC|
> VM_MAYREAD|VM_MAYWRITE|VM_MAYEXEC,
> - 0, NULL);
> + 0, NULL, 0);
> if (IS_ERR_VALUE(base)) {
> ret = base;
> goto out;
> diff --git a/arch/powerpc/kernel/proc_powerpc.c b/arch/powerpc/kernel/proc_powerpc.c
> index 56548bf6231f..f9e2b0c7c093 100644
> --- a/arch/powerpc/kernel/proc_powerpc.c
> +++ b/arch/powerpc/kernel/proc_powerpc.c
> @@ -41,7 +41,8 @@ static ssize_t page_map_read( struct file *file, char __user *buf, size_t nbytes
> PDE_DATA(file_inode(file)), PAGE_SIZE);
> }
>
> -static int page_map_mmap( struct file *file, struct vm_area_struct *vma )
> +static int page_map_mmap( struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> if ((vma->vm_end - vma->vm_start) > PAGE_SIZE)
> return -EINVAL;
> diff --git a/arch/powerpc/kvm/book3s_64_vio.c b/arch/powerpc/kvm/book3s_64_vio.c
> index 53766e2bc029..75eb54e667b0 100644
> --- a/arch/powerpc/kvm/book3s_64_vio.c
> +++ b/arch/powerpc/kvm/book3s_64_vio.c
> @@ -255,7 +255,8 @@ static const struct vm_operations_struct kvm_spapr_tce_vm_ops = {
> .fault = kvm_spapr_tce_fault,
> };
>
> -static int kvm_spapr_tce_mmap(struct file *file, struct vm_area_struct *vma)
> +static int kvm_spapr_tce_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> vma->vm_ops = &kvm_spapr_tce_vm_ops;
> return 0;
> diff --git a/arch/powerpc/platforms/cell/spufs/file.c b/arch/powerpc/platforms/cell/spufs/file.c
> index 5ffcdeb1eb17..4abd3f76ebfd 100644
> --- a/arch/powerpc/platforms/cell/spufs/file.c
> +++ b/arch/powerpc/platforms/cell/spufs/file.c
> @@ -291,7 +291,8 @@ static const struct vm_operations_struct spufs_mem_mmap_vmops = {
> .access = spufs_mem_mmap_access,
> };
>
> -static int spufs_mem_mmap(struct file *file, struct vm_area_struct *vma)
> +static int spufs_mem_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> if (!(vma->vm_flags & VM_SHARED))
> return -EINVAL;
> @@ -379,7 +380,8 @@ static const struct vm_operations_struct spufs_cntl_mmap_vmops = {
> /*
> * mmap support for problem state control area [0x4000 - 0x4fff].
> */
> -static int spufs_cntl_mmap(struct file *file, struct vm_area_struct *vma)
> +static int spufs_cntl_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> if (!(vma->vm_flags & VM_SHARED))
> return -EINVAL;
> @@ -1059,7 +1061,8 @@ static const struct vm_operations_struct spufs_signal1_mmap_vmops = {
> .fault = spufs_signal1_mmap_fault,
> };
>
> -static int spufs_signal1_mmap(struct file *file, struct vm_area_struct *vma)
> +static int spufs_signal1_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> if (!(vma->vm_flags & VM_SHARED))
> return -EINVAL;
> @@ -1197,7 +1200,8 @@ static const struct vm_operations_struct spufs_signal2_mmap_vmops = {
> .fault = spufs_signal2_mmap_fault,
> };
>
> -static int spufs_signal2_mmap(struct file *file, struct vm_area_struct *vma)
> +static int spufs_signal2_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> if (!(vma->vm_flags & VM_SHARED))
> return -EINVAL;
> @@ -1320,7 +1324,8 @@ static const struct vm_operations_struct spufs_mss_mmap_vmops = {
> /*
> * mmap support for problem state MFC DMA area [0x0000 - 0x0fff].
> */
> -static int spufs_mss_mmap(struct file *file, struct vm_area_struct *vma)
> +static int spufs_mss_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> if (!(vma->vm_flags & VM_SHARED))
> return -EINVAL;
> @@ -1382,7 +1387,8 @@ static const struct vm_operations_struct spufs_psmap_mmap_vmops = {
> /*
> * mmap support for full problem state area [0x00000 - 0x1ffff].
> */
> -static int spufs_psmap_mmap(struct file *file, struct vm_area_struct *vma)
> +static int spufs_psmap_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> if (!(vma->vm_flags & VM_SHARED))
> return -EINVAL;
> @@ -1442,7 +1448,8 @@ static const struct vm_operations_struct spufs_mfc_mmap_vmops = {
> /*
> * mmap support for problem state MFC DMA area [0x0000 - 0x0fff].
> */
> -static int spufs_mfc_mmap(struct file *file, struct vm_area_struct *vma)
> +static int spufs_mfc_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> if (!(vma->vm_flags & VM_SHARED))
> return -EINVAL;
> diff --git a/arch/powerpc/platforms/powernv/memtrace.c b/arch/powerpc/platforms/powernv/memtrace.c
> index de470caf0784..1298ce76a543 100644
> --- a/arch/powerpc/platforms/powernv/memtrace.c
> +++ b/arch/powerpc/platforms/powernv/memtrace.c
> @@ -57,7 +57,8 @@ static bool valid_memtrace_range(struct memtrace_entry *dev,
> return false;
> }
>
> -static int memtrace_mmap(struct file *filp, struct vm_area_struct *vma)
> +static int memtrace_mmap(struct file *filp, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> unsigned long size = vma->vm_end - vma->vm_start;
> struct memtrace_entry *dev = filp->private_data;
> diff --git a/arch/powerpc/platforms/powernv/opal-prd.c b/arch/powerpc/platforms/powernv/opal-prd.c
> index de4dd09f4a15..63e55f6b97e5 100644
> --- a/arch/powerpc/platforms/powernv/opal-prd.c
> +++ b/arch/powerpc/platforms/powernv/opal-prd.c
> @@ -109,7 +109,8 @@ static int opal_prd_open(struct inode *inode, struct file *file)
> * @vma: VMA to map the registers into
> */
>
> -static int opal_prd_mmap(struct file *file, struct vm_area_struct *vma)
> +static int opal_prd_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> size_t addr, size;
> pgprot_t page_prot;
> diff --git a/arch/tile/mm/elf.c b/arch/tile/mm/elf.c
> index 889901824400..fb4f16c61b64 100644
> --- a/arch/tile/mm/elf.c
> +++ b/arch/tile/mm/elf.c
> @@ -143,7 +143,8 @@ int arch_setup_additional_pages(struct linux_binprm *bprm,
> unsigned long addr = MEM_USER_INTRPT;
> addr = mmap_region(NULL, addr, INTRPT_SIZE,
> VM_READ|VM_EXEC|
> - VM_MAYREAD|VM_MAYWRITE|VM_MAYEXEC, 0, NULL);
> + VM_MAYREAD|VM_MAYWRITE|VM_MAYEXEC,
> + 0, NULL, 0);
> if (addr > (unsigned long) -PAGE_SIZE)
> retval = (int) addr;
> }
> diff --git a/arch/um/drivers/mmapper_kern.c b/arch/um/drivers/mmapper_kern.c
> index 3645fcb2a787..046eb23602a2 100644
> --- a/arch/um/drivers/mmapper_kern.c
> +++ b/arch/um/drivers/mmapper_kern.c
> @@ -45,7 +45,8 @@ static long mmapper_ioctl(struct file *file, unsigned int cmd, unsigned long arg
> return -ENOIOCTLCMD;
> }
>
> -static int mmapper_mmap(struct file *file, struct vm_area_struct *vma)
> +static int mmapper_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> int ret = -EINVAL;
> int size;
> diff --git a/drivers/android/binder.c b/drivers/android/binder.c
> index d055b3f2a207..28707987638c 100644
> --- a/drivers/android/binder.c
> +++ b/drivers/android/binder.c
> @@ -4545,7 +4545,8 @@ static const struct vm_operations_struct binder_vm_ops = {
> .fault = binder_vm_fault,
> };
>
> -static int binder_mmap(struct file *filp, struct vm_area_struct *vma)
> +static int binder_mmap(struct file *filp, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> int ret;
> struct binder_proc *proc = filp->private_data;
> diff --git a/drivers/auxdisplay/cfag12864bfb.c b/drivers/auxdisplay/cfag12864bfb.c
> index a3874034e2ce..b8beca99daed 100644
> --- a/drivers/auxdisplay/cfag12864bfb.c
> +++ b/drivers/auxdisplay/cfag12864bfb.c
> @@ -64,7 +64,8 @@ static struct fb_var_screeninfo cfag12864bfb_var = {
> .vmode = FB_VMODE_NONINTERLACED,
> };
>
> -static int cfag12864bfb_mmap(struct fb_info *info, struct vm_area_struct *vma)
> +static int cfag12864bfb_mmap(struct fb_info *info, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> return vm_insert_page(vma, vma->vm_start,
> virt_to_page(cfag12864b_buffer));
> diff --git a/drivers/auxdisplay/ht16k33.c b/drivers/auxdisplay/ht16k33.c
> index fbfa5b4cc567..f48f159c1645 100644
> --- a/drivers/auxdisplay/ht16k33.c
> +++ b/drivers/auxdisplay/ht16k33.c
> @@ -228,7 +228,8 @@ static const struct backlight_ops ht16k33_bl_ops = {
> .check_fb = ht16k33_bl_check_fb,
> };
>
> -static int ht16k33_mmap(struct fb_info *info, struct vm_area_struct *vma)
> +static int ht16k33_mmap(struct fb_info *info, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct ht16k33_priv *priv = info->par;
>
> diff --git a/drivers/char/agp/frontend.c b/drivers/char/agp/frontend.c
> index f6955888e676..c39b90e26c76 100644
> --- a/drivers/char/agp/frontend.c
> +++ b/drivers/char/agp/frontend.c
> @@ -562,7 +562,8 @@ int agp_remove_client(pid_t id)
>
> /* File Operations */
>
> -static int agp_mmap(struct file *file, struct vm_area_struct *vma)
> +static int agp_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> unsigned int size, current_size;
> unsigned long offset;
> diff --git a/drivers/char/bsr.c b/drivers/char/bsr.c
> index a6cef548e01e..93ec4c6f029e 100644
> --- a/drivers/char/bsr.c
> +++ b/drivers/char/bsr.c
> @@ -122,7 +122,8 @@ static struct attribute *bsr_dev_attrs[] = {
> };
> ATTRIBUTE_GROUPS(bsr_dev);
>
> -static int bsr_mmap(struct file *filp, struct vm_area_struct *vma)
> +static int bsr_mmap(struct file *filp, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> unsigned long size = vma->vm_end - vma->vm_start;
> struct bsr_dev *dev = filp->private_data;
> diff --git a/drivers/char/hpet.c b/drivers/char/hpet.c
> index b941e6d59fd6..e817c1b6c52d 100644
> --- a/drivers/char/hpet.c
> +++ b/drivers/char/hpet.c
> @@ -379,7 +379,8 @@ static __init int hpet_mmap_enable(char *str)
> }
> __setup("hpet_mmap", hpet_mmap_enable);
>
> -static int hpet_mmap(struct file *file, struct vm_area_struct *vma)
> +static int hpet_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct hpet_dev *devp;
> unsigned long addr;
> @@ -397,7 +398,8 @@ static int hpet_mmap(struct file *file, struct vm_area_struct *vma)
> return vm_iomap_memory(vma, addr, PAGE_SIZE);
> }
> #else
> -static int hpet_mmap(struct file *file, struct vm_area_struct *vma)
> +static int hpet_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> return -ENOSYS;
> }
> diff --git a/drivers/char/mbcs.c b/drivers/char/mbcs.c
> index 8c9216a0f62e..2cd165571039 100644
> --- a/drivers/char/mbcs.c
> +++ b/drivers/char/mbcs.c
> @@ -475,7 +475,8 @@ static void mbcs_gscr_pioaddr_set(struct mbcs_soft *soft)
> soft->gscr_addr = mbcs_pioaddr(soft, MBCS_GSCR_START);
> }
>
> -static int mbcs_gscr_mmap(struct file *fp, struct vm_area_struct *vma)
> +static int mbcs_gscr_mmap(struct file *fp, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct cx_dev *cx_dev = fp->private_data;
> struct mbcs_soft *soft = cx_dev->soft;
> diff --git a/drivers/char/mbcs.h b/drivers/char/mbcs.h
> index 1a36884c48b5..7d147ed61c67 100644
> --- a/drivers/char/mbcs.h
> +++ b/drivers/char/mbcs.h
> @@ -548,6 +548,7 @@ static ssize_t mbcs_sram_read(struct file *fp, char __user *buf, size_t len,
> static ssize_t mbcs_sram_write(struct file *fp, const char __user *buf, size_t len,
> loff_t * off);
> static loff_t mbcs_sram_llseek(struct file *filp, loff_t off, int whence);
> -static int mbcs_gscr_mmap(struct file *fp, struct vm_area_struct *vma);
> +static int mbcs_gscr_mmap(struct file *fp, struct vm_area_struct *vma,
> + unsigned long map_flags);
>
> #endif // __MBCS_H__
> diff --git a/drivers/char/mem.c b/drivers/char/mem.c
> index 593a8818aca9..79bf151da3bd 100644
> --- a/drivers/char/mem.c
> +++ b/drivers/char/mem.c
> @@ -337,7 +337,8 @@ static const struct vm_operations_struct mmap_mem_ops = {
> #endif
> };
>
> -static int mmap_mem(struct file *file, struct vm_area_struct *vma)
> +static int mmap_mem(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> size_t size = vma->vm_end - vma->vm_start;
> phys_addr_t offset = (phys_addr_t)vma->vm_pgoff << PAGE_SHIFT;
> @@ -376,7 +377,8 @@ static int mmap_mem(struct file *file, struct vm_area_struct *vma)
> return 0;
> }
>
> -static int mmap_kmem(struct file *file, struct vm_area_struct *vma)
> +static int mmap_kmem(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> unsigned long pfn;
>
> @@ -394,7 +396,7 @@ static int mmap_kmem(struct file *file, struct vm_area_struct *vma)
> return -EIO;
>
> vma->vm_pgoff = pfn;
> - return mmap_mem(file, vma);
> + return mmap_mem(file, vma, map_flags);
> }
>
> /*
> @@ -679,7 +681,8 @@ static ssize_t read_iter_zero(struct kiocb *iocb, struct iov_iter *iter)
> return written;
> }
>
> -static int mmap_zero(struct file *file, struct vm_area_struct *vma)
> +static int mmap_zero(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> #ifndef CONFIG_MMU
> return -ENOSYS;
> diff --git a/drivers/char/mspec.c b/drivers/char/mspec.c
> index 7b75669d3670..a3496304c4ef 100644
> --- a/drivers/char/mspec.c
> +++ b/drivers/char/mspec.c
> @@ -287,19 +287,22 @@ mspec_mmap(struct file *file, struct vm_area_struct *vma,
> }
>
> static int
> -fetchop_mmap(struct file *file, struct vm_area_struct *vma)
> +fetchop_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> return mspec_mmap(file, vma, MSPEC_FETCHOP);
> }
>
> static int
> -cached_mmap(struct file *file, struct vm_area_struct *vma)
> +cached_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> return mspec_mmap(file, vma, MSPEC_CACHED);
> }
>
> static int
> -uncached_mmap(struct file *file, struct vm_area_struct *vma)
> +uncached_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> return mspec_mmap(file, vma, MSPEC_UNCACHED);
> }
> diff --git a/drivers/char/uv_mmtimer.c b/drivers/char/uv_mmtimer.c
> index 956ebe2080a5..c95e68ec2ca2 100644
> --- a/drivers/char/uv_mmtimer.c
> +++ b/drivers/char/uv_mmtimer.c
> @@ -40,7 +40,8 @@ MODULE_LICENSE("GPL");
>
> static long uv_mmtimer_ioctl(struct file *file, unsigned int cmd,
> unsigned long arg);
> -static int uv_mmtimer_mmap(struct file *file, struct vm_area_struct *vma);
> +static int uv_mmtimer_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags);
>
> /*
> * Period in femtoseconds (10^-15 s)
> @@ -144,7 +145,8 @@ static long uv_mmtimer_ioctl(struct file *file, unsigned int cmd,
> * Calls remap_pfn_range() to map the clock's registers into
> * the calling process' address space.
> */
> -static int uv_mmtimer_mmap(struct file *file, struct vm_area_struct *vma)
> +static int uv_mmtimer_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> unsigned long uv_mmtimer_addr;
>
> diff --git a/drivers/dax/device.c b/drivers/dax/device.c
> index e9f3b3e4bbf4..52aa8c80f786 100644
> --- a/drivers/dax/device.c
> +++ b/drivers/dax/device.c
> @@ -432,7 +432,8 @@ static const struct vm_operations_struct dax_vm_ops = {
> .huge_fault = dev_dax_huge_fault,
> };
>
> -static int dax_mmap(struct file *filp, struct vm_area_struct *vma)
> +static int dax_mmap(struct file *filp, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct dev_dax *dev_dax = filp->private_data;
> int rc, id;
> diff --git a/drivers/dma-buf/dma-buf.c b/drivers/dma-buf/dma-buf.c
> index 4a038dcf5361..3c0cadb336bd 100644
> --- a/drivers/dma-buf/dma-buf.c
> +++ b/drivers/dma-buf/dma-buf.c
> @@ -81,7 +81,9 @@ static int dma_buf_release(struct inode *inode, struct file *file)
> return 0;
> }
>
> -static int dma_buf_mmap_internal(struct file *file, struct vm_area_struct *vma)
> +static int dma_buf_mmap_internal(struct file *file,
> + struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct dma_buf *dmabuf;
>
> @@ -95,7 +97,7 @@ static int dma_buf_mmap_internal(struct file *file, struct vm_area_struct *vma)
> dmabuf->size >> PAGE_SHIFT)
> return -EINVAL;
>
> - return dmabuf->ops->mmap(dmabuf, vma);
> + return dmabuf->ops->mmap(dmabuf, vma, map_flags);
> }
>
> static loff_t dma_buf_llseek(struct file *file, loff_t offset, int whence)
> @@ -936,6 +938,7 @@ EXPORT_SYMBOL_GPL(dma_buf_kunmap);
> * @vma: [in] vma for the mmap
> * @pgoff: [in] offset in pages where this mmap should start within the
> * dma-buf buffer.
> + * @map_flags: [in] flags that were passed to mmap(2)
> *
> * This function adjusts the passed in vma so that it points at the file of the
> * dma_buf operation. It also adjusts the starting pgoff and does bounds
> @@ -945,7 +948,7 @@ EXPORT_SYMBOL_GPL(dma_buf_kunmap);
> * Can return negative error values, returns 0 on success.
> */
> int dma_buf_mmap(struct dma_buf *dmabuf, struct vm_area_struct *vma,
> - unsigned long pgoff)
> + unsigned long pgoff, unsigned long map_flags)
> {
> struct file *oldfile;
> int ret;
> @@ -968,7 +971,7 @@ int dma_buf_mmap(struct dma_buf *dmabuf, struct vm_area_struct *vma,
> vma->vm_file = dmabuf->file;
> vma->vm_pgoff = pgoff;
>
> - ret = dmabuf->ops->mmap(dmabuf, vma);
> + ret = dmabuf->ops->mmap(dmabuf, vma, map_flags);
> if (ret) {
> /* restore old parameters on failure */
> vma->vm_file = oldfile;
> diff --git a/drivers/firewire/core-cdev.c b/drivers/firewire/core-cdev.c
> index a301fcf46e88..07b8983d31ff 100644
> --- a/drivers/firewire/core-cdev.c
> +++ b/drivers/firewire/core-cdev.c
> @@ -1667,7 +1667,8 @@ static long fw_device_op_compat_ioctl(struct file *file,
> }
> #endif
>
> -static int fw_device_op_mmap(struct file *file, struct vm_area_struct *vma)
> +static int fw_device_op_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct client *client = file->private_data;
> unsigned long size;
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
> index 8b2c294f6f79..59f4e8f68746 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
> @@ -1389,7 +1389,8 @@ void amdgpu_ttm_set_active_vram_size(struct amdgpu_device *adev, u64 size)
> man->size = size >> PAGE_SHIFT;
> }
>
> -int amdgpu_mmap(struct file *filp, struct vm_area_struct *vma)
> +int amdgpu_mmap(struct file *filp, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct drm_file *file_priv;
> struct amdgpu_device *adev;
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h
> index f22a4758719d..234dda254ec3 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h
> @@ -81,7 +81,8 @@ int amdgpu_fill_buffer(struct amdgpu_bo *bo,
> struct reservation_object *resv,
> struct dma_fence **fence);
>
> -int amdgpu_mmap(struct file *filp, struct vm_area_struct *vma);
> +int amdgpu_mmap(struct file *filp, struct vm_area_struct *vma,
> + unsigned long map_flags);
> bool amdgpu_ttm_is_bound(struct ttm_tt *ttm);
> int amdgpu_ttm_bind(struct ttm_buffer_object *bo, struct ttm_mem_reg *bo_mem);
> int amdgpu_ttm_recover_gart(struct amdgpu_device *adev);
> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c b/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c
> index e4a8c2e52cb2..657bfea21ce0 100644
> --- a/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c
> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c
> @@ -39,7 +39,7 @@
>
> static long kfd_ioctl(struct file *, unsigned int, unsigned long);
> static int kfd_open(struct inode *, struct file *);
> -static int kfd_mmap(struct file *, struct vm_area_struct *);
> +static int kfd_mmap(struct file *, struct vm_area_struct *, unsigned long);
>
> static const char kfd_dev_name[] = "kfd";
>
> @@ -1074,7 +1074,8 @@ static long kfd_ioctl(struct file *filep, unsigned int cmd, unsigned long arg)
> return retcode;
> }
>
> -static int kfd_mmap(struct file *filp, struct vm_area_struct *vma)
> +static int kfd_mmap(struct file *filp, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct kfd_process *process;
>
> diff --git a/drivers/gpu/drm/armada/armada_gem.c b/drivers/gpu/drm/armada/armada_gem.c
> index a76ca21d063b..13d2b58f74a2 100644
> --- a/drivers/gpu/drm/armada/armada_gem.c
> +++ b/drivers/gpu/drm/armada/armada_gem.c
> @@ -518,7 +518,8 @@ armada_gem_dmabuf_no_kunmap(struct dma_buf *buf, unsigned long n, void *addr)
> }
>
> static int
> -armada_gem_dmabuf_mmap(struct dma_buf *buf, struct vm_area_struct *vma)
> +armada_gem_dmabuf_mmap(struct dma_buf *buf, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> return -EINVAL;
> }
> diff --git a/drivers/gpu/drm/ast/ast_drv.h b/drivers/gpu/drm/ast/ast_drv.h
> index e6c4cd3dc50e..514d51df79a4 100644
> --- a/drivers/gpu/drm/ast/ast_drv.h
> +++ b/drivers/gpu/drm/ast/ast_drv.h
> @@ -390,7 +390,8 @@ static inline void ast_bo_unreserve(struct ast_bo *bo)
>
> void ast_ttm_placement(struct ast_bo *bo, int domain);
> int ast_bo_push_sysram(struct ast_bo *bo);
> -int ast_mmap(struct file *filp, struct vm_area_struct *vma);
> +int ast_mmap(struct file *filp, struct vm_area_struct *vma,
> + unsigned long map_flags);
>
> /* ast post */
> void ast_enable_vga(struct drm_device *dev);
> diff --git a/drivers/gpu/drm/ast/ast_ttm.c b/drivers/gpu/drm/ast/ast_ttm.c
> index 696a15dc2f3f..12ae616738df 100644
> --- a/drivers/gpu/drm/ast/ast_ttm.c
> +++ b/drivers/gpu/drm/ast/ast_ttm.c
> @@ -417,7 +417,8 @@ int ast_bo_push_sysram(struct ast_bo *bo)
> return 0;
> }
>
> -int ast_mmap(struct file *filp, struct vm_area_struct *vma)
> +int ast_mmap(struct file *filp, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct drm_file *file_priv;
> struct ast_private *ast;
> diff --git a/drivers/gpu/drm/bochs/bochs.h b/drivers/gpu/drm/bochs/bochs.h
> index 76c490c3cdbc..20e9eef85722 100644
> --- a/drivers/gpu/drm/bochs/bochs.h
> +++ b/drivers/gpu/drm/bochs/bochs.h
> @@ -136,7 +136,8 @@ void bochs_hw_setbase(struct bochs_device *bochs,
> /* bochs_mm.c */
> int bochs_mm_init(struct bochs_device *bochs);
> void bochs_mm_fini(struct bochs_device *bochs);
> -int bochs_mmap(struct file *filp, struct vm_area_struct *vma);
> +int bochs_mmap(struct file *filp, struct vm_area_struct *vma,
> + unsigned long map_flags);
>
> int bochs_gem_create(struct drm_device *dev, u32 size, bool iskernel,
> struct drm_gem_object **obj);
> diff --git a/drivers/gpu/drm/bochs/bochs_fbdev.c b/drivers/gpu/drm/bochs/bochs_fbdev.c
> index 14eb8d0d5a00..558977041df5 100644
> --- a/drivers/gpu/drm/bochs/bochs_fbdev.c
> +++ b/drivers/gpu/drm/bochs/bochs_fbdev.c
> @@ -10,7 +10,7 @@
> /* ---------------------------------------------------------------------- */
>
> static int bochsfb_mmap(struct fb_info *info,
> - struct vm_area_struct *vma)
> + struct vm_area_struct *vma, unsigned long map_flags)
> {
> struct drm_fb_helper *fb_helper = info->par;
> struct bochs_device *bochs =
> diff --git a/drivers/gpu/drm/bochs/bochs_mm.c b/drivers/gpu/drm/bochs/bochs_mm.c
> index c4cadb638460..d4c8b30594d4 100644
> --- a/drivers/gpu/drm/bochs/bochs_mm.c
> +++ b/drivers/gpu/drm/bochs/bochs_mm.c
> @@ -327,7 +327,8 @@ int bochs_bo_unpin(struct bochs_bo *bo)
> return 0;
> }
>
> -int bochs_mmap(struct file *filp, struct vm_area_struct *vma)
> +int bochs_mmap(struct file *filp, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct drm_file *file_priv;
> struct bochs_device *bochs;
> diff --git a/drivers/gpu/drm/cirrus/cirrus_drv.h b/drivers/gpu/drm/cirrus/cirrus_drv.h
> index be2d7e488062..d69c5dd0e5ea 100644
> --- a/drivers/gpu/drm/cirrus/cirrus_drv.h
> +++ b/drivers/gpu/drm/cirrus/cirrus_drv.h
> @@ -232,7 +232,8 @@ void cirrus_mm_fini(struct cirrus_device *cirrus);
> void cirrus_ttm_placement(struct cirrus_bo *bo, int domain);
> int cirrus_bo_create(struct drm_device *dev, int size, int align,
> uint32_t flags, struct cirrus_bo **pcirrusbo);
> -int cirrus_mmap(struct file *filp, struct vm_area_struct *vma);
> +int cirrus_mmap(struct file *filp, struct vm_area_struct *vma,
> + unsigned long map_flags);
>
> static inline int cirrus_bo_reserve(struct cirrus_bo *bo, bool no_wait)
> {
> diff --git a/drivers/gpu/drm/cirrus/cirrus_ttm.c b/drivers/gpu/drm/cirrus/cirrus_ttm.c
> index 1ff1838c0d44..efd01ec99c83 100644
> --- a/drivers/gpu/drm/cirrus/cirrus_ttm.c
> +++ b/drivers/gpu/drm/cirrus/cirrus_ttm.c
> @@ -405,7 +405,8 @@ int cirrus_bo_push_sysram(struct cirrus_bo *bo)
> return 0;
> }
>
> -int cirrus_mmap(struct file *filp, struct vm_area_struct *vma)
> +int cirrus_mmap(struct file *filp, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct drm_file *file_priv;
> struct cirrus_device *cirrus;
> diff --git a/drivers/gpu/drm/drm_fb_cma_helper.c b/drivers/gpu/drm/drm_fb_cma_helper.c
> index f2ee88363015..92334f277568 100644
> --- a/drivers/gpu/drm/drm_fb_cma_helper.c
> +++ b/drivers/gpu/drm/drm_fb_cma_helper.c
> @@ -238,7 +238,8 @@ int drm_fb_cma_debugfs_show(struct seq_file *m, void *arg)
> EXPORT_SYMBOL_GPL(drm_fb_cma_debugfs_show);
> #endif
>
> -static int drm_fb_cma_mmap(struct fb_info *info, struct vm_area_struct *vma)
> +static int drm_fb_cma_mmap(struct fb_info *info, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> return dma_mmap_writecombine(info->device, vma, info->screen_base,
> info->fix.smem_start, info->fix.smem_len);
> @@ -254,9 +255,10 @@ static struct fb_ops drm_fbdev_cma_ops = {
> };
>
> static int drm_fbdev_cma_deferred_io_mmap(struct fb_info *info,
> - struct vm_area_struct *vma)
> + struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> - fb_deferred_io_mmap(info, vma);
> + fb_deferred_io_mmap(info, vma, map_flags);
> vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot);
>
> return 0;
> diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c
> index c55f338e380b..f0b91a438c16 100644
> --- a/drivers/gpu/drm/drm_gem.c
> +++ b/drivers/gpu/drm/drm_gem.c
> @@ -995,7 +995,8 @@ EXPORT_SYMBOL(drm_gem_mmap_obj);
> * If the caller is not granted access to the buffer object, the mmap will fail
> * with EACCES. Please see the vma manager for more information.
> */
> -int drm_gem_mmap(struct file *filp, struct vm_area_struct *vma)
> +int drm_gem_mmap(struct file *filp, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct drm_file *priv = filp->private_data;
> struct drm_device *dev = priv->minor->dev;
> diff --git a/drivers/gpu/drm/drm_gem_cma_helper.c b/drivers/gpu/drm/drm_gem_cma_helper.c
> index 373e33f22be4..0eb5db9f0a0d 100644
> --- a/drivers/gpu/drm/drm_gem_cma_helper.c
> +++ b/drivers/gpu/drm/drm_gem_cma_helper.c
> @@ -309,13 +309,14 @@ static int drm_gem_cma_mmap_obj(struct drm_gem_cma_object *cma_obj,
> * Returns:
> * 0 on success or a negative error code on failure.
> */
> -int drm_gem_cma_mmap(struct file *filp, struct vm_area_struct *vma)
> +int drm_gem_cma_mmap(struct file *filp, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct drm_gem_cma_object *cma_obj;
> struct drm_gem_object *gem_obj;
> int ret;
>
> - ret = drm_gem_mmap(filp, vma);
> + ret = drm_gem_mmap(filp, vma, map_flags);
> if (ret)
> return ret;
>
> @@ -512,7 +513,8 @@ EXPORT_SYMBOL_GPL(drm_gem_cma_prime_import_sg_table);
> * 0 on success or a negative error code on failure.
> */
> int drm_gem_cma_prime_mmap(struct drm_gem_object *obj,
> - struct vm_area_struct *vma)
> + struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct drm_gem_cma_object *cma_obj;
> int ret;
> diff --git a/drivers/gpu/drm/drm_prime.c b/drivers/gpu/drm/drm_prime.c
> index 22408badc617..3e9c3cc3ea65 100644
> --- a/drivers/gpu/drm/drm_prime.c
> +++ b/drivers/gpu/drm/drm_prime.c
> @@ -386,7 +386,8 @@ static void drm_gem_dmabuf_kunmap(struct dma_buf *dma_buf,
> }
>
> static int drm_gem_dmabuf_mmap(struct dma_buf *dma_buf,
> - struct vm_area_struct *vma)
> + struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct drm_gem_object *obj = dma_buf->priv;
> struct drm_device *dev = obj->dev;
> @@ -394,7 +395,7 @@ static int drm_gem_dmabuf_mmap(struct dma_buf *dma_buf,
> if (!dev->driver->gem_prime_mmap)
> return -ENOSYS;
>
> - return dev->driver->gem_prime_mmap(obj, vma);
> + return dev->driver->gem_prime_mmap(obj, vma, map_flags);
> }
>
> static const struct dma_buf_ops drm_gem_prime_dmabuf_ops = {
> diff --git a/drivers/gpu/drm/drm_vm.c b/drivers/gpu/drm/drm_vm.c
> index 2660543ad86a..b57d75a540c0 100644
> --- a/drivers/gpu/drm/drm_vm.c
> +++ b/drivers/gpu/drm/drm_vm.c
> @@ -629,7 +629,8 @@ static int drm_mmap_locked(struct file *filp, struct vm_area_struct *vma)
> return 0;
> }
>
> -int drm_legacy_mmap(struct file *filp, struct vm_area_struct *vma)
> +int drm_legacy_mmap(struct file *filp, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct drm_file *priv = filp->private_data;
> struct drm_device *dev = priv->minor->dev;
> diff --git a/drivers/gpu/drm/etnaviv/etnaviv_drv.h b/drivers/gpu/drm/etnaviv/etnaviv_drv.h
> index 058389f93b69..7b62e5238cf6 100644
> --- a/drivers/gpu/drm/etnaviv/etnaviv_drv.h
> +++ b/drivers/gpu/drm/etnaviv/etnaviv_drv.h
> @@ -72,14 +72,16 @@ static inline void etnaviv_queue_work(struct drm_device *dev,
> int etnaviv_ioctl_gem_submit(struct drm_device *dev, void *data,
> struct drm_file *file);
>
> -int etnaviv_gem_mmap(struct file *filp, struct vm_area_struct *vma);
> +int etnaviv_gem_mmap(struct file *filp, struct vm_area_struct *vma,
> + unsigned long map_flags);
> int etnaviv_gem_fault(struct vm_fault *vmf);
> int etnaviv_gem_mmap_offset(struct drm_gem_object *obj, u64 *offset);
> struct sg_table *etnaviv_gem_prime_get_sg_table(struct drm_gem_object *obj);
> void *etnaviv_gem_prime_vmap(struct drm_gem_object *obj);
> void etnaviv_gem_prime_vunmap(struct drm_gem_object *obj, void *vaddr);
> int etnaviv_gem_prime_mmap(struct drm_gem_object *obj,
> - struct vm_area_struct *vma);
> + struct vm_area_struct *vma,
> + unsigned long map_flags);
> struct reservation_object *etnaviv_gem_prime_res_obj(struct drm_gem_object *obj);
> struct drm_gem_object *etnaviv_gem_prime_import_sg_table(struct drm_device *dev,
> struct dma_buf_attachment *attach, struct sg_table *sg);
> diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem.c b/drivers/gpu/drm/etnaviv/etnaviv_gem.c
> index 5a634594a6ce..a50093045008 100644
> --- a/drivers/gpu/drm/etnaviv/etnaviv_gem.c
> +++ b/drivers/gpu/drm/etnaviv/etnaviv_gem.c
> @@ -132,7 +132,7 @@ void etnaviv_gem_put_pages(struct etnaviv_gem_object *etnaviv_obj)
> }
>
> static int etnaviv_gem_mmap_obj(struct etnaviv_gem_object *etnaviv_obj,
> - struct vm_area_struct *vma)
> + struct vm_area_struct *vma, unsigned long map_flags)
> {
> pgprot_t vm_page_prot;
>
> @@ -162,19 +162,20 @@ static int etnaviv_gem_mmap_obj(struct etnaviv_gem_object *etnaviv_obj,
> return 0;
> }
>
> -int etnaviv_gem_mmap(struct file *filp, struct vm_area_struct *vma)
> +int etnaviv_gem_mmap(struct file *filp, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct etnaviv_gem_object *obj;
> int ret;
>
> - ret = drm_gem_mmap(filp, vma);
> + ret = drm_gem_mmap(filp, vma, map_flags);
> if (ret) {
> DBG("mmap failed: %d", ret);
> return ret;
> }
>
> obj = to_etnaviv_bo(vma->vm_private_data);
> - return obj->ops->mmap(obj, vma);
> + return obj->ops->mmap(obj, vma, map_flags);
> }
>
> int etnaviv_gem_fault(struct vm_fault *vmf)
> @@ -890,7 +891,7 @@ static void etnaviv_gem_userptr_release(struct etnaviv_gem_object *etnaviv_obj)
> }
>
> static int etnaviv_gem_userptr_mmap_obj(struct etnaviv_gem_object *etnaviv_obj,
> - struct vm_area_struct *vma)
> + struct vm_area_struct *vma, unsigned long map_flags)
> {
> return -EINVAL;
> }
> diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem.h b/drivers/gpu/drm/etnaviv/etnaviv_gem.h
> index e437fba1209d..5bbde7a1318b 100644
> --- a/drivers/gpu/drm/etnaviv/etnaviv_gem.h
> +++ b/drivers/gpu/drm/etnaviv/etnaviv_gem.h
> @@ -80,7 +80,8 @@ struct etnaviv_gem_ops {
> int (*get_pages)(struct etnaviv_gem_object *);
> void (*release)(struct etnaviv_gem_object *);
> void *(*vmap)(struct etnaviv_gem_object *);
> - int (*mmap)(struct etnaviv_gem_object *, struct vm_area_struct *);
> + int (*mmap)(struct etnaviv_gem_object *, struct vm_area_struct *,
> + unsigned long map_flags);
> };
>
> static inline bool is_active(struct etnaviv_gem_object *etnaviv_obj)
> diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c b/drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c
> index ae884723e9b1..0bd30b8f0c29 100644
> --- a/drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c
> +++ b/drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c
> @@ -42,7 +42,8 @@ void etnaviv_gem_prime_vunmap(struct drm_gem_object *obj, void *vaddr)
> }
>
> int etnaviv_gem_prime_mmap(struct drm_gem_object *obj,
> - struct vm_area_struct *vma)
> + struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct etnaviv_gem_object *etnaviv_obj = to_etnaviv_bo(obj);
> int ret;
> @@ -51,7 +52,7 @@ int etnaviv_gem_prime_mmap(struct drm_gem_object *obj,
> if (ret < 0)
> return ret;
>
> - return etnaviv_obj->ops->mmap(etnaviv_obj, vma);
> + return etnaviv_obj->ops->mmap(etnaviv_obj, vma, map_flags);
> }
>
> int etnaviv_gem_prime_pin(struct drm_gem_object *obj)
> @@ -100,9 +101,9 @@ static void *etnaviv_gem_prime_vmap_impl(struct etnaviv_gem_object *etnaviv_obj)
> }
>
> static int etnaviv_gem_prime_mmap_obj(struct etnaviv_gem_object *etnaviv_obj,
> - struct vm_area_struct *vma)
> + struct vm_area_struct *vma, unsigned long map_flags)
> {
> - return dma_buf_mmap(etnaviv_obj->base.dma_buf, vma, 0);
> + return dma_buf_mmap(etnaviv_obj->base.dma_buf, vma, 0, map_flags);
> }
>
> static const struct etnaviv_gem_ops etnaviv_gem_prime_ops = {
> diff --git a/drivers/gpu/drm/exynos/exynos_drm_fbdev.c b/drivers/gpu/drm/exynos/exynos_drm_fbdev.c
> index c3a068409b48..96a00250f275 100644
> --- a/drivers/gpu/drm/exynos/exynos_drm_fbdev.c
> +++ b/drivers/gpu/drm/exynos/exynos_drm_fbdev.c
> @@ -35,7 +35,7 @@ struct exynos_drm_fbdev {
> };
>
> static int exynos_drm_fb_mmap(struct fb_info *info,
> - struct vm_area_struct *vma)
> + struct vm_area_struct *vma, unsigned long map_flags)
> {
> struct drm_fb_helper *helper = info->par;
> struct exynos_drm_fbdev *exynos_fbd = to_exynos_fbdev(helper);
> diff --git a/drivers/gpu/drm/exynos/exynos_drm_gem.c b/drivers/gpu/drm/exynos/exynos_drm_gem.c
> index 077de014d610..8e68deacf506 100644
> --- a/drivers/gpu/drm/exynos/exynos_drm_gem.c
> +++ b/drivers/gpu/drm/exynos/exynos_drm_gem.c
> @@ -485,13 +485,14 @@ static int exynos_drm_gem_mmap_obj(struct drm_gem_object *obj,
> return ret;
> }
>
> -int exynos_drm_gem_mmap(struct file *filp, struct vm_area_struct *vma)
> +int exynos_drm_gem_mmap(struct file *filp, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct drm_gem_object *obj;
> int ret;
>
> /* set vm_area_struct. */
> - ret = drm_gem_mmap(filp, vma);
> + ret = drm_gem_mmap(filp, vma, map_flags);
> if (ret < 0) {
> DRM_ERROR("failed to mmap.\n");
> return ret;
> @@ -500,7 +501,7 @@ int exynos_drm_gem_mmap(struct file *filp, struct vm_area_struct *vma)
> obj = vma->vm_private_data;
>
> if (obj->import_attach)
> - return dma_buf_mmap(obj->dma_buf, vma, 0);
> + return dma_buf_mmap(obj->dma_buf, vma, 0, map_flags);
>
> return exynos_drm_gem_mmap_obj(obj, vma);
> }
> @@ -581,7 +582,8 @@ void exynos_drm_gem_prime_vunmap(struct drm_gem_object *obj, void *vaddr)
> }
>
> int exynos_drm_gem_prime_mmap(struct drm_gem_object *obj,
> - struct vm_area_struct *vma)
> + struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> int ret;
>
> diff --git a/drivers/gpu/drm/exynos/exynos_drm_gem.h b/drivers/gpu/drm/exynos/exynos_drm_gem.h
> index e86d1a9518c3..d3aacac9da86 100644
> --- a/drivers/gpu/drm/exynos/exynos_drm_gem.h
> +++ b/drivers/gpu/drm/exynos/exynos_drm_gem.h
> @@ -114,7 +114,8 @@ int exynos_drm_gem_dumb_create(struct drm_file *file_priv,
> int exynos_drm_gem_fault(struct vm_fault *vmf);
>
> /* set vm_flags and we can change the vm attribute to other one at here. */
> -int exynos_drm_gem_mmap(struct file *filp, struct vm_area_struct *vma);
> +int exynos_drm_gem_mmap(struct file *filp, struct vm_area_struct *vma,
> + unsigned long map_flags);
>
> /* low-level interface prime helpers */
> struct sg_table *exynos_drm_gem_prime_get_sg_table(struct drm_gem_object *obj);
> @@ -125,6 +126,7 @@ exynos_drm_gem_prime_import_sg_table(struct drm_device *dev,
> void *exynos_drm_gem_prime_vmap(struct drm_gem_object *obj);
> void exynos_drm_gem_prime_vunmap(struct drm_gem_object *obj, void *vaddr);
> int exynos_drm_gem_prime_mmap(struct drm_gem_object *obj,
> - struct vm_area_struct *vma);
> + struct vm_area_struct *vma,
> + unsigned long map_flags);
>
> #endif
> diff --git a/drivers/gpu/drm/gma500/framebuffer.c b/drivers/gpu/drm/gma500/framebuffer.c
> index 2570c7f647a6..06777f46324e 100644
> --- a/drivers/gpu/drm/gma500/framebuffer.c
> +++ b/drivers/gpu/drm/gma500/framebuffer.c
> @@ -161,7 +161,8 @@ static const struct vm_operations_struct psbfb_vm_ops = {
> .close = psbfb_vm_close
> };
>
> -static int psbfb_mmap(struct fb_info *info, struct vm_area_struct *vma)
> +static int psbfb_mmap(struct fb_info *info, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct psb_fbdev *fbdev = info->par;
> struct psb_framebuffer *psbfb = &fbdev->pfb;
> diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h
> index e195521eb41e..e876e74348ae 100644
> --- a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h
> +++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h
> @@ -107,7 +107,8 @@ int hibmc_dumb_create(struct drm_file *file, struct drm_device *dev,
> struct drm_mode_create_dumb *args);
> int hibmc_dumb_mmap_offset(struct drm_file *file, struct drm_device *dev,
> u32 handle, u64 *offset);
> -int hibmc_mmap(struct file *filp, struct vm_area_struct *vma);
> +int hibmc_mmap(struct file *filp, struct vm_area_struct *vma,
> + unsigned long map_flags);
>
> extern const struct drm_mode_config_funcs hibmc_mode_funcs;
>
> diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_ttm.c b/drivers/gpu/drm/hisilicon/hibmc/hibmc_ttm.c
> index 3518167a7dc4..c9a92ce598b3 100644
> --- a/drivers/gpu/drm/hisilicon/hibmc/hibmc_ttm.c
> +++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_ttm.c
> @@ -389,7 +389,8 @@ int hibmc_bo_unpin(struct hibmc_bo *bo)
> return 0;
> }
>
> -int hibmc_mmap(struct file *filp, struct vm_area_struct *vma)
> +int hibmc_mmap(struct file *filp, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct drm_file *file_priv;
> struct hibmc_drm_private *hibmc;
> diff --git a/drivers/gpu/drm/i810/i810_dma.c b/drivers/gpu/drm/i810/i810_dma.c
> index 576a417690d4..c7ff2e7072ca 100644
> --- a/drivers/gpu/drm/i810/i810_dma.c
> +++ b/drivers/gpu/drm/i810/i810_dma.c
> @@ -84,7 +84,8 @@ static int i810_freelist_put(struct drm_device *dev, struct drm_buf *buf)
> return 0;
> }
>
> -static int i810_mmap_buffers(struct file *filp, struct vm_area_struct *vma)
> +static int i810_mmap_buffers(struct file *filp, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct drm_file *priv = filp->private_data;
> struct drm_device *dev;
> diff --git a/drivers/gpu/drm/i915/i915_gem_dmabuf.c b/drivers/gpu/drm/i915/i915_gem_dmabuf.c
> index 6176e589cf09..98b07fd2db3c 100644
> --- a/drivers/gpu/drm/i915/i915_gem_dmabuf.c
> +++ b/drivers/gpu/drm/i915/i915_gem_dmabuf.c
> @@ -154,7 +154,9 @@ static void i915_gem_dmabuf_kunmap(struct dma_buf *dma_buf, unsigned long page_n
> i915_gem_object_unpin_pages(obj);
> }
>
> -static int i915_gem_dmabuf_mmap(struct dma_buf *dma_buf, struct vm_area_struct *vma)
> +static int i915_gem_dmabuf_mmap(struct dma_buf *dma_buf,
> + struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct drm_i915_gem_object *obj = dma_buf_to_obj(dma_buf);
> int ret;
> @@ -165,7 +167,7 @@ static int i915_gem_dmabuf_mmap(struct dma_buf *dma_buf, struct vm_area_struct *
> if (!obj->base.filp)
> return -ENODEV;
>
> - ret = call_mmap(obj->base.filp, vma);
> + ret = call_mmap(obj->base.filp, vma, map_flags);
> if (ret)
> return ret;
>
> diff --git a/drivers/gpu/drm/i915/selftests/mock_dmabuf.c b/drivers/gpu/drm/i915/selftests/mock_dmabuf.c
> index 302f7d103635..20f2d4bb4172 100644
> --- a/drivers/gpu/drm/i915/selftests/mock_dmabuf.c
> +++ b/drivers/gpu/drm/i915/selftests/mock_dmabuf.c
> @@ -120,7 +120,9 @@ static void mock_dmabuf_kunmap(struct dma_buf *dma_buf, unsigned long page_num,
> return kunmap(mock->pages[page_num]);
> }
>
> -static int mock_dmabuf_mmap(struct dma_buf *dma_buf, struct vm_area_struct *vma)
> +static int mock_dmabuf_mmap(struct dma_buf *dma_buf,
> + struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> return -ENODEV;
> }
> diff --git a/drivers/gpu/drm/mediatek/mtk_drm_gem.c b/drivers/gpu/drm/mediatek/mtk_drm_gem.c
> index f595ac816b55..da6e7e72c7ce 100644
> --- a/drivers/gpu/drm/mediatek/mtk_drm_gem.c
> +++ b/drivers/gpu/drm/mediatek/mtk_drm_gem.c
> @@ -154,7 +154,8 @@ static int mtk_drm_gem_object_mmap(struct drm_gem_object *obj,
> return ret;
> }
>
> -int mtk_drm_gem_mmap_buf(struct drm_gem_object *obj, struct vm_area_struct *vma)
> +int mtk_drm_gem_mmap_buf(struct drm_gem_object *obj,
> + struct vm_area_struct *vma, unsigned long map_flags)
> {
> int ret;
>
> @@ -165,12 +166,13 @@ int mtk_drm_gem_mmap_buf(struct drm_gem_object *obj, struct vm_area_struct *vma)
> return mtk_drm_gem_object_mmap(obj, vma);
> }
>
> -int mtk_drm_gem_mmap(struct file *filp, struct vm_area_struct *vma)
> +int mtk_drm_gem_mmap(struct file *filp, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct drm_gem_object *obj;
> int ret;
>
> - ret = drm_gem_mmap(filp, vma);
> + ret = drm_gem_mmap(filp, vma, map_flags);
> if (ret)
> return ret;
>
> diff --git a/drivers/gpu/drm/mediatek/mtk_drm_gem.h b/drivers/gpu/drm/mediatek/mtk_drm_gem.h
> index 534639b43a1c..c11f89869fd2 100644
> --- a/drivers/gpu/drm/mediatek/mtk_drm_gem.h
> +++ b/drivers/gpu/drm/mediatek/mtk_drm_gem.h
> @@ -46,9 +46,10 @@ struct mtk_drm_gem_obj *mtk_drm_gem_create(struct drm_device *dev, size_t size,
> bool alloc_kmap);
> int mtk_drm_gem_dumb_create(struct drm_file *file_priv, struct drm_device *dev,
> struct drm_mode_create_dumb *args);
> -int mtk_drm_gem_mmap(struct file *filp, struct vm_area_struct *vma);
> +int mtk_drm_gem_mmap(struct file *filp, struct vm_area_struct *vma,
> + unsigned long map_flags);
> int mtk_drm_gem_mmap_buf(struct drm_gem_object *obj,
> - struct vm_area_struct *vma);
> + struct vm_area_struct *vma, unsigned long map_flags);
> struct sg_table *mtk_gem_prime_get_sg_table(struct drm_gem_object *obj);
> struct drm_gem_object *mtk_gem_prime_import_sg_table(struct drm_device *dev,
> struct dma_buf_attachment *attach, struct sg_table *sg);
> diff --git a/drivers/gpu/drm/mgag200/mgag200_drv.h b/drivers/gpu/drm/mgag200/mgag200_drv.h
> index 04f1dfba12e5..f014b31d1885 100644
> --- a/drivers/gpu/drm/mgag200/mgag200_drv.h
> +++ b/drivers/gpu/drm/mgag200/mgag200_drv.h
> @@ -296,7 +296,8 @@ int mgag200_bo_create(struct drm_device *dev, int size, int align,
> uint32_t flags, struct mgag200_bo **pastbo);
> int mgag200_mm_init(struct mga_device *mdev);
> void mgag200_mm_fini(struct mga_device *mdev);
> -int mgag200_mmap(struct file *filp, struct vm_area_struct *vma);
> +int mgag200_mmap(struct file *filp, struct vm_area_struct *vma,
> + unsigned long map_flags);
> int mgag200_bo_pin(struct mgag200_bo *bo, u32 pl_flag, u64 *gpu_addr);
> int mgag200_bo_unpin(struct mgag200_bo *bo);
> int mgag200_bo_push_sysram(struct mgag200_bo *bo);
> diff --git a/drivers/gpu/drm/mgag200/mgag200_ttm.c b/drivers/gpu/drm/mgag200/mgag200_ttm.c
> index 3e7e1cd31395..1f1964e54b0c 100644
> --- a/drivers/gpu/drm/mgag200/mgag200_ttm.c
> +++ b/drivers/gpu/drm/mgag200/mgag200_ttm.c
> @@ -418,7 +418,8 @@ int mgag200_bo_push_sysram(struct mgag200_bo *bo)
> return 0;
> }
>
> -int mgag200_mmap(struct file *filp, struct vm_area_struct *vma)
> +int mgag200_mmap(struct file *filp, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct drm_file *file_priv;
> struct mga_device *mdev;
> diff --git a/drivers/gpu/drm/msm/msm_drv.h b/drivers/gpu/drm/msm/msm_drv.h
> index 5e8109c07560..7b35fa953091 100644
> --- a/drivers/gpu/drm/msm/msm_drv.h
> +++ b/drivers/gpu/drm/msm/msm_drv.h
> @@ -194,7 +194,8 @@ void msm_gem_shrinker_cleanup(struct drm_device *dev);
>
> int msm_gem_mmap_obj(struct drm_gem_object *obj,
> struct vm_area_struct *vma);
> -int msm_gem_mmap(struct file *filp, struct vm_area_struct *vma);
> +int msm_gem_mmap(struct file *filp, struct vm_area_struct *vma,
> + unsigned long map_flags);
> int msm_gem_fault(struct vm_fault *vmf);
> uint64_t msm_gem_mmap_offset(struct drm_gem_object *obj);
> int msm_gem_get_iova(struct drm_gem_object *obj,
> @@ -212,7 +213,8 @@ int msm_gem_dumb_map_offset(struct drm_file *file, struct drm_device *dev,
> struct sg_table *msm_gem_prime_get_sg_table(struct drm_gem_object *obj);
> void *msm_gem_prime_vmap(struct drm_gem_object *obj);
> void msm_gem_prime_vunmap(struct drm_gem_object *obj, void *vaddr);
> -int msm_gem_prime_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma);
> +int msm_gem_prime_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma,
> + unsigned long map_flags);
> struct reservation_object *msm_gem_prime_res_obj(struct drm_gem_object *obj);
> struct drm_gem_object *msm_gem_prime_import_sg_table(struct drm_device *dev,
> struct dma_buf_attachment *attach, struct sg_table *sg);
> diff --git a/drivers/gpu/drm/msm/msm_fbdev.c b/drivers/gpu/drm/msm/msm_fbdev.c
> index c178563fcd4d..38787f483a8d 100644
> --- a/drivers/gpu/drm/msm/msm_fbdev.c
> +++ b/drivers/gpu/drm/msm/msm_fbdev.c
> @@ -23,7 +23,8 @@
>
> extern int msm_gem_mmap_obj(struct drm_gem_object *obj,
> struct vm_area_struct *vma);
> -static int msm_fbdev_mmap(struct fb_info *info, struct vm_area_struct *vma);
> +static int msm_fbdev_mmap(struct fb_info *info, struct vm_area_struct *vma,
> + unsigned long map_flags);
>
> /*
> * fbdev funcs, to implement legacy fbdev interface on top of drm driver
> @@ -51,7 +52,8 @@ static struct fb_ops msm_fb_ops = {
> .fb_mmap = msm_fbdev_mmap,
> };
>
> -static int msm_fbdev_mmap(struct fb_info *info, struct vm_area_struct *vma)
> +static int msm_fbdev_mmap(struct fb_info *info, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct drm_fb_helper *helper = (struct drm_fb_helper *)info->par;
> struct msm_fbdev *fbdev = to_msm_fbdev(helper);
> diff --git a/drivers/gpu/drm/msm/msm_gem.c b/drivers/gpu/drm/msm/msm_gem.c
> index f15821a0d900..d77cfd169f91 100644
> --- a/drivers/gpu/drm/msm/msm_gem.c
> +++ b/drivers/gpu/drm/msm/msm_gem.c
> @@ -198,11 +198,12 @@ int msm_gem_mmap_obj(struct drm_gem_object *obj,
> return 0;
> }
>
> -int msm_gem_mmap(struct file *filp, struct vm_area_struct *vma)
> +int msm_gem_mmap(struct file *filp, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> int ret;
>
> - ret = drm_gem_mmap(filp, vma);
> + ret = drm_gem_mmap(filp, vma, map_flags);
> if (ret) {
> DBG("mmap failed: %d", ret);
> return ret;
> diff --git a/drivers/gpu/drm/msm/msm_gem_prime.c b/drivers/gpu/drm/msm/msm_gem_prime.c
> index 13403c6da6c7..23a3c45be7a0 100644
> --- a/drivers/gpu/drm/msm/msm_gem_prime.c
> +++ b/drivers/gpu/drm/msm/msm_gem_prime.c
> @@ -41,7 +41,8 @@ void msm_gem_prime_vunmap(struct drm_gem_object *obj, void *vaddr)
> msm_gem_put_vaddr(obj);
> }
>
> -int msm_gem_prime_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma)
> +int msm_gem_prime_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> int ret;
>
> diff --git a/drivers/gpu/drm/nouveau/nouveau_ttm.c b/drivers/gpu/drm/nouveau/nouveau_ttm.c
> index b0ad7fcefcf5..61c8f3a8a33b 100644
> --- a/drivers/gpu/drm/nouveau/nouveau_ttm.c
> +++ b/drivers/gpu/drm/nouveau/nouveau_ttm.c
> @@ -267,13 +267,14 @@ const struct ttm_mem_type_manager_func nv04_gart_manager = {
> };
>
> int
> -nouveau_ttm_mmap(struct file *filp, struct vm_area_struct *vma)
> +nouveau_ttm_mmap(struct file *filp, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct drm_file *file_priv = filp->private_data;
> struct nouveau_drm *drm = nouveau_drm(file_priv->minor->dev);
>
> if (unlikely(vma->vm_pgoff < DRM_FILE_PAGE_OFFSET))
> - return drm_legacy_mmap(filp, vma);
> + return drm_legacy_mmap(filp, vma, map_flags);
>
> return ttm_bo_mmap(filp, vma, &drm->ttm.bdev);
> }
> diff --git a/drivers/gpu/drm/nouveau/nouveau_ttm.h b/drivers/gpu/drm/nouveau/nouveau_ttm.h
> index 25b0de413352..9a1d08adae8a 100644
> --- a/drivers/gpu/drm/nouveau/nouveau_ttm.h
> +++ b/drivers/gpu/drm/nouveau/nouveau_ttm.h
> @@ -17,7 +17,7 @@ struct ttm_tt *nouveau_sgdma_create_ttm(struct ttm_bo_device *,
>
> int nouveau_ttm_init(struct nouveau_drm *drm);
> void nouveau_ttm_fini(struct nouveau_drm *drm);
> -int nouveau_ttm_mmap(struct file *, struct vm_area_struct *);
> +int nouveau_ttm_mmap(struct file *, struct vm_area_struct *, unsigned long);
>
> int nouveau_ttm_global_init(struct nouveau_drm *);
> void nouveau_ttm_global_release(struct nouveau_drm *);
> diff --git a/drivers/gpu/drm/omapdrm/omap_drv.h b/drivers/gpu/drm/omapdrm/omap_drv.h
> index 4bd1e9070b31..f6be59d20781 100644
> --- a/drivers/gpu/drm/omapdrm/omap_drv.h
> +++ b/drivers/gpu/drm/omapdrm/omap_drv.h
> @@ -168,7 +168,8 @@ int omap_gem_dumb_map_offset(struct drm_file *file, struct drm_device *dev,
> uint32_t handle, uint64_t *offset);
> int omap_gem_dumb_create(struct drm_file *file, struct drm_device *dev,
> struct drm_mode_create_dumb *args);
> -int omap_gem_mmap(struct file *filp, struct vm_area_struct *vma);
> +int omap_gem_mmap(struct file *filp, struct vm_area_struct *vma,
> + unsigned long map_flags);
> int omap_gem_mmap_obj(struct drm_gem_object *obj,
> struct vm_area_struct *vma);
> int omap_gem_fault(struct vm_fault *vmf);
> diff --git a/drivers/gpu/drm/omapdrm/omap_gem.c b/drivers/gpu/drm/omapdrm/omap_gem.c
> index 5c5c86ddd6f4..22538ab2fbc8 100644
> --- a/drivers/gpu/drm/omapdrm/omap_gem.c
> +++ b/drivers/gpu/drm/omapdrm/omap_gem.c
> @@ -561,11 +561,12 @@ int omap_gem_fault(struct vm_fault *vmf)
> }
>
> /** We override mainly to fix up some of the vm mapping flags.. */
> -int omap_gem_mmap(struct file *filp, struct vm_area_struct *vma)
> +int omap_gem_mmap(struct file *filp, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> int ret;
>
> - ret = drm_gem_mmap(filp, vma);
> + ret = drm_gem_mmap(filp, vma, map_flags);
> if (ret) {
> DBG("mmap failed: %d", ret);
> return ret;
> diff --git a/drivers/gpu/drm/omapdrm/omap_gem_dmabuf.c b/drivers/gpu/drm/omapdrm/omap_gem_dmabuf.c
> index afdbad5c866a..287bbdcf5208 100644
> --- a/drivers/gpu/drm/omapdrm/omap_gem_dmabuf.c
> +++ b/drivers/gpu/drm/omapdrm/omap_gem_dmabuf.c
> @@ -132,7 +132,7 @@ static void omap_gem_dmabuf_kunmap(struct dma_buf *buffer,
> }
>
> static int omap_gem_dmabuf_mmap(struct dma_buf *buffer,
> - struct vm_area_struct *vma)
> + struct vm_area_struct *vma, unsigned long map_flags)
> {
> struct drm_gem_object *obj = buffer->priv;
> int ret = 0;
> diff --git a/drivers/gpu/drm/qxl/qxl_drv.h b/drivers/gpu/drm/qxl/qxl_drv.h
> index 3397a1907336..f81d73b32773 100644
> --- a/drivers/gpu/drm/qxl/qxl_drv.h
> +++ b/drivers/gpu/drm/qxl/qxl_drv.h
> @@ -422,7 +422,8 @@ int qxl_mode_dumb_mmap(struct drm_file *filp,
> /* qxl ttm */
> int qxl_ttm_init(struct qxl_device *qdev);
> void qxl_ttm_fini(struct qxl_device *qdev);
> -int qxl_mmap(struct file *filp, struct vm_area_struct *vma);
> +int qxl_mmap(struct file *filp, struct vm_area_struct *vma,
> + unsigned long map_flags);
>
> /* qxl image */
>
> @@ -531,7 +532,8 @@ struct drm_gem_object *qxl_gem_prime_import_sg_table(
> void *qxl_gem_prime_vmap(struct drm_gem_object *obj);
> void qxl_gem_prime_vunmap(struct drm_gem_object *obj, void *vaddr);
> int qxl_gem_prime_mmap(struct drm_gem_object *obj,
> - struct vm_area_struct *vma);
> + struct vm_area_struct *vma,
> + unsigned long map_flags);
>
> /* qxl_irq.c */
> int qxl_irq_init(struct qxl_device *qdev);
> diff --git a/drivers/gpu/drm/qxl/qxl_prime.c b/drivers/gpu/drm/qxl/qxl_prime.c
> index 9f029dda1f07..bc20b2c5fc66 100644
> --- a/drivers/gpu/drm/qxl/qxl_prime.c
> +++ b/drivers/gpu/drm/qxl/qxl_prime.c
> @@ -65,7 +65,7 @@ void qxl_gem_prime_vunmap(struct drm_gem_object *obj, void *vaddr)
> }
>
> int qxl_gem_prime_mmap(struct drm_gem_object *obj,
> - struct vm_area_struct *area)
> + struct vm_area_struct *area, unsigned long map_flags)
> {
> WARN_ONCE(1, "not implemented");
> return -ENOSYS;
> diff --git a/drivers/gpu/drm/qxl/qxl_ttm.c b/drivers/gpu/drm/qxl/qxl_ttm.c
> index 7ecf8a4b9fe6..598daf8658c2 100644
> --- a/drivers/gpu/drm/qxl/qxl_ttm.c
> +++ b/drivers/gpu/drm/qxl/qxl_ttm.c
> @@ -117,7 +117,8 @@ static int qxl_ttm_fault(struct vm_fault *vmf)
> return r;
> }
>
> -int qxl_mmap(struct file *filp, struct vm_area_struct *vma)
> +int qxl_mmap(struct file *filp, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct drm_file *file_priv;
> struct qxl_device *qdev;
> diff --git a/drivers/gpu/drm/radeon/radeon_drv.c b/drivers/gpu/drm/radeon/radeon_drv.c
> index f4becad0a78c..b71098cbd3d4 100644
> --- a/drivers/gpu/drm/radeon/radeon_drv.c
> +++ b/drivers/gpu/drm/radeon/radeon_drv.c
> @@ -135,7 +135,8 @@ extern int radeon_get_crtc_scanoutpos(struct drm_device *dev, unsigned int crtc,
> extern bool radeon_is_px(struct drm_device *dev);
> extern const struct drm_ioctl_desc radeon_ioctls_kms[];
> extern int radeon_max_kms_ioctl;
> -int radeon_mmap(struct file *filp, struct vm_area_struct *vma);
> +int radeon_mmap(struct file *filp, struct vm_area_struct *vma,
> + unsigned long map_flags);
> int radeon_mode_dumb_mmap(struct drm_file *filp,
> struct drm_device *dev,
> uint32_t handle, uint64_t *offset_p);
> diff --git a/drivers/gpu/drm/radeon/radeon_ttm.c b/drivers/gpu/drm/radeon/radeon_ttm.c
> index bf69bf9086bf..0253fb650012 100644
> --- a/drivers/gpu/drm/radeon/radeon_ttm.c
> +++ b/drivers/gpu/drm/radeon/radeon_ttm.c
> @@ -997,7 +997,8 @@ static int radeon_ttm_fault(struct vm_fault *vmf)
> return r;
> }
>
> -int radeon_mmap(struct file *filp, struct vm_area_struct *vma)
> +int radeon_mmap(struct file *filp, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct drm_file *file_priv;
> struct radeon_device *rdev;
> diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_fbdev.c b/drivers/gpu/drm/rockchip/rockchip_drm_fbdev.c
> index 724579ebf947..bf49db60cc16 100644
> --- a/drivers/gpu/drm/rockchip/rockchip_drm_fbdev.c
> +++ b/drivers/gpu/drm/rockchip/rockchip_drm_fbdev.c
> @@ -27,12 +27,13 @@
> container_of(x, struct rockchip_drm_private, fbdev_helper)
>
> static int rockchip_fbdev_mmap(struct fb_info *info,
> - struct vm_area_struct *vma)
> + struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct drm_fb_helper *helper = info->par;
> struct rockchip_drm_private *private = to_drm_private(helper);
>
> - return rockchip_gem_mmap_buf(private->fbdev_bo, vma);
> + return rockchip_gem_mmap_buf(private->fbdev_bo, vma, map_flags);
> }
>
> static struct fb_ops rockchip_drm_fbdev_ops = {
> diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_gem.c b/drivers/gpu/drm/rockchip/rockchip_drm_gem.c
> index 1869c8bb76c8..18dc047909bf 100644
> --- a/drivers/gpu/drm/rockchip/rockchip_drm_gem.c
> +++ b/drivers/gpu/drm/rockchip/rockchip_drm_gem.c
> @@ -276,7 +276,7 @@ static int rockchip_drm_gem_object_mmap(struct drm_gem_object *obj,
> }
>
> int rockchip_gem_mmap_buf(struct drm_gem_object *obj,
> - struct vm_area_struct *vma)
> + struct vm_area_struct *vma, unsigned long map_flags)
> {
> int ret;
>
> @@ -288,12 +288,13 @@ int rockchip_gem_mmap_buf(struct drm_gem_object *obj,
> }
>
> /* drm driver mmap file operations */
> -int rockchip_gem_mmap(struct file *filp, struct vm_area_struct *vma)
> +int rockchip_gem_mmap(struct file *filp, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct drm_gem_object *obj;
> int ret;
>
> - ret = drm_gem_mmap(filp, vma);
> + ret = drm_gem_mmap(filp, vma, map_flags);
> if (ret)
> return ret;
>
> diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_gem.h b/drivers/gpu/drm/rockchip/rockchip_drm_gem.h
> index f237375582fb..47fa81a9c338 100644
> --- a/drivers/gpu/drm/rockchip/rockchip_drm_gem.h
> +++ b/drivers/gpu/drm/rockchip/rockchip_drm_gem.h
> @@ -42,11 +42,12 @@ void *rockchip_gem_prime_vmap(struct drm_gem_object *obj);
> void rockchip_gem_prime_vunmap(struct drm_gem_object *obj, void *vaddr);
>
> /* drm driver mmap file operations */
> -int rockchip_gem_mmap(struct file *filp, struct vm_area_struct *vma);
> +int rockchip_gem_mmap(struct file *filp, struct vm_area_struct *vma,
> + unsigned long map_flags);
>
> /* mmap a gem object to userspace. */
> int rockchip_gem_mmap_buf(struct drm_gem_object *obj,
> - struct vm_area_struct *vma);
> + struct vm_area_struct *vma, unsigned long map_flags);
>
> struct rockchip_gem_object *
> rockchip_gem_create_object(struct drm_device *drm, unsigned int size,
> diff --git a/drivers/gpu/drm/tegra/gem.c b/drivers/gpu/drm/tegra/gem.c
> index ab1e53d434e8..f89044f30a7b 100644
> --- a/drivers/gpu/drm/tegra/gem.c
> +++ b/drivers/gpu/drm/tegra/gem.c
> @@ -497,12 +497,13 @@ static int tegra_gem_mmap(struct drm_gem_object *gem,
> return 0;
> }
>
> -int tegra_drm_mmap(struct file *file, struct vm_area_struct *vma)
> +int tegra_drm_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct drm_gem_object *gem;
> int err;
>
> - err = drm_gem_mmap(file, vma);
> + err = drm_gem_mmap(file, vma, map_flags);
> if (err < 0)
> return err;
>
> @@ -592,7 +593,9 @@ static void tegra_gem_prime_kunmap(struct dma_buf *buf, unsigned long page,
> {
> }
>
> -static int tegra_gem_prime_mmap(struct dma_buf *buf, struct vm_area_struct *vma)
> +static int tegra_gem_prime_mmap(struct dma_buf *buf,
> + struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct drm_gem_object *gem = buf->priv;
> int err;
> diff --git a/drivers/gpu/drm/tegra/gem.h b/drivers/gpu/drm/tegra/gem.h
> index 8eb9fd24ef0e..b50c3deba7d0 100644
> --- a/drivers/gpu/drm/tegra/gem.h
> +++ b/drivers/gpu/drm/tegra/gem.h
> @@ -68,7 +68,8 @@ void tegra_bo_free_object(struct drm_gem_object *gem);
> int tegra_bo_dumb_create(struct drm_file *file, struct drm_device *drm,
> struct drm_mode_create_dumb *args);
>
> -int tegra_drm_mmap(struct file *file, struct vm_area_struct *vma);
> +int tegra_drm_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags);
>
> extern const struct vm_operations_struct tegra_bo_vm_ops;
>
> diff --git a/drivers/gpu/drm/udl/udl_dmabuf.c b/drivers/gpu/drm/udl/udl_dmabuf.c
> index 2867ed155ff6..e2dc5f9dd788 100644
> --- a/drivers/gpu/drm/udl/udl_dmabuf.c
> +++ b/drivers/gpu/drm/udl/udl_dmabuf.c
> @@ -179,7 +179,8 @@ static void udl_dmabuf_kunmap_atomic(struct dma_buf *dma_buf,
> }
>
> static int udl_dmabuf_mmap(struct dma_buf *dma_buf,
> - struct vm_area_struct *vma)
> + struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> /* TODO */
>
> diff --git a/drivers/gpu/drm/udl/udl_drv.h b/drivers/gpu/drm/udl/udl_drv.h
> index 2a75ab80527a..3faab1a52dad 100644
> --- a/drivers/gpu/drm/udl/udl_drv.h
> +++ b/drivers/gpu/drm/udl/udl_drv.h
> @@ -133,7 +133,8 @@ int udl_gem_get_pages(struct udl_gem_object *obj);
> void udl_gem_put_pages(struct udl_gem_object *obj);
> int udl_gem_vmap(struct udl_gem_object *obj);
> void udl_gem_vunmap(struct udl_gem_object *obj);
> -int udl_drm_gem_mmap(struct file *filp, struct vm_area_struct *vma);
> +int udl_drm_gem_mmap(struct file *filp, struct vm_area_struct *vma,
> + unsigned long map_flags);
> int udl_gem_fault(struct vm_fault *vmf);
>
> int udl_handle_damage(struct udl_framebuffer *fb, int x, int y,
> diff --git a/drivers/gpu/drm/udl/udl_fb.c b/drivers/gpu/drm/udl/udl_fb.c
> index b5b335c9b2bb..6edbbac4c96c 100644
> --- a/drivers/gpu/drm/udl/udl_fb.c
> +++ b/drivers/gpu/drm/udl/udl_fb.c
> @@ -155,7 +155,8 @@ int udl_handle_damage(struct udl_framebuffer *fb, int x, int y,
> return 0;
> }
>
> -static int udl_fb_mmap(struct fb_info *info, struct vm_area_struct *vma)
> +static int udl_fb_mmap(struct fb_info *info, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> unsigned long start = vma->vm_start;
> unsigned long size = vma->vm_end - vma->vm_start;
> diff --git a/drivers/gpu/drm/udl/udl_gem.c b/drivers/gpu/drm/udl/udl_gem.c
> index dee6bd9a3dd1..3dea34f6850d 100644
> --- a/drivers/gpu/drm/udl/udl_gem.c
> +++ b/drivers/gpu/drm/udl/udl_gem.c
> @@ -84,11 +84,12 @@ int udl_dumb_create(struct drm_file *file,
> args->size, &args->handle);
> }
>
> -int udl_drm_gem_mmap(struct file *filp, struct vm_area_struct *vma)
> +int udl_drm_gem_mmap(struct file *filp, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> int ret;
>
> - ret = drm_gem_mmap(filp, vma);
> + ret = drm_gem_mmap(filp, vma, map_flags);
> if (ret)
> return ret;
>
> diff --git a/drivers/gpu/drm/vc4/vc4_bo.c b/drivers/gpu/drm/vc4/vc4_bo.c
> index 3afdbf4bc10b..9695e0a0feb9 100644
> --- a/drivers/gpu/drm/vc4/vc4_bo.c
> +++ b/drivers/gpu/drm/vc4/vc4_bo.c
> @@ -489,13 +489,14 @@ vc4_prime_export(struct drm_device *dev, struct drm_gem_object *obj, int flags)
> return drm_gem_prime_export(dev, obj, flags);
> }
>
> -int vc4_mmap(struct file *filp, struct vm_area_struct *vma)
> +int vc4_mmap(struct file *filp, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct drm_gem_object *gem_obj;
> struct vc4_bo *bo;
> int ret;
>
> - ret = drm_gem_mmap(filp, vma);
> + ret = drm_gem_mmap(filp, vma, map_flags);
> if (ret)
> return ret;
>
> @@ -523,7 +524,8 @@ int vc4_mmap(struct file *filp, struct vm_area_struct *vma)
> return ret;
> }
>
> -int vc4_prime_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma)
> +int vc4_prime_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct vc4_bo *bo = to_vc4_bo(obj);
>
> @@ -532,7 +534,7 @@ int vc4_prime_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma)
> return -EINVAL;
> }
>
> - return drm_gem_cma_prime_mmap(obj, vma);
> + return drm_gem_cma_prime_mmap(obj, vma, map_flags);
> }
>
> void *vc4_prime_vmap(struct drm_gem_object *obj)
> diff --git a/drivers/gpu/drm/vc4/vc4_drv.h b/drivers/gpu/drm/vc4/vc4_drv.h
> index 87f2d8e5c134..5c01bad51c7e 100644
> --- a/drivers/gpu/drm/vc4/vc4_drv.h
> +++ b/drivers/gpu/drm/vc4/vc4_drv.h
> @@ -503,9 +503,11 @@ int vc4_get_hang_state_ioctl(struct drm_device *dev, void *data,
> struct drm_file *file_priv);
> int vc4_label_bo_ioctl(struct drm_device *dev, void *data,
> struct drm_file *file_priv);
> -int vc4_mmap(struct file *filp, struct vm_area_struct *vma);
> +int vc4_mmap(struct file *filp, struct vm_area_struct *vma,
> + unsigned long map_flags);
> struct reservation_object *vc4_prime_res_obj(struct drm_gem_object *obj);
> -int vc4_prime_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma);
> +int vc4_prime_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma,
> + unsigned long map_flags);
> struct drm_gem_object *vc4_prime_import_sg_table(struct drm_device *dev,
> struct dma_buf_attachment *attach,
> struct sg_table *sgt);
> diff --git a/drivers/gpu/drm/vgem/vgem_drv.c b/drivers/gpu/drm/vgem/vgem_drv.c
> index 2524ff116f00..208c7781adbe 100644
> --- a/drivers/gpu/drm/vgem/vgem_drv.c
> +++ b/drivers/gpu/drm/vgem/vgem_drv.c
> @@ -255,12 +255,13 @@ static struct drm_ioctl_desc vgem_ioctls[] = {
> DRM_IOCTL_DEF_DRV(VGEM_FENCE_SIGNAL, vgem_fence_signal_ioctl, DRM_AUTH|DRM_RENDER_ALLOW),
> };
>
> -static int vgem_mmap(struct file *filp, struct vm_area_struct *vma)
> +static int vgem_mmap(struct file *filp, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> unsigned long flags = vma->vm_flags;
> int ret;
>
> - ret = drm_gem_mmap(filp, vma);
> + ret = drm_gem_mmap(filp, vma, map_flags);
> if (ret)
> return ret;
>
> @@ -399,7 +400,8 @@ static void vgem_prime_vunmap(struct drm_gem_object *obj, void *vaddr)
> }
>
> static int vgem_prime_mmap(struct drm_gem_object *obj,
> - struct vm_area_struct *vma)
> + struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> int ret;
>
> @@ -409,7 +411,7 @@ static int vgem_prime_mmap(struct drm_gem_object *obj,
> if (!obj->filp)
> return -ENODEV;
>
> - ret = call_mmap(obj->filp, vma);
> + ret = call_mmap(obj->filp, vma, map_flags);
> if (ret)
> return ret;
>
> diff --git a/drivers/gpu/drm/virtio/virtgpu_drv.h b/drivers/gpu/drm/virtio/virtgpu_drv.h
> index da2fb585fea4..78c2e7e5457d 100644
> --- a/drivers/gpu/drm/virtio/virtgpu_drv.h
> +++ b/drivers/gpu/drm/virtio/virtgpu_drv.h
> @@ -339,7 +339,8 @@ struct drm_plane *virtio_gpu_plane_init(struct virtio_gpu_device *vgdev,
> /* virtio_gpu_ttm.c */
> int virtio_gpu_ttm_init(struct virtio_gpu_device *vgdev);
> void virtio_gpu_ttm_fini(struct virtio_gpu_device *vgdev);
> -int virtio_gpu_mmap(struct file *filp, struct vm_area_struct *vma);
> +int virtio_gpu_mmap(struct file *filp, struct vm_area_struct *vma,
> + unsigned long map_flags);
>
> /* virtio_gpu_fence.c */
> int virtio_gpu_fence_emit(struct virtio_gpu_device *vgdev,
> @@ -368,7 +369,8 @@ struct drm_gem_object *virtgpu_gem_prime_import_sg_table(
> void *virtgpu_gem_prime_vmap(struct drm_gem_object *obj);
> void virtgpu_gem_prime_vunmap(struct drm_gem_object *obj, void *vaddr);
> int virtgpu_gem_prime_mmap(struct drm_gem_object *obj,
> - struct vm_area_struct *vma);
> + struct vm_area_struct *vma,
> + unsigned long map_flags);
>
> static inline struct virtio_gpu_object*
> virtio_gpu_object_ref(struct virtio_gpu_object *bo)
> diff --git a/drivers/gpu/drm/virtio/virtgpu_prime.c b/drivers/gpu/drm/virtio/virtgpu_prime.c
> index 385e0eb9826a..713bbfddef98 100644
> --- a/drivers/gpu/drm/virtio/virtgpu_prime.c
> +++ b/drivers/gpu/drm/virtio/virtgpu_prime.c
> @@ -65,7 +65,7 @@ void virtgpu_gem_prime_vunmap(struct drm_gem_object *obj, void *vaddr)
> }
>
> int virtgpu_gem_prime_mmap(struct drm_gem_object *obj,
> - struct vm_area_struct *area)
> + struct vm_area_struct *area, unsigned long map_flags)
> {
> return -ENODEV;
> }
> diff --git a/drivers/gpu/drm/virtio/virtgpu_ttm.c b/drivers/gpu/drm/virtio/virtgpu_ttm.c
> index cd389c5eaef5..20817a833e90 100644
> --- a/drivers/gpu/drm/virtio/virtgpu_ttm.c
> +++ b/drivers/gpu/drm/virtio/virtgpu_ttm.c
> @@ -129,7 +129,8 @@ static int virtio_gpu_ttm_fault(struct vm_fault *vmf)
> }
> #endif
>
> -int virtio_gpu_mmap(struct file *filp, struct vm_area_struct *vma)
> +int virtio_gpu_mmap(struct file *filp, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct drm_file *file_priv;
> struct virtio_gpu_device *vgdev;
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
> index 7e5f30e234b1..07a433bf7511 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
> @@ -748,7 +748,8 @@ extern int vmw_fifo_flush(struct vmw_private *dev_priv,
>
> extern int vmw_ttm_global_init(struct vmw_private *dev_priv);
> extern void vmw_ttm_global_release(struct vmw_private *dev_priv);
> -extern int vmw_mmap(struct file *filp, struct vm_area_struct *vma);
> +extern int vmw_mmap(struct file *filp, struct vm_area_struct *vma,
> + unsigned long map_flags);
>
> /**
> * TTM buffer object driver - vmwgfx_buffer.c
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_prime.c b/drivers/gpu/drm/vmwgfx/vmwgfx_prime.c
> index 0d42a46521fc..faa67d37a839 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_prime.c
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_prime.c
> @@ -96,7 +96,8 @@ static void vmw_prime_dmabuf_kunmap(struct dma_buf *dma_buf,
> }
>
> static int vmw_prime_dmabuf_mmap(struct dma_buf *dma_buf,
> - struct vm_area_struct *vma)
> + struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> WARN_ONCE(true, "Attempted use of dmabuf mmap. Bad.\n");
> return -ENOSYS;
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_glue.c b/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_glue.c
> index e771091d2cd3..c62bdc337506 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_glue.c
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_glue.c
> @@ -28,7 +28,8 @@
> #include <drm/drmP.h>
> #include "vmwgfx_drv.h"
>
> -int vmw_mmap(struct file *filp, struct vm_area_struct *vma)
> +int vmw_mmap(struct file *filp, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct drm_file *file_priv;
> struct vmw_private *dev_priv;
> diff --git a/drivers/hsi/clients/cmt_speech.c b/drivers/hsi/clients/cmt_speech.c
> index 727f968ac1cb..507499044727 100644
> --- a/drivers/hsi/clients/cmt_speech.c
> +++ b/drivers/hsi/clients/cmt_speech.c
> @@ -1270,7 +1270,8 @@ static long cs_char_ioctl(struct file *file, unsigned int cmd,
> return r;
> }
>
> -static int cs_char_mmap(struct file *file, struct vm_area_struct *vma)
> +static int cs_char_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> if (vma->vm_end < vma->vm_start)
> return -EINVAL;
> diff --git a/drivers/hwtracing/intel_th/msu.c b/drivers/hwtracing/intel_th/msu.c
> index dfb57eaa9f22..d0803461b448 100644
> --- a/drivers/hwtracing/intel_th/msu.c
> +++ b/drivers/hwtracing/intel_th/msu.c
> @@ -1212,7 +1212,8 @@ static const struct vm_operations_struct msc_mmap_ops = {
> .fault = msc_mmap_fault,
> };
>
> -static int intel_th_msc_mmap(struct file *file, struct vm_area_struct *vma)
> +static int intel_th_msc_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> unsigned long size = vma->vm_end - vma->vm_start;
> struct msc_iter *iter = vma->vm_file->private_data;
> diff --git a/drivers/hwtracing/stm/core.c b/drivers/hwtracing/stm/core.c
> index 9414900575d8..76a59eda527b 100644
> --- a/drivers/hwtracing/stm/core.c
> +++ b/drivers/hwtracing/stm/core.c
> @@ -519,7 +519,8 @@ static const struct vm_operations_struct stm_mmap_vmops = {
> .close = stm_mmap_close,
> };
>
> -static int stm_char_mmap(struct file *file, struct vm_area_struct *vma)
> +static int stm_char_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct stm_file *stmf = file->private_data;
> struct stm_device *stm = stmf->stm;
> diff --git a/drivers/infiniband/core/uverbs_main.c b/drivers/infiniband/core/uverbs_main.c
> index dc2aed6fb21b..f66f8facbe08 100644
> --- a/drivers/infiniband/core/uverbs_main.c
> +++ b/drivers/infiniband/core/uverbs_main.c
> @@ -799,7 +799,8 @@ static ssize_t ib_uverbs_write(struct file *filp, const char __user *buf,
> return ret;
> }
>
> -static int ib_uverbs_mmap(struct file *filp, struct vm_area_struct *vma)
> +static int ib_uverbs_mmap(struct file *filp, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct ib_uverbs_file *file = filp->private_data;
> struct ib_device *ib_dev;
> diff --git a/drivers/infiniband/hw/hfi1/file_ops.c b/drivers/infiniband/hw/hfi1/file_ops.c
> index 2bc89260235a..7504f0815cea 100644
> --- a/drivers/infiniband/hw/hfi1/file_ops.c
> +++ b/drivers/infiniband/hw/hfi1/file_ops.c
> @@ -75,7 +75,8 @@ static int hfi1_file_open(struct inode *inode, struct file *fp);
> static int hfi1_file_close(struct inode *inode, struct file *fp);
> static ssize_t hfi1_write_iter(struct kiocb *kiocb, struct iov_iter *from);
> static unsigned int hfi1_poll(struct file *fp, struct poll_table_struct *pt);
> -static int hfi1_file_mmap(struct file *fp, struct vm_area_struct *vma);
> +static int hfi1_file_mmap(struct file *fp, struct vm_area_struct *vma,
> + unsigned long map_flags);
>
> static u64 kvirt_to_phys(void *addr);
> static int assign_ctxt(struct hfi1_filedata *fd, struct hfi1_user_info *uinfo);
> @@ -454,7 +455,8 @@ static ssize_t hfi1_write_iter(struct kiocb *kiocb, struct iov_iter *from)
> return reqs;
> }
>
> -static int hfi1_file_mmap(struct file *fp, struct vm_area_struct *vma)
> +static int hfi1_file_mmap(struct file *fp, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct hfi1_filedata *fd = fp->private_data;
> struct hfi1_ctxtdata *uctxt = fd->uctxt;
> diff --git a/drivers/infiniband/hw/qib/qib_file_ops.c b/drivers/infiniband/hw/qib/qib_file_ops.c
> index 9396c1807cc3..2482d0fc2a77 100644
> --- a/drivers/infiniband/hw/qib/qib_file_ops.c
> +++ b/drivers/infiniband/hw/qib/qib_file_ops.c
> @@ -59,7 +59,7 @@ static int qib_close(struct inode *, struct file *);
> static ssize_t qib_write(struct file *, const char __user *, size_t, loff_t *);
> static ssize_t qib_write_iter(struct kiocb *, struct iov_iter *);
> static unsigned int qib_poll(struct file *, struct poll_table_struct *);
> -static int qib_mmapf(struct file *, struct vm_area_struct *);
> +static int qib_mmapf(struct file *, struct vm_area_struct *, unsigned long);
>
> /*
> * This is really, really weird shit - write() and writev() here
> @@ -993,7 +993,8 @@ static int mmap_kvaddr(struct vm_area_struct *vma, u64 pgaddr,
> * buffers in the chip. We have the open and close entries so we can bump
> * the ref count and keep the driver from being unloaded while still mapped.
> */
> -static int qib_mmapf(struct file *fp, struct vm_area_struct *vma)
> +static int qib_mmapf(struct file *fp, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct qib_ctxtdata *rcd;
> struct qib_devdata *dd;
> diff --git a/drivers/media/common/saa7146/saa7146_fops.c b/drivers/media/common/saa7146/saa7146_fops.c
> index 930d2c94d5d3..a47d6595b3e2 100644
> --- a/drivers/media/common/saa7146/saa7146_fops.c
> +++ b/drivers/media/common/saa7146/saa7146_fops.c
> @@ -287,7 +287,8 @@ static int fops_release(struct file *file)
> return 0;
> }
>
> -static int fops_mmap(struct file *file, struct vm_area_struct * vma)
> +static int fops_mmap(struct file *file, struct vm_area_struct * vma,
> + unsigned long map_flags)
> {
> struct video_device *vdev = video_devdata(file);
> struct saa7146_fh *fh = file->private_data;
> diff --git a/drivers/media/pci/bt8xx/bttv-driver.c b/drivers/media/pci/bt8xx/bttv-driver.c
> index 227086a2e99c..1fd71bbd8de6 100644
> --- a/drivers/media/pci/bt8xx/bttv-driver.c
> +++ b/drivers/media/pci/bt8xx/bttv-driver.c
> @@ -3129,7 +3129,8 @@ static int bttv_release(struct file *file)
> }
>
> static int
> -bttv_mmap(struct file *file, struct vm_area_struct *vma)
> +bttv_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct bttv_fh *fh = file->private_data;
>
> diff --git a/drivers/media/pci/cx18/cx18-fileops.c b/drivers/media/pci/cx18/cx18-fileops.c
> index 98467b2089fa..27a560e81117 100644
> --- a/drivers/media/pci/cx18/cx18-fileops.c
> +++ b/drivers/media/pci/cx18/cx18-fileops.c
> @@ -652,7 +652,8 @@ unsigned int cx18_v4l2_enc_poll(struct file *filp, poll_table *wait)
> return res;
> }
>
> -int cx18_v4l2_mmap(struct file *file, struct vm_area_struct *vma)
> +int cx18_v4l2_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct cx18_open_id *id = file->private_data;
> struct cx18 *cx = id->cx;
> diff --git a/drivers/media/pci/cx18/cx18-fileops.h b/drivers/media/pci/cx18/cx18-fileops.h
> index 58b00b433708..01b15e74d784 100644
> --- a/drivers/media/pci/cx18/cx18-fileops.h
> +++ b/drivers/media/pci/cx18/cx18-fileops.h
> @@ -28,7 +28,8 @@ int cx18_start_capture(struct cx18_open_id *id);
> void cx18_stop_capture(struct cx18_open_id *id, int gop_end);
> void cx18_mute(struct cx18 *cx);
> void cx18_unmute(struct cx18 *cx);
> -int cx18_v4l2_mmap(struct file *file, struct vm_area_struct *vma);
> +int cx18_v4l2_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags);
> void cx18_vb_timeout(unsigned long data);
>
> /* Shared with cx18-alsa module */
> diff --git a/drivers/media/pci/meye/meye.c b/drivers/media/pci/meye/meye.c
> index 49e047e4a81e..2513ceceb9be 100644
> --- a/drivers/media/pci/meye/meye.c
> +++ b/drivers/media/pci/meye/meye.c
> @@ -1452,7 +1452,8 @@ static const struct vm_operations_struct meye_vm_ops = {
> .close = meye_vm_close,
> };
>
> -static int meye_mmap(struct file *file, struct vm_area_struct *vma)
> +static int meye_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> unsigned long start = vma->vm_start;
> unsigned long size = vma->vm_end - vma->vm_start;
> diff --git a/drivers/media/pci/zoran/zoran_driver.c b/drivers/media/pci/zoran/zoran_driver.c
> index a11cb501c550..f7bc18183cc2 100644
> --- a/drivers/media/pci/zoran/zoran_driver.c
> +++ b/drivers/media/pci/zoran/zoran_driver.c
> @@ -2651,7 +2651,7 @@ static const struct vm_operations_struct zoran_vm_ops = {
>
> static int
> zoran_mmap (struct file *file,
> - struct vm_area_struct *vma)
> + struct vm_area_struct *vma, unsigned long map_flags)
> {
> struct zoran_fh *fh = file->private_data;
> struct zoran *zr = fh->zr;
> diff --git a/drivers/media/platform/davinci/vpfe_capture.c b/drivers/media/platform/davinci/vpfe_capture.c
> index 6792da16d9c7..32177a0fbf3b 100644
> --- a/drivers/media/platform/davinci/vpfe_capture.c
> +++ b/drivers/media/platform/davinci/vpfe_capture.c
> @@ -717,7 +717,8 @@ static int vpfe_release(struct file *file)
> * vpfe_mmap : It is used to map kernel space buffers
> * into user spaces
> */
> -static int vpfe_mmap(struct file *file, struct vm_area_struct *vma)
> +static int vpfe_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> /* Get the device object and file handle object */
> struct vpfe_device *vpfe_dev = video_drvdata(file);
> diff --git a/drivers/media/platform/exynos-gsc/gsc-m2m.c b/drivers/media/platform/exynos-gsc/gsc-m2m.c
> index 2a2994ef15d5..315a8e232785 100644
> --- a/drivers/media/platform/exynos-gsc/gsc-m2m.c
> +++ b/drivers/media/platform/exynos-gsc/gsc-m2m.c
> @@ -723,7 +723,8 @@ static unsigned int gsc_m2m_poll(struct file *file,
> return ret;
> }
>
> -static int gsc_m2m_mmap(struct file *file, struct vm_area_struct *vma)
> +static int gsc_m2m_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct gsc_ctx *ctx = fh_to_ctx(file->private_data);
> struct gsc_dev *gsc = ctx->gsc_dev;
> diff --git a/drivers/media/platform/fsl-viu.c b/drivers/media/platform/fsl-viu.c
> index fb43025df573..494551d851b2 100644
> --- a/drivers/media/platform/fsl-viu.c
> +++ b/drivers/media/platform/fsl-viu.c
> @@ -1319,7 +1319,8 @@ void viu_reset(struct viu_reg *reg)
> out_be32(&reg->alpha, 0x000000ff);
> }
>
> -static int viu_mmap(struct file *file, struct vm_area_struct *vma)
> +static int viu_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct viu_fh *fh = file->private_data;
> struct viu_dev *dev = fh->dev;
> diff --git a/drivers/media/platform/m2m-deinterlace.c b/drivers/media/platform/m2m-deinterlace.c
> index c8a12493f395..10c0c934ba5b 100644
> --- a/drivers/media/platform/m2m-deinterlace.c
> +++ b/drivers/media/platform/m2m-deinterlace.c
> @@ -963,7 +963,8 @@ static unsigned int deinterlace_poll(struct file *file,
> return ret;
> }
>
> -static int deinterlace_mmap(struct file *file, struct vm_area_struct *vma)
> +static int deinterlace_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct deinterlace_ctx *ctx = file->private_data;
>
> diff --git a/drivers/media/platform/mx2_emmaprp.c b/drivers/media/platform/mx2_emmaprp.c
> index 4a2b1afa19c4..c15c9af7ec29 100644
> --- a/drivers/media/platform/mx2_emmaprp.c
> +++ b/drivers/media/platform/mx2_emmaprp.c
> @@ -851,7 +851,8 @@ static unsigned int emmaprp_poll(struct file *file,
> return res;
> }
>
> -static int emmaprp_mmap(struct file *file, struct vm_area_struct *vma)
> +static int emmaprp_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct emmaprp_dev *pcdev = video_drvdata(file);
> struct emmaprp_ctx *ctx = file->private_data;
> diff --git a/drivers/media/platform/omap/omap_vout.c b/drivers/media/platform/omap/omap_vout.c
> index 4d29860d27b4..f4eaa03ca921 100644
> --- a/drivers/media/platform/omap/omap_vout.c
> +++ b/drivers/media/platform/omap/omap_vout.c
> @@ -871,7 +871,8 @@ static const struct vm_operations_struct omap_vout_vm_ops = {
> .close = omap_vout_vm_close,
> };
>
> -static int omap_vout_mmap(struct file *file, struct vm_area_struct *vma)
> +static int omap_vout_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> int i;
> void *pos;
> diff --git a/drivers/media/platform/omap3isp/ispvideo.c b/drivers/media/platform/omap3isp/ispvideo.c
> index 218e6d7ae93a..4b96d815713b 100644
> --- a/drivers/media/platform/omap3isp/ispvideo.c
> +++ b/drivers/media/platform/omap3isp/ispvideo.c
> @@ -1396,7 +1396,8 @@ static unsigned int isp_video_poll(struct file *file, poll_table *wait)
> return ret;
> }
>
> -static int isp_video_mmap(struct file *file, struct vm_area_struct *vma)
> +static int isp_video_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct isp_video_fh *vfh = to_isp_video_fh(file->private_data);
>
> diff --git a/drivers/media/platform/s3c-camif/camif-capture.c b/drivers/media/platform/s3c-camif/camif-capture.c
> index 25c7a7d42292..ea59b7413c6e 100644
> --- a/drivers/media/platform/s3c-camif/camif-capture.c
> +++ b/drivers/media/platform/s3c-camif/camif-capture.c
> @@ -607,7 +607,8 @@ static unsigned int s3c_camif_poll(struct file *file,
> return ret;
> }
>
> -static int s3c_camif_mmap(struct file *file, struct vm_area_struct *vma)
> +static int s3c_camif_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct camif_vp *vp = video_drvdata(file);
> int ret;
> diff --git a/drivers/media/platform/s5p-mfc/s5p_mfc.c b/drivers/media/platform/s5p-mfc/s5p_mfc.c
> index 1afde5021ca6..292d41109286 100644
> --- a/drivers/media/platform/s5p-mfc/s5p_mfc.c
> +++ b/drivers/media/platform/s5p-mfc/s5p_mfc.c
> @@ -1040,7 +1040,8 @@ static unsigned int s5p_mfc_poll(struct file *file,
> }
>
> /* Mmap */
> -static int s5p_mfc_mmap(struct file *file, struct vm_area_struct *vma)
> +static int s5p_mfc_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct s5p_mfc_ctx *ctx = fh_to_ctx(file->private_data);
> struct s5p_mfc_dev *dev = ctx->dev;
> diff --git a/drivers/media/platform/sh_veu.c b/drivers/media/platform/sh_veu.c
> index 15a562af13c7..e7aa80d66dc8 100644
> --- a/drivers/media/platform/sh_veu.c
> +++ b/drivers/media/platform/sh_veu.c
> @@ -1024,7 +1024,8 @@ static unsigned int sh_veu_poll(struct file *file,
> return v4l2_m2m_poll(file, veu_file->veu_dev->m2m_ctx, wait);
> }
>
> -static int sh_veu_mmap(struct file *file, struct vm_area_struct *vma)
> +static int sh_veu_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct sh_veu_file *veu_file = file->private_data;
>
> diff --git a/drivers/media/platform/soc_camera/soc_camera.c b/drivers/media/platform/soc_camera/soc_camera.c
> index 1f3c450c7a69..e452a13032be 100644
> --- a/drivers/media/platform/soc_camera/soc_camera.c
> +++ b/drivers/media/platform/soc_camera/soc_camera.c
> @@ -781,7 +781,8 @@ static ssize_t soc_camera_read(struct file *file, char __user *buf,
> return -EINVAL;
> }
>
> -static int soc_camera_mmap(struct file *file, struct vm_area_struct *vma)
> +static int soc_camera_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct soc_camera_device *icd = file->private_data;
> struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
> diff --git a/drivers/media/platform/via-camera.c b/drivers/media/platform/via-camera.c
> index 805d4a8fc17e..ae82131f6d17 100644
> --- a/drivers/media/platform/via-camera.c
> +++ b/drivers/media/platform/via-camera.c
> @@ -772,7 +772,8 @@ static unsigned int viacam_poll(struct file *filp, struct poll_table_struct *pt)
> }
>
>
> -static int viacam_mmap(struct file *filp, struct vm_area_struct *vma)
> +static int viacam_mmap(struct file *filp, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct via_camera *cam = video_drvdata(filp);
>
> diff --git a/drivers/media/usb/cpia2/cpia2_v4l.c b/drivers/media/usb/cpia2/cpia2_v4l.c
> index 3dedd83f0b19..69dd3236075a 100644
> --- a/drivers/media/usb/cpia2/cpia2_v4l.c
> +++ b/drivers/media/usb/cpia2/cpia2_v4l.c
> @@ -998,7 +998,8 @@ static int cpia2_streamoff(struct file *file, void *fh, enum v4l2_buf_type type)
> * cpia2_mmap
> *
> *****************************************************************************/
> -static int cpia2_mmap(struct file *file, struct vm_area_struct *area)
> +static int cpia2_mmap(struct file *file, struct vm_area_struct *area,
> + unsigned long map_flags)
> {
> struct camera_data *cam = video_drvdata(file);
> int retval;
> diff --git a/drivers/media/usb/cx231xx/cx231xx-417.c b/drivers/media/usb/cx231xx/cx231xx-417.c
> index d538fa407742..80eea317278b 100644
> --- a/drivers/media/usb/cx231xx/cx231xx-417.c
> +++ b/drivers/media/usb/cx231xx/cx231xx-417.c
> @@ -1834,7 +1834,8 @@ static unsigned int mpeg_poll(struct file *file,
> return res;
> }
>
> -static int mpeg_mmap(struct file *file, struct vm_area_struct *vma)
> +static int mpeg_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct cx231xx_fh *fh = file->private_data;
>
> diff --git a/drivers/media/usb/cx231xx/cx231xx-video.c b/drivers/media/usb/cx231xx/cx231xx-video.c
> index 179b8481a870..1175591c1d24 100644
> --- a/drivers/media/usb/cx231xx/cx231xx-video.c
> +++ b/drivers/media/usb/cx231xx/cx231xx-video.c
> @@ -2044,7 +2044,8 @@ static unsigned int cx231xx_v4l2_poll(struct file *filp, poll_table *wait)
> /*
> * cx231xx_v4l2_mmap()
> */
> -static int cx231xx_v4l2_mmap(struct file *filp, struct vm_area_struct *vma)
> +static int cx231xx_v4l2_mmap(struct file *filp, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct cx231xx_fh *fh = filp->private_data;
> struct cx231xx *dev = fh->dev;
> diff --git a/drivers/media/usb/gspca/gspca.c b/drivers/media/usb/gspca/gspca.c
> index 0f141762abf1..f3545dbdfb85 100644
> --- a/drivers/media/usb/gspca/gspca.c
> +++ b/drivers/media/usb/gspca/gspca.c
> @@ -1589,7 +1589,8 @@ static int vidioc_s_parm(struct file *filp, void *priv,
> return 0;
> }
>
> -static int dev_mmap(struct file *file, struct vm_area_struct *vma)
> +static int dev_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct gspca_dev *gspca_dev = video_drvdata(file);
> struct gspca_frame *frame;
> diff --git a/drivers/media/usb/stkwebcam/stk-webcam.c b/drivers/media/usb/stkwebcam/stk-webcam.c
> index c0bba773db25..2bcfe742231c 100644
> --- a/drivers/media/usb/stkwebcam/stk-webcam.c
> +++ b/drivers/media/usb/stkwebcam/stk-webcam.c
> @@ -755,7 +755,8 @@ static const struct vm_operations_struct stk_v4l_vm_ops = {
> .close = stk_v4l_vm_close
> };
>
> -static int v4l_stk_mmap(struct file *fp, struct vm_area_struct *vma)
> +static int v4l_stk_mmap(struct file *fp, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> unsigned int i;
> int ret;
> diff --git a/drivers/media/usb/tm6000/tm6000-video.c b/drivers/media/usb/tm6000/tm6000-video.c
> index ec8c4d2534dc..db89f1360397 100644
> --- a/drivers/media/usb/tm6000/tm6000-video.c
> +++ b/drivers/media/usb/tm6000/tm6000-video.c
> @@ -1519,7 +1519,8 @@ static int tm6000_release(struct file *file)
> return 0;
> }
>
> -static int tm6000_mmap(struct file *file, struct vm_area_struct * vma)
> +static int tm6000_mmap(struct file *file, struct vm_area_struct * vma,
> + unsigned long map_flags)
> {
> struct tm6000_fh *fh = file->private_data;
> struct tm6000_core *dev = fh->dev;
> diff --git a/drivers/media/usb/usbvision/usbvision-video.c b/drivers/media/usb/usbvision/usbvision-video.c
> index 960272d3c924..f9325cc93a4a 100644
> --- a/drivers/media/usb/usbvision/usbvision-video.c
> +++ b/drivers/media/usb/usbvision/usbvision-video.c
> @@ -1066,7 +1066,8 @@ static int usbvision_mmap(struct file *file, struct vm_area_struct *vma)
> return 0;
> }
>
> -static int usbvision_v4l2_mmap(struct file *file, struct vm_area_struct *vma)
> +static int usbvision_v4l2_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct usb_usbvision *usbvision = video_drvdata(file);
> int res;
> diff --git a/drivers/media/usb/uvc/uvc_v4l2.c b/drivers/media/usb/uvc/uvc_v4l2.c
> index 3e7e283a44a8..69aa80e33775 100644
> --- a/drivers/media/usb/uvc/uvc_v4l2.c
> +++ b/drivers/media/usb/uvc/uvc_v4l2.c
> @@ -1413,7 +1413,8 @@ static ssize_t uvc_v4l2_read(struct file *file, char __user *data,
> return -EINVAL;
> }
>
> -static int uvc_v4l2_mmap(struct file *file, struct vm_area_struct *vma)
> +static int uvc_v4l2_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct uvc_fh *handle = file->private_data;
> struct uvc_streaming *stream = handle->stream;
> diff --git a/drivers/media/usb/zr364xx/zr364xx.c b/drivers/media/usb/zr364xx/zr364xx.c
> index 4ff8d0aed015..c21f1b8147c5 100644
> --- a/drivers/media/usb/zr364xx/zr364xx.c
> +++ b/drivers/media/usb/zr364xx/zr364xx.c
> @@ -1270,7 +1270,8 @@ static int zr364xx_close(struct file *file)
> }
>
>
> -static int zr364xx_mmap(struct file *file, struct vm_area_struct *vma)
> +static int zr364xx_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct zr364xx_camera *cam = video_drvdata(file);
> int ret;
> diff --git a/drivers/media/v4l2-core/v4l2-dev.c b/drivers/media/v4l2-core/v4l2-dev.c
> index c647ba648805..84e32c14e29d 100644
> --- a/drivers/media/v4l2-core/v4l2-dev.c
> +++ b/drivers/media/v4l2-core/v4l2-dev.c
> @@ -388,7 +388,8 @@ static unsigned long v4l2_get_unmapped_area(struct file *filp,
> }
> #endif
>
> -static int v4l2_mmap(struct file *filp, struct vm_area_struct *vm)
> +static int v4l2_mmap(struct file *filp, struct vm_area_struct *vm,
> + unsigned long map_flags)
> {
> struct video_device *vdev = video_devdata(filp);
> int ret = -ENODEV;
> @@ -396,7 +397,7 @@ static int v4l2_mmap(struct file *filp, struct vm_area_struct *vm)
> if (!vdev->fops->mmap)
> return -ENODEV;
> if (video_is_registered(vdev))
> - ret = vdev->fops->mmap(filp, vm);
> + ret = vdev->fops->mmap(filp, vm, map_flags);
> if (vdev->dev_debug & V4L2_DEV_DEBUG_FOP)
> printk(KERN_DEBUG "%s: mmap (%d)\n",
> video_device_node_name(vdev), ret);
> diff --git a/drivers/media/v4l2-core/v4l2-mem2mem.c b/drivers/media/v4l2-core/v4l2-mem2mem.c
> index f62e68aa04c4..38353750c57b 100644
> --- a/drivers/media/v4l2-core/v4l2-mem2mem.c
> +++ b/drivers/media/v4l2-core/v4l2-mem2mem.c
> @@ -784,7 +784,8 @@ EXPORT_SYMBOL_GPL(v4l2_m2m_ioctl_streamoff);
> * for the output and the capture buffer queue.
> */
>
> -int v4l2_m2m_fop_mmap(struct file *file, struct vm_area_struct *vma)
> +int v4l2_m2m_fop_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct v4l2_fh *fh = file->private_data;
>
> diff --git a/drivers/media/v4l2-core/videobuf2-dma-contig.c b/drivers/media/v4l2-core/videobuf2-dma-contig.c
> index 9f389f36566d..e4ae803accfa 100644
> --- a/drivers/media/v4l2-core/videobuf2-dma-contig.c
> +++ b/drivers/media/v4l2-core/videobuf2-dma-contig.c
> @@ -347,7 +347,7 @@ static void *vb2_dc_dmabuf_ops_vmap(struct dma_buf *dbuf)
> }
>
> static int vb2_dc_dmabuf_ops_mmap(struct dma_buf *dbuf,
> - struct vm_area_struct *vma)
> + struct vm_area_struct *vma, unsigned long map_flags)
> {
> return vb2_dc_mmap(dbuf->priv, vma);
> }
> diff --git a/drivers/media/v4l2-core/videobuf2-dma-sg.c b/drivers/media/v4l2-core/videobuf2-dma-sg.c
> index 6808231a6bdc..7e1e5eb314f1 100644
> --- a/drivers/media/v4l2-core/videobuf2-dma-sg.c
> +++ b/drivers/media/v4l2-core/videobuf2-dma-sg.c
> @@ -497,7 +497,7 @@ static void *vb2_dma_sg_dmabuf_ops_vmap(struct dma_buf *dbuf)
> }
>
> static int vb2_dma_sg_dmabuf_ops_mmap(struct dma_buf *dbuf,
> - struct vm_area_struct *vma)
> + struct vm_area_struct *vma, unsigned long map_flags)
> {
> return vb2_dma_sg_mmap(dbuf->priv, vma);
> }
> diff --git a/drivers/media/v4l2-core/videobuf2-v4l2.c b/drivers/media/v4l2-core/videobuf2-v4l2.c
> index 0c0669976bdc..3259297f8bab 100644
> --- a/drivers/media/v4l2-core/videobuf2-v4l2.c
> +++ b/drivers/media/v4l2-core/videobuf2-v4l2.c
> @@ -823,7 +823,8 @@ EXPORT_SYMBOL_GPL(vb2_ioctl_expbuf);
>
> /* v4l2_file_operations helpers */
>
> -int vb2_fop_mmap(struct file *file, struct vm_area_struct *vma)
> +int vb2_fop_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct video_device *vdev = video_devdata(file);
>
> diff --git a/drivers/media/v4l2-core/videobuf2-vmalloc.c b/drivers/media/v4l2-core/videobuf2-vmalloc.c
> index 3a7c80cd1a17..05efd9ceeb2f 100644
> --- a/drivers/media/v4l2-core/videobuf2-vmalloc.c
> +++ b/drivers/media/v4l2-core/videobuf2-vmalloc.c
> @@ -335,7 +335,7 @@ static void *vb2_vmalloc_dmabuf_ops_vmap(struct dma_buf *dbuf)
> }
>
> static int vb2_vmalloc_dmabuf_ops_mmap(struct dma_buf *dbuf,
> - struct vm_area_struct *vma)
> + struct vm_area_struct *vma, unsigned long map_flags)
> {
> return vb2_vmalloc_mmap(dbuf->priv, vma);
> }
> diff --git a/drivers/misc/aspeed-lpc-ctrl.c b/drivers/misc/aspeed-lpc-ctrl.c
> index b5439643f54b..c79564d544c3 100644
> --- a/drivers/misc/aspeed-lpc-ctrl.c
> +++ b/drivers/misc/aspeed-lpc-ctrl.c
> @@ -38,7 +38,8 @@ static struct aspeed_lpc_ctrl *file_aspeed_lpc_ctrl(struct file *file)
> miscdev);
> }
>
> -static int aspeed_lpc_ctrl_mmap(struct file *file, struct vm_area_struct *vma)
> +static int aspeed_lpc_ctrl_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct aspeed_lpc_ctrl *lpc_ctrl = file_aspeed_lpc_ctrl(file);
> unsigned long vsize = vma->vm_end - vma->vm_start;
> diff --git a/drivers/misc/cxl/api.c b/drivers/misc/cxl/api.c
> index a0c44d16bf30..5ab1d57341ca 100644
> --- a/drivers/misc/cxl/api.c
> +++ b/drivers/misc/cxl/api.c
> @@ -412,9 +412,10 @@ long cxl_fd_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
> return afu_ioctl(file, cmd, arg);
> }
> EXPORT_SYMBOL_GPL(cxl_fd_ioctl);
> -int cxl_fd_mmap(struct file *file, struct vm_area_struct *vm)
> +int cxl_fd_mmap(struct file *file, struct vm_area_struct *vm,
> + unsigned long map_flags)
> {
> - return afu_mmap(file, vm);
> + return afu_mmap(file, vm, map_flags);
> }
> EXPORT_SYMBOL_GPL(cxl_fd_mmap);
> unsigned int cxl_fd_poll(struct file *file, struct poll_table_struct *poll)
> diff --git a/drivers/misc/cxl/cxl.h b/drivers/misc/cxl/cxl.h
> index b1afeccbb97f..a9c1d4538164 100644
> --- a/drivers/misc/cxl/cxl.h
> +++ b/drivers/misc/cxl/cxl.h
> @@ -1082,7 +1082,8 @@ int afu_allocate_irqs(struct cxl_context *ctx, u32 count);
> int afu_open(struct inode *inode, struct file *file);
> int afu_release(struct inode *inode, struct file *file);
> long afu_ioctl(struct file *file, unsigned int cmd, unsigned long arg);
> -int afu_mmap(struct file *file, struct vm_area_struct *vm);
> +int afu_mmap(struct file *file, struct vm_area_struct *vm,
> + unsigned long map_flags);
> unsigned int afu_poll(struct file *file, struct poll_table_struct *poll);
> ssize_t afu_read(struct file *file, char __user *buf, size_t count, loff_t *off);
> extern const struct file_operations afu_fops;
> diff --git a/drivers/misc/cxl/file.c b/drivers/misc/cxl/file.c
> index 4bfad9f6dc9f..879ba7f83969 100644
> --- a/drivers/misc/cxl/file.c
> +++ b/drivers/misc/cxl/file.c
> @@ -309,7 +309,8 @@ static long afu_compat_ioctl(struct file *file, unsigned int cmd,
> return afu_ioctl(file, cmd, arg);
> }
>
> -int afu_mmap(struct file *file, struct vm_area_struct *vm)
> +int afu_mmap(struct file *file, struct vm_area_struct *vm,
> + unsigned long map_flags)
> {
> struct cxl_context *ctx = file->private_data;
>
> diff --git a/drivers/misc/genwqe/card_dev.c b/drivers/misc/genwqe/card_dev.c
> index dd4617764f14..82a58da65756 100644
> --- a/drivers/misc/genwqe/card_dev.c
> +++ b/drivers/misc/genwqe/card_dev.c
> @@ -435,7 +435,8 @@ static const struct vm_operations_struct genwqe_vma_ops = {
> * plain buffer, we lookup our dma_mapping list to find the
> * corresponding DMA address for the associated user-space address.
> */
> -static int genwqe_mmap(struct file *filp, struct vm_area_struct *vma)
> +static int genwqe_mmap(struct file *filp, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> int rc;
> unsigned long pfn, vsize = vma->vm_end - vma->vm_start;
> diff --git a/drivers/misc/mic/scif/scif_fd.c b/drivers/misc/mic/scif/scif_fd.c
> index f7e826142a72..5dfbaa681d2d 100644
> --- a/drivers/misc/mic/scif/scif_fd.c
> +++ b/drivers/misc/mic/scif/scif_fd.c
> @@ -34,7 +34,8 @@ static int scif_fdclose(struct inode *inode, struct file *f)
> return scif_close(priv);
> }
>
> -static int scif_fdmmap(struct file *f, struct vm_area_struct *vma)
> +static int scif_fdmmap(struct file *f, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct scif_endpt *priv = f->private_data;
>
> diff --git a/drivers/misc/mic/vop/vop_vringh.c b/drivers/misc/mic/vop/vop_vringh.c
> index fed992e2c258..d80418f503b3 100644
> --- a/drivers/misc/mic/vop/vop_vringh.c
> +++ b/drivers/misc/mic/vop/vop_vringh.c
> @@ -1083,7 +1083,8 @@ vop_query_offset(struct vop_vdev *vdev, unsigned long offset,
> /*
> * Maps the device page and virtio rings to user space for readonly access.
> */
> -static int vop_mmap(struct file *f, struct vm_area_struct *vma)
> +static int vop_mmap(struct file *f, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct vop_vdev *vdev = f->private_data;
> unsigned long offset = vma->vm_pgoff << PAGE_SHIFT;
> diff --git a/drivers/misc/sgi-gru/grufile.c b/drivers/misc/sgi-gru/grufile.c
> index 104a05f6b738..2751d82a259f 100644
> --- a/drivers/misc/sgi-gru/grufile.c
> +++ b/drivers/misc/sgi-gru/grufile.c
> @@ -104,7 +104,8 @@ static void gru_vma_close(struct vm_area_struct *vma)
> * and private data structure necessary to allocate, track, and free the
> * underlying pages.
> */
> -static int gru_file_mmap(struct file *file, struct vm_area_struct *vma)
> +static int gru_file_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> if ((vma->vm_flags & (VM_SHARED | VM_WRITE)) != (VM_SHARED | VM_WRITE))
> return -EPERM;
> diff --git a/drivers/mtd/mtdchar.c b/drivers/mtd/mtdchar.c
> index 3568294d4854..7aa296edd4ff 100644
> --- a/drivers/mtd/mtdchar.c
> +++ b/drivers/mtd/mtdchar.c
> @@ -1192,7 +1192,8 @@ static unsigned mtdchar_mmap_capabilities(struct file *file)
> /*
> * set up a mapping for shared memory segments
> */
> -static int mtdchar_mmap(struct file *file, struct vm_area_struct *vma)
> +static int mtdchar_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> #ifdef CONFIG_MMU
> struct mtd_file_info *mfi = file->private_data;
> diff --git a/drivers/pci/proc.c b/drivers/pci/proc.c
> index 098360d7ff81..4e77aad084d1 100644
> --- a/drivers/pci/proc.c
> +++ b/drivers/pci/proc.c
> @@ -230,7 +230,8 @@ static long proc_bus_pci_ioctl(struct file *file, unsigned int cmd,
> }
>
> #ifdef HAVE_PCI_MMAP
> -static int proc_bus_pci_mmap(struct file *file, struct vm_area_struct *vma)
> +static int proc_bus_pci_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct pci_dev *dev = PDE_DATA(file_inode(file));
> struct pci_filp_private *fpriv = file->private_data;
> diff --git a/drivers/rapidio/devices/rio_mport_cdev.c b/drivers/rapidio/devices/rio_mport_cdev.c
> index 5beb0c361076..a3dfd8ea6580 100644
> --- a/drivers/rapidio/devices/rio_mport_cdev.c
> +++ b/drivers/rapidio/devices/rio_mport_cdev.c
> @@ -2261,7 +2261,8 @@ static const struct vm_operations_struct vm_ops = {
> .close = mport_mm_close,
> };
>
> -static int mport_cdev_mmap(struct file *filp, struct vm_area_struct *vma)
> +static int mport_cdev_mmap(struct file *filp, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct mport_cdev_priv *priv = filp->private_data;
> struct mport_dev *md;
> diff --git a/drivers/sbus/char/flash.c b/drivers/sbus/char/flash.c
> index a610b8d3d11f..5f748a099d8d 100644
> --- a/drivers/sbus/char/flash.c
> +++ b/drivers/sbus/char/flash.c
> @@ -33,7 +33,8 @@ static struct {
> #define FLASH_MINOR 152
>
> static int
> -flash_mmap(struct file *file, struct vm_area_struct *vma)
> +flash_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> unsigned long addr;
> unsigned long size;
> diff --git a/drivers/sbus/char/jsflash.c b/drivers/sbus/char/jsflash.c
> index 14f377ac1280..3f278397f064 100644
> --- a/drivers/sbus/char/jsflash.c
> +++ b/drivers/sbus/char/jsflash.c
> @@ -440,7 +440,8 @@ static long jsf_ioctl(struct file *f, unsigned int cmd, unsigned long arg)
> return error;
> }
>
> -static int jsf_mmap(struct file * file, struct vm_area_struct * vma)
> +static int jsf_mmap(struct file * file, struct vm_area_struct * vma,
> + unsigned long map_flags)
> {
> return -ENXIO;
> }
> diff --git a/drivers/scsi/cxlflash/superpipe.c b/drivers/scsi/cxlflash/superpipe.c
> index ad0f9968ccfb..cc0bfb044a60 100644
> --- a/drivers/scsi/cxlflash/superpipe.c
> +++ b/drivers/scsi/cxlflash/superpipe.c
> @@ -1160,7 +1160,8 @@ static const struct vm_operations_struct cxlflash_mmap_vmops = {
> *
> * Return: 0 on success, -errno on failure
> */
> -static int cxlflash_cxl_mmap(struct file *file, struct vm_area_struct *vma)
> +static int cxlflash_cxl_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct cxl_context *ctx = cxl_fops_get_context(file);
> struct cxlflash_cfg *cfg = container_of(file->f_op, struct cxlflash_cfg,
> @@ -1188,7 +1189,7 @@ static int cxlflash_cxl_mmap(struct file *file, struct vm_area_struct *vma)
>
> dev_dbg(dev, "%s: mmap for context %d\n", __func__, ctxid);
>
> - rc = cxl_fd_mmap(file, vma);
> + rc = cxl_fd_mmap(file, vma, map_flags);
> if (likely(!rc)) {
> /* Insert ourself in the mmap fault handler path */
> ctxi->cxl_mmap_vmops = vma->vm_ops;
> diff --git a/drivers/scsi/sg.c b/drivers/scsi/sg.c
> index 84e782d8e7c3..38b18d4adc20 100644
> --- a/drivers/scsi/sg.c
> +++ b/drivers/scsi/sg.c
> @@ -1227,7 +1227,8 @@ static const struct vm_operations_struct sg_mmap_vm_ops = {
> };
>
> static int
> -sg_mmap(struct file *filp, struct vm_area_struct *vma)
> +sg_mmap(struct file *filp, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> Sg_fd *sfp;
> unsigned long req_sz, len, sa;
> diff --git a/drivers/staging/android/ashmem.c b/drivers/staging/android/ashmem.c
> index 6ba270e0494d..ad4f863cdb8e 100644
> --- a/drivers/staging/android/ashmem.c
> +++ b/drivers/staging/android/ashmem.c
> @@ -375,7 +375,8 @@ static inline vm_flags_t calc_vm_may_flags(unsigned long prot)
> _calc_vm_trans(prot, PROT_EXEC, VM_MAYEXEC);
> }
>
> -static int ashmem_mmap(struct file *file, struct vm_area_struct *vma)
> +static int ashmem_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct ashmem_area *asma = file->private_data;
> int ret = 0;
> diff --git a/drivers/staging/android/ion/ion.c b/drivers/staging/android/ion/ion.c
> index 93e2c90fa77d..2c3044a9899e 100644
> --- a/drivers/staging/android/ion/ion.c
> +++ b/drivers/staging/android/ion/ion.c
> @@ -284,7 +284,8 @@ static void ion_unmap_dma_buf(struct dma_buf_attachment *attachment,
> dma_unmap_sg(attachment->dev, table->sgl, table->nents, direction);
> }
>
> -static int ion_mmap(struct dma_buf *dmabuf, struct vm_area_struct *vma)
> +static int ion_mmap(struct dma_buf *dmabuf, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct ion_buffer *buffer = dmabuf->priv;
> int ret = 0;
> diff --git a/drivers/staging/comedi/comedi_fops.c b/drivers/staging/comedi/comedi_fops.c
> index e19e395b0e44..9c3a4417f491 100644
> --- a/drivers/staging/comedi/comedi_fops.c
> +++ b/drivers/staging/comedi/comedi_fops.c
> @@ -2185,7 +2185,8 @@ static const struct vm_operations_struct comedi_vm_ops = {
> .access = comedi_vm_access,
> };
>
> -static int comedi_mmap(struct file *file, struct vm_area_struct *vma)
> +static int comedi_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct comedi_file *cfp = file->private_data;
> struct comedi_device *dev = cfp->dev;
> diff --git a/drivers/staging/lustre/lustre/llite/llite_internal.h b/drivers/staging/lustre/lustre/llite/llite_internal.h
> index 0287c751e1cd..6203992b0497 100644
> --- a/drivers/staging/lustre/lustre/llite/llite_internal.h
> +++ b/drivers/staging/lustre/lustre/llite/llite_internal.h
> @@ -912,7 +912,8 @@ static inline struct vvp_io_args *ll_env_args(const struct lu_env *env)
> /* llite/llite_mmap.c */
>
> int ll_teardown_mmaps(struct address_space *mapping, __u64 first, __u64 last);
> -int ll_file_mmap(struct file *file, struct vm_area_struct *vma);
> +int ll_file_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags);
> void policy_from_vma(union ldlm_policy_data *policy, struct vm_area_struct *vma,
> unsigned long addr, size_t count);
> struct vm_area_struct *our_vma(struct mm_struct *mm, unsigned long addr,
> diff --git a/drivers/staging/lustre/lustre/llite/llite_mmap.c b/drivers/staging/lustre/lustre/llite/llite_mmap.c
> index ccc7ae15a943..d34663d33299 100644
> --- a/drivers/staging/lustre/lustre/llite/llite_mmap.c
> +++ b/drivers/staging/lustre/lustre/llite/llite_mmap.c
> @@ -455,7 +455,8 @@ static const struct vm_operations_struct ll_file_vm_ops = {
> .close = ll_vm_close,
> };
>
> -int ll_file_mmap(struct file *file, struct vm_area_struct *vma)
> +int ll_file_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct inode *inode = file_inode(file);
> int rc;
> @@ -464,7 +465,7 @@ int ll_file_mmap(struct file *file, struct vm_area_struct *vma)
> return -EOPNOTSUPP;
>
> ll_stats_ops_tally(ll_i2sbi(inode), LPROC_LL_MAP, 1);
> - rc = generic_file_mmap(file, vma);
> + rc = generic_file_mmap(file, vma, map_flags);
> if (rc == 0) {
> vma->vm_ops = &ll_file_vm_ops;
> vma->vm_ops->open(vma);
> diff --git a/drivers/staging/media/atomisp/pci/atomisp2/atomisp_fops.c b/drivers/staging/media/atomisp/pci/atomisp2/atomisp_fops.c
> index d8cfed358d55..a95f1a7d780d 100644
> --- a/drivers/staging/media/atomisp/pci/atomisp2/atomisp_fops.c
> +++ b/drivers/staging/media/atomisp/pci/atomisp2/atomisp_fops.c
> @@ -1161,7 +1161,8 @@ static int remove_pad_from_frame(struct atomisp_device *isp,
> return ret;
> }
>
> -static int atomisp_mmap(struct file *file, struct vm_area_struct *vma)
> +static int atomisp_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct video_device *vdev = video_devdata(file);
> struct atomisp_device *isp = video_get_drvdata(vdev);
> @@ -1253,7 +1254,8 @@ static int atomisp_mmap(struct file *file, struct vm_area_struct *vma)
> return ret;
> }
>
> -static int atomisp_file_mmap(struct file *file, struct vm_area_struct *vma)
> +static int atomisp_file_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct video_device *vdev = video_devdata(file);
> struct atomisp_video_pipe *pipe = atomisp_to_video_pipe(vdev);
> diff --git a/drivers/staging/media/davinci_vpfe/vpfe_video.c b/drivers/staging/media/davinci_vpfe/vpfe_video.c
> index 155e8c758e4b..f93d9804ddc9 100644
> --- a/drivers/staging/media/davinci_vpfe/vpfe_video.c
> +++ b/drivers/staging/media/davinci_vpfe/vpfe_video.c
> @@ -561,7 +561,8 @@ static int vpfe_release(struct file *file)
> * vpfe_mmap() - It is used to map kernel space buffers
> * into user spaces
> */
> -static int vpfe_mmap(struct file *file, struct vm_area_struct *vma)
> +static int vpfe_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct vpfe_video_device *video = video_drvdata(file);
> struct vpfe_device *vpfe_dev = video->vpfe_dev;
> diff --git a/drivers/staging/media/omap4iss/iss_video.c b/drivers/staging/media/omap4iss/iss_video.c
> index 9e2f0421a01e..322e9ffea082 100644
> --- a/drivers/staging/media/omap4iss/iss_video.c
> +++ b/drivers/staging/media/omap4iss/iss_video.c
> @@ -1192,7 +1192,8 @@ static unsigned int iss_video_poll(struct file *file, poll_table *wait)
> return vb2_poll(&vfh->queue, file, wait);
> }
>
> -static int iss_video_mmap(struct file *file, struct vm_area_struct *vma)
> +static int iss_video_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct iss_video_fh *vfh = to_iss_video_fh(file->private_data);
>
> diff --git a/drivers/staging/vboxvideo/vbox_drv.h b/drivers/staging/vboxvideo/vbox_drv.h
> index 4b9302703b36..6b392d59da65 100644
> --- a/drivers/staging/vboxvideo/vbox_drv.h
> +++ b/drivers/staging/vboxvideo/vbox_drv.h
> @@ -261,7 +261,8 @@ static inline void vbox_bo_unreserve(struct vbox_bo *bo)
>
> void vbox_ttm_placement(struct vbox_bo *bo, int domain);
> int vbox_bo_push_sysram(struct vbox_bo *bo);
> -int vbox_mmap(struct file *filp, struct vm_area_struct *vma);
> +int vbox_mmap(struct file *filp, struct vm_area_struct *vma,
> + unsigned long map_flags);
>
> /* vbox_prime.c */
> int vbox_gem_prime_pin(struct drm_gem_object *obj);
> @@ -273,7 +274,7 @@ struct drm_gem_object *vbox_gem_prime_import_sg_table(
> void *vbox_gem_prime_vmap(struct drm_gem_object *obj);
> void vbox_gem_prime_vunmap(struct drm_gem_object *obj, void *vaddr);
> int vbox_gem_prime_mmap(struct drm_gem_object *obj,
> - struct vm_area_struct *area);
> + struct vm_area_struct *area, unsigned long map_flags);
>
> /* vbox_irq.c */
> int vbox_irq_init(struct vbox_private *vbox);
> diff --git a/drivers/staging/vboxvideo/vbox_prime.c b/drivers/staging/vboxvideo/vbox_prime.c
> index b7453e427a1d..45165a6c7860 100644
> --- a/drivers/staging/vboxvideo/vbox_prime.c
> +++ b/drivers/staging/vboxvideo/vbox_prime.c
> @@ -67,7 +67,8 @@ void vbox_gem_prime_vunmap(struct drm_gem_object *obj, void *vaddr)
> WARN_ONCE(1, "not implemented");
> }
>
> -int vbox_gem_prime_mmap(struct drm_gem_object *obj, struct vm_area_struct *area)
> +int vbox_gem_prime_mmap(struct drm_gem_object *obj,
> + struct vm_area_struct *area, unsigned long map_flags)
> {
> WARN_ONCE(1, "not implemented");
> return -ENOSYS;
> diff --git a/drivers/staging/vboxvideo/vbox_ttm.c b/drivers/staging/vboxvideo/vbox_ttm.c
> index 4eb410a2a1a8..1f262a6d64db 100644
> --- a/drivers/staging/vboxvideo/vbox_ttm.c
> +++ b/drivers/staging/vboxvideo/vbox_ttm.c
> @@ -457,7 +457,8 @@ int vbox_bo_push_sysram(struct vbox_bo *bo)
> return 0;
> }
>
> -int vbox_mmap(struct file *filp, struct vm_area_struct *vma)
> +int vbox_mmap(struct file *filp, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct drm_file *file_priv;
> struct vbox_private *vbox;
> diff --git a/drivers/staging/vme/devices/vme_user.c b/drivers/staging/vme/devices/vme_user.c
> index a3d4610fbdbe..4edf846529d7 100644
> --- a/drivers/staging/vme/devices/vme_user.c
> +++ b/drivers/staging/vme/devices/vme_user.c
> @@ -484,7 +484,8 @@ static int vme_user_master_mmap(unsigned int minor, struct vm_area_struct *vma)
> return 0;
> }
>
> -static int vme_user_mmap(struct file *file, struct vm_area_struct *vma)
> +static int vme_user_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> unsigned int minor = MINOR(file_inode(file)->i_rdev);
>
> diff --git a/drivers/tee/tee_shm.c b/drivers/tee/tee_shm.c
> index d356d7f025eb..2845f2bd22e9 100644
> --- a/drivers/tee/tee_shm.c
> +++ b/drivers/tee/tee_shm.c
> @@ -71,7 +71,8 @@ static void *tee_shm_op_map(struct dma_buf *dmabuf, unsigned long pgnum)
> return NULL;
> }
>
> -static int tee_shm_op_mmap(struct dma_buf *dmabuf, struct vm_area_struct *vma)
> +static int tee_shm_op_mmap(struct dma_buf *dmabuf, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct tee_shm *shm = dmabuf->priv;
> size_t size = vma->vm_end - vma->vm_start;
> diff --git a/drivers/uio/uio.c b/drivers/uio/uio.c
> index ff04b7f8549f..1ddd3f901127 100644
> --- a/drivers/uio/uio.c
> +++ b/drivers/uio/uio.c
> @@ -674,7 +674,8 @@ static int uio_mmap_physical(struct vm_area_struct *vma)
> vma->vm_page_prot);
> }
>
> -static int uio_mmap(struct file *filep, struct vm_area_struct *vma)
> +static int uio_mmap(struct file *filep, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct uio_listener *listener = filep->private_data;
> struct uio_device *idev = listener->dev;
> diff --git a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c
> index 318bb3b96687..c90a0bded389 100644
> --- a/drivers/usb/core/devio.c
> +++ b/drivers/usb/core/devio.c
> @@ -215,7 +215,8 @@ static const struct vm_operations_struct usbdev_vm_ops = {
> .close = usbdev_vm_close
> };
>
> -static int usbdev_mmap(struct file *file, struct vm_area_struct *vma)
> +static int usbdev_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct usb_memory *usbm = NULL;
> struct usb_dev_state *ps = file->private_data;
> diff --git a/drivers/usb/gadget/function/uvc_v4l2.c b/drivers/usb/gadget/function/uvc_v4l2.c
> index 3e22b45687d3..a15658c0518d 100644
> --- a/drivers/usb/gadget/function/uvc_v4l2.c
> +++ b/drivers/usb/gadget/function/uvc_v4l2.c
> @@ -325,7 +325,8 @@ uvc_v4l2_release(struct file *file)
> }
>
> static int
> -uvc_v4l2_mmap(struct file *file, struct vm_area_struct *vma)
> +uvc_v4l2_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct video_device *vdev = video_devdata(file);
> struct uvc_device *uvc = video_get_drvdata(vdev);
> diff --git a/drivers/usb/mon/mon_bin.c b/drivers/usb/mon/mon_bin.c
> index b6d8bf475c92..69aec6194772 100644
> --- a/drivers/usb/mon/mon_bin.c
> +++ b/drivers/usb/mon/mon_bin.c
> @@ -1246,7 +1246,8 @@ static const struct vm_operations_struct mon_bin_vm_ops = {
> .fault = mon_bin_vma_fault,
> };
>
> -static int mon_bin_mmap(struct file *filp, struct vm_area_struct *vma)
> +static int mon_bin_mmap(struct file *filp, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> /* don't do anything here: "fault" will set up page table entries */
> vma->vm_ops = &mon_bin_vm_ops;
> diff --git a/drivers/vfio/vfio.c b/drivers/vfio/vfio.c
> index 330d50582f40..e972a2de79f6 100644
> --- a/drivers/vfio/vfio.c
> +++ b/drivers/vfio/vfio.c
> @@ -1256,7 +1256,8 @@ static ssize_t vfio_fops_write(struct file *filep, const char __user *buf,
> return ret;
> }
>
> -static int vfio_fops_mmap(struct file *filep, struct vm_area_struct *vma)
> +static int vfio_fops_mmap(struct file *filep, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct vfio_container *container = filep->private_data;
> struct vfio_iommu_driver *driver;
> @@ -1677,7 +1678,9 @@ static ssize_t vfio_device_fops_write(struct file *filep,
> return device->ops->write(device->device_data, buf, count, ppos);
> }
>
> -static int vfio_device_fops_mmap(struct file *filep, struct vm_area_struct *vma)
> +static int vfio_device_fops_mmap(struct file *filep,
> + struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct vfio_device *device = filep->private_data;
>
> diff --git a/drivers/video/fbdev/68328fb.c b/drivers/video/fbdev/68328fb.c
> index c0c6b88d3839..2b6167b06fad 100644
> --- a/drivers/video/fbdev/68328fb.c
> +++ b/drivers/video/fbdev/68328fb.c
> @@ -94,7 +94,8 @@ static int mc68x328fb_setcolreg(u_int regno, u_int red, u_int green, u_int blue,
> u_int transp, struct fb_info *info);
> static int mc68x328fb_pan_display(struct fb_var_screeninfo *var,
> struct fb_info *info);
> -static int mc68x328fb_mmap(struct fb_info *info, struct vm_area_struct *vma);
> +static int mc68x328fb_mmap(struct fb_info *info, struct vm_area_struct *vma,
> + unsigned long map_flags);
>
> static struct fb_ops mc68x328fb_ops = {
> .fb_check_var = mc68x328fb_check_var,
> @@ -389,7 +390,8 @@ static int mc68x328fb_pan_display(struct fb_var_screeninfo *var,
> * Most drivers don't need their own mmap function
> */
>
> -static int mc68x328fb_mmap(struct fb_info *info, struct vm_area_struct *vma)
> +static int mc68x328fb_mmap(struct fb_info *info, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> #ifndef MMU
> /* this is uClinux (no MMU) specific code */
> diff --git a/drivers/video/fbdev/amba-clcd.c b/drivers/video/fbdev/amba-clcd.c
> index ffc2c33c6cef..e19b72639b7c 100644
> --- a/drivers/video/fbdev/amba-clcd.c
> +++ b/drivers/video/fbdev/amba-clcd.c
> @@ -426,7 +426,7 @@ static int clcdfb_blank(int blank_mode, struct fb_info *info)
> }
>
> static int clcdfb_mmap(struct fb_info *info,
> - struct vm_area_struct *vma)
> + struct vm_area_struct *vma, unsigned long map_flags)
> {
> struct clcd_fb *fb = to_clcd(info);
> unsigned long len, off = vma->vm_pgoff << PAGE_SHIFT;
> diff --git a/drivers/video/fbdev/aty/atyfb_base.c b/drivers/video/fbdev/aty/atyfb_base.c
> index b55fdac9c9f5..61575cd0049d 100644
> --- a/drivers/video/fbdev/aty/atyfb_base.c
> +++ b/drivers/video/fbdev/aty/atyfb_base.c
> @@ -236,7 +236,8 @@ static int atyfb_pan_display(struct fb_var_screeninfo *var,
> static int atyfb_blank(int blank, struct fb_info *info);
> static int atyfb_ioctl(struct fb_info *info, u_int cmd, u_long arg);
> #ifdef __sparc__
> -static int atyfb_mmap(struct fb_info *info, struct vm_area_struct *vma);
> +static int atyfb_mmap(struct fb_info *info, struct vm_area_struct *vma,
> + unsigned long map_flags);
> #endif
> static int atyfb_sync(struct fb_info *info);
>
> @@ -1928,7 +1929,8 @@ static int atyfb_sync(struct fb_info *info)
> }
>
> #ifdef __sparc__
> -static int atyfb_mmap(struct fb_info *info, struct vm_area_struct *vma)
> +static int atyfb_mmap(struct fb_info *info, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct atyfb_par *par = (struct atyfb_par *) info->par;
> unsigned int size, page, map_size = 0;
> diff --git a/drivers/video/fbdev/au1100fb.c b/drivers/video/fbdev/au1100fb.c
> index 8de42f617d16..391eb89b0457 100644
> --- a/drivers/video/fbdev/au1100fb.c
> +++ b/drivers/video/fbdev/au1100fb.c
> @@ -338,7 +338,8 @@ int au1100fb_fb_pan_display(struct fb_var_screeninfo *var, struct fb_info *fbi)
> * Map video memory in user space. We don't use the generic fb_mmap method mainly
> * to allow the use of the TLB streaming flag (CCA=6)
> */
> -int au1100fb_fb_mmap(struct fb_info *fbi, struct vm_area_struct *vma)
> +int au1100fb_fb_mmap(struct fb_info *fbi, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct au1100fb_device *fbdev;
>
> diff --git a/drivers/video/fbdev/au1200fb.c b/drivers/video/fbdev/au1200fb.c
> index 5f04b4096c42..e5902d9fd110 100644
> --- a/drivers/video/fbdev/au1200fb.c
> +++ b/drivers/video/fbdev/au1200fb.c
> @@ -1228,7 +1228,8 @@ static int au1200fb_fb_blank(int blank_mode, struct fb_info *fbi)
> * Map video memory in user space. We don't use the generic fb_mmap
> * method mainly to allow the use of the TLB streaming flag (CCA=6)
> */
> -static int au1200fb_fb_mmap(struct fb_info *info, struct vm_area_struct *vma)
> +static int au1200fb_fb_mmap(struct fb_info *info, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct au1200fb_device *fbdev = info->par;
>
> diff --git a/drivers/video/fbdev/bw2.c b/drivers/video/fbdev/bw2.c
> index 8c5b281f0b29..24b379dc327f 100644
> --- a/drivers/video/fbdev/bw2.c
> +++ b/drivers/video/fbdev/bw2.c
> @@ -29,7 +29,7 @@
>
> static int bw2_blank(int, struct fb_info *);
>
> -static int bw2_mmap(struct fb_info *, struct vm_area_struct *);
> +static int bw2_mmap(struct fb_info *, struct vm_area_struct *, unsigned long);
> static int bw2_ioctl(struct fb_info *, unsigned int, unsigned long);
>
> /*
> @@ -159,7 +159,8 @@ static struct sbus_mmap_map bw2_mmap_map[] = {
> { .size = 0 }
> };
>
> -static int bw2_mmap(struct fb_info *info, struct vm_area_struct *vma)
> +static int bw2_mmap(struct fb_info *info, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct bw2_par *par = (struct bw2_par *)info->par;
>
> diff --git a/drivers/video/fbdev/cg14.c b/drivers/video/fbdev/cg14.c
> index 43e915eaf606..665c8bb36fb3 100644
> --- a/drivers/video/fbdev/cg14.c
> +++ b/drivers/video/fbdev/cg14.c
> @@ -30,7 +30,7 @@
> static int cg14_setcolreg(unsigned, unsigned, unsigned, unsigned,
> unsigned, struct fb_info *);
>
> -static int cg14_mmap(struct fb_info *, struct vm_area_struct *);
> +static int cg14_mmap(struct fb_info *, struct vm_area_struct *, unsigned long);
> static int cg14_ioctl(struct fb_info *, unsigned int, unsigned long);
> static int cg14_pan_display(struct fb_var_screeninfo *, struct fb_info *);
>
> @@ -263,7 +263,8 @@ static int cg14_setcolreg(unsigned regno,
> return 0;
> }
>
> -static int cg14_mmap(struct fb_info *info, struct vm_area_struct *vma)
> +static int cg14_mmap(struct fb_info *info, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct cg14_par *par = (struct cg14_par *) info->par;
>
> diff --git a/drivers/video/fbdev/cg3.c b/drivers/video/fbdev/cg3.c
> index 716391f22e75..6513f1e5aa8f 100644
> --- a/drivers/video/fbdev/cg3.c
> +++ b/drivers/video/fbdev/cg3.c
> @@ -31,7 +31,7 @@ static int cg3_setcolreg(unsigned, unsigned, unsigned, unsigned,
> unsigned, struct fb_info *);
> static int cg3_blank(int, struct fb_info *);
>
> -static int cg3_mmap(struct fb_info *, struct vm_area_struct *);
> +static int cg3_mmap(struct fb_info *, struct vm_area_struct *, unsigned long);
> static int cg3_ioctl(struct fb_info *, unsigned int, unsigned long);
>
> /*
> @@ -223,7 +223,8 @@ static struct sbus_mmap_map cg3_mmap_map[] = {
> { .size = 0 }
> };
>
> -static int cg3_mmap(struct fb_info *info, struct vm_area_struct *vma)
> +static int cg3_mmap(struct fb_info *info, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct cg3_par *par = (struct cg3_par *)info->par;
>
> diff --git a/drivers/video/fbdev/cg6.c b/drivers/video/fbdev/cg6.c
> index bdf901ed5291..6d7afb826f27 100644
> --- a/drivers/video/fbdev/cg6.c
> +++ b/drivers/video/fbdev/cg6.c
> @@ -35,7 +35,7 @@ static void cg6_imageblit(struct fb_info *, const struct fb_image *);
> static void cg6_fillrect(struct fb_info *, const struct fb_fillrect *);
> static void cg6_copyarea(struct fb_info *info, const struct fb_copyarea *area);
> static int cg6_sync(struct fb_info *);
> -static int cg6_mmap(struct fb_info *, struct vm_area_struct *);
> +static int cg6_mmap(struct fb_info *, struct vm_area_struct *, unsigned long);
> static int cg6_ioctl(struct fb_info *, unsigned int, unsigned long);
> static int cg6_pan_display(struct fb_var_screeninfo *, struct fb_info *);
>
> @@ -588,7 +588,8 @@ static struct sbus_mmap_map cg6_mmap_map[] = {
> { .size = 0 }
> };
>
> -static int cg6_mmap(struct fb_info *info, struct vm_area_struct *vma)
> +static int cg6_mmap(struct fb_info *info, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct cg6_par *par = (struct cg6_par *)info->par;
>
> diff --git a/drivers/video/fbdev/controlfb.c b/drivers/video/fbdev/controlfb.c
> index 8d14b29aafea..03b2477fe309 100644
> --- a/drivers/video/fbdev/controlfb.c
> +++ b/drivers/video/fbdev/controlfb.c
> @@ -129,7 +129,7 @@ static int controlfb_setcolreg(u_int regno, u_int red, u_int green, u_int blue,
> u_int transp, struct fb_info *info);
> static int controlfb_blank(int blank_mode, struct fb_info *info);
> static int controlfb_mmap(struct fb_info *info,
> - struct vm_area_struct *vma);
> + struct vm_area_struct *vma, unsigned long map_flags);
> static int controlfb_set_par (struct fb_info *info);
> static int controlfb_check_var (struct fb_var_screeninfo *var, struct fb_info *info);
>
> @@ -285,7 +285,7 @@ static int controlfb_pan_display(struct fb_var_screeninfo *var,
> * Note there's no locking in here; it's done in fb_mmap() in fbmem.c.
> */
> static int controlfb_mmap(struct fb_info *info,
> - struct vm_area_struct *vma)
> + struct vm_area_struct *vma, unsigned long map_flags)
> {
> unsigned long mmio_pgoff;
> unsigned long start;
> diff --git a/drivers/video/fbdev/core/fb_defio.c b/drivers/video/fbdev/core/fb_defio.c
> index 487d5e336e1b..bbe2d200d24b 100644
> --- a/drivers/video/fbdev/core/fb_defio.c
> +++ b/drivers/video/fbdev/core/fb_defio.c
> @@ -162,7 +162,8 @@ static const struct address_space_operations fb_deferred_io_aops = {
> .set_page_dirty = fb_deferred_io_set_page_dirty,
> };
>
> -int fb_deferred_io_mmap(struct fb_info *info, struct vm_area_struct *vma)
> +int fb_deferred_io_mmap(struct fb_info *info, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> vma->vm_ops = &fb_deferred_io_vm_ops;
> vma->vm_flags |= VM_DONTEXPAND | VM_DONTDUMP;
> diff --git a/drivers/video/fbdev/core/fbmem.c b/drivers/video/fbdev/core/fbmem.c
> index 25e862c487f6..4b8b5ccd20c4 100644
> --- a/drivers/video/fbdev/core/fbmem.c
> +++ b/drivers/video/fbdev/core/fbmem.c
> @@ -1381,7 +1381,8 @@ static long fb_compat_ioctl(struct file *file, unsigned int cmd,
> #endif
>
> static int
> -fb_mmap(struct file *file, struct vm_area_struct * vma)
> +fb_mmap(struct file *file, struct vm_area_struct * vma,
> + unsigned long map_flags)
> {
> struct fb_info *info = file_fb_info(file);
> struct fb_ops *fb;
> @@ -1403,7 +1404,7 @@ fb_mmap(struct file *file, struct vm_area_struct * vma)
> * SME protection is removed ahead of the call
> */
> vma->vm_page_prot = pgprot_decrypted(vma->vm_page_prot);
> - res = fb->fb_mmap(info, vma);
> + res = fb->fb_mmap(info, vma, map_flags);
> mutex_unlock(&info->mm_lock);
> return res;
> }
> diff --git a/drivers/video/fbdev/ep93xx-fb.c b/drivers/video/fbdev/ep93xx-fb.c
> index 75f0db25d19f..e9622f04851a 100644
> --- a/drivers/video/fbdev/ep93xx-fb.c
> +++ b/drivers/video/fbdev/ep93xx-fb.c
> @@ -311,7 +311,8 @@ static int ep93xxfb_check_var(struct fb_var_screeninfo *var,
> return 0;
> }
>
> -static int ep93xxfb_mmap(struct fb_info *info, struct vm_area_struct *vma)
> +static int ep93xxfb_mmap(struct fb_info *info, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> unsigned int offset = vma->vm_pgoff << PAGE_SHIFT;
>
> diff --git a/drivers/video/fbdev/fb-puv3.c b/drivers/video/fbdev/fb-puv3.c
> index 88fa2e70a0bb..02e183ae1fbb 100644
> --- a/drivers/video/fbdev/fb-puv3.c
> +++ b/drivers/video/fbdev/fb-puv3.c
> @@ -640,7 +640,7 @@ static int unifb_pan_display(struct fb_var_screeninfo *var,
> }
>
> int unifb_mmap(struct fb_info *info,
> - struct vm_area_struct *vma)
> + struct vm_area_struct *vma, unsigned long map_flags)
> {
> vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
>
> diff --git a/drivers/video/fbdev/ffb.c b/drivers/video/fbdev/ffb.c
> index dda31e0a45af..c7fd60da4980 100644
> --- a/drivers/video/fbdev/ffb.c
> +++ b/drivers/video/fbdev/ffb.c
> @@ -35,7 +35,7 @@ static void ffb_imageblit(struct fb_info *, const struct fb_image *);
> static void ffb_fillrect(struct fb_info *, const struct fb_fillrect *);
> static void ffb_copyarea(struct fb_info *, const struct fb_copyarea *);
> static int ffb_sync(struct fb_info *);
> -static int ffb_mmap(struct fb_info *, struct vm_area_struct *);
> +static int ffb_mmap(struct fb_info *, struct vm_area_struct *, unsigned long);
> static int ffb_ioctl(struct fb_info *, unsigned int, unsigned long);
> static int ffb_pan_display(struct fb_var_screeninfo *, struct fb_info *);
>
> @@ -848,7 +848,8 @@ static struct sbus_mmap_map ffb_mmap_map[] = {
> { .size = 0 }
> };
>
> -static int ffb_mmap(struct fb_info *info, struct vm_area_struct *vma)
> +static int ffb_mmap(struct fb_info *info, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct ffb_par *par = (struct ffb_par *)info->par;
>
> diff --git a/drivers/video/fbdev/gbefb.c b/drivers/video/fbdev/gbefb.c
> index 1a242b1338e9..a6e04c834733 100644
> --- a/drivers/video/fbdev/gbefb.c
> +++ b/drivers/video/fbdev/gbefb.c
> @@ -1000,7 +1000,7 @@ static int gbefb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
> }
>
> static int gbefb_mmap(struct fb_info *info,
> - struct vm_area_struct *vma)
> + struct vm_area_struct *vma, unsigned long map_flags)
> {
> unsigned long size = vma->vm_end - vma->vm_start;
> unsigned long offset = vma->vm_pgoff << PAGE_SHIFT;
> diff --git a/drivers/video/fbdev/igafb.c b/drivers/video/fbdev/igafb.c
> index 486f18897414..33664c1b71ae 100644
> --- a/drivers/video/fbdev/igafb.c
> +++ b/drivers/video/fbdev/igafb.c
> @@ -219,7 +219,7 @@ static void iga_blank_border(struct iga_par *par)
>
> #ifdef CONFIG_SPARC
> static int igafb_mmap(struct fb_info *info,
> - struct vm_area_struct *vma)
> + struct vm_area_struct *vma, unsigned long map_flags)
> {
> struct iga_par *par = (struct iga_par *)info->par;
> unsigned int size, page, map_size = 0;
> diff --git a/drivers/video/fbdev/leo.c b/drivers/video/fbdev/leo.c
> index 62e59dc90ee6..7b970f3ad500 100644
> --- a/drivers/video/fbdev/leo.c
> +++ b/drivers/video/fbdev/leo.c
> @@ -30,7 +30,7 @@ static int leo_setcolreg(unsigned, unsigned, unsigned, unsigned,
> unsigned, struct fb_info *);
> static int leo_blank(int, struct fb_info *);
>
> -static int leo_mmap(struct fb_info *, struct vm_area_struct *);
> +static int leo_mmap(struct fb_info *, struct vm_area_struct *, unsigned long);
> static int leo_ioctl(struct fb_info *, unsigned int, unsigned long);
> static int leo_pan_display(struct fb_var_screeninfo *, struct fb_info *);
>
> @@ -412,7 +412,8 @@ static struct sbus_mmap_map leo_mmap_map[] = {
> { .size = 0 }
> };
>
> -static int leo_mmap(struct fb_info *info, struct vm_area_struct *vma)
> +static int leo_mmap(struct fb_info *info, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct leo_par *par = (struct leo_par *)info->par;
>
> diff --git a/drivers/video/fbdev/omap/omapfb_main.c b/drivers/video/fbdev/omap/omapfb_main.c
> index 3479a47a3082..be1be6ab70a9 100644
> --- a/drivers/video/fbdev/omap/omapfb_main.c
> +++ b/drivers/video/fbdev/omap/omapfb_main.c
> @@ -1208,7 +1208,8 @@ static int omapfb_ioctl(struct fb_info *fbi, unsigned int cmd,
> return r;
> }
>
> -static int omapfb_mmap(struct fb_info *info, struct vm_area_struct *vma)
> +static int omapfb_mmap(struct fb_info *info, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct omapfb_plane_struct *plane = info->par;
> struct omapfb_device *fbdev = plane->fbdev;
> diff --git a/drivers/video/fbdev/omap2/omapfb/omapfb-main.c b/drivers/video/fbdev/omap2/omapfb/omapfb-main.c
> index 1d7c012f09db..0866a8770464 100644
> --- a/drivers/video/fbdev/omap2/omapfb/omapfb-main.c
> +++ b/drivers/video/fbdev/omap2/omapfb/omapfb-main.c
> @@ -1096,7 +1096,8 @@ static const struct vm_operations_struct mmap_user_ops = {
> .close = mmap_user_close,
> };
>
> -static int omapfb_mmap(struct fb_info *fbi, struct vm_area_struct *vma)
> +static int omapfb_mmap(struct fb_info *fbi, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct omapfb_info *ofbi = FB2OFB(fbi);
> struct fb_fix_screeninfo *fix = &fbi->fix;
> diff --git a/drivers/video/fbdev/p9100.c b/drivers/video/fbdev/p9100.c
> index 1f6ee76af878..55e9a053dc68 100644
> --- a/drivers/video/fbdev/p9100.c
> +++ b/drivers/video/fbdev/p9100.c
> @@ -29,7 +29,8 @@ static int p9100_setcolreg(unsigned, unsigned, unsigned, unsigned,
> unsigned, struct fb_info *);
> static int p9100_blank(int, struct fb_info *);
>
> -static int p9100_mmap(struct fb_info *, struct vm_area_struct *);
> +static int p9100_mmap(struct fb_info *, struct vm_area_struct *,
> + unsigned long);
> static int p9100_ioctl(struct fb_info *, unsigned int, unsigned long);
>
> /*
> @@ -216,7 +217,8 @@ static struct sbus_mmap_map p9100_mmap_map[] = {
> { 0, 0, 0 }
> };
>
> -static int p9100_mmap(struct fb_info *info, struct vm_area_struct *vma)
> +static int p9100_mmap(struct fb_info *info, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct p9100_par *par = (struct p9100_par *)info->par;
>
> diff --git a/drivers/video/fbdev/ps3fb.c b/drivers/video/fbdev/ps3fb.c
> index b269abd932aa..dbf0390289ed 100644
> --- a/drivers/video/fbdev/ps3fb.c
> +++ b/drivers/video/fbdev/ps3fb.c
> @@ -703,7 +703,8 @@ static int ps3fb_pan_display(struct fb_var_screeninfo *var,
> * As we have a virtual frame buffer, we need our own mmap function
> */
>
> -static int ps3fb_mmap(struct fb_info *info, struct vm_area_struct *vma)
> +static int ps3fb_mmap(struct fb_info *info, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> int r;
>
> diff --git a/drivers/video/fbdev/pxa3xx-gcu.c b/drivers/video/fbdev/pxa3xx-gcu.c
> index 50bce45e7f3d..bed61712616e 100644
> --- a/drivers/video/fbdev/pxa3xx-gcu.c
> +++ b/drivers/video/fbdev/pxa3xx-gcu.c
> @@ -479,7 +479,8 @@ pxa3xx_gcu_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
> }
>
> static int
> -pxa3xx_gcu_mmap(struct file *file, struct vm_area_struct *vma)
> +pxa3xx_gcu_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> unsigned int size = vma->vm_end - vma->vm_start;
> struct pxa3xx_gcu_priv *priv = to_pxa3xx_gcu_priv(file);
> diff --git a/drivers/video/fbdev/sa1100fb.c b/drivers/video/fbdev/sa1100fb.c
> index fc2aaa5aca23..3bb625aaa3bc 100644
> --- a/drivers/video/fbdev/sa1100fb.c
> +++ b/drivers/video/fbdev/sa1100fb.c
> @@ -559,7 +559,7 @@ static int sa1100fb_blank(int blank, struct fb_info *info)
> }
>
> static int sa1100fb_mmap(struct fb_info *info,
> - struct vm_area_struct *vma)
> + struct vm_area_struct *vma, unsigned long map_flags)
> {
> struct sa1100fb_info *fbi =
> container_of(info, struct sa1100fb_info, fb);
> diff --git a/drivers/video/fbdev/sh_mobile_lcdcfb.c b/drivers/video/fbdev/sh_mobile_lcdcfb.c
> index c3a46506e47e..d66ebc40f939 100644
> --- a/drivers/video/fbdev/sh_mobile_lcdcfb.c
> +++ b/drivers/video/fbdev/sh_mobile_lcdcfb.c
> @@ -1618,7 +1618,8 @@ static int sh_mobile_lcdc_overlay_blank(int blank, struct fb_info *info)
> }
>
> static int
> -sh_mobile_lcdc_overlay_mmap(struct fb_info *info, struct vm_area_struct *vma)
> +sh_mobile_lcdc_overlay_mmap(struct fb_info *info, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct sh_mobile_lcdc_overlay *ovl = info->par;
>
> @@ -2107,7 +2108,8 @@ static int sh_mobile_lcdc_blank(int blank, struct fb_info *info)
> }
>
> static int
> -sh_mobile_lcdc_mmap(struct fb_info *info, struct vm_area_struct *vma)
> +sh_mobile_lcdc_mmap(struct fb_info *info, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct sh_mobile_lcdc_chan *ch = info->par;
>
> diff --git a/drivers/video/fbdev/smscufx.c b/drivers/video/fbdev/smscufx.c
> index 449fceaf79d5..0e2fe19c0037 100644
> --- a/drivers/video/fbdev/smscufx.c
> +++ b/drivers/video/fbdev/smscufx.c
> @@ -775,7 +775,8 @@ static int ufx_set_vid_mode(struct ufx_data *dev, struct fb_var_screeninfo *var)
> return 0;
> }
>
> -static int ufx_ops_mmap(struct fb_info *info, struct vm_area_struct *vma)
> +static int ufx_ops_mmap(struct fb_info *info, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> unsigned long start = vma->vm_start;
> unsigned long size = vma->vm_end - vma->vm_start;
> diff --git a/drivers/video/fbdev/tcx.c b/drivers/video/fbdev/tcx.c
> index 54ad08854c94..8492eeb95a09 100644
> --- a/drivers/video/fbdev/tcx.c
> +++ b/drivers/video/fbdev/tcx.c
> @@ -31,7 +31,7 @@ static int tcx_setcolreg(unsigned, unsigned, unsigned, unsigned,
> unsigned, struct fb_info *);
> static int tcx_blank(int, struct fb_info *);
>
> -static int tcx_mmap(struct fb_info *, struct vm_area_struct *);
> +static int tcx_mmap(struct fb_info *, struct vm_area_struct *, unsigned long);
> static int tcx_ioctl(struct fb_info *, unsigned int, unsigned long);
> static int tcx_pan_display(struct fb_var_screeninfo *, struct fb_info *);
>
> @@ -297,7 +297,8 @@ static struct sbus_mmap_map __tcx_mmap_map[TCX_MMAP_ENTRIES] = {
> { .size = 0 }
> };
>
> -static int tcx_mmap(struct fb_info *info, struct vm_area_struct *vma)
> +static int tcx_mmap(struct fb_info *info, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct tcx_par *par = (struct tcx_par *)info->par;
>
> diff --git a/drivers/video/fbdev/udlfb.c b/drivers/video/fbdev/udlfb.c
> index 05ef657235df..81c393237da1 100644
> --- a/drivers/video/fbdev/udlfb.c
> +++ b/drivers/video/fbdev/udlfb.c
> @@ -317,7 +317,8 @@ static int dlfb_set_video_mode(struct dlfb_data *dev,
> return retval;
> }
>
> -static int dlfb_ops_mmap(struct fb_info *info, struct vm_area_struct *vma)
> +static int dlfb_ops_mmap(struct fb_info *info, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> unsigned long start = vma->vm_start;
> unsigned long size = vma->vm_end - vma->vm_start;
> diff --git a/drivers/video/fbdev/vermilion/vermilion.c b/drivers/video/fbdev/vermilion/vermilion.c
> index ce4c4729a5e8..21ba107cb070 100644
> --- a/drivers/video/fbdev/vermilion/vermilion.c
> +++ b/drivers/video/fbdev/vermilion/vermilion.c
> @@ -998,7 +998,8 @@ static int vmlfb_setcolreg(u_int regno, u_int red, u_int green, u_int blue,
> return 0;
> }
>
> -static int vmlfb_mmap(struct fb_info *info, struct vm_area_struct *vma)
> +static int vmlfb_mmap(struct fb_info *info, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct vml_info *vinfo = container_of(info, struct vml_info, info);
> unsigned long offset = vma->vm_pgoff << PAGE_SHIFT;
> diff --git a/drivers/video/fbdev/vfb.c b/drivers/video/fbdev/vfb.c
> index da653a080394..181b6dff95b6 100644
> --- a/drivers/video/fbdev/vfb.c
> +++ b/drivers/video/fbdev/vfb.c
> @@ -76,7 +76,7 @@ static int vfb_setcolreg(u_int regno, u_int red, u_int green, u_int blue,
> static int vfb_pan_display(struct fb_var_screeninfo *var,
> struct fb_info *info);
> static int vfb_mmap(struct fb_info *info,
> - struct vm_area_struct *vma);
> + struct vm_area_struct *vma, unsigned long map_flags);
>
> static struct fb_ops vfb_ops = {
> .fb_read = fb_sys_read,
> @@ -367,7 +367,7 @@ static int vfb_pan_display(struct fb_var_screeninfo *var,
> */
>
> static int vfb_mmap(struct fb_info *info,
> - struct vm_area_struct *vma)
> + struct vm_area_struct *vma, unsigned long map_flags)
> {
> return remap_vmalloc_range(vma, (void *)info->fix.smem_start, vma->vm_pgoff);
> }
> diff --git a/drivers/xen/gntalloc.c b/drivers/xen/gntalloc.c
> index 1bf55a32a4b3..35ded2a8bba6 100644
> --- a/drivers/xen/gntalloc.c
> +++ b/drivers/xen/gntalloc.c
> @@ -502,7 +502,8 @@ static const struct vm_operations_struct gntalloc_vmops = {
> .close = gntalloc_vma_close,
> };
>
> -static int gntalloc_mmap(struct file *filp, struct vm_area_struct *vma)
> +static int gntalloc_mmap(struct file *filp, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct gntalloc_file_private_data *priv = filp->private_data;
> struct gntalloc_vma_private_data *vm_priv;
> diff --git a/drivers/xen/gntdev.c b/drivers/xen/gntdev.c
> index 82360594fa8e..46ea8822cb8f 100644
> --- a/drivers/xen/gntdev.c
> +++ b/drivers/xen/gntdev.c
> @@ -972,7 +972,8 @@ static long gntdev_ioctl(struct file *flip,
> return 0;
> }
>
> -static int gntdev_mmap(struct file *flip, struct vm_area_struct *vma)
> +static int gntdev_mmap(struct file *flip, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct gntdev_priv *priv = flip->private_data;
> int index = vma->vm_pgoff;
> diff --git a/drivers/xen/privcmd.c b/drivers/xen/privcmd.c
> index feca75b07fdd..3a8278d72375 100644
> --- a/drivers/xen/privcmd.c
> +++ b/drivers/xen/privcmd.c
> @@ -818,7 +818,8 @@ static const struct vm_operations_struct privcmd_vm_ops = {
> .fault = privcmd_fault
> };
>
> -static int privcmd_mmap(struct file *file, struct vm_area_struct *vma)
> +static int privcmd_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> /* DONTCOPY is essential for Xen because copy_page_range doesn't know
> * how to recreate these mappings */
> diff --git a/drivers/xen/xenbus/xenbus_dev_backend.c b/drivers/xen/xenbus/xenbus_dev_backend.c
> index 1126701e212e..ed7e81ae167a 100644
> --- a/drivers/xen/xenbus/xenbus_dev_backend.c
> +++ b/drivers/xen/xenbus/xenbus_dev_backend.c
> @@ -88,7 +88,8 @@ static long xenbus_backend_ioctl(struct file *file, unsigned int cmd,
> }
> }
>
> -static int xenbus_backend_mmap(struct file *file, struct vm_area_struct *vma)
> +static int xenbus_backend_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> size_t size = vma->vm_end - vma->vm_start;
>
> diff --git a/drivers/xen/xenfs/xenstored.c b/drivers/xen/xenfs/xenstored.c
> index 82fd2a396d96..259ad78834a4 100644
> --- a/drivers/xen/xenfs/xenstored.c
> +++ b/drivers/xen/xenfs/xenstored.c
> @@ -30,7 +30,8 @@ static int xsd_kva_open(struct inode *inode, struct file *file)
> return 0;
> }
>
> -static int xsd_kva_mmap(struct file *file, struct vm_area_struct *vma)
> +static int xsd_kva_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> size_t size = vma->vm_end - vma->vm_start;
>
> diff --git a/fs/9p/vfs_file.c b/fs/9p/vfs_file.c
> index 03c9e325bfbc..8aabe33926f9 100644
> --- a/fs/9p/vfs_file.c
> +++ b/fs/9p/vfs_file.c
> @@ -484,12 +484,13 @@ int v9fs_file_fsync_dotl(struct file *filp, loff_t start, loff_t end,
> }
>
> static int
> -v9fs_file_mmap(struct file *filp, struct vm_area_struct *vma)
> +v9fs_file_mmap(struct file *filp, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> int retval;
>
>
> - retval = generic_file_mmap(filp, vma);
> + retval = generic_file_mmap(filp, vma, map_flags);
> if (!retval)
> vma->vm_ops = &v9fs_file_vm_ops;
>
> @@ -497,7 +498,8 @@ v9fs_file_mmap(struct file *filp, struct vm_area_struct *vma)
> }
>
> static int
> -v9fs_mmap_file_mmap(struct file *filp, struct vm_area_struct *vma)
> +v9fs_mmap_file_mmap(struct file *filp, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> int retval;
> struct inode *inode;
> @@ -526,7 +528,7 @@ v9fs_mmap_file_mmap(struct file *filp, struct vm_area_struct *vma)
> }
> mutex_unlock(&v9inode->v_mutex);
>
> - retval = generic_file_mmap(filp, vma);
> + retval = generic_file_mmap(filp, vma, map_flags);
> if (!retval)
> vma->vm_ops = &v9fs_mmap_file_vm_ops;
>
> diff --git a/fs/aio.c b/fs/aio.c
> index dcad3a66748c..e07cabf73093 100644
> --- a/fs/aio.c
> +++ b/fs/aio.c
> @@ -353,7 +353,8 @@ static const struct vm_operations_struct aio_ring_vm_ops = {
> #endif
> };
>
> -static int aio_ring_mmap(struct file *file, struct vm_area_struct *vma)
> +static int aio_ring_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> vma->vm_flags |= VM_DONTEXPAND;
> vma->vm_ops = &aio_ring_vm_ops;
> diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c
> index 9e75d8a39aac..53e129be33ea 100644
> --- a/fs/btrfs/file.c
> +++ b/fs/btrfs/file.c
> @@ -2262,7 +2262,9 @@ static const struct vm_operations_struct btrfs_file_vm_ops = {
> .page_mkwrite = btrfs_page_mkwrite,
> };
>
> -static int btrfs_file_mmap(struct file *filp, struct vm_area_struct *vma)
> +static int btrfs_file_mmap(struct file *filp,
> + struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct address_space *mapping = filp->f_mapping;
>
> diff --git a/fs/ceph/addr.c b/fs/ceph/addr.c
> index 1bc709fe330a..2673bb1cc0bb 100644
> --- a/fs/ceph/addr.c
> +++ b/fs/ceph/addr.c
> @@ -1761,7 +1761,8 @@ static const struct vm_operations_struct ceph_vmops = {
> .page_mkwrite = ceph_page_mkwrite,
> };
>
> -int ceph_mmap(struct file *file, struct vm_area_struct *vma)
> +int ceph_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct address_space *mapping = file->f_mapping;
>
> diff --git a/fs/ceph/super.h b/fs/ceph/super.h
> index f02a2225fe42..8cf77043bdc6 100644
> --- a/fs/ceph/super.h
> +++ b/fs/ceph/super.h
> @@ -942,7 +942,8 @@ extern void ceph_put_fmode(struct ceph_inode_info *ci, int mode);
>
> /* addr.c */
> extern const struct address_space_operations ceph_aops;
> -extern int ceph_mmap(struct file *file, struct vm_area_struct *vma);
> +extern int ceph_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags);
> extern int ceph_uninline_data(struct file *filp, struct page *locked_page);
> extern int ceph_pool_perm_check(struct ceph_inode_info *ci, int need);
> extern void ceph_pool_perm_destroy(struct ceph_mds_client* mdsc);
> diff --git a/fs/cifs/cifsfs.h b/fs/cifs/cifsfs.h
> index 30bf89b1fd9a..c9efc42e4f34 100644
> --- a/fs/cifs/cifsfs.h
> +++ b/fs/cifs/cifsfs.h
> @@ -109,8 +109,10 @@ extern int cifs_lock(struct file *, int, struct file_lock *);
> extern int cifs_fsync(struct file *, loff_t, loff_t, int);
> extern int cifs_strict_fsync(struct file *, loff_t, loff_t, int);
> extern int cifs_flush(struct file *, fl_owner_t id);
> -extern int cifs_file_mmap(struct file * , struct vm_area_struct *);
> -extern int cifs_file_strict_mmap(struct file * , struct vm_area_struct *);
> +extern int cifs_file_mmap(struct file * , struct vm_area_struct *,
> + unsigned long);
> +extern int cifs_file_strict_mmap(struct file * , struct vm_area_struct *,
> + unsigned long);
> extern const struct file_operations cifs_dir_ops;
> extern int cifs_dir_open(struct inode *inode, struct file *file);
> extern int cifs_readdir(struct file *file, struct dir_context *ctx);
> diff --git a/fs/cifs/file.c b/fs/cifs/file.c
> index 0786f19d288f..e59d6e703fd8 100644
> --- a/fs/cifs/file.c
> +++ b/fs/cifs/file.c
> @@ -3475,7 +3475,8 @@ static const struct vm_operations_struct cifs_file_vm_ops = {
> .page_mkwrite = cifs_page_mkwrite,
> };
>
> -int cifs_file_strict_mmap(struct file *file, struct vm_area_struct *vma)
> +int cifs_file_strict_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> int rc, xid;
> struct inode *inode = file_inode(file);
> @@ -3488,14 +3489,15 @@ int cifs_file_strict_mmap(struct file *file, struct vm_area_struct *vma)
> return rc;
> }
>
> - rc = generic_file_mmap(file, vma);
> + rc = generic_file_mmap(file, vma, map_flags);
> if (rc == 0)
> vma->vm_ops = &cifs_file_vm_ops;
> free_xid(xid);
> return rc;
> }
>
> -int cifs_file_mmap(struct file *file, struct vm_area_struct *vma)
> +int cifs_file_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> int rc, xid;
>
> @@ -3507,7 +3509,7 @@ int cifs_file_mmap(struct file *file, struct vm_area_struct *vma)
> free_xid(xid);
> return rc;
> }
> - rc = generic_file_mmap(file, vma);
> + rc = generic_file_mmap(file, vma, map_flags);
> if (rc == 0)
> vma->vm_ops = &cifs_file_vm_ops;
> free_xid(xid);
> diff --git a/fs/coda/file.c b/fs/coda/file.c
> index 363402fcb3ed..902447f0c152 100644
> --- a/fs/coda/file.c
> +++ b/fs/coda/file.c
> @@ -61,7 +61,8 @@ coda_file_write_iter(struct kiocb *iocb, struct iov_iter *to)
> }
>
> static int
> -coda_file_mmap(struct file *coda_file, struct vm_area_struct *vma)
> +coda_file_mmap(struct file *coda_file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct coda_file_info *cfi;
> struct coda_inode_info *cii;
> @@ -96,7 +97,7 @@ coda_file_mmap(struct file *coda_file, struct vm_area_struct *vma)
> cfi->cfi_mapcount++;
> spin_unlock(&cii->c_lock);
>
> - return call_mmap(host_file, vma);
> + return call_mmap(host_file, vma, map_flags);
> }
>
> int coda_open(struct inode *coda_inode, struct file *coda_file)
> diff --git a/fs/ecryptfs/file.c b/fs/ecryptfs/file.c
> index c74ed3ca3372..c20617d9f0b4 100644
> --- a/fs/ecryptfs/file.c
> +++ b/fs/ecryptfs/file.c
> @@ -169,7 +169,8 @@ static int read_or_initialize_metadata(struct dentry *dentry)
> return rc;
> }
>
> -static int ecryptfs_mmap(struct file *file, struct vm_area_struct *vma)
> +static int ecryptfs_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct file *lower_file = ecryptfs_file_to_lower(file);
> /*
> @@ -179,7 +180,7 @@ static int ecryptfs_mmap(struct file *file, struct vm_area_struct *vma)
> */
> if (!lower_file->f_op->mmap)
> return -ENODEV;
> - return generic_file_mmap(file, vma);
> + return generic_file_mmap(file, vma, map_flags);
> }
>
> /**
> diff --git a/fs/ext2/file.c b/fs/ext2/file.c
> index ff3a3636a5ca..1fb8f39e14bb 100644
> --- a/fs/ext2/file.c
> +++ b/fs/ext2/file.c
> @@ -118,10 +118,11 @@ static const struct vm_operations_struct ext2_dax_vm_ops = {
> .pfn_mkwrite = ext2_dax_fault,
> };
>
> -static int ext2_file_mmap(struct file *file, struct vm_area_struct *vma)
> +static int ext2_file_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> if (!IS_DAX(file_inode(file)))
> - return generic_file_mmap(file, vma);
> + return generic_file_mmap(file, vma, map_flags);
>
> file_accessed(file);
> vma->vm_ops = &ext2_dax_vm_ops;
> diff --git a/fs/ext4/file.c b/fs/ext4/file.c
> index 57dcaea762c3..362a1e5a8687 100644
> --- a/fs/ext4/file.c
> +++ b/fs/ext4/file.c
> @@ -340,7 +340,8 @@ static const struct vm_operations_struct ext4_file_vm_ops = {
> .page_mkwrite = ext4_page_mkwrite,
> };
>
> -static int ext4_file_mmap(struct file *file, struct vm_area_struct *vma)
> +static int ext4_file_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct inode *inode = file->f_mapping->host;
>
> diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c
> index 843a0d99f7ea..9233437b6e81 100644
> --- a/fs/f2fs/file.c
> +++ b/fs/f2fs/file.c
> @@ -425,7 +425,8 @@ static loff_t f2fs_llseek(struct file *file, loff_t offset, int whence)
> return -EINVAL;
> }
>
> -static int f2fs_file_mmap(struct file *file, struct vm_area_struct *vma)
> +static int f2fs_file_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct inode *inode = file_inode(file);
> int err;
> diff --git a/fs/fuse/file.c b/fs/fuse/file.c
> index d66789804287..38f3cea418b0 100644
> --- a/fs/fuse/file.c
> +++ b/fs/fuse/file.c
> @@ -2063,7 +2063,8 @@ static const struct vm_operations_struct fuse_file_vm_ops = {
> .page_mkwrite = fuse_page_mkwrite,
> };
>
> -static int fuse_file_mmap(struct file *file, struct vm_area_struct *vma)
> +static int fuse_file_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> if ((vma->vm_flags & VM_SHARED) && (vma->vm_flags & VM_MAYWRITE))
> fuse_link_write_file(file);
> @@ -2073,7 +2074,8 @@ static int fuse_file_mmap(struct file *file, struct vm_area_struct *vma)
> return 0;
> }
>
> -static int fuse_direct_mmap(struct file *file, struct vm_area_struct *vma)
> +static int fuse_direct_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> /* Can't provide the coherency needed for MAP_SHARED */
> if (vma->vm_flags & VM_MAYSHARE)
> @@ -2081,7 +2083,7 @@ static int fuse_direct_mmap(struct file *file, struct vm_area_struct *vma)
>
> invalidate_inode_pages2(file->f_mapping);
>
> - return generic_file_mmap(file, vma);
> + return generic_file_mmap(file, vma, map_flags);
> }
>
> static int convert_fuse_file_lock(struct fuse_conn *fc,
> diff --git a/fs/gfs2/file.c b/fs/gfs2/file.c
> index 33a0cb5701a3..8bee89124bcf 100644
> --- a/fs/gfs2/file.c
> +++ b/fs/gfs2/file.c
> @@ -506,7 +506,8 @@ static const struct vm_operations_struct gfs2_vm_ops = {
> * Returns: 0
> */
>
> -static int gfs2_mmap(struct file *file, struct vm_area_struct *vma)
> +static int gfs2_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct gfs2_inode *ip = GFS2_I(file->f_mapping->host);
>
> diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c
> index 7c02b3f738e1..5261b67e7343 100644
> --- a/fs/hugetlbfs/inode.c
> +++ b/fs/hugetlbfs/inode.c
> @@ -118,7 +118,8 @@ static void huge_pagevec_release(struct pagevec *pvec)
> pagevec_reinit(pvec);
> }
>
> -static int hugetlbfs_file_mmap(struct file *file, struct vm_area_struct *vma)
> +static int hugetlbfs_file_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct inode *inode = file_inode(file);
> loff_t len, vma_len;
> diff --git a/fs/kernfs/file.c b/fs/kernfs/file.c
> index 9698e51656b1..8a5e5be618b9 100644
> --- a/fs/kernfs/file.c
> +++ b/fs/kernfs/file.c
> @@ -467,7 +467,8 @@ static const struct vm_operations_struct kernfs_vm_ops = {
> #endif
> };
>
> -static int kernfs_fop_mmap(struct file *file, struct vm_area_struct *vma)
> +static int kernfs_fop_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct kernfs_open_file *of = kernfs_of(file);
> const struct kernfs_ops *ops;
> diff --git a/fs/ncpfs/mmap.c b/fs/ncpfs/mmap.c
> index 6719c0be674d..f7f4c64202e7 100644
> --- a/fs/ncpfs/mmap.c
> +++ b/fs/ncpfs/mmap.c
> @@ -100,7 +100,8 @@ static const struct vm_operations_struct ncp_file_mmap =
>
>
> /* This is used for a general mmap of a ncp file */
> -int ncp_mmap(struct file *file, struct vm_area_struct *vma)
> +int ncp_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct inode *inode = file_inode(file);
>
> diff --git a/fs/ncpfs/ncp_fs.h b/fs/ncpfs/ncp_fs.h
> index b9f69e1b1f43..c3a1da959ee3 100644
> --- a/fs/ncpfs/ncp_fs.h
> +++ b/fs/ncpfs/ncp_fs.h
> @@ -92,7 +92,7 @@ extern const struct file_operations ncp_file_operations;
> int ncp_make_open(struct inode *, int);
>
> /* linux/fs/ncpfs/mmap.c */
> -int ncp_mmap(struct file *, struct vm_area_struct *);
> +int ncp_mmap(struct file *, struct vm_area_struct *, unsigned long);
>
> /* linux/fs/ncpfs/ncplib_kernel.c */
> int ncp_make_closed(struct inode *);
> diff --git a/fs/nfs/file.c b/fs/nfs/file.c
> index af330c31f627..b476a3872e99 100644
> --- a/fs/nfs/file.c
> +++ b/fs/nfs/file.c
> @@ -176,7 +176,8 @@ nfs_file_read(struct kiocb *iocb, struct iov_iter *to)
> EXPORT_SYMBOL_GPL(nfs_file_read);
>
> int
> -nfs_file_mmap(struct file * file, struct vm_area_struct * vma)
> +nfs_file_mmap(struct file * file, struct vm_area_struct * vma,
> + unsigned long map_flags)
> {
> struct inode *inode = file_inode(file);
> int status;
> @@ -186,7 +187,7 @@ nfs_file_mmap(struct file * file, struct vm_area_struct * vma)
> /* Note: generic_file_mmap() returns ENOSYS on nommu systems
> * so we call that before revalidating the mapping
> */
> - status = generic_file_mmap(file, vma);
> + status = generic_file_mmap(file, vma, map_flags);
> if (!status) {
> vma->vm_ops = &nfs_file_vm_ops;
> status = nfs_revalidate_mapping(inode, file->f_mapping);
> diff --git a/fs/nfs/internal.h b/fs/nfs/internal.h
> index dc456416d2be..8b913079684d 100644
> --- a/fs/nfs/internal.h
> +++ b/fs/nfs/internal.h
> @@ -370,7 +370,7 @@ int nfs_rename(struct inode *, struct dentry *,
> int nfs_file_fsync(struct file *file, loff_t start, loff_t end, int datasync);
> loff_t nfs_file_llseek(struct file *, loff_t, int);
> ssize_t nfs_file_read(struct kiocb *, struct iov_iter *);
> -int nfs_file_mmap(struct file *, struct vm_area_struct *);
> +int nfs_file_mmap(struct file *, struct vm_area_struct *, unsigned long);
> ssize_t nfs_file_write(struct kiocb *, struct iov_iter *);
> int nfs_file_release(struct inode *, struct file *);
> int nfs_lock(struct file *, int, struct file_lock *);
> diff --git a/fs/nilfs2/file.c b/fs/nilfs2/file.c
> index c5fa3dee72fc..71c5a24d78ce 100644
> --- a/fs/nilfs2/file.c
> +++ b/fs/nilfs2/file.c
> @@ -126,7 +126,8 @@ static const struct vm_operations_struct nilfs_file_vm_ops = {
> .page_mkwrite = nilfs_page_mkwrite,
> };
>
> -static int nilfs_file_mmap(struct file *file, struct vm_area_struct *vma)
> +static int nilfs_file_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> file_accessed(file);
> vma->vm_ops = &nilfs_file_vm_ops;
> diff --git a/fs/ocfs2/mmap.c b/fs/ocfs2/mmap.c
> index 098f5c712569..4061b83fe7a8 100644
> --- a/fs/ocfs2/mmap.c
> +++ b/fs/ocfs2/mmap.c
> @@ -179,7 +179,8 @@ static const struct vm_operations_struct ocfs2_file_vm_ops = {
> .page_mkwrite = ocfs2_page_mkwrite,
> };
>
> -int ocfs2_mmap(struct file *file, struct vm_area_struct *vma)
> +int ocfs2_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> int ret = 0, lock_level = 0;
>
> diff --git a/fs/ocfs2/mmap.h b/fs/ocfs2/mmap.h
> index 1274ee0f1fe2..8ef3830197d3 100644
> --- a/fs/ocfs2/mmap.h
> +++ b/fs/ocfs2/mmap.h
> @@ -1,6 +1,7 @@
> #ifndef OCFS2_MMAP_H
> #define OCFS2_MMAP_H
>
> -int ocfs2_mmap(struct file *file, struct vm_area_struct *vma);
> +int ocfs2_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags);
>
> #endif /* OCFS2_MMAP_H */
> diff --git a/fs/orangefs/file.c b/fs/orangefs/file.c
> index 28f38d813ad2..4e69319baf15 100644
> --- a/fs/orangefs/file.c
> +++ b/fs/orangefs/file.c
> @@ -584,7 +584,8 @@ static long orangefs_ioctl(struct file *file, unsigned int cmd, unsigned long ar
> /*
> * Memory map a region of a file.
> */
> -static int orangefs_file_mmap(struct file *file, struct vm_area_struct *vma)
> +static int orangefs_file_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> gossip_debug(GOSSIP_FILE_DEBUG,
> "orangefs_file_mmap: called on %s\n",
> @@ -597,7 +598,7 @@ static int orangefs_file_mmap(struct file *file, struct vm_area_struct *vma)
> vma->vm_flags &= ~VM_RAND_READ;
>
> /* Use readonly mmap since we cannot support writable maps. */
> - return generic_file_readonly_mmap(file, vma);
> + return generic_file_readonly_mmap(file, vma, map_flags);
> }
>
> #define mapping_nrpages(idata) ((idata)->nrpages)
> diff --git a/fs/proc/inode.c b/fs/proc/inode.c
> index e250910cffc8..4b7d31616985 100644
> --- a/fs/proc/inode.c
> +++ b/fs/proc/inode.c
> @@ -277,15 +277,16 @@ static long proc_reg_compat_ioctl(struct file *file, unsigned int cmd, unsigned
> }
> #endif
>
> -static int proc_reg_mmap(struct file *file, struct vm_area_struct *vma)
> +static int proc_reg_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct proc_dir_entry *pde = PDE(file_inode(file));
> int rv = -EIO;
> - int (*mmap)(struct file *, struct vm_area_struct *);
> + int (*mmap)(struct file *, struct vm_area_struct *, unsigned long);
> if (use_pde(pde)) {
> mmap = pde->proc_fops->mmap;
> if (mmap)
> - rv = mmap(file, vma);
> + rv = mmap(file, vma, map_flags);
> unuse_pde(pde);
> }
> return rv;
> diff --git a/fs/proc/vmcore.c b/fs/proc/vmcore.c
> index 885d445afa0d..36463814ffc1 100644
> --- a/fs/proc/vmcore.c
> +++ b/fs/proc/vmcore.c
> @@ -406,7 +406,8 @@ static int vmcore_remap_oldmem_pfn(struct vm_area_struct *vma,
> return remap_oldmem_pfn_range(vma, from, pfn, size, prot);
> }
>
> -static int mmap_vmcore(struct file *file, struct vm_area_struct *vma)
> +static int mmap_vmcore(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> size_t size = vma->vm_end - vma->vm_start;
> u64 start, end, len, tsz;
> @@ -485,7 +486,8 @@ static int mmap_vmcore(struct file *file, struct vm_area_struct *vma)
> return -EAGAIN;
> }
> #else
> -static int mmap_vmcore(struct file *file, struct vm_area_struct *vma)
> +static int mmap_vmcore(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> return -ENOSYS;
> }
> diff --git a/fs/ramfs/file-nommu.c b/fs/ramfs/file-nommu.c
> index 3ac1f2387083..0c584bdb71b8 100644
> --- a/fs/ramfs/file-nommu.c
> +++ b/fs/ramfs/file-nommu.c
> @@ -32,7 +32,8 @@ static unsigned long ramfs_nommu_get_unmapped_area(struct file *file,
> unsigned long len,
> unsigned long pgoff,
> unsigned long flags);
> -static int ramfs_nommu_mmap(struct file *file, struct vm_area_struct *vma);
> +static int ramfs_nommu_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags);
>
> static unsigned ramfs_mmap_capabilities(struct file *file)
> {
> @@ -257,7 +258,8 @@ static unsigned long ramfs_nommu_get_unmapped_area(struct file *file,
> /*
> * set up a mapping for shared memory segments
> */
> -static int ramfs_nommu_mmap(struct file *file, struct vm_area_struct *vma)
> +static int ramfs_nommu_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> if (!(vma->vm_flags & (VM_SHARED | VM_MAYSHARE)))
> return -ENOSYS;
> diff --git a/fs/romfs/mmap-nommu.c b/fs/romfs/mmap-nommu.c
> index 1118a0dc6b45..60a893b5e864 100644
> --- a/fs/romfs/mmap-nommu.c
> +++ b/fs/romfs/mmap-nommu.c
> @@ -65,7 +65,8 @@ static unsigned long romfs_get_unmapped_area(struct file *file,
> * permit a R/O mapping to be made directly through onto an MTD device if
> * possible
> */
> -static int romfs_mmap(struct file *file, struct vm_area_struct *vma)
> +static int romfs_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> return vma->vm_flags & (VM_SHARED | VM_MAYSHARE) ? 0 : -ENOSYS;
> }
> diff --git a/fs/ubifs/file.c b/fs/ubifs/file.c
> index f90a466ea5db..5850e2d534b9 100644
> --- a/fs/ubifs/file.c
> +++ b/fs/ubifs/file.c
> @@ -1612,11 +1612,12 @@ static const struct vm_operations_struct ubifs_file_vm_ops = {
> .page_mkwrite = ubifs_vm_page_mkwrite,
> };
>
> -static int ubifs_file_mmap(struct file *file, struct vm_area_struct *vma)
> +static int ubifs_file_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> int err;
>
> - err = generic_file_mmap(file, vma);
> + err = generic_file_mmap(file, vma, map_flags);
> if (err)
> return err;
> vma->vm_ops = &ubifs_file_vm_ops;
> diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c
> index ec3e44fcf771..34bca28655c3 100644
> --- a/fs/xfs/xfs_file.c
> +++ b/fs/xfs/xfs_file.c
> @@ -1119,7 +1119,7 @@ static const struct vm_operations_struct xfs_file_vm_ops = {
> STATIC int
> xfs_file_mmap(
> struct file *filp,
> - struct vm_area_struct *vma)
> + struct vm_area_struct *vma, unsigned long map_flags)
> {
> file_accessed(filp);
> vma->vm_ops = &xfs_file_vm_ops;
> diff --git a/include/drm/drm_drv.h b/include/drm/drm_drv.h
> index 71bbaaec836d..291244d5573e 100644
> --- a/include/drm/drm_drv.h
> +++ b/include/drm/drm_drv.h
> @@ -478,7 +478,8 @@ struct drm_driver {
> void *(*gem_prime_vmap)(struct drm_gem_object *obj);
> void (*gem_prime_vunmap)(struct drm_gem_object *obj, void *vaddr);
> int (*gem_prime_mmap)(struct drm_gem_object *obj,
> - struct vm_area_struct *vma);
> + struct vm_area_struct *vma,
> + unsigned long map_flags);
>
> /**
> * @dumb_create:
> diff --git a/include/drm/drm_gem.h b/include/drm/drm_gem.h
> index 9c55c2acaa2b..30d201b7d906 100644
> --- a/include/drm/drm_gem.h
> +++ b/include/drm/drm_gem.h
> @@ -199,7 +199,8 @@ void drm_gem_vm_open(struct vm_area_struct *vma);
> void drm_gem_vm_close(struct vm_area_struct *vma);
> int drm_gem_mmap_obj(struct drm_gem_object *obj, unsigned long obj_size,
> struct vm_area_struct *vma);
> -int drm_gem_mmap(struct file *filp, struct vm_area_struct *vma);
> +int drm_gem_mmap(struct file *filp, struct vm_area_struct *vma,
> + unsigned long map_flags);
>
> /**
> * drm_gem_object_get - acquire a GEM buffer object reference
> diff --git a/include/drm/drm_gem_cma_helper.h b/include/drm/drm_gem_cma_helper.h
> index 58a739bf15f1..08fb30b12d58 100644
> --- a/include/drm/drm_gem_cma_helper.h
> +++ b/include/drm/drm_gem_cma_helper.h
> @@ -74,7 +74,8 @@ int drm_gem_cma_dumb_create(struct drm_file *file_priv,
> struct drm_mode_create_dumb *args);
>
> /* set vm_flags and we can change the VM attribute to other one at here */
> -int drm_gem_cma_mmap(struct file *filp, struct vm_area_struct *vma);
> +int drm_gem_cma_mmap(struct file *filp, struct vm_area_struct *vma,
> + unsigned long map_flags);
>
> /* allocate physical memory */
> struct drm_gem_cma_object *drm_gem_cma_create(struct drm_device *drm,
> @@ -100,7 +101,8 @@ drm_gem_cma_prime_import_sg_table(struct drm_device *dev,
> struct dma_buf_attachment *attach,
> struct sg_table *sgt);
> int drm_gem_cma_prime_mmap(struct drm_gem_object *obj,
> - struct vm_area_struct *vma);
> + struct vm_area_struct *vma,
> + unsigned long map_flags);
> void *drm_gem_cma_prime_vmap(struct drm_gem_object *obj);
> void drm_gem_cma_prime_vunmap(struct drm_gem_object *obj, void *vaddr);
>
> diff --git a/include/drm/drm_legacy.h b/include/drm/drm_legacy.h
> index cf0e7d89bcdf..889510d3b9b8 100644
> --- a/include/drm/drm_legacy.h
> +++ b/include/drm/drm_legacy.h
> @@ -161,7 +161,8 @@ int drm_legacy_rmmap_locked(struct drm_device *d, struct drm_local_map *map);
> void drm_legacy_master_rmmaps(struct drm_device *dev,
> struct drm_master *master);
> struct drm_local_map *drm_legacy_getsarea(struct drm_device *dev);
> -int drm_legacy_mmap(struct file *filp, struct vm_area_struct *vma);
> +int drm_legacy_mmap(struct file *filp, struct vm_area_struct *vma,
> + unsigned long map_flags);
>
> int drm_legacy_addbufs_agp(struct drm_device *d, struct drm_buf_desc *req);
> int drm_legacy_addbufs_pci(struct drm_device *d, struct drm_buf_desc *req);
> diff --git a/include/linux/dma-buf.h b/include/linux/dma-buf.h
> index 79f27d60ec66..8f5be4af87f8 100644
> --- a/include/linux/dma-buf.h
> +++ b/include/linux/dma-buf.h
> @@ -246,7 +246,8 @@ struct dma_buf_ops {
> *
> * 0 on success or a negative error code on failure.
> */
> - int (*mmap)(struct dma_buf *, struct vm_area_struct *vma);
> + int (*mmap)(struct dma_buf *, struct vm_area_struct *vma,
> + unsigned long map_flags);
>
> void *(*vmap)(struct dma_buf *);
> void (*vunmap)(struct dma_buf *, void *vaddr);
> @@ -401,7 +402,7 @@ void *dma_buf_kmap(struct dma_buf *, unsigned long);
> void dma_buf_kunmap(struct dma_buf *, unsigned long, void *);
>
> int dma_buf_mmap(struct dma_buf *, struct vm_area_struct *,
> - unsigned long);
> + unsigned long, unsigned long);
> void *dma_buf_vmap(struct dma_buf *);
> void dma_buf_vunmap(struct dma_buf *, void *vaddr);
> #endif /* __DMA_BUF_H__ */
> diff --git a/include/linux/fb.h b/include/linux/fb.h
> index a964d076b4dc..4b21f369f291 100644
> --- a/include/linux/fb.h
> +++ b/include/linux/fb.h
> @@ -308,7 +308,8 @@ struct fb_ops {
> unsigned long arg);
>
> /* perform fb specific mmap */
> - int (*fb_mmap)(struct fb_info *info, struct vm_area_struct *vma);
> + int (*fb_mmap)(struct fb_info *info, struct vm_area_struct *vma,
> + unsigned long map_flags);
>
> /* get capability given var */
> void (*fb_get_caps)(struct fb_info *info, struct fb_blit_caps *caps,
> @@ -673,7 +674,8 @@ static inline void __fb_pad_aligned_buffer(u8 *dst, u32 d_pitch,
> }
>
> /* drivers/video/fb_defio.c */
> -int fb_deferred_io_mmap(struct fb_info *info, struct vm_area_struct *vma);
> +int fb_deferred_io_mmap(struct fb_info *info, struct vm_area_struct *vma,
> + unsigned long map_flags);
> extern void fb_deferred_io_init(struct fb_info *info);
> extern void fb_deferred_io_open(struct fb_info *info,
> struct inode *inode,
> diff --git a/include/linux/fs.h b/include/linux/fs.h
> index 7d6079dceb39..2a4d8016bbf7 100644
> --- a/include/linux/fs.h
> +++ b/include/linux/fs.h
> @@ -1673,7 +1673,7 @@ struct file_operations {
> unsigned int (*poll) (struct file *, struct poll_table_struct *);
> long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);
> long (*compat_ioctl) (struct file *, unsigned int, unsigned long);
> - int (*mmap) (struct file *, struct vm_area_struct *);
> + int (*mmap) (struct file *, struct vm_area_struct *, unsigned long);
> int (*open) (struct inode *, struct file *);
> int (*flush) (struct file *, fl_owner_t id);
> int (*release) (struct inode *, struct file *);
> @@ -1743,9 +1743,10 @@ static inline ssize_t call_write_iter(struct file *file, struct kiocb *kio,
> return file->f_op->write_iter(kio, iter);
> }
>
> -static inline int call_mmap(struct file *file, struct vm_area_struct *vma)
> +static inline int call_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> - return file->f_op->mmap(file, vma);
> + return file->f_op->mmap(file, vma, map_flags);
> }
>
> ssize_t rw_copy_check_uvector(int type, const struct iovec __user * uvector,
> @@ -2881,8 +2882,10 @@ extern int set_blocksize(struct block_device *, int);
> extern int sb_set_blocksize(struct super_block *, int);
> extern int sb_min_blocksize(struct super_block *, int);
>
> -extern int generic_file_mmap(struct file *, struct vm_area_struct *);
> -extern int generic_file_readonly_mmap(struct file *, struct vm_area_struct *);
> +extern int generic_file_mmap(struct file *, struct vm_area_struct *,
> + unsigned long);
> +extern int generic_file_readonly_mmap(struct file *, struct vm_area_struct *,
> + unsigned long);
> extern ssize_t generic_write_checks(struct kiocb *, struct iov_iter *);
> extern ssize_t generic_file_read_iter(struct kiocb *, struct iov_iter *);
> extern ssize_t __generic_file_write_iter(struct kiocb *, struct iov_iter *);
> diff --git a/include/linux/mm.h b/include/linux/mm.h
> index 39db8e54c5d5..c0a38d2275ca 100644
> --- a/include/linux/mm.h
> +++ b/include/linux/mm.h
> @@ -2095,7 +2095,7 @@ extern unsigned long get_unmapped_area(struct file *, unsigned long, unsigned lo
>
> extern unsigned long mmap_region(struct file *file, unsigned long addr,
> unsigned long len, vm_flags_t vm_flags, unsigned long pgoff,
> - struct list_head *uf);
> + struct list_head *uf, unsigned long map_flags);
> extern unsigned long do_mmap(struct file *file, unsigned long addr,
> unsigned long len, unsigned long prot, unsigned long flags,
> vm_flags_t vm_flags, unsigned long pgoff, unsigned long *populate,
> diff --git a/include/media/v4l2-dev.h b/include/media/v4l2-dev.h
> index e657614521e3..498f9dd51337 100644
> --- a/include/media/v4l2-dev.h
> +++ b/include/media/v4l2-dev.h
> @@ -158,7 +158,7 @@ struct v4l2_file_operations {
> #endif
> unsigned long (*get_unmapped_area) (struct file *, unsigned long,
> unsigned long, unsigned long, unsigned long);
> - int (*mmap) (struct file *, struct vm_area_struct *);
> + int (*mmap) (struct file *, struct vm_area_struct *, unsigned long);
> int (*open) (struct file *);
> int (*release) (struct file *);
> };
> diff --git a/include/media/v4l2-mem2mem.h b/include/media/v4l2-mem2mem.h
> index e157d5c9b224..87777f3b59c8 100644
> --- a/include/media/v4l2-mem2mem.h
> +++ b/include/media/v4l2-mem2mem.h
> @@ -600,7 +600,8 @@ int v4l2_m2m_ioctl_streamon(struct file *file, void *fh,
> enum v4l2_buf_type type);
> int v4l2_m2m_ioctl_streamoff(struct file *file, void *fh,
> enum v4l2_buf_type type);
> -int v4l2_m2m_fop_mmap(struct file *file, struct vm_area_struct *vma);
> +int v4l2_m2m_fop_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags);
> unsigned int v4l2_m2m_fop_poll(struct file *file, poll_table *wait);
>
> #endif /* _MEDIA_V4L2_MEM2MEM_H */
> diff --git a/include/media/videobuf2-v4l2.h b/include/media/videobuf2-v4l2.h
> index 036127c54bbf..55ee04a99bd5 100644
> --- a/include/media/videobuf2-v4l2.h
> +++ b/include/media/videobuf2-v4l2.h
> @@ -255,7 +255,8 @@ int vb2_ioctl_expbuf(struct file *file, void *priv,
>
> /* struct v4l2_file_operations helpers */
>
> -int vb2_fop_mmap(struct file *file, struct vm_area_struct *vma);
> +int vb2_fop_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags);
> int vb2_fop_release(struct file *file);
> int _vb2_fop_release(struct file *file, struct mutex *lock);
> ssize_t vb2_fop_write(struct file *file, const char __user *buf,
> diff --git a/include/misc/cxl.h b/include/misc/cxl.h
> index 480d50a0b8ba..2c356a8126ec 100644
> --- a/include/misc/cxl.h
> +++ b/include/misc/cxl.h
> @@ -266,7 +266,8 @@ int cxl_start_work(struct cxl_context *ctx,
> int cxl_fd_open(struct inode *inode, struct file *file);
> int cxl_fd_release(struct inode *inode, struct file *file);
> long cxl_fd_ioctl(struct file *file, unsigned int cmd, unsigned long arg);
> -int cxl_fd_mmap(struct file *file, struct vm_area_struct *vm);
> +int cxl_fd_mmap(struct file *file, struct vm_area_struct *vm,
> + unsigned long map_flags);
> unsigned int cxl_fd_poll(struct file *file, struct poll_table_struct *poll);
> ssize_t cxl_fd_read(struct file *file, char __user *buf, size_t count,
> loff_t *off);
> diff --git a/ipc/shm.c b/ipc/shm.c
> index 8828b4c3a190..96a82d0d00b0 100644
> --- a/ipc/shm.c
> +++ b/ipc/shm.c
> @@ -411,7 +411,8 @@ static struct mempolicy *shm_get_policy(struct vm_area_struct *vma,
> }
> #endif
>
> -static int shm_mmap(struct file *file, struct vm_area_struct *vma)
> +static int shm_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct shm_file_data *sfd = shm_file_data(file);
> int ret;
> @@ -424,7 +425,7 @@ static int shm_mmap(struct file *file, struct vm_area_struct *vma)
> if (ret)
> return ret;
>
> - ret = call_mmap(sfd->file, vma);
> + ret = call_mmap(sfd->file, vma, map_flags);
> if (ret) {
> shm_close(vma);
> return ret;
> diff --git a/kernel/events/core.c b/kernel/events/core.c
> index 3e691b75b2db..3c2b555e302f 100644
> --- a/kernel/events/core.c
> +++ b/kernel/events/core.c
> @@ -5255,7 +5255,8 @@ static const struct vm_operations_struct perf_mmap_vmops = {
> .page_mkwrite = perf_mmap_fault,
> };
>
> -static int perf_mmap(struct file *file, struct vm_area_struct *vma)
> +static int perf_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct perf_event *event = file->private_data;
> unsigned long user_locked, user_lock_limit;
> diff --git a/kernel/kcov.c b/kernel/kcov.c
> index cd771993f96f..453c484ac00a 100644
> --- a/kernel/kcov.c
> +++ b/kernel/kcov.c
> @@ -132,7 +132,8 @@ void kcov_task_exit(struct task_struct *t)
> kcov_put(kcov);
> }
>
> -static int kcov_mmap(struct file *filep, struct vm_area_struct *vma)
> +static int kcov_mmap(struct file *filep, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> int res = 0;
> void *area;
> diff --git a/kernel/relay.c b/kernel/relay.c
> index 39a9dfc69486..58dee7ee8dbb 100644
> --- a/kernel/relay.c
> +++ b/kernel/relay.c
> @@ -906,7 +906,8 @@ static int relay_file_open(struct inode *inode, struct file *filp)
> *
> * Calls upon relay_mmap_buf() to map the file into user space.
> */
> -static int relay_file_mmap(struct file *filp, struct vm_area_struct *vma)
> +static int relay_file_mmap(struct file *filp, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct rchan_buf *buf = filp->private_data;
> return relay_mmap_buf(buf, vma);
> diff --git a/mm/filemap.c b/mm/filemap.c
> index 9d21afd692b9..f1fb5a7ccdfb 100644
> --- a/mm/filemap.c
> +++ b/mm/filemap.c
> @@ -2580,7 +2580,8 @@ const struct vm_operations_struct generic_file_vm_ops = {
>
> /* This is used for a general mmap of a disk file */
>
> -int generic_file_mmap(struct file * file, struct vm_area_struct * vma)
> +int generic_file_mmap(struct file * file, struct vm_area_struct * vma,
> + unsigned long map_flags)
> {
> struct address_space *mapping = file->f_mapping;
>
> @@ -2594,18 +2595,22 @@ int generic_file_mmap(struct file * file, struct vm_area_struct * vma)
> /*
> * This is for filesystems which do not implement ->writepage.
> */
> -int generic_file_readonly_mmap(struct file *file, struct vm_area_struct *vma)
> +int generic_file_readonly_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> if ((vma->vm_flags & VM_SHARED) && (vma->vm_flags & VM_MAYWRITE))
> return -EINVAL;
> - return generic_file_mmap(file, vma);
> + return generic_file_mmap(file, vma, map_flags);
> }
> #else
> -int generic_file_mmap(struct file * file, struct vm_area_struct * vma)
> +int generic_file_mmap(struct file * file, struct vm_area_struct * vma,
> + unsigned long map_flags)
> {
> return -ENOSYS;
> }
> -int generic_file_readonly_mmap(struct file * file, struct vm_area_struct * vma)
> +int generic_file_readonly_mmap(struct file * file,
> + struct vm_area_struct * vma,
> + unsigned long map_flags)
> {
> return -ENOSYS;
> }
> diff --git a/mm/mmap.c b/mm/mmap.c
> index 4c5981651407..77d5aecf49dc 100644
> --- a/mm/mmap.c
> +++ b/mm/mmap.c
> @@ -1465,7 +1465,7 @@ unsigned long do_mmap(struct file *file, unsigned long addr,
> vm_flags |= VM_NORESERVE;
> }
>
> - addr = mmap_region(file, addr, len, vm_flags, pgoff, uf);
> + addr = mmap_region(file, addr, len, vm_flags, pgoff, uf, 0);
> if (!IS_ERR_VALUE(addr) &&
> ((vm_flags & VM_LOCKED) ||
> (flags & (MAP_POPULATE | MAP_NONBLOCK)) == MAP_POPULATE))
> @@ -1602,7 +1602,7 @@ static inline int accountable_mapping(struct file *file, vm_flags_t vm_flags)
>
> unsigned long mmap_region(struct file *file, unsigned long addr,
> unsigned long len, vm_flags_t vm_flags, unsigned long pgoff,
> - struct list_head *uf)
> + struct list_head *uf, unsigned long map_flags)
> {
> struct mm_struct *mm = current->mm;
> struct vm_area_struct *vma, *prev;
> @@ -1687,7 +1687,7 @@ unsigned long mmap_region(struct file *file, unsigned long addr,
> * new file must not have been exposed to user-space, yet.
> */
> vma->vm_file = get_file(file);
> - error = call_mmap(file, vma);
> + error = call_mmap(file, vma, map_flags);
> if (error)
> goto unmap_and_free_vma;
>
> diff --git a/mm/nommu.c b/mm/nommu.c
> index 53d5175a5c14..2392aa3f11f2 100644
> --- a/mm/nommu.c
> +++ b/mm/nommu.c
> @@ -1089,7 +1089,7 @@ static int do_mmap_shared_file(struct vm_area_struct *vma)
> {
> int ret;
>
> - ret = call_mmap(vma->vm_file, vma);
> + ret = call_mmap(vma->vm_file, vma, map_flags);
> if (ret == 0) {
> vma->vm_region->vm_top = vma->vm_region->vm_end;
> return 0;
> @@ -1120,7 +1120,7 @@ static int do_mmap_private(struct vm_area_struct *vma,
> * - VM_MAYSHARE will be set if it may attempt to share
> */
> if (capabilities & NOMMU_MAP_DIRECT) {
> - ret = call_mmap(vma->vm_file, vma);
> + ret = call_mmap(vma->vm_file, vma, map_flags);
> if (ret == 0) {
> /* shouldn't return success if we're not sharing */
> BUG_ON(!(vma->vm_flags & VM_MAYSHARE));
> diff --git a/mm/shmem.c b/mm/shmem.c
> index ace53a582be5..d40318dd26b3 100644
> --- a/mm/shmem.c
> +++ b/mm/shmem.c
> @@ -2132,7 +2132,8 @@ int shmem_lock(struct file *file, int lock, struct user_struct *user)
> return retval;
> }
>
> -static int shmem_mmap(struct file *file, struct vm_area_struct *vma)
> +static int shmem_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> file_accessed(file);
> vma->vm_ops = &shmem_vm_ops;
> diff --git a/net/socket.c b/net/socket.c
> index c729625eb5d3..6258fcf61891 100644
> --- a/net/socket.c
> +++ b/net/socket.c
> @@ -115,7 +115,8 @@ unsigned int sysctl_net_busy_poll __read_mostly;
>
> static ssize_t sock_read_iter(struct kiocb *iocb, struct iov_iter *to);
> static ssize_t sock_write_iter(struct kiocb *iocb, struct iov_iter *from);
> -static int sock_mmap(struct file *file, struct vm_area_struct *vma);
> +static int sock_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags);
>
> static int sock_close(struct inode *inode, struct file *file);
> static unsigned int sock_poll(struct file *file,
> @@ -1114,7 +1115,8 @@ static unsigned int sock_poll(struct file *file, poll_table *wait)
> return busy_flag | sock->ops->poll(file, sock, wait);
> }
>
> -static int sock_mmap(struct file *file, struct vm_area_struct *vma)
> +static int sock_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct socket *sock = file->private_data;
>
> diff --git a/security/selinux/selinuxfs.c b/security/selinux/selinuxfs.c
> index 00eed842c491..802c801a38dd 100644
> --- a/security/selinux/selinuxfs.c
> +++ b/security/selinux/selinuxfs.c
> @@ -215,7 +215,8 @@ static ssize_t sel_read_handle_status(struct file *filp, char __user *buf,
> }
>
> static int sel_mmap_handle_status(struct file *filp,
> - struct vm_area_struct *vma)
> + struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct page *status = filp->private_data;
> unsigned long size = vma->vm_end - vma->vm_start;
> @@ -444,7 +445,8 @@ static const struct vm_operations_struct sel_mmap_policy_ops = {
> .page_mkwrite = sel_mmap_policy_fault,
> };
>
> -static int sel_mmap_policy(struct file *filp, struct vm_area_struct *vma)
> +static int sel_mmap_policy(struct file *filp, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> if (vma->vm_flags & VM_SHARED) {
> /* do not allow mprotect to make mapping writable */
> diff --git a/sound/core/compress_offload.c b/sound/core/compress_offload.c
> index fec1dfdb14ad..884cefaf906e 100644
> --- a/sound/core/compress_offload.c
> +++ b/sound/core/compress_offload.c
> @@ -391,7 +391,8 @@ static ssize_t snd_compr_read(struct file *f, char __user *buf,
> return retval;
> }
>
> -static int snd_compr_mmap(struct file *f, struct vm_area_struct *vma)
> +static int snd_compr_mmap(struct file *f, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> return -ENXIO;
> }
> diff --git a/sound/core/hwdep.c b/sound/core/hwdep.c
> index a73baa1242be..ecff4054196a 100644
> --- a/sound/core/hwdep.c
> +++ b/sound/core/hwdep.c
> @@ -260,7 +260,8 @@ static long snd_hwdep_ioctl(struct file * file, unsigned int cmd,
> return -ENOTTY;
> }
>
> -static int snd_hwdep_mmap(struct file * file, struct vm_area_struct * vma)
> +static int snd_hwdep_mmap(struct file * file, struct vm_area_struct * vma,
> + unsigned long map_flags)
> {
> struct snd_hwdep *hw = file->private_data;
> if (hw->ops.mmap)
> diff --git a/sound/core/info.c b/sound/core/info.c
> index bcf6a48cc70d..6551d90aac2c 100644
> --- a/sound/core/info.c
> +++ b/sound/core/info.c
> @@ -232,7 +232,8 @@ static long snd_info_entry_ioctl(struct file *file, unsigned int cmd,
> file, cmd, arg);
> }
>
> -static int snd_info_entry_mmap(struct file *file, struct vm_area_struct *vma)
> +static int snd_info_entry_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> struct inode *inode = file_inode(file);
> struct snd_info_private_data *data;
> diff --git a/sound/core/init.c b/sound/core/init.c
> index 32ebe2f6bc59..e0bd35af9f8a 100644
> --- a/sound/core/init.c
> +++ b/sound/core/init.c
> @@ -354,7 +354,8 @@ static long snd_disconnect_ioctl(struct file *file,
> return -ENODEV;
> }
>
> -static int snd_disconnect_mmap(struct file *file, struct vm_area_struct *vma)
> +static int snd_disconnect_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> return -ENODEV;
> }
> diff --git a/sound/core/oss/pcm_oss.c b/sound/core/oss/pcm_oss.c
> index e49f448ee04f..abcace0d7234 100644
> --- a/sound/core/oss/pcm_oss.c
> +++ b/sound/core/oss/pcm_oss.c
> @@ -2716,7 +2716,8 @@ static unsigned int snd_pcm_oss_poll(struct file *file, poll_table * wait)
> return mask;
> }
>
> -static int snd_pcm_oss_mmap(struct file *file, struct vm_area_struct *area)
> +static int snd_pcm_oss_mmap(struct file *file, struct vm_area_struct *area,
> + unsigned long map_flags)
> {
> struct snd_pcm_oss_file *pcm_oss_file;
> struct snd_pcm_substream *substream = NULL;
> diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c
> index 2fec2feac387..e754e9900415 100644
> --- a/sound/core/pcm_native.c
> +++ b/sound/core/pcm_native.c
> @@ -3498,7 +3498,8 @@ int snd_pcm_mmap_data(struct snd_pcm_substream *substream, struct file *file,
> }
> EXPORT_SYMBOL(snd_pcm_mmap_data);
>
> -static int snd_pcm_mmap(struct file *file, struct vm_area_struct *area)
> +static int snd_pcm_mmap(struct file *file, struct vm_area_struct *area,
> + unsigned long map_flags)
> {
> struct snd_pcm_file * pcm_file;
> struct snd_pcm_substream *substream;
> diff --git a/sound/oss/soundcard.c b/sound/oss/soundcard.c
> index b70c7c8f9c5d..b6e8ba2ec452 100644
> --- a/sound/oss/soundcard.c
> +++ b/sound/oss/soundcard.c
> @@ -420,7 +420,8 @@ static unsigned int sound_poll(struct file *file, poll_table * wait)
> return 0;
> }
>
> -static int sound_mmap(struct file *file, struct vm_area_struct *vma)
> +static int sound_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> int dev_class;
> unsigned long size;
> diff --git a/sound/oss/swarm_cs4297a.c b/sound/oss/swarm_cs4297a.c
> index 97899352b15f..4a020d2a53ab 100644
> --- a/sound/oss/swarm_cs4297a.c
> +++ b/sound/oss/swarm_cs4297a.c
> @@ -1962,7 +1962,8 @@ static unsigned int cs4297a_poll(struct file *file,
> }
>
>
> -static int cs4297a_mmap(struct file *file, struct vm_area_struct *vma)
> +static int cs4297a_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> /* XXXKW currently no mmap support */
> return -EINVAL;
> diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
> index 4d81f6ded88e..ab7af0295f2a 100644
> --- a/virt/kvm/kvm_main.c
> +++ b/virt/kvm/kvm_main.c
> @@ -2353,7 +2353,8 @@ static const struct vm_operations_struct kvm_vcpu_vm_ops = {
> .fault = kvm_vcpu_fault,
> };
>
> -static int kvm_vcpu_mmap(struct file *file, struct vm_area_struct *vma)
> +static int kvm_vcpu_mmap(struct file *file, struct vm_area_struct *vma,
> + unsigned long map_flags)
> {
> vma->vm_ops = &kvm_vcpu_vm_ops;
> return 0;
>
--
Jan Kara <jack@xxxxxxxx>
SUSE Labs, CR