]> Git Repo - J-linux.git/commitdiff
Merge tag 'vfs-6.13.misc' of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs
authorLinus Torvalds <[email protected]>
Mon, 18 Nov 2024 17:35:30 +0000 (09:35 -0800)
committerLinus Torvalds <[email protected]>
Mon, 18 Nov 2024 17:35:30 +0000 (09:35 -0800)
Pull misc vfs updates from Christian Brauner:
 "Features:

   - Fixup and improve NLM and kNFSD file lock callbacks

     Last year both GFS2 and OCFS2 had some work done to make their
     locking more robust when exported over NFS. Unfortunately, part of
     that work caused both NLM (for NFS v3 exports) and kNFSD (for
     NFSv4.1+ exports) to no longer send lock notifications to clients

     This in itself is not a huge problem because most NFS clients will
     still poll the server in order to acquire a conflicted lock

     It's important for NLM and kNFSD that they do not block their
     kernel threads inside filesystem's file_lock implementations
     because that can produce deadlocks. We used to make sure of this by
     only trusting that posix_lock_file() can correctly handle blocking
     lock calls asynchronously, so the lock managers would only setup
     their file_lock requests for async callbacks if the filesystem did
     not define its own lock() file operation

     However, when GFS2 and OCFS2 grew the capability to correctly
     handle blocking lock requests asynchronously, they started
     signalling this behavior with EXPORT_OP_ASYNC_LOCK, and the check
     for also trusting posix_lock_file() was inadvertently dropped, so
     now most filesystems no longer produce lock notifications when
     exported over NFS

     Fix this by using an fop_flag which greatly simplifies the problem
     and grooms the way for future uses by both filesystems and lock
     managers alike

   - Add a sysctl to delete the dentry when a file is removed instead of
     making it a negative dentry

     Commit 681ce8623567 ("vfs: Delete the associated dentry when
     deleting a file") introduced an unconditional deletion of the
     associated dentry when a file is removed. However, this led to
     performance regressions in specific benchmarks, such as
     ilebench.sum_operations/s, prompting a revert in commit
     4a4be1ad3a6e ("Revert "vfs: Delete the associated dentry when
     deleting a file""). This reintroduces the concept conditionally
     through a sysctl

   - Expand the statmount() system call:

       * Report the filesystem subtype in a new fs_subtype field to
         e.g., report fuse filesystem subtypes

       * Report the superblock source in a new sb_source field

       * Add a new way to return filesystem specific mount options in an
         option array that returns filesystem specific mount options
         separated by zero bytes and unescaped. This allows caller's to
         retrieve filesystem specific mount options and immediately pass
         them to e.g., fsconfig() without having to unescape or split
         them

       * Report security (LSM) specific mount options in a separate
         security option array. We don't lump them together with
         filesystem specific mount options as security mount options are
         generic and most users aren't interested in them

         The format is the same as for the filesystem specific mount
         option array

   - Support relative paths in fsconfig()'s FSCONFIG_SET_STRING command

   - Optimize acl_permission_check() to avoid costly {g,u}id ownership
     checks if possible

   - Use smp_mb__after_spinlock() to avoid full smp_mb() in evict()

   - Add synchronous wakeup support for ep_poll_callback.

     Currently, epoll only uses wake_up() to wake up task. But sometimes
     there are epoll users which want to use the synchronous wakeup flag
     to give a hint to the scheduler, e.g., the Android binder driver.
     So add a wake_up_sync() define, and use wake_up_sync() when sync is
     true in ep_poll_callback()

  Fixes:

   - Fix kernel documentation for inode_insert5() and iget5_locked()

   - Annotate racy epoll check on file->f_ep

   - Make F_DUPFD_QUERY associative

   - Avoid filename buffer overrun in initramfs

   - Don't let statmount() return empty strings

   - Add a cond_resched() to dump_user_range() to avoid hogging the CPU

   - Don't query the device logical blocksize multiple times for hfsplus

   - Make filemap_read() check that the offset is positive or zero

  Cleanups:

   - Various typo fixes

   - Cleanup wbc_attach_fdatawrite_inode()

   - Add __releases annotation to wbc_attach_and_unlock_inode()

   - Add hugetlbfs tracepoints

   - Fix various vfs kernel doc parameters

   - Remove obsolete TODO comment from io_cancel()

   - Convert wbc_account_cgroup_owner() to take a folio

   - Fix comments for BANDWITH_INTERVAL and wb_domain_writeout_add()

   - Reorder struct posix_acl to save 8 bytes

   - Annotate struct posix_acl with __counted_by()

   - Replace one-element array with flexible array member in freevxfs

   - Use idiomatic atomic64_inc_return() in alloc_mnt_ns()"

* tag 'vfs-6.13.misc' of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs: (35 commits)
  statmount: retrieve security mount options
  vfs: make evict() use smp_mb__after_spinlock instead of smp_mb
  statmount: add flag to retrieve unescaped options
  fs: add the ability for statmount() to report the sb_source
  writeback: wbc_attach_fdatawrite_inode out of line
  writeback: add a __releases annoation to wbc_attach_and_unlock_inode
  fs: add the ability for statmount() to report the fs_subtype
  fs: don't let statmount return empty strings
  fs:aio: Remove TODO comment suggesting hash or array usage in io_cancel()
  hfsplus: don't query the device logical block size multiple times
  freevxfs: Replace one-element array with flexible array member
  fs: optimize acl_permission_check()
  initramfs: avoid filename buffer overrun
  fs/writeback: convert wbc_account_cgroup_owner to take a folio
  acl: Annotate struct posix_acl with __counted_by()
  acl: Realign struct posix_acl to save 8 bytes
  epoll: Add synchronous wakeup support for ep_poll_callback
  coredump: add cond_resched() to dump_user_range
  mm/page-writeback.c: Fix comment of wb_domain_writeout_add()
  mm/page-writeback.c: Update comment for BANDWIDTH_INTERVAL
  ...

13 files changed:
1  2 
Documentation/admin-guide/cgroup-v2.rst
MAINTAINERS
fs/btrfs/extent_io.c
fs/btrfs/inode.c
fs/hfsplus/hfsplus_fs.h
fs/hfsplus/wrapper.c
fs/inode.c
fs/iomap/buffered-io.c
fs/namespace.c
fs/nfsd/nfs4state.c
fs/ocfs2/file.c
include/linux/fs.h
mm/filemap.c

index 6d02168d78bed67bfe2c7aa17f5a26f61346138f,064012ea6f36681d723b8914321b368f297be6ab..2cb58daf3089baaabca253136574ad8081131753
@@@ -1599,15 -1599,6 +1599,15 @@@ The following nested keys are defined
          pglazyfreed (npn)
                Amount of reclaimed lazyfree pages
  
 +        swpin_zero
 +              Number of pages swapped into memory and filled with zero, where I/O
 +              was optimized out because the page content was detected to be zero
 +              during swapout.
 +
 +        swpout_zero
 +              Number of zero-filled pages swapped out with I/O skipped due to the
 +              content being detected as zero.
 +
          zswpin
                Number of pages moved in to memory from zswap.
  
@@@ -2954,7 -2945,7 +2954,7 @@@ following two functions
        a queue (device) has been associated with the bio and
        before submission.
  
-   wbc_account_cgroup_owner(@wbc, @page, @bytes)
+   wbc_account_cgroup_owner(@wbc, @folio, @bytes)
        Should be called for each data segment being written out.
        While this function doesn't care exactly when it's called
        during the writeback session, it's the easiest and most
diff --combined MAINTAINERS
index b878ddc99f94e7f6e8fa2c479c5a3f846c514730,bf71263ded2c8172e8447e2b7776b0d7ee81cce6..32a8387dcdd0762976756be46cabcd5f9c31af73
@@@ -258,6 -258,12 +258,6 @@@ L:        [email protected]
  S:    Maintained
  F:    drivers/net/ethernet/alteon/acenic*
  
 -ACER ASPIRE 1 EMBEDDED CONTROLLER DRIVER
 -M:    Nikita Travkin <[email protected]>
 -S:    Maintained
 -F:    Documentation/devicetree/bindings/platform/acer,aspire1-ec.yaml
 -F:    drivers/platform/arm64/acer-aspire1-ec.c
 -
  ACER ASPIRE ONE TEMPERATURE AND FAN DRIVER
  M:    Peter Kaestle <[email protected]>
  L:    [email protected]
@@@ -854,7 -860,7 +854,7 @@@ F: drivers/crypto/allwinner
  
  ALLWINNER DMIC DRIVERS
  M:    Ban Tao <[email protected]>
 -L:    [email protected] (moderated for non-subscribers)
 +L:    [email protected]
  S:    Maintained
  F:    Documentation/devicetree/bindings/sound/allwinner,sun50i-h6-dmic.yaml
  F:    sound/soc/sunxi/sun50i-dmic.c
@@@ -882,6 -888,7 +882,6 @@@ F: drivers/staging/media/sunxi/cedrus
  
  ALPHA PORT
  M:    Richard Henderson <[email protected]>
 -M:    Ivan Kokshaysky <[email protected]>
  M:    Matt Turner <[email protected]>
  L:    [email protected]
  S:    Odd Fixes
@@@ -1174,9 -1181,8 +1174,9 @@@ F:      Documentation/hid/amd-sfh
  F:    drivers/hid/amd-sfh-hid/
  
  AMD SPI DRIVER
 -M:    Sanjay R Mehta <[email protected]>
 -S:    Maintained
 +M:    Raju Rangoju <[email protected]>
 +L:    [email protected]
 +S:    Supported
  F:    drivers/spi/spi-amd.c
  
  AMD XGBE DRIVER
@@@ -1511,7 -1517,7 +1511,7 @@@ F:      drivers/iio/gyro/adxrs290.
  ANALOG DEVICES INC ASOC CODEC DRIVERS
  M:    Lars-Peter Clausen <[email protected]>
  M:    Nuno Sá <[email protected]>
 -L:    [email protected] (moderated for non-subscribers)
 +L:    [email protected]
  S:    Supported
  W:    http://wiki.analog.com/
  W:    https://ez.analog.com/linux-software-drivers
@@@ -1588,7 -1594,7 +1588,7 @@@ F:      drivers/rtc/rtc-goldfish.
  AOA (Apple Onboard Audio) ALSA DRIVER
  M:    Johannes Berg <[email protected]>
  L:    [email protected]
 -L:    [email protected] (moderated for non-subscribers)
 +L:    [email protected]
  S:    Maintained
  F:    sound/aoa/
  
@@@ -1755,8 -1761,8 +1755,8 @@@ F:      include/uapi/linux/if_arcnet.
  ARM AND ARM64 SoC SUB-ARCHITECTURES (COMMON PARTS)
  M:    Arnd Bergmann <[email protected]>
  M:    Olof Johansson <[email protected]>
 -M:    [email protected]
  L:    [email protected] (moderated for non-subscribers)
 +L:    [email protected]
  S:    Maintained
  P:    Documentation/process/maintainer-soc.rst
  C:    irc://irc.libera.chat/armlinux
@@@ -2085,7 -2091,7 +2085,7 @@@ F:      drivers/crypto/amlogic
  
  ARM/Amlogic Meson SoC Sound Drivers
  M:    Jerome Brunet <[email protected]>
 -L:    [email protected] (moderated for non-subscribers)
 +L:    [email protected]
  S:    Maintained
  F:    Documentation/devicetree/bindings/sound/amlogic*
  F:    sound/soc/meson/
@@@ -2123,7 -2129,7 +2123,7 @@@ F:      drivers/*/*alpine
  ARM/APPLE MACHINE SOUND DRIVERS
  M:    Martin Povišer <[email protected]>
  L:    [email protected]
 -L:    [email protected] (moderated for non-subscribers)
 +L:    [email protected]
  S:    Maintained
  F:    Documentation/devicetree/bindings/sound/adi,ssm3515.yaml
  F:    Documentation/devicetree/bindings/sound/apple,*
  S:    Maintained
  F:    arch/arm/mach-ep93xx/ts72xx.c
  
 -ARM/CIRRUS LOGIC CLPS711X ARM ARCHITECTURE
 -M:    Alexander Shiyan <[email protected]>
 -L:    [email protected] (moderated for non-subscribers)
 -S:    Odd Fixes
 -N:    clps711x
 -
  ARM/CIRRUS LOGIC EP93XX ARM ARCHITECTURE
  M:    Hartley Sweeten <[email protected]>
  M:    Alexander Sverdlin <[email protected]>
@@@ -2853,7 -2865,7 +2853,7 @@@ F:      Documentation/devicetree/bindings/ar
  F:    Documentation/devicetree/bindings/bus/qcom*
  F:    Documentation/devicetree/bindings/cache/qcom,llcc.yaml
  F:    Documentation/devicetree/bindings/firmware/qcom,scm.yaml
 -F:    Documentation/devicetree/bindings/reserved-memory/qcom
 +F:    Documentation/devicetree/bindings/reserved-memory/qcom*
  F:    Documentation/devicetree/bindings/soc/qcom/
  F:    arch/arm/boot/dts/qcom/
  F:    arch/arm/configs/qcom_defconfig
@@@ -3720,7 -3732,7 +3720,7 @@@ F:      arch/arm/boot/dts/microchip/at91-tse
  
  AXENTIA ASOC DRIVERS
  M:    Peter Rosin <[email protected]>
 -L:    [email protected] (moderated for non-subscribers)
 +L:    [email protected]
  S:    Maintained
  F:    Documentation/devicetree/bindings/sound/axentia,*
  F:    sound/soc/atmel/tse850-pcm5142.c
@@@ -3746,7 -3758,6 +3746,7 @@@ F:      drivers/spi/spi-axi-spi-engine.
  AXI PWM GENERATOR
  M:    Michael Hennerich <[email protected]>
  M:    Nuno Sá <[email protected]>
 +R:    Trevor Gamblin <[email protected]>
  L:    [email protected]
  S:    Supported
  W:    https://ez.analog.com/linux-software-drivers
@@@ -3804,6 -3815,14 +3804,6 @@@ F:     drivers/video/backlight
  F:    include/linux/backlight.h
  F:    include/linux/pwm_backlight.h
  
 -BAIKAL-T1 PVT HARDWARE MONITOR DRIVER
 -M:    Serge Semin <[email protected]>
 -L:    [email protected]
 -S:    Supported
 -F:    Documentation/devicetree/bindings/hwmon/baikal,bt1-pvt.yaml
 -F:    Documentation/hwmon/bt1-pvt.rst
 -F:    drivers/hwmon/bt1-pvt.[ch]
 -
  BARCO P50 GPIO DRIVER
  M:    Santosh Kumar Yadav <[email protected]>
  M:    Peter Korsgaard <[email protected]>
@@@ -4832,7 -4851,7 +4832,7 @@@ F:      include/uapi/linux/bsg.
  
  BT87X AUDIO DRIVER
  M:    Clemens Ladisch <[email protected]>
 -L:    [email protected] (moderated for non-subscribers)
 +L:    [email protected]
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound.git
  F:    Documentation/sound/cards/bt87x.rst
@@@ -4894,7 -4913,7 +4894,7 @@@ F:      drivers/net/can/bxcan.
  
  C-MEDIA CMI8788 DRIVER
  M:    Clemens Ladisch <[email protected]>
 -L:    [email protected] (moderated for non-subscribers)
 +L:    [email protected]
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound.git
  F:    sound/pci/oxygen/
@@@ -6457,6 -6476,7 +6457,6 @@@ F:      drivers/mtd/nand/raw/denali
  
  DESIGNWARE EDMA CORE IP DRIVER
  M:    Manivannan Sadhasivam <[email protected]>
 -R:    Serge Semin <[email protected]>
  L:    [email protected]
  S:    Maintained
  F:    drivers/dma/dw-edma/
@@@ -7812,8 -7832,6 +7812,8 @@@ F:      drivers/gpu/drm/xlnx
  DRM GPU SCHEDULER
  M:    Luben Tuikov <[email protected]>
  M:    Matthew Brost <[email protected]>
 +M:    Danilo Krummrich <[email protected]>
 +M:    Philipp Stanner <[email protected]>
  L:    [email protected]
  S:    Maintained
  T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
@@@ -8234,7 -8252,7 +8234,7 @@@ F:      drivers/edac/ti_edac.
  
  EDIROL UA-101/UA-1000 DRIVER
  M:    Clemens Ladisch <[email protected]>
 -L:    [email protected] (moderated for non-subscribers)
 +L:    [email protected]
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound.git
  F:    sound/usb/misc/ua101.c
@@@ -8796,7 -8814,7 +8796,7 @@@ F:      drivers/net/can/usb/f81604.
  FIREWIRE AUDIO DRIVERS and IEC 61883-1/6 PACKET STREAMING ENGINE
  M:    Clemens Ladisch <[email protected]>
  M:    Takashi Sakamoto <[email protected]>
 -L:    [email protected] (moderated for non-subscribers)
 +L:    [email protected]
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound.git
  F:    include/uapi/sound/firewire.h
@@@ -8870,7 -8888,7 +8870,7 @@@ F:      drivers/input/joystick/fsia6b.
  
  FOCUSRITE SCARLETT2 MIXER DRIVER (Scarlett Gen 2+ and Clarett)
  M:    Geoffrey D. Bennett <[email protected]>
 -L:    [email protected] (moderated for non-subscribers)
 +L:    [email protected]
  S:    Maintained
  W:    https://github.com/geoffreybennett/scarlett-gen2
  B:    https://github.com/geoffreybennett/scarlett-gen2/issues
@@@ -8894,7 -8912,6 +8894,7 @@@ F:      include/linux/fortify-string.
  F:    lib/fortify_kunit.c
  F:    lib/memcpy_kunit.c
  F:    lib/test_fortify/*
 +K:    \bunsafe_memcpy\b
  K:    \b__NO_FORTIFY\b
  
  FPGA DFL DRIVERS
@@@ -9192,7 -9209,7 +9192,7 @@@ M:      Shengjiu Wang <[email protected]
  M:    Xiubo Li <[email protected]>
  R:    Fabio Estevam <[email protected]>
  R:    Nicolin Chen <[email protected]>
 -L:    [email protected] (moderated for non-subscribers)
 +L:    [email protected]
  L:    [email protected]
  S:    Maintained
  F:    sound/soc/fsl/fsl*
@@@ -9202,7 -9219,7 +9202,7 @@@ FREESCALE SOC LPC32XX SOUND DRIVER
  M:    J.M.B. Downing <[email protected]>
  M:    Piotr Wojtaszczyk <[email protected]>
  R:    Vladimir Zapolskiy <[email protected]>
 -L:    [email protected] (moderated for non-subscribers)
 +L:    [email protected]
  L:    [email protected]
  S:    Maintained
  F:    Documentation/devicetree/bindings/sound/nxp,lpc3220-i2s.yaml
@@@ -9210,7 -9227,7 +9210,7 @@@ F:      sound/soc/fsl/lpc3xxx-
  
  FREESCALE SOC SOUND QMC DRIVER
  M:    Herve Codina <[email protected]>
 -L:    [email protected] (moderated for non-subscribers)
 +L:    [email protected]
  L:    [email protected]
  S:    Maintained
  F:    Documentation/devicetree/bindings/sound/fsl,qmc-audio.yaml
@@@ -9725,7 -9742,6 +9725,7 @@@ F:      include/dt-bindings/gpio
  F:    include/linux/gpio.h
  F:    include/linux/gpio/
  F:    include/linux/of_gpio.h
 +K:    (devm_)?gpio_(request|free|direction|get|set)
  
  GPIO UAPI
  M:    Bartosz Golaszewski <[email protected]>
@@@ -9740,6 -9756,14 +9740,6 @@@ F:     drivers/gpio/gpiolib-cdev.
  F:    include/uapi/linux/gpio.h
  F:    tools/gpio/
  
 -GRE DEMULTIPLEXER DRIVER
 -M:    Dmitry Kozlov <[email protected]>
 -L:    [email protected]
 -S:    Maintained
 -F:    include/net/gre.h
 -F:    net/ipv4/gre_demux.c
 -F:    net/ipv4/gre_offload.c
 -
  GRETH 10/100/1G Ethernet MAC device driver
  M:    Andreas Larsson <[email protected]>
  L:    [email protected]
@@@ -10243,7 -10267,7 +10243,7 @@@ F:   Documentation/devicetree/bindings/ar
  F:    drivers/bus/hisi_lpc.c
  
  HISILICON NETWORK SUBSYSTEM 3 DRIVER (HNS3)
 -M:    Yisen Zhuang <yisen.zhuang@huawei.com>
 +M:    Jian Shen <shenjian15@huawei.com>
  M:    Salil Mehta <[email protected]>
  M:    Jijie Shao <[email protected]>
  L:    [email protected]
@@@ -10252,7 -10276,7 +10252,7 @@@ W:   http://www.hisilicon.co
  F:    drivers/net/ethernet/hisilicon/hns3/
  
  HISILICON NETWORK SUBSYSTEM DRIVER
 -M:    Yisen Zhuang <yisen.zhuang@huawei.com>
 +M:    Jian Shen <shenjian15@huawei.com>
  M:    Salil Mehta <[email protected]>
  L:    [email protected]
  S:    Maintained
@@@ -10493,6 -10517,7 +10493,7 @@@ F:   Documentation/mm/hugetlbfs_reserv.rs
  F:    Documentation/mm/vmemmap_dedup.rst
  F:    fs/hugetlbfs/
  F:    include/linux/hugetlb.h
+ F:    include/trace/events/hugetlbfs.h
  F:    mm/hugetlb.c
  F:    mm/hugetlb_vmemmap.c
  F:    mm/hugetlb_vmemmap.h
@@@ -11130,7 -11155,7 +11131,7 @@@ F:   drivers/iio/pressure/dps310.
  
  INFINEON PEB2466 ASoC CODEC
  M:    Herve Codina <[email protected]>
 -L:    [email protected] (moderated for non-subscribers)
 +L:    [email protected]
  S:    Maintained
  F:    Documentation/devicetree/bindings/sound/infineon,peb2466.yaml
  F:    sound/soc/codecs/peb2466.c
@@@ -11256,10 -11281,10 +11257,10 @@@ F:        security/integrity
  F:    security/integrity/ima/
  
  INTEGRITY POLICY ENFORCEMENT (IPE)
 -M:    Fan Wu <wufan@linux.microsoft.com>
 +M:    Fan Wu <wufan@kernel.org>
  L:    [email protected]
  S:    Supported
 -T:    git https://github.com/microsoft/ipe.git
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/wufan/ipe.git
  F:    Documentation/admin-guide/LSM/ipe.rst
  F:    Documentation/security/ipe.rst
  F:    scripts/ipe/
@@@ -11293,7 -11318,7 +11294,7 @@@ M:   Bard Liao <[email protected]
  M:    Ranjani Sridharan <[email protected]>
  M:    Kai Vehmanen <[email protected]>
  R:    Pierre-Louis Bossart <[email protected]>
 -L:    [email protected] (moderated for non-subscribers)
 +L:    [email protected]
  S:    Supported
  F:    sound/soc/intel/
  
@@@ -11472,7 -11497,7 +11473,7 @@@ F:   include/uapi/linux/idxd.
  
  INTEL IN FIELD SCAN (IFS) DEVICE
  M:    Jithu Joseph <[email protected]>
 -R:    Ashok Raj <ashok.raj@intel.com>
 +R:    Ashok Raj <ashok.raj.linux@gmail.com>
  R:    Tony Luck <[email protected]>
  S:    Maintained
  F:    drivers/platform/x86/intel/ifs
@@@ -11577,16 -11602,6 +11578,16 @@@ F: drivers/crypto/intel/keembay/keembay
  F:    drivers/crypto/intel/keembay/ocs-hcu.c
  F:    drivers/crypto/intel/keembay/ocs-hcu.h
  
 +INTEL LA JOLLA COVE ADAPTER (LJCA) USB I/O EXPANDER DRIVERS
 +M:    Wentong Wu <[email protected]>
 +M:    Sakari Ailus <[email protected]>
 +S:    Maintained
 +F:    drivers/gpio/gpio-ljca.c
 +F:    drivers/i2c/busses/i2c-ljca.c
 +F:    drivers/spi/spi-ljca.c
 +F:    drivers/usb/misc/usb-ljca.c
 +F:    include/linux/usb/ljca.h
 +
  INTEL MANAGEMENT ENGINE (mei)
  M:    Tomas Winkler <[email protected]>
  L:    [email protected]
@@@ -11987,7 -12002,7 +11988,7 @@@ F:   drivers/tty/ipwireless
  
  IRON DEVICE AUDIO CODEC DRIVERS
  M:    Kiseok Jo <[email protected]>
 -L:    [email protected] (moderated for non-subscribers)
 +L:    [email protected]
  S:    Maintained
  F:    Documentation/devicetree/bindings/sound/irondevice,*
  F:    sound/soc/codecs/sma*
@@@ -12225,7 -12240,6 +12226,7 @@@ R:   Dmitry Vyukov <[email protected]
  R:    Vincenzo Frascino <[email protected]>
  L:    [email protected]
  S:    Maintained
 +B:    https://bugzilla.kernel.org/buglist.cgi?component=Sanitizers&product=Memory%20Management
  F:    Documentation/dev-tools/kasan.rst
  F:    arch/*/include/asm/*kasan.h
  F:    arch/*/mm/kasan_init*
@@@ -12249,7 -12263,6 +12250,7 @@@ R:   Dmitry Vyukov <[email protected]
  R:    Andrey Konovalov <[email protected]>
  L:    [email protected]
  S:    Maintained
 +B:    https://bugzilla.kernel.org/buglist.cgi?component=Sanitizers&product=Memory%20Management
  F:    Documentation/dev-tools/kcov.rst
  F:    include/linux/kcov.h
  F:    include/uapi/linux/kcov.h
@@@ -12331,7 -12344,6 +12332,7 @@@ F:   include/linux/randomize_kstack.
  F:    kernel/configs/hardening.config
  F:    lib/usercopy_kunit.c
  F:    mm/usercopy.c
 +F:    security/Kconfig.hardening
  K:    \b(add|choose)_random_kstack_offset\b
  K:    \b__check_(object_size|heap_object)\b
  K:    \b__counted_by\b
@@@ -12448,7 -12460,7 +12449,7 @@@ F:   virt/kvm/
  KERNEL VIRTUAL MACHINE FOR ARM64 (KVM/arm64)
  M:    Marc Zyngier <[email protected]>
  M:    Oliver Upton <[email protected]>
 -R:    James Morse <james.morse@arm.com>
 +R:    Joey Gouly <joey.gouly@arm.com>
  R:    Suzuki K Poulose <[email protected]>
  R:    Zenghui Yu <[email protected]>
  L:    [email protected] (moderated for non-subscribers)
@@@ -12929,29 -12941,49 +12930,29 @@@ LIBATA PATA ARASAN COMPACT FLASH CONTRO
  M:    Viresh Kumar <[email protected]>
  L:    [email protected]
  S:    Maintained
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/axboe/linux-block.git
  F:    drivers/ata/pata_arasan_cf.c
  F:    include/linux/pata_arasan_cf_data.h
  
 -LIBATA PATA DRIVERS
 -R:    Sergey Shtylyov <[email protected]>
 -L:    [email protected]
 -F:    drivers/ata/ata_*.c
 -F:    drivers/ata/pata_*.c
 -
  LIBATA PATA FARADAY FTIDE010 AND GEMINI SATA BRIDGE DRIVERS
  M:    Linus Walleij <[email protected]>
  L:    [email protected]
  S:    Maintained
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/axboe/linux-block.git
  F:    drivers/ata/pata_ftide010.c
  F:    drivers/ata/sata_gemini.c
  F:    drivers/ata/sata_gemini.h
  
  LIBATA SATA AHCI PLATFORM devices support
  M:    Hans de Goede <[email protected]>
 -M:    Jens Axboe <[email protected]>
  L:    [email protected]
  S:    Maintained
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/axboe/linux-block.git
  F:    drivers/ata/ahci_platform.c
  F:    drivers/ata/libahci_platform.c
  F:    include/linux/ahci_platform.h
  
 -LIBATA SATA AHCI SYNOPSYS DWC CONTROLLER DRIVER
 -M:    Serge Semin <[email protected]>
 -L:    [email protected]
 -S:    Maintained
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/dlemoal/libata.git
 -F:    Documentation/devicetree/bindings/ata/baikal,bt1-ahci.yaml
 -F:    Documentation/devicetree/bindings/ata/snps,dwc-ahci.yaml
 -F:    drivers/ata/ahci_dwc.c
 -
  LIBATA SATA PROMISE TX2/TX4 CONTROLLER DRIVER
  M:    Mikael Pettersson <[email protected]>
  L:    [email protected]
  S:    Maintained
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/axboe/linux-block.git
  F:    drivers/ata/sata_promise.*
  
  LIBATA SUBSYSTEM (Serial and Parallel ATA drivers)
@@@ -13921,7 -13953,7 +13922,7 @@@ F:   drivers/media/i2c/max96717.
  
  MAX9860 MONO AUDIO VOICE CODEC DRIVER
  M:    Peter Rosin <[email protected]>
 -L:    [email protected] (moderated for non-subscribers)
 +L:    [email protected]
  S:    Maintained
  F:    Documentation/devicetree/bindings/sound/max9860.txt
  F:    sound/soc/codecs/max9860.*
@@@ -14144,7 -14176,8 +14145,7 @@@ T:   git git://linuxtv.org/media_tree.gi
  F:    drivers/media/platform/nxp/imx-pxp.[ch]
  
  MEDIA DRIVERS FOR ASCOT2E
 -M:    Sergey Kozlov <[email protected]>
 -M:    Abylay Ospan <[email protected]>
 +M:    Abylay Ospan <[email protected]>
  L:    [email protected]
  S:    Supported
  W:    https://linuxtv.org
@@@ -14161,7 -14194,8 +14162,7 @@@ T:   git git://linuxtv.org/media_tree.gi
  F:    drivers/media/dvb-frontends/cxd2099*
  
  MEDIA DRIVERS FOR CXD2841ER
 -M:    Sergey Kozlov <[email protected]>
 -M:    Abylay Ospan <[email protected]>
 +M:    Abylay Ospan <[email protected]>
  L:    [email protected]
  S:    Supported
  W:    https://linuxtv.org
@@@ -14214,7 -14248,7 +14215,7 @@@ F:   drivers/media/platform/nxp/imx7-medi
  F:    drivers/media/platform/nxp/imx8mq-mipi-csi2.c
  
  MEDIA DRIVERS FOR HELENE
 -M:    Abylay Ospan <aospan@netup.ru>
 +M:    Abylay Ospan <aospan@amazon.com>
  L:    [email protected]
  S:    Supported
  W:    https://linuxtv.org
@@@ -14223,7 -14257,8 +14224,7 @@@ T:   git git://linuxtv.org/media_tree.gi
  F:    drivers/media/dvb-frontends/helene*
  
  MEDIA DRIVERS FOR HORUS3A
 -M:    Sergey Kozlov <[email protected]>
 -M:    Abylay Ospan <[email protected]>
 +M:    Abylay Ospan <[email protected]>
  L:    [email protected]
  S:    Supported
  W:    https://linuxtv.org
@@@ -14232,7 -14267,8 +14233,7 @@@ T:   git git://linuxtv.org/media_tree.gi
  F:    drivers/media/dvb-frontends/horus3a*
  
  MEDIA DRIVERS FOR LNBH25
 -M:    Sergey Kozlov <[email protected]>
 -M:    Abylay Ospan <[email protected]>
 +M:    Abylay Ospan <[email protected]>
  L:    [email protected]
  S:    Supported
  W:    https://linuxtv.org
@@@ -14248,7 -14284,8 +14249,7 @@@ T:   git git://linuxtv.org/media_tree.gi
  F:    drivers/media/dvb-frontends/mxl5xx*
  
  MEDIA DRIVERS FOR NETUP PCI UNIVERSAL DVB devices
 -M:    Sergey Kozlov <[email protected]>
 -M:    Abylay Ospan <[email protected]>
 +M:    Abylay Ospan <[email protected]>
  L:    [email protected]
  S:    Supported
  W:    https://linuxtv.org
@@@ -14873,10 -14910,9 +14874,10 @@@ N: include/linux/page[-_]
  
  MEMORY MAPPING
  M:    Andrew Morton <[email protected]>
 -R:    Liam R. Howlett <[email protected]>
 +M:    Liam R. Howlett <[email protected]>
 +M:    Lorenzo Stoakes <[email protected]>
  R:    Vlastimil Babka <[email protected]>
 -R:    Lorenzo Stoakes <lorenzo.stoakes@oracle.com>
 +R:    Jann Horn <jannh@google.com>
  L:    [email protected]
  S:    Maintained
  W:    http://www.linux-mm.org
@@@ -14899,6 -14935,13 +14900,6 @@@ F:  drivers/mtd
  F:    include/linux/mtd/
  F:    include/uapi/mtd/
  
 -MEMSENSING MICROSYSTEMS MSA311 DRIVER
 -M:    Dmitry Rokosov <[email protected]>
 -L:    [email protected]
 -S:    Maintained
 -F:    Documentation/devicetree/bindings/iio/accel/memsensing,msa311.yaml
 -F:    drivers/iio/accel/msa311.c
 -
  MEN A21 WATCHDOG DRIVER
  M:    Johannes Thumshirn <[email protected]>
  L:    [email protected]
@@@ -15043,8 -15086,7 +15044,8 @@@ F:   drivers/spi/spi-at91-usart.
  
  MICROCHIP AUDIO ASOC DRIVERS
  M:    Claudiu Beznea <[email protected]>
 -L:    [email protected] (moderated for non-subscribers)
 +M:    Andrei Simion <[email protected]>
 +L:    [email protected]
  S:    Supported
  F:    Documentation/devicetree/bindings/sound/atmel*
  F:    Documentation/devicetree/bindings/sound/axentia,tse850-pcm5142.txt
@@@ -15152,7 -15194,6 +15153,7 @@@ F:   include/video/atmel_lcdc.
  
  MICROCHIP MCP16502 PMIC DRIVER
  M:    Claudiu Beznea <[email protected]>
 +M:    Andrei Simion <[email protected]>
  L:    [email protected] (moderated for non-subscribers)
  S:    Supported
  F:    Documentation/devicetree/bindings/regulator/microchip,mcp16502.yaml
@@@ -15234,6 -15275,7 +15235,6 @@@ F:   drivers/tty/serial/8250/8250_pci1xxx
  
  MICROCHIP POLARFIRE FPGA DRIVERS
  M:    Conor Dooley <[email protected]>
 -R:    Vladimir Georgiev <[email protected]>
  L:    [email protected]
  S:    Supported
  F:    Documentation/devicetree/bindings/fpga/microchip,mpf-spi-fpga-mgr.yaml
@@@ -15283,7 -15325,6 +15284,7 @@@ F:   drivers/spi/spi-atmel.
  
  MICROCHIP SSC DRIVER
  M:    Claudiu Beznea <[email protected]>
 +M:    Andrei Simion <[email protected]>
  L:    [email protected] (moderated for non-subscribers)
  S:    Supported
  F:    Documentation/devicetree/bindings/misc/atmel-ssc.txt
@@@ -15489,6 -15530,17 +15490,6 @@@ F:  arch/mips
  F:    drivers/platform/mips/
  F:    include/dt-bindings/mips/
  
 -MIPS BAIKAL-T1 PLATFORM
 -M:    Serge Semin <[email protected]>
 -L:    [email protected]
 -S:    Supported
 -F:    Documentation/devicetree/bindings/bus/baikal,bt1-*.yaml
 -F:    Documentation/devicetree/bindings/clock/baikal,bt1-*.yaml
 -F:    drivers/bus/bt1-*.c
 -F:    drivers/clk/baikal-t1/
 -F:    drivers/memory/bt1-l2-ctl.c
 -F:    drivers/mtd/maps/physmap-bt1-rom.[ch]
 -
  MIPS BOSTON DEVELOPMENT BOARD
  M:    Paul Burton <[email protected]>
  L:    [email protected]
@@@ -15501,6 -15553,7 +15502,6 @@@ F:   include/dt-bindings/clock/boston-clo
  
  MIPS CORE DRIVERS
  M:    Thomas Bogendoerfer <[email protected]>
 -M:    Serge Semin <[email protected]>
  L:    [email protected]
  S:    Supported
  F:    drivers/bus/mips_cdmm.c
@@@ -15905,7 -15958,7 +15906,7 @@@ F:   include/linux/mtd/*nand*.
  
  NATIVE INSTRUMENTS USB SOUND INTERFACE DRIVER
  M:    Daniel Mack <[email protected]>
 -L:    [email protected] (moderated for non-subscribers)
 +L:    [email protected]
  S:    Maintained
  W:    http://www.native-instruments.com
  F:    sound/usb/caiaq/
@@@ -16036,7 -16089,6 +16037,7 @@@ F:   include/uapi/linux/net_dropmon.
  F:    net/core/drop_monitor.c
  
  NETWORKING DRIVERS
 +M:    Andrew Lunn <[email protected]>
  M:    "David S. Miller" <[email protected]>
  M:    Eric Dumazet <[email protected]>
  M:    Jakub Kicinski <[email protected]>
@@@ -16084,6 -16136,7 +16085,6 @@@ F:   drivers/net/wireless
  
  NETWORKING [DSA]
  M:    Andrew Lunn <[email protected]>
 -M:    Florian Fainelli <[email protected]>
  M:    Vladimir Oltean <[email protected]>
  S:    Maintained
  F:    Documentation/devicetree/bindings/net/dsa/
@@@ -16101,7 -16154,6 +16102,7 @@@ M:   "David S. Miller" <[email protected]
  M:    Eric Dumazet <[email protected]>
  M:    Jakub Kicinski <[email protected]>
  M:    Paolo Abeni <[email protected]>
 +R:    Simon Horman <[email protected]>
  L:    [email protected]
  S:    Maintained
  P:    Documentation/process/maintainer-netdev.rst
@@@ -16144,22 -16196,10 +16145,22 @@@ F:        include/uapi/linux/rtnetlink.
  F:    lib/net_utils.c
  F:    lib/random32.c
  F:    net/
 +F:    samples/pktgen/
  F:    tools/net/
  F:    tools/testing/selftests/net/
 +X:    Documentation/networking/mac80211-injection.rst
 +X:    Documentation/networking/mac80211_hwsim/
 +X:    Documentation/networking/regulatory.rst
 +X:    include/net/cfg80211.h
 +X:    include/net/ieee80211_radiotap.h
 +X:    include/net/iw_handler.h
 +X:    include/net/mac80211.h
 +X:    include/net/wext.h
  X:    net/9p/
  X:    net/bluetooth/
 +X:    net/mac80211/
 +X:    net/rfkill/
 +X:    net/wireless/
  
  NETWORKING [IPSEC]
  M:    Steffen Klassert <[email protected]>
@@@ -16469,6 -16509,12 +16470,6 @@@ F:  include/linux/ntb.
  F:    include/linux/ntb_transport.h
  F:    tools/testing/selftests/ntb/
  
 -NTB IDT DRIVER
 -M:    Serge Semin <[email protected]>
 -L:    [email protected]
 -S:    Supported
 -F:    drivers/ntb/hw/idt/
 -
  NTB INTEL DRIVER
  M:    Dave Jiang <[email protected]>
  L:    [email protected]
@@@ -16683,7 -16729,7 +16684,7 @@@ F:   drivers/extcon/extcon-ptn5150.
  
  NXP SGTL5000 DRIVER
  M:    Fabio Estevam <[email protected]>
 -L:    [email protected] (moderated for non-subscribers)
 +L:    [email protected]
  S:    Maintained
  F:    Documentation/devicetree/bindings/sound/fsl,sgtl5000.yaml
  F:    sound/soc/codecs/sgtl5000*
@@@ -16707,7 -16753,7 +16708,7 @@@ K:   "nxp,tda998x
  
  NXP TFA9879 DRIVER
  M:    Peter Rosin <[email protected]>
 -L:    [email protected] (moderated for non-subscribers)
 +L:    [email protected]
  S:    Maintained
  F:    Documentation/devicetree/bindings/sound/nxp,tfa9879.yaml
  F:    sound/soc/codecs/tfa9879*
@@@ -16719,7 -16765,7 +16720,7 @@@ F:   drivers/nfc/nxp-nc
  
  NXP/Goodix TFA989X (TFA1) DRIVER
  M:    Stephan Gerhold <[email protected]>
 -L:    [email protected] (moderated for non-subscribers)
 +L:    [email protected]
  S:    Maintained
  F:    Documentation/devicetree/bindings/sound/nxp,tfa989x.yaml
  F:    sound/soc/codecs/tfa989x.c
@@@ -16805,7 -16851,7 +16806,7 @@@ F:   include/uapi/misc/ocxl.
  OMAP AUDIO SUPPORT
  M:    Peter Ujfalusi <[email protected]>
  M:    Jarkko Nikula <[email protected]>
 -L:    [email protected] (moderated for non-subscribers)
 +L:    [email protected]
  L:    [email protected]
  S:    Maintained
  F:    sound/soc/ti/n810.c
@@@ -17362,7 -17408,7 +17363,7 @@@ F:   include/linux/pm_opp.
  
  OPL4 DRIVER
  M:    Clemens Ladisch <[email protected]>
 -L:    [email protected] (moderated for non-subscribers)
 +L:    [email protected]
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound.git
  F:    sound/drivers/opl4/
@@@ -18489,6 -18535,13 +18490,6 @@@ F:  drivers/pps
  F:    include/linux/pps*.h
  F:    include/uapi/linux/pps.h
  
 -PPTP DRIVER
 -M:    Dmitry Kozlov <[email protected]>
 -L:    [email protected]
 -S:    Maintained
 -W:    http://sourceforge.net/projects/accel-pptp
 -F:    drivers/net/ppp/pptp.c
 -
  PRESSURE STALL INFORMATION (PSI)
  M:    Johannes Weiner <[email protected]>
  M:    Suren Baghdasaryan <[email protected]>
@@@ -18738,7 -18791,7 +18739,7 @@@ F:   drivers/crypto/intel/qat
  
  QCOM AUDIO (ASoC) DRIVERS
  M:    Srinivas Kandagatla <[email protected]>
 -L:    [email protected] (moderated for non-subscribers)
 +L:    [email protected]
  L:    [email protected]
  S:    Supported
  F:    Documentation/devicetree/bindings/soc/qcom/qcom,apr*
@@@ -19462,14 -19515,6 +19463,14 @@@ S: Maintaine
  F:    Documentation/tools/rtla/
  F:    tools/tracing/rtla/
  
 +Real-time Linux (PREEMPT_RT)
 +M:    Sebastian Andrzej Siewior <[email protected]>
 +M:    Clark Williams <[email protected]>
 +M:    Steven Rostedt <[email protected]>
 +L:    [email protected]
 +S:    Supported
 +K:    PREEMPT_RT
 +
  REALTEK AUDIO CODECS
  M:    Oder Chiou <[email protected]>
  S:    Maintained
@@@ -19580,11 -19625,9 +19581,11 @@@ F: Documentation/devicetree/bindings/i2
  F:    drivers/i2c/busses/i2c-emev2.c
  
  RENESAS ETHERNET AVB DRIVER
 -R:    Sergey Shtylyov <[email protected]>
 +M:    Paul Barker <[email protected]>
 +M:    Niklas Söderlund <[email protected]>
  L:    [email protected]
  L:    [email protected]
 +S:    Supported
  F:    Documentation/devicetree/bindings/net/renesas,etheravb.yaml
  F:    drivers/net/ethernet/renesas/Kconfig
  F:    drivers/net/ethernet/renesas/Makefile
@@@ -19610,7 -19653,7 +19611,7 @@@ F:   drivers/net/ethernet/renesas/rtsn.
  
  RENESAS IDT821034 ASoC CODEC
  M:    Herve Codina <[email protected]>
 -L:    [email protected] (moderated for non-subscribers)
 +L:    [email protected]
  S:    Maintained
  F:    Documentation/devicetree/bindings/sound/renesas,idt821034.yaml
  F:    sound/soc/codecs/idt821034.c
@@@ -19640,7 -19683,7 +19641,7 @@@ F:   drivers/i2c/busses/i2c-rcar.
  F:    drivers/i2c/busses/i2c-sh_mobile.c
  
  RENESAS R-CAR SATA DRIVER
 -R:    Sergey Shtylyov <[email protected]>
 +M:    Geert Uytterhoeven <[email protected]>
  L:    [email protected]
  L:    [email protected]
  S:    Supported
@@@ -19723,10 -19766,9 +19724,10 @@@ F: Documentation/devicetree/bindings/i2
  F:    drivers/i2c/busses/i2c-rzv2m.c
  
  RENESAS SUPERH ETHERNET DRIVER
 -R:    Sergey Shtylyov <[email protected]>
 +M:    Niklas Söderlund <[email protected]>
  L:    [email protected]
  L:    [email protected]
 +S:    Supported
  F:    Documentation/devicetree/bindings/net/renesas,ether.yaml
  F:    drivers/net/ethernet/renesas/Kconfig
  F:    drivers/net/ethernet/renesas/Makefile
@@@ -19877,10 -19919,12 +19878,10 @@@ 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/
 -X:    arch/riscv/boot/dts/allwinner/
 -X:    arch/riscv/boot/dts/renesas/
 -X:    arch/riscv/boot/dts/sophgo/
 -X:    arch/riscv/boot/dts/thead/
 +F:    arch/riscv/boot/dts/canaan/
 +F:    arch/riscv/boot/dts/microchip/
 +F:    arch/riscv/boot/dts/sifive/
 +F:    arch/riscv/boot/dts/starfive/
  
  RISC-V PMU DRIVERS
  M:    Atish Patra <[email protected]>
@@@ -20360,7 -20404,7 +20361,7 @@@ F:   security/safesetid
  
  SAMSUNG AUDIO (ASoC) DRIVERS
  M:    Sylwester Nawrocki <[email protected]>
 -L:    [email protected] (moderated for non-subscribers)
 +L:    [email protected]
  S:    Maintained
  B:    mailto:[email protected]
  F:    Documentation/devicetree/bindings/sound/samsung*
@@@ -20896,7 -20940,7 +20897,7 @@@ F:   drivers/media/rc/serial_ir.
  
  SERIAL LOW-POWER INTER-CHIP MEDIA BUS (SLIMbus)
  M:    Srinivas Kandagatla <[email protected]>
 -L:    [email protected] (moderated for non-subscribers)
 +L:    [email protected]
  S:    Maintained
  F:    Documentation/devicetree/bindings/slimbus/
  F:    drivers/slimbus/
@@@ -21330,7 -21374,7 +21331,7 @@@ F:   Documentation/devicetree/bindings/i2
  F:    drivers/i2c/busses/i2c-synquacer.c
  
  SOCIONEXT UNIPHIER SOUND DRIVER
 -L:    [email protected] (moderated for non-subscribers)
 +L:    [email protected]
  S:    Orphan
  F:    sound/soc/uniphier/
  
@@@ -21589,7 -21633,7 +21590,7 @@@ F:   tools/testing/selftests/als
  
  SOUND - COMPRESSED AUDIO
  M:    Vinod Koul <[email protected]>
 -L:    [email protected] (moderated for non-subscribers)
 +L:    [email protected]
  S:    Supported
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound.git
  F:    Documentation/sound/designs/compress-offload.rst
@@@ -21647,21 -21691,12 +21648,21 @@@ S:        Supporte
  W:    https://github.com/thesofproject/linux/
  F:    sound/soc/sof/
  
 +SOUND - GENERIC SOUND CARD (Simple-Audio-Card, Audio-Graph-Card)
 +M:    Kuninori Morimoto <[email protected]>
 +S:    Supported
 +L:    [email protected]
 +F:    sound/soc/generic/
 +F:    include/sound/simple_card*
 +F:    Documentation/devicetree/bindings/sound/simple-card.yaml
 +F:    Documentation/devicetree/bindings/sound/audio-graph*.yaml
 +
  SOUNDWIRE SUBSYSTEM
  M:    Vinod Koul <[email protected]>
  M:    Bard Liao <[email protected]>
  R:    Pierre-Louis Bossart <[email protected]>
  R:    Sanyog Kale <[email protected]>
 -L:    [email protected] (moderated for non-subscribers)
 +L:    [email protected]
  S:    Supported
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/vkoul/soundwire.git
  F:    Documentation/driver-api/soundwire/
@@@ -21734,8 -21769,8 +21735,8 @@@ F:   drivers/accessibility/speakup
  SPEAR PLATFORM/CLOCK/PINCTRL SUPPORT
  M:    Viresh Kumar <[email protected]>
  M:    Shiraz Hashim <[email protected]>
 -M:    [email protected]
  L:    [email protected] (moderated for non-subscribers)
 +L:    [email protected]
  S:    Maintained
  W:    http://www.st.com/spear
  F:    arch/arm/boot/dts/st/spear*
@@@ -22134,7 -22169,7 +22135,7 @@@ F:   kernel/static_call.
  
  STI AUDIO (ASoC) DRIVERS
  M:    Arnaud Pouliquen <[email protected]>
 -L:    [email protected] (moderated for non-subscribers)
 +L:    [email protected]
  S:    Maintained
  F:    Documentation/devicetree/bindings/sound/st,sti-asoc-card.txt
  F:    sound/soc/sti/
@@@ -22155,7 -22190,7 +22156,7 @@@ F:   drivers/media/usb/stk1160
  STM32 AUDIO (ASoC) DRIVERS
  M:    Olivier Moysan <[email protected]>
  M:    Arnaud Pouliquen <[email protected]>
 -L:    [email protected] (moderated for non-subscribers)
 +L:    [email protected]
  S:    Maintained
  F:    Documentation/devicetree/bindings/iio/adc/st,stm32-dfsdm-adc.yaml
  F:    Documentation/devicetree/bindings/sound/st,stm32-*.yaml
@@@ -22393,11 -22428,19 +22394,11 @@@ F:        drivers/tty/serial/8250/8250_lpss.
  
  SYNOPSYS DESIGNWARE APB GPIO DRIVER
  M:    Hoan Tran <[email protected]>
 -M:    Serge Semin <[email protected]>
  L:    [email protected]
  S:    Maintained
  F:    Documentation/devicetree/bindings/gpio/snps,dw-apb-gpio.yaml
  F:    drivers/gpio/gpio-dwapb.c
  
 -SYNOPSYS DESIGNWARE APB SSI DRIVER
 -M:    Serge Semin <[email protected]>
 -L:    [email protected]
 -S:    Supported
 -F:    Documentation/devicetree/bindings/spi/snps,dw-apb-ssi.yaml
 -F:    drivers/spi/spi-dw*
 -
  SYNOPSYS DESIGNWARE AXI DMAC DRIVER
  M:    Eugeniy Paltsev <[email protected]>
  S:    Maintained
@@@ -22850,7 -22893,7 +22851,7 @@@ F:   drivers/irqchip/irq-xtensa-
  
  TEXAS INSTRUMENTS ASoC DRIVERS
  M:    Peter Ujfalusi <[email protected]>
 -L:    [email protected] (moderated for non-subscribers)
 +L:    [email protected]
  S:    Maintained
  F:    Documentation/devicetree/bindings/sound/davinci-mcasp-audio.yaml
  F:    sound/soc/ti/
@@@ -22859,7 -22902,7 +22860,7 @@@ TEXAS INSTRUMENTS AUDIO (ASoC/HDA) DRIV
  M:    Shenghao Ding <[email protected]>
  M:    Kevin Lu <[email protected]>
  M:    Baojun Xu <[email protected]>
 -L:    [email protected] (moderated for non-subscribers)
 +L:    [email protected]
  S:    Maintained
  F:    Documentation/devicetree/bindings/sound/tas2552.txt
  F:    Documentation/devicetree/bindings/sound/ti,tas2562.yaml
@@@ -23227,7 -23270,7 +23228,7 @@@ F:   drivers/soc/ti/
  TI LM49xxx FAMILY ASoC CODEC DRIVERS
  M:    M R Swami Reddy <[email protected]>
  M:    Vishwas A Deshpande <[email protected]>
 -L:    [email protected] (moderated for non-subscribers)
 +L:    [email protected]
  S:    Maintained
  F:    sound/soc/codecs/isabelle*
  F:    sound/soc/codecs/lm49453*
@@@ -23241,15 -23284,15 +23242,15 @@@ F:        Documentation/devicetree/bindings/ii
  F:    drivers/iio/adc/ti-lmp92064.c
  
  TI PCM3060 ASoC CODEC DRIVER
 -M:    Kirill Marinushkin <kmarinushkin@birdec.com>
 -L:    [email protected] (moderated for non-subscribers)
 +M:    Kirill Marinushkin <k.marinushkin@gmail.com>
 +L:    [email protected]
  S:    Maintained
  F:    Documentation/devicetree/bindings/sound/pcm3060.txt
  F:    sound/soc/codecs/pcm3060*
  
  TI TAS571X FAMILY ASoC CODEC DRIVER
  M:    Kevin Cernekee <[email protected]>
 -L:    [email protected] (moderated for non-subscribers)
 +L:    [email protected]
  S:    Odd Fixes
  F:    sound/soc/codecs/tas571x*
  
@@@ -23277,7 -23320,7 +23278,7 @@@ F:   drivers/iio/adc/ti-tsc2046.
  
  TI TWL4030 SERIES SOC CODEC DRIVER
  M:    Peter Ujfalusi <[email protected]>
 -L:    [email protected] (moderated for non-subscribers)
 +L:    [email protected]
  S:    Maintained
  F:    sound/soc/codecs/twl4030*
  
  S:    Maintained
  F:    drivers/hid/hid-udraw-ps3.c
  
 -UFS FILESYSTEM
 -M:    Evgeniy Dushistov <[email protected]>
 -S:    Maintained
 -F:    Documentation/admin-guide/ufs.rst
 -F:    fs/ufs/
 -
  UHID USERSPACE HID IO DRIVER
  M:    David Rheinsberg <[email protected]>
  L:    [email protected]
@@@ -23947,7 -23996,7 +23948,7 @@@ F:   drivers/usb/storage
  
  USB MIDI DRIVER
  M:    Clemens Ladisch <[email protected]>
 -L:    [email protected] (moderated for non-subscribers)
 +L:    [email protected]
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound.git
  F:    sound/usb/midi.*
@@@ -24009,7 -24058,6 +24010,7 @@@ USB RAW GADGET DRIVE
  R:    Andrey Konovalov <[email protected]>
  L:    [email protected]
  S:    Maintained
 +B:    https://github.com/xairy/raw-gadget/issues
  F:    Documentation/usb/raw-gadget.rst
  F:    drivers/usb/gadget/legacy/raw_gadget.c
  F:    include/uapi/linux/usb/raw_gadget.h
@@@ -24126,12 -24174,8 +24127,12 @@@ F: drivers/usb/host/xhci
  
  USER DATAGRAM PROTOCOL (UDP)
  M:    Willem de Bruijn <[email protected]>
 +L:    [email protected]
  S:    Maintained
  F:    include/linux/udp.h
 +F:    include/net/udp.h
 +F:    include/trace/events/udp.h
 +F:    include/uapi/linux/udp.h
  F:    net/ipv4/udp.c
  F:    net/ipv6/udp.c
  
@@@ -24612,7 -24656,7 +24613,7 @@@ VIRTIO SOUND DRIVE
  M:    Anton Yakovlev <[email protected]>
  M:    "Michael S. Tsirkin" <[email protected]>
  L:    [email protected]
 -L:    [email protected] (moderated for non-subscribers)
 +L:    [email protected]
  S:    Maintained
  F:    include/uapi/linux/virtio_snd.h
  F:    sound/virtio/*
@@@ -24681,10 -24725,9 +24682,10 @@@ F: tools/testing/vsock
  
  VMA
  M:    Andrew Morton <[email protected]>
 -R:    Liam R. Howlett <[email protected]>
 +M:    Liam R. Howlett <[email protected]>
 +M:    Lorenzo Stoakes <[email protected]>
  R:    Vlastimil Babka <[email protected]>
 -R:    Lorenzo Stoakes <lorenzo.stoakes@oracle.com>
 +R:    Jann Horn <jannh@google.com>
  L:    [email protected]
  S:    Maintained
  W:    https://www.linux-mm.org
@@@ -25342,7 -25385,7 +25343,7 @@@ F:   include/xen/interface/io/usbif.
  XEN SOUND FRONTEND DRIVER
  M:    Oleksandr Andrushchenko <[email protected]>
  L:    [email protected] (moderated for non-subscribers)
 -L:    [email protected] (moderated for non-subscribers)
 +L:    [email protected]
  S:    Supported
  F:    sound/xen/*
  
@@@ -25358,7 -25401,7 +25359,7 @@@ F:   include/xen/arm/swiotlb-xen.
  F:    include/xen/swiotlb-xen.h
  
  XFS FILESYSTEM
 -M:    Chandan Babu R <[email protected]>
 +M:    Carlos Maiolino <[email protected]>
  R:    Darrick J. Wong <[email protected]>
  L:    [email protected]
  S:    Supported
diff --combined fs/btrfs/extent_io.c
index 872cca54cc6ce41bd0f6f5809b1a5671e6187239,4667d1e034e0ead11c6553dabb226f09dec9e415..42c9899d9241c97f622cd329cfb14a0c3e5d3fea
@@@ -262,23 -262,22 +262,23 @@@ static noinline int lock_delalloc_folio
  
                for (i = 0; i < found_folios; i++) {
                        struct folio *folio = fbatch.folios[i];
 -                      u32 len = end + 1 - start;
 +                      u64 range_start;
 +                      u32 range_len;
  
                        if (folio == locked_folio)
                                continue;
  
 -                      if (btrfs_folio_start_writer_lock(fs_info, folio, start,
 -                                                        len))
 -                              goto out;
 -
 +                      folio_lock(folio);
                        if (!folio_test_dirty(folio) || folio->mapping != mapping) {
 -                              btrfs_folio_end_writer_lock(fs_info, folio, start,
 -                                                          len);
 +                              folio_unlock(folio);
                                goto out;
                        }
 +                      range_start = max_t(u64, folio_pos(folio), start);
 +                      range_len = min_t(u64, folio_pos(folio) + folio_size(folio),
 +                                        end + 1) - range_start;
 +                      btrfs_folio_set_writer_lock(fs_info, folio, range_start, range_len);
  
 -                      processed_end = folio_pos(folio) + folio_size(folio) - 1;
 +                      processed_end = range_start + range_len - 1;
                }
                folio_batch_release(&fbatch);
                cond_resched();
@@@ -786,7 -785,7 +786,7 @@@ static void submit_extent_folio(struct 
                }
  
                if (bio_ctrl->wbc)
-                       wbc_account_cgroup_owner(bio_ctrl->wbc, &folio->page,
+                       wbc_account_cgroup_owner(bio_ctrl->wbc, folio,
                                                 len);
  
                size -= len;
@@@ -1307,13 -1306,6 +1307,13 @@@ static int submit_one_sector(struct btr
        free_extent_map(em);
        em = NULL;
  
 +      /*
 +       * Although the PageDirty bit is cleared before entering this
 +       * function, subpage dirty bit is not cleared.
 +       * So clear subpage dirty bit here so next time we won't submit
 +       * a folio for a range already written to disk.
 +       */
 +      btrfs_folio_clear_dirty(fs_info, folio, filepos, sectorsize);
        btrfs_set_range_writeback(inode, filepos, filepos + sectorsize - 1);
        /*
         * Above call should set the whole folio with writeback flag, even
         */
        ASSERT(folio_test_writeback(folio));
  
 -      /*
 -       * Although the PageDirty bit is cleared before entering this
 -       * function, subpage dirty bit is not cleared.
 -       * So clear subpage dirty bit here so next time we won't submit
 -       * folio for range already written to disk.
 -       */
 -      btrfs_folio_clear_dirty(fs_info, folio, filepos, sectorsize);
        submit_extent_folio(bio_ctrl, disk_bytenr, folio,
                            sectorsize, filepos - folio_pos(folio));
        return 0;
@@@ -1708,7 -1707,7 +1708,7 @@@ static noinline_for_stack void write_on
                ret = bio_add_folio(&bbio->bio, folio, eb->len,
                                    eb->start - folio_pos(folio));
                ASSERT(ret);
-               wbc_account_cgroup_owner(wbc, folio_page(folio, 0), eb->len);
+               wbc_account_cgroup_owner(wbc, folio, eb->len);
                folio_unlock(folio);
        } else {
                int num_folios = num_extent_folios(eb);
                        folio_start_writeback(folio);
                        ret = bio_add_folio(&bbio->bio, folio, eb->folio_size, 0);
                        ASSERT(ret);
-                       wbc_account_cgroup_owner(wbc, folio_page(folio, 0),
-                                                eb->folio_size);
+                       wbc_account_cgroup_owner(wbc, folio, eb->folio_size);
                        wbc->nr_to_write -= folio_nr_pages(folio);
                        folio_unlock(folio);
                }
diff --combined fs/btrfs/inode.c
index 1e4ca1e7d2e58d4d209bfe41f4f000749f5e37ec,eb64f04755c238c32d29087fe0f28ec33696dbab..df20f2e7ac1efb88fa94874e7010f94db25ce3e6
@@@ -32,7 -32,7 +32,7 @@@
  #include <linux/migrate.h>
  #include <linux/sched/mm.h>
  #include <linux/iomap.h>
 -#include <asm/unaligned.h>
 +#include <linux/unaligned.h>
  #include <linux/fsverity.h>
  #include "misc.h"
  #include "ctree.h"
@@@ -1618,7 -1618,7 +1618,7 @@@ out_unlock
                clear_bits |= EXTENT_CLEAR_DATA_RESV;
                extent_clear_unlock_delalloc(inode, start, end, locked_folio,
                                             &cached, clear_bits, page_ops);
 -              btrfs_qgroup_free_data(inode, NULL, start, cur_alloc_size, NULL);
 +              btrfs_qgroup_free_data(inode, NULL, start, end - start + 1, NULL);
        }
        return ret;
  }
@@@ -1729,7 -1729,7 +1729,7 @@@ static bool run_delalloc_compressed(str
                         * need full accuracy.  Just account the whole thing
                         * against the first page.
                         */
-                       wbc_account_cgroup_owner(wbc, &locked_folio->page,
+                       wbc_account_cgroup_owner(wbc, locked_folio,
                                                 cur_end - start);
                        async_chunk[i].locked_folio = locked_folio;
                        locked_folio = NULL;
@@@ -3111,11 -3111,6 +3111,11 @@@ int btrfs_finish_one_ordered(struct btr
                ret = btrfs_update_inode_fallback(trans, inode);
                if (ret) /* -ENOMEM or corruption */
                        btrfs_abort_transaction(trans, ret);
 +
 +              ret = btrfs_insert_raid_extent(trans, ordered_extent);
 +              if (ret)
 +                      btrfs_abort_transaction(trans, ret);
 +
                goto out;
        }
  
@@@ -4368,8 -4363,11 +4368,8 @@@ static int btrfs_unlink_subvol(struct b
         */
        if (btrfs_ino(inode) == BTRFS_EMPTY_SUBVOL_DIR_OBJECTID) {
                di = btrfs_search_dir_index_item(root, path, dir_ino, &fname.disk_name);
 -              if (IS_ERR_OR_NULL(di)) {
 -                      if (!di)
 -                              ret = -ENOENT;
 -                      else
 -                              ret = PTR_ERR(di);
 +              if (IS_ERR(di)) {
 +                      ret = PTR_ERR(di);
                        btrfs_abort_transaction(trans, ret);
                        goto out;
                }
diff --combined fs/hfsplus/hfsplus_fs.h
index b733ef0c1547bfa4f36d0ced09a3d64c9f2cda79,5389918bbf29db3837114e2e8d7cebc2e8ac9f8a..2f089bff0095c0003b482c4c680adb1c005ca79a
@@@ -21,7 -21,6 +21,7 @@@
  #include <linux/mutex.h>
  #include <linux/buffer_head.h>
  #include <linux/blkdev.h>
 +#include <linux/fs_context.h>
  #include "hfsplus_raw.h"
  
  #define DBG_BNODE_REFS        0x00000001
@@@ -157,6 -156,7 +157,7 @@@ struct hfsplus_sb_info 
  
        /* Runtime variables */
        u32 blockoffset;
+       u32 min_io_size;
        sector_t part_start;
        sector_t sect_count;
        int fs_shift;
@@@ -308,7 -308,7 +309,7 @@@ struct hfsplus_readdir_data 
   */
  static inline unsigned short hfsplus_min_io_size(struct super_block *sb)
  {
-       return max_t(unsigned short, bdev_logical_block_size(sb->s_bdev),
+       return max_t(unsigned short, HFSPLUS_SB(sb)->min_io_size,
                     HFSPLUS_SECTOR_SIZE);
  }
  
@@@ -497,7 -497,8 +498,7 @@@ long hfsplus_ioctl(struct file *filp, u
  
  /* options.c */
  void hfsplus_fill_defaults(struct hfsplus_sb_info *opts);
 -int hfsplus_parse_options_remount(char *input, int *force);
 -int hfsplus_parse_options(char *input, struct hfsplus_sb_info *sbi);
 +int hfsplus_parse_param(struct fs_context *fc, struct fs_parameter *param);
  int hfsplus_show_options(struct seq_file *seq, struct dentry *root);
  
  /* part_tbl.c */
diff --combined fs/hfsplus/wrapper.c
index 9592ffcb44e5ea0be17eb07cc9ad69f1d404968a,4b0fdc49d1fe7ee66305f8c024cc7c691238d4b0..74801911bc1cc45bc14dd1035f606186882f266c
@@@ -12,7 -12,7 +12,7 @@@
  #include <linux/fs.h>
  #include <linux/blkdev.h>
  #include <linux/cdrom.h>
 -#include <asm/unaligned.h>
 +#include <linux/unaligned.h>
  
  #include "hfsplus_fs.h"
  #include "hfsplus_raw.h"
@@@ -172,6 -172,8 +172,8 @@@ int hfsplus_read_wrapper(struct super_b
        if (!blocksize)
                goto out;
  
+       sbi->min_io_size = blocksize;
        if (hfsplus_get_last_session(sb, &part_start, &part_size))
                goto out;
  
diff --combined fs/inode.c
index 70a2f8c717e063752a0b87c6eb27cde7a18d6879,84ab7b209b389d0787d71c282bfa842bcfef503a..b13b778257ae6cd48785d68e8da4040161e2f76b
  #include <linux/list_lru.h>
  #include <linux/iversion.h>
  #include <linux/rw_hint.h>
 +#include <linux/seq_file.h>
 +#include <linux/debugfs.h>
  #include <trace/events/writeback.h>
 +#define CREATE_TRACE_POINTS
 +#include <trace/events/timestamp.h>
 +
  #include "internal.h"
  
  /*
@@@ -103,70 -98,6 +103,70 @@@ long get_nr_dirty_inodes(void
        return nr_dirty > 0 ? nr_dirty : 0;
  }
  
 +#ifdef CONFIG_DEBUG_FS
 +static DEFINE_PER_CPU(long, mg_ctime_updates);
 +static DEFINE_PER_CPU(long, mg_fine_stamps);
 +static DEFINE_PER_CPU(long, mg_ctime_swaps);
 +
 +static unsigned long get_mg_ctime_updates(void)
 +{
 +      unsigned long sum = 0;
 +      int i;
 +
 +      for_each_possible_cpu(i)
 +              sum += data_race(per_cpu(mg_ctime_updates, i));
 +      return sum;
 +}
 +
 +static unsigned long get_mg_fine_stamps(void)
 +{
 +      unsigned long sum = 0;
 +      int i;
 +
 +      for_each_possible_cpu(i)
 +              sum += data_race(per_cpu(mg_fine_stamps, i));
 +      return sum;
 +}
 +
 +static unsigned long get_mg_ctime_swaps(void)
 +{
 +      unsigned long sum = 0;
 +      int i;
 +
 +      for_each_possible_cpu(i)
 +              sum += data_race(per_cpu(mg_ctime_swaps, i));
 +      return sum;
 +}
 +
 +#define mgtime_counter_inc(__var)     this_cpu_inc(__var)
 +
 +static int mgts_show(struct seq_file *s, void *p)
 +{
 +      unsigned long ctime_updates = get_mg_ctime_updates();
 +      unsigned long ctime_swaps = get_mg_ctime_swaps();
 +      unsigned long fine_stamps = get_mg_fine_stamps();
 +      unsigned long floor_swaps = timekeeping_get_mg_floor_swaps();
 +
 +      seq_printf(s, "%lu %lu %lu %lu\n",
 +                 ctime_updates, ctime_swaps, fine_stamps, floor_swaps);
 +      return 0;
 +}
 +
 +DEFINE_SHOW_ATTRIBUTE(mgts);
 +
 +static int __init mg_debugfs_init(void)
 +{
 +      debugfs_create_file("multigrain_timestamps", S_IFREG | S_IRUGO, NULL, NULL, &mgts_fops);
 +      return 0;
 +}
 +late_initcall(mg_debugfs_init);
 +
 +#else /* ! CONFIG_DEBUG_FS */
 +
 +#define mgtime_counter_inc(__var)     do { } while (0)
 +
 +#endif /* CONFIG_DEBUG_FS */
 +
  /*
   * Handle nr_inode sysctl
   */
@@@ -215,16 -146,14 +215,16 @@@ static int no_open(struct inode *inode
  }
  
  /**
 - * inode_init_always - perform inode structure initialisation
 + * inode_init_always_gfp - perform inode structure initialisation
   * @sb: superblock inode belongs to
   * @inode: inode to initialise
 + * @gfp: allocation flags
   *
   * These are initializations that need to be done on every inode
   * allocation as the fields are not initialised by slab allocation.
 + * If there are additional allocations required @gfp is used.
   */
 -int inode_init_always(struct super_block *sb, struct inode *inode)
 +int inode_init_always_gfp(struct super_block *sb, struct inode *inode, gfp_t gfp)
  {
        static const struct inode_operations empty_iops;
        static const struct file_operations no_open_fops = {.open = no_open};
        inode->i_opflags = 0;
        if (sb->s_xattr)
                inode->i_opflags |= IOP_XATTR;
 +      if (sb->s_type->fs_flags & FS_MGTIME)
 +              inode->i_opflags |= IOP_MGTIME;
        i_uid_write(inode, 0);
        i_gid_write(inode, 0);
        atomic_set(&inode->i_writecount, 0);
  #endif
        inode->i_flctx = NULL;
  
 -      if (unlikely(security_inode_alloc(inode)))
 +      if (unlikely(security_inode_alloc(inode, gfp)))
                return -ENOMEM;
  
        this_cpu_inc(nr_inodes);
  
        return 0;
  }
 -EXPORT_SYMBOL(inode_init_always);
 +EXPORT_SYMBOL(inode_init_always_gfp);
  
  void free_inode_nonrcu(struct inode *inode)
  {
@@@ -819,7 -746,7 +819,7 @@@ static void evict(struct inode *inode
         * ___wait_var_event() either sees the bit cleared or
         * waitqueue_active() check in wake_up_var() sees the waiter.
         */
-       smp_mb();
+       smp_mb__after_spinlock();
        inode_wake_up_bit(inode, __I_NEW);
        BUG_ON(inode->i_state != (I_FREEING | I_CLEAR));
        spin_unlock(&inode->i_lock);
@@@ -1312,16 -1239,15 +1312,15 @@@ EXPORT_SYMBOL(unlock_two_nondirectories
   * @data:     opaque data pointer to pass to @test and @set
   *
   * Search for the inode specified by @hashval and @data in the inode cache,
-  * and if present it is return it with an increased reference count. This is
-  * a variant of iget5_locked() for callers that don't want to fail on memory
-  * allocation of inode.
+  * and if present return it with an increased reference count. This is a
+  * variant of iget5_locked() that doesn't allocate an inode.
   *
-  * If the inode is not in cache, insert the pre-allocated inode to cache and
+  * If the inode is not present in the cache, insert the pre-allocated inode and
   * return it locked, hashed, and with the I_NEW flag set. The file system gets
   * to fill it in before unlocking it via unlock_new_inode().
   *
-  * Note both @test and @set are called with the inode_hash_lock held, so can't
-  * sleep.
+  * Note that both @test and @set are called with the inode_hash_lock held, so
+  * they can't sleep.
   */
  struct inode *inode_insert5(struct inode *inode, unsigned long hashval,
                            int (*test)(struct inode *, void *),
@@@ -1385,16 -1311,16 +1384,16 @@@ EXPORT_SYMBOL(inode_insert5)
   * @data:     opaque data pointer to pass to @test and @set
   *
   * Search for the inode specified by @hashval and @data in the inode cache,
-  * and if present it is return it with an increased reference count. This is
-  * generalized version of iget_locked() for file systems where the inode
+  * and if present return it with an increased reference count. This is a
+  * generalized version of iget_locked() for file systems where the inode
   * number is not sufficient for unique identification of an inode.
   *
-  * If the inode is not in cache, allocate a new inode and return it locked,
-  * hashed, and with the I_NEW flag set. The file system gets to fill it in
-  * before unlocking it via unlock_new_inode().
+  * If the inode is not present in the cache, allocate and insert a new inode
+  * and return it locked, hashed, and with the I_NEW flag set. The file system
+  * gets to fill it in before unlocking it via unlock_new_inode().
   *
-  * Note both @test and @set are called with the inode_hash_lock held, so can't
-  * sleep.
+  * Note that both @test and @set are called with the inode_hash_lock held, so
+  * they can't sleep.
   */
  struct inode *iget5_locked(struct super_block *sb, unsigned long hashval,
                int (*test)(struct inode *, void *),
@@@ -2282,58 -2208,19 +2281,58 @@@ int file_remove_privs(struct file *file
  }
  EXPORT_SYMBOL(file_remove_privs);
  
 +/**
 + * current_time - Return FS time (possibly fine-grained)
 + * @inode: inode.
 + *
 + * Return the current time truncated to the time granularity supported by
 + * the fs, as suitable for a ctime/mtime change. If the ctime is flagged
 + * as having been QUERIED, get a fine-grained timestamp, but don't update
 + * the floor.
 + *
 + * For a multigrain inode, this is effectively an estimate of the timestamp
 + * that a file would receive. An actual update must go through
 + * inode_set_ctime_current().
 + */
 +struct timespec64 current_time(struct inode *inode)
 +{
 +      struct timespec64 now;
 +      u32 cns;
 +
 +      ktime_get_coarse_real_ts64_mg(&now);
 +
 +      if (!is_mgtime(inode))
 +              goto out;
 +
 +      /* If nothing has queried it, then coarse time is fine */
 +      cns = smp_load_acquire(&inode->i_ctime_nsec);
 +      if (cns & I_CTIME_QUERIED) {
 +              /*
 +               * If there is no apparent change, then get a fine-grained
 +               * timestamp.
 +               */
 +              if (now.tv_nsec == (cns & ~I_CTIME_QUERIED))
 +                      ktime_get_real_ts64(&now);
 +      }
 +out:
 +      return timestamp_truncate(now, inode);
 +}
 +EXPORT_SYMBOL(current_time);
 +
  static int inode_needs_update_time(struct inode *inode)
  {
 +      struct timespec64 now, ts;
        int sync_it = 0;
 -      struct timespec64 now = current_time(inode);
 -      struct timespec64 ts;
  
        /* First try to exhaust all avenues to not sync */
        if (IS_NOCMTIME(inode))
                return 0;
  
 +      now = current_time(inode);
 +
        ts = inode_get_mtime(inode);
        if (!timespec64_equal(&ts, &now))
 -              sync_it = S_MTIME;
 +              sync_it |= S_MTIME;
  
        ts = inode_get_ctime(inode);
        if (!timespec64_equal(&ts, &now))
@@@ -2710,16 -2597,6 +2709,16 @@@ void inode_nohighmem(struct inode *inod
  }
  EXPORT_SYMBOL(inode_nohighmem);
  
 +struct timespec64 inode_set_ctime_to_ts(struct inode *inode, struct timespec64 ts)
 +{
 +      trace_inode_set_ctime_to_ts(inode, &ts);
 +      set_normalized_timespec64(&ts, ts.tv_sec, ts.tv_nsec);
 +      inode->i_ctime_sec = ts.tv_sec;
 +      inode->i_ctime_nsec = ts.tv_nsec;
 +      return ts;
 +}
 +EXPORT_SYMBOL(inode_set_ctime_to_ts);
 +
  /**
   * timestamp_truncate - Truncate timespec to a granularity
   * @t: Timespec
@@@ -2752,159 -2629,39 +2751,159 @@@ struct timespec64 timestamp_truncate(st
  EXPORT_SYMBOL(timestamp_truncate);
  
  /**
 - * current_time - Return FS time
 - * @inode: inode.
 + * inode_set_ctime_current - set the ctime to current_time
 + * @inode: inode
   *
 - * Return the current time truncated to the time granularity supported by
 - * the fs.
 + * Set the inode's ctime to the current value for the inode. Returns the
 + * current value that was assigned. If this is not a multigrain inode, then we
 + * set it to the later of the coarse time and floor value.
   *
 - * Note that inode and inode->sb cannot be NULL.
 - * Otherwise, the function warns and returns time without truncation.
 + * If it is multigrain, then we first see if the coarse-grained timestamp is
 + * distinct from what is already there. If so, then use that. Otherwise, get a
 + * fine-grained timestamp.
 + *
 + * After that, try to swap the new value into i_ctime_nsec. Accept the
 + * resulting ctime, regardless of the outcome of the swap. If it has
 + * already been replaced, then that timestamp is later than the earlier
 + * unacceptable one, and is thus acceptable.
   */
 -struct timespec64 current_time(struct inode *inode)
 +struct timespec64 inode_set_ctime_current(struct inode *inode)
  {
        struct timespec64 now;
 +      u32 cns, cur;
  
 -      ktime_get_coarse_real_ts64(&now);
 -      return timestamp_truncate(now, inode);
 +      ktime_get_coarse_real_ts64_mg(&now);
 +      now = timestamp_truncate(now, inode);
 +
 +      /* Just return that if this is not a multigrain fs */
 +      if (!is_mgtime(inode)) {
 +              inode_set_ctime_to_ts(inode, now);
 +              goto out;
 +      }
 +
 +      /*
 +       * A fine-grained time is only needed if someone has queried
 +       * for timestamps, and the current coarse grained time isn't
 +       * later than what's already there.
 +       */
 +      cns = smp_load_acquire(&inode->i_ctime_nsec);
 +      if (cns & I_CTIME_QUERIED) {
 +              struct timespec64 ctime = { .tv_sec = inode->i_ctime_sec,
 +                                          .tv_nsec = cns & ~I_CTIME_QUERIED };
 +
 +              if (timespec64_compare(&now, &ctime) <= 0) {
 +                      ktime_get_real_ts64_mg(&now);
 +                      now = timestamp_truncate(now, inode);
 +                      mgtime_counter_inc(mg_fine_stamps);
 +              }
 +      }
 +      mgtime_counter_inc(mg_ctime_updates);
 +
 +      /* No need to cmpxchg if it's exactly the same */
 +      if (cns == now.tv_nsec && inode->i_ctime_sec == now.tv_sec) {
 +              trace_ctime_xchg_skip(inode, &now);
 +              goto out;
 +      }
 +      cur = cns;
 +retry:
 +      /* Try to swap the nsec value into place. */
 +      if (try_cmpxchg(&inode->i_ctime_nsec, &cur, now.tv_nsec)) {
 +              /* If swap occurred, then we're (mostly) done */
 +              inode->i_ctime_sec = now.tv_sec;
 +              trace_ctime_ns_xchg(inode, cns, now.tv_nsec, cur);
 +              mgtime_counter_inc(mg_ctime_swaps);
 +      } else {
 +              /*
 +               * Was the change due to someone marking the old ctime QUERIED?
 +               * If so then retry the swap. This can only happen once since
 +               * the only way to clear I_CTIME_QUERIED is to stamp the inode
 +               * with a new ctime.
 +               */
 +              if (!(cns & I_CTIME_QUERIED) && (cns | I_CTIME_QUERIED) == cur) {
 +                      cns = cur;
 +                      goto retry;
 +              }
 +              /* Otherwise, keep the existing ctime */
 +              now.tv_sec = inode->i_ctime_sec;
 +              now.tv_nsec = cur & ~I_CTIME_QUERIED;
 +      }
 +out:
 +      return now;
  }
 -EXPORT_SYMBOL(current_time);
 +EXPORT_SYMBOL(inode_set_ctime_current);
  
  /**
 - * inode_set_ctime_current - set the ctime to current_time
 - * @inode: inode
 + * inode_set_ctime_deleg - try to update the ctime on a delegated inode
 + * @inode: inode to update
 + * @update: timespec64 to set the ctime
   *
 - * Set the inode->i_ctime to the current value for the inode. Returns
 - * the current value that was assigned to i_ctime.
 + * Attempt to atomically update the ctime on behalf of a delegation holder.
 + *
 + * The nfs server can call back the holder of a delegation to get updated
 + * inode attributes, including the mtime. When updating the mtime, update
 + * the ctime to a value at least equal to that.
 + *
 + * This can race with concurrent updates to the inode, in which
 + * case the update is skipped.
 + *
 + * Note that this works even when multigrain timestamps are not enabled,
 + * so it is used in either case.
   */
 -struct timespec64 inode_set_ctime_current(struct inode *inode)
 +struct timespec64 inode_set_ctime_deleg(struct inode *inode, struct timespec64 update)
  {
 -      struct timespec64 now = current_time(inode);
 +      struct timespec64 now, cur_ts;
 +      u32 cur, old;
  
 -      inode_set_ctime_to_ts(inode, now);
 -      return now;
 +      /* pairs with try_cmpxchg below */
 +      cur = smp_load_acquire(&inode->i_ctime_nsec);
 +      cur_ts.tv_nsec = cur & ~I_CTIME_QUERIED;
 +      cur_ts.tv_sec = inode->i_ctime_sec;
 +
 +      /* If the update is older than the existing value, skip it. */
 +      if (timespec64_compare(&update, &cur_ts) <= 0)
 +              return cur_ts;
 +
 +      ktime_get_coarse_real_ts64_mg(&now);
 +
 +      /* Clamp the update to "now" if it's in the future */
 +      if (timespec64_compare(&update, &now) > 0)
 +              update = now;
 +
 +      update = timestamp_truncate(update, inode);
 +
 +      /* No need to update if the values are already the same */
 +      if (timespec64_equal(&update, &cur_ts))
 +              return cur_ts;
 +
 +      /*
 +       * Try to swap the nsec value into place. If it fails, that means
 +       * it raced with an update due to a write or similar activity. That
 +       * stamp takes precedence, so just skip the update.
 +       */
 +retry:
 +      old = cur;
 +      if (try_cmpxchg(&inode->i_ctime_nsec, &cur, update.tv_nsec)) {
 +              inode->i_ctime_sec = update.tv_sec;
 +              mgtime_counter_inc(mg_ctime_swaps);
 +              return update;
 +      }
 +
 +      /*
 +       * Was the change due to another task marking the old ctime QUERIED?
 +       *
 +       * If so, then retry the swap. This can only happen once since
 +       * the only way to clear I_CTIME_QUERIED is to stamp the inode
 +       * with a new ctime.
 +       */
 +      if (!(old & I_CTIME_QUERIED) && (cur == (old | I_CTIME_QUERIED)))
 +              goto retry;
 +
 +      /* Otherwise, it was a new timestamp. */
 +      cur_ts.tv_sec = inode->i_ctime_sec;
 +      cur_ts.tv_nsec = cur & ~I_CTIME_QUERIED;
 +      return cur_ts;
  }
 -EXPORT_SYMBOL(inode_set_ctime_current);
 +EXPORT_SYMBOL(inode_set_ctime_deleg);
  
  /**
   * in_group_or_capable - check whether caller is CAP_FSETID privileged
   * @inode:    inode to check
   * @vfsgid:   the new/current vfsgid of @inode
   *
-  * Check wether @vfsgid is in the caller's group list or if the caller is
+  * Check whether @vfsgid is in the caller's group list or if the caller is
   * privileged with CAP_FSETID over @inode. This can be used to determine
   * whether the setgid bit can be kept or must be dropped.
   *
diff --combined fs/iomap/buffered-io.c
index ef0b68bccbb6126e136bffd3d6558a78bc8fc1e4,3d1fae7d3a64e01e2861544d93d07a66ffbc2a57..ce73d2a48c1eb3a91d173bc4f7ff8d9c7d1ea4ec
@@@ -1145,36 -1145,10 +1145,36 @@@ static void iomap_write_delalloc_scan(s
  }
  
  /*
 + * When a short write occurs, the filesystem might need to use ->iomap_end
 + * to remove space reservations created in ->iomap_begin.
 + *
 + * For filesystems that use delayed allocation, there can be dirty pages over
 + * the delalloc extent outside the range of a short write but still within the
 + * delalloc extent allocated for this iomap if the write raced with page
 + * faults.
 + *
   * Punch out all the delalloc blocks in the range given except for those that
   * have dirty data still pending in the page cache - those are going to be
   * written and so must still retain the delalloc backing for writeback.
   *
 + * The punch() callback *must* only punch delalloc extents in the range passed
 + * to it. It must skip over all other types of extents in the range and leave
 + * them completely unchanged. It must do this punch atomically with respect to
 + * other extent modifications.
 + *
 + * The punch() callback may be called with a folio locked to prevent writeback
 + * extent allocation racing at the edge of the range we are currently punching.
 + * The locked folio may or may not cover the range being punched, so it is not
 + * safe for the punch() callback to lock folios itself.
 + *
 + * Lock order is:
 + *
 + * inode->i_rwsem (shared or exclusive)
 + *   inode->i_mapping->invalidate_lock (exclusive)
 + *     folio_lock()
 + *       ->punch
 + *         internal filesystem allocation lock
 + *
   * As we are scanning the page cache for data, we don't need to reimplement the
   * wheel - mapping_seek_hole_data() does exactly what we need to identify the
   * start and end of data ranges correctly even for sub-folio block sizes. This
   * require sprinkling this code with magic "+ 1" and "- 1" arithmetic and expose
   * the code to subtle off-by-one bugs....
   */
 -static void iomap_write_delalloc_release(struct inode *inode, loff_t start_byte,
 +void iomap_write_delalloc_release(struct inode *inode, loff_t start_byte,
                loff_t end_byte, unsigned flags, struct iomap *iomap,
                iomap_punch_t punch)
  {
        loff_t scan_end_byte = min(i_size_read(inode), end_byte);
  
        /*
 -       * Lock the mapping to avoid races with page faults re-instantiating
 -       * folios and dirtying them via ->page_mkwrite whilst we walk the
 -       * cache and perform delalloc extent removal. Failing to do this can
 -       * leave dirty pages with no space reservation in the cache.
 +       * The caller must hold invalidate_lock to avoid races with page faults
 +       * re-instantiating folios and dirtying them via ->page_mkwrite whilst
 +       * we walk the cache and perform delalloc extent removal.  Failing to do
 +       * this can leave dirty pages with no space reservation in the cache.
         */
 -      filemap_invalidate_lock(inode->i_mapping);
 +      lockdep_assert_held_write(&inode->i_mapping->invalidate_lock);
 +
        while (start_byte < scan_end_byte) {
                loff_t          data_end;
  
                if (start_byte == -ENXIO || start_byte == scan_end_byte)
                        break;
                if (WARN_ON_ONCE(start_byte < 0))
 -                      goto out_unlock;
 +                      return;
                WARN_ON_ONCE(start_byte < punch_start_byte);
                WARN_ON_ONCE(start_byte > scan_end_byte);
  
                data_end = mapping_seek_hole_data(inode->i_mapping, start_byte,
                                scan_end_byte, SEEK_HOLE);
                if (WARN_ON_ONCE(data_end < 0))
 -                      goto out_unlock;
 +                      return;
  
                /*
                 * If we race with post-direct I/O invalidation of the page cache,
        if (punch_start_byte < end_byte)
                punch(inode, punch_start_byte, end_byte - punch_start_byte,
                                iomap);
 -out_unlock:
 -      filemap_invalidate_unlock(inode->i_mapping);
  }
 -
 -/*
 - * When a short write occurs, the filesystem may need to remove reserved space
 - * that was allocated in ->iomap_begin from it's ->iomap_end method. For
 - * filesystems that use delayed allocation, we need to punch out delalloc
 - * extents from the range that are not dirty in the page cache. As the write can
 - * race with page faults, there can be dirty pages over the delalloc extent
 - * outside the range of a short write but still within the delalloc extent
 - * allocated for this iomap.
 - *
 - * This function uses [start_byte, end_byte) intervals (i.e. open ended) to
 - * simplify range iterations.
 - *
 - * The punch() callback *must* only punch delalloc extents in the range passed
 - * to it. It must skip over all other types of extents in the range and leave
 - * them completely unchanged. It must do this punch atomically with respect to
 - * other extent modifications.
 - *
 - * The punch() callback may be called with a folio locked to prevent writeback
 - * extent allocation racing at the edge of the range we are currently punching.
 - * The locked folio may or may not cover the range being punched, so it is not
 - * safe for the punch() callback to lock folios itself.
 - *
 - * Lock order is:
 - *
 - * inode->i_rwsem (shared or exclusive)
 - *   inode->i_mapping->invalidate_lock (exclusive)
 - *     folio_lock()
 - *       ->punch
 - *         internal filesystem allocation lock
 - */
 -void iomap_file_buffered_write_punch_delalloc(struct inode *inode,
 -              loff_t pos, loff_t length, ssize_t written, unsigned flags,
 -              struct iomap *iomap, iomap_punch_t punch)
 -{
 -      loff_t                  start_byte;
 -      loff_t                  end_byte;
 -      unsigned int            blocksize = i_blocksize(inode);
 -
 -      if (iomap->type != IOMAP_DELALLOC)
 -              return;
 -
 -      /* If we didn't reserve the blocks, we're not allowed to punch them. */
 -      if (!(iomap->flags & IOMAP_F_NEW))
 -              return;
 -
 -      /*
 -       * start_byte refers to the first unused block after a short write. If
 -       * nothing was written, round offset down to point at the first block in
 -       * the range.
 -       */
 -      if (unlikely(!written))
 -              start_byte = round_down(pos, blocksize);
 -      else
 -              start_byte = round_up(pos + written, blocksize);
 -      end_byte = round_up(pos + length, blocksize);
 -
 -      /* Nothing to do if we've written the entire delalloc extent */
 -      if (start_byte >= end_byte)
 -              return;
 -
 -      iomap_write_delalloc_release(inode, start_byte, end_byte, flags, iomap,
 -                      punch);
 -}
 -EXPORT_SYMBOL_GPL(iomap_file_buffered_write_punch_delalloc);
 +EXPORT_SYMBOL_GPL(iomap_write_delalloc_release);
  
  static loff_t iomap_unshare_iter(struct iomap_iter *iter)
  {
        loff_t length = iomap_length(iter);
        loff_t written = 0;
  
 -      /* Don't bother with blocks that are not shared to start with. */
 -      if (!(iomap->flags & IOMAP_F_SHARED))
 -              return length;
 -
 -      /*
 -       * Don't bother with holes or unwritten extents.
 -       *
 -       * Note that we use srcmap directly instead of iomap_iter_srcmap as
 -       * unsharing requires providing a separate source map, and the presence
 -       * of one is a good indicator that unsharing is needed, unlike
 -       * IOMAP_F_SHARED which can be set for any data that goes into the COW
 -       * fork for XFS.
 -       */
 -      if (iter->srcmap.type == IOMAP_HOLE ||
 -          iter->srcmap.type == IOMAP_UNWRITTEN)
 +      if (!iomap_want_unshare_iter(iter))
                return length;
  
        do {
@@@ -1321,15 -1374,11 +1321,15 @@@ iomap_file_unshare(struct inode *inode
        struct iomap_iter iter = {
                .inode          = inode,
                .pos            = pos,
 -              .len            = len,
                .flags          = IOMAP_WRITE | IOMAP_UNSHARE,
        };
 +      loff_t size = i_size_read(inode);
        int ret;
  
 +      if (pos < 0 || pos >= size)
 +              return 0;
 +
 +      iter.len = min(len, size - pos);
        while ((ret = iomap_iter(&iter, ops)) > 0)
                iter.processed = iomap_unshare_iter(&iter);
        return ret;
@@@ -1784,7 -1833,7 +1784,7 @@@ new_ioend
        if (ifs)
                atomic_add(len, &ifs->write_bytes_pending);
        wpc->ioend->io_size += len;
-       wbc_account_cgroup_owner(wbc, &folio->page, len);
+       wbc_account_cgroup_owner(wbc, folio, len);
        return 0;
  }
  
diff --combined fs/namespace.c
index d26f5e6d2ca35f83205aa24ac4955c7f5ec937f5,a9065a9ab971b0ff8b571dba5ed106b0e34dadc3..206fc54feeba3e782f49778bcc99774d5a9d50a4
@@@ -3901,7 -3901,7 +3901,7 @@@ static struct mnt_namespace *alloc_mnt_
        }
        new_ns->ns.ops = &mntns_operations;
        if (!anon)
-               new_ns->seq = atomic64_add_return(1, &mnt_ns_seq);
+               new_ns->seq = atomic64_inc_return(&mnt_ns_seq);
        refcount_set(&new_ns->ns.count, 1);
        refcount_set(&new_ns->passive, 1);
        new_ns->mounts = RB_ROOT;
@@@ -3944,9 -3944,7 +3944,9 @@@ struct mnt_namespace *copy_mnt_ns(unsig
        new = copy_tree(old, old->mnt.mnt_root, copy_flags);
        if (IS_ERR(new)) {
                namespace_unlock();
 -              free_mnt_ns(new_ns);
 +              ns_free_inum(&new_ns->ns);
 +              dec_mnt_namespaces(new_ns->ucounts);
 +              mnt_ns_release(new_ns);
                return ERR_CAST(new);
        }
        if (user_ns != ns->user_ns) {
@@@ -5006,6 -5004,40 +5006,40 @@@ static int statmount_fs_type(struct kst
        return 0;
  }
  
+ static void statmount_fs_subtype(struct kstatmount *s, struct seq_file *seq)
+ {
+       struct super_block *sb = s->mnt->mnt_sb;
+       if (sb->s_subtype)
+               seq_puts(seq, sb->s_subtype);
+ }
+ static int statmount_sb_source(struct kstatmount *s, struct seq_file *seq)
+ {
+       struct super_block *sb = s->mnt->mnt_sb;
+       struct mount *r = real_mount(s->mnt);
+       if (sb->s_op->show_devname) {
+               size_t start = seq->count;
+               int ret;
+               ret = sb->s_op->show_devname(seq, s->mnt->mnt_root);
+               if (ret)
+                       return ret;
+               if (unlikely(seq_has_overflowed(seq)))
+                       return -EAGAIN;
+               /* Unescape the result */
+               seq->buf[seq->count] = '\0';
+               seq->count = start;
+               seq_commit(seq, string_unescape_inplace(seq->buf + start, UNESCAPE_OCTAL));
+       } else if (r->mnt_devname) {
+               seq_puts(seq, r->mnt_devname);
+       }
+       return 0;
+ }
  static void statmount_mnt_ns_id(struct kstatmount *s, struct mnt_namespace *ns)
  {
        s->sm.mask |= STATMOUNT_MNT_NS_ID;
@@@ -5040,35 -5072,134 +5074,134 @@@ static int statmount_mnt_opts(struct ks
        return 0;
  }
  
+ static inline int statmount_opt_unescape(struct seq_file *seq, char *buf_start)
+ {
+       char *buf_end, *opt_start, *opt_end;
+       int count = 0;
+       buf_end = seq->buf + seq->count;
+       *buf_end = '\0';
+       for (opt_start = buf_start + 1; opt_start < buf_end; opt_start = opt_end + 1) {
+               opt_end = strchrnul(opt_start, ',');
+               *opt_end = '\0';
+               buf_start += string_unescape(opt_start, buf_start, 0, UNESCAPE_OCTAL) + 1;
+               if (WARN_ON_ONCE(++count == INT_MAX))
+                       return -EOVERFLOW;
+       }
+       seq->count = buf_start - 1 - seq->buf;
+       return count;
+ }
+ static int statmount_opt_array(struct kstatmount *s, struct seq_file *seq)
+ {
+       struct vfsmount *mnt = s->mnt;
+       struct super_block *sb = mnt->mnt_sb;
+       size_t start = seq->count;
+       char *buf_start;
+       int err;
+       if (!sb->s_op->show_options)
+               return 0;
+       buf_start = seq->buf + start;
+       err = sb->s_op->show_options(seq, mnt->mnt_root);
+       if (err)
+               return err;
+       if (unlikely(seq_has_overflowed(seq)))
+               return -EAGAIN;
+       if (seq->count == start)
+               return 0;
+       err = statmount_opt_unescape(seq, buf_start);
+       if (err < 0)
+               return err;
+       s->sm.opt_num = err;
+       return 0;
+ }
+ static int statmount_opt_sec_array(struct kstatmount *s, struct seq_file *seq)
+ {
+       struct vfsmount *mnt = s->mnt;
+       struct super_block *sb = mnt->mnt_sb;
+       size_t start = seq->count;
+       char *buf_start;
+       int err;
+       buf_start = seq->buf + start;
+       err = security_sb_show_options(seq, sb);
+       if (!err)
+               return err;
+       if (unlikely(seq_has_overflowed(seq)))
+               return -EAGAIN;
+       if (seq->count == start)
+               return 0;
+       err = statmount_opt_unescape(seq, buf_start);
+       if (err < 0)
+               return err;
+       s->sm.opt_sec_num = err;
+       return 0;
+ }
  static int statmount_string(struct kstatmount *s, u64 flag)
  {
-       int ret;
+       int ret = 0;
        size_t kbufsize;
        struct seq_file *seq = &s->seq;
        struct statmount *sm = &s->sm;
+       u32 start = seq->count;
  
        switch (flag) {
        case STATMOUNT_FS_TYPE:
-               sm->fs_type = seq->count;
+               sm->fs_type = start;
                ret = statmount_fs_type(s, seq);
                break;
        case STATMOUNT_MNT_ROOT:
-               sm->mnt_root = seq->count;
+               sm->mnt_root = start;
                ret = statmount_mnt_root(s, seq);
                break;
        case STATMOUNT_MNT_POINT:
-               sm->mnt_point = seq->count;
+               sm->mnt_point = start;
                ret = statmount_mnt_point(s, seq);
                break;
        case STATMOUNT_MNT_OPTS:
-               sm->mnt_opts = seq->count;
+               sm->mnt_opts = start;
                ret = statmount_mnt_opts(s, seq);
                break;
+       case STATMOUNT_OPT_ARRAY:
+               sm->opt_array = start;
+               ret = statmount_opt_array(s, seq);
+               break;
+       case STATMOUNT_OPT_SEC_ARRAY:
+               sm->opt_sec_array = start;
+               ret = statmount_opt_sec_array(s, seq);
+               break;
+       case STATMOUNT_FS_SUBTYPE:
+               sm->fs_subtype = start;
+               statmount_fs_subtype(s, seq);
+               break;
+       case STATMOUNT_SB_SOURCE:
+               sm->sb_source = start;
+               ret = statmount_sb_source(s, seq);
+               break;
        default:
                WARN_ON_ONCE(true);
                return -EINVAL;
        }
  
+       /*
+        * If nothing was emitted, return to avoid setting the flag
+        * and terminating the buffer.
+        */
+       if (seq->count == start)
+               return ret;
        if (unlikely(check_add_overflow(sizeof(*sm), seq->count, &kbufsize)))
                return -EOVERFLOW;
        if (kbufsize >= s->bufsize)
@@@ -5203,6 -5334,18 +5336,18 @@@ static int do_statmount(struct kstatmou
        if (!err && s->mask & STATMOUNT_MNT_OPTS)
                err = statmount_string(s, STATMOUNT_MNT_OPTS);
  
+       if (!err && s->mask & STATMOUNT_OPT_ARRAY)
+               err = statmount_string(s, STATMOUNT_OPT_ARRAY);
+       if (!err && s->mask & STATMOUNT_OPT_SEC_ARRAY)
+               err = statmount_string(s, STATMOUNT_OPT_SEC_ARRAY);
+       if (!err && s->mask & STATMOUNT_FS_SUBTYPE)
+               err = statmount_string(s, STATMOUNT_FS_SUBTYPE);
+       if (!err && s->mask & STATMOUNT_SB_SOURCE)
+               err = statmount_string(s, STATMOUNT_SB_SOURCE);
        if (!err && s->mask & STATMOUNT_MNT_NS_ID)
                statmount_mnt_ns_id(s, ns);
  
@@@ -5224,7 -5367,9 +5369,9 @@@ static inline bool retry_statmount(cons
  }
  
  #define STATMOUNT_STRING_REQ (STATMOUNT_MNT_ROOT | STATMOUNT_MNT_POINT | \
-                             STATMOUNT_FS_TYPE | STATMOUNT_MNT_OPTS)
+                             STATMOUNT_FS_TYPE | STATMOUNT_MNT_OPTS | \
+                             STATMOUNT_FS_SUBTYPE | STATMOUNT_SB_SOURCE | \
+                             STATMOUNT_OPT_ARRAY | STATMOUNT_OPT_SEC_ARRAY)
  
  static int prepare_kstatmount(struct kstatmount *ks, struct mnt_id_req *kreq,
                              struct statmount __user *buf, size_t bufsize,
diff --combined fs/nfsd/nfs4state.c
index 551d2958ec2905be51b4a96414a15a5e4f87f9ea,83a172c0a2275375593f59d4fba95508e95d6afc..d80406f8b5682450d3006f98b529315a8123f91d
@@@ -1359,47 -1359,21 +1359,47 @@@ static void destroy_delegation(struct n
                destroy_unhashed_deleg(dp);
  }
  
 +/**
 + * revoke_delegation - perform nfs4 delegation structure cleanup
 + * @dp: pointer to the delegation
 + *
 + * This function assumes that it's called either from the administrative
 + * interface (nfsd4_revoke_states()) that's revoking a specific delegation
 + * stateid or it's called from a laundromat thread (nfsd4_landromat()) that
 + * determined that this specific state has expired and needs to be revoked
 + * (both mark state with the appropriate stid sc_status mode). It is also
 + * assumed that a reference was taken on the @dp state.
 + *
 + * If this function finds that the @dp state is SC_STATUS_FREED it means
 + * that a FREE_STATEID operation for this stateid has been processed and
 + * we can proceed to removing it from recalled list. However, if @dp state
 + * isn't marked SC_STATUS_FREED, it means we need place it on the cl_revoked
 + * list and wait for the FREE_STATEID to arrive from the client. At the same
 + * time, we need to mark it as SC_STATUS_FREEABLE to indicate to the
 + * nfsd4_free_stateid() function that this stateid has already been added
 + * to the cl_revoked list and that nfsd4_free_stateid() is now responsible
 + * for removing it from the list. Inspection of where the delegation state
 + * in the revocation process is protected by the clp->cl_lock.
 + */
  static void revoke_delegation(struct nfs4_delegation *dp)
  {
        struct nfs4_client *clp = dp->dl_stid.sc_client;
  
        WARN_ON(!list_empty(&dp->dl_recall_lru));
 +      WARN_ON_ONCE(!(dp->dl_stid.sc_status &
 +                   (SC_STATUS_REVOKED | SC_STATUS_ADMIN_REVOKED)));
  
        trace_nfsd_stid_revoke(&dp->dl_stid);
  
 -      if (dp->dl_stid.sc_status &
 -          (SC_STATUS_REVOKED | SC_STATUS_ADMIN_REVOKED)) {
 -              spin_lock(&clp->cl_lock);
 -              refcount_inc(&dp->dl_stid.sc_count);
 -              list_add(&dp->dl_recall_lru, &clp->cl_revoked);
 -              spin_unlock(&clp->cl_lock);
 +      spin_lock(&clp->cl_lock);
 +      if (dp->dl_stid.sc_status & SC_STATUS_FREED) {
 +              list_del_init(&dp->dl_recall_lru);
 +              goto out;
        }
 +      list_add(&dp->dl_recall_lru, &clp->cl_revoked);
 +      dp->dl_stid.sc_status |= SC_STATUS_FREEABLE;
 +out:
 +      spin_unlock(&clp->cl_lock);
        destroy_unhashed_deleg(dp);
  }
  
@@@ -1806,7 -1780,6 +1806,7 @@@ void nfsd4_revoke_states(struct net *ne
                                        mutex_unlock(&stp->st_mutex);
                                        break;
                                case SC_TYPE_DELEG:
 +                                      refcount_inc(&stid->sc_count);
                                        dp = delegstateid(stid);
                                        spin_lock(&state_lock);
                                        if (!unhash_delegation_locked(
@@@ -6572,7 -6545,6 +6572,7 @@@ nfs4_laundromat(struct nfsd_net *nn
                dp = list_entry (pos, struct nfs4_delegation, dl_recall_lru);
                if (!state_expired(&lt, dp->dl_time))
                        break;
 +              refcount_inc(&dp->dl_stid.sc_count);
                unhash_delegation_locked(dp, SC_STATUS_REVOKED);
                list_add(&dp->dl_recall_lru, &reaplist);
        }
@@@ -7182,12 -7154,9 +7182,12 @@@ nfsd4_free_stateid(struct svc_rqst *rqs
        switch (s->sc_type) {
        case SC_TYPE_DELEG:
                if (s->sc_status & SC_STATUS_REVOKED) {
 +                      s->sc_status |= SC_STATUS_CLOSED;
                        spin_unlock(&s->sc_lock);
                        dp = delegstateid(s);
 -                      list_del_init(&dp->dl_recall_lru);
 +                      if (s->sc_status & SC_STATUS_FREEABLE)
 +                              list_del_init(&dp->dl_recall_lru);
 +                      s->sc_status |= SC_STATUS_FREED;
                        spin_unlock(&cl->cl_lock);
                        nfs4_put_stid(s);
                        ret = nfs_ok;
@@@ -7517,9 -7486,7 +7517,9 @@@ nfsd4_delegreturn(struct svc_rqst *rqst
        if ((status = fh_verify(rqstp, &cstate->current_fh, S_IFREG, 0)))
                return status;
  
 -      status = nfsd4_lookup_stateid(cstate, stateid, SC_TYPE_DELEG, 0, &s, nn);
 +      status = nfsd4_lookup_stateid(cstate, stateid, SC_TYPE_DELEG,
 +                                    SC_STATUS_REVOKED | SC_STATUS_FREEABLE,
 +                                    &s, nn);
        if (status)
                goto out;
        dp = delegstateid(s);
@@@ -8001,9 -7968,6 +8001,6 @@@ nfsd4_lock(struct svc_rqst *rqstp, stru
        fp = lock_stp->st_stid.sc_file;
        switch (lock->lk_type) {
                case NFS4_READW_LT:
-                       if (nfsd4_has_session(cstate) ||
-                           exportfs_lock_op_is_async(sb->s_export_op))
-                               flags |= FL_SLEEP;
                        fallthrough;
                case NFS4_READ_LT:
                        spin_lock(&fp->fi_lock);
                        type = F_RDLCK;
                        break;
                case NFS4_WRITEW_LT:
-                       if (nfsd4_has_session(cstate) ||
-                           exportfs_lock_op_is_async(sb->s_export_op))
-                               flags |= FL_SLEEP;
                        fallthrough;
                case NFS4_WRITE_LT:
                        spin_lock(&fp->fi_lock);
                goto out;
        }
  
-       /*
-        * Most filesystems with their own ->lock operations will block
-        * the nfsd thread waiting to acquire the lock.  That leads to
-        * deadlocks (we don't want every nfsd thread tied up waiting
-        * for file locks), so don't attempt blocking lock notifications
-        * on those filesystems:
-        */
-       if (!exportfs_lock_op_is_async(sb->s_export_op))
-               flags &= ~FL_SLEEP;
+       if (lock->lk_type & (NFS4_READW_LT | NFS4_WRITEW_LT) &&
+               nfsd4_has_session(cstate) &&
+               locks_can_async_lock(nf->nf_file->f_op))
+                       flags |= FL_SLEEP;
  
        nbl = find_or_allocate_block(lock_sop, &fp->fi_fhandle, nn);
        if (!nbl) {
@@@ -8716,7 -8672,7 +8705,7 @@@ nfs4_state_shutdown_net(struct net *net
        struct nfsd_net *nn = net_generic(net, nfsd_net_id);
  
        shrinker_free(nn->nfsd_client_shrinker);
 -      cancel_work(&nn->nfsd_shrinker_work);
 +      cancel_work_sync(&nn->nfsd_shrinker_work);
        cancel_delayed_work_sync(&nn->laundromat_work);
        locks_end_grace(&nn->nfsd4_manager);
  
diff --combined fs/ocfs2/file.c
index 06af21982c16aba9d7970d43c0c4ffd860ab0aa0,17591d709a59c332b78f97edb0b91fc5dd066c43..4fa6c840d20bf618f268e96cde63c1ed96706375
@@@ -1129,12 -1129,9 +1129,12 @@@ int ocfs2_setattr(struct mnt_idmap *idm
        trace_ocfs2_setattr(inode, dentry,
                            (unsigned long long)OCFS2_I(inode)->ip_blkno,
                            dentry->d_name.len, dentry->d_name.name,
 -                          attr->ia_valid, attr->ia_mode,
 -                          from_kuid(&init_user_ns, attr->ia_uid),
 -                          from_kgid(&init_user_ns, attr->ia_gid));
 +                          attr->ia_valid,
 +                              attr->ia_valid & ATTR_MODE ? attr->ia_mode : 0,
 +                              attr->ia_valid & ATTR_UID ?
 +                                      from_kuid(&init_user_ns, attr->ia_uid) : 0,
 +                              attr->ia_valid & ATTR_GID ?
 +                                      from_kgid(&init_user_ns, attr->ia_gid) : 0);
  
        /* ensuring we don't even attempt to truncate a symlink */
        if (S_ISLNK(inode->i_mode))
@@@ -1787,14 -1784,6 +1787,14 @@@ int ocfs2_remove_inode_range(struct ino
                return 0;
  
        if (OCFS2_I(inode)->ip_dyn_features & OCFS2_INLINE_DATA_FL) {
 +              int id_count = ocfs2_max_inline_data_with_xattr(inode->i_sb, di);
 +
 +              if (byte_start > id_count || byte_start + byte_len > id_count) {
 +                      ret = -EINVAL;
 +                      mlog_errno(ret);
 +                      goto out;
 +              }
 +
                ret = ocfs2_truncate_inline(inode, di_bh, byte_start,
                                            byte_start + byte_len, 0);
                if (ret) {
@@@ -2812,6 -2801,7 +2812,7 @@@ const struct file_operations ocfs2_fop
        .splice_write   = iter_file_splice_write,
        .fallocate      = ocfs2_fallocate,
        .remap_file_range = ocfs2_remap_file_range,
+       .fop_flags      = FOP_ASYNC_LOCK,
  };
  
  WRAP_DIR_ITER(ocfs2_readdir) // FIXME!
@@@ -2828,6 -2818,7 +2829,7 @@@ const struct file_operations ocfs2_dop
  #endif
        .lock           = ocfs2_lock,
        .flock          = ocfs2_flock,
+       .fop_flags      = FOP_ASYNC_LOCK,
  };
  
  /*
diff --combined include/linux/fs.h
index d32c6f6298b17c44ff22d922516028da31cec14d,d369c582f129204ec5b15490d3aa5cf9f208b000..6b062f62cbb88322330da1735499b2c9c04d4f15
@@@ -623,7 -623,6 +623,7 @@@ is_uncached_acl(struct posix_acl *acl
  #define IOP_NOFOLLOW  0x0004
  #define IOP_XATTR     0x0008
  #define IOP_DEFAULT_READLINK  0x0010
 +#define IOP_MGTIME    0x0020
  
  /*
   * Keep mostly read-only and often accessed (especially for
@@@ -1585,8 -1584,6 +1585,8 @@@ static inline bool fsuidgid_has_mapping
  
  struct timespec64 current_time(struct inode *inode);
  struct timespec64 inode_set_ctime_current(struct inode *inode);
 +struct timespec64 inode_set_ctime_deleg(struct inode *inode,
 +                                      struct timespec64 update);
  
  static inline time64_t inode_get_atime_sec(const struct inode *inode)
  {
@@@ -1656,17 -1653,6 +1656,17 @@@ static inline struct timespec64 inode_s
        return inode_set_mtime_to_ts(inode, ts);
  }
  
 +/*
 + * Multigrain timestamps
 + *
 + * Conditionally use fine-grained ctime and mtime timestamps when there
 + * are users actively observing them via getattr. The primary use-case
 + * for this is NFS clients that use the ctime to distinguish between
 + * different states of the file, and that are often fooled by multiple
 + * operations that occur in the same coarse-grained timer tick.
 + */
 +#define I_CTIME_QUERIED               ((u32)BIT(31))
 +
  static inline time64_t inode_get_ctime_sec(const struct inode *inode)
  {
        return inode->i_ctime_sec;
  
  static inline long inode_get_ctime_nsec(const struct inode *inode)
  {
 -      return inode->i_ctime_nsec;
 +      return inode->i_ctime_nsec & ~I_CTIME_QUERIED;
  }
  
  static inline struct timespec64 inode_get_ctime(const struct inode *inode)
        return ts;
  }
  
 -static inline struct timespec64 inode_set_ctime_to_ts(struct inode *inode,
 -                                                    struct timespec64 ts)
 -{
 -      inode->i_ctime_sec = ts.tv_sec;
 -      inode->i_ctime_nsec = ts.tv_nsec;
 -      return ts;
 -}
 +struct timespec64 inode_set_ctime_to_ts(struct inode *inode, struct timespec64 ts);
  
  /**
   * inode_set_ctime - set the ctime in the inode
@@@ -2124,6 -2116,8 +2124,8 @@@ struct file_operations 
  #define FOP_HUGE_PAGES                ((__force fop_flags_t)(1 << 4))
  /* Treat loff_t as unsigned (e.g., /dev/mem) */
  #define FOP_UNSIGNED_OFFSET   ((__force fop_flags_t)(1 << 5))
+ /* Supports asynchronous lock callbacks */
+ #define FOP_ASYNC_LOCK                ((__force fop_flags_t)(1 << 6))
  
  /* Wrap a directory iterator that needs exclusive inode access */
  int wrap_directory_iterator(struct file *, struct dir_context *,
@@@ -2550,7 -2544,6 +2552,7 @@@ struct file_system_type 
  #define FS_USERNS_MOUNT               8       /* Can be mounted by userns root */
  #define FS_DISALLOW_NOTIFY_PERM       16      /* Disable fanotify permission events */
  #define FS_ALLOW_IDMAP         32      /* FS has been updated to handle vfs idmappings. */
 +#define FS_MGTIME             64      /* FS uses multigrain timestamps */
  #define FS_RENAME_DOES_D_MOVE 32768   /* FS will handle d_move() during rename() internally. */
        int (*init_fs_context)(struct fs_context *);
        const struct fs_parameter_spec *parameters;
  
  #define MODULE_ALIAS_FS(NAME) MODULE_ALIAS("fs-" NAME)
  
 +/**
 + * is_mgtime: is this inode using multigrain timestamps
 + * @inode: inode to test for multigrain timestamps
 + *
 + * Return true if the inode uses multigrain timestamps, false otherwise.
 + */
 +static inline bool is_mgtime(const struct inode *inode)
 +{
 +      return inode->i_opflags & IOP_MGTIME;
 +}
 +
  extern struct dentry *mount_bdev(struct file_system_type *fs_type,
        int flags, const char *dev_name, void *data,
        int (*fill_super)(struct super_block *, void *, int));
@@@ -3102,12 -3084,7 +3104,12 @@@ extern loff_t default_llseek(struct fil
  
  extern loff_t vfs_llseek(struct file *file, loff_t offset, int whence);
  
 -extern int inode_init_always(struct super_block *, struct inode *);
 +extern int inode_init_always_gfp(struct super_block *, struct inode *, gfp_t);
 +static inline int inode_init_always(struct super_block *sb, struct inode *inode)
 +{
 +      return inode_init_always_gfp(sb, inode, GFP_NOFS);
 +}
 +
  extern void inode_init_once(struct inode *);
  extern void address_space_init_once(struct address_space *mapping);
  extern struct inode * igrab(struct inode *);
@@@ -3346,7 -3323,6 +3348,7 @@@ extern void page_put_link(void *)
  extern int page_symlink(struct inode *inode, const char *symname, int len);
  extern const struct inode_operations page_symlink_inode_operations;
  extern void kfree_link(void *);
 +void fill_mg_cmtime(struct kstat *stat, u32 request_mask, struct inode *inode);
  void generic_fillattr(struct mnt_idmap *, u32, struct inode *, struct kstat *);
  void generic_fill_statx_attr(struct inode *inode, struct kstat *stat);
  void generic_fill_statx_atomic_writes(struct kstat *stat,
diff --combined mm/filemap.c
index 56fa431c52af7bba33ad270c0f780bd58100792c,82aa94d2b709bff99ffa42dc40aaef0fe3784b14..e7fe07f7963d0c9f928a4158cce8079ab4641bea
@@@ -2620,12 -2620,14 +2620,14 @@@ ssize_t filemap_read(struct kiocb *iocb
        loff_t isize, end_offset;
        loff_t last_pos = ra->prev_pos;
  
+       if (unlikely(iocb->ki_pos < 0))
+               return -EINVAL;
        if (unlikely(iocb->ki_pos >= inode->i_sb->s_maxbytes))
                return 0;
        if (unlikely(!iov_iter_count(iter)))
                return 0;
  
 -      iov_iter_truncate(iter, inode->i_sb->s_maxbytes);
 +      iov_iter_truncate(iter, inode->i_sb->s_maxbytes - iocb->ki_pos);
        folio_batch_init(&fbatch);
  
        do {
This page took 0.287164 seconds and 4 git commands to generate.