Merge tag 'f2fs-for-6.3-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/jaegeuk...
authorLinus Torvalds <torvalds@linux-foundation.org>
Tue, 28 Feb 2023 00:18:51 +0000 (16:18 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 28 Feb 2023 00:18:51 +0000 (16:18 -0800)
Pull f2fs updates from Jaegeuk Kim:
 "In this round, we've got a huge number of patches that improve code
  readability along with minor bug fixes, while we've mainly fixed some
  critical issues in recently-added per-block age-based extent_cache,
  atomic write support, and some folio cases.

  Enhancements:

   - add sysfs nodes to set last_age_weight and manage
     discard_io_aware_gran

   - show ipu policy in debugfs

   - reduce stack memory cost by using bitfield in struct f2fs_io_info

   - introduce trace_f2fs_replace_atomic_write_block

   - enhance iostat support and adds flush commands

  Bug fixes:

   - revert "f2fs: truncate blocks in batch in __complete_revoke_list()"

   - fix kernel crash on the atomic write abort flow

   - call clear_page_private_reference in .{release,invalid}_folio

   - support .migrate_folio for compressed inode

   - fix cgroup writeback accounting with fs-layer encryption

   - retry to update the inode page given data corruption

   - fix kernel crash due to NULL io->bio

   - fix some bugs in per-block age-based extent_cache:
       - wrong calculation of block age
       - update age extent in f2fs_do_zero_range()
       - update age extent correctly during truncation"

* tag 'f2fs-for-6.3-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/jaegeuk/f2fs: (81 commits)
  f2fs: drop unnecessary arg for f2fs_ioc_*()
  f2fs: Revert "f2fs: truncate blocks in batch in __complete_revoke_list()"
  f2fs: synchronize atomic write aborts
  f2fs: fix wrong segment count
  f2fs: replace si->sbi w/ sbi in stat_show()
  f2fs: export ipu policy in debugfs
  f2fs: make kobj_type structures constant
  f2fs: fix to do sanity check on extent cache correctly
  f2fs: add missing description for ipu_policy node
  f2fs: fix to set ipu policy
  f2fs: fix typos in comments
  f2fs: fix kernel crash due to null io->bio
  f2fs: use iostat_lat_type directly as a parameter in the iostat_update_and_unbind_ctx()
  f2fs: add sysfs nodes to set last_age_weight
  f2fs: fix f2fs_show_options to show nogc_merge mount option
  f2fs: fix cgroup writeback accounting with fs-layer encryption
  f2fs: fix wrong calculation of block age
  f2fs: fix to update age extent in f2fs_do_zero_range()
  f2fs: fix to update age extent correctly during truncation
  f2fs: fix to avoid potential memory corruption in __update_iostat_latency()
  ...

1  2 
MAINTAINERS
fs/f2fs/checkpoint.c
fs/f2fs/data.c
fs/f2fs/f2fs.h
fs/f2fs/file.c
fs/f2fs/namei.c
fs/f2fs/node.c
fs/f2fs/super.c
fs/f2fs/verity.c

diff --combined MAINTAINERS
index edd3d562beeeb5bee8f5225727f53031343807a7,d0485b58b9d9081ecbc66b335609f43f65112931..b0db911207ba4e49e47c238e4aecee65a8515e9c
@@@ -361,8 -361,6 +361,8 @@@ T: git git://git.kernel.org/pub/scm/lin
  F:    Documentation/ABI/testing/configfs-acpi
  F:    Documentation/ABI/testing/sysfs-bus-acpi
  F:    Documentation/firmware-guide/acpi/
 +F:    arch/x86/kernel/acpi/
 +F:    arch/x86/pci/acpi.c
  F:    drivers/acpi/
  F:    drivers/pci/*/*acpi*
  F:    drivers/pci/*acpi*
@@@ -385,7 -383,7 +385,7 @@@ ACPI COMPONENT ARCHITECTURE (ACPICA
  M:    Robert Moore <robert.moore@intel.com>
  M:    "Rafael J. Wysocki" <rafael.j.wysocki@intel.com>
  L:    linux-acpi@vger.kernel.org
 -L:    devel@acpica.org
 +L:    acpica-devel@lists.linuxfoundation.org
  S:    Supported
  W:    https://acpica.org/
  W:    https://github.com/acpica/acpica/
@@@ -1099,12 -1097,14 +1099,12 @@@ S:   Maintaine
  F:    drivers/dma/ptdma/
  
  AMD SEATTLE DEVICE TREE SUPPORT
 -M:    Brijesh Singh <brijeshkumar.singh@amd.com>
  M:    Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
  M:    Tom Lendacky <thomas.lendacky@amd.com>
  S:    Supported
  F:    arch/arm64/boot/dts/amd/
  
  AMD XGBE DRIVER
 -M:    Tom Lendacky <thomas.lendacky@amd.com>
  M:    "Shyam Sundar S K" <Shyam-sundar.S-k@amd.com>
  L:    netdev@vger.kernel.org
  S:    Supported
@@@ -1853,6 -1853,21 +1853,6 @@@ F:     include/dt-bindings/reset/actions,
  F:    include/linux/soc/actions/
  N:    owl
  
 -ARM/ADS SPHERE MACHINE SUPPORT
 -M:    Lennert Buytenhek <kernel@wantstofly.org>
 -L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 -S:    Maintained
 -
 -ARM/AFEB9260 MACHINE SUPPORT
 -M:    Sergey Lapin <slapin@ossfans.org>
 -L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 -S:    Maintained
 -
 -ARM/AJECO 1ARM MACHINE SUPPORT
 -M:    Lennert Buytenhek <kernel@wantstofly.org>
 -L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 -S:    Maintained
 -
  ARM/Allwinner SoC Clock Support
  M:    Emilio López <emilio@elopez.com.ar>
  S:    Maintained
@@@ -1873,7 -1888,7 +1873,7 @@@ F:      drivers/pinctrl/sunxi
  F:    drivers/soc/sunxi/
  N:    allwinner
  N:    sun[x456789]i
 -N:    sun50i
 +N:    sun[25]0i
  
  ARM/Amlogic Meson SoC CLOCK FRAMEWORK
  M:    Neil Armstrong <neil.armstrong@linaro.org>
@@@ -2043,6 -2058,11 +2043,6 @@@ F:     arch/arm/boot/dts/ecx-*.dts
  F:    arch/arm/boot/dts/highbank.dts
  F:    arch/arm/mach-highbank/
  
 -ARM/CAVIUM NETWORKS CNS3XXX MACHINE SUPPORT
 -M:    Krzysztof Halasa <khalasa@piap.pl>
 -S:    Maintained
 -F:    arch/arm/mach-cns3xxx/
 -
  ARM/CAVIUM THUNDER NETWORK DRIVER
  M:    Sunil Goutham <sgoutham@marvell.com>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
@@@ -2071,10 -2091,8 +2071,10 @@@ M:    Hartley Sweeten <hsweeten@visionengr
  M:    Alexander Sverdlin <alexander.sverdlin@gmail.com>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
 +F:    Documentation/devicetree/bindings/iio/adc/cirrus,ep9301-adc.yaml
 +F:    arch/arm/boot/compressed/misc-ep93xx.h
  F:    arch/arm/mach-ep93xx/
 -F:    arch/arm/mach-ep93xx/include/mach/
 +F:    drivers/iio/adc/ep93xx_adc.c
  
  ARM/CLKDEV SUPPORT
  M:    Russell King <linux@armlinux.org.uk>
@@@ -2090,6 -2108,11 +2090,6 @@@ S:     Maintaine
  F:    arch/arm/boot/dts/cx92755*
  N:    digicolor
  
 -ARM/CONTEC MICRO9 MACHINE SUPPORT
 -M:    Hubert Feurstein <hubert.feurstein@contec.at>
 -S:    Maintained
 -F:    arch/arm/mach-ep93xx/micro9.c
 -
  ARM/CORESIGHT FRAMEWORK AND DRIVERS
  M:    Mathieu Poirier <mathieu.poirier@linaro.org>
  M:    Suzuki K Poulose <suzuki.poulose@arm.com>
@@@ -2101,7 -2124,6 +2101,7 @@@ S:      Maintaine
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/coresight/linux.git
  F:    Documentation/ABI/testing/sysfs-bus-coresight-devices-*
  F:    Documentation/devicetree/bindings/arm/arm,coresight-*.yaml
 +F:    Documentation/devicetree/bindings/arm/qcom,coresight-*.yaml
  F:    Documentation/devicetree/bindings/arm/arm,embedded-trace-extension.yaml
  F:    Documentation/devicetree/bindings/arm/arm,trace-buffer-extension.yaml
  F:    Documentation/trace/coresight/*
@@@ -2117,6 -2139,10 +2117,6 @@@ F:     tools/perf/arch/arm/util/pmu.
  F:    tools/perf/util/cs-etm-decoder/*
  F:    tools/perf/util/cs-etm.*
  
 -ARM/CORGI MACHINE SUPPORT
 -M:    Richard Purdie <rpurdie@rpsys.net>
 -S:    Maintained
 -
  ARM/CORTINA SYSTEMS GEMINI ARM ARCHITECTURE
  M:    Hans Ulli Kroll <ulli.kroll@googlemail.com>
  M:    Linus Walleij <linus.walleij@linaro.org>
@@@ -2156,6 -2182,12 +2156,6 @@@ F:     include/dt-bindings/bus/moxtet.
  F:    include/linux/armada-37xx-rwtm-mailbox.h
  F:    include/linux/moxtet.h
  
 -ARM/EZX SMARTPHONES (A780, A910, A1200, E680, ROKR E2 and ROKR E6)
 -M:    Robert Jarzmik <robert.jarzmik@free.fr>
 -L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 -S:    Maintained
 -F:    arch/arm/mach-pxa/ezx.c
 -
  ARM/FARADAY FA526 PORT
  M:    Hans Ulli Kroll <ulli.kroll@googlemail.com>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
@@@ -2181,9 -2213,6 +2181,9 @@@ L:      linux-arm-kernel@lists.infradead.or
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/shawnguo/linux.git
  X:    drivers/media/i2c/
 +F:    arch/arm64/boot/dts/freescale/
 +X:    arch/arm64/boot/dts/freescale/fsl-*
 +X:    arch/arm64/boot/dts/freescale/qoriq-*
  N:    imx
  N:    mxs
  
@@@ -2208,11 -2237,25 +2208,11 @@@ T:   git git://git.kernel.org/pub/scm/lin
  F:    arch/arm/boot/dts/vf*
  F:    arch/arm/mach-imx/*vf610*
  
 -ARM/GLOMATION GESBC9312SX MACHINE SUPPORT
 -M:    Lennert Buytenhek <kernel@wantstofly.org>
 -L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 -S:    Maintained
 -
  ARM/GUMSTIX MACHINE SUPPORT
  M:    Steve Sakoman <sakoman@gmail.com>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
  
 -ARM/H4700 (HP IPAQ HX4700) MACHINE SUPPORT
 -M:    Philipp Zabel <philipp.zabel@gmail.com>
 -M:    Paul Parsons <lost.distance@yahoo.com>
 -L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 -S:    Maintained
 -F:    arch/arm/mach-pxa/hx4700.c
 -F:    arch/arm/mach-pxa/include/mach/hx4700.h
 -F:    sound/soc/pxa/hx4700.c
 -
  ARM/HISILICON SOC SUPPORT
  M:    Wei Xu <xuwei5@hisilicon.com>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
@@@ -2237,18 -2280,13 +2237,18 @@@ ARM/HPE GXP ARCHITECTUR
  M:    Jean-Marie Verdun <verdun@hpe.com>
  M:    Nick Hawkins <nick.hawkins@hpe.com>
  S:    Maintained
 +F:    Documentation/hwmon/gxp-fan-ctrl.rst
  F:    Documentation/devicetree/bindings/arm/hpe,gxp.yaml
 +F:    Documentation/devicetree/bindings/hwmon/hpe,gxp-fan-ctrl.yaml
 +F:    Documentation/devicetree/bindings/i2c/hpe,gxp-i2c.yaml
  F:    Documentation/devicetree/bindings/spi/hpe,gxp-spifi.yaml
  F:    Documentation/devicetree/bindings/timer/hpe,gxp-timer.yaml
  F:    arch/arm/boot/dts/hpe-bmc*
  F:    arch/arm/boot/dts/hpe-gxp*
  F:    arch/arm/mach-hpe/
  F:    drivers/clocksource/timer-gxp.c
 +F:    drivers/hwmon/gxp-fan-ctrl.c
 +F:    drivers/i2c/busses/i2c-gxp.c
  F:    drivers/spi/spi-gxp.c
  F:    drivers/watchdog/gxp-wdt.c
  
@@@ -2260,6 -2298,27 +2260,6 @@@ L:     linux-arm-kernel@lists.infradead.or
  S:    Maintained
  F:    arch/arm/boot/dts/omap3-igep*
  
 -ARM/INCOME PXA270 SUPPORT
 -M:    Marek Vasut <marek.vasut@gmail.com>
 -L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 -S:    Maintained
 -F:    arch/arm/mach-pxa/colibri-pxa270-income.c
 -
 -ARM/INTEL IOP32X ARM ARCHITECTURE
 -M:    Lennert Buytenhek <kernel@wantstofly.org>
 -L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 -S:    Maintained
 -
 -ARM/INTEL IQ81342EX MACHINE SUPPORT
 -M:    Lennert Buytenhek <kernel@wantstofly.org>
 -L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 -S:    Maintained
 -
 -ARM/INTEL IXDP2850 MACHINE SUPPORT
 -M:    Lennert Buytenhek <kernel@wantstofly.org>
 -L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 -S:    Maintained
 -
  ARM/INTEL IXP4XX ARM ARCHITECTURE
  M:    Linus Walleij <linusw@kernel.org>
  M:    Imre Kaloz <kaloz@openwrt.org>
@@@ -2267,7 -2326,7 +2267,7 @@@ M:      Krzysztof Halasa <khalasa@piap.pl
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
  F:    Documentation/devicetree/bindings/arm/intel-ixp4xx.yaml
 -F:    Documentation/devicetree/bindings/bus/intel,ixp4xx-expansion-bus-controller.yaml
 +F:    Documentation/devicetree/bindings/memory-controllers/intel,ixp4xx-expansion*
  F:    Documentation/devicetree/bindings/gpio/intel,ixp4xx-gpio.txt
  F:    Documentation/devicetree/bindings/interrupt-controller/intel,ixp4xx-interrupt.yaml
  F:    Documentation/devicetree/bindings/timer/intel,ixp4xx-timer.yaml
@@@ -2292,12 -2351,22 +2292,12 @@@ M:   Lennert Buytenhek <kernel@wantstofly
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
  
 -ARM/IP FABRICS DOUBLE ESPRESSO MACHINE SUPPORT
 -M:    Lennert Buytenhek <kernel@wantstofly.org>
 -L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 -S:    Maintained
 -
  ARM/LG1K ARCHITECTURE
  M:    Chanho Min <chanho.min@lge.com>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
  F:    arch/arm64/boot/dts/lg/
  
 -ARM/LOGICPD PXA270 MACHINE SUPPORT
 -M:    Lennert Buytenhek <kernel@wantstofly.org>
 -L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 -S:    Maintained
 -
  ARM/LPC18XX ARCHITECTURE
  M:    Vladimir Zapolskiy <vz@mleia.com>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
@@@ -2324,6 -2393,10 +2324,6 @@@ F:     drivers/usb/host/ohci-nxp.
  F:    drivers/watchdog/pnx4008_wdt.c
  N:    lpc32xx
  
 -ARM/MAGICIAN MACHINE SUPPORT
 -M:    Philipp Zabel <philipp.zabel@gmail.com>
 -S:    Maintained
 -
  ARM/Marvell Dove/MV78xx0/Orion SOC support
  M:    Andrew Lunn <andrew@lunn.ch>
  M:    Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
@@@ -2378,14 -2451,11 +2378,14 @@@ F:   drivers/rtc/rtc-mt7622.
  
  ARM/Mediatek SoC support
  M:    Matthias Brugger <matthias.bgg@gmail.com>
 +R:    AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
 +L:    linux-kernel@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
  W:    https://mtk.wiki.kernel.org/
 -C:    irc://chat.freenode.net/linux-mediatek
 +C:    irc://irc.libera.chat/linux-mediatek
 +F:    arch/arm/boot/dts/mt2*
  F:    arch/arm/boot/dts/mt6*
  F:    arch/arm/boot/dts/mt7*
  F:    arch/arm/boot/dts/mt8*
@@@ -2393,7 -2463,7 +2393,7 @@@ F:      arch/arm/mach-mediatek
  F:    arch/arm64/boot/dts/mediatek/
  F:    drivers/soc/mediatek/
  N:    mtk
 -N:    mt[678]
 +N:    mt[2678]
  K:    mediatek
  
  ARM/Mediatek USB3 PHY DRIVER
@@@ -2455,6 -2525,12 +2455,6 @@@ F:     arch/arm/boot/dts/milbeaut
  F:    arch/arm/mach-milbeaut/
  N:    milbeaut
  
 -ARM/MIOA701 MACHINE SUPPORT
 -M:    Robert Jarzmik <robert.jarzmik@free.fr>
 -L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 -S:    Maintained
 -F:    arch/arm/mach-pxa/mioa701.c
 -
  ARM/MStar/Sigmastar Armv7 SoC support
  M:    Daniel Palmer <daniel@thingy.jp>
  M:    Romain Perier <romain.perier@gmail.com>
@@@ -2475,6 -2551,10 +2475,6 @@@ F:     drivers/watchdog/msc313e_wdt.
  F:    include/dt-bindings/clock/mstar-*
  F:    include/dt-bindings/gpio/msc313-gpio.h
  
 -ARM/NEC MOBILEPRO 900/c MACHINE SUPPORT
 -M:    Michael Petchkovsky <mkpetch@internode.on.net>
 -S:    Maintained
 -
  ARM/NOMADIK/Ux500 ARCHITECTURES
  M:    Linus Walleij <linus.walleij@linaro.org>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
@@@ -2530,7 -2610,6 +2530,7 @@@ S:      Maintaine
  W:    https://github.com/neuschaefer/wpcm450/wiki
  F:    Documentation/devicetree/bindings/*/*wpcm*
  F:    arch/arm/boot/dts/nuvoton-wpcm450*
 +F:    arch/arm/configs/wpcm450_defconfig
  F:    arch/arm/mach-npcm/wpcm450.c
  F:    drivers/*/*/*wpcm*
  F:    drivers/*/*wpcm*
@@@ -2544,6 -2623,13 +2544,6 @@@ L:     linux-arm-kernel@lists.infradead.or
  S:    Maintained
  F:    arch/arm64/boot/dts/freescale/s32g*.dts*
  
 -ARM/OPENMOKO NEO FREERUNNER (GTA02) MACHINE SUPPORT
 -L:    openmoko-kernel@lists.openmoko.org (subscribers-only)
 -S:    Orphan
 -W:    http://wiki.openmoko.org/wiki/Neo_FreeRunner
 -F:    arch/arm/mach-s3c/gta02.h
 -F:    arch/arm/mach-s3c/mach-gta02.c
 -
  ARM/Orion SoC/Technologic Systems TS-78xx platform support
  M:    Alexander Clouter <alex@digriz.org.uk>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
@@@ -2561,6 -2647,43 +2561,6 @@@ F:     arch/arm/mach-oxnas
  F:    drivers/power/reset/oxnas-restart.c
  N:    oxnas
  
 -ARM/PALM TREO SUPPORT
 -L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 -S:    Orphan
 -F:    arch/arm/mach-pxa/palmtreo.*
 -
 -ARM/PALMTX,PALMT5,PALMLD,PALMTE2,PALMTC SUPPORT
 -M:    Marek Vasut <marek.vasut@gmail.com>
 -L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 -S:    Maintained
 -W:    http://hackndev.com
 -F:    arch/arm/mach-pxa/include/mach/palmld.h
 -F:    arch/arm/mach-pxa/include/mach/palmtc.h
 -F:    arch/arm/mach-pxa/include/mach/palmtx.h
 -F:    arch/arm/mach-pxa/palmld.c
 -F:    arch/arm/mach-pxa/palmt5.*
 -F:    arch/arm/mach-pxa/palmtc.c
 -F:    arch/arm/mach-pxa/palmte2.*
 -F:    arch/arm/mach-pxa/palmtx.c
 -
 -ARM/PALMZ72 SUPPORT
 -M:    Sergey Lapin <slapin@ossfans.org>
 -L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 -S:    Maintained
 -W:    http://hackndev.com
 -F:    arch/arm/mach-pxa/palmz72.*
 -
 -ARM/PLEB SUPPORT
 -M:    Peter Chubb <pleb@gelato.unsw.edu.au>
 -S:    Maintained
 -W:    http://www.disy.cse.unsw.edu.au/Hardware/PLEB
 -
 -ARM/PT DIGITAL BOARD PORT
 -M:    Stefan Eletzhofer <stefan.eletzhofer@eletztrick.de>
 -L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 -S:    Maintained
 -W:    http://www.armlinux.org.uk/
 -
  ARM/QUALCOMM SUPPORT
  M:    Andy Gross <agross@kernel.org>
  M:    Bjorn Andersson <andersson@kernel.org>
@@@ -2604,6 -2727,11 +2604,6 @@@ F:     include/dt-bindings/*/qcom
  F:    include/linux/*/qcom*
  F:    include/linux/soc/qcom/
  
 -ARM/RADISYS ENP2611 MACHINE SUPPORT
 -M:    Lennert Buytenhek <kernel@wantstofly.org>
 -L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 -S:    Maintained
 -
  ARM/RDA MICRO ARCHITECTURE
  M:    Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
@@@ -2679,7 -2807,7 +2679,7 @@@ F:      Documentation/devicetree/bindings/i2
  F:    Documentation/devicetree/bindings/mmc/rockchip-dw-mshc.yaml
  F:    Documentation/devicetree/bindings/spi/spi-rockchip.yaml
  F:    arch/arm/boot/dts/rk3*
 -F:    arch/arm/boot/dts/rv1108*
 +F:    arch/arm/boot/dts/rv11*
  F:    arch/arm/mach-rockchip/
  F:    drivers/*/*/*rockchip*
  F:    drivers/*/*rockchip*
@@@ -2724,6 -2852,7 +2724,6 @@@ F:      include/linux/platform_data/*s3c
  F:    include/linux/serial_s3c.h
  F:    include/linux/soc/samsung/
  N:    exynos
 -N:    s3c2410
  N:    s3c64xx
  N:    s5pv210
  
@@@ -2739,7 -2868,7 +2739,7 @@@ M:      Marek Szyprowski <m.szyprowski@samsu
  L:    linux-samsung-soc@vger.kernel.org
  L:    linux-media@vger.kernel.org
  S:    Maintained
 -F:    Documentation/devicetree/bindings/media/s5p-cec.txt
 +F:    Documentation/devicetree/bindings/media/cec/samsung,s5p-cec.yaml
  F:    drivers/media/cec/platform/s5p/
  
  ARM/SAMSUNG S5P SERIES JPEG CODEC SUPPORT
@@@ -2796,8 -2925,7 +2796,8 @@@ M:      Patrice Chotard <patrice.chotard@fos
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
  W:    http://www.stlinux.com
 -F:    Documentation/devicetree/bindings/i2c/i2c-st.txt
 +F:    Documentation/devicetree/bindings/spi/st,ssc-spi.yaml
 +F:    Documentation/devicetree/bindings/i2c/st,sti-i2c.yaml
  F:    arch/arm/boot/dts/sti*
  F:    arch/arm/mach-sti/
  F:    drivers/ata/ahci_st.c
@@@ -2873,7 -3001,7 +2873,7 @@@ M:      Hans Verkuil <hverkuil-cisco@xs4all.
  L:    linux-tegra@vger.kernel.org
  L:    linux-media@vger.kernel.org
  S:    Maintained
 -F:    Documentation/devicetree/bindings/media/tegra-cec.txt
 +F:    Documentation/devicetree/bindings/media/cec/nvidia,tegra114-cec.yaml
  F:    drivers/media/cec/platform/tegra/
  
  ARM/TESLA FSD SoC SUPPORT
@@@ -2882,7 -3010,7 +2882,7 @@@ M:      linux-fsd@tesla.co
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  L:    linux-samsung-soc@vger.kernel.org
  S:    Maintained
 -F:    arch/arm64/boot/dts/tesla*
 +F:    arch/arm64/boot/dts/tesla/
  
  ARM/TETON BGA MACHINE SUPPORT
  M:    "Mark F. Brown" <mark.brown314@gmail.com>
@@@ -2935,6 -3063,16 +2935,6 @@@ F:     arch/arm64/boot/dts/ti/Makefil
  F:    arch/arm64/boot/dts/ti/k3-*
  F:    include/dt-bindings/pinctrl/k3.h
  
 -ARM/THECUS N2100 MACHINE SUPPORT
 -M:    Lennert Buytenhek <kernel@wantstofly.org>
 -L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 -S:    Maintained
 -
 -ARM/TOSA MACHINE SUPPORT
 -M:    Dmitry Eremin-Solenikov <dbaryshkov@gmail.com>
 -M:    Dirk Opfer <dirk@opfer-online.de>
 -S:    Maintained
 -
  ARM/TOSHIBA VISCONTI ARCHITECTURE
  M:    Nobuhiro Iwamatsu <nobuhiro1.iwamatsu@toshiba.co.jp>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
@@@ -2965,7 -3103,6 +2965,7 @@@ S:      Maintaine
  F:    Documentation/devicetree/bindings/arm/socionext/uniphier.yaml
  F:    Documentation/devicetree/bindings/gpio/socionext,uniphier-gpio.yaml
  F:    Documentation/devicetree/bindings/pinctrl/socionext,uniphier-pinctrl.yaml
 +F:    Documentation/devicetree/bindings/soc/socionext/socionext,uniphier*.yaml
  F:    arch/arm/boot/dts/uniphier*
  F:    arch/arm/include/asm/hardware/cache-uniphier.h
  F:    arch/arm/mach-uniphier/
@@@ -2992,7 -3129,7 +2992,7 @@@ S:      Maintaine
  F:    */*/*/vexpress*
  F:    */*/vexpress*
  F:    arch/arm/boot/dts/vexpress*
 -F:    arch/arm/mach-vexpress/
 +F:    arch/arm/mach-versatile/
  F:    arch/arm64/boot/dts/arm/
  F:    drivers/clk/versatile/clk-vexpress-osc.c
  F:    drivers/clocksource/timer-versatile.c
@@@ -3005,6 -3142,13 +3005,6 @@@ S:     Maintaine
  W:    http://www.armlinux.org.uk/
  F:    arch/arm/vfp/
  
 -ARM/VOIPAC PXA270 SUPPORT
 -M:    Marek Vasut <marek.vasut@gmail.com>
 -L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 -S:    Maintained
 -F:    arch/arm/mach-pxa/include/mach/vpac270.h
 -F:    arch/arm/mach-pxa/vpac270.c
 -
  ARM/VT8500 ARM ARCHITECTURE
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Orphan
@@@ -3022,6 -3166,13 +3022,6 @@@ F:     drivers/video/fbdev/vt8500lcdfb.
  F:    drivers/video/fbdev/wm8505fb*
  F:    drivers/video/fbdev/wmt_ge_rops.*
  
 -ARM/ZIPIT Z2 SUPPORT
 -M:    Marek Vasut <marek.vasut@gmail.com>
 -L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 -S:    Maintained
 -F:    arch/arm/mach-pxa/include/mach/z2.h
 -F:    arch/arm/mach-pxa/z2.c
 -
  ARM/ZYNQ ARCHITECTURE
  M:    Michal Simek <michal.simek@xilinx.com>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
@@@ -3073,7 -3224,7 +3073,7 @@@ M:      Tianshu Qiu <tian.shu.qiu@intel.com
  L:    linux-media@vger.kernel.org
  S:    Maintained
  T:    git git://linuxtv.org/media_tree.git
 -F:    Documentation/devicetree/bindings/media/i2c/ak7375.txt
 +F:    Documentation/devicetree/bindings/media/i2c/asahi-kasei,ak7375.yaml
  F:    drivers/media/i2c/ak7375.c
  
  ASAHI KASEI AK8974 DRIVER
@@@ -3159,7 -3310,7 +3159,7 @@@ ASPEED CRYPTO DRIVE
  M:    Neal Liu <neal_liu@aspeedtech.com>
  L:    linux-aspeed@lists.ozlabs.org (moderated for non-subscribers)
  S:    Maintained
 -F:    Documentation/devicetree/bindings/crypto/aspeed,ast2500-hace.yaml
 +F:    Documentation/devicetree/bindings/crypto/aspeed,*
  F:    drivers/crypto/aspeed/
  
  ASUS NOTEBOOKS AND EEEPC ACPI/WMI EXTRAS DRIVERS
@@@ -3360,7 -3511,7 +3360,7 @@@ F:      drivers/net/ieee802154/atusb.
  AUDIT SUBSYSTEM
  M:    Paul Moore <paul@paul-moore.com>
  M:    Eric Paris <eparis@redhat.com>
 -L:    linux-audit@redhat.com (moderated for non-subscribers)
 +L:    audit@vger.kernel.org
  S:    Supported
  W:    https://github.com/linux-audit
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/pcmoore/audit.git
@@@ -3616,6 -3767,7 +3616,6 @@@ F:      net/bluetooth
  
  BONDING DRIVER
  M:    Jay Vosburgh <j.vosburgh@gmail.com>
 -M:    Veaceslav Falico <vfalico@gmail.com>
  M:    Andy Gospodarek <andy@greyhouse.net>
  L:    netdev@vger.kernel.org
  S:    Supported
@@@ -3868,13 -4020,6 +3868,13 @@@ L:    bpf@vger.kernel.or
  S:    Maintained
  F:    tools/testing/selftests/bpf/
  
 +BPF [DOCUMENTATION] (Related to Standardization)
 +R:    David Vernet <void@manifault.com>
 +L:    bpf@vger.kernel.org
 +L:    bpf@ietf.org
 +S:    Maintained
 +F:    Documentation/bpf/instruction-set.rst
 +
  BPF [MISC]
  L:    bpf@vger.kernel.org
  S:    Odd Fixes
@@@ -4154,17 -4299,6 +4154,17 @@@ L:    linux-kernel@vger.kernel.or
  S:    Maintained
  F:    drivers/phy/broadcom/phy-brcm-usb*
  
 +BROADCOM Broadband SoC High Speed SPI Controller DRIVER
 +M:    William Zhang <william.zhang@broadcom.com>
 +M:    Kursad Oney <kursad.oney@broadcom.com>
 +M:    Jonas Gorski <jonas.gorski@gmail.com>
 +R:    Broadcom internal kernel review list <bcm-kernel-feedback-list@broadcom.com>
 +L:    linux-spi@vger.kernel.org
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/spi/brcm,bcm63xx-hsspi.yaml
 +F:    drivers/spi/spi-bcm63xx-hsspi.c
 +F:    drivers/spi/spi-bcmbca-hsspi.c
 +
  BROADCOM ETHERNET PHY DRIVERS
  M:    Florian Fainelli <f.fainelli@gmail.com>
  R:    Broadcom internal kernel review list <bcm-kernel-feedback-list@broadcom.com>
@@@ -4670,11 -4804,12 +4670,11 @@@ F:   net/sched/sch_etf.
  F:    net/sched/sch_taprio.c
  
  CC2520 IEEE-802.15.4 RADIO DRIVER
 -M:    Varka Bhadram <varkabhadram@gmail.com>
 +M:    Stefan Schmidt <stefan@datenfreihafen.org>
  L:    linux-wpan@vger.kernel.org
 -S:    Maintained
 +S:    Odd Fixes
  F:    Documentation/devicetree/bindings/net/ieee802154/cc2520.txt
  F:    drivers/net/ieee802154/cc2520.c
 -F:    include/linux/spi/cc2520.h
  
  CCREE ARM TRUSTZONE CRYPTOCELL REE DRIVER
  M:    Gilad Ben-Yossef <gilad@benyossef.com>
@@@ -4699,7 -4834,7 +4699,7 @@@ S:      Supporte
  W:    http://linuxtv.org
  T:    git git://linuxtv.org/media_tree.git
  F:    Documentation/ABI/testing/debugfs-cec-error-inj
 -F:    Documentation/devicetree/bindings/media/cec.txt
 +F:    Documentation/devicetree/bindings/media/cec/cec-common.yaml
  F:    Documentation/driver-api/media/cec-core.rst
  F:    Documentation/userspace-api/media/cec
  F:    drivers/media/cec/
@@@ -4715,7 -4850,7 +4715,7 @@@ L:      linux-media@vger.kernel.or
  S:    Supported
  W:    http://linuxtv.org
  T:    git git://linuxtv.org/media_tree.git
 -F:    Documentation/devicetree/bindings/media/cec-gpio.txt
 +F:    Documentation/devicetree/bindings/media/cec/cec-gpio.yaml
  F:    drivers/media/cec/platform/cec-gpio/
  
  CELL BROADBAND ENGINE ARCHITECTURE
@@@ -4850,13 -4985,6 +4850,13 @@@ S:    Maintaine
  F:    Documentation/devicetree/bindings/sound/google,cros-ec-codec.yaml
  F:    sound/soc/codecs/cros_ec_codec.*
  
 +CHROMEOS EC UART DRIVER
 +M:    Bhanu Prakash Maiya <bhanumaiya@chromium.org>
 +R:    Benson Leung <bleung@chromium.org>
 +R:    Tzung-Bi Shih <tzungbi@kernel.org>
 +S:    Maintained
 +F:    drivers/platform/chrome/cros_ec_uart.c
 +
  CHROMEOS EC SUBDRIVERS
  M:    Benson Leung <bleung@chromium.org>
  R:    Guenter Roeck <groeck@chromium.org>
@@@ -4870,9 -4998,8 +4870,9 @@@ CHROMEOS EC USB TYPE-C DRIVE
  M:    Prashant Malani <pmalani@chromium.org>
  L:    chrome-platform@lists.linux.dev
  S:    Maintained
 -F:    drivers/platform/chrome/cros_ec_typec.c
 +F:    drivers/platform/chrome/cros_ec_typec.*
  F:    drivers/platform/chrome/cros_typec_switch.c
 +F:    drivers/platform/chrome/cros_typec_vdm.*
  
  CHROMEOS EC USB PD NOTIFY DRIVER
  M:    Prashant Malani <pmalani@chromium.org>
@@@ -5663,11 -5790,6 +5663,11 @@@ M:    SeongJae Park <sj@kernel.org
  L:    damon@lists.linux.dev
  L:    linux-mm@kvack.org
  S:    Maintained
 +W:    https://damonitor.github.io
 +P:    Documentation/mm/damon/maintainer-profile.rst
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm
 +T:    quilt git://git.kernel.org/pub/scm/linux/kernel/git/akpm/25-new
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/sj/linux.git damon/next
  F:    Documentation/ABI/testing/sysfs-kernel-mm-damon
  F:    Documentation/admin-guide/mm/damon/
  F:    Documentation/mm/damon/
@@@ -5805,6 -5927,7 +5805,6 @@@ F:      Documentation/ABI/testing/sysfs-plat
  F:    drivers/platform/x86/dell/dell-wmi-ddv.c
  
  DELL WMI SYSMAN DRIVER
 -M:    Divya Bharathi <divya.bharathi@dell.com>
  M:    Prasanth Ksr <prasanth.ksr@dell.com>
  L:    Dell.Client.Kernel@dell.com
  L:    platform-driver-x86@vger.kernel.org
@@@ -5912,7 -6035,6 +5912,7 @@@ M:      Dan Williams <dan.j.williams@intel.c
  M:    Vishal Verma <vishal.l.verma@intel.com>
  M:    Dave Jiang <dave.jiang@intel.com>
  L:    nvdimm@lists.linux.dev
 +L:    linux-cxl@vger.kernel.org
  S:    Supported
  F:    drivers/dax/
  
@@@ -5977,7 -6099,7 +5977,7 @@@ S:      Supporte
  F:    Documentation/networking/devlink
  F:    include/net/devlink.h
  F:    include/uapi/linux/devlink.h
 -F:    net/core/devlink.c
 +F:    net/devlink/
  
  DH ELECTRONICS IMX6 DHCOM/DHCOR BOARD SUPPORT
  M:    Christoph Niedermaier <cniedermaier@dh-electronics.com>
@@@ -6300,7 -6422,6 +6300,7 @@@ T:      git git://git.linbit.com/linux-drbd.
  T:    git git://git.linbit.com/drbd-8.4.git
  F:    Documentation/admin-guide/blockdev/
  F:    drivers/block/drbd/
 +F:    include/linux/drbd*
  F:    lib/lru_cache.c
  
  DRIVER COMPONENT FRAMEWORK
@@@ -6429,14 -6550,6 +6429,14 @@@ S:    Maintaine
  T:    git git://anongit.freedesktop.org/drm/drm-misc
  F:    drivers/gpu/drm/tiny/gm12u320.c
  
 +DRM DRIVER FOR HIMAX HX8394 MIPI-DSI LCD panels
 +M:    Ondrej Jirman <megi@xff.cz>
 +M:    Javier Martinez Canillas <javierm@redhat.com>
 +S:    Maintained
 +T:    git git://anongit.freedesktop.org/drm/drm-misc
 +F:    Documentation/devicetree/bindings/display/panel/himax,hx8394.yaml
 +F:    drivers/gpu/drm/panel/panel-himax-hx8394.c
 +
  DRM DRIVER FOR HX8357D PANELS
  M:    Emma Anholt <emma@anholt.net>
  S:    Maintained
@@@ -6458,6 -6571,11 +6458,6 @@@ T:     git git://anongit.freedesktop.org/dr
  F:    Documentation/devicetree/bindings/display/ilitek,ili9486.yaml
  F:    drivers/gpu/drm/tiny/ili9486.c
  
 -DRM DRIVER FOR INTEL I810 VIDEO CARDS
 -S:    Orphan / Obsolete
 -F:    drivers/gpu/drm/i810/
 -F:    include/uapi/drm/i810_drm.h
 -
  DRM DRIVER FOR JADARD JD9365DA-H3 MIPI-DSI LCD PANELS
  M:    Jagan Teki <jagan@edgeble.ai>
  S:    Maintained
@@@ -6486,6 -6604,11 +6486,6 @@@ S:     Maintaine
  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 GRAPHICS CHIPS
  M:    Dave Airlie <airlied@redhat.com>
  R:    Thomas Zimmermann <tzimmermann@suse.de>
@@@ -6604,6 -6727,11 +6604,6 @@@ T:     git git://anongit.freedesktop.org/dr
  F:    drivers/gpu/drm/qxl/
  F:    include/uapi/drm/qxl_drm.h
  
 -DRM DRIVER FOR RAGE 128 VIDEO CARDS
 -S:    Orphan / Obsolete
 -F:    drivers/gpu/drm/r128/
 -F:    include/uapi/drm/r128_drm.h
 -
  DRM DRIVER FOR RAYDIUM RM67191 PANELS
  M:    Robert Chiras <robert.chiras@nxp.com>
  S:    Maintained
@@@ -6631,6 -6759,11 +6631,6 @@@ S:     Maintaine
  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
 -F:    drivers/gpu/drm/savage/
 -F:    include/uapi/drm/savage_drm.h
 -
  DRM DRIVER FOR FIRMWARE FRAMEBUFFERS
  M:    Thomas Zimmermann <tzimmermann@suse.de>
  M:    Javier Martinez Canillas <javierm@redhat.com>
@@@ -6646,6 -6779,11 +6646,6 @@@ F:     include/drm/drm_aperture.
  F:    include/linux/aperture.h
  F:    include/video/nomodeset.h
  
 -DRM DRIVER FOR SIS VIDEO CARDS
 -S:    Orphan / Obsolete
 -F:    drivers/gpu/drm/sis/
 -F:    include/uapi/drm/sis_drm.h
 -
  DRM DRIVER FOR SITRONIX ST7586 PANELS
  M:    David Lechner <david@lechnology.com>
  S:    Maintained
@@@ -6673,6 -6811,10 +6673,6 @@@ T:     git git://anongit.freedesktop.org/dr
  F:    Documentation/devicetree/bindings/display/ste,mcde.yaml
  F:    drivers/gpu/drm/mcde/
  
 -DRM DRIVER FOR TDFX VIDEO CARDS
 -S:    Orphan / Obsolete
 -F:    drivers/gpu/drm/tdfx/
 -
  DRM DRIVER FOR TI DLPC3433 MIPI DSI TO DMD BRIDGE
  M:    Jagan Teki <jagan@amarulasolutions.com>
  S:    Maintained
@@@ -6772,16 -6914,6 +6772,16 @@@ C:    irc://irc.oftc.net/dri-deve
  T:    git https://git.kernel.org/pub/scm/linux/kernel/git/ogabbay/accel.git
  F:    Documentation/accel/
  F:    drivers/accel/
 +F:    include/drm/drm_accel.h
 +
 +DRM ACCEL DRIVERS FOR INTEL VPU
 +M:    Jacek Lawrynowicz <jacek.lawrynowicz@linux.intel.com>
 +M:    Stanislaw Gruszka <stanislaw.gruszka@linux.intel.com>
 +L:    dri-devel@lists.freedesktop.org
 +S:    Supported
 +T:    git git://anongit.freedesktop.org/drm/drm-misc
 +F:    drivers/accel/ivpu/
 +F:    include/uapi/drm/ivpu_accel.h
  
  DRM DRIVERS FOR ALLWINNER A10
  M:    Maxime Ripard <mripard@kernel.org>
@@@ -6816,7 -6948,7 +6816,7 @@@ F:      drivers/gpu/drm/atmel-hlcdc
  DRM DRIVERS FOR BRIDGE CHIPS
  M:    Andrzej Hajda <andrzej.hajda@intel.com>
  M:    Neil Armstrong <neil.armstrong@linaro.org>
 -M:    Robert Foss <robert.foss@linaro.org>
 +M:    Robert Foss <rfoss@kernel.org>
  R:    Laurent Pinchart <Laurent.pinchart@ideasonboard.com>
  R:    Jonas Karlman <jonas@kwiboo.se>
  R:    Jernej Skrabec <jernej.skrabec@gmail.com>
@@@ -6852,7 -6984,7 +6852,7 @@@ M:      Philipp Zabel <p.zabel@pengutronix.d
  L:    dri-devel@lists.freedesktop.org
  S:    Maintained
  F:    Documentation/devicetree/bindings/display/imx/
 -F:    drivers/gpu/drm/imx/
 +F:    drivers/gpu/drm/imx/ipuv3/
  F:    drivers/gpu/ipu-v3/
  
  DRM DRIVERS FOR FREESCALE IMX BRIDGE
@@@ -6875,10 -7007,9 +6875,10 @@@ F:    drivers/gpu/drm/gma500
  DRM DRIVERS FOR HISILICON
  M:    Xinliang Liu <xinliang.liu@linaro.org>
  M:    Tian Tao  <tiantao6@hisilicon.com>
 -R:    John Stultz <jstultz@google.com>
  R:    Xinwei Kong <kong.kongxinwei@hisilicon.com>
 -R:    Chen Feng <puck.chen@hisilicon.com>
 +R:    Sumit Semwal <sumit.semwal@linaro.org>
 +R:    Yongqin Liu <yongqin.liu@linaro.org>
 +R:    John Stultz <jstultz@google.com>
  L:    dri-devel@lists.freedesktop.org
  S:    Maintained
  T:    git git://anongit.freedesktop.org/drm/drm-misc
@@@ -6919,7 -7050,7 +6919,7 @@@ M:      Thierry Reding <thierry.reding@gmail
  L:    dri-devel@lists.freedesktop.org
  L:    linux-tegra@vger.kernel.org
  S:    Supported
 -T:    git git://anongit.freedesktop.org/tegra/linux.git
 +T:    git https://gitlab.freedesktop.org/drm/tegra.git
  F:    Documentation/devicetree/bindings/display/tegra/nvidia,tegra20-host1x.yaml
  F:    Documentation/devicetree/bindings/gpu/host1x/
  F:    drivers/gpu/drm/tegra/
@@@ -7485,6 -7616,7 +7485,6 @@@ S:      Maintaine
  F:    drivers/firmware/efi/test/
  
  EFI VARIABLE FILESYSTEM
 -M:    Matthew Garrett <matthew.garrett@nebula.com>
  M:    Jeremy Kerr <jk@ozlabs.org>
  M:    Ard Biesheuvel <ardb@kernel.org>
  L:    linux-efi@vger.kernel.org
@@@ -7613,7 -7745,6 +7613,7 @@@ R:      Jeffle Xu <jefflexu@linux.alibaba.co
  L:    linux-erofs@lists.ozlabs.org
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/xiang/erofs.git
 +F:    Documentation/ABI/testing/sysfs-fs-erofs
  F:    Documentation/filesystems/erofs.rst
  F:    fs/erofs/
  F:    include/trace/events/erofs.h
@@@ -7764,11 -7895,7 +7764,11 @@@ F:    include/linux/extcon
  
  EXTRA BOOT CONFIG
  M:    Masami Hiramatsu <mhiramat@kernel.org>
 +L:    linux-kernel@vger.kernel.org
 +L:    linux-trace-kernel@vger.kernel.org
 +Q:    https://patchwork.kernel.org/project/linux-trace-kernel/list/
  S:    Maintained
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/trace/linux-trace.git
  F:    Documentation/admin-guide/bootconfig.rst
  F:    fs/proc/bootconfig.c
  F:    include/linux/bootconfig.h
@@@ -7795,6 -7922,7 +7795,7 @@@ M:      Chao Yu <chao@kernel.org
  L:    linux-f2fs-devel@lists.sourceforge.net
  S:    Maintained
  W:    https://f2fs.wiki.kernel.org/
+ Q:    https://patchwork.kernel.org/project/f2fs/list/
  B:    https://bugzilla.kernel.org/enter_bug.cgi?product=File%20System&component=f2fs
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/jaegeuk/f2fs.git
  F:    Documentation/ABI/testing/sysfs-fs-f2fs
@@@ -8069,7 -8197,7 +8070,7 @@@ F:      drivers/fpga/microchip-spi.
  FPU EMULATOR
  M:    Bill Metzenthen <billm@melbpc.org.au>
  S:    Maintained
 -W:    http://floatingpoint.sourceforge.net/emulator/index.html
 +W:    https://floatingpoint.billm.au/
  F:    arch/x86/math-emu/
  
  FRAMEBUFFER CORE
@@@ -8341,16 -8469,16 +8342,16 @@@ F:   fs/fscache
  F:    include/linux/fscache*.h
  
  FSCRYPT: FILE SYSTEM LEVEL ENCRYPTION SUPPORT
 +M:    Eric Biggers <ebiggers@kernel.org>
  M:    Theodore Y. Ts'o <tytso@mit.edu>
  M:    Jaegeuk Kim <jaegeuk@kernel.org>
 -M:    Eric Biggers <ebiggers@kernel.org>
  L:    linux-fscrypt@vger.kernel.org
  S:    Supported
  Q:    https://patchwork.kernel.org/project/linux-fscrypt/list/
 -T:    git git://git.kernel.org/pub/scm/fs/fscrypt/fscrypt.git
 +T:    git https://git.kernel.org/pub/scm/fs/fscrypt/linux.git
  F:    Documentation/filesystems/fscrypt.rst
  F:    fs/crypto/
 -F:    include/linux/fscrypt*.h
 +F:    include/linux/fscrypt.h
  F:    include/uapi/linux/fscrypt.h
  
  FSI SUBSYSTEM
@@@ -8393,10 -8521,10 +8394,10 @@@ F:   include/linux/fsnotify*.
  FSVERITY: READ-ONLY FILE-BASED AUTHENTICITY PROTECTION
  M:    Eric Biggers <ebiggers@kernel.org>
  M:    Theodore Y. Ts'o <tytso@mit.edu>
 -L:    linux-fscrypt@vger.kernel.org
 +L:    fsverity@lists.linux.dev
  S:    Supported
 -Q:    https://patchwork.kernel.org/project/linux-fscrypt/list/
 -T:    git git://git.kernel.org/pub/scm/fs/fscrypt/fscrypt.git fsverity
 +Q:    https://patchwork.kernel.org/project/fsverity/list/
 +T:    git https://git.kernel.org/pub/scm/fs/fsverity/linux.git
  F:    Documentation/filesystems/fsverity.rst
  F:    fs/verity/
  F:    include/linux/fsverity.h
@@@ -8444,7 -8572,6 +8445,7 @@@ F:      kernel/trace/fgraph.
  F:    arch/*/*/*/*ftrace*
  F:    arch/*/*/*ftrace*
  F:    include/*/ftrace.h
 +F:    samples/ftrace
  
  FUNGIBLE ETHERNET DRIVERS
  M:    Dimitris Michailidis <dmichail@fungible.com>
@@@ -8917,15 -9044,13 +8918,15 @@@ F:   block/partitions/efi.
  
  HABANALABS PCI DRIVER
  M:    Oded Gabbay <ogabbay@kernel.org>
 +L:    dri-devel@lists.freedesktop.org
  S:    Supported
 +C:    irc://irc.oftc.net/dri-devel
  T:    git https://git.kernel.org/pub/scm/linux/kernel/git/ogabbay/linux.git
  F:    Documentation/ABI/testing/debugfs-driver-habanalabs
  F:    Documentation/ABI/testing/sysfs-driver-habanalabs
 -F:    drivers/misc/habanalabs/
 +F:    drivers/accel/habanalabs/
  F:    include/trace/events/habanalabs.h
 -F:    include/uapi/misc/habanalabs.h
 +F:    include/uapi/drm/habanalabs_accel.h
  
  HACKRF MEDIA DRIVER
  M:    Antti Palosaari <crope@iki.fi>
@@@ -9076,12 -9201,9 +9077,12 @@@ M:    Benjamin Tissoires <benjamin.tissoir
  L:    linux-input@vger.kernel.org
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/hid/hid.git
 +F:    Documentation/hid/
  F:    drivers/hid/
  F:    include/linux/hid*
  F:    include/uapi/linux/hid*
 +F:    samples/hid/
 +F:    tools/testing/selftests/hid/
  
  HID LOGITECH DRIVERS
  R:    Filipe Laíns <lains@riseup.net>
@@@ -9089,13 -9211,6 +9090,13 @@@ L:    linux-input@vger.kernel.or
  S:    Maintained
  F:    drivers/hid/hid-logitech-*
  
 +HID++ LOGITECH DRIVERS
 +R:    Filipe Laíns <lains@riseup.net>
 +R:    Bastien Nocera <hadess@hadess.net>
 +L:    linux-input@vger.kernel.org
 +S:    Maintained
 +F:    drivers/hid/hid-logitech-hidpp.c
 +
  HID PLAYSTATION DRIVER
  M:    Roderick Colenbrander <roderick.colenbrander@sony.com>
  L:    linux-input@vger.kernel.org
@@@ -9185,7 -9300,7 +9186,7 @@@ F:      net/dsa/tag_hellcreek.
  
  HISILICON DMA DRIVER
  M:    Zhou Wang <wangzhou1@hisilicon.com>
 -M:    Jie Hai <haijie1@hisilicon.com>
 +M:    Jie Hai <haijie1@huawei.com>
  L:    dmaengine@vger.kernel.org
  S:    Maintained
  F:    drivers/dma/hisi_dma.c
@@@ -9261,15 -9376,11 +9262,15 @@@ F:   drivers/perf/hisilicon/hns3_pmu.
  
  HISILICON PTT DRIVER
  M:    Yicong Yang <yangyicong@hisilicon.com>
 +M:    Jonathan Cameron <jonathan.cameron@huawei.com>
  L:    linux-kernel@vger.kernel.org
  S:    Maintained
  F:    Documentation/ABI/testing/sysfs-devices-hisi_ptt
  F:    Documentation/trace/hisi-ptt.rst
  F:    drivers/hwtracing/ptt/
 +F:    tools/perf/arch/arm64/util/hisi-ptt.c
 +F:    tools/perf/util/hisi-ptt*
 +F:    tools/perf/util/hisi-ptt-decoder/*
  
  HISILICON QM DRIVER
  M:    Weili Qian <qianweili@huawei.com>
@@@ -9356,7 -9467,7 +9357,7 @@@ F:      Documentation/mm/hmm.rs
  F:    include/linux/hmm*
  F:    lib/test_hmm*
  F:    mm/hmm*
 -F:    tools/testing/selftests/vm/*hmm*
 +F:    tools/testing/selftests/mm/*hmm*
  
  HOST AP DRIVER
  M:    Jouni Malinen <j@w1.fi>
@@@ -9879,7 -9990,7 +9880,7 @@@ S:      Maintaine
  T:    git://git.kernel.org/pub/scm/linux/kernel/git/vfs/idmapping.git
  F:    Documentation/filesystems/idmappings.rst
  F:    tools/testing/selftests/mount_setattr/
 -F:    include/linux/mnt_idmapping.h
 +F:    include/linux/mnt_idmapping.*
  
  IDT VersaClock 5 CLOCK DRIVER
  M:    Luca Ceresoli <luca@lucaceresoli.net>
@@@ -9890,7 -10001,6 +9891,7 @@@ F:     drivers/clk/clk-versaclock5.
  IEEE 802.15.4 SUBSYSTEM
  M:    Alexander Aring <alex.aring@gmail.com>
  M:    Stefan Schmidt <stefan@datenfreihafen.org>
 +M:    Miquel Raynal <miquel.raynal@bootlin.com>
  L:    linux-wpan@vger.kernel.org
  S:    Maintained
  W:    https://linux-wpan.org/
@@@ -10050,13 -10160,6 +10051,13 @@@ L: linux-iio@vger.kernel.or
  S:    Maintained
  F:    drivers/iio/pressure/dps310.c
  
 +INFINEON PEB2466 ASoC CODEC
 +M:    Herve Codina <herve.codina@bootlin.com>
 +L:    alsa-devel@alsa-project.org (moderated for non-subscribers)
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/sound/infineon,peb2466.yaml
 +F:    sound/soc/codecs/peb2466.c
 +
  INFINIBAND SUBSYSTEM
  M:    Jason Gunthorpe <jgg@nvidia.com>
  M:    Leon Romanovsky <leonro@nvidia.com>
@@@ -10357,6 -10460,7 +10358,6 @@@ L:   iommu@lists.linux.de
  S:    Supported
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/joro/iommu.git
  F:    drivers/iommu/intel/
 -F:    include/linux/intel-svm.h
  
  INTEL IPU3 CSI-2 CIO2 DRIVER
  M:    Yong Zhi <yong.zhi@intel.com>
@@@ -10464,7 -10568,6 +10465,7 @@@ F:   drivers/watchdog/mei_wdt.
  F:    include/linux/mei_aux.h
  F:    include/linux/mei_cl_bus.h
  F:    include/uapi/linux/mei.h
 +F:    include/uapi/linux/uuid.h
  F:    samples/mei/*
  
  INTEL MAX 10 BMC MFD DRIVER
@@@ -10474,7 -10577,7 +10475,7 @@@ S:   Maintaine
  F:    Documentation/ABI/testing/sysfs-driver-intel-m10-bmc
  F:    Documentation/hwmon/intel-m10-bmc-hwmon.rst
  F:    drivers/hwmon/intel-m10-bmc-hwmon.c
 -F:    drivers/mfd/intel-m10-bmc.c
 +F:    drivers/mfd/intel-m10-bmc*
  F:    include/linux/mfd/intel-m10-bmc.h
  
  INTEL MENLOW THERMAL DRIVER
@@@ -10581,13 -10684,6 +10582,13 @@@ S: Maintaine
  F:    arch/x86/include/asm/intel_telemetry.h
  F:    drivers/platform/x86/intel/telemetry/
  
 +INTEL TPMI DRIVER
 +M:    Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
 +L:    platform-driver-x86@vger.kernel.org
 +S:    Maintained
 +F:    drivers/platform/x86/intel/tpmi.c
 +F:    include/linux/intel_tpmi.h
 +
  INTEL UNCORE FREQUENCY CONTROL
  M:    Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
  L:    platform-driver-x86@vger.kernel.org
@@@ -10825,13 -10921,6 +10826,13 @@@ M: David Sterba <dsterba@suse.com
  S:    Odd Fixes
  F:    drivers/tty/ipwireless/
  
 +IRON DEVICE AUDIO CODEC DRIVERS
 +M:    Kiseok Jo <kiseok.jo@irondevice.com>
 +L:    alsa-devel@alsa-project.org (moderated for non-subscribers)
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/sound/irondevice,*
 +F:    sound/soc/codecs/sma*
 +
  IRQ DOMAINS (IRQ NUMBER MAPPING LIBRARY)
  M:    Marc Zyngier <maz@kernel.org>
  S:    Maintained
@@@ -10847,8 -10936,6 +10848,8 @@@ L:   linux-kernel@vger.kernel.or
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git irq/core
  F:    kernel/irq/
 +F:    include/linux/group_cpus.h
 +F:    lib/group_cpus.c
  
  IRQCHIP DRIVERS
  M:    Thomas Gleixner <tglx@linutronix.de>
@@@ -11085,7 -11172,7 +11086,7 @@@ M:   Masahiro Yamada <masahiroy@kernel.or
  L:    linux-kbuild@vger.kernel.org
  S:    Maintained
  Q:    https://patchwork.kernel.org/project/linux-kbuild/list/
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/masahiroy/linux-kbuild.git kconfig
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/masahiroy/linux-kbuild.git kbuild
  F:    Documentation/kbuild/kconfig*
  F:    scripts/Kconfig.include
  F:    scripts/kconfig/
@@@ -11269,12 -11356,13 +11270,12 @@@ F:        virt/kvm/
  
  KERNEL VIRTUAL MACHINE FOR ARM64 (KVM/arm64)
  M:    Marc Zyngier <maz@kernel.org>
 +M:    Oliver Upton <oliver.upton@linux.dev>
  R:    James Morse <james.morse@arm.com>
 -R:    Alexandru Elisei <alexandru.elisei@arm.com>
  R:    Suzuki K Poulose <suzuki.poulose@arm.com>
 -R:    Oliver Upton <oliver.upton@linux.dev>
 +R:    Zenghui Yu <yuzenghui@huawei.com>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  L:    kvmarm@lists.linux.dev
 -L:    kvmarm@lists.cs.columbia.edu (deprecated, moderated for non-subscribers)
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/kvmarm/kvmarm.git
  F:    arch/arm64/include/asm/kvm*
@@@ -11587,12 -11675,6 +11588,12 @@@ M: John Hawley <warthog9@eaglescrag.net
  S:    Maintained
  F:    tools/testing/ktest
  
 +KTZ8866 BACKLIGHT DRIVER
 +M:    Jianhua Lu <lujianhua000@gmail.com>
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/leds/backlight/kinetic,ktz8866.yaml
 +F:    drivers/video/backlight/ktz8866.c
 +
  L3MDEV
  M:    David Ahern <dsahern@kernel.org>
  L:    netdev@vger.kernel.org
@@@ -11605,7 -11687,7 +11606,7 @@@ M:   Mickaël Salaün <mic@digikod.net
  L:    linux-security-module@vger.kernel.org
  S:    Supported
  W:    https://landlock.io
 -T:    git https://github.com/landlock-lsm/linux.git
 +T:    git https://git.kernel.org/pub/scm/linux/kernel/git/mic/linux.git
  F:    Documentation/security/landlock.rst
  F:    Documentation/userspace-api/landlock.rst
  F:    include/uapi/linux/landlock.h
@@@ -12099,13 -12181,6 +12100,13 @@@ F: drivers/*/*loongarch
  F:    Documentation/loongarch/
  F:    Documentation/translations/zh_CN/loongarch/
  
 +LOONGSON LS2X I2C DRIVER
 +M:    Binbin Zhou <zhoubinbin@loongson.cn>
 +L:    linux-i2c@vger.kernel.org
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/i2c/loongson,ls2x-i2c.yaml
 +F:    drivers/i2c/busses/i2c-ls2x.c
 +
  LOONGSON-2 SOC SERIES GUTS DRIVER
  M:    Yinbo Zhu <zhuyinbo@loongson.cn>
  L:    loongarch@lists.linux.dev
@@@ -12121,13 -12196,6 +12122,13 @@@ S: Maintaine
  F:    Documentation/devicetree/bindings/pinctrl/loongson,ls2k-pinctrl.yaml
  F:    drivers/pinctrl/pinctrl-loongson2.c
  
 +LOONGSON-2 SOC SERIES CLOCK DRIVER
 +M:    Yinbo Zhu <zhuyinbo@loongson.cn>
 +L:    linux-clk@vger.kernel.org
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/clock/loongson,ls2k-clk.yaml
 +F:    include/dt-bindings/clock/loongson,ls2k-clk.h
 +
  LSILOGIC MPT FUSION DRIVERS (FC/SAS/SPI)
  M:    Sathya Prakash <sathya.prakash@broadcom.com>
  M:    Sreekanth Reddy <sreekanth.reddy@broadcom.com>
@@@ -12748,9 -12816,9 +12749,9 @@@ F:   drivers/iio/potentiometer/mcp4018.
  F:    drivers/iio/potentiometer/mcp4531.c
  
  MCR20A IEEE-802.15.4 RADIO DRIVER
 -M:    Xue Liu <liuxuenetmail@gmail.com>
 +M:    Stefan Schmidt <stefan@datenfreihafen.org>
  L:    linux-wpan@vger.kernel.org
 -S:    Maintained
 +S:    Odd Fixes
  W:    https://github.com/xueliu/mcr20a-linux
  F:    Documentation/devicetree/bindings/net/ieee802154/mcr20a.txt
  F:    drivers/net/ieee802154/mcr20a.c
@@@ -13004,6 -13072,7 +13005,6 @@@ F:   include/media
  F:    include/uapi/linux/dvb/
  F:    include/uapi/linux/ivtv*
  F:    include/uapi/linux/media.h
 -F:    include/uapi/linux/meye.h
  F:    include/uapi/linux/uvcvideo.h
  F:    include/uapi/linux/v4l2-*
  F:    include/uapi/linux/videodev2.h
@@@ -13145,7 -13214,7 +13146,7 @@@ F:   drivers/phy/ralink/phy-mt7621-pci.
  MEDIATEK NAND CONTROLLER DRIVER
  L:    linux-mtd@lists.infradead.org
  S:    Orphan
 -F:    Documentation/devicetree/bindings/mtd/mtk-nand.txt
 +F:    Documentation/devicetree/bindings/mtd/mediatek,mtk-nfc.yaml
  F:    drivers/mtd/nand/raw/mtk_*
  
  MEDIATEK PMIC LED DRIVER
@@@ -13406,7 -13475,7 +13407,7 @@@ M:   Andrew Morton <akpm@linux-foundation
  L:    linux-mm@kvack.org
  S:    Maintained
  W:    http://www.linux-mm.org
 -T:    git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm
  T:    quilt git://git.kernel.org/pub/scm/linux/kernel/git/akpm/25-new
  F:    include/linux/gfp.h
  F:    include/linux/gfp_types.h
@@@ -13415,8 -13484,7 +13416,8 @@@ F:   include/linux/mm.
  F:    include/linux/mmzone.h
  F:    include/linux/pagewalk.h
  F:    mm/
 -F:    tools/testing/selftests/vm/
 +F:    tools/mm/
 +F:    tools/testing/selftests/mm/
  
  VMALLOC
  M:    Andrew Morton <akpm@linux-foundation.org>
@@@ -13425,7 -13493,7 +13426,7 @@@ R:   Christoph Hellwig <hch@infradead.org
  L:    linux-mm@kvack.org
  S:    Maintained
  W:    http://www.linux-mm.org
 -T:    git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm
  F:    include/linux/vmalloc.h
  F:    mm/vmalloc.c
  
@@@ -13499,7 -13567,7 +13500,7 @@@ L:   linux-amlogic@lists.infradead.or
  S:    Supported
  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:    Documentation/devicetree/bindings/media/cec/amlogic,meson-gx-ao-cec.yaml
  F:    drivers/media/cec/platform/meson/ao-cec-g12a.c
  F:    drivers/media/cec/platform/meson/ao-cec.c
  
@@@ -13551,22 -13619,9 +13552,22 @@@ W: http://www.monstr.eu/fdt
  T:    git git://git.monstr.eu/linux-2.6-microblaze.git
  F:    arch/microblaze/
  
 +MICROBLAZE TMR MANAGER
 +M:    Appana Durga Kedareswara rao <appana.durga.kedareswara.rao@amd.com>
 +S:    Supported
 +F:    Documentation/ABI/testing/sysfs-driver-xilinx-tmr-manager
 +F:    Documentation/devicetree/bindings/misc/xlnx,tmr-manager.yaml
 +F:    drivers/misc/xilinx_tmr_manager.c
 +
 +MICROBLAZE TMR INJECT
 +M:    Appana Durga Kedareswara rao <appana.durga.kedareswara.rao@amd.com>
 +S:    Supported
 +F:    Documentation/devicetree/bindings/misc/xlnx,tmr-inject.yaml
 +F:    drivers/misc/xilinx_tmr_inject.c
 +
  MICROCHIP AT91 DMA DRIVERS
  M:    Ludovic Desroches <ludovic.desroches@microchip.com>
 -M:    Tudor Ambarus <tudor.ambarus@microchip.com>
 +M:    Tudor Ambarus <tudor.ambarus@linaro.org>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  L:    dmaengine@vger.kernel.org
  S:    Supported
@@@ -13611,7 -13666,7 +13612,7 @@@ F:   Documentation/devicetree/bindings/me
  F:    drivers/media/platform/microchip/microchip-csi2dc.c
  
  MICROCHIP ECC DRIVER
 -M:    Tudor Ambarus <tudor.ambarus@microchip.com>
 +M:    Tudor Ambarus <tudor.ambarus@linaro.org>
  L:    linux-crypto@vger.kernel.org
  S:    Maintained
  F:    drivers/crypto/atmel-ecc.*
@@@ -13656,7 -13711,6 +13657,7 @@@ S:   Maintaine
  F:    Documentation/devicetree/bindings/net/dsa/microchip,ksz.yaml
  F:    Documentation/devicetree/bindings/net/dsa/microchip,lan937x.yaml
  F:    drivers/net/dsa/microchip/*
 +F:    include/linux/dsa/ksz_common.h
  F:    include/linux/platform_data/microchip-ksz.h
  F:    net/dsa/tag_ksz.c
  
@@@ -13709,7 -13763,7 +13710,7 @@@ S:   Maintaine
  F:    drivers/mmc/host/atmel-mci.c
  
  MICROCHIP NAND DRIVER
 -M:    Tudor Ambarus <tudor.ambarus@microchip.com>
 +M:    Tudor Ambarus <tudor.ambarus@linaro.org>
  L:    linux-mtd@lists.infradead.org
  S:    Supported
  F:    Documentation/devicetree/bindings/mtd/atmel-nand.txt
@@@ -13739,13 -13793,6 +13740,13 @@@ L: linux-i2c@vger.kernel.or
  S:    Maintained
  F:    drivers/i2c/busses/i2c-mchp-pci1xxxx.c
  
 +MICROCHIP PCIe UART DRIVER
 +M:    Kumaravel Thiagarajan <kumaravel.thiagarajan@microchip.com>
 +M:    Tharun Kumar P <tharunkumar.pasumarthi@microchip.com>
 +L:    linux-serial@vger.kernel.org
 +S:    Maintained
 +F:    drivers/tty/serial/8250/8250_pci1xxxx.c
 +
  MICROCHIP PWM DRIVER
  M:    Claudiu Beznea <claudiu.beznea@microchip.com>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
@@@ -13768,7 -13815,7 +13769,7 @@@ S:   Supporte
  F:    drivers/power/reset/at91-sama5d2_shdwc.c
  
  MICROCHIP SPI DRIVER
 -M:    Tudor Ambarus <tudor.ambarus@microchip.com>
 +M:    Tudor Ambarus <tudor.ambarus@linaro.org>
  S:    Supported
  F:    drivers/spi/spi-atmel.*
  
@@@ -14096,7 -14143,6 +14097,7 @@@ M:   Saravanan Sekar <sravanhome@gmail.co
  S:    Maintained
  F:    Documentation/devicetree/bindings/mfd/mps,mp2629.yaml
  F:    Documentation/devicetree/bindings/regulator/mps,mp*.yaml
 +F:    drivers/hwmon/pmbus/mpq7932.c
  F:    drivers/iio/adc/mp2629_adc.c
  F:    drivers/mfd/mp2629.c
  F:    drivers/power/supply/mp2629_charger.c
@@@ -14105,22 -14151,18 +14106,22 @@@ F:        drivers/regulator/mpq7920.
  F:    drivers/regulator/mpq7920.h
  F:    include/linux/mfd/mp2629.h
  
 -MOTION EYE VAIO PICTUREBOOK CAMERA DRIVER
 -S:    Orphan
 -W:    http://popies.net/meye/
 -F:    Documentation/userspace-api/media/drivers/meye*
 -F:    drivers/staging/media/deprecated/meye/
 -F:    include/uapi/linux/meye.h
 +MOST(R) TECHNOLOGY DRIVER
 +M:    Parthiban Veerasooran <parthiban.veerasooran@microchip.com>
 +M:    Christian Gromm <christian.gromm@microchip.com>
 +S:    Maintained
 +F:    Documentation/ABI/testing/configfs-most
 +F:    Documentation/ABI/testing/sysfs-bus-most
 +F:    drivers/most/
 +F:    drivers/staging/most/
 +F:    include/linux/most.h
  
  MOTORCOMM PHY DRIVER
  M:    Peter Geis <pgwipeout@gmail.com>
  M:    Frank <Frank.Sae@motor-comm.com>
  L:    netdev@vger.kernel.org
  S:    Maintained
 +F:    Documentation/devicetree/bindings/net/motorcomm,yt8xxx.yaml
  F:    drivers/net/phy/motorcomm.c
  
  MOXA SMARTIO/INDUSTIO/INTELLIO SERIAL CARD
@@@ -14137,9 -14179,9 +14138,9 @@@ T:   git git://linuxtv.org/media_tree.gi
  F:    drivers/media/radio/radio-mr800.c
  
  MRF24J40 IEEE 802.15.4 RADIO DRIVER
 -M:    Alan Ott <alan@signal11.us>
 +M:    Stefan Schmidt <stefan@datenfreihafen.org>
  L:    linux-wpan@vger.kernel.org
 -S:    Maintained
 +S:    Odd Fixes
  F:    Documentation/devicetree/bindings/net/ieee802154/mrf24j40.txt
  F:    drivers/net/ieee802154/mrf24j40.c
  
@@@ -14239,7 -14281,7 +14240,7 @@@ F:   drivers/media/i2c/mt9v111.
  
  MULTIFUNCTION DEVICES (MFD)
  M:    Lee Jones <lee@kernel.org>
 -S:    Supported
 +S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/lee/mfd.git
  F:    Documentation/devicetree/bindings/mfd/
  F:    drivers/mfd/
@@@ -14501,8 -14543,6 +14502,8 @@@ M:   Florian Fainelli <f.fainelli@gmail.c
  M:    Vladimir Oltean <olteanv@gmail.com>
  S:    Maintained
  F:    Documentation/devicetree/bindings/net/dsa/
 +F:    Documentation/devicetree/bindings/net/ethernet-switch-port.yaml
 +F:    Documentation/devicetree/bindings/net/ethernet-switch.yaml
  F:    drivers/net/dsa/
  F:    include/linux/dsa/
  F:    include/linux/platform_data/dsa.h
@@@ -14521,10 -14561,8 +14522,10 @@@ Q: https://patchwork.kernel.org/project
  B:    mailto:netdev@vger.kernel.org
  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/core-api/netlink.rst
  F:    Documentation/networking/
  F:    Documentation/process/maintainer-netdev.rst
 +F:    Documentation/userspace-api/netlink/
  F:    include/linux/in.h
  F:    include/linux/net.h
  F:    include/linux/netdevice.h
@@@ -14536,7 -14574,6 +14537,7 @@@ F:   include/uapi/linux/netdevice.
  F:    lib/net_utils.c
  F:    lib/random32.c
  F:    net/
 +F:    tools/net/
  F:    tools/testing/selftests/net/
  
  NETWORKING [IPSEC]
@@@ -14565,6 -14602,7 +14566,6 @@@ F:   tools/testing/selftests/net/ipsec.
  
  NETWORKING [IPv4/IPv6]
  M:    "David S. Miller" <davem@davemloft.net>
 -M:    Hideaki YOSHIFUJI <yoshfuji@linux-ipv6.org>
  M:    David Ahern <dsahern@kernel.org>
  L:    netdev@vger.kernel.org
  S:    Maintained
@@@ -14597,6 -14635,7 +14598,6 @@@ F:   net/netfilter/xt_SECMARK.
  F:    net/netlabel/
  
  NETWORKING [MPTCP]
 -M:    Mat Martineau <mathew.j.martineau@linux.intel.com>
  M:    Matthieu Baerts <matthieu.baerts@tessares.net>
  L:    netdev@vger.kernel.org
  L:    mptcp@lists.linux.dev
@@@ -14881,8 -14920,7 +14882,8 @@@ T:   git://git.infradead.org/nvme.gi
  F:    Documentation/nvme/
  F:    drivers/nvme/host/
  F:    drivers/nvme/common/
 -F:    include/linux/nvme*
 +F:    include/linux/nvme.h
 +F:    include/linux/nvme-*.h
  F:    include/uapi/linux/nvme_ioctl.h
  
  NVM EXPRESS FABRICS AUTHENTICATION
@@@ -14957,7 -14995,6 +14958,7 @@@ F:   drivers/iio/gyro/fxas21002c_spi.
  
  NXP i.MX CLOCK DRIVERS
  M:    Abel Vesa <abelvesa@kernel.org>
 +R:    Peng Fan <peng.fan@nxp.com>
  L:    linux-clk@vger.kernel.org
  L:    linux-imx@nxp.com
  S:    Maintained
@@@ -14983,16 -15020,14 +14984,16 @@@ S:        Maintaine
  F:    Documentation/devicetree/bindings/iio/adc/nxp,imx8qxp-adc.yaml
  F:    drivers/iio/adc/imx8qxp-adc.c
  
 -NXP i.MX 7D/6SX/6UL AND VF610 ADC DRIVER
 +NXP i.MX 7D/6SX/6UL/93 AND VF610 ADC DRIVER
  M:    Haibo Chen <haibo.chen@nxp.com>
  L:    linux-iio@vger.kernel.org
  L:    linux-imx@nxp.com
  S:    Maintained
  F:    Documentation/devicetree/bindings/iio/adc/fsl,imx7d-adc.yaml
  F:    Documentation/devicetree/bindings/iio/adc/fsl,vf610-adc.yaml
 +F:    Documentation/devicetree/bindings/iio/adc/nxp,imx93-adc.yaml
  F:    drivers/iio/adc/imx7d_adc.c
 +F:    drivers/iio/adc/imx93_adc.c
  F:    drivers/iio/adc/vf610_adc.c
  
  NXP PF8100/PF8121A/PF8200 PMIC REGULATOR DEVICE DRIVER
@@@ -15117,7 -15152,6 +15118,7 @@@ M:   Colin Foster <colin.foster@in-advant
  S:    Supported
  F:    Documentation/devicetree/bindings/mfd/mscc,ocelot.yaml
  F:    drivers/mfd/ocelot*
 +F:    drivers/net/dsa/ocelot/ocelot_ext.c
  F:    include/linux/mfd/ocelot.h
  
  OCXL (Open Coherent Accelerator Processor Interface OpenCAPI) DRIVER
@@@ -15281,6 -15315,7 +15282,6 @@@ Q:   http://patchwork.kernel.org/project/
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap.git
  F:    arch/arm/configs/omap1_defconfig
  F:    arch/arm/mach-omap1/
 -F:    arch/arm/plat-omap/
  F:    drivers/i2c/busses/i2c-omap.c
  F:    include/linux/platform_data/ams-delta-fiq.h
  F:    include/linux/platform_data/i2c-omap.h
@@@ -15295,6 -15330,7 +15296,6 @@@ Q:   http://patchwork.kernel.org/project/
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap.git
  F:    arch/arm/configs/omap2plus_defconfig
  F:    arch/arm/mach-omap2/
 -F:    arch/arm/plat-omap/
  F:    drivers/bus/ti-sysc.c
  F:    drivers/i2c/busses/i2c-omap.c
  F:    drivers/irqchip/irq-omap-intc.c
@@@ -15434,7 -15470,6 +15435,7 @@@ M:   Chiranjeevi Rapolu <chiranjeevi.rapo
  L:    linux-media@vger.kernel.org
  S:    Maintained
  T:    git git://linuxtv.org/media_tree.git
 +F:    Documentation/devicetree/bindings/media/i2c/ovti,ov5670.yaml
  F:    drivers/media/i2c/ov5670.c
  
  OMNIVISION OV5675 SENSOR DRIVER
@@@ -15442,7 -15477,6 +15443,7 @@@ M:   Shawn Tu <shawnx.tu@intel.com
  L:    linux-media@vger.kernel.org
  S:    Maintained
  T:    git git://linuxtv.org/media_tree.git
 +F:    Documentation/devicetree/bindings/media/i2c/ovti,ov5675.yaml
  F:    drivers/media/i2c/ov5675.c
  
  OMNIVISION OV5693 SENSOR DRIVER
@@@ -15492,15 -15526,6 +15493,15 @@@ T: git git://linuxtv.org/media_tree.gi
  F:    Documentation/devicetree/bindings/media/i2c/ov8856.yaml
  F:    drivers/media/i2c/ov8856.c
  
 +OMNIVISION OV8858 SENSOR DRIVER
 +M:    Jacopo Mondi <jacopo.mondi@ideasonboard.com>
 +M:    Nicholas Roth <nicholas@rothemail.net>
 +L:    linux-media@vger.kernel.org
 +S:    Maintained
 +T:    git git://linuxtv.org/media_tree.git
 +F:    Documentation/devicetree/bindings/media/i2c/ovti,ov8858.yaml
 +F:    drivers/media/i2c/ov8858.c
 +
  OMNIVISION OV9282 SENSOR DRIVER
  M:    Paul J. Murphy <paul.j.murphy@intel.com>
  M:    Daniele Alessandrelli <daniele.alessandrelli@intel.com>
@@@ -15549,7 -15574,6 +15550,7 @@@ F:   drivers/mtd/nand/onenand
  F:    include/linux/mtd/onenand*.h
  
  ONEXPLAYER FAN DRIVER
 +M:    Derek John Clark <derekjohn.clark@gmail.com>
  M:    Joaquín Ignacio Aramendía <samsagax@gmail.com>
  L:    linux-hwmon@vger.kernel.org
  S:    Maintained
@@@ -15561,13 -15585,6 +15562,13 @@@ L: linux-mips@vger.kernel.or
  S:    Maintained
  F:    arch/mips/boot/dts/ralink/omega2p.dts
  
 +ONSEMI ETHERNET PHY DRIVERS
 +M:    Piergiorgio Beruto <piergiorgio.beruto@gmail.com>
 +L:    netdev@vger.kernel.org
 +S:    Supported
 +W:    http://www.onsemi.com
 +F:    drivers/net/phy/ncn*
 +
  OP-TEE DRIVER
  M:    Jens Wiklander <jens.wiklander@linaro.org>
  L:    op-tee@lists.trustedfirmware.org
@@@ -15642,7 -15659,7 +15643,7 @@@ OPENRISC ARCHITECTUR
  M:    Jonas Bonn <jonas@southpole.se>
  M:    Stefan Kristiansson <stefan.kristiansson@saunalahti.fi>
  M:    Stafford Horne <shorne@gmail.com>
 -L:    openrisc@lists.librecores.org
 +L:    linux-openrisc@vger.kernel.org
  S:    Maintained
  W:    http://openrisc.io
  T:    git https://github.com/openrisc/linux.git
@@@ -15733,12 -15750,6 +15734,12 @@@ S: Maintaine
  W:    https://wireless.wiki.kernel.org/en/users/Drivers/p54
  F:    drivers/net/wireless/intersil/p54/
  
 +PACKET SOCKETS
 +M:    Willem de Bruijn <willemdebruijn.kernel@gmail.com>
 +S:    Maintained
 +F:    include/uapi/linux/if_packet.h
 +F:    net/packet/af_packet.c
 +
  PACKING
  M:    Vladimir Oltean <olteanv@gmail.com>
  L:    netdev@vger.kernel.org
@@@ -15834,6 -15845,13 +15835,6 @@@ F:  arch/*/include/asm/paravirt*.
  F:    arch/*/kernel/paravirt*
  F:    include/linux/hypervisor.h
  
 -PARIDE DRIVERS FOR PARALLEL PORT IDE DEVICES
 -M:    Tim Waugh <tim@cyberelk.net>
 -L:    linux-parport@lists.infradead.org (subscribers-only)
 -S:    Maintained
 -F:    Documentation/admin-guide/blockdev/paride.rst
 -F:    drivers/block/paride/
 -
  PARISC ARCHITECTURE
  M:    "James E.J. Bottomley" <James.Bottomley@HansenPartnership.com>
  M:    Helge Deller <deller@gmx.de>
@@@ -16091,7 -16109,7 +16092,7 @@@ F:   drivers/pci/controller/pci-v3-semi.
  
  PCI ENDPOINT SUBSYSTEM
  M:    Lorenzo Pieralisi <lpieralisi@kernel.org>
 -R:    Krzysztof Wilczyński <kw@linux.com>
 +M:    Krzysztof Wilczyński <kw@linux.com>
  R:    Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
  R:    Kishon Vijay Abraham I <kishon@kernel.org>
  L:    linux-pci@vger.kernel.org
@@@ -16099,7 -16117,7 +16100,7 @@@ S:   Supporte
  Q:    https://patchwork.kernel.org/project/linux-pci/list/
  B:    https://bugzilla.kernel.org
  C:    irc://irc.oftc.net/linux-pci
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/lpieralisi/pci.git
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/pci/pci.git
  F:    Documentation/PCI/endpoint/*
  F:    Documentation/misc-devices/pci-endpoint-test.rst
  F:    drivers/misc/pci_endpoint_test.c
@@@ -16134,7 -16152,7 +16135,7 @@@ S:   Supporte
  Q:    https://patchwork.kernel.org/project/linux-pci/list/
  B:    https://bugzilla.kernel.org
  C:    irc://irc.oftc.net/linux-pci
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci.git
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/pci/pci.git
  F:    Documentation/driver-api/pci/p2pdma.rst
  F:    drivers/pci/p2pdma.c
  F:    include/linux/pci-p2pdma.h
@@@ -16156,14 -16174,14 +16157,14 @@@ F:        drivers/pci/controller/pci-xgene-msi
  
  PCI NATIVE HOST BRIDGE AND ENDPOINT DRIVERS
  M:    Lorenzo Pieralisi <lpieralisi@kernel.org>
 +M:    Krzysztof Wilczyński <kw@linux.com>
  R:    Rob Herring <robh@kernel.org>
 -R:    Krzysztof Wilczyński <kw@linux.com>
  L:    linux-pci@vger.kernel.org
  S:    Supported
  Q:    https://patchwork.kernel.org/project/linux-pci/list/
  B:    https://bugzilla.kernel.org
  C:    irc://irc.oftc.net/linux-pci
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/lpieralisi/pci.git
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/pci/pci.git
  F:    Documentation/devicetree/bindings/pci/
  F:    drivers/pci/controller/
  F:    drivers/pci/pci-bridge-emul.c
@@@ -16176,7 -16194,7 +16177,7 @@@ S:   Supporte
  Q:    https://patchwork.kernel.org/project/linux-pci/list/
  B:    https://bugzilla.kernel.org
  C:    irc://irc.oftc.net/linux-pci
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci.git
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/pci/pci.git
  F:    Documentation/PCI/
  F:    Documentation/devicetree/bindings/pci/
  F:    arch/x86/kernel/early-quirks.c
@@@ -16290,7 -16308,7 +16291,7 @@@ M:   Shawn Lin <shawn.lin@rock-chips.com
  L:    linux-pci@vger.kernel.org
  L:    linux-rockchip@lists.infradead.org
  S:    Maintained
 -F:    Documentation/devicetree/bindings/pci/rockchip-pcie*
 +F:    Documentation/devicetree/bindings/pci/rockchip,rk3399-pcie*
  F:    drivers/pci/controller/pcie-rockchip*
  
  PCIE DRIVER FOR SOCIONEXT UNIPHIER
@@@ -16395,7 -16413,6 +16396,7 @@@ R:   Mark Rutland <mark.rutland@arm.com
  R:    Alexander Shishkin <alexander.shishkin@linux.intel.com>
  R:    Jiri Olsa <jolsa@kernel.org>
  R:    Namhyung Kim <namhyung@kernel.org>
 +R:    Ian Rogers <irogers@google.com>
  L:    linux-perf-users@vger.kernel.org
  L:    linux-kernel@vger.kernel.org
  S:    Supported
@@@ -16594,26 -16611,12 +16595,26 @@@ S:        Supporte
  F:    Documentation/devicetree/bindings/input/pine64,pinephone-keyboard.yaml
  F:    drivers/input/keyboard/pinephone-keyboard.c
  
 +PKTCDVD DRIVER
 +M:    linux-block@vger.kernel.org
 +S:    Orphan
 +F:    drivers/block/pktcdvd.c
 +F:    include/linux/pktcdvd.h
 +F:    include/uapi/linux/pktcdvd.h
 +
  PLANTOWER PMS7003 AIR POLLUTION SENSOR DRIVER
  M:    Tomasz Duszynski <tduszyns@gmail.com>
  S:    Maintained
  F:    Documentation/devicetree/bindings/iio/chemical/plantower,pms7003.yaml
  F:    drivers/iio/chemical/pms7003.c
  
 +PLCA RECONCILIATION SUBLAYER (IEEE802.3 Clause 148)
 +M:    Piergiorgio Beruto <piergiorgio.beruto@gmail.com>
 +L:    netdev@vger.kernel.org
 +S:    Maintained
 +F:    drivers/net/phy/mdio-open-alliance.h
 +F:    net/ethtool/plca.c
 +
  PLDMFW LIBRARY
  M:    Jacob Keller <jacob.e.keller@intel.com>
  S:    Maintained
@@@ -17211,13 -17214,6 +17212,13 @@@ T: git git://git.kernel.org/pub/scm/lin
  F:    Documentation/devicetree/bindings/net/wireless/qcom,ath11k.yaml
  F:    drivers/net/wireless/ath/ath11k/
  
 +QUALCOMM ATH12K WIRELESS DRIVER
 +M:    Kalle Valo <kvalo@kernel.org>
 +L:    ath12k@lists.infradead.org
 +S:    Supported
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/ath.git
 +F:    drivers/net/wireless/ath/ath12k/
 +
  QUALCOMM ATHEROS ATH9K WIRELESS DRIVER
  M:    Toke Høiland-Jørgensen <toke@toke.dk>
  L:    linux-wireless@vger.kernel.org
@@@ -17235,7 -17231,7 +17236,7 @@@ F:   Documentation/devicetree/bindings/ne
  F:    drivers/net/wwan/qcom_bam_dmux.c
  
  QUALCOMM CAMERA SUBSYSTEM DRIVER
 -M:    Robert Foss <robert.foss@linaro.org>
 +M:    Robert Foss <rfoss@kernel.org>
  M:    Todor Tomov <todor.too@gmail.com>
  L:    linux-media@vger.kernel.org
  S:    Maintained
@@@ -17253,8 -17249,7 +17254,8 @@@ F:   drivers/clk/qcom
  F:    include/dt-bindings/clock/qcom,*
  
  QUALCOMM CORE POWER REDUCTION (CPR) AVS DRIVER
 -M:    Niklas Cassel <nks@flawful.org>
 +M:    Bjorn Andersson <andersson@kernel.org>
 +M:    Konrad Dybcio <konrad.dybcio@linaro.org>
  L:    linux-pm@vger.kernel.org
  L:    linux-arm-msm@vger.kernel.org
  S:    Maintained
@@@ -17316,7 -17311,7 +17317,7 @@@ F:   drivers/dma/qcom/hidma
  
  QUALCOMM I2C CCI DRIVER
  M:    Loic Poulain <loic.poulain@linaro.org>
 -M:    Robert Foss <robert.foss@linaro.org>
 +M:    Robert Foss <rfoss@kernel.org>
  L:    linux-i2c@vger.kernel.org
  L:    linux-arm-msm@vger.kernel.org
  S:    Maintained
@@@ -17790,13 -17785,6 +17791,13 @@@ F: Documentation/devicetree/bindings/ne
  F:    drivers/net/ethernet/renesas/
  F:    include/linux/sh_eth.h
  
 +RENESAS IDT821034 ASoC CODEC
 +M:    Herve Codina <herve.codina@bootlin.com>
 +L:    alsa-devel@alsa-project.org (moderated for non-subscribers)
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/sound/renesas,idt821034.yaml
 +F:    sound/soc/codecs/idt821034.c
 +
  RENESAS R-CAR GYROADC DRIVER
  M:    Marek Vasut <marek.vasut@gmail.com>
  L:    linux-iio@vger.kernel.org
@@@ -17872,14 -17860,6 +17873,14 @@@ S: Maintaine
  F:    Documentation/devicetree/bindings/rtc/renesas,rzn1-rtc.yaml
  F:    drivers/rtc/rtc-rzn1.c
  
 +RENESAS RZ/N1 USBF CONTROLLER DRIVER
 +M:    Herve Codina <herve.codina@bootlin.com>
 +L:    linux-renesas-soc@vger.kernel.org
 +L:    linux-usb@vger.kernel.org
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/usb/renesas,rzn1-usbf.yaml
 +F:    drivers/usb/gadget/udc/renesas_usbf.c
 +
  RENESAS R-CAR GEN3 & RZ/N1 NAND CONTROLLER DRIVER
  M:    Miquel Raynal <miquel.raynal@bootlin.com>
  L:    linux-mtd@lists.infradead.org
@@@ -17970,7 -17950,6 +17971,7 @@@ M:   Albert Ou <aou@eecs.berkeley.edu
  L:    linux-riscv@lists.infradead.org
  S:    Supported
  Q:    https://patchwork.kernel.org/project/linux-riscv/list/
 +C:    irc://irc.libera.chat/riscv
  P:    Documentation/riscv/patch-acceptance.rst
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/riscv/linux.git
  F:    arch/riscv/
@@@ -18236,7 -18215,6 +18237,7 @@@ L:   rust-for-linux@vger.kernel.or
  S:    Supported
  W:    https://github.com/Rust-for-Linux/linux
  B:    https://github.com/Rust-for-Linux/linux/issues
 +C:    zulip://rust-for-linux.zulipchat.com
  T:    git https://github.com/Rust-for-Linux/linux.git rust-next
  F:    Documentation/rust/
  F:    rust/
@@@ -18276,7 -18254,6 +18277,7 @@@ F:   Documentation/driver-api/s390-driver
  F:    Documentation/s390/
  F:    arch/s390/
  F:    drivers/s390/
 +F:    drivers/watchdog/diag288_wdt.c
  
  S390 COMMON I/O LAYER
  M:    Vineeth Vijayan <vneethv@linux.ibm.com>
@@@ -18337,13 -18314,6 +18338,13 @@@ F: arch/s390/pci
  F:    drivers/pci/hotplug/s390_pci_hpc.c
  F:    Documentation/s390/pci.rst
  
 +S390 SCM DRIVER
 +M:    Vineeth Vijayan <vneethv@linux.ibm.com>
 +L:    linux-s390@vger.kernel.org
 +S:    Supported
 +F:    drivers/s390/block/scm*
 +F:    drivers/s390/cio/scm.c
 +
  S390 VFIO AP DRIVER
  M:    Tony Krowiak <akrowiak@linux.ibm.com>
  M:    Halil Pasic <pasic@linux.ibm.com>
@@@ -18387,6 -18357,19 +18388,6 @@@ L:  linux-s390@vger.kernel.or
  S:    Supported
  F:    drivers/s390/scsi/zfcp_*
  
 -S3C ADC BATTERY DRIVER
 -M:    Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
 -L:    linux-samsung-soc@vger.kernel.org
 -S:    Odd Fixes
 -F:    drivers/power/supply/s3c_adc_battery.c
 -F:    include/linux/s3c_adc_battery.h
 -
 -S3C24XX SD/MMC Driver
 -M:    Ben Dooks <ben-linux@fluff.org>
 -L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 -S:    Supported
 -F:    drivers/mmc/host/s3cmci.*
 -
  SAA6588 RDS RECEIVER DRIVER
  M:    Hans Verkuil <hverkuil@xs4all.nl>
  L:    linux-media@vger.kernel.org
@@@ -18409,9 -18392,7 +18410,9 @@@ M:   Hans Verkuil <hverkuil@xs4all.nl
  L:    linux-media@vger.kernel.org
  S:    Maintained
  T:    git git://linuxtv.org/media_tree.git
 -F:    drivers/staging/media/deprecated/saa7146/
 +F:    drivers/media/common/saa7146/
 +F:    drivers/media/pci/saa7146/
 +F:    include/media/drv-intf/saa7146*
  
  SAFESETID SECURITY MODULE
  M:    Micah Morton <mortonm@chromium.org>
@@@ -18541,9 -18522,11 +18542,9 @@@ F:  Documentation/devicetree/bindings/cl
  F:    Documentation/devicetree/bindings/clock/samsung,s3c*
  F:    drivers/clk/samsung/
  F:    include/dt-bindings/clock/exynos*.h
 -F:    include/dt-bindings/clock/s3c*.h
  F:    include/dt-bindings/clock/s5p*.h
  F:    include/dt-bindings/clock/samsung,*.h
  F:    include/linux/clk/samsung.h
 -F:    include/linux/platform_data/clk-s3c2410.h
  
  SAMSUNG SPI DRIVERS
  M:    Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
@@@ -18554,6 -18537,7 +18555,6 @@@ S:   Maintaine
  F:    Documentation/devicetree/bindings/spi/samsung,spi*.yaml
  F:    drivers/spi/spi-s3c*
  F:    include/linux/platform_data/spi-s3c64xx.h
 -F:    include/linux/spi/s3c24xx-fiq.h
  
  SAMSUNG SXGBE DRIVERS
  M:    Byungho An <bh74.an@samsung.com>
@@@ -18687,9 -18671,9 +18688,9 @@@ F:   drivers/target
  F:    include/target/
  
  SCTP PROTOCOL
 -M:    Vlad Yasevich <vyasevich@gmail.com>
  M:    Neil Horman <nhorman@tuxdriver.com>
  M:    Marcelo Ricardo Leitner <marcelo.leitner@gmail.com>
 +M:    Xin Long <lucien.xin@gmail.com>
  L:    linux-sctp@vger.kernel.org
  S:    Maintained
  W:    http://lksctp.sourceforge.net
@@@ -18912,7 -18896,6 +18913,7 @@@ M:   Edward Cree <ecree.xilinx@gmail.com
  M:    Martin Habets <habetsm.xilinx@gmail.com>
  L:    netdev@vger.kernel.org
  S:    Supported
 +F:    Documentation/networking/devlink/sfc.rst
  F:    drivers/net/ethernet/sfc/
  
  SFF/SFP/SFP+ MODULE SUPPORT
@@@ -19124,6 -19107,14 +19125,6 @@@ M:  Simtec Linux Team <linux@simtec.co.u
  S:    Supported
  W:    http://www.simtec.co.uk/products/EB110ATX/
  
 -SIMTEC EB2410ITX (BAST)
 -M:    Simtec Linux Team <linux@simtec.co.uk>
 -S:    Supported
 -W:    http://www.simtec.co.uk/products/EB2410ITX/
 -F:    arch/arm/mach-s3c/bast-ide.c
 -F:    arch/arm/mach-s3c/bast-irq.c
 -F:    arch/arm/mach-s3c/mach-bast.c
 -
  SIOX
  M:    Thorsten Scherer <t.scherer@eckelmann.de>
  M:    Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
@@@ -19320,7 -19311,7 +19321,7 @@@ SOCIONEXT SYNQUACER I2C DRIVE
  M:    Ard Biesheuvel <ardb@kernel.org>
  L:    linux-i2c@vger.kernel.org
  S:    Maintained
 -F:    Documentation/devicetree/bindings/i2c/i2c-synquacer.txt
 +F:    Documentation/devicetree/bindings/i2c/socionext,synquacer-i2c.yaml
  F:    drivers/i2c/busses/i2c-synquacer.c
  
  SOCIONEXT UNIPHIER SOUND DRIVER
@@@ -19328,13 -19319,6 +19329,13 @@@ L: alsa-devel@alsa-project.org (moderat
  S:    Orphan
  F:    sound/soc/uniphier/
  
 +SOCKET TIMESTAMPING
 +M:    Willem de Bruijn <willemdebruijn.kernel@gmail.com>
 +S:    Maintained
 +F:    Documentation/networking/timestamping.rst
 +F:    include/uapi/linux/net_tstamp.h
 +F:    tools/testing/selftests/net/so_txtime.c
 +
  SOEKRIS NET48XX LED SUPPORT
  M:    Chris Boot <bootc@bootc.net>
  S:    Maintained
@@@ -19470,15 -19454,6 +19471,15 @@@ T: git git://linuxtv.org/media_tree.gi
  F:    Documentation/devicetree/bindings/media/i2c/sony,imx290.yaml
  F:    drivers/media/i2c/imx290.c
  
 +SONY IMX296 SENSOR DRIVER
 +M:    Laurent Pinchart <laurent.pinchart@ideasonboard.com>
 +M:    Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
 +L:    linux-media@vger.kernel.org
 +S:    Maintained
 +T:    git git://linuxtv.org/media_tree.git
 +F:    Documentation/devicetree/bindings/media/i2c/sony,imx296.yaml
 +F:    drivers/media/i2c/imx296.c
 +
  SONY IMX319 SENSOR DRIVER
  M:    Bingbu Cao <bingbu.cao@intel.com>
  L:    linux-media@vger.kernel.org
@@@ -19520,14 -19495,6 +19521,14 @@@ T: git git://linuxtv.org/media_tree.gi
  F:    Documentation/devicetree/bindings/media/i2c/sony,imx412.yaml
  F:    drivers/media/i2c/imx412.c
  
 +SONY IMX415 SENSOR DRIVER
 +M:    Michael Riesch <michael.riesch@wolfvision.net>
 +L:    linux-media@vger.kernel.org
 +S:    Maintained
 +T:    git git://linuxtv.org/media_tree.git
 +F:    Documentation/devicetree/bindings/media/i2c/sony,imx415.yaml
 +F:    drivers/media/i2c/imx415.c
 +
  SONY MEMORYSTICK SUBSYSTEM
  M:    Maxim Levitsky <maximlevitsky@gmail.com>
  M:    Alex Dubov <oakad@yahoo.com>
@@@ -19699,7 -19666,7 +19700,7 @@@ F:   drivers/clk/spear
  F:    drivers/pinctrl/spear/
  
  SPI NOR SUBSYSTEM
 -M:    Tudor Ambarus <tudor.ambarus@microchip.com>
 +M:    Tudor Ambarus <tudor.ambarus@linaro.org>
  M:    Pratyush Yadav <pratyush@kernel.org>
  R:    Michael Walle <michael@walle.cc>
  L:    linux-mtd@lists.infradead.org
@@@ -19925,21 -19892,13 +19926,21 @@@ F:        Documentation/devicetree/bindings/cl
  F:    drivers/clk/starfive/clk-starfive-jh7100*
  F:    include/dt-bindings/clock/starfive-jh7100*.h
  
 -STARFIVE JH7100 PINCTRL DRIVER
 +STARFIVE JH7110 MMC/SD/SDIO DRIVER
 +M:    William Qiu <william.qiu@starfivetech.com>
 +S:    Supported
 +F:    Documentation/devicetree/bindings/mmc/starfive*
 +F:    drivers/mmc/host/dw_mmc-starfive.c
 +
 +STARFIVE JH71X0 PINCTRL DRIVERS
  M:    Emil Renner Berthing <kernel@esmil.dk>
 +M:    Jianlong Huang <jianlong.huang@starfivetech.com>
  L:    linux-gpio@vger.kernel.org
  S:    Maintained
 -F:    Documentation/devicetree/bindings/pinctrl/starfive,jh7100-pinctrl.yaml
 -F:    drivers/pinctrl/starfive/
 +F:    Documentation/devicetree/bindings/pinctrl/starfive,jh71*.yaml
 +F:    drivers/pinctrl/starfive/pinctrl-starfive-jh71*
  F:    include/dt-bindings/pinctrl/pinctrl-starfive-jh7100.h
 +F:    include/dt-bindings/pinctrl/starfive,jh7110-pinctrl.h
  
  STARFIVE JH7100 RESET CONTROLLER DRIVER
  M:    Emil Renner Berthing <kernel@esmil.dk>
@@@ -19948,25 -19907,6 +19949,25 @@@ F: Documentation/devicetree/bindings/re
  F:    drivers/reset/reset-starfive-jh7100.c
  F:    include/dt-bindings/reset/starfive-jh7100.h
  
 +STARFIVE JH71XX PMU CONTROLLER DRIVER
 +M:    Walker Chen <walker.chen@starfivetech.com>
 +S:    Supported
 +F:    Documentation/devicetree/bindings/power/starfive*
 +F:    drivers/soc/starfive/jh71xx_pmu.c
 +F:    include/dt-bindings/power/starfive,jh7110-pmu.h
 +
 +STARFIVE SOC DRIVERS
 +M:    Conor Dooley <conor@kernel.org>
 +S:    Maintained
 +T:    git https://git.kernel.org/pub/scm/linux/kernel/git/conor/linux.git/
 +F:    drivers/soc/starfive/
 +
 +STARFIVE TRNG DRIVER
 +M:    Jia Jie Ho <jiajie.ho@starfivetech.com>
 +S:    Supported
 +F:    Documentation/devicetree/bindings/rng/starfive*
 +F:    drivers/char/hw_random/jh7110-trng.c
 +
  STATIC BRANCH/CALL
  M:    Peter Zijlstra <peterz@infradead.org>
  M:    Josh Poimboeuf <jpoimboe@kernel.org>
@@@ -19993,7 -19933,7 +19994,7 @@@ F:   sound/soc/sti
  STI CEC DRIVER
  M:    Alain Volmat <alain.volmat@foss.st.com>
  S:    Maintained
 -F:    Documentation/devicetree/bindings/media/stih-cec.txt
 +F:    Documentation/devicetree/bindings/media/cec/st,stih-cec.yaml
  F:    drivers/media/cec/platform/sti/
  
  STK1160 USB VIDEO CAPTURE DRIVER
@@@ -20124,7 -20064,6 +20125,7 @@@ F:   drivers/watchdog/sunplus_wdt.
  SUPERH
  M:    Yoshinori Sato <ysato@users.sourceforge.jp>
  M:    Rich Felker <dalias@libc.org>
 +M:    John Paul Adrian Glaubitz <glaubitz@physik.fu-berlin.de>
  L:    linux-sh@vger.kernel.org
  S:    Maintained
  Q:    http://patchwork.kernel.org/project/linux-sh/list/
@@@ -20140,8 -20079,7 +20141,8 @@@ L:   linux-pm@vger.kernel.or
  S:    Supported
  B:    https://bugzilla.kernel.org
  F:    Documentation/power/
 -F:    arch/x86/kernel/acpi/
 +F:    arch/x86/kernel/acpi/sleep*
 +F:    arch/x86/kernel/acpi/wakeup*
  F:    drivers/base/power/
  F:    include/linux/freezer.h
  F:    include/linux/pm.h
@@@ -20358,7 -20296,8 +20359,7 @@@ S:   Maintaine
  F:    drivers/platform/x86/system76_acpi.c
  
  SYSV FILESYSTEM
 -M:    Christoph Hellwig <hch@infradead.org>
 -S:    Maintained
 +S:    Orphan
  F:    Documentation/filesystems/sysv-fs.rst
  F:    fs/sysv/
  F:    include/linux/sysv_fs.h
@@@ -20749,7 -20688,6 +20750,7 @@@ S:   Supporte
  Q:    https://patchwork.kernel.org/project/linux-pm/list/
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git thermal
  F:    Documentation/ABI/testing/sysfs-class-thermal
 +F:    Documentation/admin-guide/thermal/
  F:    Documentation/devicetree/bindings/thermal/
  F:    Documentation/driver-api/thermal/
  F:    drivers/thermal/
@@@ -20831,20 -20769,13 +20832,20 @@@ M:        Mika Westerberg <mika.westerberg@lin
  M:    Yehezkel Bernat <YehezkelShB@gmail.com>
  L:    netdev@vger.kernel.org
  S:    Maintained
 -F:    drivers/net/thunderbolt.c
 +F:    drivers/net/thunderbolt/
  
  THUNDERX GPIO DRIVER
  M:    Robert Richter <rric@kernel.org>
  S:    Odd Fixes
  F:    drivers/gpio/gpio-thunderx.c
  
 +TI ADS7924 ADC DRIVER
 +M:    Hugo Villeneuve <hvilleneuve@dimonoff.com>
 +L:    linux-iio@vger.kernel.org
 +S:    Supported
 +F:    Documentation/devicetree/bindings/iio/adc/ti,ads7924.yaml
 +F:    drivers/iio/adc/ti-ads7924.c
 +
  TI AM437X VPFE DRIVER
  M:    "Lad, Prabhakar" <prabhakar.csengg@gmail.com>
  L:    linux-media@vger.kernel.org
@@@ -20880,10 -20811,11 +20881,10 @@@ F:        drivers/clk/ti
  F:    include/linux/clk/ti.h
  
  TI DAVINCI MACHINE SUPPORT
 -M:    Sekhar Nori <nsekhar@ti.com>
 -R:    Bartosz Golaszewski <brgl@bgdev.pl>
 +M:    Bartosz Golaszewski <brgl@bgdev.pl>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 -S:    Supported
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/nsekhar/linux-davinci.git
 +S:    Maintained
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/brgl/linux.git
  F:    Documentation/devicetree/bindings/i2c/i2c-davinci.txt
  F:    arch/arm/boot/dts/da850*
  F:    arch/arm/mach-davinci/
@@@ -20912,6 -20844,7 +20913,6 @@@ W:   https://linuxtv.or
  Q:    http://patchwork.linuxtv.org/project/linux-media/list/
  T:    git git://linuxtv.org/mhadli/v4l-dvb-davinci_devices.git
  F:    drivers/media/platform/ti/davinci/
 -F:    drivers/staging/media/deprecated/vpfe_capture/
  F:    include/media/davinci/
  
  TI ENHANCED CAPTURE (eCAP) DRIVER
@@@ -20963,14 -20896,6 +20964,14 @@@ S: Maintaine
  F:    sound/soc/codecs/isabelle*
  F:    sound/soc/codecs/lm49453*
  
 +TI LMP92064 ADC DRIVER
 +M:    Leonard Göhrs <l.goehrs@pengutronix.de>
 +R:    kernel@pengutronix.de
 +L:    linux-iio@vger.kernel.org
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/iio/adc/ti,lmp92064.yaml
 +F:    drivers/iio/adc/ti-lmp92064.c
 +
  TI PCM3060 ASoC CODEC DRIVER
  M:    Kirill Marinushkin <kmarinushkin@birdec.com>
  L:    alsa-devel@alsa-project.org (moderated for non-subscribers)
@@@ -20984,13 -20909,6 +20985,13 @@@ L: alsa-devel@alsa-project.org (moderat
  S:    Odd Fixes
  F:    sound/soc/codecs/tas571x*
  
 +TI TMAG5273 MAGNETOMETER DRIVER
 +M:    Gerald Loacker <gerald.loacker@wolfvision.net>
 +L:    linux-iio@vger.kernel.org
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/iio/magnetometer/ti,tmag5273.yaml
 +F:    drivers/iio/magnetometer/tmag5273.c
 +
  TI TRF7970A NFC DRIVER
  M:    Mark Greer <mgreer@animalcreek.com>
  L:    linux-wireless@vger.kernel.org
@@@ -21068,6 -20986,15 +21069,6 @@@ W:  http://sourceforge.net/projects/tlan
  F:    Documentation/networking/device_drivers/ethernet/ti/tlan.rst
  F:    drivers/net/ethernet/ti/tlan.*
  
 -TM6000 VIDEO4LINUX DRIVER
 -M:    Mauro Carvalho Chehab <mchehab@kernel.org>
 -L:    linux-media@vger.kernel.org
 -S:    Odd fixes
 -W:    https://linuxtv.org
 -T:    git git://linuxtv.org/media_tree.git
 -F:    Documentation/admin-guide/media/tm6000*
 -F:    drivers/staging/media/deprecated/tm6000/
 -
  TMIO/SDHI MMC DRIVER
  M:    Wolfram Sang <wsa+renesas@sang-engineering.com>
  L:    linux-mmc@vger.kernel.org
@@@ -21461,12 -21388,6 +21462,12 @@@ L: linux-scsi@vger.kernel.or
  S:    Supported
  F:    drivers/ufs/host/*dwc*
  
 +UNIVERSAL FLASH STORAGE HOST CONTROLLER DRIVER EXYNOS HOOKS
 +M:    Alim Akhtar <alim.akhtar@samsung.com>
 +L:    linux-scsi@vger.kernel.org
 +S:    Maintained
 +F:    drivers/ufs/host/ufs-exynos*
 +
  UNIVERSAL FLASH STORAGE HOST CONTROLLER DRIVER MEDIATEK HOOKS
  M:    Stanley Chu <stanley.chu@mediatek.com>
  L:    linux-scsi@vger.kernel.org
@@@ -21474,14 -21395,6 +21475,14 @@@ L: linux-mediatek@lists.infradead.org (
  S:    Maintained
  F:    drivers/ufs/host/ufs-mediatek*
  
 +UNIVERSAL FLASH STORAGE HOST CONTROLLER DRIVER QUALCOMM HOOKS
 +M:    Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
 +L:    linux-arm-msm@vger.kernel.org
 +L:    linux-scsi@vger.kernel.org
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/ufs/qcom,ufs.yaml
 +F:    drivers/ufs/host/ufs-qcom*
 +
  UNIVERSAL FLASH STORAGE HOST CONTROLLER DRIVER RENESAS HOOKS
  M:    Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
  L:    linux-renesas-soc@vger.kernel.org
@@@ -21791,7 -21704,6 +21792,7 @@@ F:   include/uapi/linux/uvcvideo.
  
  USB WEBCAM GADGET
  M:    Laurent Pinchart <laurent.pinchart@ideasonboard.com>
 +M:    Daniel Scally <dan.scally@ideasonboard.com>
  L:    linux-usb@vger.kernel.org
  S:    Maintained
  F:    drivers/usb/gadget/function/*uvc*
@@@ -21817,12 -21729,15 +21818,12 @@@ S:        Orpha
  W:    http://linux-lc100020.sourceforge.net
  F:    drivers/net/wireless/zydas/zd1201.*
  
 -USB ZR364XX DRIVER
 -M:    Antoine Jacquet <royale@zerezo.com>
 -L:    linux-usb@vger.kernel.org
 -L:    linux-media@vger.kernel.org
 +USER DATAGRAM PROTOCOL (UDP)
 +M:    Willem de Bruijn <willemdebruijn.kernel@gmail.com>
  S:    Maintained
 -W:    http://royale.zerezo.com/zr364xx/
 -T:    git git://linuxtv.org/media_tree.git
 -F:    Documentation/admin-guide/media/zr364xx*
 -F:    drivers/staging/media/deprecated/zr364xx/
 +F:    include/linux/udp.h
 +F:    net/ipv4/udp.c
 +F:    net/ipv6/udp.c
  
  USER-MODE LINUX (UML)
  M:    Richard Weinberger <richard@nod.at>
@@@ -21869,10 -21784,13 +21870,10 @@@ W:        http://en.wikipedia.org/wiki/Util-li
  T:    git git://git.kernel.org/pub/scm/utils/util-linux/util-linux.git
  
  UUID HELPERS
 -M:    Christoph Hellwig <hch@lst.de>
  R:    Andy Shevchenko <andriy.shevchenko@linux.intel.com>
  L:    linux-kernel@vger.kernel.org
  S:    Maintained
 -T:    git git://git.infradead.org/users/hch/uuid.git
  F:    include/linux/uuid.h
 -F:    include/uapi/linux/uuid.h
  F:    lib/test_uuid.c
  F:    lib/uuid.c
  
@@@ -21912,6 -21830,7 +21913,6 @@@ F:   tools/testing/selftests/filesystems/
  
  VFIO DRIVER
  M:    Alex Williamson <alex.williamson@redhat.com>
 -R:    Cornelia Huck <cohuck@redhat.com>
  L:    kvm@vger.kernel.org
  S:    Maintained
  T:    git https://github.com/awilliam/linux-vfio.git
@@@ -22086,7 -22005,6 +22087,7 @@@ S:   Maintaine
  F:    Documentation/ABI/testing/sysfs-bus-vdpa
  F:    Documentation/ABI/testing/sysfs-class-vduse
  F:    Documentation/devicetree/bindings/virtio/
 +F:    Documentation/driver-api/virtio/
  F:    drivers/block/virtio_blk.c
  F:    drivers/crypto/virtio/
  F:    drivers/net/virtio_net.c
@@@ -22107,10 -22025,6 +22108,10 @@@ IFCVF VIRTIO DATA PATH ACCELERATO
  R:    Zhu Lingshan <lingshan.zhu@intel.com>
  F:    drivers/vdpa/ifcvf/
  
 +SNET DPU VIRTIO DATA PATH ACCELERATOR
 +R:    Alvaro Karsz <alvaro.karsz@solid-run.com>
 +F:    drivers/vdpa/solidrun/
 +
  VIRTIO BALLOON
  M:    "Michael S. Tsirkin" <mst@redhat.com>
  M:    David Hildenbrand <david@redhat.com>
@@@ -22333,9 -22247,7 +22334,9 @@@ F:   drivers/scsi/vmw_pvscsi.
  F:    drivers/scsi/vmw_pvscsi.h
  
  VMWARE VIRTUAL PTP CLOCK DRIVER
 -M:    Vivek Thampi <vithampi@vmware.com>
 +M:    Srivatsa S. Bhat (VMware) <srivatsa@csail.mit.edu>
 +M:    Deep Shah <sdeep@vmware.com>
 +R:    Alexey Makhalov <amakhalov@vmware.com>
  R:    VMware PV-Drivers Reviewers <pv-drivers@vmware.com>
  L:    netdev@vger.kernel.org
  S:    Supported
@@@ -22703,7 -22615,6 +22704,7 @@@ S:   Maintaine
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/pdx86/platform-drivers-x86.git
  F:    drivers/platform/olpc/
  F:    drivers/platform/x86/
 +F:    include/linux/platform_data/x86/
  
  X86 PLATFORM DRIVERS - ARCH
  R:    Darren Hart <dvhart@infradead.org>
@@@ -22980,17 -22891,6 +22981,17 @@@ F: Documentation/devicetree/bindings/me
  F:    drivers/media/platform/xilinx/
  F:    include/uapi/linux/xilinx-v4l2-controls.h
  
 +XILINX XDMA DRIVER
 +M:    Lizhi Hou <lizhi.hou@amd.com>
 +M:    Brian Xu <brian.xu@amd.com>
 +M:    Raj Kumar Rampelli <raj.kumar.rampelli@amd.com>
 +L:    dmaengine@vger.kernel.org
 +S:    Supported
 +F:    drivers/dma/xilinx/xdma-regs.h
 +F:    drivers/dma/xilinx/xdma.c
 +F:    include/linux/dma/amd_xdma.h
 +F:    include/linux/platform_data/amd_xdma.h
 +
  XILINX ZYNQMP DPDMA DRIVER
  M:    Hyun Kwon <hyun.kwon@xilinx.com>
  M:    Laurent Pinchart <laurent.pinchart@ideasonboard.com>
@@@ -23000,13 -22900,6 +23001,13 @@@ F: Documentation/devicetree/bindings/dm
  F:    drivers/dma/xilinx/xilinx_dpdma.c
  F:    include/dt-bindings/dma/xlnx-zynqmp-dpdma.h
  
 +XILINX ZYNQMP OCM EDAC DRIVER
 +M:    Shubhrajyoti Datta <shubhrajyoti.datta@amd.com>
 +M:    Sai Krishna Potthuri <sai.krishna.potthuri@amd.com>
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/memory-controllers/xlnx,zynqmp-ocmc-1.0.yaml
 +F:    drivers/edac/zynqmp_edac.c
 +
  XILINX ZYNQMP PSGTR PHY DRIVER
  M:    Anurag Kumar Vulisha <anurag.kumar.vulisha@xilinx.com>
  M:    Laurent Pinchart <laurent.pinchart@ideasonboard.com>
diff --combined fs/f2fs/checkpoint.c
index 5a5515d83a1b9187e265259629c49e6e05f1d65b,1369ec892a2cac263bf0980bb17285110e9474ea..c3e058e0a01882357aaa575c02c9bb903bca2b93
@@@ -70,7 -70,7 +70,7 @@@ static struct page *__get_meta_page(str
                .old_blkaddr = index,
                .new_blkaddr = index,
                .encrypted_page = NULL,
-               .is_por = !is_meta,
+               .is_por = !is_meta ? 1 : 0,
        };
        int err;
  
@@@ -171,10 -171,8 +171,8 @@@ static bool __is_bitmap_valid(struct f2
  bool f2fs_is_valid_blkaddr(struct f2fs_sb_info *sbi,
                                        block_t blkaddr, int type)
  {
-       if (time_to_inject(sbi, FAULT_BLKADDR)) {
-               f2fs_show_injection_info(sbi, FAULT_BLKADDR);
+       if (time_to_inject(sbi, FAULT_BLKADDR))
                return false;
-       }
  
        switch (type) {
        case META_NAT:
@@@ -239,8 -237,8 +237,8 @@@ int f2fs_ra_meta_pages(struct f2fs_sb_i
                .op = REQ_OP_READ,
                .op_flags = sync ? (REQ_META | REQ_PRIO) : REQ_RAHEAD,
                .encrypted_page = NULL,
-               .in_list = false,
-               .is_por = (type == META_POR),
+               .in_list = 0,
+               .is_por = (type == META_POR) ? 1 : 0,
        };
        struct blk_plug plug;
        int err;
@@@ -395,62 -393,59 +393,62 @@@ long f2fs_sync_meta_pages(struct f2fs_s
  {
        struct address_space *mapping = META_MAPPING(sbi);
        pgoff_t index = 0, prev = ULONG_MAX;
 -      struct pagevec pvec;
 +      struct folio_batch fbatch;
        long nwritten = 0;
 -      int nr_pages;
 +      int nr_folios;
        struct writeback_control wbc = {
                .for_reclaim = 0,
        };
        struct blk_plug plug;
  
 -      pagevec_init(&pvec);
 +      folio_batch_init(&fbatch);
  
        blk_start_plug(&plug);
  
 -      while ((nr_pages = pagevec_lookup_tag(&pvec, mapping, &index,
 -                              PAGECACHE_TAG_DIRTY))) {
 +      while ((nr_folios = filemap_get_folios_tag(mapping, &index,
 +                                      (pgoff_t)-1,
 +                                      PAGECACHE_TAG_DIRTY, &fbatch))) {
                int i;
  
 -              for (i = 0; i < nr_pages; i++) {
 -                      struct page *page = pvec.pages[i];
 +              for (i = 0; i < nr_folios; i++) {
 +                      struct folio *folio = fbatch.folios[i];
  
 -                      if (prev == ULONG_MAX)
 -                              prev = page->index - 1;
 -                      if (nr_to_write != LONG_MAX && page->index != prev + 1) {
 -                              pagevec_release(&pvec);
 +                      if (nr_to_write != LONG_MAX && i != 0 &&
 +                                      folio->index != prev +
 +                                      folio_nr_pages(fbatch.folios[i-1])) {
 +                              folio_batch_release(&fbatch);
                                goto stop;
                        }
  
 -                      lock_page(page);
 +                      folio_lock(folio);
  
 -                      if (unlikely(page->mapping != mapping)) {
 +                      if (unlikely(folio->mapping != mapping)) {
  continue_unlock:
 -                              unlock_page(page);
 +                              folio_unlock(folio);
                                continue;
                        }
 -                      if (!PageDirty(page)) {
 +                      if (!folio_test_dirty(folio)) {
                                /* someone wrote it for us */
                                goto continue_unlock;
                        }
  
 -                      f2fs_wait_on_page_writeback(page, META, true, true);
 +                      f2fs_wait_on_page_writeback(&folio->page, META,
 +                                      true, true);
  
 -                      if (!clear_page_dirty_for_io(page))
 +                      if (!folio_clear_dirty_for_io(folio))
                                goto continue_unlock;
  
 -                      if (__f2fs_write_meta_page(page, &wbc, io_type)) {
 -                              unlock_page(page);
 +                      if (__f2fs_write_meta_page(&folio->page, &wbc,
 +                                              io_type)) {
 +                              folio_unlock(folio);
                                break;
                        }
 -                      nwritten++;
 -                      prev = page->index;
 +                      nwritten += folio_nr_pages(folio);
 +                      prev = folio->index;
                        if (unlikely(nwritten >= nr_to_write))
                                break;
                }
 -              pagevec_release(&pvec);
 +              folio_batch_release(&fbatch);
                cond_resched();
        }
  stop:
@@@ -625,7 -620,6 +623,6 @@@ int f2fs_acquire_orphan_inode(struct f2
  
        if (time_to_inject(sbi, FAULT_ORPHAN)) {
                spin_unlock(&im->ino_lock);
-               f2fs_show_injection_info(sbi, FAULT_ORPHAN);
                return -ENOSPC;
        }
  
@@@ -798,7 -792,7 +795,7 @@@ static void write_orphan_inodes(struct 
         */
        head = &im->ino_list;
  
-       /* loop for each orphan inode entry and write them in Jornal block */
+       /* loop for each orphan inode entry and write them in journal block */
        list_for_each_entry(orphan, head, list) {
                if (!page) {
                        page = f2fs_grab_meta_page(sbi, start_blk++);
@@@ -1128,7 -1122,7 +1125,7 @@@ retry
        } else {
                /*
                 * We should submit bio, since it exists several
-                * wribacking dentry pages in the freeing inode.
+                * writebacking dentry pages in the freeing inode.
                 */
                f2fs_submit_merged_write(sbi, DATA);
                cond_resched();
@@@ -1406,7 -1400,7 +1403,7 @@@ static void commit_checkpoint(struct f2
        };
  
        /*
 -       * pagevec_lookup_tag and lock_page again will take
 +       * filemap_get_folios_tag and lock_page again will take
         * some extra time. Therefore, f2fs_update_meta_pages and
         * f2fs_sync_meta_pages are combined in this function.
         */
@@@ -1476,20 -1470,18 +1473,18 @@@ static int do_checkpoint(struct f2fs_sb
        ckpt->elapsed_time = cpu_to_le64(get_mtime(sbi, true));
        ckpt->free_segment_count = cpu_to_le32(free_segments(sbi));
        for (i = 0; i < NR_CURSEG_NODE_TYPE; i++) {
-               ckpt->cur_node_segno[i] =
-                       cpu_to_le32(curseg_segno(sbi, i + CURSEG_HOT_NODE));
-               ckpt->cur_node_blkoff[i] =
-                       cpu_to_le16(curseg_blkoff(sbi, i + CURSEG_HOT_NODE));
-               ckpt->alloc_type[i + CURSEG_HOT_NODE] =
-                               curseg_alloc_type(sbi, i + CURSEG_HOT_NODE);
+               struct curseg_info *curseg = CURSEG_I(sbi, i + CURSEG_HOT_NODE);
+               ckpt->cur_node_segno[i] = cpu_to_le32(curseg->segno);
+               ckpt->cur_node_blkoff[i] = cpu_to_le16(curseg->next_blkoff);
+               ckpt->alloc_type[i + CURSEG_HOT_NODE] = curseg->alloc_type;
        }
        for (i = 0; i < NR_CURSEG_DATA_TYPE; i++) {
-               ckpt->cur_data_segno[i] =
-                       cpu_to_le32(curseg_segno(sbi, i + CURSEG_HOT_DATA));
-               ckpt->cur_data_blkoff[i] =
-                       cpu_to_le16(curseg_blkoff(sbi, i + CURSEG_HOT_DATA));
-               ckpt->alloc_type[i + CURSEG_HOT_DATA] =
-                               curseg_alloc_type(sbi, i + CURSEG_HOT_DATA);
+               struct curseg_info *curseg = CURSEG_I(sbi, i + CURSEG_HOT_DATA);
+               ckpt->cur_data_segno[i] = cpu_to_le32(curseg->segno);
+               ckpt->cur_data_blkoff[i] = cpu_to_le16(curseg->next_blkoff);
+               ckpt->alloc_type[i + CURSEG_HOT_DATA] = curseg->alloc_type;
        }
  
        /* 2 cp + n data seg summary + orphan inode blocks */
diff --combined fs/f2fs/data.c
index 41addc605350f72b897ceb08fe4544795dc783dc,28e09682b056e120bb0c37ca9a8f15040668655b..06b552a0aba23cd9b8ce6fcf205ed16e9c5a1272
@@@ -292,13 -292,11 +292,11 @@@ static void f2fs_read_end_io(struct bi
        struct bio_post_read_ctx *ctx;
        bool intask = in_task();
  
-       iostat_update_and_unbind_ctx(bio, 0);
+       iostat_update_and_unbind_ctx(bio);
        ctx = bio->bi_private;
  
-       if (time_to_inject(sbi, FAULT_READ_IO)) {
-               f2fs_show_injection_info(sbi, FAULT_READ_IO);
+       if (time_to_inject(sbi, FAULT_READ_IO))
                bio->bi_status = BLK_STS_IOERR;
-       }
  
        if (bio->bi_status) {
                f2fs_finish_read_bio(bio, intask);
@@@ -332,13 -330,11 +330,11 @@@ static void f2fs_write_end_io(struct bi
        struct bio_vec *bvec;
        struct bvec_iter_all iter_all;
  
-       iostat_update_and_unbind_ctx(bio, 1);
+       iostat_update_and_unbind_ctx(bio);
        sbi = bio->bi_private;
  
-       if (time_to_inject(sbi, FAULT_WRITE_IO)) {
-               f2fs_show_injection_info(sbi, FAULT_WRITE_IO);
+       if (time_to_inject(sbi, FAULT_WRITE_IO))
                bio->bi_status = BLK_STS_IOERR;
-       }
  
        bio_for_each_segment_all(bvec, bio, iter_all) {
                struct page *page = bvec->bv_page;
@@@ -507,65 -503,66 +503,66 @@@ static bool f2fs_crypt_mergeable_bio(st
        return fscrypt_mergeable_bio(bio, inode, next_idx);
  }
  
static inline void __submit_bio(struct f2fs_sb_info *sbi,
-                               struct bio *bio, enum page_type type)
void f2fs_submit_read_bio(struct f2fs_sb_info *sbi, struct bio *bio,
+                                enum page_type type)
  {
-       if (!is_read_io(bio_op(bio))) {
-               unsigned int start;
+       WARN_ON_ONCE(!is_read_io(bio_op(bio)));
+       trace_f2fs_submit_read_bio(sbi->sb, type, bio);
  
-               if (type != DATA && type != NODE)
-                       goto submit_io;
+       iostat_update_submit_ctx(bio, type);
+       submit_bio(bio);
+ }
  
-               if (f2fs_lfs_mode(sbi) && current->plug)
-                       blk_finish_plug(current->plug);
+ static void f2fs_align_write_bio(struct f2fs_sb_info *sbi, struct bio *bio)
+ {
+       unsigned int start =
+               (bio->bi_iter.bi_size >> F2FS_BLKSIZE_BITS) % F2FS_IO_SIZE(sbi);
  
-               if (!F2FS_IO_ALIGNED(sbi))
-                       goto submit_io;
+       if (start == 0)
+               return;
  
-               start = bio->bi_iter.bi_size >> F2FS_BLKSIZE_BITS;
-               start %= F2FS_IO_SIZE(sbi);
+       /* fill dummy pages */
+       for (; start < F2FS_IO_SIZE(sbi); start++) {
+               struct page *page =
+                       mempool_alloc(sbi->write_io_dummy,
+                                     GFP_NOIO | __GFP_NOFAIL);
+               f2fs_bug_on(sbi, !page);
  
-               if (start == 0)
-                       goto submit_io;
+               lock_page(page);
  
-               /* fill dummy pages */
-               for (; start < F2FS_IO_SIZE(sbi); start++) {
-                       struct page *page =
-                               mempool_alloc(sbi->write_io_dummy,
-                                             GFP_NOIO | __GFP_NOFAIL);
-                       f2fs_bug_on(sbi, !page);
+               zero_user_segment(page, 0, PAGE_SIZE);
+               set_page_private_dummy(page);
  
-                       lock_page(page);
+               if (bio_add_page(bio, page, PAGE_SIZE, 0) < PAGE_SIZE)
+                       f2fs_bug_on(sbi, 1);
+       }
+ }
  
-                       zero_user_segment(page, 0, PAGE_SIZE);
-                       set_page_private_dummy(page);
+ static void f2fs_submit_write_bio(struct f2fs_sb_info *sbi, struct bio *bio,
+                                 enum page_type type)
+ {
+       WARN_ON_ONCE(is_read_io(bio_op(bio)));
+       if (type == DATA || type == NODE) {
+               if (f2fs_lfs_mode(sbi) && current->plug)
+                       blk_finish_plug(current->plug);
  
-                       if (bio_add_page(bio, page, PAGE_SIZE, 0) < PAGE_SIZE)
-                               f2fs_bug_on(sbi, 1);
+               if (F2FS_IO_ALIGNED(sbi)) {
+                       f2fs_align_write_bio(sbi, bio);
+                       /*
+                        * In the NODE case, we lose next block address chain.
+                        * So, we need to do checkpoint in f2fs_sync_file.
+                        */
+                       if (type == NODE)
+                               set_sbi_flag(sbi, SBI_NEED_CP);
                }
-               /*
-                * In the NODE case, we lose next block address chain. So, we
-                * need to do checkpoint in f2fs_sync_file.
-                */
-               if (type == NODE)
-                       set_sbi_flag(sbi, SBI_NEED_CP);
        }
- submit_io:
-       if (is_read_io(bio_op(bio)))
-               trace_f2fs_submit_read_bio(sbi->sb, type, bio);
-       else
-               trace_f2fs_submit_write_bio(sbi->sb, type, bio);
  
+       trace_f2fs_submit_write_bio(sbi->sb, type, bio);
        iostat_update_submit_ctx(bio, type);
        submit_bio(bio);
  }
  
- void f2fs_submit_bio(struct f2fs_sb_info *sbi,
-                               struct bio *bio, enum page_type type)
- {
-       __submit_bio(sbi, bio, type);
- }
  static void __submit_merged_bio(struct f2fs_bio_info *io)
  {
        struct f2fs_io_info *fio = &io->fio;
        if (!io->bio)
                return;
  
-       if (is_read_io(fio->op))
+       if (is_read_io(fio->op)) {
                trace_f2fs_prepare_read_bio(io->sbi->sb, fio->type, io->bio);
-       else
+               f2fs_submit_read_bio(io->sbi, io->bio, fio->type);
+       } else {
                trace_f2fs_prepare_write_bio(io->sbi->sb, fio->type, io->bio);
-       __submit_bio(io->sbi, io->bio, fio->type);
+               f2fs_submit_write_bio(io->sbi, io->bio, fio->type);
+       }
        io->bio = NULL;
  }
  
@@@ -655,6 -653,9 +653,9 @@@ static void __f2fs_submit_merged_write(
  
        f2fs_down_write(&io->io_rwsem);
  
+       if (!io->bio)
+               goto unlock_out;
        /* change META to META_FLUSH in the checkpoint procedure */
        if (type >= META_FLUSH) {
                io->fio.type = META_FLUSH;
                        io->bio->bi_opf |= REQ_PREFLUSH | REQ_FUA;
        }
        __submit_merged_bio(io);
+ unlock_out:
        f2fs_up_write(&io->io_rwsem);
  }
  
@@@ -741,12 -743,15 +743,15 @@@ int f2fs_submit_page_bio(struct f2fs_io
        }
  
        if (fio->io_wbc && !is_read_io(fio->op))
-               wbc_account_cgroup_owner(fio->io_wbc, page, PAGE_SIZE);
+               wbc_account_cgroup_owner(fio->io_wbc, fio->page, PAGE_SIZE);
  
        inc_page_count(fio->sbi, is_read_io(fio->op) ?
                        __read_io_type(page) : WB_DATA_TYPE(fio->page));
  
-       __submit_bio(fio->sbi, bio, fio->type);
+       if (is_read_io(bio_op(bio)))
+               f2fs_submit_read_bio(fio->sbi, bio, fio->type);
+       else
+               f2fs_submit_write_bio(fio->sbi, bio, fio->type);
        return 0;
  }
  
@@@ -848,7 -853,7 +853,7 @@@ static int add_ipu_page(struct f2fs_io_
  
                        /* page can't be merged into bio; submit the bio */
                        del_bio_entry(be);
-                       __submit_bio(sbi, *bio, DATA);
+                       f2fs_submit_write_bio(sbi, *bio, DATA);
                        break;
                }
                f2fs_up_write(&io->bio_list_lock);
@@@ -911,7 -916,7 +916,7 @@@ void f2fs_submit_merged_ipu_write(struc
        }
  
        if (found)
-               __submit_bio(sbi, target, DATA);
+               f2fs_submit_write_bio(sbi, target, DATA);
        if (bio && *bio) {
                bio_put(*bio);
                *bio = NULL;
@@@ -948,7 -953,7 +953,7 @@@ alloc_new
        }
  
        if (fio->io_wbc)
-               wbc_account_cgroup_owner(fio->io_wbc, page, PAGE_SIZE);
+               wbc_account_cgroup_owner(fio->io_wbc, fio->page, PAGE_SIZE);
  
        inc_page_count(fio->sbi, WB_DATA_TYPE(page));
  
@@@ -991,7 -996,7 +996,7 @@@ next
                bio_page = fio->page;
  
        /* set submitted = true as a return value */
-       fio->submitted = true;
+       fio->submitted = 1;
  
        inc_page_count(sbi, WB_DATA_TYPE(bio_page));
  
@@@ -1007,7 -1012,7 +1012,7 @@@ alloc_new
                                (fio->type == DATA || fio->type == NODE) &&
                                fio->new_blkaddr & F2FS_IO_SIZE_MASK(sbi)) {
                        dec_page_count(sbi, WB_DATA_TYPE(bio_page));
-                       fio->retry = true;
+                       fio->retry = 1;
                        goto skip;
                }
                io->bio = __bio_alloc(fio, BIO_MAX_VECS);
        }
  
        if (fio->io_wbc)
-               wbc_account_cgroup_owner(fio->io_wbc, bio_page, PAGE_SIZE);
+               wbc_account_cgroup_owner(fio->io_wbc, fio->page, PAGE_SIZE);
  
        io->last_block_in_bio = fio->new_blkaddr;
  
@@@ -1107,7 -1112,7 +1112,7 @@@ static int f2fs_submit_page_read(struc
        }
        inc_page_count(sbi, F2FS_RD_DATA);
        f2fs_update_iostat(sbi, NULL, FS_DATA_READ_IO, F2FS_BLKSIZE);
-       __submit_bio(sbi, bio, DATA);
+       f2fs_submit_read_bio(sbi, bio, DATA);
        return 0;
  }
  
@@@ -1207,19 -1212,6 +1212,6 @@@ int f2fs_reserve_block(struct dnode_of_
        return err;
  }
  
- int f2fs_get_block(struct dnode_of_data *dn, pgoff_t index)
- {
-       struct extent_info ei = {0, };
-       struct inode *inode = dn->inode;
-       if (f2fs_lookup_read_extent_cache(inode, index, &ei)) {
-               dn->data_blkaddr = ei.blk + index - ei.fofs;
-               return 0;
-       }
-       return f2fs_reserve_block(dn, index);
- }
  struct page *f2fs_get_read_data_page(struct inode *inode, pgoff_t index,
                                     blk_opf_t op_flags, bool for_write,
                                     pgoff_t *next_pgofs)
        struct address_space *mapping = inode->i_mapping;
        struct dnode_of_data dn;
        struct page *page;
-       struct extent_info ei = {0, };
        int err;
  
        page = f2fs_grab_cache_page(mapping, index, for_write);
        if (!page)
                return ERR_PTR(-ENOMEM);
  
-       if (f2fs_lookup_read_extent_cache(inode, index, &ei)) {
-               dn.data_blkaddr = ei.blk + index - ei.fofs;
+       if (f2fs_lookup_read_extent_cache_block(inode, index,
+                                               &dn.data_blkaddr)) {
                if (!f2fs_is_valid_blkaddr(F2FS_I_SB(inode), dn.data_blkaddr,
                                                DATA_GENERIC_ENHANCE_READ)) {
                        err = -EFSCORRUPTED;
@@@ -1432,13 -1423,12 +1423,12 @@@ static int __allocate_data_block(struc
                return err;
  
        dn->data_blkaddr = f2fs_data_blkaddr(dn);
-       if (dn->data_blkaddr != NULL_ADDR)
-               goto alloc;
-       if (unlikely((err = inc_valid_block_count(sbi, dn->inode, &count))))
-               return err;
+       if (dn->data_blkaddr == NULL_ADDR) {
+               err = inc_valid_block_count(sbi, dn->inode, &count);
+               if (unlikely(err))
+                       return err;
+       }
  
- alloc:
        set_summary(&sum, dn->nid, dn->ofs_in_node, ni.version);
        old_blkaddr = dn->data_blkaddr;
        f2fs_allocate_data_block(sbi, NULL, old_blkaddr, &dn->data_blkaddr,
        return 0;
  }
  
void f2fs_do_map_lock(struct f2fs_sb_info *sbi, int flag, bool lock)
static void f2fs_map_lock(struct f2fs_sb_info *sbi, int flag)
  {
-       if (flag == F2FS_GET_BLOCK_PRE_AIO) {
-               if (lock)
-                       f2fs_down_read(&sbi->node_change);
-               else
-                       f2fs_up_read(&sbi->node_change);
+       if (flag == F2FS_GET_BLOCK_PRE_AIO)
+               f2fs_down_read(&sbi->node_change);
+       else
+               f2fs_lock_op(sbi);
+ }
+ static void f2fs_map_unlock(struct f2fs_sb_info *sbi, int flag)
+ {
+       if (flag == F2FS_GET_BLOCK_PRE_AIO)
+               f2fs_up_read(&sbi->node_change);
+       else
+               f2fs_unlock_op(sbi);
+ }
+ int f2fs_get_block_locked(struct dnode_of_data *dn, pgoff_t index)
+ {
+       struct f2fs_sb_info *sbi = F2FS_I_SB(dn->inode);
+       int err = 0;
+       f2fs_map_lock(sbi, F2FS_GET_BLOCK_PRE_AIO);
+       if (!f2fs_lookup_read_extent_cache_block(dn->inode, index,
+                                               &dn->data_blkaddr))
+               err = f2fs_reserve_block(dn, index);
+       f2fs_map_unlock(sbi, F2FS_GET_BLOCK_PRE_AIO);
+       return err;
+ }
+ static int f2fs_map_no_dnode(struct inode *inode,
+               struct f2fs_map_blocks *map, struct dnode_of_data *dn,
+               pgoff_t pgoff)
+ {
+       struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
+       /*
+        * There is one exceptional case that read_node_page() may return
+        * -ENOENT due to filesystem has been shutdown or cp_error, return
+        * -EIO in that case.
+        */
+       if (map->m_may_create &&
+           (is_sbi_flag_set(sbi, SBI_IS_SHUTDOWN) || f2fs_cp_error(sbi)))
+               return -EIO;
+       if (map->m_next_pgofs)
+               *map->m_next_pgofs = f2fs_get_next_page_offset(dn, pgoff);
+       if (map->m_next_extent)
+               *map->m_next_extent = f2fs_get_next_page_offset(dn, pgoff);
+       return 0;
+ }
+ static bool f2fs_map_blocks_cached(struct inode *inode,
+               struct f2fs_map_blocks *map, int flag)
+ {
+       struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
+       unsigned int maxblocks = map->m_len;
+       pgoff_t pgoff = (pgoff_t)map->m_lblk;
+       struct extent_info ei = {};
+       if (!f2fs_lookup_read_extent_cache(inode, pgoff, &ei))
+               return false;
+       map->m_pblk = ei.blk + pgoff - ei.fofs;
+       map->m_len = min((pgoff_t)maxblocks, ei.fofs + ei.len - pgoff);
+       map->m_flags = F2FS_MAP_MAPPED;
+       if (map->m_next_extent)
+               *map->m_next_extent = pgoff + map->m_len;
+       /* for hardware encryption, but to avoid potential issue in future */
+       if (flag == F2FS_GET_BLOCK_DIO)
+               f2fs_wait_on_block_writeback_range(inode,
+                                       map->m_pblk, map->m_len);
+       if (f2fs_allow_multi_device_dio(sbi, flag)) {
+               int bidx = f2fs_target_device_index(sbi, map->m_pblk);
+               struct f2fs_dev_info *dev = &sbi->devs[bidx];
+               map->m_bdev = dev->bdev;
+               map->m_pblk -= dev->start_blk;
+               map->m_len = min(map->m_len, dev->end_blk + 1 - map->m_pblk);
        } else {
-               if (lock)
-                       f2fs_lock_op(sbi);
-               else
-                       f2fs_unlock_op(sbi);
+               map->m_bdev = inode->i_sb->s_bdev;
        }
+       return true;
  }
  
  /*
   * maps continuous logical blocks to physical blocks, and return such
   * info via f2fs_map_blocks structure.
   */
- int f2fs_map_blocks(struct inode *inode, struct f2fs_map_blocks *map,
-                                               int create, int flag)
+ int f2fs_map_blocks(struct inode *inode, struct f2fs_map_blocks *map, int flag)
  {
        unsigned int maxblocks = map->m_len;
        struct dnode_of_data dn;
        int err = 0, ofs = 1;
        unsigned int ofs_in_node, last_ofs_in_node;
        blkcnt_t prealloc;
-       struct extent_info ei = {0, };
        block_t blkaddr;
        unsigned int start_pgofs;
        int bidx = 0;
+       bool is_hole;
  
        if (!maxblocks)
                return 0;
  
+       if (!map->m_may_create && f2fs_map_blocks_cached(inode, map, flag))
+               goto out;
        map->m_bdev = inode->i_sb->s_bdev;
        map->m_multidev_dio =
                f2fs_allow_multi_device_dio(F2FS_I_SB(inode), flag);
        pgofs = (pgoff_t)map->m_lblk;
        end = pgofs + maxblocks;
  
-       if (!create && f2fs_lookup_read_extent_cache(inode, pgofs, &ei)) {
-               if (f2fs_lfs_mode(sbi) && flag == F2FS_GET_BLOCK_DIO &&
-                                                       map->m_may_create)
-                       goto next_dnode;
-               map->m_pblk = ei.blk + pgofs - ei.fofs;
-               map->m_len = min((pgoff_t)maxblocks, ei.fofs + ei.len - pgofs);
-               map->m_flags = F2FS_MAP_MAPPED;
-               if (map->m_next_extent)
-                       *map->m_next_extent = pgofs + map->m_len;
-               /* for hardware encryption, but to avoid potential issue in future */
-               if (flag == F2FS_GET_BLOCK_DIO)
-                       f2fs_wait_on_block_writeback_range(inode,
-                                               map->m_pblk, map->m_len);
-               if (map->m_multidev_dio) {
-                       block_t blk_addr = map->m_pblk;
-                       bidx = f2fs_target_device_index(sbi, map->m_pblk);
-                       map->m_bdev = FDEV(bidx).bdev;
-                       map->m_pblk -= FDEV(bidx).start_blk;
-                       map->m_len = min(map->m_len,
-                               FDEV(bidx).end_blk + 1 - map->m_pblk);
-                       if (map->m_may_create)
-                               f2fs_update_device_state(sbi, inode->i_ino,
-                                                       blk_addr, map->m_len);
-               }
-               goto out;
-       }
  next_dnode:
        if (map->m_may_create)
-               f2fs_do_map_lock(sbi, flag, true);
+               f2fs_map_lock(sbi, flag);
  
        /* When reading holes, we need its node page */
        set_new_dnode(&dn, inode, NULL, NULL, 0);
        if (err) {
                if (flag == F2FS_GET_BLOCK_BMAP)
                        map->m_pblk = 0;
-               if (err == -ENOENT) {
-                       /*
-                        * There is one exceptional case that read_node_page()
-                        * may return -ENOENT due to filesystem has been
-                        * shutdown or cp_error, so force to convert error
-                        * number to EIO for such case.
-                        */
-                       if (map->m_may_create &&
-                               (is_sbi_flag_set(sbi, SBI_IS_SHUTDOWN) ||
-                               f2fs_cp_error(sbi))) {
-                               err = -EIO;
-                               goto unlock_out;
-                       }
-                       err = 0;
-                       if (map->m_next_pgofs)
-                               *map->m_next_pgofs =
-                                       f2fs_get_next_page_offset(&dn, pgofs);
-                       if (map->m_next_extent)
-                               *map->m_next_extent =
-                                       f2fs_get_next_page_offset(&dn, pgofs);
-               }
+               if (err == -ENOENT)
+                       err = f2fs_map_no_dnode(inode, map, &dn, pgofs);
                goto unlock_out;
        }
  
  
  next_block:
        blkaddr = f2fs_data_blkaddr(&dn);
-       if (__is_valid_data_blkaddr(blkaddr) &&
-               !f2fs_is_valid_blkaddr(sbi, blkaddr, DATA_GENERIC_ENHANCE)) {
+       is_hole = !__is_valid_data_blkaddr(blkaddr);
+       if (!is_hole &&
+           !f2fs_is_valid_blkaddr(sbi, blkaddr, DATA_GENERIC_ENHANCE)) {
                err = -EFSCORRUPTED;
                f2fs_handle_error(sbi, ERROR_INVALID_BLKADDR);
                goto sync_out;
        }
  
-       if (__is_valid_data_blkaddr(blkaddr)) {
-               /* use out-place-update for driect IO under LFS mode */
-               if (f2fs_lfs_mode(sbi) && flag == F2FS_GET_BLOCK_DIO &&
-                                                       map->m_may_create) {
+       /* use out-place-update for direct IO under LFS mode */
+       if (map->m_may_create &&
+           (is_hole || (f2fs_lfs_mode(sbi) && flag == F2FS_GET_BLOCK_DIO))) {
+               if (unlikely(f2fs_cp_error(sbi))) {
+                       err = -EIO;
+                       goto sync_out;
+               }
+               switch (flag) {
+               case F2FS_GET_BLOCK_PRE_AIO:
+                       if (blkaddr == NULL_ADDR) {
+                               prealloc++;
+                               last_ofs_in_node = dn.ofs_in_node;
+                       }
+                       break;
+               case F2FS_GET_BLOCK_PRE_DIO:
+               case F2FS_GET_BLOCK_DIO:
                        err = __allocate_data_block(&dn, map->m_seg_type);
                        if (err)
                                goto sync_out;
-                       blkaddr = dn.data_blkaddr;
+                       if (flag == F2FS_GET_BLOCK_PRE_DIO)
+                               file_need_truncate(inode);
                        set_inode_flag(inode, FI_APPEND_WRITE);
+                       break;
+               default:
+                       WARN_ON_ONCE(1);
+                       err = -EIO;
+                       goto sync_out;
                }
-       } else {
-               if (create) {
-                       if (unlikely(f2fs_cp_error(sbi))) {
-                               err = -EIO;
-                               goto sync_out;
-                       }
-                       if (flag == F2FS_GET_BLOCK_PRE_AIO) {
-                               if (blkaddr == NULL_ADDR) {
-                                       prealloc++;
-                                       last_ofs_in_node = dn.ofs_in_node;
-                               }
-                       } else {
-                               WARN_ON(flag != F2FS_GET_BLOCK_PRE_DIO &&
-                                       flag != F2FS_GET_BLOCK_DIO);
-                               err = __allocate_data_block(&dn,
-                                                       map->m_seg_type);
-                               if (!err) {
-                                       if (flag == F2FS_GET_BLOCK_PRE_DIO)
-                                               file_need_truncate(inode);
-                                       set_inode_flag(inode, FI_APPEND_WRITE);
-                               }
-                       }
-                       if (err)
-                               goto sync_out;
+               blkaddr = dn.data_blkaddr;
+               if (is_hole)
                        map->m_flags |= F2FS_MAP_NEW;
-                       blkaddr = dn.data_blkaddr;
-               } else {
-                       if (f2fs_compressed_file(inode) &&
-                                       f2fs_sanity_check_cluster(&dn) &&
-                                       (flag != F2FS_GET_BLOCK_FIEMAP ||
-                                       IS_ENABLED(CONFIG_F2FS_CHECK_FS))) {
-                               err = -EFSCORRUPTED;
-                               f2fs_handle_error(sbi,
-                                               ERROR_CORRUPTED_CLUSTER);
-                               goto sync_out;
-                       }
-                       if (flag == F2FS_GET_BLOCK_BMAP) {
-                               map->m_pblk = 0;
-                               goto sync_out;
-                       }
-                       if (flag == F2FS_GET_BLOCK_PRECACHE)
-                               goto sync_out;
-                       if (flag == F2FS_GET_BLOCK_FIEMAP &&
-                                               blkaddr == NULL_ADDR) {
-                               if (map->m_next_pgofs)
-                                       *map->m_next_pgofs = pgofs + 1;
-                               goto sync_out;
-                       }
-                       if (flag != F2FS_GET_BLOCK_FIEMAP) {
-                               /* for defragment case */
+       } else if (is_hole) {
+               if (f2fs_compressed_file(inode) &&
+                   f2fs_sanity_check_cluster(&dn) &&
+                   (flag != F2FS_GET_BLOCK_FIEMAP ||
+                    IS_ENABLED(CONFIG_F2FS_CHECK_FS))) {
+                       err = -EFSCORRUPTED;
+                       f2fs_handle_error(sbi,
+                                       ERROR_CORRUPTED_CLUSTER);
+                       goto sync_out;
+               }
+               switch (flag) {
+               case F2FS_GET_BLOCK_PRECACHE:
+                       goto sync_out;
+               case F2FS_GET_BLOCK_BMAP:
+                       map->m_pblk = 0;
+                       goto sync_out;
+               case F2FS_GET_BLOCK_FIEMAP:
+                       if (blkaddr == NULL_ADDR) {
                                if (map->m_next_pgofs)
                                        *map->m_next_pgofs = pgofs + 1;
                                goto sync_out;
                        }
+                       break;
+               default:
+                       /* for defragment case */
+                       if (map->m_next_pgofs)
+                               *map->m_next_pgofs = pgofs + 1;
+                       goto sync_out;
                }
        }
  
                bidx = f2fs_target_device_index(sbi, blkaddr);
  
        if (map->m_len == 0) {
-               /* preallocated unwritten block should be mapped for fiemap. */
+               /* reserved delalloc block should be mapped for fiemap. */
                if (blkaddr == NEW_ADDR)
-                       map->m_flags |= F2FS_MAP_UNWRITTEN;
+                       map->m_flags |= F2FS_MAP_DELALLOC;
                map->m_flags |= F2FS_MAP_MAPPED;
  
                map->m_pblk = blkaddr;
@@@ -1721,7 -1729,7 +1729,7 @@@ skip
        f2fs_put_dnode(&dn);
  
        if (map->m_may_create) {
-               f2fs_do_map_lock(sbi, flag, false);
+               f2fs_map_unlock(sbi, flag);
                f2fs_balance_fs(sbi, dn.node_changed);
        }
        goto next_dnode;
@@@ -1767,11 -1775,11 +1775,11 @@@ sync_out
        f2fs_put_dnode(&dn);
  unlock_out:
        if (map->m_may_create) {
-               f2fs_do_map_lock(sbi, flag, false);
+               f2fs_map_unlock(sbi, flag);
                f2fs_balance_fs(sbi, dn.node_changed);
        }
  out:
-       trace_f2fs_map_blocks(inode, map, create, flag, err);
+       trace_f2fs_map_blocks(inode, map, flag, err);
        return err;
  }
  
@@@ -1793,7 -1801,7 +1801,7 @@@ bool f2fs_overwrite_io(struct inode *in
  
        while (map.m_lblk < last_lblk) {
                map.m_len = last_lblk - map.m_lblk;
-               err = f2fs_map_blocks(inode, &map, 0, F2FS_GET_BLOCK_DEFAULT);
+               err = f2fs_map_blocks(inode, &map, F2FS_GET_BLOCK_DEFAULT);
                if (err || map.m_len == 0)
                        return false;
                map.m_lblk += map.m_len;
@@@ -1967,7 -1975,7 +1975,7 @@@ next
                map.m_len = cluster_size - count_in_cluster;
        }
  
-       ret = f2fs_map_blocks(inode, &map, 0, F2FS_GET_BLOCK_FIEMAP);
+       ret = f2fs_map_blocks(inode, &map, F2FS_GET_BLOCK_FIEMAP);
        if (ret)
                goto out;
  
  
        compr_appended = false;
        /* In a case of compressed cluster, append this to the last extent */
-       if (compr_cluster && ((map.m_flags & F2FS_MAP_UNWRITTEN) ||
+       if (compr_cluster && ((map.m_flags & F2FS_MAP_DELALLOC) ||
                        !(map.m_flags & F2FS_MAP_FLAGS))) {
                compr_appended = true;
                goto skip_fill;
@@@ -2030,7 -2038,7 +2038,7 @@@ skip_fill
                                compr_cluster = false;
                                size += blks_to_bytes(inode, 1);
                        }
-               } else if (map.m_flags & F2FS_MAP_UNWRITTEN) {
+               } else if (map.m_flags & F2FS_MAP_DELALLOC) {
                        flags = FIEMAP_EXTENT_UNWRITTEN;
                }
  
@@@ -2053,7 -2061,8 +2061,7 @@@ out
  
  static inline loff_t f2fs_readpage_limit(struct inode *inode)
  {
 -      if (IS_ENABLED(CONFIG_FS_VERITY) &&
 -          (IS_VERITY(inode) || f2fs_verity_in_progress(inode)))
 +      if (IS_ENABLED(CONFIG_FS_VERITY) && IS_VERITY(inode))
                return inode->i_sb->s_maxbytes;
  
        return i_size_read(inode);
@@@ -2099,7 -2108,7 +2107,7 @@@ static int f2fs_read_single_page(struc
        map->m_lblk = block_in_file;
        map->m_len = last_block - block_in_file;
  
-       ret = f2fs_map_blocks(inode, map, 0, F2FS_GET_BLOCK_DEFAULT);
+       ret = f2fs_map_blocks(inode, map, F2FS_GET_BLOCK_DEFAULT);
        if (ret)
                goto out;
  got_it:
@@@ -2136,7 -2145,7 +2144,7 @@@ zero_out
                                       *last_block_in_bio, block_nr) ||
                    !f2fs_crypt_mergeable_bio(bio, inode, page->index, NULL))) {
  submit_and_realloc:
-               __submit_bio(F2FS_I_SB(inode), bio, DATA);
+               f2fs_submit_read_bio(F2FS_I_SB(inode), bio, DATA);
                bio = NULL;
        }
        if (bio == NULL) {
@@@ -2283,7 -2292,7 +2291,7 @@@ skip_reading_dnode
                                        *last_block_in_bio, blkaddr) ||
                    !f2fs_crypt_mergeable_bio(bio, inode, page->index, NULL))) {
  submit_and_realloc:
-                       __submit_bio(sbi, bio, DATA);
+                       f2fs_submit_read_bio(sbi, bio, DATA);
                        bio = NULL;
                }
  
@@@ -2377,7 -2386,7 +2385,7 @@@ static int f2fs_mpage_readpages(struct 
  
  #ifdef CONFIG_F2FS_FS_COMPRESSION
                if (f2fs_compressed_file(inode)) {
-                       /* there are remained comressed pages, submit them */
+                       /* there are remained compressed pages, submit them */
                        if (!f2fs_cluster_can_merge_page(&cc, page->index)) {
                                ret = f2fs_read_multi_pages(&cc, &bio,
                                                        max_nr_pages,
@@@ -2444,7 -2453,7 +2452,7 @@@ next_page
  #endif
        }
        if (bio)
-               __submit_bio(F2FS_I_SB(inode), bio, DATA);
+               f2fs_submit_read_bio(F2FS_I_SB(inode), bio, DATA);
        return ret;
  }
  
@@@ -2530,34 -2539,29 +2538,29 @@@ static inline bool check_inplace_update
                                struct f2fs_io_info *fio)
  {
        struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
-       unsigned int policy = SM_I(sbi)->ipu_policy;
  
-       if (policy & (0x1 << F2FS_IPU_HONOR_OPU_WRITE) &&
-                       is_inode_flag_set(inode, FI_OPU_WRITE))
+       if (IS_F2FS_IPU_HONOR_OPU_WRITE(sbi) &&
+           is_inode_flag_set(inode, FI_OPU_WRITE))
                return false;
-       if (policy & (0x1 << F2FS_IPU_FORCE))
+       if (IS_F2FS_IPU_FORCE(sbi))
                return true;
-       if (policy & (0x1 << F2FS_IPU_SSR) && f2fs_need_SSR(sbi))
+       if (IS_F2FS_IPU_SSR(sbi) && f2fs_need_SSR(sbi))
                return true;
-       if (policy & (0x1 << F2FS_IPU_UTIL) &&
-                       utilization(sbi) > SM_I(sbi)->min_ipu_util)
+       if (IS_F2FS_IPU_UTIL(sbi) && utilization(sbi) > SM_I(sbi)->min_ipu_util)
                return true;
-       if (policy & (0x1 << F2FS_IPU_SSR_UTIL) && f2fs_need_SSR(sbi) &&
-                       utilization(sbi) > SM_I(sbi)->min_ipu_util)
+       if (IS_F2FS_IPU_SSR_UTIL(sbi) && f2fs_need_SSR(sbi) &&
+           utilization(sbi) > SM_I(sbi)->min_ipu_util)
                return true;
  
        /*
         * IPU for rewrite async pages
         */
-       if (policy & (0x1 << F2FS_IPU_ASYNC) &&
-                       fio && fio->op == REQ_OP_WRITE &&
-                       !(fio->op_flags & REQ_SYNC) &&
-                       !IS_ENCRYPTED(inode))
+       if (IS_F2FS_IPU_ASYNC(sbi) && fio && fio->op == REQ_OP_WRITE &&
+           !(fio->op_flags & REQ_SYNC) && !IS_ENCRYPTED(inode))
                return true;
  
        /* this is only set during fdatasync */
-       if (policy & (0x1 << F2FS_IPU_FSYNC) &&
-                       is_inode_flag_set(inode, FI_NEED_IPU))
+       if (IS_F2FS_IPU_FSYNC(sbi) && is_inode_flag_set(inode, FI_NEED_IPU))
                return true;
  
        if (unlikely(fio && is_sbi_flag_set(sbi, SBI_CP_DISABLED) &&
@@@ -2635,7 -2639,6 +2638,6 @@@ int f2fs_do_write_data_page(struct f2fs
        struct page *page = fio->page;
        struct inode *inode = page->mapping->host;
        struct dnode_of_data dn;
-       struct extent_info ei = {0, };
        struct node_info ni;
        bool ipu_force = false;
        int err = 0;
                set_new_dnode(&dn, inode, NULL, NULL, 0);
  
        if (need_inplace_update(fio) &&
-           f2fs_lookup_read_extent_cache(inode, page->index, &ei)) {
-               fio->old_blkaddr = ei.blk + page->index - ei.fofs;
+           f2fs_lookup_read_extent_cache_block(inode, page->index,
+                                               &fio->old_blkaddr)) {
                if (!f2fs_is_valid_blkaddr(fio->sbi, fio->old_blkaddr,
                                                DATA_GENERIC_ENHANCE)) {
                        f2fs_handle_error(fio->sbi,
@@@ -2699,7 -2701,6 +2700,6 @@@ got_it
                        goto out_writepage;
  
                set_page_writeback(page);
-               ClearPageError(page);
                f2fs_put_dnode(&dn);
                if (fio->need_lock == LOCK_REQ)
                        f2fs_unlock_op(fio->sbi);
                goto out_writepage;
  
        set_page_writeback(page);
-       ClearPageError(page);
  
        if (fio->compr_blocks && fio->old_blkaddr == COMPRESS_ADDR)
                f2fs_i_compr_blocks_update(inode, fio->compr_blocks - 1, false);
@@@ -2780,10 -2780,10 +2779,10 @@@ int f2fs_write_single_data_page(struct 
                .old_blkaddr = NULL_ADDR,
                .page = page,
                .encrypted_page = NULL,
-               .submitted = false,
+               .submitted = 0,
                .compr_blocks = compr_blocks,
                .need_lock = LOCK_RETRY,
-               .post_read = f2fs_post_read_required(inode),
+               .post_read = f2fs_post_read_required(inode) ? 1 : 0,
                .io_type = io_type,
                .io_wbc = wbc,
                .bio = bio,
  
        trace_f2fs_writepage(page, DATA);
  
-       /* we should bypass data pages to proceed the kworkder jobs */
+       /* we should bypass data pages to proceed the kworker jobs */
        if (unlikely(f2fs_cp_error(sbi))) {
                mapping_set_error(page->mapping, -EIO);
                /*
        }
  
        if (submitted)
-               *submitted = fio.submitted ? 1 : 0;
+               *submitted = fio.submitted;
  
        return 0;
  
  redirty_out:
        redirty_page_for_writepage(wbc, page);
        /*
-        * pageout() in MM traslates EAGAIN, so calls handle_write_error()
+        * pageout() in MM translates EAGAIN, so calls handle_write_error()
         * -> mapping_set_error() -> set_bit(AS_EIO, ...).
         * file_write_and_wait_range() will see EIO error, which is critical
         * to return value of fsync() followed by atomic_write failure to user.
@@@ -2945,7 -2945,7 +2944,7 @@@ out
  }
  
  /*
-  * This function was copied from write_cche_pages from mm/page-writeback.c.
+  * This function was copied from write_cache_pages from mm/page-writeback.c.
   * The major change is making write step of cold data page separately from
   * warm/hot data page.
   */
@@@ -2956,7 -2956,6 +2955,7 @@@ static int f2fs_write_cache_pages(struc
        int ret = 0;
        int done = 0, retry = 0;
        struct page *pages[F2FS_ONSTACK_PAGES];
 +      struct folio_batch fbatch;
        struct f2fs_sb_info *sbi = F2FS_M_SB(mapping);
        struct bio *bio = NULL;
        sector_t last_block;
                .private = NULL,
        };
  #endif
 +      int nr_folios, p, idx;
        int nr_pages;
        pgoff_t index;
        pgoff_t end;            /* Inclusive */
        int submitted = 0;
        int i;
  
 +      folio_batch_init(&fbatch);
 +
        if (get_dirty_pages(mapping->host) <=
                                SM_I(F2FS_M_SB(mapping))->min_hot_blocks)
                set_inode_flag(mapping->host, FI_HOT_DATA);
@@@ -3015,38 -3011,13 +3014,38 @@@ retry
                tag_pages_for_writeback(mapping, index, end);
        done_index = index;
        while (!done && !retry && (index <= end)) {
 -              nr_pages = find_get_pages_range_tag(mapping, &index, end,
 -                              tag, F2FS_ONSTACK_PAGES, pages);
 -              if (nr_pages == 0)
 +              nr_pages = 0;
 +again:
 +              nr_folios = filemap_get_folios_tag(mapping, &index, end,
 +                              tag, &fbatch);
 +              if (nr_folios == 0) {
 +                      if (nr_pages)
 +                              goto write;
                        break;
 +              }
  
 +              for (i = 0; i < nr_folios; i++) {
 +                      struct folio *folio = fbatch.folios[i];
 +
 +                      idx = 0;
 +                      p = folio_nr_pages(folio);
 +add_more:
 +                      pages[nr_pages] = folio_page(folio, idx);
 +                      folio_get(folio);
 +                      if (++nr_pages == F2FS_ONSTACK_PAGES) {
 +                              index = folio->index + idx + 1;
 +                              folio_batch_release(&fbatch);
 +                              goto write;
 +                      }
 +                      if (++idx < p)
 +                              goto add_more;
 +              }
 +              folio_batch_release(&fbatch);
 +              goto again;
 +write:
                for (i = 0; i < nr_pages; i++) {
                        struct page *page = pages[i];
 +                      struct folio *folio = page_folio(page);
                        bool need_readd;
  readd:
                        need_readd = false;
                                }
  
                                if (!f2fs_cluster_can_merge_page(&cc,
 -                                                              page->index)) {
 +                                                              folio->index)) {
                                        ret = f2fs_write_multi_pages(&cc,
                                                &submitted, wbc, io_type);
                                        if (!ret)
                                }
  
                                if (unlikely(f2fs_cp_error(sbi)))
 -                                      goto lock_page;
 +                                      goto lock_folio;
  
                                if (!f2fs_cluster_is_empty(&cc))
 -                                      goto lock_page;
 +                                      goto lock_folio;
  
                                if (f2fs_all_cluster_page_ready(&cc,
                                        pages, i, nr_pages, true))
 -                                      goto lock_page;
 +                                      goto lock_folio;
  
                                ret2 = f2fs_prepare_compress_overwrite(
                                                        inode, &pagep,
 -                                                      page->index, &fsdata);
 +                                                      folio->index, &fsdata);
                                if (ret2 < 0) {
                                        ret = ret2;
                                        done = 1;
                                        break;
                                } else if (ret2 &&
                                        (!f2fs_compress_write_end(inode,
 -                                              fsdata, page->index, 1) ||
 +                                              fsdata, folio->index, 1) ||
                                         !f2fs_all_cluster_page_ready(&cc,
 -                                              pages, i, nr_pages, false))) {
 +                                              pages, i, nr_pages,
 +                                              false))) {
                                        retry = 1;
                                        break;
                                }
                                break;
                        }
  #ifdef CONFIG_F2FS_FS_COMPRESSION
 -lock_page:
 +lock_folio:
  #endif
 -                      done_index = page->index;
 +                      done_index = folio->index;
  retry_write:
 -                      lock_page(page);
 +                      folio_lock(folio);
  
 -                      if (unlikely(page->mapping != mapping)) {
 +                      if (unlikely(folio->mapping != mapping)) {
  continue_unlock:
 -                              unlock_page(page);
 +                              folio_unlock(folio);
                                continue;
                        }
  
 -                      if (!PageDirty(page)) {
 +                      if (!folio_test_dirty(folio)) {
                                /* someone wrote it for us */
                                goto continue_unlock;
                        }
  
 -                      if (PageWriteback(page)) {
 +                      if (folio_test_writeback(folio)) {
                                if (wbc->sync_mode != WB_SYNC_NONE)
 -                                      f2fs_wait_on_page_writeback(page,
 +                                      f2fs_wait_on_page_writeback(
 +                                                      &folio->page,
                                                        DATA, true, true);
                                else
                                        goto continue_unlock;
                        }
  
 -                      if (!clear_page_dirty_for_io(page))
 +                      if (!folio_clear_dirty_for_io(folio))
                                goto continue_unlock;
  
  #ifdef CONFIG_F2FS_FS_COMPRESSION
                        if (f2fs_compressed_file(inode)) {
 -                              get_page(page);
 -                              f2fs_compress_ctx_add_page(&cc, page);
 +                              folio_get(folio);
 +                              f2fs_compress_ctx_add_page(&cc, &folio->page);
                                continue;
                        }
  #endif
 -                      ret = f2fs_write_single_data_page(page, &submitted,
 -                                      &bio, &last_block, wbc, io_type,
 -                                      0, true);
 +                      ret = f2fs_write_single_data_page(&folio->page,
 +                                      &submitted, &bio, &last_block,
 +                                      wbc, io_type, 0, true);
                        if (ret == AOP_WRITEPAGE_ACTIVATE)
 -                              unlock_page(page);
 +                              folio_unlock(folio);
  #ifdef CONFIG_F2FS_FS_COMPRESSION
  result:
  #endif
                                        }
                                        goto next;
                                }
 -                              done_index = page->index + 1;
 +                              done_index = folio->index +
 +                                      folio_nr_pages(folio);
                                done = 1;
                                break;
                        }
@@@ -3354,9 -3322,8 +3353,8 @@@ static int prepare_write_begin(struct f
        struct dnode_of_data dn;
        struct page *ipage;
        bool locked = false;
-       struct extent_info ei = {0, };
+       int flag = F2FS_GET_BLOCK_PRE_AIO;
        int err = 0;
-       int flag;
  
        /*
         * If a whole page is being written and we already preallocated all the
                return 0;
  
        /* f2fs_lock_op avoids race between write CP and convert_inline_page */
-       if (f2fs_has_inline_data(inode) && pos + len > MAX_INLINE_DATA(inode))
-               flag = F2FS_GET_BLOCK_DEFAULT;
-       else
-               flag = F2FS_GET_BLOCK_PRE_AIO;
-       if (f2fs_has_inline_data(inode) ||
-                       (pos & PAGE_MASK) >= i_size_read(inode)) {
-               f2fs_do_map_lock(sbi, flag, true);
+       if (f2fs_has_inline_data(inode)) {
+               if (pos + len > MAX_INLINE_DATA(inode))
+                       flag = F2FS_GET_BLOCK_DEFAULT;
+               f2fs_map_lock(sbi, flag);
+               locked = true;
+       } else if ((pos & PAGE_MASK) >= i_size_read(inode)) {
+               f2fs_map_lock(sbi, flag);
                locked = true;
        }
  
@@@ -3393,40 -3359,40 +3390,40 @@@ restart
                        set_inode_flag(inode, FI_DATA_EXIST);
                        if (inode->i_nlink)
                                set_page_private_inline(ipage);
-               } else {
-                       err = f2fs_convert_inline_page(&dn, page);
-                       if (err)
-                               goto out;
-                       if (dn.data_blkaddr == NULL_ADDR)
-                               err = f2fs_get_block(&dn, index);
-               }
-       } else if (locked) {
-               err = f2fs_get_block(&dn, index);
-       } else {
-               if (f2fs_lookup_read_extent_cache(inode, index, &ei)) {
-                       dn.data_blkaddr = ei.blk + index - ei.fofs;
-               } else {
-                       /* hole case */
-                       err = f2fs_get_dnode_of_data(&dn, index, LOOKUP_NODE);
-                       if (err || dn.data_blkaddr == NULL_ADDR) {
-                               f2fs_put_dnode(&dn);
-                               f2fs_do_map_lock(sbi, F2FS_GET_BLOCK_PRE_AIO,
-                                                               true);
-                               WARN_ON(flag != F2FS_GET_BLOCK_PRE_AIO);
-                               locked = true;
-                               goto restart;
-                       }
+                       goto out;
                }
+               err = f2fs_convert_inline_page(&dn, page);
+               if (err || dn.data_blkaddr != NULL_ADDR)
+                       goto out;
        }
  
-       /* convert_inline_page can make node_changed */
-       *blk_addr = dn.data_blkaddr;
-       *node_changed = dn.node_changed;
+       if (!f2fs_lookup_read_extent_cache_block(inode, index,
+                                                &dn.data_blkaddr)) {
+               if (locked) {
+                       err = f2fs_reserve_block(&dn, index);
+                       goto out;
+               }
+               /* hole case */
+               err = f2fs_get_dnode_of_data(&dn, index, LOOKUP_NODE);
+               if (!err && dn.data_blkaddr != NULL_ADDR)
+                       goto out;
+               f2fs_put_dnode(&dn);
+               f2fs_map_lock(sbi, F2FS_GET_BLOCK_PRE_AIO);
+               WARN_ON(flag != F2FS_GET_BLOCK_PRE_AIO);
+               locked = true;
+               goto restart;
+       }
  out:
+       if (!err) {
+               /* convert_inline_page can make node_changed */
+               *blk_addr = dn.data_blkaddr;
+               *node_changed = dn.node_changed;
+       }
        f2fs_put_dnode(&dn);
  unlock_out:
        if (locked)
-               f2fs_do_map_lock(sbi, flag, false);
+               f2fs_map_unlock(sbi, flag);
        return err;
  }
  
@@@ -3435,7 -3401,6 +3432,6 @@@ static int __find_data_block(struct ino
  {
        struct dnode_of_data dn;
        struct page *ipage;
-       struct extent_info ei = {0, };
        int err = 0;
  
        ipage = f2fs_get_node_page(F2FS_I_SB(inode), inode->i_ino);
  
        set_new_dnode(&dn, inode, ipage, ipage, 0);
  
-       if (f2fs_lookup_read_extent_cache(inode, index, &ei)) {
-               dn.data_blkaddr = ei.blk + index - ei.fofs;
-       } else {
+       if (!f2fs_lookup_read_extent_cache_block(inode, index,
+                                                &dn.data_blkaddr)) {
                /* hole case */
                err = f2fs_get_dnode_of_data(&dn, index, LOOKUP_NODE);
                if (err) {
@@@ -3467,7 -3431,7 +3462,7 @@@ static int __reserve_data_block(struct 
        struct page *ipage;
        int err = 0;
  
-       f2fs_do_map_lock(sbi, F2FS_GET_BLOCK_PRE_AIO, true);
+       f2fs_map_lock(sbi, F2FS_GET_BLOCK_PRE_AIO);
  
        ipage = f2fs_get_node_page(sbi, inode->i_ino);
        if (IS_ERR(ipage)) {
        }
        set_new_dnode(&dn, inode, ipage, ipage, 0);
  
-       err = f2fs_get_block(&dn, index);
+       if (!f2fs_lookup_read_extent_cache_block(dn.inode, index,
+                                               &dn.data_blkaddr))
+               err = f2fs_reserve_block(&dn, index);
  
        *blk_addr = dn.data_blkaddr;
        *node_changed = dn.node_changed;
        f2fs_put_dnode(&dn);
  
  unlock_out:
-       f2fs_do_map_lock(sbi, F2FS_GET_BLOCK_PRE_AIO, false);
+       f2fs_map_unlock(sbi, F2FS_GET_BLOCK_PRE_AIO);
        return err;
  }
  
@@@ -3729,6 -3695,7 +3726,7 @@@ void f2fs_invalidate_folio(struct foli
                }
        }
  
+       clear_page_private_reference(&folio->page);
        clear_page_private_gcing(&folio->page);
  
        if (test_opt(sbi, COMPRESS_CACHE) &&
@@@ -3754,6 -3721,7 +3752,7 @@@ bool f2fs_release_folio(struct folio *f
                        clear_page_private_data(&folio->page);
        }
  
+       clear_page_private_reference(&folio->page);
        clear_page_private_gcing(&folio->page);
  
        folio_detach_private(folio);
@@@ -3835,7 -3803,7 +3834,7 @@@ static sector_t f2fs_bmap(struct addres
                map.m_next_pgofs = NULL;
                map.m_seg_type = NO_CHECK_TYPE;
  
-               if (!f2fs_map_blocks(inode, &map, 0, F2FS_GET_BLOCK_BMAP))
+               if (!f2fs_map_blocks(inode, &map, F2FS_GET_BLOCK_BMAP))
                        blknr = map.m_pblk;
        }
  out:
@@@ -3943,7 -3911,7 +3942,7 @@@ retry
                map.m_seg_type = NO_CHECK_TYPE;
                map.m_may_create = false;
  
-               ret = f2fs_map_blocks(inode, &map, 0, F2FS_GET_BLOCK_FIEMAP);
+               ret = f2fs_map_blocks(inode, &map, F2FS_GET_BLOCK_FIEMAP);
                if (ret)
                        goto out;
  
@@@ -4168,8 -4136,7 +4167,7 @@@ static int f2fs_iomap_begin(struct inod
        if (flags & IOMAP_WRITE)
                map.m_may_create = true;
  
-       err = f2fs_map_blocks(inode, &map, flags & IOMAP_WRITE,
-                             F2FS_GET_BLOCK_DIO);
+       err = f2fs_map_blocks(inode, &map, F2FS_GET_BLOCK_DIO);
        if (err)
                return err;
  
         */
        map.m_len = fscrypt_limit_io_blocks(inode, map.m_lblk, map.m_len);
  
-       if (map.m_flags & (F2FS_MAP_MAPPED | F2FS_MAP_UNWRITTEN)) {
-               iomap->length = blks_to_bytes(inode, map.m_len);
-               if (map.m_flags & F2FS_MAP_MAPPED) {
-                       iomap->type = IOMAP_MAPPED;
-                       iomap->flags |= IOMAP_F_MERGED;
-               } else {
-                       iomap->type = IOMAP_UNWRITTEN;
-               }
-               if (WARN_ON_ONCE(!__is_valid_data_blkaddr(map.m_pblk)))
-                       return -EINVAL;
+       /*
+        * We should never see delalloc or compressed extents here based on
+        * prior flushing and checks.
+        */
+       if (WARN_ON_ONCE(map.m_pblk == NEW_ADDR))
+               return -EINVAL;
+       if (WARN_ON_ONCE(map.m_pblk == COMPRESS_ADDR))
+               return -EINVAL;
  
+       if (map.m_pblk != NULL_ADDR) {
+               iomap->length = blks_to_bytes(inode, map.m_len);
+               iomap->type = IOMAP_MAPPED;
+               iomap->flags |= IOMAP_F_MERGED;
                iomap->bdev = map.m_bdev;
                iomap->addr = blks_to_bytes(inode, map.m_pblk);
        } else {
+               if (flags & IOMAP_WRITE)
+                       return -ENOTBLK;
                iomap->length = blks_to_bytes(inode, next_pgofs) -
                                iomap->offset;
                iomap->type = IOMAP_HOLE;
diff --combined fs/f2fs/f2fs.h
index 9a3ffa39ad30ede1dff0ac55d1b95cdd61abab20,21596e0266ba52142dc4e0ec25acbe89cac40f2b..b0ab2062038a09ca22e7bc02ae6b1997d0af8b33
@@@ -402,7 -402,6 +402,6 @@@ struct discard_cmd_control 
        struct list_head wait_list;             /* store on-flushing entries */
        struct list_head fstrim_list;           /* in-flight discard from fstrim */
        wait_queue_head_t discard_wait_queue;   /* waiting queue for wake-up */
-       unsigned int discard_wake;              /* to wake up discard thread */
        struct mutex cmd_lock;
        unsigned int nr_discards;               /* # of discards in the list */
        unsigned int max_discards;              /* max. discards to be issued */
        unsigned int min_discard_issue_time;    /* min. interval between discard issue */
        unsigned int mid_discard_issue_time;    /* mid. interval between discard issue */
        unsigned int max_discard_issue_time;    /* max. interval between discard issue */
+       unsigned int discard_io_aware_gran; /* minimum discard granularity not be aware of I/O */
        unsigned int discard_urgent_util;       /* utilization which issue discard proactively */
        unsigned int discard_granularity;       /* discard granularity */
        unsigned int max_ordered_discard;       /* maximum discard granularity issued by lba order */
        atomic_t discard_cmd_cnt;               /* # of cached cmd count */
        struct rb_root_cached root;             /* root of discard rb-tree */
        bool rbtree_check;                      /* config for consistence check */
+       bool discard_wake;                      /* to wake up discard thread */
  };
  
  /* for the list of fsync inodes, used only during recovery */
@@@ -692,15 -693,13 +693,13 @@@ struct extent_tree_info 
  };
  
  /*
-  * This structure is taken from ext4_map_blocks.
-  *
-  * Note that, however, f2fs uses NEW and MAPPED flags for f2fs_map_blocks().
+  * State of block returned by f2fs_map_blocks.
   */
- #define F2FS_MAP_NEW          (1 << BH_New)
- #define F2FS_MAP_MAPPED               (1 << BH_Mapped)
- #define F2FS_MAP_UNWRITTEN    (1 << BH_Unwritten)
+ #define F2FS_MAP_NEW          (1U << 0)
+ #define F2FS_MAP_MAPPED               (1U << 1)
+ #define F2FS_MAP_DELALLOC     (1U << 2)
  #define F2FS_MAP_FLAGS                (F2FS_MAP_NEW | F2FS_MAP_MAPPED |\
-                               F2FS_MAP_UNWRITTEN)
+                               F2FS_MAP_DELALLOC)
  
  struct f2fs_map_blocks {
        struct block_device *m_bdev;    /* for multi-device dio */
@@@ -870,7 -869,7 +869,7 @@@ struct f2fs_inode_info 
        unsigned char i_compress_algorithm;     /* algorithm type */
        unsigned char i_log_cluster_size;       /* log of cluster size */
        unsigned char i_compress_level;         /* compress level (lz4hc,zstd) */
-       unsigned short i_compress_flag;         /* compress flag */
+       unsigned char i_compress_flag;          /* compress flag */
        unsigned int i_cluster_size;            /* cluster size */
  
        unsigned int atomic_write_cnt;
@@@ -1193,7 -1192,8 +1192,8 @@@ enum iostat_type 
        FS_META_READ_IO,                /* meta read IOs */
  
        /* other */
-       FS_DISCARD,                     /* discard */
+       FS_DISCARD_IO,                  /* discard */
+       FS_FLUSH_IO,                    /* flush */
        NR_IO_TYPE,
  };
  
@@@ -1210,19 -1210,19 +1210,19 @@@ struct f2fs_io_info 
        struct page *encrypted_page;    /* encrypted page */
        struct page *compressed_page;   /* compressed page */
        struct list_head list;          /* serialize IOs */
-       bool submitted;         /* indicate IO submission */
-       int need_lock;          /* indicate we need to lock cp_rwsem */
-       bool in_list;           /* indicate fio is in io_list */
-       bool is_por;            /* indicate IO is from recovery or not */
-       bool retry;             /* need to reallocate block address */
-       int compr_blocks;       /* # of compressed block addresses */
-       bool encrypted;         /* indicate file is encrypted */
-       bool post_read;         /* require post read */
+       unsigned int compr_blocks;      /* # of compressed block addresses */
+       unsigned int need_lock:8;       /* indicate we need to lock cp_rwsem */
+       unsigned int version:8;         /* version of the node */
+       unsigned int submitted:1;       /* indicate IO submission */
+       unsigned int in_list:1;         /* indicate fio is in io_list */
+       unsigned int is_por:1;          /* indicate IO is from recovery or not */
+       unsigned int retry:1;           /* need to reallocate block address */
+       unsigned int encrypted:1;       /* indicate file is encrypted */
+       unsigned int post_read:1;       /* require post read */
        enum iostat_type io_type;       /* io type */
        struct writeback_control *io_wbc; /* writeback control */
        struct bio **bio;               /* bio for ipu */
        sector_t *last_block;           /* last block number in bio */
-       unsigned char version;          /* version of the node */
  };
  
  struct bio_entry {
@@@ -1384,8 -1384,6 +1384,6 @@@ enum 
        MEMORY_MODE_LOW,        /* memory mode for low memry devices */
  };
  
  static inline int f2fs_test_bit(unsigned int nr, char *addr);
  static inline void f2fs_set_bit(unsigned int nr, char *addr);
  static inline void f2fs_clear_bit(unsigned int nr, char *addr);
   * Layout A: lowest bit should be 1
   * | bit0 = 1 | bit1 | bit2 | ... | bit MAX | private data .... |
   * bit 0      PAGE_PRIVATE_NOT_POINTER
-  * bit 1      PAGE_PRIVATE_ATOMIC_WRITE
-  * bit 2      PAGE_PRIVATE_DUMMY_WRITE
-  * bit 3      PAGE_PRIVATE_ONGOING_MIGRATION
-  * bit 4      PAGE_PRIVATE_INLINE_INODE
-  * bit 5      PAGE_PRIVATE_REF_RESOURCE
-  * bit 6-     f2fs private data
+  * bit 1      PAGE_PRIVATE_DUMMY_WRITE
+  * bit 2      PAGE_PRIVATE_ONGOING_MIGRATION
+  * bit 3      PAGE_PRIVATE_INLINE_INODE
+  * bit 4      PAGE_PRIVATE_REF_RESOURCE
+  * bit 5-     f2fs private data
   *
   * Layout B: lowest bit should be 0
   * page.private is a wrapped pointer.
   */
  enum {
        PAGE_PRIVATE_NOT_POINTER,               /* private contains non-pointer data */
-       PAGE_PRIVATE_ATOMIC_WRITE,              /* data page from atomic write path */
        PAGE_PRIVATE_DUMMY_WRITE,               /* data page for padding aligned IO */
        PAGE_PRIVATE_ONGOING_MIGRATION,         /* data page which is on-going migrating */
        PAGE_PRIVATE_INLINE_INODE,              /* inode page contains inline data */
@@@ -1450,22 -1446,18 +1446,18 @@@ static inline void clear_page_private_#
  }
  
  PAGE_PRIVATE_GET_FUNC(nonpointer, NOT_POINTER);
- PAGE_PRIVATE_GET_FUNC(reference, REF_RESOURCE);
  PAGE_PRIVATE_GET_FUNC(inline, INLINE_INODE);
  PAGE_PRIVATE_GET_FUNC(gcing, ONGOING_MIGRATION);
- PAGE_PRIVATE_GET_FUNC(atomic, ATOMIC_WRITE);
  PAGE_PRIVATE_GET_FUNC(dummy, DUMMY_WRITE);
  
  PAGE_PRIVATE_SET_FUNC(reference, REF_RESOURCE);
  PAGE_PRIVATE_SET_FUNC(inline, INLINE_INODE);
  PAGE_PRIVATE_SET_FUNC(gcing, ONGOING_MIGRATION);
- PAGE_PRIVATE_SET_FUNC(atomic, ATOMIC_WRITE);
  PAGE_PRIVATE_SET_FUNC(dummy, DUMMY_WRITE);
  
  PAGE_PRIVATE_CLEAR_FUNC(reference, REF_RESOURCE);
  PAGE_PRIVATE_CLEAR_FUNC(inline, INLINE_INODE);
  PAGE_PRIVATE_CLEAR_FUNC(gcing, ONGOING_MIGRATION);
- PAGE_PRIVATE_CLEAR_FUNC(atomic, ATOMIC_WRITE);
  PAGE_PRIVATE_CLEAR_FUNC(dummy, DUMMY_WRITE);
  
  static inline unsigned long get_page_private_data(struct page *page)
@@@ -1679,6 -1671,7 +1671,7 @@@ struct f2fs_sb_info 
        /* The threshold used for hot and warm data seperation*/
        unsigned int hot_data_age_threshold;
        unsigned int warm_data_age_threshold;
+       unsigned int last_age_weight;
  
        /* basic filesystem units */
        unsigned int log_sectors_per_block;     /* log2 sectors per block */
  #ifdef CONFIG_F2FS_IOSTAT
        /* For app/fs IO statistics */
        spinlock_t iostat_lock;
-       unsigned long long rw_iostat[NR_IO_TYPE];
-       unsigned long long prev_rw_iostat[NR_IO_TYPE];
+       unsigned long long iostat_count[NR_IO_TYPE];
+       unsigned long long iostat_bytes[NR_IO_TYPE];
+       unsigned long long prev_iostat_bytes[NR_IO_TYPE];
        bool iostat_enable;
        unsigned long iostat_next_period;
        unsigned int iostat_period_ms;
  };
  
  #ifdef CONFIG_F2FS_FAULT_INJECTION
- #define f2fs_show_injection_info(sbi, type)                                   \
-       printk_ratelimited("%sF2FS-fs (%s) : inject %s in %s of %pS\n", \
-               KERN_INFO, sbi->sb->s_id,                               \
-               f2fs_fault_name[type],                                  \
-               __func__, __builtin_return_address(0))
- static inline bool time_to_inject(struct f2fs_sb_info *sbi, int type)
+ #define time_to_inject(sbi, type) __time_to_inject(sbi, type, __func__,       \
+                                                                       __builtin_return_address(0))
+ static inline bool __time_to_inject(struct f2fs_sb_info *sbi, int type,
+                               const char *func, const char *parent_func)
  {
        struct f2fs_fault_info *ffi = &F2FS_OPTION(sbi).fault_info;
  
        atomic_inc(&ffi->inject_ops);
        if (atomic_read(&ffi->inject_ops) >= ffi->inject_rate) {
                atomic_set(&ffi->inject_ops, 0);
+               printk_ratelimited("%sF2FS-fs (%s) : inject %s in %s of %pS\n",
+                       KERN_INFO, sbi->sb->s_id, f2fs_fault_name[type],
+                       func, parent_func);
                return true;
        }
        return false;
  }
  #else
- #define f2fs_show_injection_info(sbi, type) do { } while (0)
  static inline bool time_to_inject(struct f2fs_sb_info *sbi, int type)
  {
        return false;
@@@ -2233,10 -2227,8 +2227,8 @@@ static inline void f2fs_lock_op(struct 
  
  static inline int f2fs_trylock_op(struct f2fs_sb_info *sbi)
  {
-       if (time_to_inject(sbi, FAULT_LOCK_OP)) {
-               f2fs_show_injection_info(sbi, FAULT_LOCK_OP);
+       if (time_to_inject(sbi, FAULT_LOCK_OP))
                return 0;
-       }
        return f2fs_down_read_trylock(&sbi->cp_rwsem);
  }
  
@@@ -2324,7 -2316,6 +2316,6 @@@ static inline int inc_valid_block_count
                return ret;
  
        if (time_to_inject(sbi, FAULT_BLOCK)) {
-               f2fs_show_injection_info(sbi, FAULT_BLOCK);
                release = *count;
                goto release_quota;
        }
@@@ -2604,10 -2595,8 +2595,8 @@@ static inline int inc_valid_node_count(
                        return err;
        }
  
-       if (time_to_inject(sbi, FAULT_BLOCK)) {
-               f2fs_show_injection_info(sbi, FAULT_BLOCK);
+       if (time_to_inject(sbi, FAULT_BLOCK))
                goto enospc;
-       }
  
        spin_lock(&sbi->stat_lock);
  
@@@ -2731,11 -2720,8 +2720,8 @@@ static inline struct page *f2fs_grab_ca
                if (page)
                        return page;
  
-               if (time_to_inject(F2FS_M_SB(mapping), FAULT_PAGE_ALLOC)) {
-                       f2fs_show_injection_info(F2FS_M_SB(mapping),
-                                                       FAULT_PAGE_ALLOC);
+               if (time_to_inject(F2FS_M_SB(mapping), FAULT_PAGE_ALLOC))
                        return NULL;
-               }
        }
  
        if (!for_write)
@@@ -2752,10 -2738,8 +2738,8 @@@ static inline struct page *f2fs_pagecac
                                struct address_space *mapping, pgoff_t index,
                                int fgp_flags, gfp_t gfp_mask)
  {
-       if (time_to_inject(F2FS_M_SB(mapping), FAULT_PAGE_GET)) {
-               f2fs_show_injection_info(F2FS_M_SB(mapping), FAULT_PAGE_GET);
+       if (time_to_inject(F2FS_M_SB(mapping), FAULT_PAGE_GET))
                return NULL;
-       }
  
        return pagecache_get_page(mapping, index, fgp_flags, gfp_mask);
  }
@@@ -2805,10 -2789,8 +2789,8 @@@ static inline void *f2fs_kmem_cache_all
        if (nofail)
                return f2fs_kmem_cache_alloc_nofail(cachep, flags);
  
-       if (time_to_inject(sbi, FAULT_SLAB_ALLOC)) {
-               f2fs_show_injection_info(sbi, FAULT_SLAB_ALLOC);
+       if (time_to_inject(sbi, FAULT_SLAB_ALLOC))
                return NULL;
-       }
  
        return kmem_cache_alloc(cachep, flags);
  }
@@@ -3382,10 -3364,8 +3364,8 @@@ static inline bool is_dot_dotdot(const 
  static inline void *f2fs_kmalloc(struct f2fs_sb_info *sbi,
                                        size_t size, gfp_t flags)
  {
-       if (time_to_inject(sbi, FAULT_KMALLOC)) {
-               f2fs_show_injection_info(sbi, FAULT_KMALLOC);
+       if (time_to_inject(sbi, FAULT_KMALLOC))
                return NULL;
-       }
  
        return kmalloc(size, flags);
  }
@@@ -3399,10 -3379,8 +3379,8 @@@ static inline void *f2fs_kzalloc(struc
  static inline void *f2fs_kvmalloc(struct f2fs_sb_info *sbi,
                                        size_t size, gfp_t flags)
  {
-       if (time_to_inject(sbi, FAULT_KVMALLOC)) {
-               f2fs_show_injection_info(sbi, FAULT_KVMALLOC);
+       if (time_to_inject(sbi, FAULT_KVMALLOC))
                return NULL;
-       }
  
        return kvmalloc(size, flags);
  }
@@@ -3469,15 -3447,15 +3447,15 @@@ void f2fs_truncate_data_blocks(struct d
  int f2fs_do_truncate_blocks(struct inode *inode, u64 from, bool lock);
  int f2fs_truncate_blocks(struct inode *inode, u64 from, bool lock);
  int f2fs_truncate(struct inode *inode);
 -int f2fs_getattr(struct user_namespace *mnt_userns, const struct path *path,
 +int f2fs_getattr(struct mnt_idmap *idmap, const struct path *path,
                 struct kstat *stat, u32 request_mask, unsigned int flags);
 -int f2fs_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
 +int f2fs_setattr(struct mnt_idmap *idmap, struct dentry *dentry,
                 struct iattr *attr);
  int f2fs_truncate_hole(struct inode *inode, pgoff_t pg_start, pgoff_t pg_end);
  void f2fs_truncate_data_blocks_range(struct dnode_of_data *dn, int count);
  int f2fs_precache_extents(struct inode *inode);
  int f2fs_fileattr_get(struct dentry *dentry, struct fileattr *fa);
 -int f2fs_fileattr_set(struct user_namespace *mnt_userns,
 +int f2fs_fileattr_set(struct mnt_idmap *idmap,
                      struct dentry *dentry, struct fileattr *fa);
  long f2fs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg);
  long f2fs_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg);
@@@ -3505,7 -3483,7 +3483,7 @@@ void f2fs_handle_failed_inode(struct in
  int f2fs_update_extension_list(struct f2fs_sb_info *sbi, const char *name,
                                                        bool hot, bool set);
  struct dentry *f2fs_get_parent(struct dentry *child);
 -int f2fs_get_tmpfile(struct user_namespace *mnt_userns, struct inode *dir,
 +int f2fs_get_tmpfile(struct mnt_idmap *idmap, struct inode *dir,
                     struct inode **new_inode);
  
  /*
@@@ -3788,8 -3766,8 +3766,8 @@@ int __init f2fs_init_bioset(void)
  void f2fs_destroy_bioset(void);
  int f2fs_init_bio_entry_cache(void);
  void f2fs_destroy_bio_entry_cache(void);
- void f2fs_submit_bio(struct f2fs_sb_info *sbi,
-                               struct bio *bio, enum page_type type);
+ void f2fs_submit_read_bio(struct f2fs_sb_info *sbi, struct bio *bio,
+                         enum page_type type);
  int f2fs_init_write_merge_io(struct f2fs_sb_info *sbi);
  void f2fs_submit_merged_write(struct f2fs_sb_info *sbi, enum page_type type);
  void f2fs_submit_merged_write_cond(struct f2fs_sb_info *sbi,
@@@ -3808,7 -3786,7 +3786,7 @@@ void f2fs_set_data_blkaddr(struct dnode
  void f2fs_update_data_blkaddr(struct dnode_of_data *dn, block_t blkaddr);
  int f2fs_reserve_new_blocks(struct dnode_of_data *dn, blkcnt_t count);
  int f2fs_reserve_new_block(struct dnode_of_data *dn);
- int f2fs_get_block(struct dnode_of_data *dn, pgoff_t index);
+ int f2fs_get_block_locked(struct dnode_of_data *dn, pgoff_t index);
  int f2fs_reserve_block(struct dnode_of_data *dn, pgoff_t index);
  struct page *f2fs_get_read_data_page(struct inode *inode, pgoff_t index,
                        blk_opf_t op_flags, bool for_write, pgoff_t *next_pgofs);
@@@ -3819,9 -3797,7 +3797,7 @@@ struct page *f2fs_get_lock_data_page(st
  struct page *f2fs_get_new_data_page(struct inode *inode,
                        struct page *ipage, pgoff_t index, bool new_i_size);
  int f2fs_do_write_data_page(struct f2fs_io_info *fio);
- void f2fs_do_map_lock(struct f2fs_sb_info *sbi, int flag, bool lock);
- int f2fs_map_blocks(struct inode *inode, struct f2fs_map_blocks *map,
-                       int create, int flag);
+ int f2fs_map_blocks(struct inode *inode, struct f2fs_map_blocks *map, int flag);
  int f2fs_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
                        u64 start, u64 len);
  int f2fs_encrypt_one_page(struct f2fs_io_info *fio);
@@@ -4161,6 -4137,7 +4137,7 @@@ void f2fs_leave_shrinker(struct f2fs_sb
  /*
   * extent_cache.c
   */
+ bool sanity_check_extent_cache(struct inode *inode);
  struct rb_entry *f2fs_lookup_rb_tree(struct rb_root_cached *root,
                                struct rb_entry *cached_re, unsigned int ofs);
  struct rb_node **f2fs_lookup_rb_tree_ext(struct f2fs_sb_info *sbi,
@@@ -4190,6 -4167,8 +4167,8 @@@ void f2fs_destroy_extent_cache(void)
  void f2fs_init_read_extent_tree(struct inode *inode, struct page *ipage);
  bool f2fs_lookup_read_extent_cache(struct inode *inode, pgoff_t pgofs,
                        struct extent_info *ei);
+ bool f2fs_lookup_read_extent_cache_block(struct inode *inode, pgoff_t index,
+                       block_t *blkaddr);
  void f2fs_update_read_extent_cache(struct dnode_of_data *dn);
  void f2fs_update_read_extent_cache_range(struct dnode_of_data *dn,
                        pgoff_t fofs, block_t blkaddr, unsigned int len);
@@@ -4259,7 -4238,7 +4238,7 @@@ bool f2fs_compress_write_end(struct ino
  int f2fs_truncate_partial_cluster(struct inode *inode, u64 from, bool lock);
  void f2fs_compress_write_end_io(struct bio *bio, struct page *page);
  bool f2fs_is_compress_backend_ready(struct inode *inode);
- int f2fs_init_compress_mempool(void);
+ int __init f2fs_init_compress_mempool(void);
  void f2fs_destroy_compress_mempool(void);
  void f2fs_decompress_cluster(struct decompress_io_ctx *dic, bool in_task);
  void f2fs_end_read_compressed_page(struct page *page, bool failed,
@@@ -4328,7 -4307,7 +4307,7 @@@ static inline struct page *f2fs_compres
        WARN_ON_ONCE(1);
        return ERR_PTR(-EINVAL);
  }
- static inline int f2fs_init_compress_mempool(void) { return 0; }
+ static inline int __init f2fs_init_compress_mempool(void) { return 0; }
  static inline void f2fs_destroy_compress_mempool(void) { }
  static inline void f2fs_decompress_cluster(struct decompress_io_ctx *dic,
                                bool in_task) { }
@@@ -4381,9 -4360,8 +4360,8 @@@ static inline int set_compress_context(
        if ((F2FS_I(inode)->i_compress_algorithm == COMPRESS_LZ4 ||
                F2FS_I(inode)->i_compress_algorithm == COMPRESS_ZSTD) &&
                        F2FS_OPTION(sbi).compress_level)
-               F2FS_I(inode)->i_compress_flag |=
-                               F2FS_OPTION(sbi).compress_level <<
-                               COMPRESS_LEVEL_OFFSET;
+               F2FS_I(inode)->i_compress_level =
+                               F2FS_OPTION(sbi).compress_level;
        F2FS_I(inode)->i_flags |= F2FS_COMPR_FL;
        set_inode_flag(inode, FI_COMPRESSED_FILE);
        stat_inc_compr_inode(inode);
diff --combined fs/f2fs/file.c
index b906176397436a1fefe4cbaeee6326847039f644,ca1720fc1187e7d97784f4da062ed4b198321302..15dabeac4690500f8f6e6d05d64b5cba18729781
@@@ -113,10 -113,8 +113,8 @@@ static vm_fault_t f2fs_vm_page_mkwrite(
  
        if (need_alloc) {
                /* block allocation */
-               f2fs_do_map_lock(sbi, F2FS_GET_BLOCK_PRE_AIO, true);
                set_new_dnode(&dn, inode, NULL, NULL, 0);
-               err = f2fs_get_block(&dn, page->index);
-               f2fs_do_map_lock(sbi, F2FS_GET_BLOCK_PRE_AIO, false);
+               err = f2fs_get_block_locked(&dn, page->index);
        }
  
  #ifdef CONFIG_F2FS_FS_COMPRESSION
@@@ -305,7 -303,7 +303,7 @@@ static int f2fs_do_sync_file(struct fil
                 * for OPU case, during fsync(), node can be persisted before
                 * data when lower device doesn't support write barrier, result
                 * in data corruption after SPO.
-                * So for strict fsync mode, force to use atomic write sematics
+                * So for strict fsync mode, force to use atomic write semantics
                 * to keep write order in between data/node and last node to
                 * avoid potential data corruption.
                 */
@@@ -619,7 -617,7 +617,7 @@@ void f2fs_truncate_data_blocks_range(st
                fofs = f2fs_start_bidx_of_node(ofs_of_node(dn->node_page),
                                                        dn->inode) + ofs;
                f2fs_update_read_extent_cache_range(dn, fofs, 0, len);
-               f2fs_update_age_extent_cache_range(dn, fofs, nr_free);
+               f2fs_update_age_extent_cache_range(dn, fofs, len);
                dec_valid_block_count(sbi, dn->inode, nr_free);
        }
        dn->ofs_in_node = ofs;
@@@ -784,10 -782,8 +782,8 @@@ int f2fs_truncate(struct inode *inode
  
        trace_f2fs_truncate(inode);
  
-       if (time_to_inject(F2FS_I_SB(inode), FAULT_TRUNCATE)) {
-               f2fs_show_injection_info(F2FS_I_SB(inode), FAULT_TRUNCATE);
+       if (time_to_inject(F2FS_I_SB(inode), FAULT_TRUNCATE))
                return -EIO;
-       }
  
        err = f2fs_dquot_initialize(inode);
        if (err)
@@@ -837,7 -833,7 +833,7 @@@ static bool f2fs_force_buffered_io(stru
        return false;
  }
  
 -int f2fs_getattr(struct user_namespace *mnt_userns, const struct path *path,
 +int f2fs_getattr(struct mnt_idmap *idmap, const struct path *path,
                 struct kstat *stat, u32 request_mask, unsigned int query_flags)
  {
        struct inode *inode = d_inode(path->dentry);
                                  STATX_ATTR_NODUMP |
                                  STATX_ATTR_VERITY);
  
 -      generic_fillattr(mnt_userns, inode, stat);
 +      generic_fillattr(idmap, inode, stat);
  
        /* we need to show initial sectors used for inline_data/dentries */
        if ((S_ISREG(inode->i_mode) && f2fs_has_inline_data(inode)) ||
  }
  
  #ifdef CONFIG_F2FS_FS_POSIX_ACL
 -static void __setattr_copy(struct user_namespace *mnt_userns,
 +static void __setattr_copy(struct mnt_idmap *idmap,
                           struct inode *inode, const struct iattr *attr)
  {
        unsigned int ia_valid = attr->ia_valid;
  
 -      i_uid_update(mnt_userns, attr, inode);
 -      i_gid_update(mnt_userns, attr, inode);
 +      i_uid_update(idmap, attr, inode);
 +      i_gid_update(idmap, attr, inode);
        if (ia_valid & ATTR_ATIME)
                inode->i_atime = attr->ia_atime;
        if (ia_valid & ATTR_MTIME)
                inode->i_ctime = attr->ia_ctime;
        if (ia_valid & ATTR_MODE) {
                umode_t mode = attr->ia_mode;
 -              vfsgid_t vfsgid = i_gid_into_vfsgid(mnt_userns, inode);
 +              vfsgid_t vfsgid = i_gid_into_vfsgid(idmap, inode);
  
                if (!vfsgid_in_group_p(vfsgid) &&
 -                  !capable_wrt_inode_uidgid(mnt_userns, inode, CAP_FSETID))
 +                  !capable_wrt_inode_uidgid(idmap, inode, CAP_FSETID))
                        mode &= ~S_ISGID;
                set_acl_inode(inode, mode);
        }
  #define __setattr_copy setattr_copy
  #endif
  
 -int f2fs_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
 +int f2fs_setattr(struct mnt_idmap *idmap, struct dentry *dentry,
                 struct iattr *attr)
  {
        struct inode *inode = d_inode(dentry);
                !f2fs_is_compress_backend_ready(inode))
                return -EOPNOTSUPP;
  
 -      err = setattr_prepare(mnt_userns, dentry, attr);
 +      err = setattr_prepare(idmap, dentry, attr);
        if (err)
                return err;
  
        if (err)
                return err;
  
 -      if (is_quota_modification(mnt_userns, inode, attr)) {
 +      if (is_quota_modification(idmap, inode, attr)) {
                err = f2fs_dquot_initialize(inode);
                if (err)
                        return err;
        }
 -      if (i_uid_needs_update(mnt_userns, attr, inode) ||
 -          i_gid_needs_update(mnt_userns, attr, inode)) {
 +      if (i_uid_needs_update(idmap, attr, inode) ||
 +          i_gid_needs_update(idmap, attr, inode)) {
                f2fs_lock_op(F2FS_I_SB(inode));
 -              err = dquot_transfer(mnt_userns, inode, attr);
 +              err = dquot_transfer(idmap, inode, attr);
                if (err) {
                        set_sbi_flag(F2FS_I_SB(inode),
                                        SBI_QUOTA_NEED_REPAIR);
                 * update uid/gid under lock_op(), so that dquot and inode can
                 * be updated atomically.
                 */
 -              i_uid_update(mnt_userns, attr, inode);
 -              i_gid_update(mnt_userns, attr, inode);
 +              i_uid_update(idmap, attr, inode);
 +              i_gid_update(idmap, attr, inode);
                f2fs_mark_inode_dirty_sync(inode, true);
                f2fs_unlock_op(F2FS_I_SB(inode));
        }
                spin_unlock(&F2FS_I(inode)->i_size_lock);
        }
  
 -      __setattr_copy(mnt_userns, inode, attr);
 +      __setattr_copy(idmap, inode, attr);
  
        if (attr->ia_valid & ATTR_MODE) {
 -              err = posix_acl_chmod(mnt_userns, dentry, f2fs_get_inode_mode(inode));
 +              err = posix_acl_chmod(idmap, dentry, f2fs_get_inode_mode(inode));
  
                if (is_inode_flag_set(inode, FI_ACL_MODE)) {
                        if (!err)
@@@ -1112,7 -1108,7 +1108,7 @@@ int f2fs_truncate_hole(struct inode *in
        return 0;
  }
  
- static int punch_hole(struct inode *inode, loff_t offset, loff_t len)
+ static int f2fs_punch_hole(struct inode *inode, loff_t offset, loff_t len)
  {
        pgoff_t pg_start, pg_end;
        loff_t off_start, off_end;
@@@ -1498,6 -1494,7 +1494,7 @@@ static int f2fs_do_zero_range(struct dn
        }
  
        f2fs_update_read_extent_cache_range(dn, start, 0, index - start);
+       f2fs_update_age_extent_cache_range(dn, start, index - start);
  
        return ret;
  }
@@@ -1684,7 -1681,7 +1681,7 @@@ static int f2fs_insert_range(struct ino
        return ret;
  }
  
- static int expand_inode_data(struct inode *inode, loff_t offset,
+ static int f2fs_expand_inode_data(struct inode *inode, loff_t offset,
                                        loff_t len, int mode)
  {
        struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
                        .err_gc_skipped = true,
                        .nr_free_secs = 0 };
        pgoff_t pg_start, pg_end;
-       loff_t new_size = i_size_read(inode);
+       loff_t new_size;
        loff_t off_end;
        block_t expanded = 0;
        int err;
@@@ -1745,7 -1742,7 +1742,7 @@@ next_alloc
                f2fs_unlock_op(sbi);
  
                map.m_seg_type = CURSEG_COLD_DATA_PINNED;
-               err = f2fs_map_blocks(inode, &map, 1, F2FS_GET_BLOCK_PRE_DIO);
+               err = f2fs_map_blocks(inode, &map, F2FS_GET_BLOCK_PRE_DIO);
                file_dont_truncate(inode);
  
                f2fs_up_write(&sbi->pin_sem);
  
                map.m_len = expanded;
        } else {
-               err = f2fs_map_blocks(inode, &map, 1, F2FS_GET_BLOCK_PRE_AIO);
+               err = f2fs_map_blocks(inode, &map, F2FS_GET_BLOCK_PRE_AIO);
                expanded = map.m_len;
        }
  out_err:
@@@ -1809,7 -1806,7 +1806,7 @@@ static long f2fs_fallocate(struct file 
                return -EOPNOTSUPP;
  
        /*
-        * Pinned file should not support partial trucation since the block
+        * Pinned file should not support partial truncation since the block
         * can be used by applications.
         */
        if ((f2fs_compressed_file(inode) || f2fs_is_pinned_file(inode)) &&
                if (offset >= inode->i_size)
                        goto out;
  
-               ret = punch_hole(inode, offset, len);
+               ret = f2fs_punch_hole(inode, offset, len);
        } else if (mode & FALLOC_FL_COLLAPSE_RANGE) {
                ret = f2fs_collapse_range(inode, offset, len);
        } else if (mode & FALLOC_FL_ZERO_RANGE) {
        } else if (mode & FALLOC_FL_INSERT_RANGE) {
                ret = f2fs_insert_range(inode, offset, len);
        } else {
-               ret = expand_inode_data(inode, offset, len, mode);
+               ret = f2fs_expand_inode_data(inode, offset, len, mode);
        }
  
        if (!ret) {
  static int f2fs_release_file(struct inode *inode, struct file *filp)
  {
        /*
-        * f2fs_relase_file is called at every close calls. So we should
+        * f2fs_release_file is called at every close calls. So we should
         * not drop any inmemory pages by close called by other process.
         */
        if (!(filp->f_mode & FMODE_WRITE) ||
                        atomic_read(&inode->i_writecount) != 1)
                return 0;
  
+       inode_lock(inode);
        f2fs_abort_atomic_write(inode, true);
+       inode_unlock(inode);
        return 0;
  }
  
@@@ -1880,8 -1880,13 +1880,13 @@@ static int f2fs_file_flush(struct file 
         * until all the writers close its file. Since this should be done
         * before dropping file lock, it needs to do in ->flush.
         */
-       if (F2FS_I(inode)->atomic_write_task == current)
+       if (F2FS_I(inode)->atomic_write_task == current &&
+                               (current->flags & PF_EXITING)) {
+               inode_lock(inode);
                f2fs_abort_atomic_write(inode, true);
+               inode_unlock(inode);
+       }
        return 0;
  }
  
@@@ -2038,14 -2043,14 +2043,14 @@@ static int f2fs_ioc_getversion(struct f
  static int f2fs_ioc_start_atomic_write(struct file *filp, bool truncate)
  {
        struct inode *inode = file_inode(filp);
 -      struct user_namespace *mnt_userns = file_mnt_user_ns(filp);
 +      struct mnt_idmap *idmap = file_mnt_idmap(filp);
        struct f2fs_inode_info *fi = F2FS_I(inode);
        struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
        struct inode *pinode;
        loff_t isize;
        int ret;
  
 -      if (!inode_owner_or_capable(mnt_userns, inode))
 +      if (!inode_owner_or_capable(idmap, inode))
                return -EACCES;
  
        if (!S_ISREG(inode->i_mode))
                goto out;
        }
  
-       /* Create a COW inode for atomic write */
-       pinode = f2fs_iget(inode->i_sb, fi->i_pino);
-       if (IS_ERR(pinode)) {
-               f2fs_up_write(&fi->i_gc_rwsem[WRITE]);
-               ret = PTR_ERR(pinode);
-               goto out;
-       }
+       /* Check if the inode already has a COW inode */
+       if (fi->cow_inode == NULL) {
+               /* Create a COW inode for atomic write */
+               pinode = f2fs_iget(inode->i_sb, fi->i_pino);
+               if (IS_ERR(pinode)) {
+                       f2fs_up_write(&fi->i_gc_rwsem[WRITE]);
+                       ret = PTR_ERR(pinode);
+                       goto out;
+               }
  
-       ret = f2fs_get_tmpfile(idmap, pinode, &fi->cow_inode);
-       iput(pinode);
-       if (ret) {
-               f2fs_up_write(&fi->i_gc_rwsem[WRITE]);
-               goto out;
 -              ret = f2fs_get_tmpfile(mnt_userns, pinode, &fi->cow_inode);
++              ret = f2fs_get_tmpfile(idmap, pinode, &fi->cow_inode);
+               iput(pinode);
+               if (ret) {
+                       f2fs_up_write(&fi->i_gc_rwsem[WRITE]);
+                       goto out;
+               }
+               set_inode_flag(fi->cow_inode, FI_COW_FILE);
+               clear_inode_flag(fi->cow_inode, FI_INLINE_DATA);
+       } else {
+               /* Reuse the already created COW inode */
+               f2fs_do_truncate_blocks(fi->cow_inode, 0, true);
        }
  
        f2fs_write_inode(inode, NULL);
        stat_inc_atomic_inode(inode);
  
        set_inode_flag(inode, FI_ATOMIC_FILE);
-       set_inode_flag(fi->cow_inode, FI_COW_FILE);
-       clear_inode_flag(fi->cow_inode, FI_INLINE_DATA);
  
        isize = i_size_read(inode);
        fi->original_i_size = isize;
  static int f2fs_ioc_commit_atomic_write(struct file *filp)
  {
        struct inode *inode = file_inode(filp);
 -      struct user_namespace *mnt_userns = file_mnt_user_ns(filp);
 +      struct mnt_idmap *idmap = file_mnt_idmap(filp);
        int ret;
  
 -      if (!inode_owner_or_capable(mnt_userns, inode))
 +      if (!inode_owner_or_capable(idmap, inode))
                return -EACCES;
  
        ret = mnt_want_write_file(filp);
  static int f2fs_ioc_abort_atomic_write(struct file *filp)
  {
        struct inode *inode = file_inode(filp);
 -      struct user_namespace *mnt_userns = file_mnt_user_ns(filp);
 +      struct mnt_idmap *idmap = file_mnt_idmap(filp);
        int ret;
  
 -      if (!inode_owner_or_capable(mnt_userns, inode))
 +      if (!inode_owner_or_capable(idmap, inode))
                return -EACCES;
  
        ret = mnt_want_write_file(filp);
@@@ -2338,6 -2350,7 +2350,7 @@@ static int f2fs_ioc_get_encryption_pwsa
  {
        struct inode *inode = file_inode(filp);
        struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
+       u8 encrypt_pw_salt[16];
        int err;
  
        if (!f2fs_sb_has_encrypt(sbi))
                goto out_err;
        }
  got_it:
-       if (copy_to_user((__u8 __user *)arg, sbi->raw_super->encrypt_pw_salt,
-                                                                       16))
-               err = -EFAULT;
+       memcpy(encrypt_pw_salt, sbi->raw_super->encrypt_pw_salt, 16);
  out_err:
        f2fs_up_write(&sbi->sb_lock);
        mnt_drop_write_file(filp);
+       if (!err && copy_to_user((__u8 __user *)arg, encrypt_pw_salt, 16))
+               err = -EFAULT;
        return err;
  }
  
@@@ -2524,7 -2539,7 +2539,7 @@@ static int f2fs_ioc_gc_range(struct fil
        return __f2fs_ioc_gc_range(filp, &range);
  }
  
- static int f2fs_ioc_write_checkpoint(struct file *filp, unsigned long arg)
+ static int f2fs_ioc_write_checkpoint(struct file *filp)
  {
        struct inode *inode = file_inode(filp);
        struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
@@@ -2606,7 -2621,7 +2621,7 @@@ static int f2fs_defragment_range(struc
         */
        while (map.m_lblk < pg_end) {
                map.m_len = pg_end - map.m_lblk;
-               err = f2fs_map_blocks(inode, &map, 0, F2FS_GET_BLOCK_DEFAULT);
+               err = f2fs_map_blocks(inode, &map, F2FS_GET_BLOCK_DEFAULT);
                if (err)
                        goto out;
  
  
  do_map:
                map.m_len = pg_end - map.m_lblk;
-               err = f2fs_map_blocks(inode, &map, 0, F2FS_GET_BLOCK_DEFAULT);
+               err = f2fs_map_blocks(inode, &map, F2FS_GET_BLOCK_DEFAULT);
                if (err)
                        goto clear_out;
  
@@@ -3090,7 -3105,7 +3105,7 @@@ int f2fs_fileattr_get(struct dentry *de
        return 0;
  }
  
 -int f2fs_fileattr_set(struct user_namespace *mnt_userns,
 +int f2fs_fileattr_set(struct mnt_idmap *idmap,
                      struct dentry *dentry, struct fileattr *fa)
  {
        struct inode *inode = d_inode(dentry);
@@@ -3227,7 -3242,7 +3242,7 @@@ int f2fs_precache_extents(struct inode 
                map.m_len = end - map.m_lblk;
  
                f2fs_down_write(&fi->i_gc_rwsem[WRITE]);
-               err = f2fs_map_blocks(inode, &map, 0, F2FS_GET_BLOCK_PRECACHE);
+               err = f2fs_map_blocks(inode, &map, F2FS_GET_BLOCK_PRECACHE);
                f2fs_up_write(&fi->i_gc_rwsem[WRITE]);
                if (err)
                        return err;
        return 0;
  }
  
- static int f2fs_ioc_precache_extents(struct file *filp, unsigned long arg)
+ static int f2fs_ioc_precache_extents(struct file *filp)
  {
        return f2fs_precache_extents(file_inode(filp));
  }
@@@ -3942,7 -3957,7 +3957,7 @@@ static int f2fs_ioc_set_compress_option
                goto out;
        }
  
-       if (inode->i_size != 0) {
+       if (F2FS_HAS_BLOCKS(inode)) {
                ret = -EFBIG;
                goto out;
        }
@@@ -3995,7 -4010,7 +4010,7 @@@ static int redirty_blocks(struct inode 
        return ret;
  }
  
- static int f2fs_ioc_decompress_file(struct file *filp, unsigned long arg)
+ static int f2fs_ioc_decompress_file(struct file *filp)
  {
        struct inode *inode = file_inode(filp);
        struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
@@@ -4068,7 -4083,7 +4083,7 @@@ out
        return ret;
  }
  
- static int f2fs_ioc_compress_file(struct file *filp, unsigned long arg)
+ static int f2fs_ioc_compress_file(struct file *filp)
  {
        struct inode *inode = file_inode(filp);
        struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
@@@ -4184,7 -4199,7 +4199,7 @@@ static long __f2fs_ioctl(struct file *f
        case F2FS_IOC_GARBAGE_COLLECT_RANGE:
                return f2fs_ioc_gc_range(filp, arg);
        case F2FS_IOC_WRITE_CHECKPOINT:
-               return f2fs_ioc_write_checkpoint(filp, arg);
+               return f2fs_ioc_write_checkpoint(filp);
        case F2FS_IOC_DEFRAGMENT:
                return f2fs_ioc_defragment(filp, arg);
        case F2FS_IOC_MOVE_RANGE:
        case F2FS_IOC_SET_PIN_FILE:
                return f2fs_ioc_set_pin_file(filp, arg);
        case F2FS_IOC_PRECACHE_EXTENTS:
-               return f2fs_ioc_precache_extents(filp, arg);
+               return f2fs_ioc_precache_extents(filp);
        case F2FS_IOC_RESIZE_FS:
                return f2fs_ioc_resize_fs(filp, arg);
        case FS_IOC_ENABLE_VERITY:
        case F2FS_IOC_SET_COMPRESS_OPTION:
                return f2fs_ioc_set_compress_option(filp, arg);
        case F2FS_IOC_DECOMPRESS_FILE:
-               return f2fs_ioc_decompress_file(filp, arg);
+               return f2fs_ioc_decompress_file(filp);
        case F2FS_IOC_COMPRESS_FILE:
-               return f2fs_ioc_compress_file(filp, arg);
+               return f2fs_ioc_compress_file(filp);
        default:
                return -ENOTTY;
        }
        return ret;
  }
  
+ static void f2fs_trace_rw_file_path(struct kiocb *iocb, size_t count, int rw)
+ {
+       struct inode *inode = file_inode(iocb->ki_filp);
+       char *buf, *path;
+       buf = f2fs_kmalloc(F2FS_I_SB(inode), PATH_MAX, GFP_KERNEL);
+       if (!buf)
+               return;
+       path = dentry_path_raw(file_dentry(iocb->ki_filp), buf, PATH_MAX);
+       if (IS_ERR(path))
+               goto free_buf;
+       if (rw == WRITE)
+               trace_f2fs_datawrite_start(inode, iocb->ki_pos, count,
+                               current->pid, path, current->comm);
+       else
+               trace_f2fs_dataread_start(inode, iocb->ki_pos, count,
+                               current->pid, path, current->comm);
+ free_buf:
+       kfree(buf);
+ }
  static ssize_t f2fs_file_read_iter(struct kiocb *iocb, struct iov_iter *to)
  {
        struct inode *inode = file_inode(iocb->ki_filp);
        if (!f2fs_is_compress_backend_ready(inode))
                return -EOPNOTSUPP;
  
-       if (trace_f2fs_dataread_start_enabled()) {
-               char *p = f2fs_kmalloc(F2FS_I_SB(inode), PATH_MAX, GFP_KERNEL);
-               char *path;
-               if (!p)
-                       goto skip_read_trace;
+       if (trace_f2fs_dataread_start_enabled())
+               f2fs_trace_rw_file_path(iocb, iov_iter_count(to), READ);
  
-               path = dentry_path_raw(file_dentry(iocb->ki_filp), p, PATH_MAX);
-               if (IS_ERR(path)) {
-                       kfree(p);
-                       goto skip_read_trace;
-               }
-               trace_f2fs_dataread_start(inode, pos, iov_iter_count(to),
-                                       current->pid, path, current->comm);
-               kfree(p);
-       }
- skip_read_trace:
        if (f2fs_should_use_dio(inode, iocb, to)) {
                ret = f2fs_dio_read_iter(iocb, to);
        } else {
@@@ -4466,7 -4487,7 +4487,7 @@@ static int f2fs_preallocate_blocks(stru
                flag = F2FS_GET_BLOCK_PRE_AIO;
        }
  
-       ret = f2fs_map_blocks(inode, &map, 1, flag);
+       ret = f2fs_map_blocks(inode, &map, flag);
        /* -ENOSPC|-EDQUOT are fine to report the number of allocated blocks. */
        if (ret < 0 && !((ret == -ENOSPC || ret == -EDQUOT) && map.m_len > 0))
                return ret;
@@@ -4673,24 -4694,9 +4694,9 @@@ static ssize_t f2fs_file_write_iter(str
        if (preallocated < 0) {
                ret = preallocated;
        } else {
-               if (trace_f2fs_datawrite_start_enabled()) {
-                       char *p = f2fs_kmalloc(F2FS_I_SB(inode),
-                                               PATH_MAX, GFP_KERNEL);
-                       char *path;
-                       if (!p)
-                               goto skip_write_trace;
-                       path = dentry_path_raw(file_dentry(iocb->ki_filp),
-                                                               p, PATH_MAX);
-                       if (IS_ERR(path)) {
-                               kfree(p);
-                               goto skip_write_trace;
-                       }
-                       trace_f2fs_datawrite_start(inode, orig_pos, orig_count,
-                                       current->pid, path, current->comm);
-                       kfree(p);
-               }
- skip_write_trace:
+               if (trace_f2fs_datawrite_start_enabled())
+                       f2fs_trace_rw_file_path(iocb, orig_count, WRITE);
                /* Do the actual write. */
                ret = dio ?
                        f2fs_dio_write_iter(iocb, from, &may_need_sync) :
@@@ -4823,6 -4829,7 +4829,7 @@@ long f2fs_compat_ioctl(struct file *fil
        case F2FS_IOC32_MOVE_RANGE:
                return f2fs_compat_ioc_move_range(file, arg);
        case F2FS_IOC_START_ATOMIC_WRITE:
+       case F2FS_IOC_START_ATOMIC_REPLACE:
        case F2FS_IOC_COMMIT_ATOMIC_WRITE:
        case F2FS_IOC_START_VOLATILE_WRITE:
        case F2FS_IOC_RELEASE_VOLATILE_WRITE:
diff --combined fs/f2fs/namei.c
index d8e01bbbf27fb4a6a63b89897570872d5786c6de,f9aafb7ac44df17b8af148da0c05c0bbe9ae8b55..11fc4c8036a9df064562e9d68065912a381a6c87
@@@ -202,7 -202,7 +202,7 @@@ static void set_file_temperature(struc
                file_set_hot(inode);
  }
  
 -static struct inode *f2fs_new_inode(struct user_namespace *mnt_userns,
 +static struct inode *f2fs_new_inode(struct mnt_idmap *idmap,
                                                struct inode *dir, umode_t mode,
                                                const char *name)
  {
  
        nid_free = true;
  
 -      inode_init_owner(mnt_userns, inode, dir, mode);
 +      inode_init_owner(idmap, inode, dir, mode);
  
        inode->i_ino = ino;
        inode->i_blocks = 0;
                (F2FS_I(dir)->i_flags & F2FS_PROJINHERIT_FL))
                F2FS_I(inode)->i_projid = F2FS_I(dir)->i_projid;
        else
 -              F2FS_I(inode)->i_projid = make_kprojid(mnt_userns,
 +              F2FS_I(inode)->i_projid = make_kprojid(&init_user_ns,
                                                        F2FS_DEF_PROJID);
  
        err = fscrypt_prepare_new_inode(dir, inode, &encrypt);
@@@ -333,7 -333,7 +333,7 @@@ fail_drop
        return ERR_PTR(err);
  }
  
 -static int f2fs_create(struct user_namespace *mnt_userns, struct inode *dir,
 +static int f2fs_create(struct mnt_idmap *idmap, struct inode *dir,
                       struct dentry *dentry, umode_t mode, bool excl)
  {
        struct f2fs_sb_info *sbi = F2FS_I_SB(dir);
        if (err)
                return err;
  
 -      inode = f2fs_new_inode(mnt_userns, dir, mode, dentry->d_name.name);
 +      inode = f2fs_new_inode(idmap, dir, mode, dentry->d_name.name);
        if (IS_ERR(inode))
                return PTR_ERR(inode);
  
@@@ -659,7 -659,7 +659,7 @@@ static const char *f2fs_get_link(struc
        return link;
  }
  
 -static int f2fs_symlink(struct user_namespace *mnt_userns, struct inode *dir,
 +static int f2fs_symlink(struct mnt_idmap *idmap, struct inode *dir,
                        struct dentry *dentry, const char *symname)
  {
        struct f2fs_sb_info *sbi = F2FS_I_SB(dir);
        if (err)
                return err;
  
 -      inode = f2fs_new_inode(mnt_userns, dir, S_IFLNK | S_IRWXUGO, NULL);
 +      inode = f2fs_new_inode(idmap, dir, S_IFLNK | S_IRWXUGO, NULL);
        if (IS_ERR(inode))
                return PTR_ERR(inode);
  
@@@ -739,7 -739,7 +739,7 @@@ out_free_encrypted_link
        return err;
  }
  
 -static int f2fs_mkdir(struct user_namespace *mnt_userns, struct inode *dir,
 +static int f2fs_mkdir(struct mnt_idmap *idmap, struct inode *dir,
                      struct dentry *dentry, umode_t mode)
  {
        struct f2fs_sb_info *sbi = F2FS_I_SB(dir);
        if (err)
                return err;
  
 -      inode = f2fs_new_inode(mnt_userns, dir, S_IFDIR | mode, NULL);
 +      inode = f2fs_new_inode(idmap, dir, S_IFDIR | mode, NULL);
        if (IS_ERR(inode))
                return PTR_ERR(inode);
  
@@@ -794,7 -794,7 +794,7 @@@ static int f2fs_rmdir(struct inode *dir
        return -ENOTEMPTY;
  }
  
 -static int f2fs_mknod(struct user_namespace *mnt_userns, struct inode *dir,
 +static int f2fs_mknod(struct mnt_idmap *idmap, struct inode *dir,
                      struct dentry *dentry, umode_t mode, dev_t rdev)
  {
        struct f2fs_sb_info *sbi = F2FS_I_SB(dir);
        if (err)
                return err;
  
 -      inode = f2fs_new_inode(mnt_userns, dir, mode, NULL);
 +      inode = f2fs_new_inode(idmap, dir, mode, NULL);
        if (IS_ERR(inode))
                return PTR_ERR(inode);
  
@@@ -837,7 -837,7 +837,7 @@@ out
        return err;
  }
  
 -static int __f2fs_tmpfile(struct user_namespace *mnt_userns, struct inode *dir,
 +static int __f2fs_tmpfile(struct mnt_idmap *idmap, struct inode *dir,
                          struct file *file, umode_t mode, bool is_whiteout,
                          struct inode **new_inode)
  {
        if (err)
                return err;
  
 -      inode = f2fs_new_inode(mnt_userns, dir, mode, NULL);
 +      inode = f2fs_new_inode(idmap, dir, mode, NULL);
        if (IS_ERR(inode))
                return PTR_ERR(inode);
  
@@@ -907,7 -907,7 +907,7 @@@ out
        return err;
  }
  
 -static int f2fs_tmpfile(struct user_namespace *mnt_userns, struct inode *dir,
 +static int f2fs_tmpfile(struct mnt_idmap *idmap, struct inode *dir,
                        struct file *file, umode_t mode)
  {
        struct f2fs_sb_info *sbi = F2FS_I_SB(dir);
        if (!f2fs_is_checkpoint_ready(sbi))
                return -ENOSPC;
  
 -      err = __f2fs_tmpfile(mnt_userns, dir, file, mode, false, NULL);
 +      err = __f2fs_tmpfile(idmap, dir, file, mode, false, NULL);
  
        return finish_open_simple(file, err);
  }
  
 -static int f2fs_create_whiteout(struct user_namespace *mnt_userns,
 +static int f2fs_create_whiteout(struct mnt_idmap *idmap,
                                struct inode *dir, struct inode **whiteout)
  {
-       if (unlikely(f2fs_cp_error(F2FS_I_SB(dir))))
-               return -EIO;
 -      return __f2fs_tmpfile(mnt_userns, dir, NULL,
 +      return __f2fs_tmpfile(idmap, dir, NULL,
                                S_IFCHR | WHITEOUT_MODE, true, whiteout);
  }
  
 -int f2fs_get_tmpfile(struct user_namespace *mnt_userns, struct inode *dir,
 +int f2fs_get_tmpfile(struct mnt_idmap *idmap, struct inode *dir,
                     struct inode **new_inode)
  {
 -      return __f2fs_tmpfile(mnt_userns, dir, NULL, S_IFREG, false, new_inode);
 +      return __f2fs_tmpfile(idmap, dir, NULL, S_IFREG, false, new_inode);
  }
  
 -static int f2fs_rename(struct user_namespace *mnt_userns, struct inode *old_dir,
 +static int f2fs_rename(struct mnt_idmap *idmap, struct inode *old_dir,
                        struct dentry *old_dentry, struct inode *new_dir,
                        struct dentry *new_dentry, unsigned int flags)
  {
  
        /*
         * If new_inode is null, the below renaming flow will
-        * add a link in old_dir which can conver inline_dir.
+        * add a link in old_dir which can convert inline_dir.
         * After then, if we failed to get the entry due to other
         * reasons like ENOMEM, we had to remove the new entry.
         * Instead of adding such the error handling routine, let's
        }
  
        if (flags & RENAME_WHITEOUT) {
 -              err = f2fs_create_whiteout(mnt_userns, old_dir, &whiteout);
 +              err = f2fs_create_whiteout(idmap, old_dir, &whiteout);
                if (err)
                        return err;
        }
@@@ -1295,7 -1292,7 +1292,7 @@@ out
        return err;
  }
  
 -static int f2fs_rename2(struct user_namespace *mnt_userns,
 +static int f2fs_rename2(struct mnt_idmap *idmap,
                        struct inode *old_dir, struct dentry *old_dentry,
                        struct inode *new_dir, struct dentry *new_dentry,
                        unsigned int flags)
         * VFS has already handled the new dentry existence case,
         * here, we just deal with "RENAME_NOREPLACE" as regular rename.
         */
 -      return f2fs_rename(mnt_userns, old_dir, old_dentry,
 +      return f2fs_rename(idmap, old_dir, old_dentry,
                                        new_dir, new_dentry, flags);
  }
  
@@@ -1342,12 -1339,12 +1339,12 @@@ static const char *f2fs_encrypted_get_l
        return target;
  }
  
 -static int f2fs_encrypted_symlink_getattr(struct user_namespace *mnt_userns,
 +static int f2fs_encrypted_symlink_getattr(struct mnt_idmap *idmap,
                                          const struct path *path,
                                          struct kstat *stat, u32 request_mask,
                                          unsigned int query_flags)
  {
 -      f2fs_getattr(mnt_userns, path, stat, request_mask, query_flags);
 +      f2fs_getattr(idmap, path, stat, request_mask, query_flags);
  
        return fscrypt_symlink_getattr(path, stat);
  }
diff --combined fs/f2fs/node.c
index cf997356d9f9294379ba9daf0d660ebd5e144c2a,19a1fee88a363aaba57065dc6fb86f5934492fea..bd1dad5237967686a3d5359423c5e43157b3abe7
@@@ -1518,24 -1518,23 +1518,24 @@@ iput_out
  static struct page *last_fsync_dnode(struct f2fs_sb_info *sbi, nid_t ino)
  {
        pgoff_t index;
 -      struct pagevec pvec;
 +      struct folio_batch fbatch;
        struct page *last_page = NULL;
 -      int nr_pages;
 +      int nr_folios;
  
 -      pagevec_init(&pvec);
 +      folio_batch_init(&fbatch);
        index = 0;
  
 -      while ((nr_pages = pagevec_lookup_tag(&pvec, NODE_MAPPING(sbi), &index,
 -                              PAGECACHE_TAG_DIRTY))) {
 +      while ((nr_folios = filemap_get_folios_tag(NODE_MAPPING(sbi), &index,
 +                                      (pgoff_t)-1, PAGECACHE_TAG_DIRTY,
 +                                      &fbatch))) {
                int i;
  
 -              for (i = 0; i < nr_pages; i++) {
 -                      struct page *page = pvec.pages[i];
 +              for (i = 0; i < nr_folios; i++) {
 +                      struct page *page = &fbatch.folios[i]->page;
  
                        if (unlikely(f2fs_cp_error(sbi))) {
                                f2fs_put_page(last_page, 0);
 -                              pagevec_release(&pvec);
 +                              folio_batch_release(&fbatch);
                                return ERR_PTR(-EIO);
                        }
  
@@@ -1566,7 -1565,7 +1566,7 @@@ continue_unlock
                        last_page = page;
                        unlock_page(page);
                }
 -              pagevec_release(&pvec);
 +              folio_batch_release(&fbatch);
                cond_resched();
        }
        return last_page;
@@@ -1587,7 -1586,7 +1587,7 @@@ static int __write_node_page(struct pag
                .op_flags = wbc_to_write_flags(wbc),
                .page = page,
                .encrypted_page = NULL,
-               .submitted = false,
+               .submitted = 0,
                .io_type = io_type,
                .io_wbc = wbc,
        };
        }
  
        set_page_writeback(page);
-       ClearPageError(page);
  
        fio.old_blkaddr = ni.blk_addr;
        f2fs_do_write_node_page(nid, &fio);
@@@ -1732,12 -1730,12 +1731,12 @@@ int f2fs_fsync_node_pages(struct f2fs_s
                        unsigned int *seq_id)
  {
        pgoff_t index;
 -      struct pagevec pvec;
 +      struct folio_batch fbatch;
        int ret = 0;
        struct page *last_page = NULL;
        bool marked = false;
        nid_t ino = inode->i_ino;
 -      int nr_pages;
 +      int nr_folios;
        int nwritten = 0;
  
        if (atomic) {
                        return PTR_ERR_OR_ZERO(last_page);
        }
  retry:
 -      pagevec_init(&pvec);
 +      folio_batch_init(&fbatch);
        index = 0;
  
 -      while ((nr_pages = pagevec_lookup_tag(&pvec, NODE_MAPPING(sbi), &index,
 -                              PAGECACHE_TAG_DIRTY))) {
 +      while ((nr_folios = filemap_get_folios_tag(NODE_MAPPING(sbi), &index,
 +                                      (pgoff_t)-1, PAGECACHE_TAG_DIRTY,
 +                                      &fbatch))) {
                int i;
  
 -              for (i = 0; i < nr_pages; i++) {
 -                      struct page *page = pvec.pages[i];
 +              for (i = 0; i < nr_folios; i++) {
 +                      struct page *page = &fbatch.folios[i]->page;
                        bool submitted = false;
  
                        if (unlikely(f2fs_cp_error(sbi))) {
                                f2fs_put_page(last_page, 0);
 -                              pagevec_release(&pvec);
 +                              folio_batch_release(&fbatch);
                                ret = -EIO;
                                goto out;
                        }
@@@ -1826,7 -1823,7 +1825,7 @@@ continue_unlock
                                break;
                        }
                }
 -              pagevec_release(&pvec);
 +              folio_batch_release(&fbatch);
                cond_resched();
  
                if (ret || marked)
@@@ -1891,18 -1888,17 +1890,18 @@@ static bool flush_dirty_inode(struct pa
  void f2fs_flush_inline_data(struct f2fs_sb_info *sbi)
  {
        pgoff_t index = 0;
 -      struct pagevec pvec;
 -      int nr_pages;
 +      struct folio_batch fbatch;
 +      int nr_folios;
  
 -      pagevec_init(&pvec);
 +      folio_batch_init(&fbatch);
  
 -      while ((nr_pages = pagevec_lookup_tag(&pvec,
 -                      NODE_MAPPING(sbi), &index, PAGECACHE_TAG_DIRTY))) {
 +      while ((nr_folios = filemap_get_folios_tag(NODE_MAPPING(sbi), &index,
 +                                      (pgoff_t)-1, PAGECACHE_TAG_DIRTY,
 +                                      &fbatch))) {
                int i;
  
 -              for (i = 0; i < nr_pages; i++) {
 -                      struct page *page = pvec.pages[i];
 +              for (i = 0; i < nr_folios; i++) {
 +                      struct page *page = &fbatch.folios[i]->page;
  
                        if (!IS_DNODE(page))
                                continue;
@@@ -1929,7 -1925,7 +1928,7 @@@ continue_unlock
                        }
                        unlock_page(page);
                }
 -              pagevec_release(&pvec);
 +              folio_batch_release(&fbatch);
                cond_resched();
        }
  }
@@@ -1939,24 -1935,23 +1938,24 @@@ int f2fs_sync_node_pages(struct f2fs_sb
                                bool do_balance, enum iostat_type io_type)
  {
        pgoff_t index;
 -      struct pagevec pvec;
 +      struct folio_batch fbatch;
        int step = 0;
        int nwritten = 0;
        int ret = 0;
 -      int nr_pages, done = 0;
 +      int nr_folios, done = 0;
  
 -      pagevec_init(&pvec);
 +      folio_batch_init(&fbatch);
  
  next_step:
        index = 0;
  
 -      while (!done && (nr_pages = pagevec_lookup_tag(&pvec,
 -                      NODE_MAPPING(sbi), &index, PAGECACHE_TAG_DIRTY))) {
 +      while (!done && (nr_folios = filemap_get_folios_tag(NODE_MAPPING(sbi),
 +                              &index, (pgoff_t)-1, PAGECACHE_TAG_DIRTY,
 +                              &fbatch))) {
                int i;
  
 -              for (i = 0; i < nr_pages; i++) {
 -                      struct page *page = pvec.pages[i];
 +              for (i = 0; i < nr_folios; i++) {
 +                      struct page *page = &fbatch.folios[i]->page;
                        bool submitted = false;
  
                        /* give a priority to WB_SYNC threads */
@@@ -2031,7 -2026,7 +2030,7 @@@ write_node
                        if (--wbc->nr_to_write == 0)
                                break;
                }
 -              pagevec_release(&pvec);
 +              folio_batch_release(&fbatch);
                cond_resched();
  
                if (wbc->nr_to_write == 0) {
@@@ -2083,8 -2078,6 +2082,6 @@@ int f2fs_wait_on_node_pages_writeback(s
                spin_unlock_irqrestore(&sbi->fsync_node_lock, flags);
  
                f2fs_wait_on_page_writeback(page, NODE, true, false);
-               if (TestClearPageError(page))
-                       ret = -EIO;
  
                put_page(page);
  
@@@ -2548,10 -2541,8 +2545,8 @@@ bool f2fs_alloc_nid(struct f2fs_sb_inf
        struct f2fs_nm_info *nm_i = NM_I(sbi);
        struct free_nid *i = NULL;
  retry:
-       if (time_to_inject(sbi, FAULT_ALLOC_NID)) {
-               f2fs_show_injection_info(sbi, FAULT_ALLOC_NID);
+       if (time_to_inject(sbi, FAULT_ALLOC_NID))
                return false;
-       }
  
        spin_lock(&nm_i->nid_list_lock);
  
diff --combined fs/f2fs/super.c
index 64d3556d61a55440027990068fd72f0baa0791c7,aa55dc12aff2e9e3786c1838612bef5ff10585c3..fbaaabbcd6de7aec74e20eb5940c762b76c918d6
@@@ -540,6 -540,12 +540,6 @@@ static int f2fs_set_test_dummy_encrypti
                                  opt, err);
                return -EINVAL;
        }
 -      err = fscrypt_add_test_dummy_key(sb, policy);
 -      if (err) {
 -              f2fs_warn(sbi, "Error adding test dummy encryption key [%d]",
 -                        err);
 -              return err;
 -      }
        f2fs_warn(sbi, "Test dummy encryption mode enabled");
        return 0;
  }
@@@ -1288,19 -1294,18 +1288,18 @@@ default_check
         * zone alignment optimization. This is optional for host-aware
         * devices, but mandatory for host-managed zoned block devices.
         */
- #ifndef CONFIG_BLK_DEV_ZONED
-       if (f2fs_sb_has_blkzoned(sbi)) {
-               f2fs_err(sbi, "Zoned block device support is not enabled");
-               return -EINVAL;
-       }
- #endif
        if (f2fs_sb_has_blkzoned(sbi)) {
+ #ifdef CONFIG_BLK_DEV_ZONED
                if (F2FS_OPTION(sbi).discard_unit !=
                                                DISCARD_UNIT_SECTION) {
                        f2fs_info(sbi, "Zoned block device doesn't need small discard, set discard_unit=section by default");
                        F2FS_OPTION(sbi).discard_unit =
                                        DISCARD_UNIT_SECTION;
                }
+ #else
+               f2fs_err(sbi, "Zoned block device support is not enabled");
+               return -EINVAL;
+ #endif
        }
  
  #ifdef CONFIG_F2FS_FS_COMPRESSION
        }
  
        if (test_opt(sbi, DISABLE_CHECKPOINT) && f2fs_lfs_mode(sbi)) {
-               f2fs_err(sbi, "LFS not compatible with checkpoint=disable");
+               f2fs_err(sbi, "LFS is not compatible with checkpoint=disable");
                return -EINVAL;
        }
  
        if (test_opt(sbi, ATGC) && f2fs_lfs_mode(sbi)) {
-               f2fs_err(sbi, "LFS not compatible with ATGC");
+               f2fs_err(sbi, "LFS is not compatible with ATGC");
                return -EINVAL;
        }
  
@@@ -1366,10 -1371,8 +1365,8 @@@ static struct inode *f2fs_alloc_inode(s
  {
        struct f2fs_inode_info *fi;
  
-       if (time_to_inject(F2FS_SB(sb), FAULT_SLAB_ALLOC)) {
-               f2fs_show_injection_info(F2FS_SB(sb), FAULT_SLAB_ALLOC);
+       if (time_to_inject(F2FS_SB(sb), FAULT_SLAB_ALLOC))
                return NULL;
-       }
  
        fi = alloc_inode_sb(sb, f2fs_inode_cachep, GFP_F2FS_ZERO);
        if (!fi)
@@@ -1424,8 -1427,6 +1421,6 @@@ static int f2fs_drop_inode(struct inod
                        atomic_inc(&inode->i_count);
                        spin_unlock(&inode->i_lock);
  
-                       f2fs_abort_atomic_write(inode, true);
                        /* should remain fi->extent_tree for writepage */
                        f2fs_destroy_extent_node(inode);
  
@@@ -1543,7 -1544,7 +1538,7 @@@ static void f2fs_put_super(struct super
  {
        struct f2fs_sb_info *sbi = F2FS_SB(sb);
        int i;
-       bool dropped;
+       bool done;
  
        /* unregister procfs/sysfs entries in advance to avoid race case */
        f2fs_unregister_sysfs(sbi);
        }
  
        /* be sure to wait for any on-going discard commands */
-       dropped = f2fs_issue_discard_timeout(sbi);
-       if (f2fs_realtime_discard_enable(sbi) && !sbi->discard_blks && !dropped) {
+       done = f2fs_issue_discard_timeout(sbi);
+       if (f2fs_realtime_discard_enable(sbi) && !sbi->discard_blks && done) {
                struct cp_control cpc = {
                        .reason = CP_UMOUNT | CP_TRIMMED,
                };
@@@ -1900,15 -1900,24 +1894,24 @@@ static int f2fs_show_options(struct seq
  
        if (test_opt(sbi, GC_MERGE))
                seq_puts(seq, ",gc_merge");
+       else
+               seq_puts(seq, ",nogc_merge");
  
        if (test_opt(sbi, DISABLE_ROLL_FORWARD))
                seq_puts(seq, ",disable_roll_forward");
        if (test_opt(sbi, NORECOVERY))
                seq_puts(seq, ",norecovery");
-       if (test_opt(sbi, DISCARD))
+       if (test_opt(sbi, DISCARD)) {
                seq_puts(seq, ",discard");
-       else
+               if (F2FS_OPTION(sbi).discard_unit == DISCARD_UNIT_BLOCK)
+                       seq_printf(seq, ",discard_unit=%s", "block");
+               else if (F2FS_OPTION(sbi).discard_unit == DISCARD_UNIT_SEGMENT)
+                       seq_printf(seq, ",discard_unit=%s", "segment");
+               else if (F2FS_OPTION(sbi).discard_unit == DISCARD_UNIT_SECTION)
+                       seq_printf(seq, ",discard_unit=%s", "section");
+       } else {
                seq_puts(seq, ",nodiscard");
+       }
        if (test_opt(sbi, NOHEAP))
                seq_puts(seq, ",no_heap");
        else
        if (test_opt(sbi, ATGC))
                seq_puts(seq, ",atgc");
  
-       if (F2FS_OPTION(sbi).discard_unit == DISCARD_UNIT_BLOCK)
-               seq_printf(seq, ",discard_unit=%s", "block");
-       else if (F2FS_OPTION(sbi).discard_unit == DISCARD_UNIT_SEGMENT)
-               seq_printf(seq, ",discard_unit=%s", "segment");
-       else if (F2FS_OPTION(sbi).discard_unit == DISCARD_UNIT_SECTION)
-               seq_printf(seq, ",discard_unit=%s", "section");
        if (F2FS_OPTION(sbi).memory_mode == MEMORY_MODE_NORMAL)
                seq_printf(seq, ",memory=%s", "normal");
        else if (F2FS_OPTION(sbi).memory_mode == MEMORY_MODE_LOW)
@@@ -2300,6 -2302,12 +2296,12 @@@ static int f2fs_remount(struct super_bl
                }
        }
  #endif
+       if (f2fs_lfs_mode(sbi) && !IS_F2FS_IPU_DISABLE(sbi)) {
+               err = -EINVAL;
+               f2fs_warn(sbi, "LFS is not compatible with IPU");
+               goto restore_opts;
+       }
        /* disallow enable atgc dynamically */
        if (no_atgc == !!test_opt(sbi, ATGC)) {
                err = -EINVAL;
@@@ -2589,10 -2597,8 +2591,8 @@@ retry
  
  int f2fs_dquot_initialize(struct inode *inode)
  {
-       if (time_to_inject(F2FS_I_SB(inode), FAULT_DQUOT_INIT)) {
-               f2fs_show_injection_info(F2FS_I_SB(inode), FAULT_DQUOT_INIT);
+       if (time_to_inject(F2FS_I_SB(inode), FAULT_DQUOT_INIT))
                return -ESRCH;
-       }
  
        return dquot_initialize(inode);
  }
@@@ -4083,8 -4089,9 +4083,9 @@@ static void f2fs_tuning_parameters(stru
                if (f2fs_block_unit_discard(sbi))
                        SM_I(sbi)->dcc_info->discard_granularity =
                                                MIN_DISCARD_GRANULARITY;
-               SM_I(sbi)->ipu_policy = 1 << F2FS_IPU_FORCE |
-                                       1 << F2FS_IPU_HONOR_OPU_WRITE;
+               if (!f2fs_lfs_mode(sbi))
+                       SM_I(sbi)->ipu_policy = BIT(F2FS_IPU_FORCE) |
+                                               BIT(F2FS_IPU_HONOR_OPU_WRITE);
        }
  
        sbi->readdir_ra = true;
diff --combined fs/f2fs/verity.c
index f320ed8172ecd49d10125427c93a3ddf738c3227,3f4f3295f1c66738c793f7ceb0295b561f06aa91..4fc95f353a7a96c6cc67c6ea5dfabea0cc591e9c
@@@ -81,7 -81,7 +81,7 @@@ static int pagecache_write(struct inod
                size_t n = min_t(size_t, count,
                                 PAGE_SIZE - offset_in_page(pos));
                struct page *page;
-               void *fsdata;
+               void *fsdata = NULL;
                int res;
  
                res = aops->write_begin(NULL, mapping, pos, n, &page, &fsdata);
@@@ -276,11 -276,11 +276,11 @@@ static struct page *f2fs_read_merkle_tr
  }
  
  static int f2fs_write_merkle_tree_block(struct inode *inode, const void *buf,
 -                                      u64 index, int log_blocksize)
 +                                      u64 pos, unsigned int size)
  {
 -      loff_t pos = f2fs_verity_metadata_pos(inode) + (index << log_blocksize);
 +      pos += f2fs_verity_metadata_pos(inode);
  
 -      return pagecache_write(inode, buf, 1 << log_blocksize, pos);
 +      return pagecache_write(inode, buf, size, pos);
  }
  
  const struct fsverity_operations f2fs_verityops = {