Merge tag 'fuse-update-5.10' of git://git.kernel.org/pub/scm/linux/kernel/git/mszered...
authorLinus Torvalds <torvalds@linux-foundation.org>
Mon, 19 Oct 2020 21:28:30 +0000 (14:28 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Mon, 19 Oct 2020 21:28:30 +0000 (14:28 -0700)
Pull fuse updates from Miklos Szeredi:

 - Support directly accessing host page cache from virtiofs. This can
   improve I/O performance for various workloads, as well as reducing
   the memory requirement by eliminating double caching. Thanks to Vivek
   Goyal for doing most of the work on this.

 - Allow automatic submounting inside virtiofs. This allows unique
   st_dev/ st_ino values to be assigned inside the guest to files
   residing on different filesystems on the host. Thanks to Max Reitz
   for the patches.

 - Fix an old use after free bug found by Pradeep P V K.

* tag 'fuse-update-5.10' of git://git.kernel.org/pub/scm/linux/kernel/git/mszeredi/fuse: (25 commits)
  virtiofs: calculate number of scatter-gather elements accurately
  fuse: connection remove fix
  fuse: implement crossmounts
  fuse: Allow fuse_fill_super_common() for submounts
  fuse: split fuse_mount off of fuse_conn
  fuse: drop fuse_conn parameter where possible
  fuse: store fuse_conn in fuse_req
  fuse: add submount support to <uapi/linux/fuse.h>
  fuse: fix page dereference after free
  virtiofs: add logic to free up a memory range
  virtiofs: maintain a list of busy elements
  virtiofs: serialize truncate/punch_hole and dax fault path
  virtiofs: define dax address space operations
  virtiofs: add DAX mmap support
  virtiofs: implement dax read/write operations
  virtiofs: introduce setupmapping/removemapping commands
  virtiofs: implement FUSE_INIT map_alignment field
  virtiofs: keep a list of free dax memory ranges
  virtiofs: add a mount option to enable dax
  virtiofs: set up virtio_fs dax_device
  ...

1  2 
MAINTAINERS
drivers/dax/super.c
fs/dax.c
fs/fuse/file.c
fs/fuse/inode.c
fs/fuse/virtio_fs.c
include/linux/dax.h

diff --combined MAINTAINERS
@@@ -405,7 -405,7 +405,7 @@@ F: drivers/platform/x86/i2c-multi-insta
  ACPI PMIC DRIVERS
  M:    "Rafael J. Wysocki" <rjw@rjwysocki.net>
  M:    Len Brown <lenb@kernel.org>
 -R:    Andy Shevchenko <andriy.shevchenko@linux.intel.com>
 +R:    Andy Shevchenko <andy@kernel.org>
  R:    Mika Westerberg <mika.westerberg@linux.intel.com>
  L:    linux-acpi@vger.kernel.org
  S:    Supported
@@@ -802,13 -802,6 +802,13 @@@ S:       Maintaine
  F:    Documentation/devicetree/bindings/interrupt-controller/amazon,al-fic.txt
  F:    drivers/irqchip/irq-al-fic.c
  
 +AMAZON ANNAPURNA LABS MEMORY CONTROLLER EDAC
 +M:    Talel Shenhar <talel@amazon.com>
 +M:    Talel Shenhar <talelshenhar@gmail.com>
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/edac/amazon,al-mc-edac.yaml
 +F:    drivers/edac/al_mc_edac.c
 +
  AMAZON ANNAPURNA LABS THERMAL MMIO DRIVER
  M:    Talel Shenhar <talel@amazon.com>
  S:    Maintained
@@@ -950,12 -943,37 +950,12 @@@ S:      Supporte
  F:    arch/arm64/boot/dts/amd/amd-seattle-xgbe*.dtsi
  F:    drivers/net/ethernet/amd/xgbe/
  
 -ANALOG DEVICES INC AD5686 DRIVER
 -M:    Michael Hennerich <Michael.Hennerich@analog.com>
 -L:    linux-pm@vger.kernel.org
 -S:    Supported
 -W:    http://ez.analog.com/community/linux-device-drivers
 -F:    drivers/iio/dac/ad5686*
 -F:    drivers/iio/dac/ad5696*
 -
 -ANALOG DEVICES INC AD5758 DRIVER
 -M:    Michael Hennerich <Michael.Hennerich@analog.com>
 +AMS AS73211 DRIVER
 +M:    Christian Eggers <ceggers@arri.de>
  L:    linux-iio@vger.kernel.org
 -S:    Supported
 -W:    http://ez.analog.com/community/linux-device-drivers
 -F:    Documentation/devicetree/bindings/iio/dac/ad5758.txt
 -F:    drivers/iio/dac/ad5758.c
 -
 -ANALOG DEVICES INC AD7091R5 DRIVER
 -M:    Beniamin Bia <beniamin.bia@analog.com>
 -L:    linux-iio@vger.kernel.org
 -S:    Supported
 -W:    http://ez.analog.com/community/linux-device-drivers
 -F:    Documentation/devicetree/bindings/iio/adc/adi,ad7091r5.yaml
 -F:    drivers/iio/adc/ad7091r5.c
 -
 -ANALOG DEVICES INC AD7124 DRIVER
 -M:    Michael Hennerich <Michael.Hennerich@analog.com>
 -L:    linux-iio@vger.kernel.org
 -S:    Supported
 -W:    http://ez.analog.com/community/linux-device-drivers
 -F:    Documentation/devicetree/bindings/iio/adc/adi,ad7124.yaml
 -F:    drivers/iio/adc/ad7124.c
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/iio/light/ams,as73211.yaml
 +F:    drivers/iio/light/as73211.c
  
  ANALOG DEVICES INC AD7192 DRIVER
  M:    Alexandru Tachici <alexandru.tachici@analog.com>
@@@ -973,6 -991,15 +973,6 @@@ W:        http://ez.analog.com/community/linux
  F:    Documentation/devicetree/bindings/iio/adc/adi,ad7292.yaml
  F:    drivers/iio/adc/ad7292.c
  
 -ANALOG DEVICES INC AD7606 DRIVER
 -M:    Michael Hennerich <Michael.Hennerich@analog.com>
 -M:    Beniamin Bia <beniamin.bia@analog.com>
 -L:    linux-iio@vger.kernel.org
 -S:    Supported
 -W:    http://ez.analog.com/community/linux-device-drivers
 -F:    Documentation/devicetree/bindings/iio/adc/adi,ad7606.yaml
 -F:    drivers/iio/adc/ad7606.c
 -
  ANALOG DEVICES INC AD7768-1 DRIVER
  M:    Michael Hennerich <Michael.Hennerich@analog.com>
  L:    linux-iio@vger.kernel.org
@@@ -1034,6 -1061,7 +1034,6 @@@ F:      drivers/iio/imu/adis16475.
  F:    Documentation/devicetree/bindings/iio/imu/adi,adis16475.yaml
  
  ANALOG DEVICES INC ADM1177 DRIVER
 -M:    Beniamin Bia <beniamin.bia@analog.com>
  M:    Michael Hennerich <Michael.Hennerich@analog.com>
  L:    linux-hwmon@vger.kernel.org
  S:    Supported
@@@ -1080,13 -1108,6 +1080,13 @@@ L:    linux-media@vger.kernel.or
  S:    Maintained
  F:    drivers/media/i2c/adv7842*
  
 +ANALOG DEVICES INC ADXRS290 DRIVER
 +M:    Nishant Malpani <nish.malpani25@gmail.com>
 +L:    linux-iio@vger.kernel.org
 +S:    Supported
 +F:    drivers/iio/gyro/adxrs290.c
 +F:    Documentation/devicetree/bindings/iio/gyroscope/adi,adxrs290.yaml
 +
  ANALOG DEVICES INC ASOC CODEC DRIVERS
  M:    Lars-Peter Clausen <lars@metafoo.de>
  M:    Nuno Sá <nuno.sa@analog.com>
@@@ -1107,6 -1128,15 +1107,6 @@@ S:     Supporte
  W:    http://ez.analog.com/community/linux-device-drivers
  F:    drivers/dma/dma-axi-dmac.c
  
 -ANALOG DEVICES INC HMC425A DRIVER
 -M:    Beniamin Bia <beniamin.bia@analog.com>
 -M:    Michael Hennerich <michael.hennerich@analog.com>
 -L:    linux-iio@vger.kernel.org
 -S:    Supported
 -W:    http://ez.analog.com/community/linux-device-drivers
 -F:    Documentation/devicetree/bindings/iio/amplifiers/adi,hmc425a.yaml
 -F:    drivers/iio/amplifiers/hmc425a.c
 -
  ANALOG DEVICES INC IIO DRIVERS
  M:    Lars-Peter Clausen <lars@metafoo.de>
  M:    Michael Hennerich <Michael.Hennerich@analog.com>
@@@ -1115,11 -1145,8 +1115,11 @@@ W:    http://wiki.analog.com
  W:    http://ez.analog.com/community/linux-device-drivers
  F:    Documentation/ABI/testing/sysfs-bus-iio-frequency-ad9523
  F:    Documentation/ABI/testing/sysfs-bus-iio-frequency-adf4350
 +F:    Documentation/devicetree/bindings/iio/*/adi,*
 +F:    Documentation/devicetree/bindings/iio/dac/ad5758.txt
  F:    drivers/iio/*/ad*
  F:    drivers/iio/adc/ltc249*
 +F:    drivers/iio/amplifiers/hmc425a.c
  F:    drivers/staging/iio/*/ad*
  X:    drivers/iio/*/adjd*
  
@@@ -1259,7 -1286,7 +1259,7 @@@ S:      Supporte
  F:    Documentation/devicetree/bindings/net/apm-xgene-enet.txt
  F:    Documentation/devicetree/bindings/net/apm-xgene-mdio.txt
  F:    drivers/net/ethernet/apm/xgene/
 -F:    drivers/net/phy/mdio-xgene.c
 +F:    drivers/net/mdio/mdio-xgene.c
  
  APPLIED MICRO (APM) X-GENE SOC PMU
  M:    Khuong Dinh <khuong@os.amperecomputing.com>
@@@ -1433,11 -1460,6 +1433,11 @@@ S:    Odd Fixe
  F:    drivers/amba/
  F:    include/linux/amba/bus.h
  
 +ARM PRIMECELL CLCD PL110 DRIVER
 +M:    Russell King <linux@armlinux.org.uk>
 +S:    Odd Fixes
 +F:    drivers/video/fbdev/amba-clcd.*
 +
  ARM PRIMECELL KMI PL050 DRIVER
  M:    Russell King <linux@armlinux.org.uk>
  S:    Odd Fixes
@@@ -1484,7 -1506,8 +1484,7 @@@ L:      linux-arm-kernel@lists.infradead.or
  S:    Maintained
  F:    Documentation/devicetree/bindings/iommu/arm,smmu*
  F:    drivers/iommu/arm/
 -F:    drivers/iommu/io-pgtable-arm-v7s.c
 -F:    drivers/iommu/io-pgtable-arm.c
 +F:    drivers/iommu/io-pgtable-arm*
  
  ARM SUB-ARCHITECTURES
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
@@@ -1500,11 -1523,10 +1500,11 @@@ L:   linux-arm-kernel@lists.infradead.or
  S:    Maintained
  F:    Documentation/devicetree/bindings/arm/actions.yaml
  F:    Documentation/devicetree/bindings/clock/actions,owl-cmu.txt
 -F:    Documentation/devicetree/bindings/dma/owl-dma.txt
 +F:    Documentation/devicetree/bindings/dma/owl-dma.yaml
  F:    Documentation/devicetree/bindings/i2c/i2c-owl.txt
 +F:    Documentation/devicetree/bindings/interrupt-controller/actions,owl-sirq.yaml
  F:    Documentation/devicetree/bindings/mmc/owl-mmc.yaml
 -F:    Documentation/devicetree/bindings/pinctrl/actions,s900-pinctrl.txt
 +F:    Documentation/devicetree/bindings/pinctrl/actions,*
  F:    Documentation/devicetree/bindings/power/actions,owl-sps.txt
  F:    Documentation/devicetree/bindings/timer/actions,owl-timer.txt
  F:    arch/arm/boot/dts/owl-*
@@@ -1514,7 -1536,6 +1514,7 @@@ F:      drivers/clk/actions
  F:    drivers/clocksource/timer-owl*
  F:    drivers/dma/owl-dma.c
  F:    drivers/i2c/busses/i2c-owl.c
 +F:    drivers/irqchip/irq-owl-sirq.c
  F:    drivers/mmc/host/owl-mmc.c
  F:    drivers/pinctrl/actions/*
  F:    drivers/soc/actions/
@@@ -1602,7 -1623,7 +1602,7 @@@ N:      meso
  
  ARM/Annapurna Labs ALPINE ARCHITECTURE
  M:    Tsahee Zidenberg <tsahee@annapurnalabs.com>
 -M:    Antoine Tenart <antoine.tenart@bootlin.com>
 +M:    Antoine Tenart <atenart@kernel.org>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
  F:    arch/arm/boot/dts/alpine*
@@@ -1673,6 -1694,7 +1673,6 @@@ F:      arch/arm/mach-cns3xxx
  
  ARM/CAVIUM THUNDER NETWORK DRIVER
  M:    Sunil Goutham <sgoutham@marvell.com>
 -M:    Robert Richter <rrichter@marvell.com>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Supported
  F:    drivers/net/ethernet/cavium/thunder/
@@@ -1725,7 -1747,6 +1725,7 @@@ ARM/CORESIGHT FRAMEWORK AND DRIVER
  M:    Mathieu Poirier <mathieu.poirier@linaro.org>
  R:    Suzuki K Poulose <suzuki.poulose@arm.com>
  R:    Mike Leach <mike.leach@linaro.org>
 +L:    coresight@lists.linaro.org (moderated for non-subscribers)
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
  F:    Documentation/ABI/testing/sysfs-bus-coresight-devices-*
@@@ -2425,7 -2446,7 +2425,7 @@@ L:      linux-samsung-soc@vger.kernel.org (m
  L:    linux-media@vger.kernel.org
  S:    Maintained
  F:    Documentation/devicetree/bindings/media/s5p-cec.txt
 -F:    drivers/media/platform/s5p-cec/
 +F:    drivers/media/cec/platform/s5p/
  
  ARM/SAMSUNG S5P SERIES JPEG CODEC SUPPORT
  M:    Andrzej Pietrasiewicz <andrzejtp2010@gmail.com>
@@@ -2484,7 -2505,7 +2484,7 @@@ S:      Maintaine
  F:    drivers/clk/socfpga/
  
  ARM/SOCFPGA EDAC SUPPORT
 -M:    Thor Thayer <thor.thayer@linux.intel.com>
 +M:    Dinh Nguyen <dinguyen@kernel.org>
  S:    Maintained
  F:    drivers/edac/altera_edac.
  
@@@ -2570,7 -2591,7 +2570,7 @@@ L:      linux-tegra@vger.kernel.or
  L:    linux-media@vger.kernel.org
  S:    Maintained
  F:    Documentation/devicetree/bindings/media/tegra-cec.txt
 -F:    drivers/media/platform/tegra-cec/
 +F:    drivers/media/cec/platform/tegra/
  
  ARM/TETON BGA MACHINE SUPPORT
  M:    "Mark F. Brown" <mark.brown314@gmail.com>
@@@ -3238,7 -3259,7 +3238,7 @@@ M:      Daniel Borkmann <daniel@iogearbox.ne
  R:    Martin KaFai Lau <kafai@fb.com>
  R:    Song Liu <songliubraving@fb.com>
  R:    Yonghong Song <yhs@fb.com>
 -R:    Andrii Nakryiko <andriin@fb.com>
 +R:    Andrii Nakryiko <andrii@kernel.org>
  R:    John Fastabend <john.fastabend@gmail.com>
  R:    KP Singh <kpsingh@chromium.org>
  L:    netdev@vger.kernel.org
@@@ -3368,7 -3389,6 +3368,7 @@@ M:      Florian Fainelli <f.fainelli@gmail.c
  L:    netdev@vger.kernel.org
  L:    openwrt-devel@lists.openwrt.org (subscribers-only)
  S:    Supported
 +F:    Documentation/devicetree/bindings/net/dsa/b53.txt
  F:    drivers/net/dsa/b53/*
  F:    include/linux/platform_data/b53.h
  
@@@ -3455,14 -3475,6 +3455,14 @@@ F:    drivers/bus/brcmstb_gisb.
  F:    drivers/pci/controller/pcie-brcmstb.c
  N:    brcmstb
  
 +BROADCOM BDC DRIVER
 +M:    Al Cooper <alcooperx@gmail.com>
 +L:    linux-usb@vger.kernel.org
 +L:    bcm-kernel-feedback-list@broadcom.com
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/usb/brcm,bdc.txt
 +F:    drivers/usb/gadget/udc/bdc/
 +
  BROADCOM BMIPS CPUFREQ DRIVER
  M:    Markus Mayer <mmayer@broadcom.com>
  M:    bcm-kernel-feedback-list@broadcom.com
@@@ -3495,17 -3507,13 +3495,17 @@@ F:   drivers/net/ethernet/broadcom/bnx2.
  F:    drivers/net/ethernet/broadcom/bnx2_*
  
  BROADCOM BNX2FC 10 GIGABIT FCOE DRIVER
 -M:    QLogic-Storage-Upstream@qlogic.com
 +M:    Saurav Kashyap <skashyap@marvell.com>
 +M:    Javed Hasan <jhasan@marvell.com>
 +M:    GR-QLogic-Storage-Upstream@marvell.com
  L:    linux-scsi@vger.kernel.org
  S:    Supported
  F:    drivers/scsi/bnx2fc/
  
  BROADCOM BNX2I 1/10 GIGABIT iSCSI DRIVER
 -M:    QLogic-Storage-Upstream@qlogic.com
 +M:    Nilesh Javali <njavali@marvell.com>
 +M:    Manish Rangankar <mrangankar@marvell.com>
 +M:    GR-QLogic-Storage-Upstream@marvell.com
  L:    linux-scsi@vger.kernel.org
  S:    Supported
  F:    drivers/scsi/bnx2i/
@@@ -3566,28 -3574,13 +3566,28 @@@ L:   bcm-kernel-feedback-list@broadcom.co
  S:    Maintained
  F:    drivers/phy/broadcom/phy-brcm-usb*
  
 +BROADCOM ETHERNET PHY DRIVERS
 +M:    Florian Fainelli <f.fainelli@gmail.com>
 +L:    bcm-kernel-feedback-list@broadcom.com
 +L:    netdev@vger.kernel.org
 +S:    Supported
 +F:    Documentation/devicetree/bindings/net/broadcom-bcm87xx.txt
 +F:    drivers/net/phy/bcm*.[ch]
 +F:    drivers/net/phy/broadcom.c
 +F:    include/linux/brcmphy.h
 +
  BROADCOM GENET ETHERNET DRIVER
  M:    Doug Berger <opendmb@gmail.com>
  M:    Florian Fainelli <f.fainelli@gmail.com>
  L:    bcm-kernel-feedback-list@broadcom.com
  L:    netdev@vger.kernel.org
  S:    Supported
 +F:    Documentation/devicetree/bindings/net/brcm,bcmgenet.txt
 +F:    Documentation/devicetree/bindings/net/brcm,unimac-mdio.txt
  F:    drivers/net/ethernet/broadcom/genet/
 +F:    drivers/net/mdio/mdio-bcm-unimac.c
 +F:    include/linux/platform_data/bcmgenet.h
 +F:    include/linux/platform_data/mdio-bcm-unimac.h
  
  BROADCOM IPROC ARM ARCHITECTURE
  M:    Ray Jui <rjui@broadcom.com>
@@@ -3840,16 -3833,6 +3840,16 @@@ S:    Orpha
  F:    Documentation/devicetree/bindings/mtd/cadence-nand-controller.txt
  F:    drivers/mtd/nand/raw/cadence-nand-controller.c
  
 +CADENCE USB3 DRD IP DRIVER
 +M:    Peter Chen <peter.chen@nxp.com>
 +M:    Pawel Laszczak <pawell@cadence.com>
 +M:    Roger Quadros <rogerq@ti.com>
 +L:    linux-usb@vger.kernel.org
 +S:    Maintained
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/peter.chen/usb.git
 +F:    Documentation/devicetree/bindings/usb/cdns-usb3.txt
 +F:    drivers/usb/cdns3/
 +
  CADET FM/AM RADIO RECEIVER DRIVER
  M:    Hans Verkuil <hverkuil@xs4all.nl>
  L:    linux-media@vger.kernel.org
@@@ -3914,7 -3897,6 +3914,7 @@@ F:      include/net/netns/can.
  F:    include/uapi/linux/can.h
  F:    include/uapi/linux/can/bcm.h
  F:    include/uapi/linux/can/gw.h
 +F:    include/uapi/linux/can/isotp.h
  F:    include/uapi/linux/can/raw.h
  F:    net/can/
  
@@@ -3950,8 -3932,8 +3950,8 @@@ W:      https://wireless.wiki.kernel.org/en/
  F:    drivers/net/wireless/ath/carl9170/
  
  CAVIUM I2C DRIVER
 -M:    Robert Richter <rrichter@marvell.com>
 -S:    Supported
 +M:    Robert Richter <rric@kernel.org>
 +S:    Odd Fixes
  W:    http://www.marvell.com
  F:    drivers/i2c/busses/i2c-octeon*
  F:    drivers/i2c/busses/i2c-thunderx*
@@@ -3966,8 -3948,8 +3966,8 @@@ W:      http://www.marvell.co
  F:    drivers/net/ethernet/cavium/liquidio/
  
  CAVIUM MMC DRIVER
 -M:    Robert Richter <rrichter@marvell.com>
 -S:    Supported
 +M:    Robert Richter <rric@kernel.org>
 +S:    Odd Fixes
  W:    http://www.marvell.com
  F:    drivers/mmc/host/cavium*
  
@@@ -3979,9 -3961,9 +3979,9 @@@ W:      http://www.marvell.co
  F:    drivers/crypto/cavium/cpt/
  
  CAVIUM THUNDERX2 ARM64 SOC
 -M:    Robert Richter <rrichter@marvell.com>
 +M:    Robert Richter <rric@kernel.org>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 -S:    Maintained
 +S:    Odd Fixes
  F:    Documentation/devicetree/bindings/arm/cavium-thunder2.txt
  F:    arch/arm64/boot/dts/cavium/thunder2-99xx*
  
@@@ -4033,7 -4015,7 +4033,7 @@@ S:      Supporte
  W:    http://linuxtv.org
  T:    git git://linuxtv.org/media_tree.git
  F:    Documentation/devicetree/bindings/media/cec-gpio.txt
 -F:    drivers/media/platform/cec-gpio/
 +F:    drivers/media/cec/platform/cec-gpio/
  
  CELL BROADBAND ENGINE ARCHITECTURE
  M:    Arnd Bergmann <arnd@arndb.de>
@@@ -4103,11 -4085,6 +4103,11 @@@ T:    git git://git.kernel.org/pub/scm/lin
  F:    drivers/char/
  F:    drivers/misc/
  F:    include/linux/miscdevice.h
 +X:    drivers/char/agp/
 +X:    drivers/char/hw_random/
 +X:    drivers/char/ipmi/
 +X:    drivers/char/random.c
 +X:    drivers/char/tpm/
  
  CHECKPATCH
  M:    Andy Whitcroft <apw@canonical.com>
@@@ -4178,7 -4155,6 +4178,7 @@@ CIRRUS LOGIC AUDIO CODEC DRIVER
  M:    James Schulman <james.schulman@cirrus.com>
  M:    David Rhodes <david.rhodes@cirrus.com>
  L:    alsa-devel@alsa-project.org (moderated for non-subscribers)
 +L:    patches@opensource.cirrus.com
  S:    Maintained
  F:    sound/soc/codecs/cs*
  
@@@ -4256,6 -4232,7 +4256,6 @@@ F:      drivers/net/ethernet/cisco/enic
  CISCO VIC LOW LATENCY NIC DRIVER
  M:    Christian Benvenuti <benve@cisco.com>
  M:    Nelson Escobar <neescoba@cisco.com>
 -M:    Parvi Kaustubhi <pkaustub@cisco.com>
  S:    Supported
  F:    drivers/infiniband/hw/usnic/
  
@@@ -4265,8 -4242,6 +4265,8 @@@ S:      Maintaine
  F:    .clang-format
  
  CLANG/LLVM BUILD SUPPORT
 +M:    Nathan Chancellor <natechancellor@gmail.com>
 +M:    Nick Desaulniers <ndesaulniers@google.com>
  L:    clang-built-linux@googlegroups.com
  S:    Supported
  W:    https://clangbuiltlinux.github.io/
@@@ -4415,7 -4390,12 +4415,7 @@@ S:     Supporte
  T:    git git://git.infradead.org/users/hch/configfs.git
  F:    fs/configfs/
  F:    include/linux/configfs.h
 -
 -CONNECTOR
 -M:    Evgeniy Polyakov <zbr@ioremap.net>
 -L:    netdev@vger.kernel.org
 -S:    Maintained
 -F:    drivers/connector/
 +F:    samples/configfs/
  
  CONSOLE SUBSYSTEM
  M:    Greg Kroah-Hartman <gregkh@linuxfoundation.org>
@@@ -4713,15 -4693,6 +4713,15 @@@ S:    Supporte
  W:    http://www.chelsio.com
  F:    drivers/crypto/chelsio
  
 +CXGB4 INLINE CRYPTO DRIVER
 +M:    Ayush Sawal <ayush.sawal@chelsio.com>
 +M:    Vinay Kumar Yadav <vinay.yadav@chelsio.com>
 +M:    Rohit Maheshwari <rohitm@chelsio.com>
 +L:    netdev@vger.kernel.org
 +S:    Supported
 +W:    http://www.chelsio.com
 +F:    drivers/net/ethernet/chelsio/inline_crypto/
 +
  CXGB4 ETHERNET DRIVER (CXGB4)
  M:    Vishal Kulkarni <vishal@chelsio.com>
  L:    netdev@vger.kernel.org
@@@ -5024,12 -4995,6 +5024,12 @@@ S:    Maintaine
  F:    drivers/base/devcoredump.c
  F:    include/linux/devcoredump.h
  
 +DEVICE DEPENDENCY HELPER SCRIPT
 +M:    Saravana Kannan <saravanak@google.com>
 +L:    linux-kernel@vger.kernel.org
 +S:    Maintained
 +F:    scripts/dev-needs.sh
 +
  DEVICE DIRECT ACCESS (DAX)
  M:    Dan Williams <dan.j.williams@intel.com>
  M:    Vishal Verma <vishal.l.verma@intel.com>
@@@ -5226,7 -5191,7 +5226,7 @@@ T:      git git://git.infradead.org/users/hc
  F:    include/asm-generic/dma-mapping.h
  F:    include/linux/dma-direct.h
  F:    include/linux/dma-mapping.h
 -F:    include/linux/dma-noncoherent.h
 +F:    include/linux/dma-map-ops.h
  F:    kernel/dma/
  
  DMA-BUF HEAPS FRAMEWORK
@@@ -5275,7 -5240,6 +5275,7 @@@ DOCUMENTATIO
  M:    Jonathan Corbet <corbet@lwn.net>
  L:    linux-doc@vger.kernel.org
  S:    Maintained
 +P:    Documentation/doc-guide/maintainer-profile.rst
  T:    git git://git.lwn.net/linux.git docs-next
  F:    Documentation/
  F:    scripts/documentation-file-ref-check
@@@ -5398,6 -5362,7 +5398,6 @@@ F:      include/linux/kobj
  F:    lib/kobj*
  
  DRIVERS FOR ADAPTIVE VOLTAGE SCALING (AVS)
 -M:    Kevin Hilman <khilman@kernel.org>
  M:    Nishanth Menon <nm@ti.com>
  L:    linux-pm@vger.kernel.org
  S:    Maintained
@@@ -5428,7 -5393,7 +5428,7 @@@ F:      drivers/gpu/drm/panel/panel-arm-vers
  
  DRM DRIVER FOR ASPEED BMC GFX
  M:    Joel Stanley <joel@jms.id.au>
 -L:    linux-aspeed@lists.ozlabs.org
 +L:    linux-aspeed@lists.ozlabs.org (moderated for non-subscribers)
  S:    Supported
  T:    git git://anongit.freedesktop.org/drm/drm-misc
  F:    Documentation/devicetree/bindings/gpu/aspeed-gfx.txt
@@@ -5436,10 -5401,7 +5436,10 @@@ F:    drivers/gpu/drm/aspeed
  
  DRM DRIVER FOR AST SERVER GRAPHICS CHIPS
  M:    Dave Airlie <airlied@redhat.com>
 -S:    Odd Fixes
 +R:    Thomas Zimmermann <tzimmermann@suse.de>
 +L:    dri-devel@lists.freedesktop.org
 +S:    Supported
 +T:    git git://anongit.freedesktop.org/drm/drm-misc
  F:    drivers/gpu/drm/ast/
  
  DRM DRIVER FOR BOCHS VIRTUAL GPU
@@@ -5513,24 -5475,14 +5513,24 @@@ S:   Maintaine
  F:    drivers/gpu/drm/panel/panel-lvds.c
  F:    Documentation/devicetree/bindings/display/panel/lvds.yaml
  
 +DRM DRIVER FOR MANTIX MLAF057WE51 PANELS
 +M:    Guido Günther <agx@sigxcpu.org>
 +R:    Purism Kernel Team <kernel@puri.sm>
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/display/panel/mantix,mlaf057we51-x.yaml
 +F:    drivers/gpu/drm/panel/panel-mantix-mlaf057we51.c
 +
  DRM DRIVER FOR MATROX G200/G400 GRAPHICS CARDS
  S:    Orphan / Obsolete
  F:    drivers/gpu/drm/mga/
  F:    include/uapi/drm/mga_drm.h
  
 -DRM DRIVER FOR MGA G200 SERVER GRAPHICS CHIPS
 +DRM DRIVER FOR MGA G200 GRAPHICS CHIPS
  M:    Dave Airlie <airlied@redhat.com>
 -S:    Odd Fixes
 +R:    Thomas Zimmermann <tzimmermann@suse.de>
 +L:    dri-devel@lists.freedesktop.org
 +S:    Supported
 +T:    git git://anongit.freedesktop.org/drm/drm-misc
  F:    drivers/gpu/drm/mgag200/
  
  DRM DRIVER FOR MI0283QT
@@@ -5611,13 -5563,12 +5611,13 @@@ S:   Maintaine
  F:    Documentation/devicetree/bindings/display/panel/raydium,rm67191.yaml
  F:    drivers/gpu/drm/panel/panel-raydium-rm67191.c
  
 -DRM DRIVER FOR ROCKTECH JH057N00900 PANELS
 +DRM DRIVER FOR SITRONIX ST7703 PANELS
  M:    Guido Günther <agx@sigxcpu.org>
  R:    Purism Kernel Team <kernel@puri.sm>
 +R:    Ondrej Jirman <megous@megous.com>
  S:    Maintained
 -F:    Documentation/devicetree/bindings/display/panel/rocktech,jh057n00900.txt
 -F:    drivers/gpu/drm/panel/panel-rocktech-jh057n00900.c
 +F:    Documentation/devicetree/bindings/display/panel/rocktech,jh057n00900.yaml
 +F:    drivers/gpu/drm/panel/panel-sitronix-st7703.c
  
  DRM DRIVER FOR SAVAGE VIDEO CARDS
  S:    Orphan / Obsolete
@@@ -5676,15 -5627,13 +5676,15 @@@ F:   drivers/gpu/drm/panel/panel-tpo-tpg1
  DRM DRIVER FOR USB DISPLAYLINK VIDEO ADAPTERS
  M:    Dave Airlie <airlied@redhat.com>
  R:    Sean Paul <sean@poorly.run>
 +R:    Thomas Zimmermann <tzimmermann@suse.de>
  L:    dri-devel@lists.freedesktop.org
 -S:    Odd Fixes
 +S:    Supported
  T:    git git://anongit.freedesktop.org/drm/drm-misc
  F:    drivers/gpu/drm/udl/
  
  DRM DRIVER FOR VIRTUAL KERNEL MODESETTING (VKMS)
  M:    Rodrigo Siqueira <rodrigosiqueiramelo@gmail.com>
 +M:    Melissa Wen <melissa.srw@gmail.com>
  R:    Haneen Mohammed <hamohammed.sa@gmail.com>
  R:    Daniel Vetter <daniel@ffwll.ch>
  L:    dri-devel@lists.freedesktop.org
@@@ -5819,7 -5768,7 +5819,7 @@@ F:      drivers/gpu/drm/gma500
  
  DRM DRIVERS FOR HISILICON
  M:    Xinliang Liu <xinliang.liu@linaro.org>
 -M:    Rongrong Zou <zourongrong@gmail.com>
 +M:    Tian Tao  <tiantao6@hisilicon.com>
  R:    John Stultz <john.stultz@linaro.org>
  R:    Xinwei Kong <kong.kongxinwei@hisilicon.com>
  R:    Chen Feng <puck.chen@hisilicon.com>
@@@ -5845,7 -5794,6 +5845,7 @@@ L:      dri-devel@lists.freedesktop.or
  S:    Supported
  F:    Documentation/devicetree/bindings/display/mediatek/
  F:    drivers/gpu/drm/mediatek/
 +F:    drivers/phy/mediatek/phy-mtk-hdmi*
  
  DRM DRIVERS FOR NVIDIA TEGRA
  M:    Thierry Reding <thierry.reding@gmail.com>
@@@ -5867,7 -5815,7 +5867,7 @@@ L:      linux-renesas-soc@vger.kernel.or
  S:    Supported
  T:    git git://linuxtv.org/pinchartl/media drm/du/next
  F:    Documentation/devicetree/bindings/display/bridge/renesas,dw-hdmi.txt
 -F:    Documentation/devicetree/bindings/display/bridge/renesas,lvds.txt
 +F:    Documentation/devicetree/bindings/display/bridge/renesas,lvds.yaml
  F:    Documentation/devicetree/bindings/display/renesas,du.txt
  F:    drivers/gpu/drm/rcar-du/
  F:    drivers/gpu/drm/shmobile/
@@@ -6214,27 -6162,28 +6214,27 @@@ F:   Documentation/devicetree/bindings/ed
  F:    drivers/edac/aspeed_edac.c
  
  EDAC-BLUEFIELD
 -M:    Shravan Kumar Ramani <sramani@nvidia.com>
 +M:    Shravan Kumar Ramani <shravankr@nvidia.com>
  S:    Supported
  F:    drivers/edac/bluefield_edac.c
  
  EDAC-CALXEDA
 -M:    Robert Richter <rric@kernel.org>
 +M:    Andre Przywara <andre.przywara@arm.com>
  L:    linux-edac@vger.kernel.org
  S:    Maintained
  F:    drivers/edac/highbank*
  
  EDAC-CAVIUM OCTEON
  M:    Ralf Baechle <ralf@linux-mips.org>
 -M:    Robert Richter <rrichter@marvell.com>
  L:    linux-edac@vger.kernel.org
  L:    linux-mips@vger.kernel.org
  S:    Supported
  F:    drivers/edac/octeon_edac*
  
  EDAC-CAVIUM THUNDERX
 -M:    Robert Richter <rrichter@marvell.com>
 +M:    Robert Richter <rric@kernel.org>
  L:    linux-edac@vger.kernel.org
 -S:    Supported
 +S:    Odd Fixes
  F:    drivers/edac/thunderx_edac*
  
  EDAC-CORE
@@@ -6242,7 -6191,7 +6242,7 @@@ M:      Borislav Petkov <bp@alien8.de
  M:    Mauro Carvalho Chehab <mchehab@kernel.org>
  M:    Tony Luck <tony.luck@intel.com>
  R:    James Morse <james.morse@arm.com>
 -R:    Robert Richter <rrichter@marvell.com>
 +R:    Robert Richter <rric@kernel.org>
  L:    linux-edac@vger.kernel.org
  S:    Supported
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/ras/ras.git edac-for-next
@@@ -6546,6 -6495,7 +6546,6 @@@ F:      net/bridge
  
  ETHERNET PHY LIBRARY
  M:    Andrew Lunn <andrew@lunn.ch>
 -M:    Florian Fainelli <f.fainelli@gmail.com>
  M:    Heiner Kallweit <hkallweit1@gmail.com>
  R:    Russell King <linux@armlinux.org.uk>
  L:    netdev@vger.kernel.org
@@@ -6555,14 -6505,11 +6555,14 @@@ F:   Documentation/devicetree/bindings/ne
  F:    Documentation/devicetree/bindings/net/mdio*
  F:    Documentation/devicetree/bindings/net/qca,ar803x.yaml
  F:    Documentation/networking/phy.rst
 +F:    drivers/net/mdio/
 +F:    drivers/net/mdio/of_mdio.c
 +F:    drivers/net/pcs/
  F:    drivers/net/phy/
 -F:    drivers/of/of_mdio.c
  F:    drivers/of/of_net.c
  F:    include/dt-bindings/net/qca-ar803x.h
  F:    include/linux/*mdio*.h
 +F:    include/linux/mdio/*.h
  F:    include/linux/of_net.h
  F:    include/linux/phy.h
  F:    include/linux/phy_fixed.h
@@@ -6638,7 -6585,6 +6638,7 @@@ F:      fs/proc/bootconfig.
  F:    include/linux/bootconfig.h
  F:    lib/bootconfig.c
  F:    tools/bootconfig/*
 +F:    tools/bootconfig/scripts/*
  
  EXYNOS DP DRIVER
  M:    Jingoo Han <jingoohan1@gmail.com>
@@@ -6866,17 -6812,14 +6866,17 @@@ F:   drivers/net/ethernet/nvidia/
  
  FPGA DFL DRIVERS
  M:    Wu Hao <hao.wu@intel.com>
 +R:    Tom Rix <trix@redhat.com>
  L:    linux-fpga@vger.kernel.org
  S:    Maintained
 +F:    Documentation/ABI/testing/sysfs-bus-dfl
  F:    Documentation/fpga/dfl.rst
  F:    drivers/fpga/dfl*
  F:    include/uapi/linux/fpga-dfl.h
  
  FPGA MANAGER FRAMEWORK
  M:    Moritz Fischer <mdf@kernel.org>
 +R:    Tom Rix <trix@redhat.com>
  L:    linux-fpga@vger.kernel.org
  S:    Maintained
  W:    http://www.rocketboards.org
@@@ -6942,14 -6885,6 +6942,14 @@@ L:    linuxppc-dev@lists.ozlabs.or
  S:    Maintained
  F:    drivers/dma/fsldma.*
  
 +FREESCALE DSPI DRIVER
 +M:    Vladimir Oltean <olteanv@gmail.com>
 +L:    linux-spi@vger.kernel.org
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/spi/spi-fsl-dspi.txt
 +F:    drivers/spi/spi-fsl-dspi.c
 +F:    include/linux/spi/spi-fsl-dspi.h
 +
  FREESCALE ENETC ETHERNET DRIVERS
  M:    Claudiu Manoil <claudiu.manoil@nxp.com>
  L:    netdev@vger.kernel.org
@@@ -6999,7 -6934,7 +6999,7 @@@ M:      Frank Li <Frank.li@nxp.com
  L:    linux-arm-kernel@lists.infradead.org
  S:    Maintained
  F:    Documentation/admin-guide/perf/imx-ddr.rst
 -F:    Documentation/devicetree/bindings/perf/fsl-imx-ddr.txt
 +F:    Documentation/devicetree/bindings/perf/fsl-imx-ddr.yaml
  F:    drivers/perf/fsl_imx8_ddr_perf.c
  
  FREESCALE IMX I2C DRIVER
@@@ -7007,7 -6942,7 +7007,7 @@@ M:      Oleksij Rempel <o.rempel@pengutronix
  R:    Pengutronix Kernel Team <kernel@pengutronix.de>
  L:    linux-i2c@vger.kernel.org
  S:    Maintained
 -F:    Documentation/devicetree/bindings/i2c/i2c-imx.txt
 +F:    Documentation/devicetree/bindings/i2c/i2c-imx.yaml
  F:    drivers/i2c/busses/i2c-imx.c
  
  FREESCALE IMX LPI2C DRIVER
@@@ -7015,7 -6950,7 +7015,7 @@@ M:      Dong Aisheng <aisheng.dong@nxp.com
  L:    linux-i2c@vger.kernel.org
  L:    linux-imx@nxp.com
  S:    Maintained
 -F:    Documentation/devicetree/bindings/i2c/i2c-imx-lpi2c.txt
 +F:    Documentation/devicetree/bindings/i2c/i2c-imx-lpi2c.yaml
  F:    drivers/i2c/busses/i2c-imx-lpi2c.c
  
  FREESCALE QORIQ DPAA ETHERNET DRIVER
@@@ -7238,7 -7173,7 +7238,7 @@@ FUSE: FILESYSTEM IN USERSPAC
  M:    Miklos Szeredi <miklos@szeredi.hu>
  L:    linux-fsdevel@vger.kernel.org
  S:    Maintained
- W:    http://fuse.sourceforge.net/
+ W:    https://github.com/libfuse/
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/mszeredi/fuse.git
  F:    Documentation/filesystems/fuse.rst
  F:    fs/fuse/
@@@ -7282,7 -7217,7 +7282,7 @@@ F:      drivers/staging/gasket
  GCC PLUGINS
  M:    Kees Cook <keescook@chromium.org>
  R:    Emese Revfy <re.emese@gmail.com>
 -L:    kernel-hardening@lists.openwall.com
 +L:    linux-hardening@vger.kernel.org
  S:    Maintained
  F:    Documentation/kbuild/gcc-plugins.rst
  F:    scripts/Makefile.gcc-plugins
@@@ -7782,8 -7717,8 +7782,8 @@@ F:      Documentation/watchdog/hpwdt.rs
  F:    drivers/watchdog/hpwdt.c
  
  HEWLETT-PACKARD SMART ARRAY RAID DRIVER (hpsa)
 -M:    Don Brace <don.brace@microsemi.com>
 -L:    esc.storagedev@microsemi.com
 +M:    Don Brace <don.brace@microchip.com>
 +L:    storagedev@microchip.com
  L:    linux-scsi@vger.kernel.org
  S:    Supported
  F:    Documentation/scsi/hpsa.rst
@@@ -7792,8 -7727,8 +7792,8 @@@ F:      include/linux/cciss*.
  F:    include/uapi/linux/cciss*.h
  
  HFI1 DRIVER
 -M:    Mike Marciniszyn <mike.marciniszyn@intel.com>
 -M:    Dennis Dalessandro <dennis.dalessandro@intel.com>
 +M:    Mike Marciniszyn <mike.marciniszyn@cornelisnetworks.com>
 +M:    Dennis Dalessandro <dennis.dalessandro@cornelisnetworks.com>
  L:    linux-rdma@vger.kernel.org
  S:    Supported
  F:    drivers/infiniband/hw/hfi1
@@@ -7926,13 -7861,6 +7926,13 @@@ W:    http://www.hisilicon.co
  F:    Documentation/devicetree/bindings/net/hisilicon*.txt
  F:    drivers/net/ethernet/hisilicon/
  
 +HIKEY960 ONBOARD USB GPIO HUB DRIVER
 +M:    John Stultz <john.stultz@linaro.org>
 +L:    linux-kernel@vger.kernel.org
 +S:    Maintained
 +F:    drivers/misc/hisi_hikey_usb.c
 +F:    Documentation/devicetree/bindings/misc/hisilicon-hikey-usb.yaml
 +
  HISILICON PMU DRIVER
  M:    Shaokun Zhang <zhangshaokun@hisilicon.com>
  S:    Supported
@@@ -7976,12 -7904,6 +7976,12 @@@ F:    drivers/crypto/hisilicon/sec2/sec_cr
  F:    drivers/crypto/hisilicon/sec2/sec_crypto.h
  F:    drivers/crypto/hisilicon/sec2/sec_main.c
  
 +HISILICON STAGING DRIVERS FOR HIKEY 960/970
 +M:    Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
 +L:    devel@driverdev.osuosl.org
 +S:    Maintained
 +F:    drivers/staging/hikey9xx/
 +
  HISILICON TRUE RANDOM NUMBER GENERATOR V2 SUPPORT
  M:    Zaibo Xu <xuzaibo@huawei.com>
  S:    Maintained
@@@ -8334,7 -8256,7 +8334,7 @@@ IA64 (Itanium) PLATFOR
  M:    Tony Luck <tony.luck@intel.com>
  M:    Fenghua Yu <fenghua.yu@intel.com>
  L:    linux-ia64@vger.kernel.org
 -S:    Maintained
 +S:    Odd Fixes
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/aegl/linux.git
  F:    Documentation/ia64/
  F:    arch/ia64/
@@@ -8383,9 -8305,8 +8383,9 @@@ S:      Supporte
  F:    drivers/pci/hotplug/rpaphp*
  
  IBM Power SRIOV Virtual NIC Device Driver
 -M:    Thomas Falcon <tlfalcon@linux.ibm.com>
 -M:    John Allen <jallen@linux.ibm.com>
 +M:    Dany Madden <drt@linux.ibm.com>
 +M:    Lijun Pan <ljp@linux.ibm.com>
 +M:    Sukadev Bhattiprolu <sukadev@linux.ibm.com>
  L:    netdev@vger.kernel.org
  S:    Supported
  F:    drivers/net/ethernet/ibm/ibmvnic.*
@@@ -8399,7 -8320,7 +8399,7 @@@ F:      arch/powerpc/platforms/powernv/copy-
  F:    arch/powerpc/platforms/powernv/vas*
  
  IBM Power Virtual Ethernet Device Driver
 -M:    Thomas Falcon <tlfalcon@linux.ibm.com>
 +M:    Cristobal Forno <cforno12@linux.ibm.com>
  L:    netdev@vger.kernel.org
  S:    Supported
  F:    drivers/net/ethernet/ibm/ibmveth.*
@@@ -8559,6 -8480,7 +8559,6 @@@ F:      drivers/iio/multiplexer/iio-mux.
  
  IIO SUBSYSTEM AND DRIVERS
  M:    Jonathan Cameron <jic23@kernel.org>
 -R:    Hartmut Knaack <knaack.h@gmx.de>
  R:    Lars-Peter Clausen <lars@metafoo.de>
  R:    Peter Meerwald-Stadler <pmeerw@pmeerw.net>
  L:    linux-iio@vger.kernel.org
@@@ -8674,9 -8596,8 +8674,9 @@@ INGENIC JZ47xx SoC
  M:    Paul Cercueil <paul@crapouillou.net>
  S:    Maintained
  F:    arch/mips/boot/dts/ingenic/
 -F:    arch/mips/include/asm/mach-jz4740/
 -F:    arch/mips/jz4740/
 +F:    arch/mips/generic/board-ingenic.c
 +F:    arch/mips/include/asm/mach-ingenic/
 +F:    arch/mips/ingenic/Kconfig
  F:    drivers/clk/ingenic/
  F:    drivers/dma/dma-jz4780.c
  F:    drivers/gpu/drm/ingenic/
@@@ -8733,7 -8654,7 +8733,7 @@@ F:      drivers/input/input-mt.
  K:    \b(ABS|SYN)_MT_
  
  INSIDE SECURE CRYPTO DRIVER
 -M:    Antoine Tenart <antoine.tenart@bootlin.com>
 +M:    Antoine Tenart <atenart@kernel.org>
  L:    linux-crypto@vger.kernel.org
  S:    Maintained
  F:    drivers/crypto/inside-secure/
@@@ -8812,8 -8733,7 +8812,8 @@@ F:      include/drm/i915
  F:    include/uapi/drm/i915_drm.h
  
  INTEL ETHERNET DRIVERS
 -M:    Jeff Kirsher <jeffrey.t.kirsher@intel.com>
 +M:    Jesse Brandeburg <jesse.brandeburg@intel.com>
 +M:    Tony Nguyen <anthony.l.nguyen@intel.com>
  L:    intel-wired-lan@lists.osuosl.org (moderated for non-subscribers)
  S:    Supported
  W:    http://www.intel.com/support/feedback.htm
@@@ -8912,7 -8832,7 +8912,7 @@@ INTEL IPU3 CSI-2 CIO2 DRIVE
  M:    Yong Zhi <yong.zhi@intel.com>
  M:    Sakari Ailus <sakari.ailus@linux.intel.com>
  M:    Bingbu Cao <bingbu.cao@intel.com>
 -R:    Tian Shu Qiu <tian.shu.qiu@intel.com>
 +R:    Tianshu Qiu <tian.shu.qiu@intel.com>
  L:    linux-media@vger.kernel.org
  S:    Maintained
  F:    Documentation/userspace-api/media/v4l/pixfmt-srggb10-ipu3.rst
@@@ -8921,7 -8841,7 +8921,7 @@@ F:      drivers/media/pci/intel/ipu3
  INTEL IPU3 CSI-2 IMGU DRIVER
  M:    Sakari Ailus <sakari.ailus@linux.intel.com>
  R:    Bingbu Cao <bingbu.cao@intel.com>
 -R:    Tian Shu Qiu <tian.shu.qiu@intel.com>
 +R:    Tianshu Qiu <tian.shu.qiu@intel.com>
  L:    linux-media@vger.kernel.org
  S:    Maintained
  F:    Documentation/admin-guide/media/ipu3.rst
@@@ -8986,8 -8906,8 +8986,8 @@@ F:      arch/x86/include/asm/intel_punit_ipc
  F:    drivers/platform/x86/intel_punit_ipc.c
  
  INTEL PMC CORE DRIVER
 -M:    Rajneesh Bhardwaj <rajneesh.bhardwaj@intel.com>
 -M:    Vishwanath Somayaji <vishwanath.somayaji@intel.com>
 +M:    Rajneesh Bhardwaj <irenic.rajneesh@gmail.com>
 +M:    David E Box <david.e.box@intel.com>
  L:    platform-driver-x86@vger.kernel.org
  S:    Maintained
  F:    drivers/platform/x86/intel_pmc_core*
@@@ -9000,7 -8920,7 +9000,7 @@@ F:      drivers/gpio/gpio-*cove.
  F:    drivers/gpio/gpio-msic.c
  
  INTEL PMIC MULTIFUNCTION DEVICE DRIVERS
 -R:    Andy Shevchenko <andriy.shevchenko@linux.intel.com>
 +M:    Andy Shevchenko <andy@kernel.org>
  S:    Maintained
  F:    drivers/mfd/intel_msic.c
  F:    drivers/mfd/intel_soc_pmic*
@@@ -9181,7 -9101,6 +9181,7 @@@ L:      iommu@lists.linux-foundation.or
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/joro/iommu.git
  F:    Documentation/devicetree/bindings/iommu/
 +F:    Documentation/userspace-api/iommu.rst
  F:    drivers/iommu/
  F:    include/linux/iommu.h
  F:    include/linux/iova.h
@@@ -9308,7 -9227,7 +9308,7 @@@ F:      drivers/firmware/iscsi_ibft
  
  ISCSI EXTENSIONS FOR RDMA (ISER) INITIATOR
  M:    Sagi Grimberg <sagi@grimberg.me>
 -M:    Max Gurtovoy <maxg@nvidia.com>
 +M:    Max Gurtovoy <mgurtovoy@nvidia.com>
  L:    linux-rdma@vger.kernel.org
  S:    Supported
  W:    http://www.openfabrics.org
@@@ -9715,7 -9634,7 +9715,7 @@@ F:      security/keys/encrypted-keys
  
  KEYS-TRUSTED
  M:    James Bottomley <jejb@linux.ibm.com>
 -M:    Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
 +M:    Jarkko Sakkinen <jarkko@kernel.org>
  M:    Mimi Zohar <zohar@linux.ibm.com>
  L:    linux-integrity@vger.kernel.org
  L:    keyrings@vger.kernel.org
@@@ -9727,7 -9646,7 +9727,7 @@@ F:      security/keys/trusted-keys
  
  KEYS/KEYRINGS
  M:    David Howells <dhowells@redhat.com>
 -M:    Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
 +M:    Jarkko Sakkinen <jarkko@kernel.org>
  L:    keyrings@vger.kernel.org
  S:    Maintained
  F:    Documentation/security/keys/core.rst
@@@ -9774,8 -9693,8 +9774,8 @@@ M:      Catalin Marinas <catalin.marinas@arm
  S:    Maintained
  F:    Documentation/dev-tools/kmemleak.rst
  F:    include/linux/kmemleak.h
 -F:    mm/kmemleak-test.c
  F:    mm/kmemleak.c
 +F:    samples/kmemleak/kmemleak-test.c
  
  KMOD KERNEL MODULE LOADER - USERMODE HELPER
  M:    Luis Chamberlain <mcgrof@kernel.org>
@@@ -9804,12 -9723,6 +9804,12 @@@ F:    Documentation/admin-guide/auxdisplay
  F:    drivers/auxdisplay/ks0108.c
  F:    include/linux/ks0108.h
  
 +KTD253 BACKLIGHT DRIVER
 +M:    Linus Walleij <linus.walleij@linaro.org>
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/leds/backlight/kinetic,ktd253.yaml
 +F:    drivers/video/backlight/ktd253-backlight.c
 +
  L3MDEV
  M:    David Ahern <dsahern@kernel.org>
  L:    netdev@vger.kernel.org
@@@ -9863,8 -9776,8 +9863,8 @@@ F:      drivers/scsi/53c700
  
  LEAKING_ADDRESSES
  M:    Tobin C. Harding <me@tobin.cc>
 -M:    Tycho Andersen <tycho@tycho.ws>
 -L:    kernel-hardening@lists.openwall.com
 +M:    Tycho Andersen <tycho@tycho.pizza>
 +L:    linux-hardening@vger.kernel.org
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tobin/leaks.git
  F:    scripts/leaking_addresses.pl
@@@ -9935,6 -9848,15 +9935,6 @@@ T:     git git://git.kernel.org/pub/scm/lin
  F:    drivers/ata/pata_arasan_cf.c
  F:    include/linux/pata_arasan_cf_data.h
  
 -LIBATA PATA DRIVERS
 -M:    Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
 -M:    Jens Axboe <axboe@kernel.dk>
 -L:    linux-ide@vger.kernel.org
 -S:    Maintained
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/axboe/linux-block.git
 -F:    drivers/ata/ata_generic.c
 -F:    drivers/ata/pata_*.c
 -
  LIBATA PATA FARADAY FTIDE010 AND GEMINI SATA BRIDGE DRIVERS
  M:    Linus Walleij <linus.walleij@linaro.org>
  L:    linux-ide@vger.kernel.org
@@@ -10360,13 -10282,6 +10360,13 @@@ S: Maintaine
  W:    http://linux-test-project.github.io/
  T:    git git://github.com/linux-test-project/ltp.git
  
 +LYNX PCS MODULE
 +M:    Ioana Ciornei <ioana.ciornei@nxp.com>
 +L:    netdev@vger.kernel.org
 +S:    Supported
 +F:    drivers/net/pcs/pcs-lynx.c
 +F:    include/linux/pcs-lynx.h
 +
  M68K ARCHITECTURE
  M:    Geert Uytterhoeven <geert@linux-m68k.org>
  L:    linux-m68k@lists.linux-m68k.org
@@@ -10574,7 -10489,7 +10574,7 @@@ M:   Tobias Waldekranz <tobias@waldekranz
  L:    netdev@vger.kernel.org
  S:    Maintained
  F:    Documentation/devicetree/bindings/net/marvell,mvusb.yaml
 -F:    drivers/net/phy/mdio-mvusb.c
 +F:    drivers/net/mdio/mdio-mvusb.c
  
  MARVELL XENON MMC/SD/SDIO HOST CONTROLLER DRIVER
  M:    Hu Ziji <huziji@marvell.com>
@@@ -10721,15 -10636,6 +10721,15 @@@ L: linux-input@vger.kernel.or
  S:    Maintained
  F:    drivers/hid/hid-mcp2221.c
  
 +MCP251XFD SPI-CAN NETWORK DRIVER
 +M:    Marc Kleine-Budde <mkl@pengutronix.de>
 +M:    Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
 +R:    Thomas Kopp <thomas.kopp@microchip.com>
 +L:    linux-can@vger.kernel.org
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/net/can/microchip,mcp251xfd.yaml
 +F:    drivers/net/can/spi/mcp251xfd/
 +
  MCP4018 AND MCP4531 MICROCHIP DIGITAL POTENTIOMETER DRIVERS
  M:    Peter Rosin <peda@axentia.se>
  L:    linux-iio@vger.kernel.org
@@@ -11112,7 -11018,6 +11112,7 @@@ F:   drivers/char/hw_random/mtk-rng.
  
  MEDIATEK SWITCH DRIVER
  M:    Sean Wang <sean.wang@mediatek.com>
 +M:    Landen Chao <Landen.Chao@mediatek.com>
  L:    netdev@vger.kernel.org
  S:    Maintained
  F:    drivers/net/dsa/mt7530.*
@@@ -11120,7 -11025,7 +11120,7 @@@ F:   net/dsa/tag_mtk.
  
  MEDIATEK USB3 DRD IP DRIVER
  M:    Chunfeng Yun <chunfeng.yun@mediatek.com>
 -L:    linux-usb@vger.kernel.org (moderated for non-subscribers)
 +L:    linux-usb@vger.kernel.org
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  L:    linux-mediatek@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
@@@ -11388,8 -11293,8 +11388,8 @@@ S:   Supporte
  W:    http://linux-meson.com/
  T:    git git://linuxtv.org/media_tree.git
  F:    Documentation/devicetree/bindings/media/amlogic,meson-gx-ao-cec.yaml
 -F:    drivers/media/platform/meson/ao-cec-g12a.c
 -F:    drivers/media/platform/meson/ao-cec.c
 +F:    drivers/media/cec/platform/meson/ao-cec-g12a.c
 +F:    drivers/media/cec/platform/meson/ao-cec.c
  
  MESON NAND CONTROLLER DRIVER FOR AMLOGIC SOCS
  M:    Liang Yang <liang.yang@amlogic.com>
@@@ -11399,6 -11304,7 +11399,6 @@@ F:   Documentation/devicetree/bindings/mt
  F:    drivers/mtd/nand/raw/meson_*
  
  MESON VIDEO DECODER DRIVER FOR AMLOGIC SOCS
 -M:    Maxime Jourdan <mjourdan@baylibre.com>
  M:    Neil Armstrong <narmstrong@baylibre.com>
  L:    linux-media@vger.kernel.org
  L:    linux-amlogic@lists.infradead.org
@@@ -11418,7 -11324,6 +11418,7 @@@ M:   Hemant Kumar <hemantk@codeaurora.org
  L:    linux-arm-msm@vger.kernel.org
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/mani/mhi.git
 +F:    Documentation/ABI/stable/sysfs-bus-mhi
  F:    Documentation/mhi/
  F:    drivers/bus/mhi/
  F:    include/linux/mhi.h
@@@ -11617,8 -11522,8 +11617,8 @@@ F:   arch/mips/configs/generic/board-ocel
  F:    arch/mips/generic/board-ocelot.c
  
  MICROSEMI SMART ARRAY SMARTPQI DRIVER (smartpqi)
 -M:    Don Brace <don.brace@microsemi.com>
 -L:    esc.storagedev@microsemi.com
 +M:    Don Brace <don.brace@microchip.com>
 +L:    storagedev@microchip.com
  L:    linux-scsi@vger.kernel.org
  S:    Supported
  F:    Documentation/scsi/smartpqi.rst
@@@ -11676,7 -11581,7 +11676,7 @@@ MIPS GENERIC PLATFOR
  M:    Paul Burton <paulburton@kernel.org>
  L:    linux-mips@vger.kernel.org
  S:    Supported
 -F:    Documentation/devicetree/bindings/power/mti,mips-cpc.txt
 +F:    Documentation/devicetree/bindings/power/mti,mips-cpc.yaml
  F:    arch/mips/generic/
  F:    arch/mips/tools/generic-board-config.sh
  
@@@ -11732,7 -11637,7 +11732,7 @@@ S:   Odd Fixe
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/lkundrak/linux-mmp.git
  F:    arch/arm/boot/dts/mmp*
  F:    arch/arm/mach-mmp/
 -F:    linux/soc/mmp/
 +F:    include/linux/soc/mmp/
  
  MMP USB PHY DRIVERS
  R:    Lubomir Rintel <lkundrak@v3.sk>
@@@ -11850,13 -11755,6 +11850,13 @@@ Q: http://patchwork.linuxtv.org/project
  T:    git git://linuxtv.org/anttip/media_tree.git
  F:    drivers/media/usb/msi2500/
  
 +MSTAR INTERRUPT CONTROLLER DRIVER
 +M:    Mark-PK Tsai <mark-pk.tsai@mediatek.com>
 +M:    Daniel Palmer <daniel@thingy.jp>
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/interrupt-controller/mstar,mst-intc.yaml
 +F:    drivers/irqchip/irq-mst-intc.c
 +
  MSYSTEMS DISKONCHIP G3 MTD DRIVER
  M:    Robert Jarzmik <robert.jarzmik@free.fr>
  L:    linux-mtd@lists.infradead.org
@@@ -12119,6 -12017,7 +12119,6 @@@ M:   Neil Horman <nhorman@tuxdriver.com
  L:    netdev@vger.kernel.org
  S:    Maintained
  W:    https://fedorahosted.org/dropwatch/
 -F:    include/net/drop_monitor.h
  F:    include/uapi/linux/net_dropmon.h
  F:    net/core/drop_monitor.c
  
@@@ -12132,7 -12031,6 +12132,7 @@@ Q:   http://patchwork.ozlabs.org/project/
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net.git
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next.git
  F:    Documentation/devicetree/bindings/net/
 +F:    drivers/connector/
  F:    drivers/net/
  F:    include/linux/etherdevice.h
  F:    include/linux/fcdevice.h
@@@ -12158,7 -12056,6 +12158,7 @@@ NETWORKING [DSA
  M:    Andrew Lunn <andrew@lunn.ch>
  M:    Vivien Didelot <vivien.didelot@gmail.com>
  M:    Florian Fainelli <f.fainelli@gmail.com>
 +M:    Vladimir Oltean <olteanv@gmail.com>
  S:    Maintained
  F:    Documentation/devicetree/bindings/net/dsa/
  F:    drivers/net/dsa/
@@@ -12213,7 -12110,6 +12213,7 @@@ F:   net/ipv6/ipcomp6.
  F:    net/ipv6/xfrm*
  F:    net/key/
  F:    net/xfrm/
 +F:    tools/testing/selftests/net/ipsec.c
  
  NETWORKING [IPv4/IPv6]
  M:    "David S. Miller" <davem@davemloft.net>
@@@ -12373,19 -12269,6 +12373,19 @@@ S: Maintaine
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/lftan/nios2.git
  F:    arch/nios2/
  
 +NITRO ENCLAVES (NE)
 +M:    Andra Paraschiv <andraprs@amazon.com>
 +M:    Alexandru Vasile <lexnv@amazon.com>
 +M:    Alexandru Ciobotaru <alcioa@amazon.com>
 +L:    linux-kernel@vger.kernel.org
 +S:    Supported
 +W:    https://aws.amazon.com/ec2/nitro/nitro-enclaves/
 +F:    Documentation/virt/ne_overview.rst
 +F:    drivers/virt/nitro_enclaves/
 +F:    include/linux/nitro_enclaves.h
 +F:    include/uapi/linux/nitro_enclaves.h
 +F:    samples/nitro_enclaves/
 +
  NOHZ, DYNTICKS SUPPORT
  M:    Frederic Weisbecker <fweisbec@gmail.com>
  M:    Thomas Gleixner <tglx@linutronix.de>
@@@ -12548,26 -12431,11 +12548,26 @@@ F:        drivers/iio/gyro/fxas21002c_core.
  F:    drivers/iio/gyro/fxas21002c_i2c.c
  F:    drivers/iio/gyro/fxas21002c_spi.c
  
 +NXP i.MX 8MQ DCSS DRIVER
 +M:    Laurentiu Palcu <laurentiu.palcu@oss.nxp.com>
 +R:    Lucas Stach <l.stach@pengutronix.de>
 +L:    dri-devel@lists.freedesktop.org
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/display/imx/nxp,imx8mq-dcss.yaml
 +F:    drivers/gpu/drm/imx/dcss/
 +
 +NXP PTN5150A CC LOGIC AND EXTCON DRIVER
 +M:    Krzysztof Kozlowski <krzk@kernel.org>
 +L:    linux-kernel@vger.kernel.org
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/extcon/extcon-ptn5150.yaml
 +F:    drivers/extcon/extcon-ptn5150.c
 +
  NXP SGTL5000 DRIVER
  M:    Fabio Estevam <festevam@gmail.com>
  L:    alsa-devel@alsa-project.org (moderated for non-subscribers)
  S:    Maintained
 -F:    Documentation/devicetree/bindings/sound/sgtl5000.txt
 +F:    Documentation/devicetree/bindings/sound/sgtl5000.yaml
  F:    sound/soc/codecs/sgtl5000*
  
  NXP SJA1105 ETHERNET SWITCH DRIVER
@@@ -12613,7 -12481,6 +12613,7 @@@ M:   Josh Poimboeuf <jpoimboe@redhat.com
  M:    Peter Zijlstra <peterz@infradead.org>
  S:    Supported
  F:    tools/objtool/
 +F:    include/linux/objtool.h
  
  OCELOT ETHERNET SWITCH DRIVER
  M:    Microchip Linux Driver Support <UNGLinuxDriver@microchip.com>
@@@ -12626,7 -12493,6 +12626,7 @@@ F:   drivers/net/dsa/ocelot/
  F:    drivers/net/ethernet/mscc/
  F:    include/soc/mscc/ocelot*
  F:    net/dsa/tag_ocelot.c
 +F:    tools/testing/selftests/drivers/net/ocelot/*
  
  OCXL (Open Coherent Accelerator Processor Interface OpenCAPI) DRIVER
  M:    Frederic Barrat <fbarrat@linux.ibm.com>
@@@ -12876,7 -12742,7 +12876,7 @@@ T:   git git://linuxtv.org/media_tree.gi
  F:    drivers/media/i2c/ov2685.c
  
  OMNIVISION OV2740 SENSOR DRIVER
 -M:    Tianshu Qiu <tian.shu.qiua@intel.com>
 +M:    Tianshu Qiu <tian.shu.qiu@intel.com>
  R:    Shawn Tu <shawnx.tu@intel.com>
  R:    Bingbu Cao <bingbu.cao@intel.com>
  L:    linux-media@vger.kernel.org
@@@ -12892,12 -12758,10 +12892,12 @@@ T:        git git://linuxtv.org/media_tree.gi
  F:    drivers/media/i2c/ov5640.c
  
  OMNIVISION OV5647 SENSOR DRIVER
 -M:    Luis Oliveira <lolivei@synopsys.com>
 +M:    Dave Stevenson <dave.stevenson@raspberrypi.com>
 +M:    Jacopo Mondi <jacopo@jmondi.org>
  L:    linux-media@vger.kernel.org
  S:    Maintained
  T:    git git://linuxtv.org/media_tree.git
 +F:    Documentation/devicetree/bindings/media/i2c/ov5647.yaml
  F:    drivers/media/i2c/ov5647.c
  
  OMNIVISION OV5670 SENSOR DRIVER
@@@ -12998,8 -12862,8 +12998,8 @@@ S:   Maintaine
  F:    drivers/char/hw_random/optee-rng.c
  
  OPA-VNIC DRIVER
 -M:    Dennis Dalessandro <dennis.dalessandro@intel.com>
 -M:    Niranjana Vishwanathapura <niranjana.vishwanathapura@intel.com>
 +M:    Dennis Dalessandro <dennis.dalessandro@cornelisnetworks.com>
 +M:    Mike Marciniszyn <mike.marciniszyn@cornelisnetworks.com>
  L:    linux-rdma@vger.kernel.org
  S:    Supported
  F:    drivers/infiniband/ulp/opa_vnic
@@@ -13160,9 -13024,7 +13160,9 @@@ F:   lib/packing.
  
  PADATA PARALLEL EXECUTION MECHANISM
  M:    Steffen Klassert <steffen.klassert@secunet.com>
 +M:    Daniel Jordan <daniel.m.jordan@oracle.com>
  L:    linux-crypto@vger.kernel.org
 +L:    linux-kernel@vger.kernel.org
  S:    Maintained
  F:    Documentation/core-api/padata.rst
  F:    include/linux/padata.h
@@@ -13299,7 -13161,6 +13299,7 @@@ F:   drivers/firmware/pcdp.
  
  PCI DRIVER FOR AARDVARK (Marvell Armada 3700)
  M:    Thomas Petazzoni <thomas.petazzoni@bootlin.com>
 +M:    Pali Rohár <pali@kernel.org>
  L:    linux-pci@vger.kernel.org
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
@@@ -13569,10 -13430,10 +13569,10 @@@ F:        Documentation/devicetree/bindings/pc
  F:    drivers/pci/controller/dwc/*artpec*
  
  PCIE DRIVER FOR CAVIUM THUNDERX
 -M:    Robert Richter <rrichter@marvell.com>
 +M:    Robert Richter <rric@kernel.org>
  L:    linux-pci@vger.kernel.org
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 -S:    Supported
 +S:    Odd Fixes
  F:    drivers/pci/controller/pci-thunder-*
  
  PCIE DRIVER FOR HISILICON
@@@ -13709,18 -13570,12 +13709,18 @@@ F:        kernel/events/
  F:    tools/lib/perf/
  F:    tools/perf/
  
 -PERFORMANCE EVENTS SUBSYSTEM ARM64 PMU EVENTS
 +PERFORMANCE EVENTS TOOLING ARM64
  R:    John Garry <john.garry@huawei.com>
  R:    Will Deacon <will@kernel.org>
 +R:    Mathieu Poirier <mathieu.poirier@linaro.org>
 +R:    Leo Yan <leo.yan@linaro.org>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Supported
 +F:    tools/build/feature/test-libopencsd.c
 +F:    tools/perf/arch/arm*/
  F:    tools/perf/pmu-events/arch/arm64/
 +F:    tools/perf/util/arm-spe*
 +F:    tools/perf/util/cs-etm*
  
  PERSONALITY HANDLING
  M:    Christoph Hellwig <hch@infradead.org>
@@@ -13834,9 -13689,10 +13834,9 @@@ PIN CONTROLLER - RENESA
  M:    Geert Uytterhoeven <geert+renesas@glider.be>
  L:    linux-renesas-soc@vger.kernel.org
  S:    Supported
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/geert/renesas-drivers.git sh-pfc
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/geert/renesas-drivers.git renesas-pinctrl
  F:    Documentation/devicetree/bindings/pinctrl/renesas,*
 -F:    drivers/pinctrl/pinctrl-rz*
 -F:    drivers/pinctrl/sh-pfc/
 +F:    drivers/pinctrl/renesas/
  
  PIN CONTROLLER - SAMSUNG
  M:    Tomasz Figa <tomasz.figa@gmail.com>
@@@ -14069,7 -13925,6 +14069,7 @@@ PRINT
  M:    Petr Mladek <pmladek@suse.com>
  M:    Sergey Senozhatsky <sergey.senozhatsky@gmail.com>
  R:    Steven Rostedt <rostedt@goodmis.org>
 +R:    John Ogness <john.ogness@linutronix.de>
  S:    Maintained
  F:    include/linux/printk.h
  F:    kernel/printk/
@@@ -14300,24 -14155,20 +14300,24 @@@ F:        drivers/firmware/qemu_fw_cfg.
  F:    include/uapi/linux/qemu_fw_cfg.h
  
  QIB DRIVER
 -M:    Dennis Dalessandro <dennis.dalessandro@intel.com>
 -M:    Mike Marciniszyn <mike.marciniszyn@intel.com>
 +M:    Dennis Dalessandro <dennis.dalessandro@cornelisnetworks.com>
 +M:    Mike Marciniszyn <mike.marciniszyn@cornelisnetworks.com>
  L:    linux-rdma@vger.kernel.org
  S:    Supported
  F:    drivers/infiniband/hw/qib/
  
  QLOGIC QL41xxx FCOE DRIVER
 -M:    QLogic-Storage-Upstream@cavium.com
 +M:    Saurav Kashyap <skashyap@marvell.com>
 +M:    Javed Hasan <jhasan@marvell.com>
 +M:    GR-QLogic-Storage-Upstream@marvell.com
  L:    linux-scsi@vger.kernel.org
  S:    Supported
  F:    drivers/scsi/qedf/
  
  QLOGIC QL41xxx ISCSI DRIVER
 -M:    QLogic-Storage-Upstream@cavium.com
 +M:    Nilesh Javali <njavali@marvell.com>
 +M:    Manish Rangankar <mrangankar@marvell.com>
 +M:    GR-QLogic-Storage-Upstream@marvell.com
  L:    linux-scsi@vger.kernel.org
  S:    Supported
  F:    drivers/scsi/qedi/
@@@ -14350,20 -14201,21 +14350,20 @@@ M:        Nilesh Javali <njavali@marvell.com
  M:    GR-QLogic-Storage-Upstream@marvell.com
  L:    linux-scsi@vger.kernel.org
  S:    Supported
 -F:    Documentation/scsi/LICENSE.qla2xxx
  F:    drivers/scsi/qla2xxx/
  
  QLOGIC QLA3XXX NETWORK DRIVER
  M:    GR-Linux-NIC-Dev@marvell.com
  L:    netdev@vger.kernel.org
  S:    Supported
 -F:    Documentation/networking/device_drivers/ethernet/qlogic/LICENSE.qla3xxx
  F:    drivers/net/ethernet/qlogic/qla3xxx.*
  
  QLOGIC QLA4XXX iSCSI DRIVER
 -M:    QLogic-Storage-Upstream@qlogic.com
 +M:    Nilesh Javali <njavali@marvell.com>
 +M:    Manish Rangankar <mrangankar@marvell.com>
 +M:    GR-QLogic-Storage-Upstream@marvell.com
  L:    linux-scsi@vger.kernel.org
  S:    Supported
 -F:    Documentation/scsi/LICENSE.qla4xxx
  F:    drivers/scsi/qla4xxx/
  
  QLOGIC QLCNIC (1/10)Gb ETHERNET DRIVER
@@@ -14514,7 -14366,7 +14514,7 @@@ M:   Rob Clark <robdclark@gmail.com
  L:    iommu@lists.linux-foundation.org
  L:    linux-arm-msm@vger.kernel.org
  S:    Maintained
 -F:    drivers/iommu/qcom_iommu.c
 +F:    drivers/iommu/arm/arm-smmu/qcom_iommu.c
  
  QUALCOMM IPCC MAILBOX DRIVER
  M:    Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
@@@ -14711,9 -14563,9 +14711,9 @@@ M:   Niklas Söderlund <niklas.soderlund+
  L:    linux-media@vger.kernel.org
  S:    Maintained
  F:    Documentation/devicetree/bindings/media/i2c/imi,rdacm2x-gmsl.yaml
 -F:    drivers/media/i2c/rdacm20.c
  F:    drivers/media/i2c/max9271.c
  F:    drivers/media/i2c/max9271.h
 +F:    drivers/media/i2c/rdacm20.c
  
  RDC R-321X SoC
  M:    Florian Fainelli <florian@openwrt.org>
@@@ -14726,8 -14578,8 +14726,8 @@@ S:   Maintaine
  F:    drivers/net/ethernet/rdc/r6040.c
  
  RDMAVT - RDMA verbs software
 -M:    Dennis Dalessandro <dennis.dalessandro@intel.com>
 -M:    Mike Marciniszyn <mike.marciniszyn@intel.com>
 +M:    Dennis Dalessandro <dennis.dalessandro@cornelisnetworks.com>
 +M:    Mike Marciniszyn <mike.marciniszyn@cornelisnetworks.com>
  L:    linux-rdma@vger.kernel.org
  S:    Supported
  F:    drivers/infiniband/sw/rdmavt
@@@ -15007,11 -14859,8 +15007,11 @@@ F: include/linux/hid-roccat
  
  ROCKCHIP ISP V1 DRIVER
  M:    Helen Koike <helen.koike@collabora.com>
 +M:    Dafna Hirschfeld <dafna.hirschfeld@collabora.com>
  L:    linux-media@vger.kernel.org
  S:    Maintained
 +F:    Documentation/admin-guide/media/rkisp1.rst
 +F:    Documentation/userspace-api/media/v4l/pixfmt-meta-rkisp1.rst
  F:    drivers/staging/media/rkisp1/
  
  ROCKCHIP RASTER 2D GRAPHIC ACCELERATION UNIT DRIVER
@@@ -15402,11 -15251,10 +15402,11 @@@ F:        drivers/media/platform/s3c-camif
  F:    include/media/drv-intf/s3c_camif.h
  
  SAMSUNG S3FWRN5 NFC DRIVER
 -M:    Robert Baldyga <r.baldyga@samsung.com>
 +M:    Krzysztof Kozlowski <krzk@kernel.org>
  M:    Krzysztof Opasiak <k.opasiak@samsung.com>
  L:    linux-nfc@lists.01.org (moderated for non-subscribers)
 -S:    Supported
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/net/nfc/samsung,s3fwrn5.yaml
  F:    drivers/nfc/s3fwrn5
  
  SAMSUNG S5C73M3 CAMERA DRIVER
@@@ -15508,7 -15356,6 +15508,7 @@@ R:   Dietmar Eggemann <dietmar.eggemann@a
  R:    Steven Rostedt <rostedt@goodmis.org> (SCHED_FIFO/SCHED_RR)
  R:    Ben Segall <bsegall@google.com> (CONFIG_CFS_BANDWIDTH)
  R:    Mel Gorman <mgorman@suse.de> (CONFIG_NUMA_BALANCING)
 +R:    Daniel Bristot de Oliveira <bristot@redhat.com> (SCHED_DEADLINE)
  L:    linux-kernel@vger.kernel.org
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git sched/core
@@@ -15630,8 -15477,8 +15630,8 @@@ F:   drivers/mmc/host/sdricoh_cs.
  SECO BOARDS CEC DRIVER
  M:    Ettore Chimenti <ek5.chimenti@gmail.com>
  S:    Maintained
 -F:    drivers/media/platform/seco-cec/seco-cec.c
 -F:    drivers/media/platform/seco-cec/seco-cec.h
 +F:    drivers/media/cec/platform/seco/seco-cec.c
 +F:    drivers/media/cec/platform/seco/seco-cec.h
  
  SECURE COMPUTING
  M:    Kees Cook <keescook@chromium.org>
@@@ -15700,7 -15547,6 +15700,7 @@@ F:   include/uapi/linux/sed
  SECURITY CONTACT
  M:    Security Officers <security@kernel.org>
  S:    Supported
 +F:    Documentation/admin-guide/security-bugs.rst
  
  SECURITY SUBSYSTEM
  M:    James Morris <jmorris@namei.org>
@@@ -15724,7 -15570,6 +15724,7 @@@ T:   git git://git.kernel.org/pub/scm/lin
  F:    Documentation/ABI/obsolete/sysfs-selinux-checkreqprot
  F:    Documentation/ABI/obsolete/sysfs-selinux-disable
  F:    Documentation/admin-guide/LSM/SELinux.rst
 +F:    include/trace/events/avc.h
  F:    include/uapi/linux/selinux_netlink.h
  F:    scripts/selinux/
  F:    security/selinux/
@@@ -15793,7 -15638,6 +15793,7 @@@ L:   netdev@vger.kernel.or
  S:    Maintained
  F:    drivers/net/phy/phylink.c
  F:    drivers/net/phy/sfp*
 +F:    include/linux/mdio/mdio-i2c.h
  F:    include/linux/phylink.h
  F:    include/linux/sfp.h
  K:    phylink\.h|struct\s+phylink|\.phylink|>phylink_|phylink_(autoneg|clear|connect|create|destroy|disconnect|ethtool|helper|mac|mii|of|set|start|stop|test|validate)
@@@ -16200,6 -16044,7 +16200,6 @@@ F:   include/uapi/rdma/rdma_user_rxe.
  SOFTLOGIC 6x10 MPEG CODEC
  M:    Bluecherry Maintainers <maintainers@bluecherrydvr.com>
  M:    Anton Sviridenko <anton@corp.bluecherry.net>
 -M:    Andrey Utkin <andrey.utkin@corp.bluecherry.net>
  M:    Andrey Utkin <andrey_utkin@fastmail.com>
  M:    Ismael Luceno <ismael@iodev.co.uk>
  L:    linux-media@vger.kernel.org
@@@ -16281,7 -16126,7 +16281,7 @@@ M:   Leon Luo <leonl@leopardimaging.com
  L:    linux-media@vger.kernel.org
  S:    Maintained
  T:    git git://linuxtv.org/media_tree.git
 -F:    Documentation/devicetree/bindings/media/i2c/imx274.txt
 +F:    Documentation/devicetree/bindings/media/i2c/sony,imx274.yaml
  F:    drivers/media/i2c/imx274.c
  
  SONY IMX290 SENSOR DRIVER
@@@ -16619,6 -16464,7 +16619,6 @@@ F:   drivers/staging/rtl8712
  
  STAGING - SEPS525 LCD CONTROLLER DRIVERS
  M:    Michael Hennerich <michael.hennerich@analog.com>
 -M:    Beniamin Bia <beniamin.bia@analog.com>
  L:    linux-fbdev@vger.kernel.org
  S:    Supported
  F:    Documentation/devicetree/bindings/iio/adc/adi,ad7606.yaml
@@@ -16666,7 -16512,7 +16666,7 @@@ STI CEC DRIVE
  M:    Benjamin Gaignard <benjamin.gaignard@linaro.org>
  S:    Maintained
  F:    Documentation/devicetree/bindings/media/stih-cec.txt
 -F:    drivers/media/platform/sti/cec/
 +F:    drivers/media/cec/platform/sti/
  
  STK1160 USB VIDEO CAPTURE DRIVER
  M:    Ezequiel Garcia <ezequiel@vanguardiasur.com.ar>
@@@ -16850,13 -16696,6 +16850,13 @@@ S: Maintaine
  F:    Documentation/devicetree/bindings/gpio/snps,dw-apb-gpio.yaml
  F:    drivers/gpio/gpio-dwapb.c
  
 +SYNOPSYS DESIGNWARE APB SSI DRIVER
 +M:    Serge Semin <fancer.lancer@gmail.com>
 +L:    linux-spi@vger.kernel.org
 +S:    Supported
 +F:    Documentation/devicetree/bindings/spi/snps,dw-apb-ssi.yaml
 +F:    drivers/spi/spi-dw*
 +
  SYNOPSYS DESIGNWARE AXI DMAC DRIVER
  M:    Eugeniy Paltsev <Eugeniy.Paltsev@synopsys.com>
  S:    Maintained
@@@ -16867,7 -16706,7 +16867,7 @@@ SYNOPSYS DESIGNWARE DMAC DRIVE
  M:    Viresh Kumar <vireshk@kernel.org>
  R:    Andy Shevchenko <andriy.shevchenko@linux.intel.com>
  S:    Maintained
 -F:    Documentation/devicetree/bindings/dma/snps-dma.txt
 +F:    Documentation/devicetree/bindings/dma/snps,dma-spear1340.yaml
  F:    drivers/dma/dw/
  F:    include/dt-bindings/dma/dw-dmac.h
  F:    include/linux/dma/dw.h
@@@ -16883,8 -16722,8 +16883,8 @@@ SYNOPSYS DESIGNWARE ETHERNET XPCS DRIVE
  M:    Jose Abreu <Jose.Abreu@synopsys.com>
  L:    netdev@vger.kernel.org
  S:    Supported
 -F:    drivers/net/phy/mdio-xpcs.c
 -F:    include/linux/mdio-xpcs.h
 +F:    drivers/net/pcs/pcs-xpcs.c
 +F:    include/linux/pcs/pcs-xpcs.h
  
  SYNOPSYS DESIGNWARE I2C DRIVER
  M:    Jarkko Nikula <jarkko.nikula@linux.intel.com>
@@@ -17376,8 -17215,8 +17376,8 @@@ S:   Maintaine
  F:    drivers/net/thunderbolt.c
  
  THUNDERX GPIO DRIVER
 -M:    Robert Richter <rrichter@marvell.com>
 -S:    Maintained
 +M:    Robert Richter <rric@kernel.org>
 +S:    Odd Fixes
  F:    drivers/gpio/gpio-thunderx.c
  
  TI AM437X VPFE DRIVER
@@@ -17672,9 -17511,8 +17672,9 @@@ S:   Supporte
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/paulmck/linux-rcu.git dev
  F:    Documentation/RCU/torture.rst
  F:    kernel/locking/locktorture.c
 -F:    kernel/rcu/rcuperf.c
 +F:    kernel/rcu/rcuscale.c
  F:    kernel/rcu/rcutorture.c
 +F:    kernel/rcu/refscale.c
  F:    kernel/torture.c
  
  TOSHIBA ACPI EXTRAS DRIVER
@@@ -17718,13 -17556,13 +17718,13 @@@ F:        drivers/platform/x86/toshiba-wmi.
  
  TPM DEVICE DRIVER
  M:    Peter Huewe <peterhuewe@gmx.de>
 -M:    Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
 +M:    Jarkko Sakkinen <jarkko@kernel.org>
  R:    Jason Gunthorpe <jgg@ziepe.ca>
  L:    linux-integrity@vger.kernel.org
  S:    Maintained
  W:    https://kernsec.org/wiki/index.php/Linux_Kernel_Integrity
  Q:    https://patchwork.kernel.org/project/linux-integrity/list/
 -T:    git git://git.infradead.org/users/jjs/linux-tpmdd.git
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/jarkko/linux-tpmdd.git
  F:    drivers/char/tpm/
  
  TRACING
@@@ -17861,7 -17699,6 +17861,7 @@@ S:   Supporte
  W:    http://www.linux-mtd.infradead.org/doc/ubifs.html
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/rw/ubifs.git next
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/rw/ubifs.git fixes
 +F:    Documentation/filesystems/ubifs-authentication.rst
  F:    Documentation/filesystems/ubifs.rst
  F:    fs/ubifs/
  
@@@ -18255,6 -18092,14 +18255,6 @@@ T:  git git://linuxtv.org/media_tree.gi
  F:    drivers/media/usb/uvc/
  F:    include/uapi/linux/uvcvideo.h
  
 -USB VISION DRIVER
 -M:    Hans Verkuil <hverkuil@xs4all.nl>
 -L:    linux-media@vger.kernel.org
 -S:    Odd Fixes
 -W:    https://linuxtv.org
 -T:    git git://linuxtv.org/media_tree.git
 -F:    drivers/staging/media/usbvision/
 -
  USB WEBCAM GADGET
  M:    Laurent Pinchart <laurent.pinchart@ideasonboard.com>
  L:    linux-usb@vger.kernel.org
@@@ -18408,8 -18253,7 +18408,8 @@@ F:   drivers/gpu/vga/vga_switcheroo.
  F:    include/linux/vga_switcheroo.h
  
  VIA RHINE NETWORK DRIVER
 -S:    Orphan
 +S:    Maintained
 +M:    Kevin Brace <kevinbrace@bracecomputerlab.com>
  F:    drivers/net/ethernet/via/via-rhine.c
  
  VIA SD/MMC CARD CONTROLLER DRIVER
@@@ -18454,8 -18298,10 +18454,8 @@@ S:  Maintaine
  F:    drivers/media/platform/video-mux.c
  
  VIDEOBUF2 FRAMEWORK
 -M:    Pawel Osciak <pawel@osciak.com>
 +M:    Tomasz Figa <tfiga@chromium.org>
  M:    Marek Szyprowski <m.szyprowski@samsung.com>
 -M:    Kyungmin Park <kyungmin.park@samsung.com>
 -R:    Tomasz Figa <tfiga@chromium.org>
  L:    linux-media@vger.kernel.org
  S:    Maintained
  F:    drivers/media/common/videobuf2/*
@@@ -18645,14 -18491,6 +18645,14 @@@ W: https://linuxtv.or
  T:    git git://linuxtv.org/media_tree.git
  F:    drivers/media/test-drivers/vivid/*
  
 +VIDTV VIRTUAL DIGITAL TV DRIVER
 +M:    Daniel W. S. Almeida <dwlsalmeida@gmail.com>
 +L:    linux-media@vger.kernel.org
 +S:    Maintained
 +W:    https://linuxtv.org
 +T:    git git://linuxtv.org/media_tree.git
 +F:    drivers/media/test-drivers/vidtv/*
 +
  VLYNQ BUS
  M:    Florian Fainelli <f.fainelli@gmail.com>
  L:    openwrt-devel@lists.openwrt.org (subscribers-only)
@@@ -19020,11 -18858,11 +19020,11 @@@ T:        git git://git.kernel.org/pub/scm/lin
  F:    arch/x86/mm/
  
  X86 PLATFORM DRIVERS
 -M:    Darren Hart <dvhart@infradead.org>
 -M:    Andy Shevchenko <andy@infradead.org>
 +M:    Hans de Goede <hdegoede@redhat.com>
 +M:    Mark Gross <mgross@linux.intel.com>
  L:    platform-driver-x86@vger.kernel.org
 -S:    Odd Fixes
 -T:    git git://git.infradead.org/linux-platform-drivers-x86.git
 +S:    Maintained
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/pdx86/platform-drivers-x86.git
  F:    drivers/platform/olpc/
  F:    drivers/platform/x86/
  
@@@ -19373,16 -19211,6 +19373,16 @@@ T: git git://git.kernel.org/pub/scm/lin
  F:    Documentation/filesystems/zonefs.rst
  F:    fs/zonefs/
  
 +ZR36067 VIDEO FOR LINUX DRIVER
 +M:    Corentin Labbe <clabbe@baylibre.com>
 +L:    mjpeg-users@lists.sourceforge.net
 +L:    linux-media@vger.kernel.org
 +S:    Maintained
 +W:    http://mjpeg.sourceforge.net/driver-zoran/
 +Q:    https://patchwork.linuxtv.org/project/linux-media/list/
 +F:    Documentation/driver-api/media/drivers/zoran.rst
 +F:    drivers/staging/media/zoran/
 +
  ZPOOL COMPRESSED PAGE STORAGE API
  M:    Dan Streetman <ddstreet@ieee.org>
  L:    linux-mm@kvack.org
diff --combined drivers/dax/super.c
@@@ -46,7 -46,8 +46,8 @@@ EXPORT_SYMBOL_GPL(dax_read_unlock)
  int bdev_dax_pgoff(struct block_device *bdev, sector_t sector, size_t size,
                pgoff_t *pgoff)
  {
-       phys_addr_t phys_off = (get_start_sect(bdev) + sector) * 512;
+       sector_t start_sect = bdev ? get_start_sect(bdev) : 0;
+       phys_addr_t phys_off = (start_sect + sector) * 512;
  
        if (pgoff)
                *pgoff = PHYS_PFN(phys_off);
@@@ -85,12 -86,6 +86,12 @@@ bool __generic_fsdax_supported(struct d
                return false;
        }
  
 +      if (!dax_dev) {
 +              pr_debug("%s: error: dax unsupported by block device\n",
 +                              bdevname(bdev, buf));
 +              return false;
 +      }
 +
        err = bdev_dax_pgoff(bdev, start, PAGE_SIZE, &pgoff);
        if (err) {
                pr_info("%s: error: unaligned partition for dax\n",
                return false;
        }
  
 -      if (!dax_dev && !bdev_dax_supported(bdev, blocksize)) {
 -              pr_debug("%s: error: dax unsupported by block device\n",
 -                              bdevname(bdev, buf));
 -              return false;
 -      }
 -
        id = dax_read_lock();
        len = dax_direct_access(dax_dev, pgoff, 1, &kaddr, &pfn);
        len2 = dax_direct_access(dax_dev, pgoff_end, 1, &end_kaddr, &end_pfn);
@@@ -325,15 -326,11 +326,15 @@@ EXPORT_SYMBOL_GPL(dax_direct_access)
  bool dax_supported(struct dax_device *dax_dev, struct block_device *bdev,
                int blocksize, sector_t start, sector_t len)
  {
 +      if (!dax_dev)
 +              return false;
 +
        if (!dax_alive(dax_dev))
                return false;
  
        return dax_dev->ops->dax_supported(dax_dev, bdev, blocksize, start, len);
  }
 +EXPORT_SYMBOL_GPL(dax_supported);
  
  size_t dax_copy_from_iter(struct dax_device *dax_dev, pgoff_t pgoff, void *addr,
                size_t bytes, struct iov_iter *i)
diff --combined fs/dax.c
+++ b/fs/dax.c
@@@ -559,8 -559,11 +559,11 @@@ fallback
  }
  
  /**
-  * dax_layout_busy_page - find first pinned page in @mapping
+  * dax_layout_busy_page_range - find first pinned page in @mapping
   * @mapping: address space to scan for a page with ref count > 1
+  * @start: Starting offset. Page containing 'start' is included.
+  * @end: End offset. Page containing 'end' is included. If 'end' is LLONG_MAX,
+  *       pages from 'start' till the end of file are included.
   *
   * DAX requires ZONE_DEVICE mapped pages. These pages are never
   * 'onlined' to the page allocator so they are considered idle when
   * to be able to run unmap_mapping_range() and subsequently not race
   * mapping_mapped() becoming true.
   */
- struct page *dax_layout_busy_page(struct address_space *mapping)
+ struct page *dax_layout_busy_page_range(struct address_space *mapping,
+                                       loff_t start, loff_t end)
  {
-       XA_STATE(xas, &mapping->i_pages, 0);
        void *entry;
        unsigned int scanned = 0;
        struct page *page = NULL;
+       pgoff_t start_idx = start >> PAGE_SHIFT;
+       pgoff_t end_idx;
+       XA_STATE(xas, &mapping->i_pages, start_idx);
  
        /*
         * In the 'limited' case get_user_pages() for dax is disabled.
        if (!dax_mapping(mapping) || !mapping_mapped(mapping))
                return NULL;
  
+       /* If end == LLONG_MAX, all pages from start to till end of file */
+       if (end == LLONG_MAX)
+               end_idx = ULONG_MAX;
+       else
+               end_idx = end >> PAGE_SHIFT;
        /*
         * If we race get_user_pages_fast() here either we'll see the
         * elevated page count in the iteration and wait, or
         * against is no longer mapped in the page tables and bail to the
         * get_user_pages() slow path.  The slow path is protected by
         * pte_lock() and pmd_lock(). New references are not taken without
-        * holding those locks, and unmap_mapping_range() will not zero the
+        * holding those locks, and unmap_mapping_pages() will not zero the
         * pte or pmd without holding the respective lock, so we are
         * guaranteed to either see new references or prevent new
         * references from being established.
         */
-       unmap_mapping_range(mapping, 0, 0, 0);
+       unmap_mapping_pages(mapping, start_idx, end_idx - start_idx + 1, 0);
  
        xas_lock_irq(&xas);
-       xas_for_each(&xas, entry, ULONG_MAX) {
+       xas_for_each(&xas, entry, end_idx) {
                if (WARN_ON_ONCE(!xa_is_value(entry)))
                        continue;
                if (unlikely(dax_is_locked(entry)))
        xas_unlock_irq(&xas);
        return page;
  }
+ EXPORT_SYMBOL_GPL(dax_layout_busy_page_range);
+ struct page *dax_layout_busy_page(struct address_space *mapping)
+ {
+       return dax_layout_busy_page_range(mapping, 0, LLONG_MAX);
+ }
  EXPORT_SYMBOL_GPL(dax_layout_busy_page);
  
  static int __dax_invalidate_entry(struct address_space *mapping,
@@@ -1037,18 -1054,18 +1054,18 @@@ static vm_fault_t dax_load_hole(struct 
        return ret;
  }
  
 -int dax_iomap_zero(loff_t pos, unsigned offset, unsigned size,
 -                 struct iomap *iomap)
 +s64 dax_iomap_zero(loff_t pos, u64 length, struct iomap *iomap)
  {
        sector_t sector = iomap_sector(iomap, pos & PAGE_MASK);
        pgoff_t pgoff;
        long rc, id;
        void *kaddr;
        bool page_aligned = false;
 -
 +      unsigned offset = offset_in_page(pos);
 +      unsigned size = min_t(u64, PAGE_SIZE - offset, length);
  
        if (IS_ALIGNED(sector << SECTOR_SHIFT, PAGE_SIZE) &&
 -          IS_ALIGNED(size, PAGE_SIZE))
 +          (size == PAGE_SIZE))
                page_aligned = true;
  
        rc = bdev_dax_pgoff(iomap->bdev, sector, PAGE_SIZE, &pgoff);
        id = dax_read_lock();
  
        if (page_aligned)
 -              rc = dax_zero_page_range(iomap->dax_dev, pgoff,
 -                                       size >> PAGE_SHIFT);
 +              rc = dax_zero_page_range(iomap->dax_dev, pgoff, 1);
        else
                rc = dax_direct_access(iomap->dax_dev, pgoff, 1, &kaddr, NULL);
        if (rc < 0) {
                dax_flush(iomap->dax_dev, kaddr + offset, size);
        }
        dax_read_unlock(id);
 -      return 0;
 +      return size;
  }
  
  static loff_t
diff --combined fs/fuse/file.c
@@@ -32,7 -32,7 +32,7 @@@ static struct page **fuse_pages_alloc(u
        return pages;
  }
  
- static int fuse_send_open(struct fuse_conn *fc, u64 nodeid, struct file *file,
+ static int fuse_send_open(struct fuse_mount *fm, u64 nodeid, struct file *file,
                          int opcode, struct fuse_open_out *outargp)
  {
        struct fuse_open_in inarg;
@@@ -40,7 -40,7 +40,7 @@@
  
        memset(&inarg, 0, sizeof(inarg));
        inarg.flags = file->f_flags & ~(O_CREAT | O_EXCL | O_NOCTTY);
-       if (!fc->atomic_o_trunc)
+       if (!fm->fc->atomic_o_trunc)
                inarg.flags &= ~O_TRUNC;
        args.opcode = opcode;
        args.nodeid = nodeid;
@@@ -51,7 -51,7 +51,7 @@@
        args.out_args[0].size = sizeof(*outargp);
        args.out_args[0].value = outargp;
  
-       return fuse_simple_request(fc, &args);
+       return fuse_simple_request(fm, &args);
  }
  
  struct fuse_release_args {
@@@ -60,7 -60,7 +60,7 @@@
        struct inode *inode;
  };
  
- struct fuse_file *fuse_file_alloc(struct fuse_conn *fc)
+ struct fuse_file *fuse_file_alloc(struct fuse_mount *fm)
  {
        struct fuse_file *ff;
  
@@@ -68,7 -68,7 +68,7 @@@
        if (unlikely(!ff))
                return NULL;
  
-       ff->fc = fc;
+       ff->fm = fm;
        ff->release_args = kzalloc(sizeof(*ff->release_args),
                                   GFP_KERNEL_ACCOUNT);
        if (!ff->release_args) {
@@@ -82,7 -82,7 +82,7 @@@
        RB_CLEAR_NODE(&ff->polled_node);
        init_waitqueue_head(&ff->poll_wait);
  
-       ff->kh = atomic64_inc_return(&fc->khctr);
+       ff->kh = atomic64_inc_return(&fm->fc->khctr);
  
        return ff;
  }
@@@ -100,7 -100,7 +100,7 @@@ static struct fuse_file *fuse_file_get(
        return ff;
  }
  
- static void fuse_release_end(struct fuse_conn *fc, struct fuse_args *args,
+ static void fuse_release_end(struct fuse_mount *fm, struct fuse_args *args,
                             int error)
  {
        struct fuse_release_args *ra = container_of(args, typeof(*ra), args);
@@@ -114,29 -114,30 +114,30 @@@ static void fuse_file_put(struct fuse_f
        if (refcount_dec_and_test(&ff->count)) {
                struct fuse_args *args = &ff->release_args->args;
  
-               if (isdir ? ff->fc->no_opendir : ff->fc->no_open) {
+               if (isdir ? ff->fm->fc->no_opendir : ff->fm->fc->no_open) {
                        /* Do nothing when client does not implement 'open' */
-                       fuse_release_end(ff->fc, args, 0);
+                       fuse_release_end(ff->fm, args, 0);
                } else if (sync) {
-                       fuse_simple_request(ff->fc, args);
-                       fuse_release_end(ff->fc, args, 0);
+                       fuse_simple_request(ff->fm, args);
+                       fuse_release_end(ff->fm, args, 0);
                } else {
                        args->end = fuse_release_end;
-                       if (fuse_simple_background(ff->fc, args,
+                       if (fuse_simple_background(ff->fm, args,
                                                   GFP_KERNEL | __GFP_NOFAIL))
-                               fuse_release_end(ff->fc, args, -ENOTCONN);
+                               fuse_release_end(ff->fm, args, -ENOTCONN);
                }
                kfree(ff);
        }
  }
  
- int fuse_do_open(struct fuse_conn *fc, u64 nodeid, struct file *file,
+ int fuse_do_open(struct fuse_mount *fm, u64 nodeid, struct file *file,
                 bool isdir)
  {
+       struct fuse_conn *fc = fm->fc;
        struct fuse_file *ff;
        int opcode = isdir ? FUSE_OPENDIR : FUSE_OPEN;
  
-       ff = fuse_file_alloc(fc);
+       ff = fuse_file_alloc(fm);
        if (!ff)
                return -ENOMEM;
  
                struct fuse_open_out outarg;
                int err;
  
-               err = fuse_send_open(fc, nodeid, file, opcode, &outarg);
+               err = fuse_send_open(fm, nodeid, file, opcode, &outarg);
                if (!err) {
                        ff->fh = outarg.fh;
                        ff->open_flags = outarg.open_flags;
@@@ -216,27 -217,40 +217,40 @@@ void fuse_finish_open(struct inode *ino
  
  int fuse_open_common(struct inode *inode, struct file *file, bool isdir)
  {
-       struct fuse_conn *fc = get_fuse_conn(inode);
+       struct fuse_mount *fm = get_fuse_mount(inode);
+       struct fuse_conn *fc = fm->fc;
        int err;
        bool is_wb_truncate = (file->f_flags & O_TRUNC) &&
                          fc->atomic_o_trunc &&
                          fc->writeback_cache;
+       bool dax_truncate = (file->f_flags & O_TRUNC) &&
+                         fc->atomic_o_trunc && FUSE_IS_DAX(inode);
  
        err = generic_file_open(inode, file);
        if (err)
                return err;
  
-       if (is_wb_truncate) {
+       if (is_wb_truncate || dax_truncate) {
                inode_lock(inode);
                fuse_set_nowrite(inode);
        }
  
-       err = fuse_do_open(fc, get_node_id(inode), file, isdir);
+       if (dax_truncate) {
+               down_write(&get_fuse_inode(inode)->i_mmap_sem);
+               err = fuse_dax_break_layouts(inode, 0, 0);
+               if (err)
+                       goto out;
+       }
  
+       err = fuse_do_open(fm, get_node_id(inode), file, isdir);
        if (!err)
                fuse_finish_open(inode, file);
  
-       if (is_wb_truncate) {
+ out:
+       if (dax_truncate)
+               up_write(&get_fuse_inode(inode)->i_mmap_sem);
+       if (is_wb_truncate | dax_truncate) {
                fuse_release_nowrite(inode);
                inode_unlock(inode);
        }
  static void fuse_prepare_release(struct fuse_inode *fi, struct fuse_file *ff,
                                 int flags, int opcode)
  {
-       struct fuse_conn *fc = ff->fc;
+       struct fuse_conn *fc = ff->fm->fc;
        struct fuse_release_args *ra = ff->release_args;
  
        /* Inode is NULL on error path of fuse_create_open() */
@@@ -285,7 -299,7 +299,7 @@@ void fuse_release_common(struct file *f
  
        if (ff->flock) {
                ra->inarg.release_flags |= FUSE_RELEASE_FLOCK_UNLOCK;
-               ra->inarg.lock_owner = fuse_lock_owner_id(ff->fc,
+               ra->inarg.lock_owner = fuse_lock_owner_id(ff->fm->fc,
                                                          (fl_owner_t) file);
        }
        /* Hold inode until release is finished */
         * synchronous RELEASE is allowed (and desirable) in this case
         * because the server can be trusted not to screw up.
         */
-       fuse_file_put(ff, ff->fc->destroy, isdir);
+       fuse_file_put(ff, ff->fm->fc->destroy, isdir);
  }
  
  static int fuse_open(struct inode *inode, struct file *file)
@@@ -443,7 -457,7 +457,7 @@@ static void fuse_sync_writes(struct ino
  static int fuse_flush(struct file *file, fl_owner_t id)
  {
        struct inode *inode = file_inode(file);
-       struct fuse_conn *fc = get_fuse_conn(inode);
+       struct fuse_mount *fm = get_fuse_mount(inode);
        struct fuse_file *ff = file->private_data;
        struct fuse_flush_in inarg;
        FUSE_ARGS(args);
                return err;
  
        err = 0;
-       if (fc->no_flush)
+       if (fm->fc->no_flush)
                goto inval_attr_out;
  
        memset(&inarg, 0, sizeof(inarg));
        inarg.fh = ff->fh;
-       inarg.lock_owner = fuse_lock_owner_id(fc, id);
+       inarg.lock_owner = fuse_lock_owner_id(fm->fc, id);
        args.opcode = FUSE_FLUSH;
        args.nodeid = get_node_id(inode);
        args.in_numargs = 1;
        args.in_args[0].value = &inarg;
        args.force = true;
  
-       err = fuse_simple_request(fc, &args);
+       err = fuse_simple_request(fm, &args);
        if (err == -ENOSYS) {
-               fc->no_flush = 1;
+               fm->fc->no_flush = 1;
                err = 0;
        }
  
@@@ -489,7 -503,7 +503,7 @@@ inval_attr_out
         * In memory i_blocks is not maintained by fuse, if writeback cache is
         * enabled, i_blocks from cached attr may not be accurate.
         */
-       if (!err && fc->writeback_cache)
+       if (!err && fm->fc->writeback_cache)
                fuse_invalidate_attr(inode);
        return err;
  }
@@@ -498,7 -512,7 +512,7 @@@ int fuse_fsync_common(struct file *file
                      int datasync, int opcode)
  {
        struct inode *inode = file->f_mapping->host;
-       struct fuse_conn *fc = get_fuse_conn(inode);
+       struct fuse_mount *fm = get_fuse_mount(inode);
        struct fuse_file *ff = file->private_data;
        FUSE_ARGS(args);
        struct fuse_fsync_in inarg;
        args.in_numargs = 1;
        args.in_args[0].size = sizeof(inarg);
        args.in_args[0].value = &inarg;
-       return fuse_simple_request(fc, &args);
+       return fuse_simple_request(fm, &args);
  }
  
  static int fuse_fsync(struct file *file, loff_t start, loff_t end,
@@@ -686,7 -700,7 +700,7 @@@ static void fuse_io_free(struct fuse_io
        kfree(ia);
  }
  
- static void fuse_aio_complete_req(struct fuse_conn *fc, struct fuse_args *args,
+ static void fuse_aio_complete_req(struct fuse_mount *fm, struct fuse_args *args,
                                  int err)
  {
        struct fuse_io_args *ia = container_of(args, typeof(*ia), ap.args);
        fuse_io_free(ia);
  }
  
- static ssize_t fuse_async_req_send(struct fuse_conn *fc,
+ static ssize_t fuse_async_req_send(struct fuse_mount *fm,
                                   struct fuse_io_args *ia, size_t num_bytes)
  {
        ssize_t err;
  
        ia->ap.args.end = fuse_aio_complete_req;
        ia->ap.args.may_block = io->should_dirty;
-       err = fuse_simple_background(fc, &ia->ap.args, GFP_KERNEL);
+       err = fuse_simple_background(fm, &ia->ap.args, GFP_KERNEL);
        if (err)
-               fuse_aio_complete_req(fc, &ia->ap.args, err);
+               fuse_aio_complete_req(fm, &ia->ap.args, err);
  
        return num_bytes;
  }
@@@ -741,18 -755,18 +755,18 @@@ static ssize_t fuse_send_read(struct fu
  {
        struct file *file = ia->io->iocb->ki_filp;
        struct fuse_file *ff = file->private_data;
-       struct fuse_conn *fc = ff->fc;
+       struct fuse_mount *fm = ff->fm;
  
        fuse_read_args_fill(ia, file, pos, count, FUSE_READ);
        if (owner != NULL) {
                ia->read.in.read_flags |= FUSE_READ_LOCKOWNER;
-               ia->read.in.lock_owner = fuse_lock_owner_id(fc, owner);
+               ia->read.in.lock_owner = fuse_lock_owner_id(fm->fc, owner);
        }
  
        if (ia->io->async)
-               return fuse_async_req_send(fc, ia, count);
+               return fuse_async_req_send(fm, ia, count);
  
-       return fuse_simple_request(fc, &ia->ap.args);
+       return fuse_simple_request(fm, &ia->ap.args);
  }
  
  static void fuse_read_update_size(struct inode *inode, loff_t size,
@@@ -798,7 -812,7 +812,7 @@@ static void fuse_short_read(struct inod
  static int fuse_do_readpage(struct file *file, struct page *page)
  {
        struct inode *inode = page->mapping->host;
-       struct fuse_conn *fc = get_fuse_conn(inode);
+       struct fuse_mount *fm = get_fuse_mount(inode);
        loff_t pos = page_offset(page);
        struct fuse_page_desc desc = { .length = PAGE_SIZE };
        struct fuse_io_args ia = {
         */
        fuse_wait_on_page_writeback(inode, page->index);
  
-       attr_ver = fuse_get_attr_version(fc);
+       attr_ver = fuse_get_attr_version(fm->fc);
  
        /* Don't overflow end offset */
        if (pos + (desc.length - 1) == LLONG_MAX)
                desc.length--;
  
        fuse_read_args_fill(&ia, file, pos, desc.length, FUSE_READ);
-       res = fuse_simple_request(fc, &ia.ap.args);
+       res = fuse_simple_request(fm, &ia.ap.args);
        if (res < 0)
                return res;
        /*
@@@ -855,7 -869,7 +869,7 @@@ static int fuse_readpage(struct file *f
        return err;
  }
  
- static void fuse_readpages_end(struct fuse_conn *fc, struct fuse_args *args,
+ static void fuse_readpages_end(struct fuse_mount *fm, struct fuse_args *args,
                               int err)
  {
        int i;
  static void fuse_send_readpages(struct fuse_io_args *ia, struct file *file)
  {
        struct fuse_file *ff = file->private_data;
-       struct fuse_conn *fc = ff->fc;
+       struct fuse_mount *fm = ff->fm;
        struct fuse_args_pages *ap = &ia->ap;
        loff_t pos = page_offset(ap->pages[0]);
        size_t count = ap->num_pages << PAGE_SHIFT;
        WARN_ON((loff_t) (pos + count) < 0);
  
        fuse_read_args_fill(ia, file, pos, count, FUSE_READ);
-       ia->read.attr_ver = fuse_get_attr_version(fc);
-       if (fc->async_read) {
+       ia->read.attr_ver = fuse_get_attr_version(fm->fc);
+       if (fm->fc->async_read) {
                ia->ff = fuse_file_get(ff);
                ap->args.end = fuse_readpages_end;
-               err = fuse_simple_background(fc, &ap->args, GFP_KERNEL);
+               err = fuse_simple_background(fm, &ap->args, GFP_KERNEL);
                if (!err)
                        return;
        } else {
-               res = fuse_simple_request(fc, &ap->args);
+               res = fuse_simple_request(fm, &ap->args);
                err = res < 0 ? res : 0;
        }
-       fuse_readpages_end(fc, &ap->args, err);
+       fuse_readpages_end(fm, &ap->args, err);
  }
  
  static void fuse_readahead(struct readahead_control *rac)
@@@ -1000,7 -1014,7 +1014,7 @@@ static void fuse_write_args_fill(struc
        args->opcode = FUSE_WRITE;
        args->nodeid = ff->nodeid;
        args->in_numargs = 2;
-       if (ff->fc->minor < 9)
+       if (ff->fm->fc->minor < 9)
                args->in_args[0].size = FUSE_COMPAT_WRITE_IN_SIZE;
        else
                args->in_args[0].size = sizeof(ia->write.in);
@@@ -1029,7 -1043,7 +1043,7 @@@ static ssize_t fuse_send_write(struct f
        struct kiocb *iocb = ia->io->iocb;
        struct file *file = iocb->ki_filp;
        struct fuse_file *ff = file->private_data;
-       struct fuse_conn *fc = ff->fc;
+       struct fuse_mount *fm = ff->fm;
        struct fuse_write_in *inarg = &ia->write.in;
        ssize_t err;
  
        inarg->flags = fuse_write_flags(iocb);
        if (owner != NULL) {
                inarg->write_flags |= FUSE_WRITE_LOCKOWNER;
-               inarg->lock_owner = fuse_lock_owner_id(fc, owner);
+               inarg->lock_owner = fuse_lock_owner_id(fm->fc, owner);
        }
  
        if (ia->io->async)
-               return fuse_async_req_send(fc, ia, count);
+               return fuse_async_req_send(fm, ia, count);
  
-       err = fuse_simple_request(fc, &ia->ap.args);
+       err = fuse_simple_request(fm, &ia->ap.args);
        if (!err && ia->write.out.size > count)
                err = -EIO;
  
@@@ -1074,7 -1088,7 +1088,7 @@@ static ssize_t fuse_send_write_pages(st
        struct fuse_args_pages *ap = &ia->ap;
        struct file *file = iocb->ki_filp;
        struct fuse_file *ff = file->private_data;
-       struct fuse_conn *fc = ff->fc;
+       struct fuse_mount *fm = ff->fm;
        unsigned int offset, i;
        int err;
  
        fuse_write_args_fill(ia, ff, pos, count);
        ia->write.in.flags = fuse_write_flags(iocb);
  
-       err = fuse_simple_request(fc, &ap->args);
+       err = fuse_simple_request(fm, &ap->args);
        if (!err && ia->write.out.size > count)
                err = -EIO;
  
@@@ -1399,7 -1413,7 +1413,7 @@@ ssize_t fuse_direct_io(struct fuse_io_p
        struct file *file = io->iocb->ki_filp;
        struct inode *inode = file->f_mapping->host;
        struct fuse_file *ff = file->private_data;
-       struct fuse_conn *fc = ff->fc;
+       struct fuse_conn *fc = ff->fm->fc;
        size_t nmax = write ? fc->max_write : fc->max_read;
        loff_t pos = *ppos;
        size_t count = iov_iter_count(iter);
@@@ -1539,10 -1553,14 +1553,14 @@@ static ssize_t fuse_file_read_iter(stru
  {
        struct file *file = iocb->ki_filp;
        struct fuse_file *ff = file->private_data;
+       struct inode *inode = file_inode(file);
  
-       if (is_bad_inode(file_inode(file)))
+       if (is_bad_inode(inode))
                return -EIO;
  
+       if (FUSE_IS_DAX(inode))
+               return fuse_dax_read_iter(iocb, to);
        if (!(ff->open_flags & FOPEN_DIRECT_IO))
                return fuse_cache_read_iter(iocb, to);
        else
@@@ -1553,10 -1571,14 +1571,14 @@@ static ssize_t fuse_file_write_iter(str
  {
        struct file *file = iocb->ki_filp;
        struct fuse_file *ff = file->private_data;
+       struct inode *inode = file_inode(file);
  
-       if (is_bad_inode(file_inode(file)))
+       if (is_bad_inode(inode))
                return -EIO;
  
+       if (FUSE_IS_DAX(inode))
+               return fuse_dax_write_iter(iocb, from);
        if (!(ff->open_flags & FOPEN_DIRECT_IO))
                return fuse_cache_write_iter(iocb, from);
        else
@@@ -1578,7 -1600,7 +1600,7 @@@ static void fuse_writepage_free(struct 
        kfree(wpa);
  }
  
- static void fuse_writepage_finish(struct fuse_conn *fc,
+ static void fuse_writepage_finish(struct fuse_mount *fm,
                                  struct fuse_writepage_args *wpa)
  {
        struct fuse_args_pages *ap = &wpa->ia.ap;
  }
  
  /* Called under fi->lock, may release and reacquire it */
- static void fuse_send_writepage(struct fuse_conn *fc,
+ static void fuse_send_writepage(struct fuse_mount *fm,
                                struct fuse_writepage_args *wpa, loff_t size)
  __releases(fi->lock)
  __acquires(fi->lock)
        args->force = true;
        args->nocreds = true;
  
-       err = fuse_simple_background(fc, args, GFP_ATOMIC);
+       err = fuse_simple_background(fm, args, GFP_ATOMIC);
        if (err == -ENOMEM) {
                spin_unlock(&fi->lock);
-               err = fuse_simple_background(fc, args, GFP_NOFS | __GFP_NOFAIL);
+               err = fuse_simple_background(fm, args, GFP_NOFS | __GFP_NOFAIL);
                spin_lock(&fi->lock);
        }
  
   out_free:
        fi->writectr--;
        rb_erase(&wpa->writepages_entry, &fi->writepages);
-       fuse_writepage_finish(fc, wpa);
+       fuse_writepage_finish(fm, wpa);
        spin_unlock(&fi->lock);
  
        /* After fuse_writepage_finish() aux request list is private */
@@@ -1662,7 -1684,7 +1684,7 @@@ void fuse_flush_writepages(struct inod
  __releases(fi->lock)
  __acquires(fi->lock)
  {
-       struct fuse_conn *fc = get_fuse_conn(inode);
+       struct fuse_mount *fm = get_fuse_mount(inode);
        struct fuse_inode *fi = get_fuse_inode(inode);
        loff_t crop = i_size_read(inode);
        struct fuse_writepage_args *wpa;
                wpa = list_entry(fi->queued_writes.next,
                                 struct fuse_writepage_args, queue_entry);
                list_del_init(&wpa->queue_entry);
-               fuse_send_writepage(fc, wpa, crop);
+               fuse_send_writepage(fm, wpa, crop);
        }
  }
  
@@@ -1712,7 -1734,7 +1734,7 @@@ static void tree_insert(struct rb_root 
        WARN_ON(fuse_insert_writeback(root, wpa));
  }
  
- static void fuse_writepage_end(struct fuse_conn *fc, struct fuse_args *args,
+ static void fuse_writepage_end(struct fuse_mount *fm, struct fuse_args *args,
                               int error)
  {
        struct fuse_writepage_args *wpa =
        spin_lock(&fi->lock);
        rb_erase(&wpa->writepages_entry, &fi->writepages);
        while (wpa->next) {
-               struct fuse_conn *fc = get_fuse_conn(inode);
+               struct fuse_mount *fm = get_fuse_mount(inode);
                struct fuse_write_in *inarg = &wpa->ia.write.in;
                struct fuse_writepage_args *next = wpa->next;
  
                 * no invocations of fuse_writepage_end() while we're in
                 * fuse_set_nowrite..fuse_release_nowrite section.
                 */
-               fuse_send_writepage(fc, next, inarg->offset + inarg->size);
+               fuse_send_writepage(fm, next, inarg->offset + inarg->size);
        }
        fi->writectr--;
-       fuse_writepage_finish(fc, wpa);
+       fuse_writepage_finish(fm, wpa);
        spin_unlock(&fi->lock);
        fuse_writepage_free(wpa);
  }
@@@ -2317,6 -2339,10 +2339,10 @@@ static int fuse_file_mmap(struct file *
  {
        struct fuse_file *ff = file->private_data;
  
+       /* DAX mmap is superior to direct_io mmap */
+       if (FUSE_IS_DAX(file_inode(file)))
+               return fuse_dax_mmap(file, vma);
        if (ff->open_flags & FOPEN_DIRECT_IO) {
                /* Can't provide the coherency needed for MAP_SHARED */
                if (vma->vm_flags & VM_MAYSHARE)
@@@ -2395,7 -2421,7 +2421,7 @@@ static void fuse_lk_fill(struct fuse_ar
  static int fuse_getlk(struct file *file, struct file_lock *fl)
  {
        struct inode *inode = file_inode(file);
-       struct fuse_conn *fc = get_fuse_conn(inode);
+       struct fuse_mount *fm = get_fuse_mount(inode);
        FUSE_ARGS(args);
        struct fuse_lk_in inarg;
        struct fuse_lk_out outarg;
        args.out_numargs = 1;
        args.out_args[0].size = sizeof(outarg);
        args.out_args[0].value = &outarg;
-       err = fuse_simple_request(fc, &args);
+       err = fuse_simple_request(fm, &args);
        if (!err)
-               err = convert_fuse_file_lock(fc, &outarg.lk, fl);
+               err = convert_fuse_file_lock(fm->fc, &outarg.lk, fl);
  
        return err;
  }
  static int fuse_setlk(struct file *file, struct file_lock *fl, int flock)
  {
        struct inode *inode = file_inode(file);
-       struct fuse_conn *fc = get_fuse_conn(inode);
+       struct fuse_mount *fm = get_fuse_mount(inode);
        FUSE_ARGS(args);
        struct fuse_lk_in inarg;
        int opcode = (fl->fl_flags & FL_SLEEP) ? FUSE_SETLKW : FUSE_SETLK;
        struct pid *pid = fl->fl_type != F_UNLCK ? task_tgid(current) : NULL;
-       pid_t pid_nr = pid_nr_ns(pid, fc->pid_ns);
+       pid_t pid_nr = pid_nr_ns(pid, fm->fc->pid_ns);
        int err;
  
        if (fl->fl_lmops && fl->fl_lmops->lm_grant) {
                return 0;
  
        fuse_lk_fill(&args, file, fl, opcode, pid_nr, flock, &inarg);
-       err = fuse_simple_request(fc, &args);
+       err = fuse_simple_request(fm, &args);
  
        /* locking is restartable */
        if (err == -EINTR)
@@@ -2487,13 -2513,13 +2513,13 @@@ static int fuse_file_flock(struct file 
  static sector_t fuse_bmap(struct address_space *mapping, sector_t block)
  {
        struct inode *inode = mapping->host;
-       struct fuse_conn *fc = get_fuse_conn(inode);
+       struct fuse_mount *fm = get_fuse_mount(inode);
        FUSE_ARGS(args);
        struct fuse_bmap_in inarg;
        struct fuse_bmap_out outarg;
        int err;
  
-       if (!inode->i_sb->s_bdev || fc->no_bmap)
+       if (!inode->i_sb->s_bdev || fm->fc->no_bmap)
                return 0;
  
        memset(&inarg, 0, sizeof(inarg));
        args.out_numargs = 1;
        args.out_args[0].size = sizeof(outarg);
        args.out_args[0].value = &outarg;
-       err = fuse_simple_request(fc, &args);
+       err = fuse_simple_request(fm, &args);
        if (err == -ENOSYS)
-               fc->no_bmap = 1;
+               fm->fc->no_bmap = 1;
  
        return err ? 0 : outarg.block;
  }
  static loff_t fuse_lseek(struct file *file, loff_t offset, int whence)
  {
        struct inode *inode = file->f_mapping->host;
-       struct fuse_conn *fc = get_fuse_conn(inode);
+       struct fuse_mount *fm = get_fuse_mount(inode);
        struct fuse_file *ff = file->private_data;
        FUSE_ARGS(args);
        struct fuse_lseek_in inarg = {
        struct fuse_lseek_out outarg;
        int err;
  
-       if (fc->no_lseek)
+       if (fm->fc->no_lseek)
                goto fallback;
  
        args.opcode = FUSE_LSEEK;
        args.out_numargs = 1;
        args.out_args[0].size = sizeof(outarg);
        args.out_args[0].value = &outarg;
-       err = fuse_simple_request(fc, &args);
+       err = fuse_simple_request(fm, &args);
        if (err) {
                if (err == -ENOSYS) {
-                       fc->no_lseek = 1;
+                       fm->fc->no_lseek = 1;
                        goto fallback;
                }
                return err;
@@@ -2728,7 -2754,7 +2754,7 @@@ long fuse_do_ioctl(struct file *file, u
                   unsigned int flags)
  {
        struct fuse_file *ff = file->private_data;
-       struct fuse_conn *fc = ff->fc;
+       struct fuse_mount *fm = ff->fm;
        struct fuse_ioctl_in inarg = {
                .fh = ff->fh,
                .cmd = cmd,
        BUILD_BUG_ON(sizeof(struct fuse_ioctl_iovec) * FUSE_IOCTL_MAX_IOV > PAGE_SIZE);
  
        err = -ENOMEM;
-       ap.pages = fuse_pages_alloc(fc->max_pages, GFP_KERNEL, &ap.descs);
+       ap.pages = fuse_pages_alloc(fm->fc->max_pages, GFP_KERNEL, &ap.descs);
        iov_page = (struct iovec *) __get_free_page(GFP_KERNEL);
        if (!ap.pages || !iov_page)
                goto out;
  
-       fuse_page_descs_length_init(ap.descs, 0, fc->max_pages);
+       fuse_page_descs_length_init(ap.descs, 0, fm->fc->max_pages);
  
        /*
         * If restricted, initialize IO parameters as encoded in @cmd.
  
        /* make sure there are enough buffer pages and init request with them */
        err = -ENOMEM;
-       if (max_pages > fc->max_pages)
+       if (max_pages > fm->fc->max_pages)
                goto out;
        while (ap.num_pages < max_pages) {
                ap.pages[ap.num_pages] = alloc_page(GFP_KERNEL | __GFP_HIGHMEM);
        ap.args.out_pages = true;
        ap.args.out_argvar = true;
  
-       transferred = fuse_simple_request(fc, &ap.args);
+       transferred = fuse_simple_request(fm, &ap.args);
        err = transferred;
        if (transferred < 0)
                goto out;
                        goto out;
  
                vaddr = kmap_atomic(ap.pages[0]);
-               err = fuse_copy_ioctl_iovec(fc, iov_page, vaddr,
+               err = fuse_copy_ioctl_iovec(fm->fc, iov_page, vaddr,
                                            transferred, in_iovs + out_iovs,
                                            (flags & FUSE_IOCTL_COMPAT) != 0);
                kunmap_atomic(vaddr);
                in_iov = iov_page;
                out_iov = in_iov + in_iovs;
  
-               err = fuse_verify_ioctl_iov(fc, in_iov, in_iovs);
+               err = fuse_verify_ioctl_iov(fm->fc, in_iov, in_iovs);
                if (err)
                        goto out;
  
-               err = fuse_verify_ioctl_iov(fc, out_iov, out_iovs);
+               err = fuse_verify_ioctl_iov(fm->fc, out_iov, out_iovs);
                if (err)
                        goto out;
  
@@@ -3000,13 -3026,13 +3026,13 @@@ static void fuse_register_polled_file(s
  __poll_t fuse_file_poll(struct file *file, poll_table *wait)
  {
        struct fuse_file *ff = file->private_data;
-       struct fuse_conn *fc = ff->fc;
+       struct fuse_mount *fm = ff->fm;
        struct fuse_poll_in inarg = { .fh = ff->fh, .kh = ff->kh };
        struct fuse_poll_out outarg;
        FUSE_ARGS(args);
        int err;
  
-       if (fc->no_poll)
+       if (fm->fc->no_poll)
                return DEFAULT_POLLMASK;
  
        poll_wait(file, &ff->poll_wait, wait);
         */
        if (waitqueue_active(&ff->poll_wait)) {
                inarg.flags |= FUSE_POLL_SCHEDULE_NOTIFY;
-               fuse_register_polled_file(fc, ff);
+               fuse_register_polled_file(fm->fc, ff);
        }
  
        args.opcode = FUSE_POLL;
        args.out_numargs = 1;
        args.out_args[0].size = sizeof(outarg);
        args.out_args[0].value = &outarg;
-       err = fuse_simple_request(fc, &args);
+       err = fuse_simple_request(fm, &args);
  
        if (!err)
                return demangle_poll(outarg.revents);
        if (err == -ENOSYS) {
-               fc->no_poll = 1;
+               fm->fc->no_poll = 1;
                return DEFAULT_POLLMASK;
        }
        return EPOLLERR;
@@@ -3091,10 -3117,11 +3117,10 @@@ fuse_direct_IO(struct kiocb *iocb, stru
        ssize_t ret = 0;
        struct file *file = iocb->ki_filp;
        struct fuse_file *ff = file->private_data;
 -      bool async_dio = ff->fm->fc->async_dio;
        loff_t pos = 0;
        struct inode *inode;
        loff_t i_size;
 -      size_t count = iov_iter_count(iter);
 +      size_t count = iov_iter_count(iter), shortened = 0;
        loff_t offset = iocb->ki_pos;
        struct fuse_io_priv *io;
  
        inode = file->f_mapping->host;
        i_size = i_size_read(inode);
  
 -      if ((iov_iter_rw(iter) == READ) && (offset > i_size))
 +      if ((iov_iter_rw(iter) == READ) && (offset >= i_size))
                return 0;
  
 -      /* optimization for short read */
 -      if (async_dio && iov_iter_rw(iter) != WRITE && offset + count > i_size) {
 -              if (offset >= i_size)
 -                      return 0;
 -              iov_iter_truncate(iter, fuse_round_up(ff->fm->fc,
 -                                                    i_size - offset));
 -              count = iov_iter_count(iter);
 -      }
 -
        io = kmalloc(sizeof(struct fuse_io_priv), GFP_KERNEL);
        if (!io)
                return -ENOMEM;
         * By default, we want to optimize all I/Os with async request
         * submission to the client filesystem if supported.
         */
-       io->async = ff->fc->async_dio;
 -      io->async = async_dio;
++      io->async = ff->fm->fc->async_dio;
        io->iocb = iocb;
        io->blocking = is_sync_kiocb(iocb);
  
-               iov_iter_truncate(iter, fuse_round_up(ff->fc, i_size - offset));
 +      /* optimization for short read */
 +      if (io->async && !io->write && offset + count > i_size) {
++              iov_iter_truncate(iter, fuse_round_up(ff->fm->fc, i_size - offset));
 +              shortened = count - iov_iter_count(iter);
 +              count -= shortened;
 +      }
 +
        /*
         * We cannot asynchronously extend the size of a file.
         * In such case the aio will behave exactly like sync io.
         */
 -      if ((offset + count > i_size) && iov_iter_rw(iter) == WRITE)
 +      if ((offset + count > i_size) && io->write)
                io->blocking = true;
  
        if (io->async && io->blocking) {
        } else {
                ret = __fuse_direct_read(io, iter, &pos);
        }
 +      iov_iter_reexpand(iter, iov_iter_count(iter) + shortened);
  
        if (io->async) {
                bool blocking = io->blocking;
@@@ -3196,7 -3224,7 +3222,7 @@@ static long fuse_file_fallocate(struct 
        struct fuse_file *ff = file->private_data;
        struct inode *inode = file_inode(file);
        struct fuse_inode *fi = get_fuse_inode(inode);
-       struct fuse_conn *fc = ff->fc;
+       struct fuse_mount *fm = ff->fm;
        FUSE_ARGS(args);
        struct fuse_fallocate_in inarg = {
                .fh = ff->fh,
        bool lock_inode = !(mode & FALLOC_FL_KEEP_SIZE) ||
                           (mode & FALLOC_FL_PUNCH_HOLE);
  
+       bool block_faults = FUSE_IS_DAX(inode) && lock_inode;
        if (mode & ~(FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE))
                return -EOPNOTSUPP;
  
-       if (fc->no_fallocate)
+       if (fm->fc->no_fallocate)
                return -EOPNOTSUPP;
  
        if (lock_inode) {
                inode_lock(inode);
+               if (block_faults) {
+                       down_write(&fi->i_mmap_sem);
+                       err = fuse_dax_break_layouts(inode, 0, 0);
+                       if (err)
+                               goto out;
+               }
                if (mode & FALLOC_FL_PUNCH_HOLE) {
                        loff_t endbyte = offset + length - 1;
  
        args.in_numargs = 1;
        args.in_args[0].size = sizeof(inarg);
        args.in_args[0].value = &inarg;
-       err = fuse_simple_request(fc, &args);
+       err = fuse_simple_request(fm, &args);
        if (err == -ENOSYS) {
-               fc->no_fallocate = 1;
+               fm->fc->no_fallocate = 1;
                err = -EOPNOTSUPP;
        }
        if (err)
        if (!(mode & FALLOC_FL_KEEP_SIZE)) {
                bool changed = fuse_write_update_size(inode, offset + length);
  
-               if (changed && fc->writeback_cache)
+               if (changed && fm->fc->writeback_cache)
                        file_update_time(file);
        }
  
@@@ -3265,6 -3302,9 +3300,9 @@@ out
        if (!(mode & FALLOC_FL_KEEP_SIZE))
                clear_bit(FUSE_I_SIZE_UNSTABLE, &fi->state);
  
+       if (block_faults)
+               up_write(&fi->i_mmap_sem);
        if (lock_inode)
                inode_unlock(inode);
  
@@@ -3280,7 -3320,8 +3318,8 @@@ static ssize_t __fuse_copy_file_range(s
        struct inode *inode_in = file_inode(file_in);
        struct inode *inode_out = file_inode(file_out);
        struct fuse_inode *fi_out = get_fuse_inode(inode_out);
-       struct fuse_conn *fc = ff_in->fc;
+       struct fuse_mount *fm = ff_in->fm;
+       struct fuse_conn *fc = fm->fc;
        FUSE_ARGS(args);
        struct fuse_copy_file_range_in inarg = {
                .fh_in = ff_in->fh,
        args.out_numargs = 1;
        args.out_args[0].size = sizeof(outarg);
        args.out_args[0].value = &outarg;
-       err = fuse_simple_request(fc, &args);
+       err = fuse_simple_request(fm, &args);
        if (err == -ENOSYS) {
                fc->no_copy_file_range = 1;
                err = -EOPNOTSUPP;
@@@ -3404,6 -3445,7 +3443,7 @@@ static const struct file_operations fus
        .release        = fuse_release,
        .fsync          = fuse_fsync,
        .lock           = fuse_file_lock,
+       .get_unmapped_area = thp_get_unmapped_area,
        .flock          = fuse_file_flock,
        .splice_read    = generic_file_splice_read,
        .splice_write   = iter_file_splice_write,
@@@ -3439,4 -3481,7 +3479,7 @@@ void fuse_init_file_inode(struct inode 
        fi->writectr = 0;
        init_waitqueue_head(&fi->page_waitq);
        fi->writepages = RB_ROOT;
+       if (IS_ENABLED(CONFIG_FUSE_DAX))
+               fuse_dax_inode_init(inode);
  }
diff --combined fs/fuse/inode.c
@@@ -85,14 -85,22 +85,22 @@@ static struct inode *fuse_alloc_inode(s
        fi->orig_ino = 0;
        fi->state = 0;
        mutex_init(&fi->mutex);
+       init_rwsem(&fi->i_mmap_sem);
        spin_lock_init(&fi->lock);
        fi->forget = fuse_alloc_forget();
-       if (!fi->forget) {
-               kmem_cache_free(fuse_inode_cachep, fi);
-               return NULL;
-       }
+       if (!fi->forget)
+               goto out_free;
+       if (IS_ENABLED(CONFIG_FUSE_DAX) && !fuse_dax_inode_alloc(sb, fi))
+               goto out_free_forget;
  
        return &fi->inode;
+ out_free_forget:
+       kfree(fi->forget);
+ out_free:
+       kmem_cache_free(fuse_inode_cachep, fi);
+       return NULL;
  }
  
  static void fuse_free_inode(struct inode *inode)
  
        mutex_destroy(&fi->mutex);
        kfree(fi->forget);
+ #ifdef CONFIG_FUSE_DAX
+       kfree(fi->dax);
+ #endif
        kmem_cache_free(fuse_inode_cachep, fi);
  }
  
@@@ -112,8 -123,14 +123,14 @@@ static void fuse_evict_inode(struct ino
        clear_inode(inode);
        if (inode->i_sb->s_flags & SB_ACTIVE) {
                struct fuse_conn *fc = get_fuse_conn(inode);
-               fuse_queue_forget(fc, fi->forget, fi->nodeid, fi->nlookup);
-               fi->forget = NULL;
+               if (FUSE_IS_DAX(inode))
+                       fuse_dax_inode_cleanup(inode);
+               if (fi->nlookup) {
+                       fuse_queue_forget(fc, fi->forget, fi->nodeid,
+                                         fi->nlookup);
+                       fi->forget = NULL;
+               }
        }
        if (S_ISREG(inode->i_mode) && !is_bad_inode(inode)) {
                WARN_ON(!list_empty(&fi->write_files));
@@@ -268,7 -285,7 +285,7 @@@ static void fuse_init_inode(struct inod
                BUG();
  }
  
- int fuse_inode_eq(struct inode *inode, void *_nodeidp)
static int fuse_inode_eq(struct inode *inode, void *_nodeidp)
  {
        u64 nodeid = *(u64 *) _nodeidp;
        if (get_node_id(inode) == nodeid)
@@@ -292,7 -309,26 +309,26 @@@ struct inode *fuse_iget(struct super_bl
        struct fuse_inode *fi;
        struct fuse_conn *fc = get_fuse_conn_super(sb);
  
-  retry:
+       /*
+        * Auto mount points get their node id from the submount root, which is
+        * not a unique identifier within this filesystem.
+        *
+        * To avoid conflicts, do not place submount points into the inode hash
+        * table.
+        */
+       if (fc->auto_submounts && (attr->flags & FUSE_ATTR_SUBMOUNT) &&
+           S_ISDIR(attr->mode)) {
+               inode = new_inode(sb);
+               if (!inode)
+                       return NULL;
+               fuse_init_inode(inode, attr);
+               get_fuse_inode(inode)->nodeid = nodeid;
+               inode->i_flags |= S_AUTOMOUNT;
+               goto done;
+       }
+ retry:
        inode = iget5_locked(sb, nodeid, fuse_inode_eq, fuse_inode_set, &nodeid);
        if (!inode)
                return NULL;
                iput(inode);
                goto retry;
        }
+ done:
        fi = get_fuse_inode(inode);
        spin_lock(&fi->lock);
        fi->nlookup++;
        return inode;
  }
  
- int fuse_reverse_inval_inode(struct super_block *sb, u64 nodeid,
+ struct inode *fuse_ilookup(struct fuse_conn *fc, u64 nodeid,
+                          struct fuse_mount **fm)
+ {
+       struct fuse_mount *fm_iter;
+       struct inode *inode;
+       WARN_ON(!rwsem_is_locked(&fc->killsb));
+       list_for_each_entry(fm_iter, &fc->mounts, fc_entry) {
+               if (!fm_iter->sb)
+                       continue;
+               inode = ilookup5(fm_iter->sb, nodeid, fuse_inode_eq, &nodeid);
+               if (inode) {
+                       if (fm)
+                               *fm = fm_iter;
+                       return inode;
+               }
+       }
+       return NULL;
+ }
+ int fuse_reverse_inval_inode(struct fuse_conn *fc, u64 nodeid,
                             loff_t offset, loff_t len)
  {
-       struct fuse_conn *fc = get_fuse_conn_super(sb);
        struct fuse_inode *fi;
        struct inode *inode;
        pgoff_t pg_start;
        pgoff_t pg_end;
  
-       inode = ilookup5(sb, nodeid, fuse_inode_eq, &nodeid);
+       inode = fuse_ilookup(fc, nodeid, NULL);
        if (!inode)
                return -ENOENT;
  
@@@ -379,28 -436,23 +436,23 @@@ static void fuse_umount_begin(struct su
                fuse_abort_conn(fc);
  }
  
- static void fuse_send_destroy(struct fuse_conn *fc)
+ static void fuse_send_destroy(struct fuse_mount *fm)
  {
-       if (fc->conn_init) {
+       if (fm->fc->conn_init) {
                FUSE_ARGS(args);
  
                args.opcode = FUSE_DESTROY;
                args.force = true;
                args.nocreds = true;
-               fuse_simple_request(fc, &args);
+               fuse_simple_request(fm, &args);
        }
  }
  
  static void fuse_put_super(struct super_block *sb)
  {
-       struct fuse_conn *fc = get_fuse_conn_super(sb);
+       struct fuse_mount *fm = get_fuse_mount_super(sb);
  
-       mutex_lock(&fuse_mutex);
-       list_del(&fc->entry);
-       fuse_ctl_remove_conn(fc);
-       mutex_unlock(&fuse_mutex);
-       fuse_conn_put(fc);
+       fuse_mount_put(fm);
  }
  
  static void convert_fuse_statfs(struct kstatfs *stbuf, struct fuse_kstatfs *attr)
  static int fuse_statfs(struct dentry *dentry, struct kstatfs *buf)
  {
        struct super_block *sb = dentry->d_sb;
-       struct fuse_conn *fc = get_fuse_conn_super(sb);
+       struct fuse_mount *fm = get_fuse_mount_super(sb);
        FUSE_ARGS(args);
        struct fuse_statfs_out outarg;
        int err;
  
-       if (!fuse_allow_current_process(fc)) {
+       if (!fuse_allow_current_process(fm->fc)) {
                buf->f_type = FUSE_SUPER_MAGIC;
                return 0;
        }
        args.out_numargs = 1;
        args.out_args[0].size = sizeof(outarg);
        args.out_args[0].value = &outarg;
-       err = fuse_simple_request(fc, &args);
+       err = fuse_simple_request(fm, &args);
        if (!err)
                convert_fuse_statfs(buf, &outarg.st);
        return err;
@@@ -573,19 -625,25 +625,25 @@@ static int fuse_show_options(struct seq
        struct super_block *sb = root->d_sb;
        struct fuse_conn *fc = get_fuse_conn_super(sb);
  
-       if (fc->no_mount_options)
-               return 0;
+       if (fc->legacy_opts_show) {
+               seq_printf(m, ",user_id=%u",
+                          from_kuid_munged(fc->user_ns, fc->user_id));
+               seq_printf(m, ",group_id=%u",
+                          from_kgid_munged(fc->user_ns, fc->group_id));
+               if (fc->default_permissions)
+                       seq_puts(m, ",default_permissions");
+               if (fc->allow_other)
+                       seq_puts(m, ",allow_other");
+               if (fc->max_read != ~0)
+                       seq_printf(m, ",max_read=%u", fc->max_read);
+               if (sb->s_bdev && sb->s_blocksize != FUSE_DEFAULT_BLKSIZE)
+                       seq_printf(m, ",blksize=%lu", sb->s_blocksize);
+       }
+ #ifdef CONFIG_FUSE_DAX
+       if (fc->dax)
+               seq_puts(m, ",dax");
+ #endif
  
-       seq_printf(m, ",user_id=%u", from_kuid_munged(fc->user_ns, fc->user_id));
-       seq_printf(m, ",group_id=%u", from_kgid_munged(fc->user_ns, fc->group_id));
-       if (fc->default_permissions)
-               seq_puts(m, ",default_permissions");
-       if (fc->allow_other)
-               seq_puts(m, ",allow_other");
-       if (fc->max_read != ~0)
-               seq_printf(m, ",max_read=%u", fc->max_read);
-       if (sb->s_bdev && sb->s_blocksize != FUSE_DEFAULT_BLKSIZE)
-               seq_printf(m, ",blksize=%lu", sb->s_blocksize);
        return 0;
  }
  
@@@ -615,7 -673,8 +673,8 @@@ static void fuse_pqueue_init(struct fus
        fpq->connected = 1;
  }
  
- void fuse_conn_init(struct fuse_conn *fc, struct user_namespace *user_ns,
+ void fuse_conn_init(struct fuse_conn *fc, struct fuse_mount *fm,
+                   struct user_namespace *user_ns,
                    const struct fuse_iqueue_ops *fiq_ops, void *fiq_priv)
  {
        memset(fc, 0, sizeof(*fc));
        fc->pid_ns = get_pid_ns(task_active_pid_ns(current));
        fc->user_ns = get_user_ns(user_ns);
        fc->max_pages = FUSE_DEFAULT_MAX_PAGES_PER_REQ;
+       INIT_LIST_HEAD(&fc->mounts);
+       list_add(&fm->fc_entry, &fc->mounts);
+       fm->fc = fc;
+       refcount_set(&fm->count, 1);
  }
  EXPORT_SYMBOL_GPL(fuse_conn_init);
  
@@@ -650,6 -714,8 +714,8 @@@ void fuse_conn_put(struct fuse_conn *fc
        if (refcount_dec_and_test(&fc->count)) {
                struct fuse_iqueue *fiq = &fc->iq;
  
+               if (IS_ENABLED(CONFIG_FUSE_DAX))
+                       fuse_dax_conn_free(fc);
                if (fiq->ops->release)
                        fiq->ops->release(fiq);
                put_pid_ns(fc->pid_ns);
@@@ -666,6 -732,23 +732,23 @@@ struct fuse_conn *fuse_conn_get(struct 
  }
  EXPORT_SYMBOL_GPL(fuse_conn_get);
  
+ void fuse_mount_put(struct fuse_mount *fm)
+ {
+       if (refcount_dec_and_test(&fm->count)) {
+               if (fm->fc)
+                       fuse_conn_put(fm->fc);
+               kfree(fm);
+       }
+ }
+ EXPORT_SYMBOL_GPL(fuse_mount_put);
+ struct fuse_mount *fuse_mount_get(struct fuse_mount *fm)
+ {
+       refcount_inc(&fm->count);
+       return fm;
+ }
+ EXPORT_SYMBOL_GPL(fuse_mount_get);
  static struct inode *fuse_get_root_inode(struct super_block *sb, unsigned mode)
  {
        struct fuse_attr attr;
@@@ -895,14 -978,16 +978,16 @@@ struct fuse_init_args 
        struct fuse_init_out out;
  };
  
- static void process_init_reply(struct fuse_conn *fc, struct fuse_args *args,
+ static void process_init_reply(struct fuse_mount *fm, struct fuse_args *args,
                               int error)
  {
+       struct fuse_conn *fc = fm->fc;
        struct fuse_init_args *ia = container_of(args, typeof(*ia), args);
        struct fuse_init_out *arg = &ia->out;
+       bool ok = true;
  
        if (error || arg->major != FUSE_KERNEL_VERSION)
-               fc->conn_error = 1;
+               ok = false;
        else {
                unsigned long ra_pages;
  
                        if (arg->flags & FUSE_HANDLE_KILLPRIV)
                                fc->handle_killpriv = 1;
                        if (arg->time_gran && arg->time_gran <= 1000000000)
-                               fc->sb->s_time_gran = arg->time_gran;
+                               fm->sb->s_time_gran = arg->time_gran;
                        if ((arg->flags & FUSE_POSIX_ACL)) {
                                fc->default_permissions = 1;
                                fc->posix_acl = 1;
-                               fc->sb->s_xattr = fuse_acl_xattr_handlers;
+                               fm->sb->s_xattr = fuse_acl_xattr_handlers;
                        }
                        if (arg->flags & FUSE_CACHE_SYMLINKS)
                                fc->cache_symlinks = 1;
                                        min_t(unsigned int, FUSE_MAX_MAX_PAGES,
                                        max_t(unsigned int, arg->max_pages, 1));
                        }
+                       if (IS_ENABLED(CONFIG_FUSE_DAX) &&
+                           arg->flags & FUSE_MAP_ALIGNMENT &&
+                           !fuse_dax_check_alignment(fc, arg->map_alignment)) {
+                               ok = false;
+                       }
                } else {
                        ra_pages = fc->max_read / PAGE_SIZE;
                        fc->no_lock = 1;
                        fc->no_flock = 1;
                }
  
-               fc->sb->s_bdi->ra_pages =
-                               min(fc->sb->s_bdi->ra_pages, ra_pages);
+               fm->sb->s_bdi->ra_pages =
+                               min(fm->sb->s_bdi->ra_pages, ra_pages);
                fc->minor = arg->minor;
                fc->max_write = arg->minor < 5 ? 4096 : arg->max_write;
                fc->max_write = max_t(unsigned, 4096, fc->max_write);
        }
        kfree(ia);
  
+       if (!ok) {
+               fc->conn_init = 0;
+               fc->conn_error = 1;
+       }
        fuse_set_initialized(fc);
        wake_up_all(&fc->blocked_waitq);
  }
  
- void fuse_send_init(struct fuse_conn *fc)
+ void fuse_send_init(struct fuse_mount *fm)
  {
        struct fuse_init_args *ia;
  
  
        ia->in.major = FUSE_KERNEL_VERSION;
        ia->in.minor = FUSE_KERNEL_MINOR_VERSION;
-       ia->in.max_readahead = fc->sb->s_bdi->ra_pages * PAGE_SIZE;
+       ia->in.max_readahead = fm->sb->s_bdi->ra_pages * PAGE_SIZE;
        ia->in.flags |=
                FUSE_ASYNC_READ | FUSE_POSIX_LOCKS | FUSE_ATOMIC_O_TRUNC |
                FUSE_EXPORT_SUPPORT | FUSE_BIG_WRITES | FUSE_DONT_MASK |
                FUSE_PARALLEL_DIROPS | FUSE_HANDLE_KILLPRIV | FUSE_POSIX_ACL |
                FUSE_ABORT_ERROR | FUSE_MAX_PAGES | FUSE_CACHE_SYMLINKS |
                FUSE_NO_OPENDIR_SUPPORT | FUSE_EXPLICIT_INVAL_DATA;
+ #ifdef CONFIG_FUSE_DAX
+       if (fm->fc->dax)
+               ia->in.flags |= FUSE_MAP_ALIGNMENT;
+ #endif
+       if (fm->fc->auto_submounts)
+               ia->in.flags |= FUSE_SUBMOUNTS;
        ia->args.opcode = FUSE_INIT;
        ia->args.in_numargs = 1;
        ia->args.in_args[0].size = sizeof(ia->in);
        ia->args.nocreds = true;
        ia->args.end = process_init_reply;
  
-       if (fuse_simple_background(fc, &ia->args, GFP_KERNEL) != 0)
-               process_init_reply(fc, &ia->args, -ENOTCONN);
+       if (fuse_simple_background(fm, &ia->args, GFP_KERNEL) != 0)
+               process_init_reply(fm, &ia->args, -ENOTCONN);
  }
  EXPORT_SYMBOL_GPL(fuse_send_init);
  
@@@ -1049,9 -1151,9 +1151,9 @@@ static int fuse_bdi_init(struct fuse_co
        if (err)
                return err;
  
 -      sb->s_bdi->ra_pages = VM_READAHEAD_PAGES;
        /* fuse does it's own writeback accounting */
 -      sb->s_bdi->capabilities = BDI_CAP_NO_ACCT_WB | BDI_CAP_STRICTLIMIT;
 +      sb->s_bdi->capabilities &= ~BDI_CAP_WRITEBACK_ACCT;
 +      sb->s_bdi->capabilities |= BDI_CAP_STRICTLIMIT;
  
        /*
         * For a single fuse filesystem use max 1% of dirty +
@@@ -1130,10 -1232,92 +1232,92 @@@ void fuse_dev_free(struct fuse_dev *fud
  }
  EXPORT_SYMBOL_GPL(fuse_dev_free);
  
+ static void fuse_fill_attr_from_inode(struct fuse_attr *attr,
+                                     const struct fuse_inode *fi)
+ {
+       *attr = (struct fuse_attr){
+               .ino            = fi->inode.i_ino,
+               .size           = fi->inode.i_size,
+               .blocks         = fi->inode.i_blocks,
+               .atime          = fi->inode.i_atime.tv_sec,
+               .mtime          = fi->inode.i_mtime.tv_sec,
+               .ctime          = fi->inode.i_ctime.tv_sec,
+               .atimensec      = fi->inode.i_atime.tv_nsec,
+               .mtimensec      = fi->inode.i_mtime.tv_nsec,
+               .ctimensec      = fi->inode.i_ctime.tv_nsec,
+               .mode           = fi->inode.i_mode,
+               .nlink          = fi->inode.i_nlink,
+               .uid            = fi->inode.i_uid.val,
+               .gid            = fi->inode.i_gid.val,
+               .rdev           = fi->inode.i_rdev,
+               .blksize        = 1u << fi->inode.i_blkbits,
+       };
+ }
+ static void fuse_sb_defaults(struct super_block *sb)
+ {
+       sb->s_magic = FUSE_SUPER_MAGIC;
+       sb->s_op = &fuse_super_operations;
+       sb->s_xattr = fuse_xattr_handlers;
+       sb->s_maxbytes = MAX_LFS_FILESIZE;
+       sb->s_time_gran = 1;
+       sb->s_export_op = &fuse_export_operations;
+       sb->s_iflags |= SB_I_IMA_UNVERIFIABLE_SIGNATURE;
+       if (sb->s_user_ns != &init_user_ns)
+               sb->s_iflags |= SB_I_UNTRUSTED_MOUNTER;
+       sb->s_flags &= ~(SB_NOSEC | SB_I_VERSION);
+       /*
+        * If we are not in the initial user namespace posix
+        * acls must be translated.
+        */
+       if (sb->s_user_ns != &init_user_ns)
+               sb->s_xattr = fuse_no_acl_xattr_handlers;
+ }
+ int fuse_fill_super_submount(struct super_block *sb,
+                            struct fuse_inode *parent_fi)
+ {
+       struct fuse_mount *fm = get_fuse_mount_super(sb);
+       struct super_block *parent_sb = parent_fi->inode.i_sb;
+       struct fuse_attr root_attr;
+       struct inode *root;
+       fuse_sb_defaults(sb);
+       fm->sb = sb;
+       WARN_ON(sb->s_bdi != &noop_backing_dev_info);
+       sb->s_bdi = bdi_get(parent_sb->s_bdi);
+       sb->s_xattr = parent_sb->s_xattr;
+       sb->s_time_gran = parent_sb->s_time_gran;
+       sb->s_blocksize = parent_sb->s_blocksize;
+       sb->s_blocksize_bits = parent_sb->s_blocksize_bits;
+       sb->s_subtype = kstrdup(parent_sb->s_subtype, GFP_KERNEL);
+       if (parent_sb->s_subtype && !sb->s_subtype)
+               return -ENOMEM;
+       fuse_fill_attr_from_inode(&root_attr, parent_fi);
+       root = fuse_iget(sb, parent_fi->nodeid, 0, &root_attr, 0, 0);
+       /*
+        * This inode is just a duplicate, so it is not looked up and
+        * its nlookup should not be incremented.  fuse_iget() does
+        * that, though, so undo it here.
+        */
+       get_fuse_inode(root)->nlookup--;
+       sb->s_d_op = &fuse_dentry_operations;
+       sb->s_root = d_make_root(root);
+       if (!sb->s_root)
+               return -ENOMEM;
+       return 0;
+ }
  int fuse_fill_super_common(struct super_block *sb, struct fuse_fs_context *ctx)
  {
        struct fuse_dev *fud = NULL;
-       struct fuse_conn *fc = get_fuse_conn_super(sb);
+       struct fuse_mount *fm = get_fuse_mount_super(sb);
+       struct fuse_conn *fc = fm->fc;
        struct inode *root;
        struct dentry *root_dentry;
        int err;
        if (sb->s_flags & SB_MANDLOCK)
                goto err;
  
-       sb->s_flags &= ~(SB_NOSEC | SB_I_VERSION);
+       fuse_sb_defaults(sb);
  
        if (ctx->is_bdev) {
  #ifdef CONFIG_BLOCK
  
        sb->s_subtype = ctx->subtype;
        ctx->subtype = NULL;
-       sb->s_magic = FUSE_SUPER_MAGIC;
-       sb->s_op = &fuse_super_operations;
-       sb->s_xattr = fuse_xattr_handlers;
-       sb->s_maxbytes = MAX_LFS_FILESIZE;
-       sb->s_time_gran = 1;
-       sb->s_export_op = &fuse_export_operations;
-       sb->s_iflags |= SB_I_IMA_UNVERIFIABLE_SIGNATURE;
-       if (sb->s_user_ns != &init_user_ns)
-               sb->s_iflags |= SB_I_UNTRUSTED_MOUNTER;
-       /*
-        * If we are not in the initial user namespace posix
-        * acls must be translated.
-        */
-       if (sb->s_user_ns != &init_user_ns)
-               sb->s_xattr = fuse_no_acl_xattr_handlers;
+       if (IS_ENABLED(CONFIG_FUSE_DAX)) {
+               err = fuse_dax_conn_alloc(fc, ctx->dax_dev);
+               if (err)
+                       goto err;
+       }
  
        if (ctx->fudptr) {
                err = -ENOMEM;
                fud = fuse_dev_alloc_install(fc);
                if (!fud)
-                       goto err;
+                       goto err_free_dax;
        }
  
        fc->dev = sb->s_dev;
-       fc->sb = sb;
+       fm->sb = sb;
        err = fuse_bdi_init(fc, sb);
        if (err)
                goto err_dev_free;
        fc->allow_other = ctx->allow_other;
        fc->user_id = ctx->user_id;
        fc->group_id = ctx->group_id;
-       fc->max_read = max_t(unsigned, 4096, ctx->max_read);
+       fc->legacy_opts_show = ctx->legacy_opts_show;
+       fc->max_read = max_t(unsigned int, 4096, ctx->max_read);
        fc->destroy = ctx->destroy;
        fc->no_control = ctx->no_control;
        fc->no_force_umount = ctx->no_force_umount;
-       fc->no_mount_options = ctx->no_mount_options;
  
        err = -ENOMEM;
        root = fuse_get_root_inode(sb, ctx->rootmode);
   err_dev_free:
        if (fud)
                fuse_dev_free(fud);
+  err_free_dax:
+       if (IS_ENABLED(CONFIG_FUSE_DAX))
+               fuse_dax_conn_free(fc);
   err:
        return err;
  }
@@@ -1244,6 -1420,7 +1420,7 @@@ static int fuse_fill_super(struct super
        struct file *file;
        int err;
        struct fuse_conn *fc;
+       struct fuse_mount *fm;
  
        err = -EINVAL;
        file = fget(ctx->fd);
        if (!fc)
                goto err_fput;
  
-       fuse_conn_init(fc, sb->s_user_ns, &fuse_dev_fiq_ops, NULL);
+       fm = kzalloc(sizeof(*fm), GFP_KERNEL);
+       if (!fm) {
+               kfree(fc);
+               goto err_fput;
+       }
+       fuse_conn_init(fc, fm, sb->s_user_ns, &fuse_dev_fiq_ops, NULL);
        fc->release = fuse_free_conn;
-       sb->s_fs_info = fc;
+       sb->s_fs_info = fm;
  
        err = fuse_fill_super_common(sb, ctx);
        if (err)
         * CPUs after this
         */
        fput(file);
-       fuse_send_init(get_fuse_conn_super(sb));
+       fuse_send_init(get_fuse_mount_super(sb));
        return 0;
  
   err_put_conn:
-       fuse_conn_put(fc);
+       fuse_mount_put(fm);
        sb->s_fs_info = NULL;
   err_fput:
        fput(file);
@@@ -1325,6 -1509,7 +1509,7 @@@ static int fuse_init_fs_context(struct 
  
        ctx->max_read = ~0;
        ctx->blksize = FUSE_DEFAULT_BLKSIZE;
+       ctx->legacy_opts_show = true;
  
  #ifdef CONFIG_BLOCK
        if (fc->fs_type == &fuseblk_fs_type) {
        return 0;
  }
  
static void fuse_sb_destroy(struct super_block *sb)
bool fuse_mount_remove(struct fuse_mount *fm)
  {
-       struct fuse_conn *fc = get_fuse_conn_super(sb);
+       struct fuse_conn *fc = fm->fc;
+       bool last = false;
  
-       if (fc) {
-               if (fc->destroy)
-                       fuse_send_destroy(fc);
+       down_write(&fc->killsb);
+       list_del_init(&fm->fc_entry);
+       if (list_empty(&fc->mounts))
+               last = true;
+       up_write(&fc->killsb);
  
-               fuse_abort_conn(fc);
-               fuse_wait_aborted(fc);
+       return last;
+ }
+ EXPORT_SYMBOL_GPL(fuse_mount_remove);
  
-               down_write(&fc->killsb);
-               fc->sb = NULL;
-               up_write(&fc->killsb);
+ void fuse_conn_destroy(struct fuse_mount *fm)
+ {
+       struct fuse_conn *fc = fm->fc;
+       if (fc->destroy)
+               fuse_send_destroy(fm);
+       fuse_abort_conn(fc);
+       fuse_wait_aborted(fc);
+       if (!list_empty(&fc->entry)) {
+               mutex_lock(&fuse_mutex);
+               list_del(&fc->entry);
+               fuse_ctl_remove_conn(fc);
+               mutex_unlock(&fuse_mutex);
        }
  }
+ EXPORT_SYMBOL_GPL(fuse_conn_destroy);
  
- void fuse_kill_sb_anon(struct super_block *sb)
static void fuse_kill_sb_anon(struct super_block *sb)
  {
-       fuse_sb_destroy(sb);
+       struct fuse_mount *fm = get_fuse_mount_super(sb);
+       bool last;
+       if (fm) {
+               last = fuse_mount_remove(fm);
+               if (last)
+                       fuse_conn_destroy(fm);
+       }
        kill_anon_super(sb);
  }
- EXPORT_SYMBOL_GPL(fuse_kill_sb_anon);
  
  static struct file_system_type fuse_fs_type = {
        .owner          = THIS_MODULE,
@@@ -1375,7 -1583,14 +1583,14 @@@ MODULE_ALIAS_FS("fuse")
  #ifdef CONFIG_BLOCK
  static void fuse_kill_sb_blk(struct super_block *sb)
  {
-       fuse_sb_destroy(sb);
+       struct fuse_mount *fm = get_fuse_mount_super(sb);
+       bool last;
+       if (fm) {
+               last = fuse_mount_remove(fm);
+               if (last)
+                       fuse_conn_destroy(fm);
+       }
        kill_block_super(sb);
  }
  
diff --combined fs/fuse/virtio_fs.c
@@@ -5,12 -5,17 +5,17 @@@
   */
  
  #include <linux/fs.h>
+ #include <linux/dax.h>
+ #include <linux/pci.h>
+ #include <linux/pfn_t.h>
  #include <linux/module.h>
  #include <linux/virtio.h>
  #include <linux/virtio_fs.h>
  #include <linux/delay.h>
  #include <linux/fs_context.h>
+ #include <linux/fs_parser.h>
  #include <linux/highmem.h>
+ #include <linux/uio.h>
  #include "fuse_i.h"
  
  /* List of virtio-fs device instances and a lock for the list. Also provides
@@@ -24,6 -29,8 +29,8 @@@ enum 
        VQ_REQUEST
  };
  
+ #define VQ_NAME_LEN   24
  /* Per-virtqueue state */
  struct virtio_fs_vq {
        spinlock_t lock;
@@@ -36,7 -43,7 +43,7 @@@
        bool connected;
        long in_flight;
        struct completion in_flight_zero; /* No inflight requests */
-       char name[24];
+       char name[VQ_NAME_LEN];
  } ____cacheline_aligned_in_smp;
  
  /* A virtio-fs device instance */
@@@ -47,6 -54,12 +54,12 @@@ struct virtio_fs 
        struct virtio_fs_vq *vqs;
        unsigned int nvqs;               /* number of virtqueues */
        unsigned int num_request_queues; /* number of request queues */
+       struct dax_device *dax_dev;
+       /* DAX memory window where file contents are mapped */
+       void *window_kaddr;
+       phys_addr_t window_phys_addr;
+       size_t window_len;
  };
  
  struct virtio_fs_forget_req {
@@@ -69,6 -82,44 +82,44 @@@ struct virtio_fs_req_work 
  static int virtio_fs_enqueue_req(struct virtio_fs_vq *fsvq,
                                 struct fuse_req *req, bool in_flight);
  
+ enum {
+       OPT_DAX,
+ };
+ static const struct fs_parameter_spec virtio_fs_parameters[] = {
+       fsparam_flag("dax", OPT_DAX),
+       {}
+ };
+ static int virtio_fs_parse_param(struct fs_context *fc,
+                                struct fs_parameter *param)
+ {
+       struct fs_parse_result result;
+       struct fuse_fs_context *ctx = fc->fs_private;
+       int opt;
+       opt = fs_parse(fc, virtio_fs_parameters, param, &result);
+       if (opt < 0)
+               return opt;
+       switch (opt) {
+       case OPT_DAX:
+               ctx->dax = 1;
+               break;
+       default:
+               return -EINVAL;
+       }
+       return 0;
+ }
+ static void virtio_fs_free_fc(struct fs_context *fc)
+ {
+       struct fuse_fs_context *ctx = fc->fs_private;
+       kfree(ctx);
+ }
  static inline struct virtio_fs_vq *vq_to_fsvq(struct virtqueue *vq)
  {
        struct virtio_fs *fs = vq->vdev->priv;
@@@ -289,7 -340,6 +340,6 @@@ static void virtio_fs_request_dispatch_
        struct fuse_req *req;
        struct virtio_fs_vq *fsvq = container_of(work, struct virtio_fs_vq,
                                                 dispatch_work.work);
-       struct fuse_conn *fc = fsvq->fud->fc;
        int ret;
  
        pr_debug("virtio-fs: worker %s called.\n", __func__);
  
                list_del_init(&req->list);
                spin_unlock(&fsvq->lock);
-               fuse_request_end(fc, req);
+               fuse_request_end(req);
        }
  
        /* Dispatch pending requests */
                        spin_unlock(&fsvq->lock);
                        pr_err("virtio-fs: virtio_fs_enqueue_req() failed %d\n",
                               ret);
-                       fuse_request_end(fc, req);
+                       fuse_request_end(req);
                }
        }
  }
@@@ -495,7 -545,6 +545,6 @@@ static void virtio_fs_request_complete(
                                       struct virtio_fs_vq *fsvq)
  {
        struct fuse_pqueue *fpq = &fsvq->fud->pq;
-       struct fuse_conn *fc = fsvq->fud->fc;
        struct fuse_args *args;
        struct fuse_args_pages *ap;
        unsigned int len, i, thislen;
        clear_bit(FR_SENT, &req->flags);
        spin_unlock(&fpq->lock);
  
-       fuse_request_end(fc, req);
+       fuse_request_end(req);
        spin_lock(&fsvq->lock);
        dec_in_flight_req(fsvq);
        spin_unlock(&fsvq->lock);
@@@ -596,6 -645,26 +645,26 @@@ static void virtio_fs_vq_done(struct vi
        schedule_work(&fsvq->done_work);
  }
  
+ static void virtio_fs_init_vq(struct virtio_fs_vq *fsvq, char *name,
+                             int vq_type)
+ {
+       strncpy(fsvq->name, name, VQ_NAME_LEN);
+       spin_lock_init(&fsvq->lock);
+       INIT_LIST_HEAD(&fsvq->queued_reqs);
+       INIT_LIST_HEAD(&fsvq->end_reqs);
+       init_completion(&fsvq->in_flight_zero);
+       if (vq_type == VQ_REQUEST) {
+               INIT_WORK(&fsvq->done_work, virtio_fs_requests_done_work);
+               INIT_DELAYED_WORK(&fsvq->dispatch_work,
+                                 virtio_fs_request_dispatch_work);
+       } else {
+               INIT_WORK(&fsvq->done_work, virtio_fs_hiprio_done_work);
+               INIT_DELAYED_WORK(&fsvq->dispatch_work,
+                                 virtio_fs_hiprio_dispatch_work);
+       }
+ }
  /* Initialize virtqueues */
  static int virtio_fs_setup_vqs(struct virtio_device *vdev,
                               struct virtio_fs *fs)
        if (fs->num_request_queues == 0)
                return -EINVAL;
  
-       fs->nvqs = 1 + fs->num_request_queues;
+       fs->nvqs = VQ_REQUEST + fs->num_request_queues;
        fs->vqs = kcalloc(fs->nvqs, sizeof(fs->vqs[VQ_HIPRIO]), GFP_KERNEL);
        if (!fs->vqs)
                return -ENOMEM;
                goto out;
        }
  
+       /* Initialize the hiprio/forget request virtqueue */
        callbacks[VQ_HIPRIO] = virtio_fs_vq_done;
-       snprintf(fs->vqs[VQ_HIPRIO].name, sizeof(fs->vqs[VQ_HIPRIO].name),
-                       "hiprio");
+       virtio_fs_init_vq(&fs->vqs[VQ_HIPRIO], "hiprio", VQ_HIPRIO);
        names[VQ_HIPRIO] = fs->vqs[VQ_HIPRIO].name;
-       INIT_WORK(&fs->vqs[VQ_HIPRIO].done_work, virtio_fs_hiprio_done_work);
-       INIT_LIST_HEAD(&fs->vqs[VQ_HIPRIO].queued_reqs);
-       INIT_LIST_HEAD(&fs->vqs[VQ_HIPRIO].end_reqs);
-       INIT_DELAYED_WORK(&fs->vqs[VQ_HIPRIO].dispatch_work,
-                       virtio_fs_hiprio_dispatch_work);
-       init_completion(&fs->vqs[VQ_HIPRIO].in_flight_zero);
-       spin_lock_init(&fs->vqs[VQ_HIPRIO].lock);
  
        /* Initialize the requests virtqueues */
        for (i = VQ_REQUEST; i < fs->nvqs; i++) {
-               spin_lock_init(&fs->vqs[i].lock);
-               INIT_WORK(&fs->vqs[i].done_work, virtio_fs_requests_done_work);
-               INIT_DELAYED_WORK(&fs->vqs[i].dispatch_work,
-                                 virtio_fs_request_dispatch_work);
-               INIT_LIST_HEAD(&fs->vqs[i].queued_reqs);
-               INIT_LIST_HEAD(&fs->vqs[i].end_reqs);
-               init_completion(&fs->vqs[i].in_flight_zero);
-               snprintf(fs->vqs[i].name, sizeof(fs->vqs[i].name),
-                        "requests.%u", i - VQ_REQUEST);
+               char vq_name[VQ_NAME_LEN];
+               snprintf(vq_name, VQ_NAME_LEN, "requests.%u", i - VQ_REQUEST);
+               virtio_fs_init_vq(&fs->vqs[i], vq_name, VQ_REQUEST);
                callbacks[i] = virtio_fs_vq_done;
                names[i] = fs->vqs[i].name;
        }
@@@ -676,6 -733,130 +733,130 @@@ static void virtio_fs_cleanup_vqs(struc
        vdev->config->del_vqs(vdev);
  }
  
 -      pgmap->res = (struct resource){
 -              .name = "virtio-fs dax window",
+ /* Map a window offset to a page frame number.  The window offset will have
+  * been produced by .iomap_begin(), which maps a file offset to a window
+  * offset.
+  */
+ static long virtio_fs_direct_access(struct dax_device *dax_dev, pgoff_t pgoff,
+                                   long nr_pages, void **kaddr, pfn_t *pfn)
+ {
+       struct virtio_fs *fs = dax_get_private(dax_dev);
+       phys_addr_t offset = PFN_PHYS(pgoff);
+       size_t max_nr_pages = fs->window_len/PAGE_SIZE - pgoff;
+       if (kaddr)
+               *kaddr = fs->window_kaddr + offset;
+       if (pfn)
+               *pfn = phys_to_pfn_t(fs->window_phys_addr + offset,
+                                       PFN_DEV | PFN_MAP);
+       return nr_pages > max_nr_pages ? max_nr_pages : nr_pages;
+ }
+ static size_t virtio_fs_copy_from_iter(struct dax_device *dax_dev,
+                                      pgoff_t pgoff, void *addr,
+                                      size_t bytes, struct iov_iter *i)
+ {
+       return copy_from_iter(addr, bytes, i);
+ }
+ static size_t virtio_fs_copy_to_iter(struct dax_device *dax_dev,
+                                      pgoff_t pgoff, void *addr,
+                                      size_t bytes, struct iov_iter *i)
+ {
+       return copy_to_iter(addr, bytes, i);
+ }
+ static int virtio_fs_zero_page_range(struct dax_device *dax_dev,
+                                    pgoff_t pgoff, size_t nr_pages)
+ {
+       long rc;
+       void *kaddr;
+       rc = dax_direct_access(dax_dev, pgoff, nr_pages, &kaddr, NULL);
+       if (rc < 0)
+               return rc;
+       memset(kaddr, 0, nr_pages << PAGE_SHIFT);
+       dax_flush(dax_dev, kaddr, nr_pages << PAGE_SHIFT);
+       return 0;
+ }
+ static const struct dax_operations virtio_fs_dax_ops = {
+       .direct_access = virtio_fs_direct_access,
+       .copy_from_iter = virtio_fs_copy_from_iter,
+       .copy_to_iter = virtio_fs_copy_to_iter,
+       .zero_page_range = virtio_fs_zero_page_range,
+ };
+ static void virtio_fs_cleanup_dax(void *data)
+ {
+       struct dax_device *dax_dev = data;
+       kill_dax(dax_dev);
+       put_dax(dax_dev);
+ }
+ static int virtio_fs_setup_dax(struct virtio_device *vdev, struct virtio_fs *fs)
+ {
+       struct virtio_shm_region cache_reg;
+       struct dev_pagemap *pgmap;
+       bool have_cache;
+       if (!IS_ENABLED(CONFIG_FUSE_DAX))
+               return 0;
+       /* Get cache region */
+       have_cache = virtio_get_shm_region(vdev, &cache_reg,
+                                          (u8)VIRTIO_FS_SHMCAP_ID_CACHE);
+       if (!have_cache) {
+               dev_notice(&vdev->dev, "%s: No cache capability\n", __func__);
+               return 0;
+       }
+       if (!devm_request_mem_region(&vdev->dev, cache_reg.addr, cache_reg.len,
+                                    dev_name(&vdev->dev))) {
+               dev_warn(&vdev->dev, "could not reserve region addr=0x%llx len=0x%llx\n",
+                        cache_reg.addr, cache_reg.len);
+               return -EBUSY;
+       }
+       dev_notice(&vdev->dev, "Cache len: 0x%llx @ 0x%llx\n", cache_reg.len,
+                  cache_reg.addr);
+       pgmap = devm_kzalloc(&vdev->dev, sizeof(*pgmap), GFP_KERNEL);
+       if (!pgmap)
+               return -ENOMEM;
+       pgmap->type = MEMORY_DEVICE_FS_DAX;
+       /* Ideally we would directly use the PCI BAR resource but
+        * devm_memremap_pages() wants its own copy in pgmap.  So
+        * initialize a struct resource from scratch (only the start
+        * and end fields will be used).
+        */
++      pgmap->range = (struct range) {
+               .start = (phys_addr_t) cache_reg.addr,
+               .end = (phys_addr_t) cache_reg.addr + cache_reg.len - 1,
+       };
++      pgmap->nr_range = 1;
+       fs->window_kaddr = devm_memremap_pages(&vdev->dev, pgmap);
+       if (IS_ERR(fs->window_kaddr))
+               return PTR_ERR(fs->window_kaddr);
+       fs->window_phys_addr = (phys_addr_t) cache_reg.addr;
+       fs->window_len = (phys_addr_t) cache_reg.len;
+       dev_dbg(&vdev->dev, "%s: window kaddr 0x%px phys_addr 0x%llx len 0x%llx\n",
+               __func__, fs->window_kaddr, cache_reg.addr, cache_reg.len);
+       fs->dax_dev = alloc_dax(fs, NULL, &virtio_fs_dax_ops, 0);
+       if (IS_ERR(fs->dax_dev))
+               return PTR_ERR(fs->dax_dev);
+       return devm_add_action_or_reset(&vdev->dev, virtio_fs_cleanup_dax,
+                                       fs->dax_dev);
+ }
  static int virtio_fs_probe(struct virtio_device *vdev)
  {
        struct virtio_fs *fs;
  
        /* TODO vq affinity */
  
+       ret = virtio_fs_setup_dax(vdev, fs);
+       if (ret < 0)
+               goto out_vqs;
        /* Bring the device online in case the filesystem is mounted and
         * requests need to be sent before we return.
         */
@@@ -833,18 -1018,37 +1018,37 @@@ __releases(fiq->lock
        spin_unlock(&fiq->lock);
  }
  
+ /* Count number of scatter-gather elements required */
+ static unsigned int sg_count_fuse_pages(struct fuse_page_desc *page_descs,
+                                      unsigned int num_pages,
+                                      unsigned int total_len)
+ {
+       unsigned int i;
+       unsigned int this_len;
+       for (i = 0; i < num_pages && total_len; i++) {
+               this_len =  min(page_descs[i].length, total_len);
+               total_len -= this_len;
+       }
+       return i;
+ }
  /* Return the number of scatter-gather list elements required */
  static unsigned int sg_count_fuse_req(struct fuse_req *req)
  {
        struct fuse_args *args = req->args;
        struct fuse_args_pages *ap = container_of(args, typeof(*ap), args);
-       unsigned int total_sgs = 1 /* fuse_in_header */;
+       unsigned int size, total_sgs = 1 /* fuse_in_header */;
  
        if (args->in_numargs - args->in_pages)
                total_sgs += 1;
  
-       if (args->in_pages)
-               total_sgs += ap->num_pages;
+       if (args->in_pages) {
+               size = args->in_args[args->in_numargs - 1].size;
+               total_sgs += sg_count_fuse_pages(ap->descs, ap->num_pages,
+                                                size);
+       }
  
        if (!test_bit(FR_ISREPLY, &req->flags))
                return total_sgs;
        if (args->out_numargs - args->out_pages)
                total_sgs += 1;
  
-       if (args->out_pages)
-               total_sgs += ap->num_pages;
+       if (args->out_pages) {
+               size = args->out_args[args->out_numargs - 1].size;
+               total_sgs += sg_count_fuse_pages(ap->descs, ap->num_pages,
+                                                size);
+       }
  
        return total_sgs;
  }
@@@ -1071,24 -1278,28 +1278,28 @@@ static const struct fuse_iqueue_ops vir
        .release                        = virtio_fs_fiq_release,
  };
  
- static int virtio_fs_fill_super(struct super_block *sb)
+ static inline void virtio_fs_ctx_set_defaults(struct fuse_fs_context *ctx)
  {
-       struct fuse_conn *fc = get_fuse_conn_super(sb);
+       ctx->rootmode = S_IFDIR;
+       ctx->default_permissions = 1;
+       ctx->allow_other = 1;
+       ctx->max_read = UINT_MAX;
+       ctx->blksize = 512;
+       ctx->destroy = true;
+       ctx->no_control = true;
+       ctx->no_force_umount = true;
+ }
+ static int virtio_fs_fill_super(struct super_block *sb, struct fs_context *fsc)
+ {
+       struct fuse_mount *fm = get_fuse_mount_super(sb);
+       struct fuse_conn *fc = fm->fc;
        struct virtio_fs *fs = fc->iq.priv;
+       struct fuse_fs_context *ctx = fsc->fs_private;
        unsigned int i;
        int err;
-       struct fuse_fs_context ctx = {
-               .rootmode = S_IFDIR,
-               .default_permissions = 1,
-               .allow_other = 1,
-               .max_read = UINT_MAX,
-               .blksize = 512,
-               .destroy = true,
-               .no_control = true,
-               .no_force_umount = true,
-               .no_mount_options = true,
-       };
  
+       virtio_fs_ctx_set_defaults(ctx);
        mutex_lock(&virtio_fs_mutex);
  
        /* After holding mutex, make sure virtiofs device is still there.
        }
  
        /* virtiofs allocates and installs its own fuse devices */
-       ctx.fudptr = NULL;
-       err = fuse_fill_super_common(sb, &ctx);
+       ctx->fudptr = NULL;
+       if (ctx->dax)
+               ctx->dax_dev = fs->dax_dev;
+       err = fuse_fill_super_common(sb, ctx);
        if (err < 0)
                goto err_free_fuse_devs;
  
  
        /* Previous unmount will stop all queues. Start these again */
        virtio_fs_start_all_queues(fs);
-       fuse_send_init(fc);
+       fuse_send_init(fm);
        mutex_unlock(&virtio_fs_mutex);
        return 0;
  
        return err;
  }
  
- static void virtio_kill_sb(struct super_block *sb)
+ static void virtio_fs_conn_destroy(struct fuse_mount *fm)
  {
-       struct fuse_conn *fc = get_fuse_conn_super(sb);
-       struct virtio_fs *vfs;
-       struct virtio_fs_vq *fsvq;
-       /* If mount failed, we can still be called without any fc */
-       if (!fc)
-               return fuse_kill_sb_anon(sb);
+       struct fuse_conn *fc = fm->fc;
+       struct virtio_fs *vfs = fc->iq.priv;
+       struct virtio_fs_vq *fsvq = &vfs->vqs[VQ_HIPRIO];
  
-       vfs = fc->iq.priv;
-       fsvq = &vfs->vqs[VQ_HIPRIO];
+       /* Stop dax worker. Soon evict_inodes() will be called which
+        * will free all memory ranges belonging to all inodes.
+        */
+       if (IS_ENABLED(CONFIG_FUSE_DAX))
+               fuse_dax_cancel_work(fc);
  
        /* Stop forget queue. Soon destroy will be sent */
        spin_lock(&fsvq->lock);
        spin_unlock(&fsvq->lock);
        virtio_fs_drain_all_queues(vfs);
  
-       fuse_kill_sb_anon(sb);
+       fuse_conn_destroy(fm);
  
-       /* fuse_kill_sb_anon() must have sent destroy. Stop all queues
+       /* fuse_conn_destroy() must have sent destroy. Stop all queues
         * and drain one more time and free fuse devices. Freeing fuse
         * devices will drop their reference on fuse_conn and that in
         * turn will drop its reference on virtio_fs object.
        virtio_fs_free_devs(vfs);
  }
  
+ static void virtio_kill_sb(struct super_block *sb)
+ {
+       struct fuse_mount *fm = get_fuse_mount_super(sb);
+       bool last;
+       /* If mount failed, we can still be called without any fc */
+       if (fm) {
+               last = fuse_mount_remove(fm);
+               if (last)
+                       virtio_fs_conn_destroy(fm);
+       }
+       kill_anon_super(sb);
+ }
  static int virtio_fs_test_super(struct super_block *sb,
                                struct fs_context *fsc)
  {
-       struct fuse_conn *fc = fsc->s_fs_info;
+       struct fuse_mount *fsc_fm = fsc->s_fs_info;
+       struct fuse_mount *sb_fm = get_fuse_mount_super(sb);
  
-       return fc->iq.priv == get_fuse_conn_super(sb)->iq.priv;
+       return fsc_fm->fc->iq.priv == sb_fm->fc->iq.priv;
  }
  
  static int virtio_fs_set_super(struct super_block *sb,
  
        err = get_anon_bdev(&sb->s_dev);
        if (!err)
-               fuse_conn_get(fsc->s_fs_info);
+               fuse_mount_get(fsc->s_fs_info);
  
        return err;
  }
@@@ -1192,6 -1419,7 +1419,7 @@@ static int virtio_fs_get_tree(struct fs
        struct virtio_fs *fs;
        struct super_block *sb;
        struct fuse_conn *fc;
+       struct fuse_mount *fm;
        int err;
  
        /* This gets a reference on virtio_fs object. This ptr gets installed
                return -ENOMEM;
        }
  
-       fuse_conn_init(fc, get_user_ns(current_user_ns()), &virtio_fs_fiq_ops,
-                      fs);
+       fm = kzalloc(sizeof(struct fuse_mount), GFP_KERNEL);
+       if (!fm) {
+               mutex_lock(&virtio_fs_mutex);
+               virtio_fs_put(fs);
+               mutex_unlock(&virtio_fs_mutex);
+               kfree(fc);
+               return -ENOMEM;
+       }
+       fuse_conn_init(fc, fm, get_user_ns(current_user_ns()),
+                      &virtio_fs_fiq_ops, fs);
        fc->release = fuse_free_conn;
        fc->delete_stale = true;
+       fc->auto_submounts = true;
  
-       fsc->s_fs_info = fc;
+       fsc->s_fs_info = fm;
        sb = sget_fc(fsc, virtio_fs_test_super, virtio_fs_set_super);
-       fuse_conn_put(fc);
+       fuse_mount_put(fm);
        if (IS_ERR(sb))
                return PTR_ERR(sb);
  
        if (!sb->s_root) {
-               err = virtio_fs_fill_super(sb);
+               err = virtio_fs_fill_super(sb, fsc);
                if (err) {
                        deactivate_locked_super(sb);
                        return err;
  }
  
  static const struct fs_context_operations virtio_fs_context_ops = {
+       .free           = virtio_fs_free_fc,
+       .parse_param    = virtio_fs_parse_param,
        .get_tree       = virtio_fs_get_tree,
  };
  
  static int virtio_fs_init_fs_context(struct fs_context *fsc)
  {
+       struct fuse_fs_context *ctx;
+       ctx = kzalloc(sizeof(struct fuse_fs_context), GFP_KERNEL);
+       if (!ctx)
+               return -ENOMEM;
+       fsc->fs_private = ctx;
        fsc->ops = &virtio_fs_context_ops;
        return 0;
  }
diff --combined include/linux/dax.h
@@@ -58,8 -58,6 +58,8 @@@ static inline void set_dax_synchronous(
  {
        __set_dax_synchronous(dax_dev);
  }
 +bool dax_supported(struct dax_device *dax_dev, struct block_device *bdev,
 +              int blocksize, sector_t start, sector_t len);
  /*
   * Check if given mapping is supported by the file / underlying device.
   */
@@@ -106,12 -104,6 +106,12 @@@ static inline bool dax_synchronous(stru
  static inline void set_dax_synchronous(struct dax_device *dax_dev)
  {
  }
 +static inline bool dax_supported(struct dax_device *dax_dev,
 +              struct block_device *bdev, int blocksize, sector_t start,
 +              sector_t len)
 +{
 +      return false;
 +}
  static inline bool daxdev_mapping_supported(struct vm_area_struct *vma,
                                struct dax_device *dax_dev)
  {
@@@ -149,6 -141,7 +149,7 @@@ int dax_writeback_mapping_range(struct 
                struct dax_device *dax_dev, struct writeback_control *wbc);
  
  struct page *dax_layout_busy_page(struct address_space *mapping);
+ struct page *dax_layout_busy_page_range(struct address_space *mapping, loff_t start, loff_t end);
  dax_entry_t dax_lock_page(struct page *page);
  void dax_unlock_page(struct page *page, dax_entry_t cookie);
  #else
@@@ -179,6 -172,11 +180,11 @@@ static inline struct page *dax_layout_b
        return NULL;
  }
  
+ static inline struct page *dax_layout_busy_page_range(struct address_space *mapping, pgoff_t start, pgoff_t nr_pages)
+ {
+       return NULL;
+ }
  static inline int dax_writeback_mapping_range(struct address_space *mapping,
                struct dax_device *dax_dev, struct writeback_control *wbc)
  {
@@@ -197,23 -195,14 +203,23 @@@ static inline void dax_unlock_page(stru
  }
  #endif
  
 +#if IS_ENABLED(CONFIG_DAX)
  int dax_read_lock(void);
  void dax_read_unlock(int id);
 +#else
 +static inline int dax_read_lock(void)
 +{
 +      return 0;
 +}
 +
 +static inline void dax_read_unlock(int id)
 +{
 +}
 +#endif /* CONFIG_DAX */
  bool dax_alive(struct dax_device *dax_dev);
  void *dax_get_private(struct dax_device *dax_dev);
  long dax_direct_access(struct dax_device *dax_dev, pgoff_t pgoff, long nr_pages,
                void **kaddr, pfn_t *pfn);
 -bool dax_supported(struct dax_device *dax_dev, struct block_device *bdev,
 -              int blocksize, sector_t start, sector_t len);
  size_t dax_copy_from_iter(struct dax_device *dax_dev, pgoff_t pgoff, void *addr,
                size_t bytes, struct iov_iter *i);
  size_t dax_copy_to_iter(struct dax_device *dax_dev, pgoff_t pgoff, void *addr,
@@@ -231,18 -220,11 +237,18 @@@ vm_fault_t dax_finish_sync_fault(struc
  int dax_delete_mapping_entry(struct address_space *mapping, pgoff_t index);
  int dax_invalidate_mapping_entry_sync(struct address_space *mapping,
                                      pgoff_t index);
 -int dax_iomap_zero(loff_t pos, unsigned offset, unsigned size,
 -                      struct iomap *iomap);
 +s64 dax_iomap_zero(loff_t pos, u64 length, struct iomap *iomap);
  static inline bool dax_mapping(struct address_space *mapping)
  {
        return mapping->host && IS_DAX(mapping->host);
  }
  
 +#ifdef CONFIG_DEV_DAX_HMEM_DEVICES
 +void hmem_register_device(int target_nid, struct resource *r);
 +#else
 +static inline void hmem_register_device(int target_nid, struct resource *r)
 +{
 +}
 +#endif
 +
  #endif