]> Git Repo - linux.git/commitdiff
Merge tag 'f2fs-for-6.2-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/jaegeuk...
authorLinus Torvalds <[email protected]>
Wed, 14 Dec 2022 23:27:57 +0000 (15:27 -0800)
committerLinus Torvalds <[email protected]>
Wed, 14 Dec 2022 23:27:57 +0000 (15:27 -0800)
Pull f2fs updates from Jaegeuk Kim:
 "In this round, we've added two features: F2FS_IOC_START_ATOMIC_REPLACE
  and a per-block age-based extent cache.

  F2FS_IOC_START_ATOMIC_REPLACE is a variant of the previous atomic
  write feature which guarantees a per-file atomicity. It would be more
  efficient than AtomicFile implementation in Android framework.

  The per-block age-based extent cache implements another type of extent
  cache in memory which keeps the per-block age in a file, so that block
  allocator could split the hot and cold data blocks more accurately.

  Enhancements:
   - introduce F2FS_IOC_START_ATOMIC_REPLACE
   - refactor extent_cache to add a new per-block-age-based extent cache support
   - introduce discard_urgent_util, gc_mode, max_ordered_discard sysfs knobs
   - add proc entry to show discard_plist info
   - optimize iteration over sparse directories
   - add barrier mount option

  Bug fixes:
   - avoid victim selection from previous victim section
   - fix to enable compress for newly created file if extension matches
   - set zstd compress level correctly
   - initialize locks early in f2fs_fill_super() to fix bugs reported by syzbot
   - correct i_size change for atomic writes
   - allow to read node block after shutdown
   - allow to set compression for inlined file
   - fix gc mode when gc_urgent_high_remaining is 1
   - should put a page when checking the summary info

  Minor fixes and various clean-ups in GC, discard, debugfs, sysfs, and
  doc"

* tag 'f2fs-for-6.2-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/jaegeuk/f2fs: (63 commits)
  f2fs: reset wait_ms to default if any of the victims have been selected
  f2fs: fix some format WARNING in debug.c and sysfs.c
  f2fs: don't call f2fs_issue_discard_timeout() when discard_cmd_cnt is 0 in f2fs_put_super()
  f2fs: fix iostat parameter for discard
  f2fs: Fix spelling mistake in label: free_bio_enrty_cache -> free_bio_entry_cache
  f2fs: add block_age-based extent cache
  f2fs: allocate the extent_cache by default
  f2fs: refactor extent_cache to support for read and more
  f2fs: remove unnecessary __init_extent_tree
  f2fs: move internal functions into extent_cache.c
  f2fs: specify extent cache for read explicitly
  f2fs: introduce f2fs_is_readonly() for readability
  f2fs: remove F2FS_SET_FEATURE() and F2FS_CLEAR_FEATURE() macro
  f2fs: do some cleanup for f2fs module init
  MAINTAINERS: Add f2fs bug tracker link
  f2fs: remove the unused flush argument to change_curseg
  f2fs: open code allocate_segment_by_default
  f2fs: remove struct segment_allocation default_salloc_ops
  f2fs: introduce discard_urgent_util sysfs node
  f2fs: define MIN_DISCARD_GRANULARITY macro
  ...

1  2 
MAINTAINERS
fs/f2fs/compress.c
fs/f2fs/data.c
fs/f2fs/file.c
fs/f2fs/gc.c
fs/f2fs/namei.c
fs/f2fs/segment.c

diff --combined MAINTAINERS
index 9416b68fdadeaa0b892f5d0d9e30e2570d3de848,01fdbb592ea709e916c1c03bf32d561506167149..a608f19da3a9b33eb9a558bc6f5632aa3a340d7f
@@@ -775,24 -775,6 +775,24 @@@ T:       git git://linuxtv.org/media_tree.gi
  F:    Documentation/devicetree/bindings/media/allwinner,sun4i-a10-csi.yaml
  F:    drivers/media/platform/sunxi/sun4i-csi/
  
 +ALLWINNER A31 CSI DRIVER
 +M:    Yong Deng <[email protected]>
 +M:    Paul Kocialkowski <[email protected]>
 +L:    [email protected]
 +S:    Maintained
 +T:    git git://linuxtv.org/media_tree.git
 +F:    Documentation/devicetree/bindings/media/allwinner,sun6i-a31-csi.yaml
 +F:    drivers/media/platform/sunxi/sun6i-csi/
 +
 +ALLWINNER A31 ISP DRIVER
 +M:    Paul Kocialkowski <[email protected]>
 +L:    [email protected]
 +S:    Maintained
 +T:    git git://linuxtv.org/media_tree.git
 +F:    Documentation/devicetree/bindings/media/allwinner,sun6i-a31-isp.yaml
 +F:    drivers/staging/media/sunxi/sun6i-isp/
 +F:    drivers/staging/media/sunxi/sun6i-isp/uapi/sun6i-isp-config.h
 +
  ALLWINNER A31 MIPI CSI-2 BRIDGE DRIVER
  M:    Paul Kocialkowski <[email protected]>
  L:    [email protected]
@@@ -1111,16 -1093,6 +1111,16 @@@ S:    Maintaine
  F:    Documentation/hid/amd-sfh*
  F:    drivers/hid/amd-sfh-hid/
  
 +AMLOGIC DDR PMU DRIVER
 +M:    Jiucheng Xu <[email protected]>
 +L:    [email protected]
 +S:    Supported
 +W:    http://www.amlogic.com
 +F:    Documentation/admin-guide/perf/meson-ddr-pmu.rst
 +F:    Documentation/devicetree/bindings/perf/amlogic,g12-ddr-pmu.yaml
 +F:    drivers/perf/amlogic/
 +F:    include/soc/amlogic/
 +
  AMPHION VPU CODEC V4L2 DRIVER
  M:    Ming Qian <[email protected]>
  M:    Shijie Qin <[email protected]>
@@@ -1713,7 -1685,7 +1713,7 @@@ M:      Miquel Raynal <miquel.raynal@bootlin
  M:    Naga Sureshkumar Relli <[email protected]>
  L:    [email protected] (moderated for non-subscribers)
  S:    Maintained
 -F:    Documentation/devicetree/bindings/memory-controllers/arm,pl353-smc.yaml
 +F:    Documentation/devicetree/bindings/memory-controllers/arm,pl35x-smc.yaml
  F:    drivers/memory/pl353-smc.c
  
  ARM PRIMECELL CLCD PL110 DRIVER
@@@ -1925,14 -1897,12 +1925,14 @@@ T:   git https://github.com/AsahiLinux/li
  F:    Documentation/devicetree/bindings/arm/apple.yaml
  F:    Documentation/devicetree/bindings/arm/apple/*
  F:    Documentation/devicetree/bindings/clock/apple,nco.yaml
 +F:    Documentation/devicetree/bindings/cpufreq/apple,cluster-cpufreq.yaml
  F:    Documentation/devicetree/bindings/dma/apple,admac.yaml
  F:    Documentation/devicetree/bindings/i2c/apple,i2c.yaml
  F:    Documentation/devicetree/bindings/interrupt-controller/apple,*
  F:    Documentation/devicetree/bindings/iommu/apple,dart.yaml
  F:    Documentation/devicetree/bindings/iommu/apple,sart.yaml
  F:    Documentation/devicetree/bindings/mailbox/apple,mailbox.yaml
 +F:    Documentation/devicetree/bindings/net/bluetooth/brcm,bcm4377-bluetooth.yaml
  F:    Documentation/devicetree/bindings/nvme/apple,nvme-ans.yaml
  F:    Documentation/devicetree/bindings/nvmem/apple,efuses.yaml
  F:    Documentation/devicetree/bindings/pci/apple,pcie.yaml
@@@ -1940,9 -1910,7 +1940,9 @@@ F:      Documentation/devicetree/bindings/pi
  F:    Documentation/devicetree/bindings/power/apple*
  F:    Documentation/devicetree/bindings/watchdog/apple,wdt.yaml
  F:    arch/arm64/boot/dts/apple/
 +F:    drivers/bluetooth/hci_bcm4377.c
  F:    drivers/clk/clk-apple-nco.c
 +F:    drivers/cpufreq/apple-soc-cpufreq.c
  F:    drivers/dma/apple-admac.c
  F:    drivers/i2c/busses/i2c-pasemi-core.c
  F:    drivers/i2c/busses/i2c-pasemi-platform.c
@@@ -2229,7 -2197,7 +2229,7 @@@ M:      Wei Xu <[email protected]
  L:    [email protected] (moderated for non-subscribers)
  S:    Supported
  W:    http://www.hisilicon.com
 -T:    git git://github.com/hisilicon/linux-hisi.git
 +T:    git https://github.com/hisilicon/linux-hisi.git
  F:    arch/arm/boot/dts/hi3*
  F:    arch/arm/boot/dts/hip*
  F:    arch/arm/boot/dts/hisi*
@@@ -2304,6 -2272,8 +2304,6 @@@ F:      drivers/clocksource/timer-ixp4xx.
  F:    drivers/crypto/ixp4xx_crypto.c
  F:    drivers/gpio/gpio-ixp4xx.c
  F:    drivers/irqchip/irq-ixp4xx.c
 -F:    include/linux/irqchip/irq-ixp4xx.h
 -F:    include/linux/platform_data/timer-ixp4xx.h
  
  ARM/INTEL KEEMBAY ARCHITECTURE
  M:    Paul J. Murphy <[email protected]>
@@@ -2371,8 -2341,6 +2371,8 @@@ M:      Gregory Clement <gregory.clement@boo
  L:    [email protected] (moderated for non-subscribers)
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/gclement/mvebu.git
 +F:    Documentation/devicetree/bindings/arm/marvell/marvell,dove.txt
 +F:    Documentation/devicetree/bindings/arm/marvell/marvell,orion5x.txt
  F:    Documentation/devicetree/bindings/soc/dove/
  F:    arch/arm/boot/dts/dove*
  F:    arch/arm/boot/dts/orion5x*
@@@ -2389,7 -2357,6 +2389,7 @@@ M:      Sebastian Hesselbarth <sebastian.hes
  L:    [email protected] (moderated for non-subscribers)
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/gclement/mvebu.git
 +F:    Documentation/devicetree/bindings/arm/marvell/
  F:    arch/arm/boot/dts/armada*
  F:    arch/arm/boot/dts/kirkwood*
  F:    arch/arm/configs/mvebu_*_defconfig
@@@ -2472,7 -2439,6 +2472,7 @@@ L:      [email protected]
  S:    Supported
  T:    git git://github.com/microchip-ung/linux-upstream.git
  F:    arch/arm64/boot/dts/microchip/
 +F:    drivers/net/ethernet/microchip/vcap/
  F:    drivers/pinctrl/pinctrl-microchip-sgpio.c
  N:    sparx5
  
@@@ -2654,7 -2620,7 +2654,7 @@@ W:      http://www.armlinux.org.uk
  ARM/QUALCOMM SUPPORT
  M:    Andy Gross <[email protected]>
  M:    Bjorn Andersson <[email protected]>
 -R:    Konrad Dybcio <konrad.dybcio@somainline.org>
 +R:    Konrad Dybcio <konrad.dybcio@linaro.org>
  L:    [email protected]
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/qcom/linux.git
@@@ -2725,7 -2691,7 +2725,7 @@@ F:      arch/arm/boot/dts/rtd
  F:    arch/arm/mach-realtek/
  F:    arch/arm64/boot/dts/realtek/
  
 -ARM/RENESAS ARCHITECTURE
 +ARM/RISC-V/RENESAS ARCHITECTURE
  M:    Geert Uytterhoeven <[email protected]>
  M:    Magnus Damm <[email protected]>
  L:    [email protected]
@@@ -2733,6 -2699,7 +2733,6 @@@ S:      Supporte
  Q:    http://patchwork.kernel.org/project/linux-renesas-soc/list/
  C:    irc://irc.libera.chat/renesas-soc
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/geert/renesas-devel.git next
 -F:    Documentation/devicetree/bindings/arm/renesas.yaml
  F:    Documentation/devicetree/bindings/hwinfo/renesas,prr.yaml
  F:    Documentation/devicetree/bindings/soc/renesas/
  F:    arch/arm/boot/dts/emev2*
@@@ -2746,7 -2713,6 +2746,7 @@@ F:      arch/arm/configs/shmobile_defconfi
  F:    arch/arm/include/debug/renesas-scif.S
  F:    arch/arm/mach-shmobile/
  F:    arch/arm64/boot/dts/renesas/
 +F:    arch/riscv/boot/dts/renesas/
  F:    drivers/soc/renesas/
  F:    include/linux/soc/renesas/
  
@@@ -4018,7 -3984,7 +4018,7 @@@ M:      Rafał Miłecki <[email protected]
  R:    Broadcom internal kernel review list <[email protected]>
  L:    [email protected] (moderated for non-subscribers)
  S:    Maintained
 -T:    git git://github.com/broadcom/stblinux.git
 +T:    git https://github.com/broadcom/stblinux.git
  F:    Documentation/devicetree/bindings/arm/bcm/brcm,bcmbca.yaml
  F:    arch/arm64/boot/dts/broadcom/bcmbca/*
  N:    bcmbca
@@@ -4043,7 -4009,7 +4043,7 @@@ R:      Broadcom internal kernel review lis
  L:    [email protected] (moderated for non-subscribers)
  L:    [email protected] (moderated for non-subscribers)
  S:    Maintained
 -T:    git git://github.com/broadcom/stblinux.git
 +T:    git https://github.com/broadcom/stblinux.git
  F:    Documentation/devicetree/bindings/pci/brcm,stb-pcie.yaml
  F:    drivers/pci/controller/pcie-brcmstb.c
  F:    drivers/staging/vc04_services
@@@ -4057,7 -4023,7 +4057,7 @@@ M:      Ray Jui <[email protected]
  M:    Scott Branden <[email protected]>
  R:    Broadcom internal kernel review list <[email protected]>
  S:    Maintained
 -T:    git git://github.com/broadcom/mach-bcm
 +T:    git https://github.com/broadcom/mach-bcm
  F:    arch/arm/mach-bcm/
  N:    bcm281*
  N:    bcm113*
@@@ -4122,7 -4088,7 +4122,7 @@@ M:      Florian Fainelli <[email protected]
  R:    Broadcom internal kernel review list <[email protected]>
  L:    [email protected] (moderated for non-subscribers)
  S:    Maintained
 -T:    git git://github.com/broadcom/stblinux.git
 +T:    git https://github.com/broadcom/stblinux.git
  F:    Documentation/devicetree/bindings/pci/brcm,stb-pcie.yaml
  F:    arch/arm/boot/dts/bcm7*.dts*
  F:    arch/arm/include/asm/hardware/cache-b15-rac.h
@@@ -4135,7 -4101,6 +4135,7 @@@ N:      bcm703
  N:    bcm7120
  
  BROADCOM BDC DRIVER
 +M:    Justin Chen <[email protected]>
  M:    Al Cooper <[email protected]>
  L:    [email protected]
  R:    Broadcom internal kernel review list <[email protected]>
@@@ -4155,7 -4120,7 +4155,7 @@@ M:      Florian Fainelli <[email protected]
  R:    Broadcom internal kernel review list <[email protected]>
  L:    [email protected]
  S:    Maintained
 -T:    git git://github.com/broadcom/stblinux.git
 +T:    git https://github.com/broadcom/stblinux.git
  F:    arch/mips/bmips/*
  F:    arch/mips/boot/dts/brcm/bcm*.dts*
  F:    arch/mips/include/asm/mach-bmips/*
@@@ -4242,7 -4207,6 +4242,7 @@@ F:      Documentation/devicetree/bindings/se
  F:    drivers/tty/serial/8250/8250_bcm7271.c
  
  BROADCOM BRCMSTB USB EHCI DRIVER
 +M:    Justin Chen <[email protected]>
  M:    Al Cooper <[email protected]>
  R:    Broadcom internal kernel review list <[email protected]>
  L:    [email protected]
@@@ -4259,7 -4223,6 +4259,7 @@@ F:      Documentation/devicetree/bindings/us
  F:    drivers/usb/misc/brcmstb-usb-pinmap.c
  
  BROADCOM BRCMSTB USB2 and USB3 PHY DRIVER
 +M:    Justin Chen <[email protected]>
  M:    Al Cooper <[email protected]>
  R:    Broadcom internal kernel review list <[email protected]>
  L:    [email protected]
@@@ -4296,7 -4259,7 +4296,7 @@@ M:      Scott Branden <[email protected]
  R:    Broadcom internal kernel review list <[email protected]>
  L:    [email protected] (moderated for non-subscribers)
  S:    Maintained
 -T:    git git://github.com/broadcom/stblinux.git
 +T:    git https://github.com/broadcom/stblinux.git
  F:    arch/arm64/boot/dts/broadcom/northstar2/*
  F:    arch/arm64/boot/dts/broadcom/stingray/*
  F:    drivers/clk/bcm/clk-ns*
@@@ -4366,7 -4329,7 +4366,7 @@@ M:      Florian Fainelli <[email protected]
  R:    Broadcom internal kernel review list <[email protected]>
  L:    [email protected]
  S:    Maintained
 -T:    git git://github.com/broadcom/stblinux.git
 +T:    git https://github.com/broadcom/stblinux.git
  F:    drivers/soc/bcm/bcm63xx/bcm-pmb.c
  F:    include/dt-bindings/soc/bcm-pmb.h
  
@@@ -4496,15 -4459,13 +4496,15 @@@ M:   Josef Bacik <[email protected]
  M:    David Sterba <[email protected]>
  L:    [email protected]
  S:    Maintained
 -W:    http://btrfs.wiki.kernel.org/
 -Q:    http://patchwork.kernel.org/project/linux-btrfs/list/
 +W:    https://btrfs.readthedocs.io
 +W:    https://btrfs.wiki.kernel.org/
 +Q:    https://patchwork.kernel.org/project/linux-btrfs/list/
  C:    irc://irc.libera.chat/btrfs
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux.git
  F:    Documentation/filesystems/btrfs.rst
  F:    fs/btrfs/
  F:    include/linux/btrfs*
 +F:    include/trace/events/btrfs.h
  F:    include/uapi/linux/btrfs*
  
  BTTV VIDEO4LINUX DRIVER
@@@ -4843,7 -4804,7 +4843,7 @@@ R:      Jeff Layton <[email protected]
  L:    [email protected]
  S:    Supported
  W:    http://ceph.com/
 -T:    git git://github.com/ceph/ceph-client.git
 +T:    git https://github.com/ceph/ceph-client.git
  F:    include/linux/ceph/
  F:    include/linux/crush/
  F:    net/ceph/
@@@ -4855,7 -4816,7 +4855,7 @@@ R:      Jeff Layton <[email protected]
  L:    [email protected]
  S:    Supported
  W:    http://ceph.com/
 -T:    git git://github.com/ceph/ceph-client.git
 +T:    git https://github.com/ceph/ceph-client.git
  F:    Documentation/filesystems/ceph.rst
  F:    fs/ceph/
  
@@@ -4945,7 -4906,7 +4945,7 @@@ F:      drivers/platform/chrome
  
  CHROMEOS EC CODEC DRIVER
  M:    Cheng-Yi Chiang <[email protected]>
 -M:    Tzung-Bi Shih <tzungbi@google.com>
 +M:    Tzung-Bi Shih <tzungbi@kernel.org>
  R:    Guenter Roeck <[email protected]>
  L:    [email protected]
  S:    Maintained
@@@ -4975,12 -4936,6 +4975,12 @@@ S:    Maintaine
  F:    drivers/platform/chrome/cros_usbpd_notify.c
  F:    include/linux/platform_data/cros_usbpd_notify.h
  
 +CHROMEOS HPS DRIVER
 +M:    Dan Callaghan <[email protected]>
 +R:    Sami Kyöstilä <[email protected]>
 +S:    Maintained
 +F:    drivers/platform/chrome/cros_hps_i2c.c
 +
  CHRONTEL CH7322 CEC DRIVER
  M:    Joe Tessler <[email protected]>
  L:    [email protected]
@@@ -5081,7 -5036,7 +5081,7 @@@ F:      drivers/scsi/snic
  
  CISCO VIC ETHERNET NIC DRIVER
  M:    Christian Benvenuti <[email protected]>
 -M:    Govindarajulu Varadarajan <_govind@gmx.com>
 +M:    Satish Kharat <satishkh@cisco.com>
  S:    Supported
  F:    drivers/net/ethernet/cisco/enic/
  
@@@ -5311,7 -5266,6 +5311,7 @@@ F:      tools/testing/selftests/cgroup
  
  CONTROL GROUP - BLOCK IO CONTROLLER (BLKIO)
  M:    Tejun Heo <[email protected]>
 +M:    Josef Bacik <[email protected]>
  M:    Jens Axboe <[email protected]>
  L:    [email protected]
  L:    [email protected]
@@@ -5319,7 -5273,6 +5319,7 @@@ T:      git git://git.kernel.dk/linux-bloc
  F:    Documentation/admin-guide/cgroup-v1/blkio-controller.rst
  F:    block/bfq-cgroup.c
  F:    block/blk-cgroup.c
 +F:    block/blk-iocost.c
  F:    block/blk-iolatency.c
  F:    block/blk-throttle.c
  F:    include/linux/blk-cgroup.h
@@@ -5339,7 -5292,7 +5339,7 @@@ M:      Johannes Weiner <[email protected]
  M:    Michal Hocko <[email protected]>
  M:    Roman Gushchin <[email protected]>
  M:    Shakeel Butt <[email protected]>
 -R:    Muchun Song <[email protected]>
 +R:    Muchun Song <[email protected]>
  L:    [email protected]
  L:    [email protected]
  S:    Maintained
@@@ -5542,6 -5495,14 +5542,6 @@@ M:     Jaya Kumar <[email protected]
  S:    Maintained
  F:    sound/pci/cs5535audio/
  
 -CSI DRIVERS FOR ALLWINNER V3s
 -M:    Yong Deng <[email protected]>
 -L:    [email protected]
 -S:    Maintained
 -T:    git git://linuxtv.org/media_tree.git
 -F:    Documentation/devicetree/bindings/media/allwinner,sun6i-a31-csi.yaml
 -F:    drivers/media/platform/sunxi/sun6i-csi/
 -
  CTU CAN FD DRIVER
  M:    Pavel Pisa <[email protected]>
  M:    Ondrej Ille <[email protected]>
@@@ -5617,6 -5578,8 +5617,6 @@@ F:      drivers/scsi/cxgbi/cxgb3
  
  CXGB4 CRYPTO DRIVER (chcr)
  M:    Ayush Sawal <[email protected]>
 -M:    Vinay Kumar Yadav <[email protected]>
 -M:    Rohit Maheshwari <[email protected]>
  L:    [email protected]
  S:    Supported
  W:    http://www.chelsio.com
@@@ -5624,6 -5587,8 +5624,6 @@@ F:      drivers/crypto/chelsi
  
  CXGB4 INLINE CRYPTO DRIVER
  M:    Ayush Sawal <[email protected]>
 -M:    Vinay Kumar Yadav <[email protected]>
 -M:    Rohit Maheshwari <[email protected]>
  L:    [email protected]
  S:    Supported
  W:    http://www.chelsio.com
  S:    Maintained
  F:    drivers/platform/x86/dell/dell-wmi-descriptor.c
  
 +DELL WMI DDV DRIVER
 +M:    Armin Wolf <[email protected]>
 +S:    Maintained
 +F:    Documentation/ABI/testing/debugfs-dell-wmi-ddv
 +F:    Documentation/ABI/testing/sysfs-platform-dell-wmi-ddv
 +F:    drivers/platform/x86/dell/dell-wmi-ddv.c
 +
  DELL WMI SYSMAN DRIVER
  M:    Divya Bharathi <[email protected]>
  M:    Prasanth Ksr <[email protected]>
@@@ -6068,12 -6026,11 +6068,12 @@@ F:   include/net/devlink.
  F:    include/uapi/linux/devlink.h
  F:    net/core/devlink.c
  
 -DH ELECTRONICS IMX6 DHCOM BOARD SUPPORT
 +DH ELECTRONICS IMX6 DHCOM/DHCOR BOARD SUPPORT
  M:    Christoph Niedermaier <[email protected]>
  L:    [email protected]
  S:    Maintained
  F:    arch/arm/boot/dts/imx6*-dhcom-*
 +F:    arch/arm/boot/dts/imx6*-dhcor-*
  
  DH ELECTRONICS STM32MP1 DHCOM/DHCOR BOARD SUPPORT
  M:    Marek Vasut <[email protected]>
@@@ -6323,7 -6280,7 +6323,7 @@@ M:      Sakari Ailus <[email protected]
  L:    [email protected]
  S:    Maintained
  T:    git git://linuxtv.org/media_tree.git
 -F:    Documentation/devicetree/bindings/media/i2c/dongwoon,dw9714.txt
 +F:    Documentation/devicetree/bindings/media/i2c/dongwoon,dw9714.yaml
  F:    drivers/media/i2c/dw9714.c
  
  DONGWOON DW9768 LENS VOICE COIL DRIVER
@@@ -6365,7 -6322,6 +6365,7 @@@ F:      drivers/net/ethernet/freescale/dpaa2
  F:    drivers/net/ethernet/freescale/dpaa2/Makefile
  F:    drivers/net/ethernet/freescale/dpaa2/dpaa2-eth*
  F:    drivers/net/ethernet/freescale/dpaa2/dpaa2-mac*
 +F:    drivers/net/ethernet/freescale/dpaa2/dpaa2-xsk*
  F:    drivers/net/ethernet/freescale/dpaa2/dpkg.h
  F:    drivers/net/ethernet/freescale/dpaa2/dpmac*
  F:    drivers/net/ethernet/freescale/dpaa2/dpni*
@@@ -6543,12 -6499,6 +6543,12 @@@ S:    Orphan / Obsolet
  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 <[email protected]>
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/display/panel/jadard,jd9365da-h3.yaml
 +F:    drivers/gpu/drm/panel/panel-jadard-jd9365da-h3.c
 +
  DRM DRIVER FOR LOGICVC DISPLAY CONTROLLER
  M:    Paul Kocialkowski <[email protected]>
  S:    Supported
  S:    Maintained
  T:    git git://anongit.freedesktop.org/drm/drm-misc
  F:    drivers/gpu/drm/drm_aperture.c
 +F:    drivers/gpu/drm/tiny/ofdrm.c
  F:    drivers/gpu/drm/tiny/simpledrm.c
  F:    drivers/video/aperture.c
 +F:    drivers/video/nomodeset.c
  F:    include/drm/drm_aperture.h
  F:    include/linux/aperture.h
 +F:    include/video/nomodeset.h
  
  DRM DRIVER FOR SIS VIDEO CARDS
  S:    Orphan / Obsolete
@@@ -6873,15 -6820,6 +6873,15 @@@ F:    include/drm/drm
  F:    include/linux/vga*
  F:    include/uapi/drm/drm*
  
 +DRM COMPUTE ACCELERATORS DRIVERS AND FRAMEWORK
 +M:    Oded Gabbay <[email protected]>
 +L:    [email protected]
 +S:    Maintained
 +C:    irc://irc.oftc.net/dri-devel
 +T:    git https://git.kernel.org/pub/scm/linux/kernel/git/ogabbay/accel.git
 +F:    Documentation/accel/
 +F:    drivers/accel/
 +
  DRM DRIVERS FOR ALLWINNER A10
  M:    Maxime Ripard <[email protected]>
  M:    Chen-Yu Tsai <[email protected]>
@@@ -7170,7 -7108,7 +7170,7 @@@ F:      drivers/gpu/drm/ttm
  F:    include/drm/ttm/
  
  DRM GPU SCHEDULER
 -M:    Andrey Grodzovsky <andrey.grodzovsky@amd.com>
 +M:    Luben Tuikov <luben.tuikov@amd.com>
  L:    [email protected]
  S:    Maintained
  T:    git git://anongit.freedesktop.org/drm/drm-misc
@@@ -7418,9 -7356,9 +7418,9 @@@ F:      drivers/edac/thunderx_edac
  
  EDAC-CORE
  M:    Borislav Petkov <[email protected]>
 -M:    Mauro Carvalho Chehab <[email protected]>
  M:    Tony Luck <[email protected]>
  R:    James Morse <[email protected]>
 +R:    Mauro Carvalho Chehab <[email protected]>
  R:    Robert Richter <[email protected]>
  L:    [email protected]
  S:    Supported
@@@ -7537,7 -7475,8 +7537,7 @@@ S:      Maintaine
  F:    drivers/edac/pnd2_edac.[ch]
  
  EDAC-QCOM
 -M:    Channagoud Kadabi <[email protected]>
 -M:    Venkata Narendra Kumar Gutta <[email protected]>
 +M:    Manivannan Sadhasivam <[email protected]>
  L:    [email protected]
  L:    [email protected]
  S:    Maintained
@@@ -7738,7 -7677,6 +7738,7 @@@ ETAS ES58X CAN/USB DRIVE
  M:    Vincent Mailhol <[email protected]>
  L:    [email protected]
  S:    Maintained
 +F:    Documentation/networking/devlink/etas_es58x.rst
  F:    drivers/net/can/usb/etas_es58x/
  
  ETHERNET BRIDGE
@@@ -7844,6 -7782,7 +7844,6 @@@ F:      Documentation/admin-guide/efi-stub.r
  F:    arch/*/include/asm/efi.h
  F:    arch/*/kernel/efi.c
  F:    arch/arm/boot/compressed/efi-header.S
 -F:    arch/arm64/kernel/efi-entry.S
  F:    arch/x86/platform/efi/
  F:    drivers/firmware/efi/
  F:    include/linux/efi*.h
@@@ -7889,6 -7828,7 +7889,7 @@@ M:      Chao Yu <[email protected]
  L:    [email protected]
  S:    Maintained
  W:    https://f2fs.wiki.kernel.org/
+ 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
  F:    Documentation/filesystems/f2fs.rst
@@@ -8105,8 -8045,6 +8106,8 @@@ S:      Supporte
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux.git for-next/hardening
  F:    include/linux/fortify-string.h
  F:    lib/fortify_kunit.c
 +F:    lib/memcpy_kunit.c
 +F:    lib/strscpy_kunit.c
  F:    lib/test_fortify/*
  F:    scripts/test_fortify.sh
  K:    \b__NO_FORTIFY\b
@@@ -8243,10 -8181,7 +8244,10 @@@ S:    Maintaine
  F:    drivers/i2c/busses/i2c-cpm.c
  
  FREESCALE IMX / MXC FEC DRIVER
 -M:    Joakim Zhang <[email protected]>
 +M:    Wei Fang <[email protected]>
 +R:    Shenwei Wang <[email protected]>
 +R:    Clark Wang <[email protected]>
 +R:    NXP Linux Team <[email protected]>
  L:    [email protected]
  S:    Maintained
  F:    Documentation/devicetree/bindings/net/fsl,fec.yaml
@@@ -8661,8 -8596,8 +8662,8 @@@ F:      include/asm-generic
  F:    include/uapi/asm-generic/
  
  GENERIC PHY FRAMEWORK
 -M:    Kishon Vijay Abraham I <[email protected]>
  M:    Vinod Koul <[email protected]>
 +M:    Kishon Vijay Abraham I <[email protected]>
  L:    [email protected]
  S:    Supported
  Q:    https://patchwork.kernel.org/project/linux-phy/list/
@@@ -8805,7 -8740,6 +8806,7 @@@ GPIO IR Transmitte
  M:    Sean Young <[email protected]>
  L:    [email protected]
  S:    Maintained
 +F:    Documentation/devicetree/bindings/leds/irled/gpio-ir-tx.yaml
  F:    drivers/media/rc/gpio-ir-tx.c
  
  GPIO MOCKUP DRIVER
@@@ -9229,13 -9163,6 +9230,13 @@@ W:    http://www.highpoint-tech.co
  F:    Documentation/scsi/hptiop.rst
  F:    drivers/scsi/hptiop.c
  
 +HIMAX HX83112B TOUCHSCREEN SUPPORT
 +M:    Job Noorman <[email protected]>
 +L:    [email protected]
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/input/touchscreen/himax,hx83112b.yaml
 +F:    drivers/input/touchscreen/himax_hx83112b.c
 +
  HIPPI
  M:    Jes Sorensen <[email protected]>
  L:    [email protected]
@@@ -9284,7 -9211,7 +9285,7 @@@ W:      https://www.hisilicon.co
  F:    drivers/i2c/busses/i2c-hisi.c
  
  HISILICON LPC BUS DRIVER
 -M:    [email protected]
 +M:    Jay Fang <[email protected]>
  S:    Maintained
  W:    http://www.hisilicon.com
  F:    Documentation/devicetree/bindings/arm/hisilicon/low-pin-count.yaml
@@@ -9315,7 -9242,7 +9316,7 @@@ F:      drivers/misc/hisi_hikey_usb.
  
  HISILICON PMU DRIVER
  M:    Shaokun Zhang <[email protected]>
 -M:    Qi Liu <liuqi115@huawei.com>
 +M:    Jonathan Cameron <jonathan.cameron@huawei.com>
  S:    Supported
  W:    http://www.hisilicon.com
  F:    Documentation/admin-guide/perf/hisi-pcie-pmu.rst
@@@ -9364,7 -9291,7 +9365,7 @@@ F:      Documentation/devicetree/bindings/in
  F:    drivers/infiniband/hw/hns/
  
  HISILICON SAS Controller
 -M:    John Garry <john.garry@huawei.com>
 +M:    Xiang Chen <chenxiang66@hisilicon.com>
  S:    Supported
  W:    http://www.hisilicon.com
  F:    Documentation/devicetree/bindings/scsi/hisilicon-sas.txt
@@@ -9408,7 -9335,7 +9409,7 @@@ S:      Maintaine
  F:    drivers/crypto/hisilicon/trng/trng.c
  
  HISILICON V3XX SPI NOR FLASH Controller Driver
 -M:    John Garry <john.garry@huawei.com>
 +M:    Jay Fang <f.fangjian@huawei.com>
  S:    Maintained
  W:    http://www.hisilicon.com
  F:    drivers/spi/spi-hisi-sfc-v3xx.c
@@@ -9433,7 -9360,7 +9434,7 @@@ F:      drivers/net/wireless/intersil/hostap
  HP COMPAQ TC1100 TABLET WMI EXTRAS DRIVER
  L:    [email protected]
  S:    Orphan
 -F:    drivers/platform/x86/tc1100-wmi.c
 +F:    drivers/platform/x86/hp/tc1100-wmi.c
  
  HPET: High Precision Event Timers driver
  M:    Clemens Ladisch <[email protected]>
@@@ -9503,15 -9430,14 +9504,15 @@@ F:   Documentation/devicetree/bindings/ii
  F:    drivers/iio/humidity/hts221*
  
  HUAWEI ETHERNET DRIVER
 +M:    Cai Huoqing <[email protected]>
  L:    [email protected]
 -S:    Orphan
 +S:    Maintained
  F:    Documentation/networking/device_drivers/ethernet/huawei/hinic.rst
  F:    drivers/net/ethernet/huawei/hinic/
  
  HUGETLB SUBSYSTEM
  M:    Mike Kravetz <[email protected]>
 -M:    Muchun Song <[email protected]>
 +M:    Muchun Song <[email protected]>
  L:    [email protected]
  S:    Maintained
  F:    Documentation/ABI/testing/sysfs-kernel-mm-hugepages
@@@ -9575,6 -9501,7 +9576,6 @@@ F:      drivers/media/i2c/hi847.
  Hyper-V/Azure CORE AND DRIVERS
  M:    "K. Y. Srinivasan" <[email protected]>
  M:    Haiyang Zhang <[email protected]>
 -M:    Stephen Hemminger <[email protected]>
  M:    Wei Liu <[email protected]>
  M:    Dexuan Cui <[email protected]>
  L:    [email protected]
@@@ -9608,7 -9535,6 +9609,7 @@@ F:      include/asm-generic/hyperv-tlfs.
  F:    include/asm-generic/mshyperv.h
  F:    include/clocksource/hyperv_timer.h
  F:    include/linux/hyperv.h
 +F:    include/net/mana
  F:    include/uapi/linux/hyperv.h
  F:    net/vmw_vsock/hyperv_transport.c
  F:    tools/hv/
@@@ -9772,7 -9698,8 +9773,7 @@@ F:      Documentation/devicetree/bindings/i3
  F:    drivers/i3c/master/i3c-master-cdns.c
  
  I3C DRIVER FOR SYNOPSYS DESIGNWARE
 -M:    Vitor Soares <[email protected]>
 -S:    Maintained
 +S:    Orphan
  F:    Documentation/devicetree/bindings/i3c/snps,dw-i3c-master.yaml
  F:    drivers/i3c/master/dw*
  
@@@ -9845,10 -9772,7 +9846,10 @@@ S:    Supporte
  F:    drivers/pci/hotplug/rpaphp*
  
  IBM Power SRIOV Virtual NIC Device Driver
 -M:    Dany Madden <[email protected]>
 +M:    Haren Myneni <[email protected]>
 +M:    Rick Lindsley <[email protected]>
 +R:    Nick Child <[email protected]>
 +R:    Dany Madden <[email protected]>
  R:    Thomas Falcon <[email protected]>
  L:    [email protected]
  S:    Supported
@@@ -10094,11 -10018,6 +10095,11 @@@ F: Documentation/hwmon/ina2xx.rs
  F:    drivers/hwmon/ina2xx.c
  F:    include/linux/platform_data/ina2xx.h
  
 +INDEX OF FURTHER KERNEL DOCUMENTATION
 +M:    Carlos Bilbao <[email protected]>
 +S:    Maintained
 +F:    Documentation/process/kernel-docs.rst
 +
  INDUSTRY PACK SUBSYSTEM (IPACK)
  M:    Samuel Iglesias Gonsalvez <[email protected]>
  M:    Jens Taprogge <[email protected]>
@@@ -10128,7 -10047,6 +10129,7 @@@ F:   drivers/infiniband
  F:    include/rdma/
  F:    include/trace/events/ib_mad.h
  F:    include/trace/events/ib_umad.h
 +F:    include/trace/misc/rdma.h
  F:    include/uapi/linux/if_infiniband.h
  F:    include/uapi/rdma/
  F:    samples/bpf/ibumad_kern.c
@@@ -10302,7 -10220,6 +10303,7 @@@ Q:   http://patchwork.freedesktop.org/pro
  B:    https://gitlab.freedesktop.org/drm/intel/-/wikis/How-to-file-i915-bugs
  C:    irc://irc.oftc.net/intel-gfx
  T:    git git://anongit.freedesktop.org/drm-intel
 +F:    Documentation/ABI/testing/sysfs-driver-intel-i915-hwmon
  F:    Documentation/gpu/i915.rst
  F:    drivers/gpu/drm/i915/
  F:    include/drm/i915*
@@@ -10362,7 -10279,7 +10363,7 @@@ T:   git https://github.com/intel/gvt-lin
  F:    drivers/gpu/drm/i915/gvt/
  
  INTEL HID EVENT DRIVER
 -M:    Alex Hung <alex.hung@canonical.com>
 +M:    Alex Hung <alexhung@gmail.com>
  L:    [email protected]
  S:    Maintained
  F:    drivers/platform/x86/intel/hid.c
@@@ -10794,18 -10711,6 +10795,18 @@@ F: drivers/iommu/dma-iommu.
  F:    drivers/iommu/iova.c
  F:    include/linux/iova.h
  
 +IOMMUFD
 +M:    Jason Gunthorpe <[email protected]>
 +M:    Kevin Tian <[email protected]>
 +L:    [email protected]
 +S:    Maintained
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/jgg/iommufd.git
 +F:    Documentation/userspace-api/iommufd.rst
 +F:    drivers/iommu/iommufd/
 +F:    include/linux/iommufd.h
 +F:    include/uapi/linux/iommufd.h
 +F:    tools/testing/selftests/iommu/
 +
  IOMMU SUBSYSTEM
  M:    Joerg Roedel <[email protected]>
  M:    Will Deacon <[email protected]>
@@@ -10985,13 -10890,6 +10986,13 @@@ F: drivers/isdn/Makefil
  F:    drivers/isdn/hardware/
  F:    drivers/isdn/mISDN/
  
 +ISOFS FILESYSTEM
 +M:    Jan Kara <[email protected]>
 +L:    [email protected]
 +S:    Maintained
 +F:    Documentation/filesystems/isofs.rst
 +F:    fs/isofs/
 +
  IT87 HARDWARE MONITORING DRIVER
  M:    Jean Delvare <[email protected]>
  L:    [email protected]
@@@ -11053,9 -10951,9 +11054,9 @@@ F:   drivers/hwmon/jc42.
  JFS FILESYSTEM
  M:    Dave Kleikamp <[email protected]>
  L:    [email protected]
 -S:    Maintained
 +S:    Odd Fixes
  W:    http://jfs.sourceforge.net/
 -T:    git git://github.com/kleikamp/linux-shaggy.git
 +T:    git https://github.com/kleikamp/linux-shaggy.git
  F:    Documentation/admin-guide/jfs.rst
  F:    fs/jfs/
  
@@@ -11129,7 -11027,6 +11130,7 @@@ KCONFI
  M:    Masahiro Yamada <[email protected]>
  L:    [email protected]
  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
  F:    Documentation/kbuild/kconfig*
  F:    scripts/Kconfig.include
@@@ -11187,12 -11084,10 +11188,12 @@@ F:        fs/autofs
  
  KERNEL BUILD + files below scripts/ (unless maintained elsewhere)
  M:    Masahiro Yamada <[email protected]>
 -M:    Michal Marek <[email protected]>
 +R:    Nathan Chancellor <[email protected]>
  R:    Nick Desaulniers <[email protected]>
 +R:    Nicolas Schier <[email protected]>
  L:    [email protected]
  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
  F:    Documentation/kbuild/
  F:    Makefile
@@@ -11210,8 -11105,6 +11211,8 @@@ M:   Kees Cook <[email protected]
  L:    [email protected]
  S:    Supported
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux.git for-next/hardening
 +F:    Documentation/ABI/testing/sysfs-kernel-oops_count
 +F:    Documentation/ABI/testing/sysfs-kernel-warn_count
  F:    include/linux/overflow.h
  F:    include/linux/randomize_kstack.h
  F:    mm/usercopy.c
@@@ -11230,18 -11123,11 +11231,18 @@@ L:        [email protected]
  S:    Supported
  W:    http://nfs.sourceforge.net/
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/cel/linux.git
 +F:    fs/exportfs/
  F:    fs/lockd/
  F:    fs/nfs_common/
  F:    fs/nfsd/
  F:    include/linux/lockd/
  F:    include/linux/sunrpc/
 +F:    include/trace/events/rpcgss.h
 +F:    include/trace/events/rpcrdma.h
 +F:    include/trace/events/sunrpc.h
 +F:    include/trace/misc/fs.h
 +F:    include/trace/misc/nfs.h
 +F:    include/trace/misc/sunrpc.h
  F:    include/uapi/linux/nfsd/
  F:    include/uapi/linux/sunrpc/
  F:    net/sunrpc/
  L:    [email protected]
  L:    [email protected]
  S:    Maintained
 -T:    git git://github.com/kvm-riscv/linux.git
 +T:    git https://github.com/kvm-riscv/linux.git
  F:    arch/riscv/include/asm/kvm*
  F:    arch/riscv/include/uapi/asm/kvm*
  F:    arch/riscv/kvm/
@@@ -11369,6 -11255,7 +11370,6 @@@ M:   Claudio Imbrenda <[email protected]
  R:    David Hildenbrand <[email protected]>
  L:    [email protected]
  S:    Supported
 -W:    http://www.ibm.com/developerworks/linux/linux390/
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/kvms390/linux.git
  F:    Documentation/virt/kvm/s390*
  F:    arch/s390/include/asm/gmap.h
@@@ -11963,7 -11850,7 +11964,7 @@@ M:   Eric Piel <[email protected]
  S:    Maintained
  F:    Documentation/misc-devices/lis3lv02d.rst
  F:    drivers/misc/lis3lv02d/
 -F:    drivers/platform/x86/hp_accel.c
 +F:    drivers/platform/x86/hp/hp_accel.c
  
  LIST KUNIT TEST
  M:    David Gow <[email protected]>
@@@ -12118,21 -12005,6 +12119,21 @@@ F: drivers/*/*loongarch
  F:    Documentation/loongarch/
  F:    Documentation/translations/zh_CN/loongarch/
  
 +LOONGSON-2 SOC SERIES GUTS DRIVER
 +M:    Yinbo Zhu <[email protected]>
 +L:    [email protected]
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/hwinfo/loongson,ls2k-chipid.yaml
 +F:    drivers/soc/loongson/loongson2_guts.c
 +
 +LOONGSON-2 SOC SERIES PINCTRL DRIVER
 +M:    zhanghongchen <[email protected]>
 +M:    Yinbo Zhu <[email protected]>
 +L:    [email protected]
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/pinctrl/loongson,ls2k-pinctrl.yaml
 +F:    drivers/pinctrl/pinctrl-loongson2.c
 +
  LSILOGIC MPT FUSION DRIVERS (FC/SAS/SPI)
  M:    Sathya Prakash <[email protected]>
  M:    Sreekanth Reddy <[email protected]>
@@@ -12210,7 -12082,7 +12211,7 @@@ M:   Alexey Kodanev <alexey.kodanev@oracl
  L:    [email protected] (subscribers-only)
  S:    Maintained
  W:    http://linux-test-project.github.io/
 -T:    git git://github.com/linux-test-project/ltp.git
 +T:    git https://github.com/linux-test-project/ltp.git
  
  LYNX 28G SERDES PHY DRIVER
  M:    Ioana Ciornei <[email protected]>
@@@ -12346,6 -12218,7 +12347,6 @@@ F:   arch/mips/boot/dts/img/pistachio
  
  MARVELL 88E6XXX ETHERNET SWITCH FABRIC DRIVER
  M:    Andrew Lunn <[email protected]>
 -M:    Vivien Didelot <[email protected]>
  L:    [email protected]
  S:    Maintained
  F:    Documentation/devicetree/bindings/net/dsa/marvell.txt
@@@ -12435,7 -12308,7 +12436,7 @@@ M:   Marcin Wojtas <[email protected]
  M:    Russell King <[email protected]>
  L:    [email protected]
  S:    Maintained
 -F:    Documentation/devicetree/bindings/net/marvell-pp2.txt
 +F:    Documentation/devicetree/bindings/net/marvell,pp2.yaml
  F:    drivers/net/ethernet/marvell/mvpp2/
  
  MARVELL MWIFIEX WIRELESS DRIVER
@@@ -12483,7 -12356,7 +12484,7 @@@ F:   Documentation/networking/device_driv
  F:    drivers/net/ethernet/marvell/octeontx2/af/
  
  MARVELL PRESTERA ETHERNET SWITCH DRIVER
 -M:    Taras Chornyi <t[email protected]>
 +M:    Taras Chornyi <t[email protected]>
  S:    Supported
  W:    https://github.com/Marvell-switching/switchdev-prestera
  F:    drivers/net/ethernet/marvell/prestera/
@@@ -12845,7 -12718,7 +12846,7 @@@ F:   Documentation/admin-guide/media/imx7
  F:    Documentation/devicetree/bindings/media/nxp,imx-mipi-csi2.yaml
  F:    Documentation/devicetree/bindings/media/nxp,imx7-csi.yaml
  F:    drivers/media/platform/nxp/imx-mipi-csis.c
 -F:    drivers/staging/media/imx/imx7-media-csi.c
 +F:    drivers/media/platform/nxp/imx7-media-csi.c
  
  MEDIA DRIVERS FOR HELENE
  M:    Abylay Ospan <[email protected]>
@@@ -13042,7 -12915,6 +13043,7 @@@ M:   Felix Fietkau <[email protected]
  M:    John Crispin <[email protected]>
  M:    Sean Wang <[email protected]>
  M:    Mark Lee <[email protected]>
 +M:    Lorenzo Bianconi <[email protected]>
  L:    [email protected]
  S:    Maintained
  F:    drivers/net/ethernet/mediatek/
@@@ -13414,20 -13286,10 +13415,20 @@@ F:        include/linux/memory_hotplug.
  F:    include/linux/mm.h
  F:    include/linux/mmzone.h
  F:    include/linux/pagewalk.h
 -F:    include/linux/vmalloc.h
  F:    mm/
  F:    tools/testing/selftests/vm/
  
 +VMALLOC
 +M:    Andrew Morton <[email protected]>
 +R:    Uladzislau Rezki <[email protected]>
 +R:    Christoph Hellwig <[email protected]>
 +L:    [email protected]
 +S:    Maintained
 +W:    http://www.linux-mm.org
 +T:    git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm
 +F:    include/linux/vmalloc.h
 +F:    mm/vmalloc.c
 +
  MEMORY HOT(UN)PLUG
  M:    David Hildenbrand <[email protected]>
  M:    Oscar Salvador <[email protected]>
@@@ -13515,7 -13377,7 +13516,7 @@@ MESON NAND CONTROLLER DRIVER FOR AMLOGI
  M:    Liang Yang <[email protected]>
  L:    [email protected]
  S:    Maintained
 -F:    Documentation/devicetree/bindings/mtd/amlogic,meson-nand.txt
 +F:    Documentation/devicetree/bindings/mtd/amlogic,meson-nand.yaml
  F:    drivers/mtd/nand/raw/meson_*
  
  MESON VIDEO DECODER DRIVER FOR AMLOGIC SOCS
@@@ -13596,7 -13458,7 +13597,7 @@@ M:   Eugen Hristev <eugen.hristev@microch
  L:    [email protected]
  S:    Supported
  F:    Documentation/devicetree/bindings/media/microchip,csi2dc.yaml
 -F:    drivers/media/platform/atmel/microchip-csi2dc.c
 +F:    drivers/media/platform/microchip/microchip-csi2dc.c
  
  MICROCHIP ECC DRIVER
  M:    Tudor Ambarus <[email protected]>
  S:    Supported
  F:    Documentation/devicetree/bindings/media/atmel,isc.yaml
  F:    Documentation/devicetree/bindings/media/microchip,xisc.yaml
 -F:    drivers/media/platform/atmel/atmel-isc*
 -F:    drivers/media/platform/atmel/atmel-sama*-isc*
 +F:    drivers/staging/media/deprecated/atmel/atmel-isc*
 +F:    drivers/staging/media/deprecated/atmel/atmel-sama*-isc*
 +F:    drivers/media/platform/microchip/microchip-isc*
 +F:    drivers/media/platform/microchip/microchip-sama*-isc*
  F:    include/linux/atmel-isc-media.h
  
  MICROCHIP ISI DRIVER
@@@ -13759,12 -13619,6 +13760,12 @@@ S: Supporte
  F:    drivers/misc/atmel-ssc.c
  F:    include/linux/atmel-ssc.h
  
 +MICROCHIP SOC DRIVERS
 +M:    Conor Dooley <[email protected]>
 +S:    Supported
 +T:    git https://git.kernel.org/pub/scm/linux/kernel/git/conor/linux.git/
 +F:    drivers/soc/microchip/
 +
  MICROCHIP USB251XB DRIVER
  M:    Richard Leitner <[email protected]>
  L:    [email protected]
@@@ -13809,15 -13663,6 +13810,15 @@@ F: drivers/scsi/smartpqi/smartpqi*.[ch
  F:    include/linux/cciss*.h
  F:    include/uapi/linux/cciss*.h
  
 +MICROSOFT MANA RDMA DRIVER
 +M:    Long Li <[email protected]>
 +M:    Ajay Sharma <[email protected]>
 +L:    [email protected]
 +S:    Supported
 +F:    drivers/infiniband/hw/mana/
 +F:    include/net/mana
 +F:    include/uapi/rdma/mana-abi.h
 +
  MICROSOFT SURFACE AGGREGATOR TABLET-MODE SWITCH
  M:    Maximilian Luz <[email protected]>
  L:    [email protected]
@@@ -14093,7 -13938,6 +14094,7 @@@ F:   include/uapi/linux/meye.
  
  MOTORCOMM PHY DRIVER
  M:    Peter Geis <[email protected]>
 +M:    Frank <[email protected]>
  L:    [email protected]
  S:    Maintained
  F:    drivers/net/phy/motorcomm.c
@@@ -14472,6 -14316,7 +14473,6 @@@ F:   drivers/net/wireless
  
  NETWORKING [DSA]
  M:    Andrew Lunn <[email protected]>
 -M:    Vivien Didelot <[email protected]>
  M:    Florian Fainelli <[email protected]>
  M:    Vladimir Oltean <[email protected]>
  S:    Maintained
  S:    Supported
  W:    https://nilfs.sourceforge.io/
  W:    https://nilfs.osdn.jp/
 -T:    git git://github.com/konis/nilfs2.git
 +T:    git https://github.com/konis/nilfs2.git
  F:    Documentation/filesystems/nilfs2.rst
  F:    fs/nilfs2/
  F:    include/trace/events/nilfs2.h
@@@ -14865,12 -14710,6 +14866,12 @@@ F: drivers/nvme/target/auth.
  F:    drivers/nvme/target/fabrics-cmd-auth.c
  F:    include/linux/nvme-auth.h
  
 +NVM EXPRESS HARDWARE MONITORING SUPPORT
 +M:    Guenter Roeck <[email protected]>
 +L:    [email protected]
 +S:    Supported
 +F:    drivers/nvme/host/hwmon.c
 +
  NVM EXPRESS FC TRANSPORT DRIVERS
  M:    James Smart <[email protected]>
  L:    [email protected]
@@@ -15328,13 -15167,6 +15329,13 @@@ S: Maintaine
  T:    git git://linuxtv.org/media_tree.git
  F:    drivers/media/i2c/ov08d10.c
  
 +OMNIVISION OV08X40 SENSOR DRIVER
 +M:    Jason Chen <[email protected]>
 +L:    [email protected]
 +S:    Maintained
 +T:    git git://linuxtv.org/media_tree.git
 +F:    drivers/media/i2c/ov08x40.c
 +
  OMNIVISION OV13858 SENSOR DRIVER
  M:    Sakari Ailus <[email protected]>
  L:    [email protected]
@@@ -15373,14 -15205,6 +15374,14 @@@ S: Maintaine
  T:    git git://linuxtv.org/media_tree.git
  F:    drivers/media/i2c/ov2740.c
  
 +OMNIVISION OV4689 SENSOR DRIVER
 +M:    Mikhail Rudenko <[email protected]>
 +L:    [email protected]
 +S:    Maintained
 +T:    git git://linuxtv.org/media_tree.git
 +F:    Documentation/devicetree/bindings/media/i2c/ovti,ov4689.yaml
 +F:    drivers/media/i2c/ov5647.c
 +
  OMNIVISION OV5640 SENSOR DRIVER
  M:    Steve Longerbeam <[email protected]>
  L:    [email protected]
@@@ -15505,12 -15329,6 +15506,12 @@@ S: Maintaine
  F:    drivers/mtd/nand/onenand/
  F:    include/linux/mtd/onenand*.h
  
 +ONEXPLAYER FAN DRIVER
 +M:    Joaquín Ignacio Aramendía <[email protected]>
 +L:    [email protected]
 +S:    Maintained
 +F:    drivers/hwmon/oxp-sensors.c
 +
  ONION OMEGA2+ BOARD
  M:    Harvey Hunt <[email protected]>
  L:    [email protected]
@@@ -15609,7 -15427,6 +15610,7 @@@ S:   Maintaine
  W:    http://openvswitch.org
  F:    include/uapi/linux/openvswitch.h
  F:    net/openvswitch/
 +F:    tools/testing/selftests/net/openvswitch/
  
  OPERATING PERFORMANCE POINTS (OPP)
  M:    Viresh Kumar <[email protected]>
@@@ -15801,7 -15618,7 +15802,7 @@@ F:   drivers/input/serio/gscps2.
  F:    drivers/input/serio/hp_sdc*
  F:    drivers/parisc/
  F:    drivers/parport/parport_gsc.*
 -F:    drivers/tty/serial/8250/8250_gsc.c
 +F:    drivers/tty/serial/8250/8250_parisc.c
  F:    drivers/video/console/sti*
  F:    drivers/video/fbdev/sti*
  F:    drivers/video/logo/logo_parisc*
@@@ -16023,7 -15840,7 +16024,7 @@@ F:   Documentation/devicetree/bindings/pc
  F:    drivers/pci/controller/dwc/*designware*
  
  PCI DRIVER FOR TI DRA7XX/J721E
 -M:    Kishon Vijay Abraham I <kishon@ti.com>
 +M:    Vignesh Raghavendra <vigneshr@ti.com>
  L:    [email protected]
  L:    [email protected]
  L:    [email protected] (moderated for non-subscribers)
@@@ -16040,10 -15857,10 +16041,10 @@@ F:        Documentation/devicetree/bindings/pc
  F:    drivers/pci/controller/pci-v3-semi.c
  
  PCI ENDPOINT SUBSYSTEM
 -M:    Kishon Vijay Abraham I <[email protected]>
  M:    Lorenzo Pieralisi <[email protected]>
  R:    Krzysztof Wilczyński <[email protected]>
  R:    Manivannan Sadhasivam <[email protected]>
 +R:    Kishon Vijay Abraham I <[email protected]>
  L:    [email protected]
  S:    Supported
  Q:    https://patchwork.kernel.org/project/linux-pci/list/
@@@ -16114,7 -15931,6 +16115,7 @@@ Q:   https://patchwork.kernel.org/project
  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
 +F:    Documentation/devicetree/bindings/pci/
  F:    drivers/pci/controller/
  F:    drivers/pci/pci-bridge-emul.c
  F:    drivers/pci/pci-bridge-emul.h
@@@ -16221,7 -16037,7 +16222,7 @@@ F:   Documentation/devicetree/bindings/pc
  F:    drivers/pci/controller/*microchip*
  
  PCIE DRIVER FOR QUALCOMM MSM
 -M:    Stanimir Varbanov <[email protected]>
 +M:    Manivannan Sadhasivam <[email protected]>
  L:    [email protected]
  L:    [email protected]
  S:    Maintained
@@@ -16311,8 -16127,7 +16312,8 @@@ F:   include/linux/peci-cpu.
  F:    include/linux/peci.h
  
  PENSANDO ETHERNET DRIVERS
 -M:    Shannon Nelson <[email protected]>
 +M:    Shannon Nelson <[email protected]>
 +M:    Brett Creeley <[email protected]>
  M:    [email protected]
  L:    [email protected]
  S:    Supported
@@@ -16470,7 -16285,7 +16471,7 @@@ M:   Sean Wang <[email protected]
  L:    [email protected] (moderated for non-subscribers)
  S:    Maintained
  F:    Documentation/devicetree/bindings/pinctrl/mediatek,mt65xx-pinctrl.yaml
 -F:    Documentation/devicetree/bindings/pinctrl/mediatek,mt6797-pinctrl.yaml
 +F:    Documentation/devicetree/bindings/pinctrl/mediatek,mt6779-pinctrl.yaml
  F:    Documentation/devicetree/bindings/pinctrl/mediatek,mt7622-pinctrl.yaml
  F:    Documentation/devicetree/bindings/pinctrl/mediatek,mt8183-pinctrl.yaml
  F:    drivers/pinctrl/mediatek/
@@@ -16543,6 -16358,13 +16544,6 @@@ S:  Supporte
  F:    Documentation/devicetree/bindings/input/pine64,pinephone-keyboard.yaml
  F:    drivers/input/keyboard/pinephone-keyboard.c
  
 -PKTCDVD DRIVER
 -M:    [email protected]
 -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 <[email protected]>
  S:    Maintained
@@@ -16820,10 -16642,10 +16821,10 @@@ F:        net/psampl
  
  PSTORE FILESYSTEM
  M:    Kees Cook <[email protected]>
 -M:    Anton Vorontsov <[email protected]>
 -M:    Colin Cross <ccross@android.com>
 -M:    Tony Luck <[email protected]>
 -S:    Maintained
 +R:    Tony Luck <[email protected]>
 +R:    Guilherme G. Piccoli <gpiccoli@igalia.com>
 +L:    [email protected]
 +S:    Supported
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux.git for-next/pstore
  F:    Documentation/admin-guide/ramoops.rst
  F:    Documentation/admin-guide/pstore-blk.rst
@@@ -16844,7 -16666,6 +16845,7 @@@ F:   Documentation/driver-api/ptp.rs
  F:    drivers/net/phy/dp83640*
  F:    drivers/ptp/*
  F:    include/linux/ptp_cl*
 +K:    (?:\b|_)ptp(?:\b|_)
  
  PTP VIRTUAL CLOCK SUPPORT
  M:    Yangbo Lu <[email protected]>
@@@ -16870,6 -16691,7 +16871,6 @@@ M:   Hans Verkuil <[email protected]
  L:    [email protected]
  S:    Maintained
  T:    git git://linuxtv.org/media_tree.git
 -F:    Documentation/admin-guide/media/pulse8-cec.rst
  F:    drivers/media/cec/usb/pulse8/
  
  PURELIFI PLFXLC DRIVER
@@@ -16900,7 -16722,6 +16901,7 @@@ PWM IR Transmitte
  M:    Sean Young <[email protected]>
  L:    [email protected]
  S:    Maintained
 +F:    Documentation/devicetree/bindings/leds/irled/pwm-ir-tx.yaml
  F:    drivers/media/rc/pwm-ir-tx.c
  
  PWM SUBSYSTEM
@@@ -16965,7 -16786,7 +16966,7 @@@ M:   Srinivas Kandagatla <srinivas.kandag
  M:    Banajit Goswami <[email protected]>
  L:    [email protected] (moderated for non-subscribers)
  S:    Supported
 -F:    Documentation/devicetree/bindings/soc/qcom/qcom,apr.yaml
 +F:    Documentation/devicetree/bindings/soc/qcom/qcom,apr*
  F:    Documentation/devicetree/bindings/sound/qcom,*
  F:    drivers/soc/qcom/apr.c
  F:    include/dt-bindings/sound/qcom,wcd9335.h
@@@ -17323,8 -17144,7 +17324,8 @@@ F:   Documentation/devicetree/bindings/th
  F:    drivers/thermal/qcom/
  
  QUALCOMM VENUS VIDEO ACCELERATOR DRIVER
 -M:    Stanimir Varbanov <[email protected]>
 +M:    Stanimir Varbanov <[email protected]>
 +M:    Vikash Garodia <[email protected]>
  L:    [email protected]
  L:    [email protected]
  S:    Maintained
@@@ -17389,7 -17209,7 +17390,7 @@@ R:   Dongsheng Yang <dongsheng.yang@easys
  L:    [email protected]
  S:    Supported
  W:    http://ceph.com/
 -T:    git git://github.com/ceph/ceph-client.git
 +T:    git https://github.com/ceph/ceph-client.git
  F:    Documentation/ABI/testing/sysfs-bus-rbd
  F:    drivers/block/rbd.c
  F:    drivers/block/rbd_types.h
@@@ -17642,8 -17462,10 +17643,8 @@@ S:  Maintaine
  F:    drivers/net/wireless/realtek/rtw89/
  
  REDPINE WIRELESS DRIVER
 -M:    Amitkumar Karwar <[email protected]>
 -M:    Siva Rebbagondla <[email protected]>
  L:    [email protected]
 -S:    Maintained
 +S:    Orphan
  F:    drivers/net/wireless/rsi/
  
  REGISTER MAP ABSTRACTION
@@@ -17888,7 -17710,7 +17889,7 @@@ F:   arch/riscv
  N:    riscv
  K:    riscv
  
 -RISC-V/MICROCHIP POLARFIRE SOC SUPPORT
 +RISC-V MICROCHIP FPGA SUPPORT
  M:    Conor Dooley <[email protected]>
  M:    Daire McNamara <[email protected]>
  L:    [email protected]
@@@ -17906,26 -17728,17 +17907,26 @@@ F:        Documentation/devicetree/bindings/us
  F:    arch/riscv/boot/dts/microchip/
  F:    drivers/char/hw_random/mpfs-rng.c
  F:    drivers/clk/microchip/clk-mpfs.c
 -F:    drivers/i2c/busses/i2c-microchip-core.c
 +F:    drivers/i2c/busses/i2c-microchip-corei2c.c
  F:    drivers/mailbox/mailbox-mpfs.c
  F:    drivers/pci/controller/pcie-microchip-host.c
  F:    drivers/reset/reset-mpfs.c
  F:    drivers/rtc/rtc-mpfs.c
 -F:    drivers/soc/microchip/
 +F:    drivers/soc/microchip/mpfs-sys-controller.c
  F:    drivers/spi/spi-microchip-core-qspi.c
  F:    drivers/spi/spi-microchip-core.c
  F:    drivers/usb/musb/mpfs.c
  F:    include/soc/microchip/mpfs.h
  
 +RISC-V MISC SOC SUPPORT
 +M:    Conor Dooley <[email protected]>
 +L:    [email protected]
 +S:    Maintained
 +Q:    https://patchwork.kernel.org/project/linux-riscv/list/
 +T:    git https://git.kernel.org/pub/scm/linux/kernel/git/conor/linux.git/
 +F:    Documentation/devicetree/bindings/riscv/
 +F:    arch/riscv/boot/dts/
 +
  RNBD BLOCK DRIVERS
  M:    Md. Haris Iqbal <[email protected]>
  M:    Jack Wang <[email protected]>
@@@ -17941,13 -17754,6 +17942,13 @@@ F: Documentation/ABI/*/sysfs-driver-hid
  F:    drivers/hid/hid-roccat*
  F:    include/linux/hid-roccat*
  
 +ROCKCHIP CRYPTO DRIVERS
 +M:    Corentin Labbe <[email protected]>
 +L:    [email protected]
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/crypto/rockchip,rk3288-crypto.yaml
 +F:    drivers/crypto/rockchip/
 +
  ROCKCHIP I2S TDM DRIVER
  M:    Nicolas Frattaroli <[email protected]>
  L:    [email protected]
@@@ -17996,7 -17802,7 +17997,7 @@@ S:   Odd Fixe
  F:    drivers/tty/serial/rp2.*
  
  ROHM BD99954 CHARGER IC
 -R:    Matti Vaittinen <[email protected]>
 +M:    Matti Vaittinen <[email protected]>
  S:    Supported
  F:    drivers/power/supply/bd99954-charger.c
  F:    drivers/power/supply/bd99954-charger.h
@@@ -18019,7 -17825,7 +18020,7 @@@ F:   drivers/regulator/bd9571mwv-regulato
  F:    include/linux/mfd/bd9571mwv.h
  
  ROHM POWER MANAGEMENT IC DEVICE DRIVERS
 -R:    Matti Vaittinen <[email protected]>
 +M:    Matti Vaittinen <[email protected]>
  S:    Supported
  F:    drivers/clk/clk-bd718x7.c
  F:    drivers/gpio/gpio-bd71815.c
  S:    Maintained
  F:    drivers/video/fbdev/savage/
  
 -S390
 +S390 ARCHITECTURE
  M:    Heiko Carstens <[email protected]>
  M:    Vasily Gorbik <[email protected]>
  M:    Alexander Gordeev <[email protected]>
@@@ -18181,6 -17987,7 +18182,6 @@@ R:   Christian Borntraeger <borntraeger@l
  R:    Sven Schnelle <[email protected]>
  L:    [email protected]
  S:    Supported
 -W:    http://www.ibm.com/developerworks/linux/linux390/
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux.git
  F:    Documentation/driver-api/s390-drivers.rst
  F:    Documentation/s390/
@@@ -18192,6 -17999,7 +18193,6 @@@ M:   Vineeth Vijayan <[email protected]
  M:    Peter Oberparleiter <[email protected]>
  L:    [email protected]
  S:    Supported
 -W:    http://www.ibm.com/developerworks/linux/linux390/
  F:    drivers/s390/cio/
  
  S390 DASD DRIVER
@@@ -18199,6 -18007,7 +18200,6 @@@ M:   Stefan Haberland <[email protected]
  M:    Jan Hoeppner <[email protected]>
  L:    [email protected]
  S:    Supported
 -W:    http://www.ibm.com/developerworks/linux/linux390/
  F:    block/partitions/ibm.c
  F:    drivers/s390/block/dasd*
  F:    include/linux/dasd_mod.h
@@@ -18208,6 -18017,7 +18209,6 @@@ M:   Matthew Rosato <[email protected]
  M:    Gerald Schaefer <[email protected]>
  L:    [email protected]
  S:    Supported
 -W:    http://www.ibm.com/developerworks/linux/linux390/
  F:    drivers/iommu/s390-iommu.c
  
  S390 IUCV NETWORK LAYER
@@@ -18216,6 -18026,7 +18217,6 @@@ M:   Wenjia Zhang <[email protected]
  L:    [email protected]
  L:    [email protected]
  S:    Supported
 -W:    http://www.ibm.com/developerworks/linux/linux390/
  F:    drivers/s390/net/*iucv*
  F:    include/net/iucv/
  F:    net/iucv/
@@@ -18226,22 -18037,15 +18227,22 @@@ M:        Wenjia Zhang <[email protected]
  L:    [email protected]
  L:    [email protected]
  S:    Supported
 -W:    http://www.ibm.com/developerworks/linux/linux390/
  F:    drivers/s390/net/
  
 +S390 MM
 +M:    Alexander Gordeev <[email protected]>
 +M:    Gerald Schaefer <[email protected]>
 +L:    [email protected]
 +S:    Supported
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux.git
 +F:    arch/s390/include/asm/pgtable.h
 +F:    arch/s390/mm
 +
  S390 PCI SUBSYSTEM
  M:    Niklas Schnelle <[email protected]>
  M:    Gerald Schaefer <[email protected]>
  L:    [email protected]
  S:    Supported
 -W:    http://www.ibm.com/developerworks/linux/linux390/
  F:    arch/s390/pci/
  F:    drivers/pci/hotplug/s390_pci_hpc.c
  F:    Documentation/s390/pci.rst
@@@ -18252,6 -18056,7 +18253,6 @@@ M:   Halil Pasic <[email protected]
  M:    Jason Herne <[email protected]>
  L:    [email protected]
  S:    Supported
 -W:    http://www.ibm.com/developerworks/linux/linux390/
  F:    Documentation/s390/vfio-ap*
  F:    drivers/s390/crypto/vfio_ap*
  
@@@ -18280,6 -18085,7 +18281,6 @@@ S390 ZCRYPT DRIVE
  M:    Harald Freudenberger <[email protected]>
  L:    [email protected]
  S:    Supported
 -W:    http://www.ibm.com/developerworks/linux/linux390/
  F:    drivers/s390/crypto/
  
  S390 ZFCP DRIVER
@@@ -18287,6 -18093,7 +18288,6 @@@ M:   Steffen Maier <[email protected]
  M:    Benjamin Block <[email protected]>
  L:    [email protected]
  S:    Supported
 -W:    http://www.ibm.com/developerworks/linux/linux390/
  F:    drivers/s390/scsi/zfcp_*
  
  S3C ADC BATTERY DRIVER
  S:    Maintained
  T:    git git://linuxtv.org/media_tree.git
  F:    drivers/staging/media/deprecated/saa7146/
 -F:    include/media/drv-intf/saa7146*
  
  SAFESETID SECURITY MODULE
  M:    Micah Morton <[email protected]>
@@@ -18404,6 -18212,7 +18405,6 @@@ F:   include/media/drv-intf/s3c_camif.
  
  SAMSUNG S3FWRN5 NFC DRIVER
  M:    Krzysztof Kozlowski <[email protected]>
 -M:    Krzysztof Opasiak <[email protected]>
  L:    [email protected] (subscribers-only)
  S:    Maintained
  F:    Documentation/devicetree/bindings/net/nfc/samsung,s3fwrn5.yaml
@@@ -18664,7 -18473,6 +18665,7 @@@ K:   \bsecure_computin
  K:    \bTIF_SECCOMP\b
  
  SECURE DIGITAL HOST CONTROLLER INTERFACE (SDHCI) Broadcom BRCMSTB DRIVER
 +M:    Kamal Dasu <[email protected]>
  M:    Al Cooper <[email protected]>
  R:    Broadcom internal kernel review list <[email protected]>
  L:    [email protected]
@@@ -18675,7 -18483,6 +18676,7 @@@ SECURE DIGITAL HOST CONTROLLER INTERFAC
  M:    Adrian Hunter <[email protected]>
  L:    [email protected]
  S:    Supported
 +F:    Documentation/devicetree/bindings/mmc/sdhci-common.yaml
  F:    drivers/mmc/host/sdhci*
  
  SECURE DIGITAL HOST CONTROLLER INTERFACE (SDHCI) MICROCHIP DRIVER
@@@ -18860,6 -18667,7 +18861,6 @@@ M:   Wenjia Zhang <[email protected]
  M:    Jan Karcher <[email protected]>
  L:    [email protected]
  S:    Supported
 -W:    http://www.ibm.com/developerworks/linux/linux390/
  F:    net/smc/
  
  SHARP GP2AP002A00F/GP2AP002S00F SENSOR DRIVER
@@@ -18970,6 -18778,7 +18971,6 @@@ M:   Palmer Dabbelt <[email protected]
  M:    Paul Walmsley <[email protected]>
  L:    [email protected]
  S:    Supported
 -T:    git git://github.com/sifive/riscv-linux.git
  N:    sifive
  K:    [^@]sifive
  
@@@ -18988,13 -18797,6 +18989,13 @@@ S: Maintaine
  F:    Documentation/devicetree/bindings/dma/sifive,fu540-c000-pdma.yaml
  F:    drivers/dma/sf-pdma/
  
 +SIFIVE SOC DRIVERS
 +M:    Conor Dooley <[email protected]>
 +L:    [email protected]
 +S:    Maintained
 +T:    git https://git.kernel.org/pub/scm/linux/kernel/git/conor/linux.git/
 +F:    drivers/soc/sifive/
 +
  SILEAD TOUCHSCREEN DRIVER
  M:    Hans de Goede <[email protected]>
  L:    [email protected]
@@@ -19061,7 -18863,7 +19062,7 @@@ M:   Jason A. Donenfeld <[email protected]
  S:    Maintained
  F:    include/linux/siphash.h
  F:    lib/siphash.c
 -F:    lib/test_siphash.c
 +F:    lib/siphash_kunit.c
  
  SIS 190 ETHERNET DRIVER
  M:    Francois Romieu <[email protected]>
@@@ -19085,7 -18887,7 +19086,7 @@@ F:   drivers/video/fbdev/sis
  F:    include/video/sisfb.h
  
  SIS I2C TOUCHSCREEN DRIVER
 -M:    Mika Penttilä <mika.penttila@nextfour.com>
 +M:    Mika Penttilä <mpenttil@redhat.com>
  L:    [email protected]
  S:    Maintained
  F:    Documentation/devicetree/bindings/input/touchscreen/sis_i2c.txt
@@@ -19228,7 -19030,7 +19229,7 @@@ M:   Jassi Brar <[email protected]
  M:    Ilias Apalodimas <[email protected]>
  L:    [email protected]
  S:    Maintained
 -F:    Documentation/devicetree/bindings/net/socionext-netsec.txt
 +F:    Documentation/devicetree/bindings/net/socionext,synquacer-netsec.yaml
  F:    drivers/net/ethernet/socionext/netsec.c
  
  SOCIONEXT (SNI) Synquacer SPI DRIVER
@@@ -19236,7 -19038,7 +19237,7 @@@ M:   Masahisa Kojima <masahisa.kojima@lin
  M:    Jassi Brar <[email protected]>
  L:    [email protected]
  S:    Maintained
 -F:    Documentation/devicetree/bindings/spi/spi-synquacer.txt
 +F:    Documentation/devicetree/bindings/spi/socionext,synquacer-spi.yaml
  F:    drivers/spi/spi-synquacer.c
  
  SOCIONEXT SYNQUACER I2C DRIVER
@@@ -19383,7 -19185,7 +19384,7 @@@ M:   Manivannan Sadhasivam <manivannan.sa
  L:    [email protected]
  S:    Maintained
  T:    git git://linuxtv.org/media_tree.git
 -F:    Documentation/devicetree/bindings/media/i2c/imx290.txt
 +F:    Documentation/devicetree/bindings/media/i2c/sony,imx290.yaml
  F:    drivers/media/i2c/imx290.c
  
  SONY IMX319 SENSOR DRIVER
@@@ -19532,11 -19334,6 +19533,11 @@@ W: https://linuxtv.or
  Q:    http://patchwork.linuxtv.org/project/linux-media/list/
  F:    drivers/media/dvb-frontends/sp2*
  
 +SPANISH DOCUMENTATION
 +M:    Carlos Bilbao <[email protected]>
 +S:    Maintained
 +F:    Documentation/translations/sp_SP/
 +
  SPARC + UltraSPARC (sparc/sparc64)
  M:    "David S. Miller" <[email protected]>
  L:    [email protected]
@@@ -19680,7 -19477,7 +19681,7 @@@ M:   Sylvain Petinot <sylvain.petinot@fos
  L:    [email protected]
  S:    Maintained
  T:    git git://linuxtv.org/media_tree.git
 -F:    Documentation/devicetree/bindings/media/i2c/st,st-mipid02.txt
 +F:    Documentation/devicetree/bindings/media/i2c/st,st-mipid02.yaml
  F:    drivers/media/i2c/st-mipid02.c
  
  ST STM32 I2C/SMBUS DRIVER
@@@ -19703,16 -19500,6 +19704,16 @@@ S: Maintaine
  F:    Documentation/hwmon/stpddc60.rst
  F:    drivers/hwmon/pmbus/stpddc60.c
  
 +ST VGXY61 DRIVER
 +M:    Benjamin Mugnier <[email protected]>
 +M:    Sylvain Petinot <[email protected]>
 +L:    [email protected]
 +S:    Maintained
 +T:    git git://linuxtv.org/media_tree.git
 +F:    Documentation/devicetree/bindings/media/i2c/st,st-vgxy61.yaml
 +F:    Documentation/userspace-api/media/drivers/st-vgxy61.rst
 +F:    drivers/media/i2c/st-vgxy61.c
 +
  ST VL53L0X ToF RANGER(I2C) IIO DRIVER
  M:    Song Qiang <[email protected]>
  L:    [email protected]
@@@ -19728,7 -19515,6 +19729,7 @@@ S:   Supporte
  F:    Documentation/process/stable-kernel-rules.rst
  
  STAGING - ATOMISP DRIVER
 +M:    Hans de Goede <[email protected]>
  M:    Mauro Carvalho Chehab <[email protected]>
  R:    Sakari Ailus <[email protected]>
  L:    [email protected]
@@@ -19812,11 -19598,6 +19813,11 @@@ M: Ion Badulescu <[email protected]
  S:    Odd Fixes
  F:    drivers/net/ethernet/adaptec/starfire*
  
 +STARFIVE DEVICETREES
 +M:    Emil Renner Berthing <[email protected]>
 +S:    Maintained
 +F:    arch/riscv/boot/dts/starfive/
 +
  STARFIVE JH7100 CLOCK DRIVERS
  M:    Emil Renner Berthing <[email protected]>
  S:    Maintained
@@@ -19938,13 -19719,6 +19939,13 @@@ W: https://sunplus.atlassian.net/wiki/s
  F:    Documentation/devicetree/bindings/net/sunplus,sp7021-emac.yaml
  F:    drivers/net/ethernet/sunplus/
  
 +SUNPLUS MMC DRIVER
 +M:    Tony Huang <[email protected]>
 +M:    Li-hao Kuo <[email protected]>
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/mmc/sunplus,mmc.yaml
 +F:    drivers/mmc/host/sunplus-mmc.c
 +
  SUNPLUS OCOTP DRIVER
  M:    Vincent Shih <[email protected]>
  S:    Maintained
@@@ -20196,7 -19970,6 +20197,7 @@@ F:   drivers/clk/clk-sc[mp]i.
  F:    drivers/cpufreq/sc[mp]i-cpufreq.c
  F:    drivers/firmware/arm_scmi/
  F:    drivers/firmware/arm_scpi.c
 +F:    drivers/powercap/arm_scmi_powercap.c
  F:    drivers/regulator/scmi-regulator.c
  F:    drivers/reset/reset-scmi.c
  F:    include/linux/sc[mp]i_protocol.h
@@@ -20531,7 -20304,7 +20532,7 @@@ M:   Chris Zankel <[email protected]
  M:    Max Filippov <[email protected]>
  L:    [email protected]
  S:    Maintained
 -T:    git git://github.com/czankel/xtensa-linux.git
 +T:    git https://github.com/jcmvbkbc/linux-xtensa.git
  F:    arch/xtensa/
  F:    drivers/irqchip/irq-xtensa-*
  
@@@ -20881,6 -20654,7 +20882,6 @@@ W:   https://wireless.wiki.kernel.org/en/
  W:    https://wireless.wiki.kernel.org/en/users/Drivers/wl1251
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/luca/wl12xx.git
  F:    drivers/net/wireless/ti/
 -F:    include/linux/wl12xx.h
  
  TIMEKEEPING, CLOCKSOURCE CORE, NTP, ALARMTIMER
  M:    John Stultz <[email protected]>
@@@ -21408,6 -21182,15 +21409,6 @@@ S:  Maintaine
  F:    Documentation/usb/ehci.rst
  F:    drivers/usb/host/ehci*
  
 -USB GADGET/PERIPHERAL SUBSYSTEM
 -M:    Felipe Balbi <[email protected]>
 -L:    [email protected]
 -S:    Maintained
 -W:    http://www.linux-usb.org/gadget
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/balbi/usb.git
 -F:    drivers/usb/gadget/
 -F:    include/linux/usb/gadget*
 -
  USB HID/HIDBP DRIVERS (USB KEYBOARDS, MICE, REMOTE CONTROLS, ...)
  M:    Jiri Kosina <[email protected]>
  M:    Benjamin Tissoires <[email protected]>
  L:    [email protected]
  S:    Maintained
  W:    https://github.com/petkan/pegasus
 -T:    git git://github.com/petkan/pegasus.git
 +T:    git https://github.com/petkan/pegasus.git
  F:    drivers/net/usb/pegasus.*
  
 -USB PHY LAYER
 -M:    Felipe Balbi <[email protected]>
 -L:    [email protected]
 -S:    Maintained
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/balbi/usb.git
 -F:    drivers/usb/phy/
 -
  USB PRINTER DRIVER (usblp)
  M:    Pete Zaitcev <[email protected]>
  L:    [email protected]
  L:    [email protected]
  S:    Maintained
  W:    https://github.com/petkan/rtl8150
 -T:    git git://github.com/petkan/rtl8150.git
 +T:    git https://github.com/petkan/rtl8150.git
  F:    drivers/net/usb/rtl8150.c
  
  USB SERIAL SUBSYSTEM
@@@ -21944,12 -21734,6 +21945,12 @@@ F: include/linux/virtio*.
  F:    include/uapi/linux/virtio_*.h
  F:    tools/virtio/
  
 +VISL VIRTUAL STATELESS DECODER DRIVER
 +M:    Daniel Almeida <[email protected]>
 +L:    [email protected]
 +S:    Supported
 +F:    drivers/media/test-drivers/visl
 +
  IFCVF VIRTIO DATA PATH ACCELERATOR
  R:    Zhu Lingshan <[email protected]>
  F:    drivers/vdpa/ifcvf/
@@@ -22338,7 -22122,6 +22339,7 @@@ F:   Documentation/watchdog
  F:    drivers/watchdog/
  F:    include/linux/watchdog.h
  F:    include/uapi/linux/watchdog.h
 +F:    include/trace/events/watchdog.h
  
  WHISKEYCOVE PMIC GPIO DRIVER
  M:    Kuppuswamy Sathyanarayanan <[email protected]>
@@@ -22979,7 -22762,7 +22980,7 @@@ S:   Maintaine
  W:    http://mjpeg.sourceforge.net/driver-zoran/
  Q:    https://patchwork.linuxtv.org/project/linux-media/list/
  F:    Documentation/driver-api/media/drivers/zoran.rst
 -F:    drivers/staging/media/zoran/
 +F:    drivers/media/pci/zoran/
  
  ZRAM COMPRESSED RAM BLOCK DEVICE DRVIER
  M:    Minchan Kim <[email protected]>
diff --combined fs/f2fs/compress.c
index 2b7a5cc4ed662fae8377af09585f4b64c4078dde,9723f0bed923723198063fe8086bf26c0c363742..2532f369cb10f532f2063605654edc1b57963c07
@@@ -346,7 -346,7 +346,7 @@@ static int zstd_init_compress_ctx(struc
        if (!level)
                level = F2FS_ZSTD_DEFAULT_CLEVEL;
  
-       params = zstd_get_params(F2FS_ZSTD_DEFAULT_CLEVEL, cc->rlen);
+       params = zstd_get_params(level, cc->rlen);
        workspace_size = zstd_cstream_workspace_bound(&params.cParams);
  
        workspace = f2fs_kvmalloc(F2FS_I_SB(cc->inode),
@@@ -567,10 -567,7 +567,7 @@@ MODULE_PARM_DESC(num_compress_pages
  int f2fs_init_compress_mempool(void)
  {
        compress_page_pool = mempool_create_page_pool(num_compress_pages, 0);
-       if (!compress_page_pool)
-               return -ENOMEM;
-       return 0;
+       return compress_page_pool ? 0 : -ENOMEM;
  }
  
  void f2fs_destroy_compress_mempool(void)
@@@ -1711,27 -1708,50 +1708,27 @@@ static void f2fs_put_dic(struct decompr
        }
  }
  
 -/*
 - * Update and unlock the cluster's pagecache pages, and release the reference to
 - * the decompress_io_ctx that was being held for I/O completion.
 - */
 -static void __f2fs_decompress_end_io(struct decompress_io_ctx *dic, bool failed,
 -                              bool in_task)
 +static void f2fs_verify_cluster(struct work_struct *work)
  {
 +      struct decompress_io_ctx *dic =
 +              container_of(work, struct decompress_io_ctx, verity_work);
        int i;
  
 +      /* Verify, update, and unlock the decompressed pages. */
        for (i = 0; i < dic->cluster_size; i++) {
                struct page *rpage = dic->rpages[i];
  
                if (!rpage)
                        continue;
  
 -              /* PG_error was set if verity failed. */
 -              if (failed || PageError(rpage)) {
 -                      ClearPageUptodate(rpage);
 -                      /* will re-read again later */
 -                      ClearPageError(rpage);
 -              } else {
 +              if (fsverity_verify_page(rpage))
                        SetPageUptodate(rpage);
 -              }
 +              else
 +                      ClearPageUptodate(rpage);
                unlock_page(rpage);
        }
  
 -      f2fs_put_dic(dic, in_task);
 -}
 -
 -static void f2fs_verify_cluster(struct work_struct *work)
 -{
 -      struct decompress_io_ctx *dic =
 -              container_of(work, struct decompress_io_ctx, verity_work);
 -      int i;
 -
 -      /* Verify the cluster's decompressed pages with fs-verity. */
 -      for (i = 0; i < dic->cluster_size; i++) {
 -              struct page *rpage = dic->rpages[i];
 -
 -              if (rpage && !fsverity_verify_page(rpage))
 -                      SetPageError(rpage);
 -      }
 -
 -      __f2fs_decompress_end_io(dic, false, true);
 +      f2fs_put_dic(dic, true);
  }
  
  /*
  void f2fs_decompress_end_io(struct decompress_io_ctx *dic, bool failed,
                                bool in_task)
  {
 +      int i;
 +
        if (!failed && dic->need_verity) {
                /*
                 * Note that to avoid deadlocks, the verity work can't be done
                 */
                INIT_WORK(&dic->verity_work, f2fs_verify_cluster);
                fsverity_enqueue_verify_work(&dic->verity_work);
 -      } else {
 -              __f2fs_decompress_end_io(dic, failed, in_task);
 +              return;
 +      }
 +
 +      /* Update and unlock the cluster's pagecache pages. */
 +      for (i = 0; i < dic->cluster_size; i++) {
 +              struct page *rpage = dic->rpages[i];
 +
 +              if (!rpage)
 +                      continue;
 +
 +              if (failed)
 +                      ClearPageUptodate(rpage);
 +              else
 +                      SetPageUptodate(rpage);
 +              unlock_page(rpage);
        }
 +
 +      /*
 +       * Release the reference to the decompress_io_ctx that was being held
 +       * for I/O completion.
 +       */
 +      f2fs_put_dic(dic, in_task);
  }
  
  /*
@@@ -1981,9 -1980,7 +1978,7 @@@ int f2fs_init_page_array_cache(struct f
  
        sbi->page_array_slab = f2fs_kmem_cache_create(slab_name,
                                        sbi->page_array_slab_size);
-       if (!sbi->page_array_slab)
-               return -ENOMEM;
-       return 0;
+       return sbi->page_array_slab ? 0 : -ENOMEM;
  }
  
  void f2fs_destroy_page_array_cache(struct f2fs_sb_info *sbi)
        kmem_cache_destroy(sbi->page_array_slab);
  }
  
static int __init f2fs_init_cic_cache(void)
int __init f2fs_init_compress_cache(void)
  {
        cic_entry_slab = f2fs_kmem_cache_create("f2fs_cic_entry",
                                        sizeof(struct compress_io_ctx));
        if (!cic_entry_slab)
                return -ENOMEM;
-       return 0;
- }
- static void f2fs_destroy_cic_cache(void)
- {
-       kmem_cache_destroy(cic_entry_slab);
- }
- static int __init f2fs_init_dic_cache(void)
- {
        dic_entry_slab = f2fs_kmem_cache_create("f2fs_dic_entry",
                                        sizeof(struct decompress_io_ctx));
        if (!dic_entry_slab)
-               return -ENOMEM;
-       return 0;
- }
- static void f2fs_destroy_dic_cache(void)
- {
-       kmem_cache_destroy(dic_entry_slab);
- }
- int __init f2fs_init_compress_cache(void)
- {
-       int err;
-       err = f2fs_init_cic_cache();
-       if (err)
-               goto out;
-       err = f2fs_init_dic_cache();
-       if (err)
                goto free_cic;
        return 0;
  free_cic:
-       f2fs_destroy_cic_cache();
- out:
+       kmem_cache_destroy(cic_entry_slab);
        return -ENOMEM;
  }
  
  void f2fs_destroy_compress_cache(void)
  {
-       f2fs_destroy_dic_cache();
-       f2fs_destroy_cic_cache();
+       kmem_cache_destroy(dic_entry_slab);
+       kmem_cache_destroy(cic_entry_slab);
  }
diff --combined fs/f2fs/data.c
index 7af75041bd81b978ce0764addaf3de1f9f374fb3,75abd450730b33fc872b5c2d971c773e6401810a..6e43e19c7d1cacd95f1dec99c9e5292795e1d34a
@@@ -39,10 -39,8 +39,8 @@@ static struct bio_set f2fs_bioset
  
  int __init f2fs_init_bioset(void)
  {
-       if (bioset_init(&f2fs_bioset, F2FS_BIO_POOL_SIZE,
-                                       0, BIOSET_NEED_BVECS))
-               return -ENOMEM;
-       return 0;
+       return bioset_init(&f2fs_bioset, F2FS_BIO_POOL_SIZE,
+                                       0, BIOSET_NEED_BVECS);
  }
  
  void f2fs_destroy_bioset(void)
@@@ -116,56 -114,43 +114,56 @@@ struct bio_post_read_ctx 
        struct f2fs_sb_info *sbi;
        struct work_struct work;
        unsigned int enabled_steps;
 +      /*
 +       * decompression_attempted keeps track of whether
 +       * f2fs_end_read_compressed_page() has been called on the pages in the
 +       * bio that belong to a compressed cluster yet.
 +       */
 +      bool decompression_attempted;
        block_t fs_blkaddr;
  };
  
 +/*
 + * Update and unlock a bio's pages, and free the bio.
 + *
 + * This marks pages up-to-date only if there was no error in the bio (I/O error,
 + * decryption error, or verity error), as indicated by bio->bi_status.
 + *
 + * "Compressed pages" (pagecache pages backed by a compressed cluster on-disk)
 + * aren't marked up-to-date here, as decompression is done on a per-compression-
 + * cluster basis rather than a per-bio basis.  Instead, we only must do two
 + * things for each compressed page here: call f2fs_end_read_compressed_page()
 + * with failed=true if an error occurred before it would have normally gotten
 + * called (i.e., I/O error or decryption error, but *not* verity error), and
 + * release the bio's reference to the decompress_io_ctx of the page's cluster.
 + */
  static void f2fs_finish_read_bio(struct bio *bio, bool in_task)
  {
        struct bio_vec *bv;
        struct bvec_iter_all iter_all;
 +      struct bio_post_read_ctx *ctx = bio->bi_private;
  
 -      /*
 -       * Update and unlock the bio's pagecache pages, and put the
 -       * decompression context for any compressed pages.
 -       */
        bio_for_each_segment_all(bv, bio, iter_all) {
                struct page *page = bv->bv_page;
  
                if (f2fs_is_compressed_page(page)) {
 -                      if (bio->bi_status)
 +                      if (ctx && !ctx->decompression_attempted)
                                f2fs_end_read_compressed_page(page, true, 0,
                                                        in_task);
                        f2fs_put_page_dic(page, in_task);
                        continue;
                }
  
 -              /* PG_error was set if verity failed. */
 -              if (bio->bi_status || PageError(page)) {
 +              if (bio->bi_status)
                        ClearPageUptodate(page);
 -                      /* will re-read again later */
 -                      ClearPageError(page);
 -              } else {
 +              else
                        SetPageUptodate(page);
 -              }
                dec_page_count(F2FS_P_SB(page), __read_io_type(page));
                unlock_page(page);
        }
  
 -      if (bio->bi_private)
 -              mempool_free(bio->bi_private, bio_post_read_ctx_pool);
 +      if (ctx)
 +              mempool_free(ctx, bio_post_read_ctx_pool);
        bio_put(bio);
  }
  
@@@ -198,10 -183,8 +196,10 @@@ static void f2fs_verify_bio(struct work
                        struct page *page = bv->bv_page;
  
                        if (!f2fs_is_compressed_page(page) &&
 -                          !fsverity_verify_page(page))
 -                              SetPageError(page);
 +                          !fsverity_verify_page(page)) {
 +                              bio->bi_status = BLK_STS_IOERR;
 +                              break;
 +                      }
                }
        } else {
                fsverity_verify_bio(bio);
@@@ -260,8 -243,6 +258,8 @@@ static void f2fs_handle_step_decompress
                blkaddr++;
        }
  
 +      ctx->decompression_attempted = true;
 +
        /*
         * Optimization: if all the bio's pages are compressed, then scheduling
         * the per-bio verity work is unnecessary, as verity will be fully
@@@ -1079,7 -1060,6 +1077,7 @@@ static struct bio *f2fs_grab_read_bio(s
                ctx->sbi = sbi;
                ctx->enabled_steps = post_read_steps;
                ctx->fs_blkaddr = blkaddr;
 +              ctx->decompression_attempted = false;
                bio->bi_private = ctx;
        }
        iostat_alloc_and_bind_ctx(sbi, bio, ctx);
@@@ -1107,6 -1087,7 +1105,6 @@@ static int f2fs_submit_page_read(struc
                bio_put(bio);
                return -EFAULT;
        }
 -      ClearPageError(page);
        inc_page_count(sbi, F2FS_RD_DATA);
        f2fs_update_iostat(sbi, NULL, FS_DATA_READ_IO, F2FS_BLKSIZE);
        __submit_bio(sbi, bio, DATA);
@@@ -1145,7 -1126,7 +1143,7 @@@ void f2fs_update_data_blkaddr(struct dn
  {
        dn->data_blkaddr = blkaddr;
        f2fs_set_data_blkaddr(dn);
-       f2fs_update_extent_cache(dn);
+       f2fs_update_read_extent_cache(dn);
  }
  
  /* dn->ofs_in_node will be returned with up-to-date last block pointer */
@@@ -1214,7 -1195,7 +1212,7 @@@ int f2fs_get_block(struct dnode_of_dat
        struct extent_info ei = {0, };
        struct inode *inode = dn->inode;
  
-       if (f2fs_lookup_extent_cache(inode, index, &ei)) {
+       if (f2fs_lookup_read_extent_cache(inode, index, &ei)) {
                dn->data_blkaddr = ei.blk + index - ei.fofs;
                return 0;
        }
  }
  
  struct page *f2fs_get_read_data_page(struct inode *inode, pgoff_t index,
-                                    blk_opf_t op_flags, bool for_write)
+                                    blk_opf_t op_flags, bool for_write,
+                                    pgoff_t *next_pgofs)
  {
        struct address_space *mapping = inode->i_mapping;
        struct dnode_of_data dn;
        if (!page)
                return ERR_PTR(-ENOMEM);
  
-       if (f2fs_lookup_extent_cache(inode, index, &ei)) {
+       if (f2fs_lookup_read_extent_cache(inode, index, &ei)) {
                dn.data_blkaddr = ei.blk + index - ei.fofs;
                if (!f2fs_is_valid_blkaddr(F2FS_I_SB(inode), dn.data_blkaddr,
                                                DATA_GENERIC_ENHANCE_READ)) {
  
        set_new_dnode(&dn, inode, NULL, NULL, 0);
        err = f2fs_get_dnode_of_data(&dn, index, LOOKUP_NODE);
-       if (err)
+       if (err) {
+               if (err == -ENOENT && next_pgofs)
+                       *next_pgofs = f2fs_get_next_page_offset(&dn, index);
                goto put_err;
+       }
        f2fs_put_dnode(&dn);
  
        if (unlikely(dn.data_blkaddr == NULL_ADDR)) {
                err = -ENOENT;
+               if (next_pgofs)
+                       *next_pgofs = index + 1;
                goto put_err;
        }
        if (dn.data_blkaddr != NEW_ADDR &&
@@@ -1298,7 -1285,8 +1302,8 @@@ put_err
        return ERR_PTR(err);
  }
  
- struct page *f2fs_find_data_page(struct inode *inode, pgoff_t index)
+ struct page *f2fs_find_data_page(struct inode *inode, pgoff_t index,
+                                       pgoff_t *next_pgofs)
  {
        struct address_space *mapping = inode->i_mapping;
        struct page *page;
                return page;
        f2fs_put_page(page, 0);
  
-       page = f2fs_get_read_data_page(inode, index, 0, false);
+       page = f2fs_get_read_data_page(inode, index, 0, false, next_pgofs);
        if (IS_ERR(page))
                return page;
  
@@@ -1334,7 -1322,7 +1339,7 @@@ struct page *f2fs_get_lock_data_page(st
        struct address_space *mapping = inode->i_mapping;
        struct page *page;
  repeat:
-       page = f2fs_get_read_data_page(inode, index, 0, for_write);
+       page = f2fs_get_read_data_page(inode, index, 0, for_write, NULL);
        if (IS_ERR(page))
                return page;
  
@@@ -1497,7 -1485,7 +1502,7 @@@ int f2fs_map_blocks(struct inode *inode
        pgofs = (pgoff_t)map->m_lblk;
        end = pgofs + maxblocks;
  
-       if (!create && f2fs_lookup_extent_cache(inode, pgofs, &ei)) {
+       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;
@@@ -1707,7 -1695,7 +1712,7 @@@ skip
                if (map->m_flags & F2FS_MAP_MAPPED) {
                        unsigned int ofs = start_pgofs - map->m_lblk;
  
-                       f2fs_update_extent_cache_range(&dn,
+                       f2fs_update_read_extent_cache_range(&dn,
                                start_pgofs, map->m_pblk + ofs,
                                map->m_len - ofs);
                }
@@@ -1752,7 -1740,7 +1757,7 @@@ sync_out
                if (map->m_flags & F2FS_MAP_MAPPED) {
                        unsigned int ofs = start_pgofs - map->m_lblk;
  
-                       f2fs_update_extent_cache_range(&dn,
+                       f2fs_update_read_extent_cache_range(&dn,
                                start_pgofs, map->m_pblk + ofs,
                                map->m_len - ofs);
                }
@@@ -2158,6 -2146,7 +2163,6 @@@ submit_and_realloc
        inc_page_count(F2FS_I_SB(inode), F2FS_RD_DATA);
        f2fs_update_iostat(F2FS_I_SB(inode), NULL, FS_DATA_READ_IO,
                                                        F2FS_BLKSIZE);
 -      ClearPageError(page);
        *last_block_in_bio = block_nr;
        goto out;
  out:
@@@ -2212,7 -2201,7 +2217,7 @@@ int f2fs_read_multi_pages(struct compre
        if (f2fs_cluster_is_empty(cc))
                goto out;
  
-       if (f2fs_lookup_extent_cache(inode, start_idx, &ei))
+       if (f2fs_lookup_read_extent_cache(inode, start_idx, &ei))
                from_dnode = false;
  
        if (!from_dnode)
@@@ -2305,6 -2294,7 +2310,6 @@@ submit_and_realloc
  
                inc_page_count(sbi, F2FS_RD_DATA);
                f2fs_update_iostat(sbi, inode, FS_DATA_READ_IO, F2FS_BLKSIZE);
 -              ClearPageError(page);
                *last_block_in_bio = blkaddr;
        }
  
@@@ -2321,6 -2311,7 +2326,6 @@@ out
        for (i = 0; i < cc->cluster_size; i++) {
                if (cc->rpages[i]) {
                        ClearPageUptodate(cc->rpages[i]);
 -                      ClearPageError(cc->rpages[i]);
                        unlock_page(cc->rpages[i]);
                }
        }
@@@ -2417,6 -2408,7 +2422,6 @@@ read_single_page
  #ifdef CONFIG_F2FS_FS_COMPRESSION
  set_error_page:
  #endif
 -                      SetPageError(page);
                        zero_user_segment(page, 0, PAGE_SIZE);
                        unlock_page(page);
                }
@@@ -2643,7 -2635,7 +2648,7 @@@ int f2fs_do_write_data_page(struct f2fs
                set_new_dnode(&dn, inode, NULL, NULL, 0);
  
        if (need_inplace_update(fio) &&
-                       f2fs_lookup_extent_cache(inode, page->index, &ei)) {
+           f2fs_lookup_read_extent_cache(inode, page->index, &ei)) {
                fio->old_blkaddr = ei.blk + page->index - ei.fofs;
  
                if (!f2fs_is_valid_blkaddr(fio->sbi, fio->old_blkaddr,
@@@ -3367,7 -3359,7 +3372,7 @@@ restart
        } else if (locked) {
                err = f2fs_get_block(&dn, index);
        } else {
-               if (f2fs_lookup_extent_cache(inode, index, &ei)) {
+               if (f2fs_lookup_read_extent_cache(inode, index, &ei)) {
                        dn.data_blkaddr = ei.blk + index - ei.fofs;
                } else {
                        /* hole case */
@@@ -3408,7 -3400,7 +3413,7 @@@ static int __find_data_block(struct ino
  
        set_new_dnode(&dn, inode, ipage, ipage, 0);
  
-       if (f2fs_lookup_extent_cache(inode, index, &ei)) {
+       if (f2fs_lookup_read_extent_cache(inode, index, &ei)) {
                dn.data_blkaddr = ei.blk + index - ei.fofs;
        } else {
                /* hole case */
@@@ -3472,6 -3464,9 +3477,9 @@@ static int prepare_atomic_write_begin(s
        else if (*blk_addr != NULL_ADDR)
                return 0;
  
+       if (is_inode_flag_set(inode, FI_ATOMIC_REPLACE))
+               goto reserve_block;
        /* Look for the block in the original inode */
        err = __find_data_block(inode, index, &ori_blk_addr);
        if (err)
@@@ -4093,9 -4088,7 +4101,7 @@@ int f2fs_init_post_read_wq(struct f2fs_
        sbi->post_read_wq = alloc_workqueue("f2fs_post_read_wq",
                                                 WQ_UNBOUND | WQ_HIGHPRI,
                                                 num_online_cpus());
-       if (!sbi->post_read_wq)
-               return -ENOMEM;
-       return 0;
+       return sbi->post_read_wq ? 0 : -ENOMEM;
  }
  
  void f2fs_destroy_post_read_wq(struct f2fs_sb_info *sbi)
@@@ -4108,9 -4101,7 +4114,7 @@@ int __init f2fs_init_bio_entry_cache(vo
  {
        bio_entry_slab = f2fs_kmem_cache_create("f2fs_bio_entry_slab",
                        sizeof(struct bio_entry));
-       if (!bio_entry_slab)
-               return -ENOMEM;
-       return 0;
+       return bio_entry_slab ? 0 : -ENOMEM;
  }
  
  void f2fs_destroy_bio_entry_cache(void)
diff --combined fs/f2fs/file.c
index 83df6f6173d3168f8f4381177e1cc7d6e504799c,56c23b5e9d658d25e95f5dff607d1193933d0bf1..a6c4012798860098bfab8010a8f032df6a59bcad
@@@ -571,7 -571,7 +571,7 @@@ void f2fs_truncate_data_blocks_range(st
        raw_node = F2FS_NODE(dn->node_page);
        addr = blkaddr_in_node(raw_node) + base + ofs;
  
-       /* Assumption: truncateion starts with cluster */
+       /* Assumption: truncation starts with cluster */
        for (; count > 0; count--, addr++, dn->ofs_in_node++, cluster_index++) {
                block_t blkaddr = le32_to_cpu(*addr);
  
                 */
                fofs = f2fs_start_bidx_of_node(ofs_of_node(dn->node_page),
                                                        dn->inode) + ofs;
-               f2fs_update_extent_cache_range(dn, fofs, 0, len);
+               f2fs_update_read_extent_cache_range(dn, fofs, 0, len);
+               f2fs_update_age_extent_cache_range(dn, fofs, nr_free);
                dec_valid_block_count(sbi, dn->inode, nr_free);
        }
        dn->ofs_in_node = ofs;
@@@ -1025,7 -1026,7 +1026,7 @@@ int f2fs_setattr(struct user_namespace 
        __setattr_copy(mnt_userns, inode, attr);
  
        if (attr->ia_valid & ATTR_MODE) {
 -              err = posix_acl_chmod(mnt_userns, inode, f2fs_get_inode_mode(inode));
 +              err = posix_acl_chmod(mnt_userns, dentry, f2fs_get_inode_mode(inode));
  
                if (is_inode_flag_set(inode, FI_ACL_MODE)) {
                        if (!err)
  const struct inode_operations f2fs_file_inode_operations = {
        .getattr        = f2fs_getattr,
        .setattr        = f2fs_setattr,
 -      .get_acl        = f2fs_get_acl,
 +      .get_inode_acl  = f2fs_get_acl,
        .set_acl        = f2fs_set_acl,
        .listxattr      = f2fs_listxattr,
        .fiemap         = f2fs_fiemap,
@@@ -1496,7 -1497,7 +1497,7 @@@ static int f2fs_do_zero_range(struct dn
                f2fs_set_data_blkaddr(dn);
        }
  
-       f2fs_update_extent_cache_range(dn, start, 0, index - start);
+       f2fs_update_read_extent_cache_range(dn, start, 0, index - start);
  
        return ret;
  }
@@@ -1915,6 -1916,10 +1916,10 @@@ static int f2fs_setflags_common(struct 
                        if (!f2fs_disable_compressed_file(inode))
                                return -EINVAL;
                } else {
+                       /* try to convert inline_data to support compression */
+                       int err = f2fs_convert_inline_inode(inode);
+                       if (err)
+                               return err;
                        if (!f2fs_may_compress(inode))
                                return -EINVAL;
                        if (S_ISREG(inode->i_mode) && F2FS_HAS_BLOCKS(inode))
@@@ -2030,13 -2035,14 +2035,14 @@@ static int f2fs_ioc_getversion(struct f
        return put_user(inode->i_generation, (int __user *)arg);
  }
  
- static int f2fs_ioc_start_atomic_write(struct file *filp)
+ 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 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))
                f2fs_up_write(&fi->i_gc_rwsem[WRITE]);
                goto out;
        }
-       f2fs_i_size_write(fi->cow_inode, i_size_read(inode));
+       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;
+       if (truncate) {
+               set_inode_flag(inode, FI_ATOMIC_REPLACE);
+               truncate_inode_pages_final(inode->i_mapping);
+               f2fs_i_size_write(inode, 0);
+               isize = 0;
+       }
+       f2fs_i_size_write(fi->cow_inode, isize);
        f2fs_up_write(&fi->i_gc_rwsem[WRITE]);
  
        f2fs_update_time(sbi, REQ_TIME);
@@@ -2133,16 -2151,14 +2151,14 @@@ static int f2fs_ioc_commit_atomic_write
  
        if (f2fs_is_atomic_file(inode)) {
                ret = f2fs_commit_atomic_write(inode);
-               if (ret)
-                       goto unlock_out;
-               ret = f2fs_do_sync_file(filp, 0, LLONG_MAX, 0, true);
                if (!ret)
-                       f2fs_abort_atomic_write(inode, false);
+                       ret = f2fs_do_sync_file(filp, 0, LLONG_MAX, 0, true);
+               f2fs_abort_atomic_write(inode, ret);
        } else {
                ret = f2fs_do_sync_file(filp, 0, LLONG_MAX, 1, false);
        }
- unlock_out:
        inode_unlock(inode);
        mnt_drop_write_file(filp);
        return ret;
@@@ -2543,7 -2559,7 +2559,7 @@@ static int f2fs_defragment_range(struc
        struct f2fs_map_blocks map = { .m_next_extent = NULL,
                                        .m_seg_type = NO_CHECK_TYPE,
                                        .m_may_create = false };
-       struct extent_info ei = {0, 0, 0};
+       struct extent_info ei = {0, };
        pgoff_t pg_start, pg_end, next_pgofs;
        unsigned int blk_per_seg = sbi->blocks_per_seg;
        unsigned int total = 0, sec_num;
         * lookup mapping info in extent cache, skip defragmenting if physical
         * block addresses are continuous.
         */
-       if (f2fs_lookup_extent_cache(inode, pg_start, &ei)) {
+       if (f2fs_lookup_read_extent_cache(inode, pg_start, &ei)) {
                if (ei.fofs + ei.len >= pg_end)
                        goto out;
        }
@@@ -4131,7 -4147,9 +4147,9 @@@ static long __f2fs_ioctl(struct file *f
        case FS_IOC_GETVERSION:
                return f2fs_ioc_getversion(filp, arg);
        case F2FS_IOC_START_ATOMIC_WRITE:
-               return f2fs_ioc_start_atomic_write(filp);
+               return f2fs_ioc_start_atomic_write(filp, false);
+       case F2FS_IOC_START_ATOMIC_REPLACE:
+               return f2fs_ioc_start_atomic_write(filp, true);
        case F2FS_IOC_COMMIT_ATOMIC_WRITE:
                return f2fs_ioc_commit_atomic_write(filp);
        case F2FS_IOC_ABORT_ATOMIC_WRITE:
diff --combined fs/f2fs/gc.c
index 536d332d9e2edee152f49c95be6851bc4cd37b60,d7a9d84ba57c1a128ab2d9d86c6d424bab9cf534..6e2cae3d2e717ae1d042f48bd748b9645f68e2c7
@@@ -96,16 -96,6 +96,6 @@@ static int gc_thread_func(void *data
                 * invalidated soon after by user update or deletion.
                 * So, I'd like to wait some time to collect dirty segments.
                 */
-               if (sbi->gc_mode == GC_URGENT_HIGH) {
-                       spin_lock(&sbi->gc_urgent_high_lock);
-                       if (sbi->gc_urgent_high_remaining) {
-                               sbi->gc_urgent_high_remaining--;
-                               if (!sbi->gc_urgent_high_remaining)
-                                       sbi->gc_mode = GC_NORMAL;
-                       }
-                       spin_unlock(&sbi->gc_urgent_high_lock);
-               }
                if (sbi->gc_mode == GC_URGENT_HIGH ||
                                sbi->gc_mode == GC_URGENT_MID) {
                        wait_ms = gc_th->urgent_sleep_time;
@@@ -151,6 -141,10 +141,10 @@@ do_gc
                        /* don't bother wait_ms by foreground gc */
                        if (!foreground)
                                wait_ms = gc_th->no_gc_sleep_time;
+               } else {
+                       /* reset wait_ms to default sleep time */
+                       if (wait_ms == gc_th->no_gc_sleep_time)
+                               wait_ms = gc_th->min_sleep_time;
                }
  
                if (foreground)
                /* balancing f2fs's metadata periodically */
                f2fs_balance_fs_bg(sbi, true);
  next:
+               if (sbi->gc_mode != GC_NORMAL) {
+                       spin_lock(&sbi->gc_remaining_trials_lock);
+                       if (sbi->gc_remaining_trials) {
+                               sbi->gc_remaining_trials--;
+                               if (!sbi->gc_remaining_trials)
+                                       sbi->gc_mode = GC_NORMAL;
+                       }
+                       spin_unlock(&sbi->gc_remaining_trials_lock);
+               }
                sb_end_write(sbi->sb);
  
        } while (!kthread_should_stop());
@@@ -172,13 -175,10 +175,10 @@@ int f2fs_start_gc_thread(struct f2fs_sb
  {
        struct f2fs_gc_kthread *gc_th;
        dev_t dev = sbi->sb->s_bdev->bd_dev;
-       int err = 0;
  
        gc_th = f2fs_kmalloc(sbi, sizeof(struct f2fs_gc_kthread), GFP_KERNEL);
-       if (!gc_th) {
-               err = -ENOMEM;
-               goto out;
-       }
+       if (!gc_th)
+               return -ENOMEM;
  
        gc_th->urgent_sleep_time = DEF_GC_THREAD_URGENT_SLEEP_TIME;
        gc_th->min_sleep_time = DEF_GC_THREAD_MIN_SLEEP_TIME;
        sbi->gc_thread->f2fs_gc_task = kthread_run(gc_thread_func, sbi,
                        "f2fs_gc-%u:%u", MAJOR(dev), MINOR(dev));
        if (IS_ERR(gc_th->f2fs_gc_task)) {
-               err = PTR_ERR(gc_th->f2fs_gc_task);
+               int err = PTR_ERR(gc_th->f2fs_gc_task);
                kfree(gc_th);
                sbi->gc_thread = NULL;
+               return err;
        }
- out:
-       return err;
+       return 0;
  }
  
  void f2fs_stop_gc_thread(struct f2fs_sb_info *sbi)
@@@ -282,7 -284,7 +284,7 @@@ static void select_policy(struct f2fs_s
  
        /* let's select beginning hot/small space first in no_heap mode*/
        if (f2fs_need_rand_seg(sbi))
 -              p->offset = prandom_u32_max(MAIN_SECS(sbi) * sbi->segs_per_sec);
 +              p->offset = get_random_u32_below(MAIN_SECS(sbi) * sbi->segs_per_sec);
        else if (test_opt(sbi, NOHEAP) &&
                (type == CURSEG_HOT_DATA || IS_NODESEG(type)))
                p->offset = 0;
@@@ -1079,7 -1081,7 +1081,7 @@@ static bool is_alive(struct f2fs_sb_inf
  {
        struct page *node_page;
        nid_t nid;
-       unsigned int ofs_in_node, max_addrs;
+       unsigned int ofs_in_node, max_addrs, base;
        block_t source_blkaddr;
  
        nid = le32_to_cpu(sum->nid);
                return false;
        }
  
-       max_addrs = IS_INODE(node_page) ? DEF_ADDRS_PER_INODE :
-                                               DEF_ADDRS_PER_BLOCK;
-       if (ofs_in_node >= max_addrs) {
-               f2fs_err(sbi, "Inconsistent ofs_in_node:%u in summary, ino:%u, nid:%u, max:%u",
-                       ofs_in_node, dni->ino, dni->nid, max_addrs);
+       if (IS_INODE(node_page)) {
+               base = offset_in_addr(F2FS_INODE(node_page));
+               max_addrs = DEF_ADDRS_PER_INODE;
+       } else {
+               base = 0;
+               max_addrs = DEF_ADDRS_PER_BLOCK;
+       }
+       if (base + ofs_in_node >= max_addrs) {
+               f2fs_err(sbi, "Inconsistent blkaddr offset: base:%u, ofs_in_node:%u, max:%u, ino:%u, nid:%u",
+                       base, ofs_in_node, max_addrs, dni->ino, dni->nid);
+               f2fs_put_page(node_page, 1);
                return false;
        }
  
@@@ -1141,7 -1150,7 +1150,7 @@@ static int ra_data_block(struct inode *
        struct address_space *mapping = inode->i_mapping;
        struct dnode_of_data dn;
        struct page *page;
-       struct extent_info ei = {0, 0, 0};
+       struct extent_info ei = {0, };
        struct f2fs_io_info fio = {
                .sbi = sbi,
                .ino = inode->i_ino,
        if (!page)
                return -ENOMEM;
  
-       if (f2fs_lookup_extent_cache(inode, index, &ei)) {
+       if (f2fs_lookup_read_extent_cache(inode, index, &ei)) {
                dn.data_blkaddr = ei.blk + index - ei.fofs;
                if (unlikely(!f2fs_is_valid_blkaddr(sbi, dn.data_blkaddr,
                                                DATA_GENERIC_ENHANCE_READ))) {
@@@ -1563,8 -1572,8 +1572,8 @@@ next_step
                                continue;
                        }
  
-                       data_page = f2fs_get_read_data_page(inode,
-                                               start_bidx, REQ_RAHEAD, true);
+                       data_page = f2fs_get_read_data_page(inode, start_bidx,
+                                                       REQ_RAHEAD, true, NULL);
                        f2fs_up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
                        if (IS_ERR(data_page)) {
                                iput(inode);
@@@ -1744,8 -1753,9 +1753,9 @@@ freed
                                get_valid_blocks(sbi, segno, false) == 0)
                        seg_freed++;
  
-               if (__is_large_section(sbi) && segno + 1 < end_segno)
-                       sbi->next_victim_seg[gc_type] = segno + 1;
+               if (__is_large_section(sbi))
+                       sbi->next_victim_seg[gc_type] =
+                               (segno + 1 < end_segno) ? segno + 1 : NULL_SEGNO;
  skip:
                f2fs_put_page(sum_page, 0);
        }
@@@ -1898,9 -1908,7 +1908,7 @@@ int __init f2fs_create_garbage_collecti
  {
        victim_entry_slab = f2fs_kmem_cache_create("f2fs_victim_entry",
                                        sizeof(struct victim_entry));
-       if (!victim_entry_slab)
-               return -ENOMEM;
-       return 0;
+       return victim_entry_slab ? 0 : -ENOMEM;
  }
  
  void f2fs_destroy_garbage_collection_cache(void)
@@@ -2133,8 -2141,6 +2141,6 @@@ out_unlock
        if (err)
                return err;
  
-       set_sbi_flag(sbi, SBI_IS_RESIZEFS);
        freeze_super(sbi->sb);
        f2fs_down_write(&sbi->gc_lock);
        f2fs_down_write(&sbi->cp_global_sem);
        if (err)
                goto out_err;
  
+       set_sbi_flag(sbi, SBI_IS_RESIZEFS);
        err = free_segment_range(sbi, secs, false);
        if (err)
                goto recover_out;
                f2fs_commit_super(sbi, false);
        }
  recover_out:
+       clear_sbi_flag(sbi, SBI_IS_RESIZEFS);
        if (err) {
                set_sbi_flag(sbi, SBI_NEED_FSCK);
                f2fs_err(sbi, "resize_fs failed, should run fsck to repair!");
@@@ -2185,6 -2193,5 +2193,5 @@@ out_err
        f2fs_up_write(&sbi->cp_global_sem);
        f2fs_up_write(&sbi->gc_lock);
        thaw_super(sbi->sb);
-       clear_sbi_flag(sbi, SBI_IS_RESIZEFS);
        return err;
  }
diff --combined fs/f2fs/namei.c
index c227113b0f2621d77fa26432807e6e47d94fd263,46de782c2baaa31277420499e393fe2c39ad1b5c..6032589099ce40ce2a59772cfb4bfdb0932f1116
  #include "acl.h"
  #include <trace/events/f2fs.h>
  
- static struct inode *f2fs_new_inode(struct user_namespace *mnt_userns,
-                                               struct inode *dir, umode_t mode)
- {
-       struct f2fs_sb_info *sbi = F2FS_I_SB(dir);
-       nid_t ino;
-       struct inode *inode;
-       bool nid_free = false;
-       bool encrypt = false;
-       int xattr_size = 0;
-       int err;
-       inode = new_inode(dir->i_sb);
-       if (!inode)
-               return ERR_PTR(-ENOMEM);
-       if (!f2fs_alloc_nid(sbi, &ino)) {
-               err = -ENOSPC;
-               goto fail;
-       }
-       nid_free = true;
-       inode_init_owner(mnt_userns, inode, dir, mode);
-       inode->i_ino = ino;
-       inode->i_blocks = 0;
-       inode->i_mtime = inode->i_atime = inode->i_ctime = current_time(inode);
-       F2FS_I(inode)->i_crtime = inode->i_mtime;
-       inode->i_generation = get_random_u32();
-       if (S_ISDIR(inode->i_mode))
-               F2FS_I(inode)->i_current_depth = 1;
-       err = insert_inode_locked(inode);
-       if (err) {
-               err = -EINVAL;
-               goto fail;
-       }
-       if (f2fs_sb_has_project_quota(sbi) &&
-               (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_DEF_PROJID);
-       err = fscrypt_prepare_new_inode(dir, inode, &encrypt);
-       if (err)
-               goto fail_drop;
-       err = f2fs_dquot_initialize(inode);
-       if (err)
-               goto fail_drop;
-       set_inode_flag(inode, FI_NEW_INODE);
-       if (encrypt)
-               f2fs_set_encrypted_inode(inode);
-       if (f2fs_sb_has_extra_attr(sbi)) {
-               set_inode_flag(inode, FI_EXTRA_ATTR);
-               F2FS_I(inode)->i_extra_isize = F2FS_TOTAL_EXTRA_ATTR_SIZE;
-       }
-       if (test_opt(sbi, INLINE_XATTR))
-               set_inode_flag(inode, FI_INLINE_XATTR);
-       if (f2fs_may_inline_dentry(inode))
-               set_inode_flag(inode, FI_INLINE_DENTRY);
-       if (f2fs_sb_has_flexible_inline_xattr(sbi)) {
-               f2fs_bug_on(sbi, !f2fs_has_extra_attr(inode));
-               if (f2fs_has_inline_xattr(inode))
-                       xattr_size = F2FS_OPTION(sbi).inline_xattr_size;
-               /* Otherwise, will be 0 */
-       } else if (f2fs_has_inline_xattr(inode) ||
-                               f2fs_has_inline_dentry(inode)) {
-               xattr_size = DEFAULT_INLINE_XATTR_ADDRS;
-       }
-       F2FS_I(inode)->i_inline_xattr_size = xattr_size;
-       f2fs_init_extent_tree(inode, NULL);
-       F2FS_I(inode)->i_flags =
-               f2fs_mask_flags(mode, F2FS_I(dir)->i_flags & F2FS_FL_INHERITED);
-       if (S_ISDIR(inode->i_mode))
-               F2FS_I(inode)->i_flags |= F2FS_INDEX_FL;
-       if (F2FS_I(inode)->i_flags & F2FS_PROJINHERIT_FL)
-               set_inode_flag(inode, FI_PROJ_INHERIT);
-       if (f2fs_sb_has_compression(sbi)) {
-               /* Inherit the compression flag in directory */
-               if ((F2FS_I(dir)->i_flags & F2FS_COMPR_FL) &&
-                                       f2fs_may_compress(inode))
-                       set_compress_context(inode);
-       }
-       /* Should enable inline_data after compression set */
-       if (test_opt(sbi, INLINE_DATA) && f2fs_may_inline_data(inode))
-               set_inode_flag(inode, FI_INLINE_DATA);
-       stat_inc_inline_xattr(inode);
-       stat_inc_inline_inode(inode);
-       stat_inc_inline_dir(inode);
-       f2fs_set_inode_flags(inode);
-       trace_f2fs_new_inode(inode, 0);
-       return inode;
- fail:
-       trace_f2fs_new_inode(inode, err);
-       make_bad_inode(inode);
-       if (nid_free)
-               set_inode_flag(inode, FI_FREE_NID);
-       iput(inode);
-       return ERR_PTR(err);
- fail_drop:
-       trace_f2fs_new_inode(inode, err);
-       dquot_drop(inode);
-       inode->i_flags |= S_NOQUOTA;
-       if (nid_free)
-               set_inode_flag(inode, FI_FREE_NID);
-       clear_nlink(inode);
-       unlock_new_inode(inode);
-       iput(inode);
-       return ERR_PTR(err);
- }
  static inline int is_extension_exist(const unsigned char *s, const char *sub,
                                                bool tmp_ext)
  {
        return 0;
  }
  
- /*
-  * Set file's temperature for hot/cold data separation
-  */
- static inline void set_file_temperature(struct f2fs_sb_info *sbi, struct inode *inode,
-               const unsigned char *name)
- {
-       __u8 (*extlist)[F2FS_EXTENSION_LEN] = sbi->raw_super->extension_list;
-       int i, cold_count, hot_count;
-       f2fs_down_read(&sbi->sb_lock);
-       cold_count = le32_to_cpu(sbi->raw_super->extension_count);
-       hot_count = sbi->raw_super->hot_ext_count;
-       for (i = 0; i < cold_count + hot_count; i++) {
-               if (is_extension_exist(name, extlist[i], true))
-                       break;
-       }
-       f2fs_up_read(&sbi->sb_lock);
-       if (i == cold_count + hot_count)
-               return;
-       if (i < cold_count)
-               file_set_cold(inode);
-       else
-               file_set_hot(inode);
- }
  int f2fs_update_extension_list(struct f2fs_sb_info *sbi, const char *name,
                                                        bool hot, bool set)
  {
        return 0;
  }
  
- static void set_compress_inode(struct f2fs_sb_info *sbi, struct inode *inode,
-                                               const unsigned char *name)
+ static void set_compress_new_inode(struct f2fs_sb_info *sbi, struct inode *dir,
+                               struct inode *inode, const unsigned char *name)
  {
        __u8 (*extlist)[F2FS_EXTENSION_LEN] = sbi->raw_super->extension_list;
-       unsigned char (*noext)[F2FS_EXTENSION_LEN] = F2FS_OPTION(sbi).noextensions;
+       unsigned char (*noext)[F2FS_EXTENSION_LEN] =
+                                               F2FS_OPTION(sbi).noextensions;
        unsigned char (*ext)[F2FS_EXTENSION_LEN] = F2FS_OPTION(sbi).extensions;
        unsigned char ext_cnt = F2FS_OPTION(sbi).compress_ext_cnt;
        unsigned char noext_cnt = F2FS_OPTION(sbi).nocompress_ext_cnt;
        int i, cold_count, hot_count;
  
-       if (!f2fs_sb_has_compression(sbi) ||
-                       F2FS_I(inode)->i_flags & F2FS_NOCOMP_FL ||
-                       !f2fs_may_compress(inode) ||
-                       (!ext_cnt && !noext_cnt))
+       if (!f2fs_sb_has_compression(sbi))
                return;
  
-       f2fs_down_read(&sbi->sb_lock);
+       if (S_ISDIR(inode->i_mode))
+               goto inherit_comp;
  
+       /* This name comes only from normal files. */
+       if (!name)
+               return;
+       /* Don't compress hot files. */
+       f2fs_down_read(&sbi->sb_lock);
        cold_count = le32_to_cpu(sbi->raw_super->extension_count);
        hot_count = sbi->raw_super->hot_ext_count;
+       for (i = cold_count; i < cold_count + hot_count; i++)
+               if (is_extension_exist(name, extlist[i], false))
+                       break;
+       f2fs_up_read(&sbi->sb_lock);
+       if (i < (cold_count + hot_count))
+               return;
+       /* Don't compress unallowed extension. */
+       for (i = 0; i < noext_cnt; i++)
+               if (is_extension_exist(name, noext[i], false))
+                       return;
  
-       for (i = cold_count; i < cold_count + hot_count; i++) {
-               if (is_extension_exist(name, extlist[i], false)) {
-                       f2fs_up_read(&sbi->sb_lock);
+       /* Compress wanting extension. */
+       for (i = 0; i < ext_cnt; i++) {
+               if (is_extension_exist(name, ext[i], false)) {
+                       set_compress_context(inode);
                        return;
                }
        }
+ inherit_comp:
+       /* Inherit the {no-}compression flag in directory */
+       if (F2FS_I(dir)->i_flags & F2FS_NOCOMP_FL) {
+               F2FS_I(inode)->i_flags |= F2FS_NOCOMP_FL;
+               f2fs_mark_inode_dirty_sync(inode, true);
+       } else if (F2FS_I(dir)->i_flags & F2FS_COMPR_FL) {
+               set_compress_context(inode);
+       }
+ }
+ /*
+  * Set file's temperature for hot/cold data separation
+  */
+ static void set_file_temperature(struct f2fs_sb_info *sbi, struct inode *inode,
+               const unsigned char *name)
+ {
+       __u8 (*extlist)[F2FS_EXTENSION_LEN] = sbi->raw_super->extension_list;
+       int i, cold_count, hot_count;
  
+       f2fs_down_read(&sbi->sb_lock);
+       cold_count = le32_to_cpu(sbi->raw_super->extension_count);
+       hot_count = sbi->raw_super->hot_ext_count;
+       for (i = 0; i < cold_count + hot_count; i++)
+               if (is_extension_exist(name, extlist[i], true))
+                       break;
        f2fs_up_read(&sbi->sb_lock);
  
-       for (i = 0; i < noext_cnt; i++) {
-               if (is_extension_exist(name, noext[i], false)) {
-                       f2fs_disable_compressed_file(inode);
-                       return;
-               }
+       if (i == cold_count + hot_count)
+               return;
+       if (i < cold_count)
+               file_set_cold(inode);
+       else
+               file_set_hot(inode);
+ }
+ static struct inode *f2fs_new_inode(struct user_namespace *mnt_userns,
+                                               struct inode *dir, umode_t mode,
+                                               const char *name)
+ {
+       struct f2fs_sb_info *sbi = F2FS_I_SB(dir);
+       nid_t ino;
+       struct inode *inode;
+       bool nid_free = false;
+       bool encrypt = false;
+       int xattr_size = 0;
+       int err;
+       inode = new_inode(dir->i_sb);
+       if (!inode)
+               return ERR_PTR(-ENOMEM);
+       if (!f2fs_alloc_nid(sbi, &ino)) {
+               err = -ENOSPC;
+               goto fail;
        }
  
-       if (is_inode_flag_set(inode, FI_COMPRESSED_FILE))
-               return;
+       nid_free = true;
  
-       for (i = 0; i < ext_cnt; i++) {
-               if (!is_extension_exist(name, ext[i], false))
-                       continue;
+       inode_init_owner(mnt_userns, inode, dir, mode);
  
-               /* Do not use inline_data with compression */
-               stat_dec_inline_inode(inode);
-               clear_inode_flag(inode, FI_INLINE_DATA);
-               set_compress_context(inode);
-               return;
+       inode->i_ino = ino;
+       inode->i_blocks = 0;
+       inode->i_mtime = inode->i_atime = inode->i_ctime = current_time(inode);
+       F2FS_I(inode)->i_crtime = inode->i_mtime;
+       inode->i_generation = get_random_u32();
+       if (S_ISDIR(inode->i_mode))
+               F2FS_I(inode)->i_current_depth = 1;
+       err = insert_inode_locked(inode);
+       if (err) {
+               err = -EINVAL;
+               goto fail;
+       }
+       if (f2fs_sb_has_project_quota(sbi) &&
+               (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_DEF_PROJID);
+       err = fscrypt_prepare_new_inode(dir, inode, &encrypt);
+       if (err)
+               goto fail_drop;
+       err = f2fs_dquot_initialize(inode);
+       if (err)
+               goto fail_drop;
+       set_inode_flag(inode, FI_NEW_INODE);
+       if (encrypt)
+               f2fs_set_encrypted_inode(inode);
+       if (f2fs_sb_has_extra_attr(sbi)) {
+               set_inode_flag(inode, FI_EXTRA_ATTR);
+               F2FS_I(inode)->i_extra_isize = F2FS_TOTAL_EXTRA_ATTR_SIZE;
+       }
+       if (test_opt(sbi, INLINE_XATTR))
+               set_inode_flag(inode, FI_INLINE_XATTR);
+       if (f2fs_may_inline_dentry(inode))
+               set_inode_flag(inode, FI_INLINE_DENTRY);
+       if (f2fs_sb_has_flexible_inline_xattr(sbi)) {
+               f2fs_bug_on(sbi, !f2fs_has_extra_attr(inode));
+               if (f2fs_has_inline_xattr(inode))
+                       xattr_size = F2FS_OPTION(sbi).inline_xattr_size;
+               /* Otherwise, will be 0 */
+       } else if (f2fs_has_inline_xattr(inode) ||
+                               f2fs_has_inline_dentry(inode)) {
+               xattr_size = DEFAULT_INLINE_XATTR_ADDRS;
        }
+       F2FS_I(inode)->i_inline_xattr_size = xattr_size;
+       F2FS_I(inode)->i_flags =
+               f2fs_mask_flags(mode, F2FS_I(dir)->i_flags & F2FS_FL_INHERITED);
+       if (S_ISDIR(inode->i_mode))
+               F2FS_I(inode)->i_flags |= F2FS_INDEX_FL;
+       if (F2FS_I(inode)->i_flags & F2FS_PROJINHERIT_FL)
+               set_inode_flag(inode, FI_PROJ_INHERIT);
+       /* Check compression first. */
+       set_compress_new_inode(sbi, dir, inode, name);
+       /* Should enable inline_data after compression set */
+       if (test_opt(sbi, INLINE_DATA) && f2fs_may_inline_data(inode))
+               set_inode_flag(inode, FI_INLINE_DATA);
+       if (name && !test_opt(sbi, DISABLE_EXT_IDENTIFY))
+               set_file_temperature(sbi, inode, name);
+       stat_inc_inline_xattr(inode);
+       stat_inc_inline_inode(inode);
+       stat_inc_inline_dir(inode);
+       f2fs_set_inode_flags(inode);
+       f2fs_init_extent_tree(inode);
+       trace_f2fs_new_inode(inode, 0);
+       return inode;
+ fail:
+       trace_f2fs_new_inode(inode, err);
+       make_bad_inode(inode);
+       if (nid_free)
+               set_inode_flag(inode, FI_FREE_NID);
+       iput(inode);
+       return ERR_PTR(err);
+ fail_drop:
+       trace_f2fs_new_inode(inode, err);
+       dquot_drop(inode);
+       inode->i_flags |= S_NOQUOTA;
+       if (nid_free)
+               set_inode_flag(inode, FI_FREE_NID);
+       clear_nlink(inode);
+       unlock_new_inode(inode);
+       iput(inode);
+       return ERR_PTR(err);
  }
  
  static int f2fs_create(struct user_namespace *mnt_userns, struct inode *dir,
        if (err)
                return err;
  
-       inode = f2fs_new_inode(mnt_userns, dir, mode);
+       inode = f2fs_new_inode(mnt_userns, dir, mode, dentry->d_name.name);
        if (IS_ERR(inode))
                return PTR_ERR(inode);
  
-       if (!test_opt(sbi, DISABLE_EXT_IDENTIFY))
-               set_file_temperature(sbi, inode, dentry->d_name.name);
-       set_compress_inode(sbi, inode, dentry->d_name.name);
        inode->i_op = &f2fs_file_inode_operations;
        inode->i_fop = &f2fs_file_operations;
        inode->i_mapping->a_ops = &f2fs_dblock_aops;
@@@ -632,6 -625,8 +625,8 @@@ static int f2fs_unlink(struct inode *di
                goto fail;
        }
        f2fs_delete_entry(de, page, dir, inode);
+       f2fs_unlock_op(sbi);
  #if IS_ENABLED(CONFIG_UNICODE)
        /* VFS negative dentries are incompatible with Encoding and
         * Case-insensitiveness. Eventually we'll want avoid
        if (IS_CASEFOLDED(dir))
                d_invalidate(dentry);
  #endif
-       f2fs_unlock_op(sbi);
        if (IS_DIRSYNC(dir))
                f2fs_sync_fs(sbi->sb, 1);
  fail:
@@@ -689,7 -682,7 +682,7 @@@ static int f2fs_symlink(struct user_nam
        if (err)
                return err;
  
-       inode = f2fs_new_inode(mnt_userns, dir, S_IFLNK | S_IRWXUGO);
+       inode = f2fs_new_inode(mnt_userns, dir, S_IFLNK | S_IRWXUGO, NULL);
        if (IS_ERR(inode))
                return PTR_ERR(inode);
  
@@@ -760,7 -753,7 +753,7 @@@ static int f2fs_mkdir(struct user_names
        if (err)
                return err;
  
-       inode = f2fs_new_inode(mnt_userns, dir, S_IFDIR | mode);
+       inode = f2fs_new_inode(mnt_userns, dir, S_IFDIR | mode, NULL);
        if (IS_ERR(inode))
                return PTR_ERR(inode);
  
@@@ -817,7 -810,7 +810,7 @@@ static int f2fs_mknod(struct user_names
        if (err)
                return err;
  
-       inode = f2fs_new_inode(mnt_userns, dir, mode);
+       inode = f2fs_new_inode(mnt_userns, dir, mode, NULL);
        if (IS_ERR(inode))
                return PTR_ERR(inode);
  
@@@ -856,7 -849,7 +849,7 @@@ static int __f2fs_tmpfile(struct user_n
        if (err)
                return err;
  
-       inode = f2fs_new_inode(mnt_userns, dir, mode);
+       inode = f2fs_new_inode(mnt_userns, dir, mode, NULL);
        if (IS_ERR(inode))
                return PTR_ERR(inode);
  
@@@ -1379,7 -1372,7 +1372,7 @@@ const struct inode_operations f2fs_dir_
        .tmpfile        = f2fs_tmpfile,
        .getattr        = f2fs_getattr,
        .setattr        = f2fs_setattr,
 -      .get_acl        = f2fs_get_acl,
 +      .get_inode_acl  = f2fs_get_acl,
        .set_acl        = f2fs_set_acl,
        .listxattr      = f2fs_listxattr,
        .fiemap         = f2fs_fiemap,
@@@ -1397,7 -1390,7 +1390,7 @@@ const struct inode_operations f2fs_syml
  const struct inode_operations f2fs_special_inode_operations = {
        .getattr        = f2fs_getattr,
        .setattr        = f2fs_setattr,
 -      .get_acl        = f2fs_get_acl,
 +      .get_inode_acl  = f2fs_get_acl,
        .set_acl        = f2fs_set_acl,
        .listxattr      = f2fs_listxattr,
  };
diff --combined fs/f2fs/segment.c
index b304692c0cf5014ef02073eaaf1abd725e4074a7,a9099a754dd2e2f081b975873fdb2488e19518d8..25ddea478fc1a8a628bf4e59d10584836a96052e
@@@ -192,14 -192,19 +192,19 @@@ void f2fs_abort_atomic_write(struct ino
        if (!f2fs_is_atomic_file(inode))
                return;
  
-       if (clean)
-               truncate_inode_pages_final(inode->i_mapping);
        clear_inode_flag(fi->cow_inode, FI_COW_FILE);
        iput(fi->cow_inode);
        fi->cow_inode = NULL;
        release_atomic_write_cnt(inode);
+       clear_inode_flag(inode, FI_ATOMIC_COMMITTED);
+       clear_inode_flag(inode, FI_ATOMIC_REPLACE);
        clear_inode_flag(inode, FI_ATOMIC_FILE);
        stat_dec_atomic_inode(inode);
+       if (clean) {
+               truncate_inode_pages_final(inode->i_mapping);
+               f2fs_i_size_write(inode, fi->original_i_size);
+       }
  }
  
  static int __replace_atomic_write_block(struct inode *inode, pgoff_t index,
@@@ -257,14 -262,19 +262,19 @@@ static void __complete_revoke_list(stru
                                        bool revoke)
  {
        struct revoke_entry *cur, *tmp;
+       bool truncate = is_inode_flag_set(inode, FI_ATOMIC_REPLACE);
  
        list_for_each_entry_safe(cur, tmp, head, list) {
                if (revoke)
                        __replace_atomic_write_block(inode, cur->index,
                                                cur->old_addr, NULL, true);
                list_del(&cur->list);
                kmem_cache_free(revoke_entry_slab, cur);
        }
+       if (!revoke && truncate)
+               f2fs_do_truncate_blocks(inode, 0, false);
  }
  
  static int __f2fs_commit_atomic_write(struct inode *inode)
@@@ -335,10 -345,12 +345,12 @@@ next
        }
  
  out:
-       if (ret)
+       if (ret) {
                sbi->revoked_atomic_block += fi->atomic_write_cnt;
-       else
+       } else {
                sbi->committed_atomic_block += fi->atomic_write_cnt;
+               set_inode_flag(inode, FI_ATOMIC_COMMITTED);
+       }
  
        __complete_revoke_list(inode, &revoke_list, ret ? true : false);
  
@@@ -437,8 -449,14 +449,14 @@@ void f2fs_balance_fs_bg(struct f2fs_sb_
                return;
  
        /* try to shrink extent cache when there is no enough memory */
-       if (!f2fs_available_free_memory(sbi, EXTENT_CACHE))
-               f2fs_shrink_extent_tree(sbi, EXTENT_CACHE_SHRINK_NUMBER);
+       if (!f2fs_available_free_memory(sbi, READ_EXTENT_CACHE))
+               f2fs_shrink_read_extent_tree(sbi,
+                               READ_EXTENT_CACHE_SHRINK_NUMBER);
+       /* try to shrink age extent cache when there is no enough memory */
+       if (!f2fs_available_free_memory(sbi, AGE_EXTENT_CACHE))
+               f2fs_shrink_age_extent_tree(sbi,
+                               AGE_EXTENT_CACHE_SHRINK_NUMBER);
  
        /* check the # of cached NAT entries */
        if (!f2fs_available_free_memory(sbi, NAT_ENTRIES))
@@@ -620,12 -638,11 +638,11 @@@ int f2fs_create_flush_cmd_control(struc
  {
        dev_t dev = sbi->sb->s_bdev->bd_dev;
        struct flush_cmd_control *fcc;
-       int err = 0;
  
        if (SM_I(sbi)->fcc_info) {
                fcc = SM_I(sbi)->fcc_info;
                if (fcc->f2fs_issue_flush)
-                       return err;
+                       return 0;
                goto init_thread;
        }
  
        init_llist_head(&fcc->issue_list);
        SM_I(sbi)->fcc_info = fcc;
        if (!test_opt(sbi, FLUSH_MERGE))
-               return err;
+               return 0;
  
  init_thread:
        fcc->f2fs_issue_flush = kthread_run(issue_flush_thread, sbi,
                                "f2fs_flush-%u:%u", MAJOR(dev), MINOR(dev));
        if (IS_ERR(fcc->f2fs_issue_flush)) {
-               err = PTR_ERR(fcc->f2fs_issue_flush);
+               int err = PTR_ERR(fcc->f2fs_issue_flush);
                kfree(fcc);
                SM_I(sbi)->fcc_info = NULL;
                return err;
        }
  
-       return err;
+       return 0;
  }
  
  void f2fs_destroy_flush_cmd_control(struct f2fs_sb_info *sbi, bool free)
@@@ -856,7 -874,7 +874,7 @@@ block_t f2fs_get_unusable_blocks(struc
        }
        mutex_unlock(&dirty_i->seglist_lock);
  
-       unusable = holes[DATA] > holes[NODE] ? holes[DATA] : holes[NODE];
+       unusable = max(holes[DATA], holes[NODE]);
        if (unusable > ovp_holes)
                return unusable - ovp_holes;
        return 0;
@@@ -1052,8 -1070,8 +1070,8 @@@ static void __init_discard_policy(struc
                dpolicy->io_aware = true;
                dpolicy->sync = false;
                dpolicy->ordered = true;
-               if (utilization(sbi) > DEF_DISCARD_URGENT_UTIL) {
-                       dpolicy->granularity = 1;
+               if (utilization(sbi) > dcc->discard_urgent_util) {
+                       dpolicy->granularity = MIN_DISCARD_GRANULARITY;
                        if (atomic_read(&dcc->discard_cmd_cnt))
                                dpolicy->max_interval =
                                        dcc->min_discard_issue_time;
        } else if (discard_type == DPOLICY_UMOUNT) {
                dpolicy->io_aware = false;
                /* we need to issue all to keep CP_TRIMMED_FLAG */
-               dpolicy->granularity = 1;
+               dpolicy->granularity = MIN_DISCARD_GRANULARITY;
                dpolicy->timeout = true;
        }
  }
@@@ -1126,13 -1144,12 +1144,12 @@@ static int __submit_discard_cmd(struct 
                if (time_to_inject(sbi, FAULT_DISCARD)) {
                        f2fs_show_injection_info(sbi, FAULT_DISCARD);
                        err = -EIO;
-                       goto submit;
-               }
-               err = __blkdev_issue_discard(bdev,
+               } else {
+                       err = __blkdev_issue_discard(bdev,
                                        SECTOR_FROM_BLOCK(start),
                                        SECTOR_FROM_BLOCK(len),
                                        GFP_NOFS, &bio);
- submit:
+               }
                if (err) {
                        spin_lock_irqsave(&dc->lock, flags);
                        if (dc->state == D_PARTIAL)
  
                atomic_inc(&dcc->issued_discard);
  
-               f2fs_update_iostat(sbi, NULL, FS_DISCARD, 1);
+               f2fs_update_iostat(sbi, NULL, FS_DISCARD, len * F2FS_BLKSIZE);
  
                lstart += len;
                start += len;
@@@ -1342,13 -1359,13 +1359,13 @@@ static void __update_discard_tree_range
        }
  }
  
- static int __queue_discard_cmd(struct f2fs_sb_info *sbi,
+ static void __queue_discard_cmd(struct f2fs_sb_info *sbi,
                struct block_device *bdev, block_t blkstart, block_t blklen)
  {
        block_t lblkstart = blkstart;
  
        if (!f2fs_bdev_support_discard(bdev))
-               return 0;
+               return;
  
        trace_f2fs_queue_discard(bdev, blkstart, blklen);
  
        mutex_lock(&SM_I(sbi)->dcc_info->cmd_lock);
        __update_discard_tree_range(sbi, bdev, lblkstart, blkstart, blklen);
        mutex_unlock(&SM_I(sbi)->dcc_info->cmd_lock);
-       return 0;
  }
  
  static unsigned int __issue_discard_cmd_orderly(struct f2fs_sb_info *sbi,
@@@ -1448,7 -1464,7 +1464,7 @@@ retry
                if (i + 1 < dpolicy->granularity)
                        break;
  
-               if (i < DEFAULT_DISCARD_GRANULARITY && dpolicy->ordered)
+               if (i + 1 < dcc->max_ordered_discard && dpolicy->ordered)
                        return __issue_discard_cmd_orderly(sbi, dpolicy);
  
                pend_list = &dcc->pend_list[i];
@@@ -1645,6 -1661,9 +1661,9 @@@ bool f2fs_issue_discard_timeout(struct 
        struct discard_policy dpolicy;
        bool dropped;
  
+       if (!atomic_read(&dcc->discard_cmd_cnt))
+               return false;
        __init_discard_policy(sbi, &dpolicy, DPOLICY_UMOUNT,
                                        dcc->discard_granularity);
        __issue_discard_cmd(sbi, &dpolicy);
@@@ -1669,6 -1688,11 +1688,11 @@@ static int issue_discard_thread(void *d
        set_freezable();
  
        do {
+               wait_event_interruptible_timeout(*q,
+                               kthread_should_stop() || freezing(current) ||
+                               dcc->discard_wake,
+                               msecs_to_jiffies(wait_ms));
                if (sbi->gc_mode == GC_URGENT_HIGH ||
                        !f2fs_available_free_memory(sbi, DISCARD_CACHE))
                        __init_discard_policy(sbi, &dpolicy, DPOLICY_FORCE, 1);
                        __init_discard_policy(sbi, &dpolicy, DPOLICY_BG,
                                                dcc->discard_granularity);
  
-               if (!atomic_read(&dcc->discard_cmd_cnt))
-                      wait_ms = dpolicy.max_interval;
-               wait_event_interruptible_timeout(*q,
-                               kthread_should_stop() || freezing(current) ||
-                               dcc->discard_wake,
-                               msecs_to_jiffies(wait_ms));
                if (dcc->discard_wake)
                        dcc->discard_wake = 0;
  
                        continue;
                if (kthread_should_stop())
                        return 0;
-               if (is_sbi_flag_set(sbi, SBI_NEED_FSCK)) {
+               if (is_sbi_flag_set(sbi, SBI_NEED_FSCK) ||
+                       !atomic_read(&dcc->discard_cmd_cnt)) {
                        wait_ms = dpolicy.max_interval;
                        continue;
                }
-               if (!atomic_read(&dcc->discard_cmd_cnt))
-                       continue;
  
                sb_start_intwrite(sbi->sb);
  
                } else {
                        wait_ms = dpolicy.max_interval;
                }
+               if (!atomic_read(&dcc->discard_cmd_cnt))
+                       wait_ms = dpolicy.max_interval;
  
                sb_end_intwrite(sbi->sb);
  
@@@ -1760,7 -1777,8 +1777,8 @@@ static int __f2fs_issue_discard_zone(st
        }
  
        /* For conventional zones, use regular discard if supported */
-       return __queue_discard_cmd(sbi, bdev, lblkstart, blklen);
+       __queue_discard_cmd(sbi, bdev, lblkstart, blklen);
+       return 0;
  }
  #endif
  
@@@ -1771,7 -1789,8 +1789,8 @@@ static int __issue_discard_async(struc
        if (f2fs_sb_has_blkzoned(sbi) && bdev_is_zoned(bdev))
                return __f2fs_issue_discard_zone(sbi, bdev, blkstart, blklen);
  #endif
-       return __queue_discard_cmd(sbi, bdev, blkstart, blklen);
+       __queue_discard_cmd(sbi, bdev, blkstart, blklen);
+       return 0;
  }
  
  static int f2fs_issue_discard(struct f2fs_sb_info *sbi,
@@@ -2025,8 -2044,10 +2044,10 @@@ int f2fs_start_discard_thread(struct f2
  
        dcc->f2fs_issue_discard = kthread_run(issue_discard_thread, sbi,
                                "f2fs_discard-%u:%u", MAJOR(dev), MINOR(dev));
-       if (IS_ERR(dcc->f2fs_issue_discard))
+       if (IS_ERR(dcc->f2fs_issue_discard)) {
                err = PTR_ERR(dcc->f2fs_issue_discard);
+               dcc->f2fs_issue_discard = NULL;
+       }
  
        return err;
  }
@@@ -2046,6 -2067,7 +2067,7 @@@ static int create_discard_cmd_control(s
                return -ENOMEM;
  
        dcc->discard_granularity = DEFAULT_DISCARD_GRANULARITY;
+       dcc->max_ordered_discard = DEFAULT_MAX_ORDERED_DISCARD_GRANULARITY;
        if (F2FS_OPTION(sbi).discard_unit == DISCARD_UNIT_SEGMENT)
                dcc->discard_granularity = sbi->blocks_per_seg;
        else if (F2FS_OPTION(sbi).discard_unit == DISCARD_UNIT_SECTION)
        dcc->min_discard_issue_time = DEF_MIN_DISCARD_ISSUE_TIME;
        dcc->mid_discard_issue_time = DEF_MID_DISCARD_ISSUE_TIME;
        dcc->max_discard_issue_time = DEF_MAX_DISCARD_ISSUE_TIME;
+       dcc->discard_urgent_util = DEF_DISCARD_URGENT_UTIL;
        dcc->undiscard_blks = 0;
        dcc->next_pos = 0;
        dcc->root = RB_ROOT_CACHED;
@@@ -2096,8 -2119,7 +2119,7 @@@ static void destroy_discard_cmd_control
         * Recovery can cache discard commands, so in error path of
         * fill_super(), it needs to give a chance to handle them.
         */
-       if (unlikely(atomic_read(&dcc->discard_cmd_cnt)))
-               f2fs_issue_discard_timeout(sbi);
+       f2fs_issue_discard_timeout(sbi);
  
        kfree(dcc);
        SM_I(sbi)->dcc_info = NULL;
@@@ -2534,7 -2556,7 +2556,7 @@@ static unsigned int __get_next_segno(st
  
        sanity_check_seg_type(sbi, seg_type);
        if (f2fs_need_rand_seg(sbi))
 -              return prandom_u32_max(MAIN_SECS(sbi) * sbi->segs_per_sec);
 +              return get_random_u32_below(MAIN_SECS(sbi) * sbi->segs_per_sec);
  
        /* if segs_per_sec is large than 1, we need to keep original policy. */
        if (__is_large_section(sbi))
@@@ -2588,7 -2610,7 +2610,7 @@@ static void new_curseg(struct f2fs_sb_i
        curseg->alloc_type = LFS;
        if (F2FS_OPTION(sbi).fs_mode == FS_MODE_FRAGMENT_BLK)
                curseg->fragment_remained_chunk =
 -                              prandom_u32_max(sbi->max_fragment_chunk) + 1;
 +                              get_random_u32_inclusive(1, sbi->max_fragment_chunk);
  }
  
  static int __next_free_blkoff(struct f2fs_sb_info *sbi,
@@@ -2625,9 -2647,9 +2647,9 @@@ static void __refresh_next_blkoff(struc
                        /* To allocate block chunks in different sizes, use random number */
                        if (--seg->fragment_remained_chunk <= 0) {
                                seg->fragment_remained_chunk =
 -                                 prandom_u32_max(sbi->max_fragment_chunk) + 1;
 +                                 get_random_u32_inclusive(1, sbi->max_fragment_chunk);
                                seg->next_blkoff +=
 -                                 prandom_u32_max(sbi->max_fragment_hole) + 1;
 +                                 get_random_u32_inclusive(1, sbi->max_fragment_hole);
                        }
                }
        }
@@@ -2642,7 -2664,7 +2664,7 @@@ bool f2fs_segment_has_free_slot(struct 
   * This function always allocates a used segment(from dirty seglist) by SSR
   * manner, so it should recover the existing segment information of valid blocks
   */
- static void change_curseg(struct f2fs_sb_info *sbi, int type, bool flush)
+ static void change_curseg(struct f2fs_sb_info *sbi, int type)
  {
        struct dirty_seglist_info *dirty_i = DIRTY_I(sbi);
        struct curseg_info *curseg = CURSEG_I(sbi, type);
        struct f2fs_summary_block *sum_node;
        struct page *sum_page;
  
-       if (flush)
-               write_sum_page(sbi, curseg->sum_blk,
-                                       GET_SUM_BLOCK(sbi, curseg->segno));
+       write_sum_page(sbi, curseg->sum_blk, GET_SUM_BLOCK(sbi, curseg->segno));
  
        __set_test_and_inuse(sbi, new_segno);
  
@@@ -2691,7 -2711,7 +2711,7 @@@ static void get_atssr_segment(struct f2
                struct seg_entry *se = get_seg_entry(sbi, curseg->next_segno);
  
                curseg->seg_type = se->type;
-               change_curseg(sbi, type, true);
+               change_curseg(sbi, type);
        } else {
                /* allocate cold segment by default */
                curseg->seg_type = CURSEG_COLD_DATA;
@@@ -2835,31 -2855,20 +2855,20 @@@ static int get_ssr_segment(struct f2fs_
        return 0;
  }
  
- /*
-  * flush out current segment and replace it with new segment
-  * This function should be returned with success, otherwise BUG
-  */
- static void allocate_segment_by_default(struct f2fs_sb_info *sbi,
-                                               int type, bool force)
+ static bool need_new_seg(struct f2fs_sb_info *sbi, int type)
  {
        struct curseg_info *curseg = CURSEG_I(sbi, type);
  
-       if (force)
-               new_curseg(sbi, type, true);
-       else if (!is_set_ckpt_flags(sbi, CP_CRC_RECOVERY_FLAG) &&
-                                       curseg->seg_type == CURSEG_WARM_NODE)
-               new_curseg(sbi, type, false);
-       else if (curseg->alloc_type == LFS &&
-                       is_next_segment_free(sbi, curseg, type) &&
-                       likely(!is_sbi_flag_set(sbi, SBI_CP_DISABLED)))
-               new_curseg(sbi, type, false);
-       else if (f2fs_need_SSR(sbi) &&
-                       get_ssr_segment(sbi, type, SSR, 0))
-               change_curseg(sbi, type, true);
-       else
-               new_curseg(sbi, type, false);
-       stat_inc_seg_type(sbi, curseg);
+       if (!is_set_ckpt_flags(sbi, CP_CRC_RECOVERY_FLAG) &&
+           curseg->seg_type == CURSEG_WARM_NODE)
+               return true;
+       if (curseg->alloc_type == LFS &&
+           is_next_segment_free(sbi, curseg, type) &&
+           likely(!is_sbi_flag_set(sbi, SBI_CP_DISABLED)))
+               return true;
+       if (!f2fs_need_SSR(sbi) || !get_ssr_segment(sbi, type, SSR, 0))
+               return true;
+       return false;
  }
  
  void f2fs_allocate_segment_for_resize(struct f2fs_sb_info *sbi, int type,
                goto unlock;
  
        if (f2fs_need_SSR(sbi) && get_ssr_segment(sbi, type, SSR, 0))
-               change_curseg(sbi, type, true);
+               change_curseg(sbi, type);
        else
                new_curseg(sbi, type, true);
  
@@@ -2912,7 -2921,8 +2921,8 @@@ static void __allocate_new_segment(stru
                return;
  alloc:
        old_segno = curseg->segno;
-       SIT_I(sbi)->s_ops->allocate_segment(sbi, type, true);
+       new_curseg(sbi, type, true);
+       stat_inc_seg_type(sbi, curseg);
        locate_dirty_segment(sbi, old_segno);
  }
  
@@@ -2943,10 -2953,6 +2953,6 @@@ void f2fs_allocate_new_segments(struct 
        f2fs_up_read(&SM_I(sbi)->curseg_lock);
  }
  
- static const struct segment_allocation default_salloc_ops = {
-       .allocate_segment = allocate_segment_by_default,
- };
  bool f2fs_exist_trim_candidates(struct f2fs_sb_info *sbi,
                                                struct cp_control *cpc)
  {
@@@ -3152,10 -3158,28 +3158,28 @@@ static int __get_segment_type_4(struct 
        }
  }
  
+ static int __get_age_segment_type(struct inode *inode, pgoff_t pgofs)
+ {
+       struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
+       struct extent_info ei;
+       if (f2fs_lookup_age_extent_cache(inode, pgofs, &ei)) {
+               if (!ei.age)
+                       return NO_CHECK_TYPE;
+               if (ei.age <= sbi->hot_data_age_threshold)
+                       return CURSEG_HOT_DATA;
+               if (ei.age <= sbi->warm_data_age_threshold)
+                       return CURSEG_WARM_DATA;
+               return CURSEG_COLD_DATA;
+       }
+       return NO_CHECK_TYPE;
+ }
  static int __get_segment_type_6(struct f2fs_io_info *fio)
  {
        if (fio->type == DATA) {
                struct inode *inode = fio->page->mapping->host;
+               int type;
  
                if (is_inode_flag_set(inode, FI_ALIGNED_WRITE))
                        return CURSEG_COLD_DATA_PINNED;
                }
                if (file_is_cold(inode) || f2fs_need_compress_data(inode))
                        return CURSEG_COLD_DATA;
+               type = __get_age_segment_type(inode, fio->page->index);
+               if (type != NO_CHECK_TYPE)
+                       return type;
                if (file_is_hot(inode) ||
                                is_inode_flag_set(inode, FI_HOT_DATA) ||
                                f2fs_is_cow_file(inode))
@@@ -3266,11 -3295,19 +3295,19 @@@ void f2fs_allocate_data_block(struct f2
                update_sit_entry(sbi, old_blkaddr, -1);
  
        if (!__has_curseg_space(sbi, curseg)) {
-               if (from_gc)
+               /*
+                * Flush out current segment and replace it with new segment.
+                */
+               if (from_gc) {
                        get_atssr_segment(sbi, type, se->type,
                                                AT_SSR, se->mtime);
-               else
-                       sit_i->s_ops->allocate_segment(sbi, type, false);
+               } else {
+                       if (need_new_seg(sbi, type))
+                               new_curseg(sbi, type, false);
+                       else
+                               change_curseg(sbi, type);
+                       stat_inc_seg_type(sbi, curseg);
+               }
        }
        /*
         * segment dirty status should be updated after segment allocation,
        locate_dirty_segment(sbi, GET_SEGNO(sbi, old_blkaddr));
        locate_dirty_segment(sbi, GET_SEGNO(sbi, *new_blkaddr));
  
+       if (IS_DATASEG(type))
+               atomic64_inc(&sbi->allocated_data_blocks);
        up_write(&sit_i->sentry_lock);
  
        if (page && IS_NODESEG(type)) {
@@@ -3407,6 -3447,8 +3447,8 @@@ void f2fs_outplace_write_data(struct dn
        struct f2fs_summary sum;
  
        f2fs_bug_on(sbi, dn->data_blkaddr == NULL_ADDR);
+       if (fio->io_type == FS_DATA_IO || fio->io_type == FS_CP_DATA_IO)
+               f2fs_update_age_extent_cache(dn);
        set_summary(&sum, dn->nid, dn->ofs_in_node, fio->version);
        do_write_page(&sum, fio);
        f2fs_update_data_blkaddr(dn, fio->new_blkaddr);
@@@ -3531,7 -3573,7 +3573,7 @@@ void f2fs_do_replace_block(struct f2fs_
        /* change the current segment */
        if (segno != curseg->segno) {
                curseg->next_segno = segno;
-               change_curseg(sbi, type, true);
+               change_curseg(sbi, type);
        }
  
        curseg->next_blkoff = GET_BLKOFF_FROM_SEG0(sbi, new_blkaddr);
        if (recover_curseg) {
                if (old_cursegno != curseg->segno) {
                        curseg->next_segno = old_cursegno;
-                       change_curseg(sbi, type, true);
+                       change_curseg(sbi, type);
                }
                curseg->next_blkoff = old_blkoff;
                curseg->alloc_type = old_alloc_type;
@@@ -4256,9 -4298,6 +4298,6 @@@ static int build_sit_info(struct f2fs_s
                return -ENOMEM;
  #endif
  
-       /* init SIT information */
-       sit_i->s_ops = &default_salloc_ops;
        sit_i->sit_base_addr = le32_to_cpu(raw_super->sit_blkaddr);
        sit_i->sit_blocks = sit_segs << sbi->log_blocks_per_seg;
        sit_i->written_valid_blocks = 0;
This page took 0.317824 seconds and 4 git commands to generate.