linux-media.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [RFC PATCH v8 0/2] mmap: safely enable support for new flags
@ 2017-09-08 19:35 Dan Williams
  2017-09-08 19:35 ` [RFC PATCH v8 1/2] vfs: add flags parameter to all ->mmap() handlers Dan Williams
  0 siblings, 1 reply; 3+ messages in thread
From: Dan Williams @ 2017-09-08 19:35 UTC (permalink / raw)
  To: torvalds
  Cc: Jan Kara, Arnd Bergmann, linux-nvdimm, David Airlie,
	Greg Kroah-Hartman, Takashi Iwai, dri-devel, linux-kernel,
	Mauro Carvalho Chehab, Julia Lawall, linux-mm, Andy Lutomirski,
	linux-api, Daniel Vetter, Andrew Morton, hch, linux-media

Changes since v7 [1]:
* rebase on the mid-merge-window state of the tree to pick up new mmap
  implementations.

* expand the mmap operation handler conversion beyond 'struct
  file_operations' to include, 'struct etnaviv_gem_ops', 'struct
  dma_buf_ops', 'struct drm_driver', 'struct fb_ops', and 'struct
  v4l2_file_operations'

* pass 'map_flags' through to all sub-handlers (Christoph)

* rework the mmap flag validation mechanism to the MAP_SHARED_VALIDATE
  scheme (Linus)

[1]: https://lwn.net/Articles/732886/

---

In order to safely add new mmap flags we want all mmap implementations
to both opt-in to the new flags they support and have the ability to
reject flags on a per-mmap-call basis. An alternative to all the churn
in patch1 is to add a new ->map_flags attribute to 'struct
vma_area_struct', but that bloats the runtime state everywhere for the
few mmap implementations that will care about new flags. Of course, this
also assumes that there are no general objections to the plans to
eventually add MAP_SYNC and/or MAP_DIRECT for DAX mappings [2].

The current request is to merge the final version of patch1 next week,
right before -rc1, i.e. before new ->mmap() handlers start landing in
-next. Given that the drm, media, and sound pull requests are already
merged only some small tweaks are expected from here on out. Patch2 is
included for review, but it can wait and go in with the new MAP_ flags.

Please holler if anything does not look right.

[2]: "Two more approaches to persistent-memory writes"
     https://lwn.net/Articles/731706/

---

Dan Williams (2):
      vfs: add flags parameter to all ->mmap() handlers
      mm: introduce MAP_SHARED_VALIDATE, a mechanism to safely define new mmap flags


 arch/alpha/include/uapi/asm/mman.h                 |    1 
 arch/arc/kernel/arc_hostlink.c                     |    3 +
 arch/mips/include/uapi/asm/mman.h                  |    1 
 arch/mips/kernel/vdso.c                            |    2 -
 arch/parisc/include/uapi/asm/mman.h                |    1 
 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 +
 arch/xtensa/include/uapi/asm/mman.h                |    1 
 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                                 |   14 ++++--
 include/linux/mm.h                                 |    2 -
 include/linux/mman.h                               |   44 ++++++++++++++++++++
 include/media/v4l2-dev.h                           |    2 -
 include/media/v4l2-mem2mem.h                       |    3 +
 include/media/videobuf2-v4l2.h                     |    3 +
 include/misc/cxl.h                                 |    3 +
 include/uapi/asm-generic/mman-common.h             |    1 
 ipc/shm.c                                          |    5 +-
 kernel/events/core.c                               |    3 +
 kernel/kcov.c                                      |    3 +
 kernel/relay.c                                     |    3 +
 mm/filemap.c                                       |   15 +++++--
 mm/mmap.c                                          |   14 +++++-
 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 +
 tools/include/uapi/asm-generic/mman-common.h       |    1 
 virt/kvm/kvm_main.c                                |    3 +
 263 files changed, 720 insertions(+), 374 deletions(-)

^ permalink raw reply	[flat|nested] 3+ messages in thread

* [RFC PATCH v8 1/2] vfs: add flags parameter to all ->mmap() handlers
  2017-09-08 19:35 [RFC PATCH v8 0/2] mmap: safely enable support for new flags Dan Williams
@ 2017-09-08 19:35 ` Dan Williams
  2017-09-11  9:50   ` Jan Kara
  0 siblings, 1 reply; 3+ messages in thread
From: Dan Williams @ 2017-09-08 19:35 UTC (permalink / raw)
  To: torvalds
  Cc: Jan Kara, linux-nvdimm, David Airlie, Greg Kroah-Hartman,
	Takashi Iwai, dri-devel, linux-kernel, Mauro Carvalho Chehab,
	Julia Lawall, linux-mm, linux-api, Daniel Vetter, Andrew Morton,
	hch, linux-media

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.

Thanks to Julia for helping me with coccinelle iteration to cover cases
where the mmap routine is defined in a separate file from the operations
instance that consumes it.

// Usage:
// spatch mmap.cocci --no-includes --include-headers --in-place ./ -j 40 --very-quiet

virtual after_start

@initialize:ocaml@
@@

let tbl = Hashtbl.create(100)

let add_if_not_present fn =
  if not(Hashtbl.mem tbl fn) then Hashtbl.add tbl fn ()

@ a @
identifier fn;
identifier ops;
expression E1;
@@

(
struct file_operations ops = { ..., .mmap = fn, ...};
|
struct file_operations ops[E1] = { ..., { ..., .mmap = fn, ...}, ...};
|
struct etnaviv_gem_ops ops = { ..., .mmap = fn, ...};
|
struct dma_buf_ops ops = { ..., .mmap = fn, ...};
|
struct drm_driver ops = { ..., .gem_prime_mmap = fn, ...};
|
struct fb_ops ops = { ..., .fb_mmap = fn, ...};
|
struct v4l2_file_operations ops = { ..., .mmap = fn, ...};
)

@script:ocaml@
fn << a.fn;
@@

add_if_not_present fn

@finalize:ocaml depends on !after_start@
tbls << merge.tbl;
@@

List.iter (fun t -> Hashtbl.iter (fun f _ -> add_if_not_present f) t) tbls;
Hashtbl.iter
    (fun f _ ->
      let it = new iteration() in
      it#add_virtual_rule After_start;
      it#add_virtual_identifier Fn f;
      it#register())
    tbl

@depends on after_start@
identifier virtual.fn;
identifier x, y;
type T;
@@

int fn(T *x,
        struct vm_area_struct *y
-       )
+       , unsigned long map_flags)
{
...
}

@depends on after_start@
identifier virtual.fn;
identifier x, y;
type T;
@@

int fn(T *x,
        struct vm_area_struct *y
-       );
+       , unsigned long map_flags);

@depends on after_start@
identifier virtual.fn;
type T;

@@

int fn(T *,
        struct vm_area_struct *
-       );
+       , unsigned long);

@depends on after_start@
identifier virtual.fn;
expression E1, E2, E3;
@@

E3 = fn(E1, E2
- );
+ , map_flags);

@depends on after_start@
identifier virtual.fn;
expression E1, E2;
@@

return fn(E1, E2
- );
+ , map_flags);

Cc: Takashi Iwai <tiwai@suse.com>
Cc: Christoph Hellwig <hch@lst.de>
Cc: David Airlie <airlied@linux.ie>
Cc: <dri-devel@lists.freedesktop.org>
Cc: Daniel Vetter <daniel.vetter@intel.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Mauro Carvalho Chehab <mchehab@s-opensource.com>
Cc: <linux-media@vger.kernel.org>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Suggested-by: Jan Kara <jack@suse.cz>
Signed-off-by: Julia Lawall <julia.lawall@lip6.fr>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
---
 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;

^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [RFC PATCH v8 1/2] vfs: add flags parameter to all ->mmap() handlers
  2017-09-08 19:35 ` [RFC PATCH v8 1/2] vfs: add flags parameter to all ->mmap() handlers Dan Williams
@ 2017-09-11  9:50   ` Jan Kara
  0 siblings, 0 replies; 3+ messages in thread
From: Jan Kara @ 2017-09-11  9:50 UTC (permalink / raw)
  To: Dan Williams
  Cc: torvalds, Jan Kara, linux-nvdimm, David Airlie,
	Greg Kroah-Hartman, Takashi Iwai, dri-devel, linux-kernel,
	Mauro Carvalho Chehab, Julia Lawall, linux-mm, linux-api,
	Daniel Vetter, Andrew Morton, hch, linux-media

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@suse.com>
> Cc: Christoph Hellwig <hch@lst.de>
> Cc: David Airlie <airlied@linux.ie>
> Cc: <dri-devel@lists.freedesktop.org>
> Cc: Daniel Vetter <daniel.vetter@intel.com>
> Cc: Andrew Morton <akpm@linux-foundation.org>
> Cc: Linus Torvalds <torvalds@linux-foundation.org>
> Cc: Mauro Carvalho Chehab <mchehab@s-opensource.com>
> Cc: <linux-media@vger.kernel.org>
> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
> Suggested-by: Jan Kara <jack@suse.cz>
> Signed-off-by: Julia Lawall <julia.lawall@lip6.fr>
> Signed-off-by: Dan Williams <dan.j.williams@intel.com>

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

Acked-by: Jan Kara <jack@suse.cz>

								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@suse.com>
SUSE Labs, CR

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2017-09-11  9:50 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-09-08 19:35 [RFC PATCH v8 0/2] mmap: safely enable support for new flags Dan Williams
2017-09-08 19:35 ` [RFC PATCH v8 1/2] vfs: add flags parameter to all ->mmap() handlers Dan Williams
2017-09-11  9:50   ` Jan Kara

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).