]> Git Repo - linux.git/commitdiff
Merge tag 'vfs-6.7.fsid' of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs
authorLinus Torvalds <[email protected]>
Tue, 7 Nov 2023 20:11:26 +0000 (12:11 -0800)
committerLinus Torvalds <[email protected]>
Tue, 7 Nov 2023 20:11:26 +0000 (12:11 -0800)
Pull vfs fanotify fsid updates from Christian Brauner:
 "This work is part of the plan to enable fanotify to serve as a drop-in
  replacement for inotify. While inotify is availabe on all filesystems,
  fanotify currently isn't.

  In order to support fanotify on all filesystems two things are needed:

   (1) all filesystems need to support AT_HANDLE_FID

   (2) all filesystems need to report a non-zero f_fsid

  This contains (1) and allows filesystems to encode non-decodable file
  handlers for fanotify without implementing any exportfs operations by
  encoding a file id of type FILEID_INO64_GEN from i_ino and
  i_generation.

  Filesystems that want to opt out of encoding non-decodable file ids
  for fanotify that don't support NFS export can do so by providing an
  empty export_operations struct.

  This also partially addresses (2) by generating f_fsid for simple
  filesystems as well as freevxfs. Remaining filesystems will be dealt
  with by separate patches.

  Finally, this contains the patch from the current exportfs maintainers
  which moves exportfs under vfs with Chuck, Jeff, and Amir as
  maintainers and vfs.git as tree"

* tag 'vfs-6.7.fsid' of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs:
  MAINTAINERS: create an entry for exportfs
  fs: fix build error with CONFIG_EXPORTFS=m or not defined
  freevxfs: derive f_fsid from bdev->bd_dev
  fs: report f_fsid from s_dev for "simple" filesystems
  exportfs: support encoding non-decodeable file handles by default
  exportfs: define FILEID_INO64_GEN* file handle types
  exportfs: make ->encode_fh() a mandatory method for NFS export
  exportfs: add helpers to check if filesystem can encode/decode file handles

17 files changed:
1  2 
Documentation/filesystems/nfs/exporting.rst
Documentation/filesystems/porting.rst
MAINTAINERS
fs/befs/linuxvfs.c
fs/efivarfs/super.c
fs/erofs/super.c
fs/ext2/super.c
fs/ext4/super.c
fs/f2fs/super.c
fs/fuse/inode.c
fs/hugetlbfs/inode.c
fs/jfs/super.c
fs/libfs.c
fs/nfsd/export.c
fs/notify/fanotify/fanotify_user.c
fs/overlayfs/util.c
include/linux/exportfs.h

index 198d805d611c6781d97a59d85941ccd8a5fe19a2,de64d2d002a204c5460980c898d4ec41fd43d47a..f04ce1215a03e700c7d750a37fb5d860ea8ba7cd
@@@ -122,12 -122,9 +122,9 @@@ are exportable by setting the s_export_
  super_block.  This field must point to a "struct export_operations"
  struct which has the following members:
  
-   encode_fh (optional)
+   encode_fh (mandatory)
      Takes a dentry and creates a filehandle fragment which may later be used
-     to find or create a dentry for the same object.  The default
-     implementation creates a filehandle fragment that encodes a 32bit inode
-     and generation number for the inode encoded, and if necessary the
-     same information for the parent.
+     to find or create a dentry for the same object.
  
    fh_to_dentry (mandatory)
      Given a filehandle fragment, this should find the implied object and
@@@ -241,10 -238,3 +238,10 @@@ following flags are defined
      all of an inode's dirty data on last close. Exports that behave this
      way should set EXPORT_OP_FLUSH_ON_CLOSE so that NFSD knows to skip
      waiting for writeback when closing such files.
 +
 +  EXPORT_OP_ASYNC_LOCK - Indicates a capable filesystem to do async lock
 +    requests from lockd. Only set EXPORT_OP_ASYNC_LOCK if the filesystem has
 +    it's own ->lock() functionality as core posix_lock_file() implementation
 +    has no async lock request handling yet. For more information about how to
 +    indicate an async lock request from a ->lock() file_operations struct, see
 +    fs/locks.c and comment for the function vfs_lock_file().
index d69f59700a23359077b94ac126d1e714967e6982,9cc6cb27c4d58c9e47392bc55dc313c4b2a2b881..878e72b2f8b76ab04b11ff4a041887c02b7e8893
@@@ -1050,5 -1050,7 +1050,14 @@@ kill_anon_super(), or kill_block_super(
  
  **mandatory**
  
 +Lock ordering has been changed so that s_umount ranks above open_mutex again.
 +All places where s_umount was taken under open_mutex have been fixed up.
++
++---
++
++**mandatory**
++
+ export_operations ->encode_fh() no longer has a default implementation to
+ encode FILEID_INO32_GEN* file handles.
+ Filesystems that used the default implementation may use the generic helper
+ generic_encode_ino32_fh() explicitly.
diff --combined MAINTAINERS
index 4127a8c79320f29feb8584abbc57e56cb1b85e7b,a194e6b0bcd19a212b7898c2cdcb971e75ed6a2f..79e0a307157f0325bd785caa5c125f5999bd2e11
@@@ -294,8 -294,6 +294,8 @@@ F: drivers/pnp/pnpacpi
  F:    include/acpi/
  F:    include/linux/acpi.h
  F:    include/linux/fwnode.h
 +F:    include/linux/fw_table.h
 +F:    lib/fw_table.c
  F:    tools/power/acpi/
  
  ACPI APEI
@@@ -910,7 -908,7 +910,7 @@@ F: drivers/crypto/ccp
  F:    include/linux/ccp.h
  
  AMD CRYPTOGRAPHIC COPROCESSOR (CCP) DRIVER - SEV SUPPORT
 -M:    Brijesh Singh <brijesh.singh@amd.com>
 +M:    Ashish Kalra <ashish.kalra@amd.com>
  M:    Tom Lendacky <[email protected]>
  L:    [email protected]
  S:    Supported
@@@ -1121,7 -1119,7 +1121,7 @@@ ANALOG DEVICES INC AD4130 DRIVE
  M:    Cosmin Tanislav <[email protected]>
  L:    [email protected]
  S:    Supported
 -W:    http://ez.analog.com/community/linux-device-drivers
 +W:    https://ez.analog.com/linux-software-drivers
  F:    Documentation/ABI/testing/sysfs-bus-iio-adc-ad4130
  F:    Documentation/devicetree/bindings/iio/adc/adi,ad4130.yaml
  F:    drivers/iio/adc/ad4130.c
@@@ -1154,7 -1152,7 +1154,7 @@@ ANALOG DEVICES INC AD74115 DRIVE
  M:    Cosmin Tanislav <[email protected]>
  L:    [email protected]
  S:    Supported
 -W:    http://ez.analog.com/community/linux-device-drivers
 +W:    https://ez.analog.com/linux-software-drivers
  F:    Documentation/devicetree/bindings/iio/addac/adi,ad74115.yaml
  F:    drivers/iio/addac/ad74115.c
  
@@@ -1462,6 -1460,7 +1462,6 @@@ F:      drivers/hwmon/applesmc.
  APPLETALK NETWORK LAYER
  L:    [email protected]
  S:    Odd fixes
 -F:    drivers/net/appletalk/
  F:    include/linux/atalk.h
  F:    include/uapi/linux/atalk.h
  F:    net/appletalk/
@@@ -1638,13 -1637,13 +1638,13 @@@ F:   drivers/gpu/drm/arm/display/include
  F:    drivers/gpu/drm/arm/display/komeda/
  
  ARM MALI PANFROST DRM DRIVER
 +M:    Boris Brezillon <[email protected]>
  M:    Rob Herring <[email protected]>
 -M:    Tomeu Vizoso <[email protected]>
  R:    Steven Price <[email protected]>
 -R:    Alyssa Rosenzweig <[email protected]>
  L:    [email protected]
  S:    Supported
  T:    git git://anongit.freedesktop.org/drm/drm-misc
 +F:    Documentation/gpu/panfrost.rst
  F:    drivers/gpu/drm/panfrost/
  F:    include/uapi/drm/panfrost_drm.h
  
@@@ -1800,7 -1799,7 +1800,7 @@@ F:      drivers/irqchip/irq-owl-sirq.
  F:    drivers/mmc/host/owl-mmc.c
  F:    drivers/net/ethernet/actions/
  F:    drivers/pinctrl/actions/*
 -F:    drivers/soc/actions/
 +F:    drivers/pmdomain/actions/
  F:    include/dt-bindings/power/owl-*
  F:    include/dt-bindings/reset/actions,*
  F:    include/linux/soc/actions/
@@@ -1828,13 -1827,6 +1828,13 @@@ N:    allwinne
  N:    sun[x456789]i
  N:    sun[25]0i
  
 +ARM/AMD PENSANDO ARM64 ARCHITECTURE
 +M:    Brad Larson <[email protected]>
 +L:    [email protected] (moderated for non-subscribers)
 +S:    Supported
 +F:    Documentation/devicetree/bindings/*/amd,pensando*
 +F:    arch/arm64/boot/dts/amd/elba*
 +
  ARM/Amlogic Meson SoC CLOCK FRAMEWORK
  M:    Neil Armstrong <[email protected]>
  M:    Jerome Brunet <[email protected]>
@@@ -2077,16 -2069,12 +2077,16 @@@ F:   Documentation/trace/coresight/
  F:    drivers/hwtracing/coresight/*
  F:    include/dt-bindings/arm/coresight-cti-dt.h
  F:    include/linux/coresight*
 +F:    include/uapi/linux/coresight*
  F:    samples/coresight/*
 +F:    tools/perf/Documentation/arm-coresight.txt
  F:    tools/perf/arch/arm/util/auxtrace.c
  F:    tools/perf/arch/arm/util/cs-etm.c
  F:    tools/perf/arch/arm/util/cs-etm.h
  F:    tools/perf/arch/arm/util/pmu.c
 +F:    tools/perf/tests/shell/*coresight*
  F:    tools/perf/tests/shell/coresight/*
 +F:    tools/perf/tests/shell/lib/*coresight*
  F:    tools/perf/util/cs-etm-decoder/*
  F:    tools/perf/util/cs-etm.*
  
@@@ -2237,7 -2225,7 +2237,7 @@@ M:      Imre Kaloz <[email protected]
  L:    [email protected] (moderated for non-subscribers)
  S:    Maintained
  F:    Documentation/devicetree/bindings/arm/intel-ixp4xx.yaml
 -F:    Documentation/devicetree/bindings/gpio/intel,ixp4xx-gpio.txt
 +F:    Documentation/devicetree/bindings/gpio/intel,ixp4xx-gpio.yaml
  F:    Documentation/devicetree/bindings/interrupt-controller/intel,ixp4xx-interrupt.yaml
  F:    Documentation/devicetree/bindings/memory-controllers/intel,ixp4xx-expansion*
  F:    Documentation/devicetree/bindings/rng/intel,ixp46x-rng.yaml
@@@ -2510,18 -2498,6 +2510,18 @@@ F:    drivers/rtc/rtc-nct3018y.
  F:    include/dt-bindings/clock/nuvoton,npcm7xx-clock.h
  F:    include/dt-bindings/clock/nuvoton,npcm845-clk.h
  
 +ARM/NUVOTON NPCM VIDEO ENGINE DRIVER
 +M:    Joseph Liu <[email protected]>
 +M:    Marvin Lin <[email protected]>
 +L:    [email protected]
 +L:    [email protected] (moderated for non-subscribers)
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/media/nuvoton,npcm-ece.yaml
 +F:    Documentation/devicetree/bindings/media/nuvoton,npcm-vcd.yaml
 +F:    Documentation/userspace-api/media/drivers/npcm-video.rst
 +F:    drivers/media/platform/nuvoton/
 +F:    include/uapi/linux/npcm-video.h
 +
  ARM/NUVOTON WPCM450 ARCHITECTURE
  M:    Jonathan Neuschäfer <[email protected]>
  L:    [email protected] (moderated for non-subscribers)
@@@ -3506,14 -3482,6 +3506,14 @@@ W:    http://bcache.evilpiepirate.or
  C:    irc://irc.oftc.net/bcache
  F:    drivers/md/bcache/
  
 +BCACHEFS
 +M:    Kent Overstreet <[email protected]>
 +R:    Brian Foster <[email protected]>
 +L:    [email protected]
 +S:    Supported
 +C:    irc://irc.oftc.net/bcache
 +F:    fs/bcachefs/
 +
  BDISP ST MEDIA DRIVER
  M:    Fabien Dessenne <[email protected]>
  L:    [email protected]
@@@ -3557,14 -3525,12 +3557,14 @@@ R:   Andy Shevchenko <andriy.shevchenko@l
  R:    Rasmus Villemoes <[email protected]>
  S:    Maintained
  F:    include/linux/bitfield.h
 +F:    include/linux/bitmap-str.h
  F:    include/linux/bitmap.h
  F:    include/linux/bits.h
  F:    include/linux/cpumask.h
  F:    include/linux/find.h
  F:    include/linux/nodemask.h
  F:    include/vdso/bits.h
 +F:    lib/bitmap-str.c
  F:    lib/bitmap.c
  F:    lib/cpumask.c
  F:    lib/cpumask_kunit.c
@@@ -3648,10 -3614,9 +3648,10 @@@ F:    Documentation/devicetree/bindings/ii
  F:    drivers/iio/accel/bma400*
  
  BPF JIT for ARM
 -M:    Shubham Bansal <[email protected]>
 +M:    Russell King <[email protected]>
 +M:    Puranjay Mohan <[email protected]>
  L:    [email protected]
 -S:    Odd Fixes
 +S:    Maintained
  F:    arch/arm/net/
  
  BPF JIT for ARM64
@@@ -3795,7 -3760,7 +3795,7 @@@ F:      net/sched/act_bpf.
  F:    net/sched/cls_bpf.c
  F:    samples/bpf/
  F:    scripts/bpf_doc.py
 -F:    scripts/pahole-flags.sh
 +F:    scripts/Makefile.btf
  F:    scripts/pahole-version.sh
  F:    tools/bpf/
  F:    tools/lib/bpf/
  S:    Odd Fixes
  K:    (?:\b|_)bpf(?:\b|_)
  
 +BPF [NETKIT] (BPF-programmable network device)
 +M:    Daniel Borkmann <[email protected]>
 +M:    Nikolay Aleksandrov <[email protected]>
 +L:    [email protected]
 +L:    [email protected]
 +S:    Supported
 +F:    drivers/net/netkit.c
 +F:    include/net/netkit.h
 +
  BPF [NETWORKING] (struct_ops, reuseport)
  M:    Martin KaFai Lau <[email protected]>
  L:    [email protected]
@@@ -4382,7 -4338,8 +4382,7 @@@ F:      drivers/net/ethernet/broadcom/bcmsys
  F:    drivers/net/ethernet/broadcom/unimac.h
  
  BROADCOM TG3 GIGABIT ETHERNET DRIVER
 -M:    Siva Reddy Kallam <[email protected]>
 -M:    Prashant Sreedharan <[email protected]>
 +M:    Pavan Chebbi <[email protected]>
  M:    Michael Chan <[email protected]>
  L:    [email protected]
  S:    Supported
@@@ -4855,13 -4812,6 +4855,13 @@@ X:    drivers/char/ipmi
  X:    drivers/char/random.c
  X:    drivers/char/tpm/
  
 +CHARGERLAB POWER-Z HARDWARE MONITOR DRIVER
 +M:    Thomas Weißschuh <[email protected]>
 +L:    [email protected]
 +S:    Maintained
 +F:    Documentation/hwmon/powerz.rst
 +F:    drivers/hwmon/powerz.c
 +
  CHECKPATCH
  M:    Andy Whitcroft <[email protected]>
  M:    Joe Perches <[email protected]>
@@@ -4979,7 -4929,6 +4979,7 @@@ F:      drivers/spi/spi-cs42l43
  F:    include/dt-bindings/sound/cs*
  F:    include/linux/mfd/cs42l43*
  F:    include/sound/cs*
 +F:    sound/pci/hda/cirrus*
  F:    sound/pci/hda/cs*
  F:    sound/pci/hda/hda_cs_dsp_ctl.*
  F:    sound/soc/codecs/cs*
@@@ -5119,14 -5068,6 +5119,14 @@@ T:    git git://git.kernel.org/pub/scm/lin
  F:    Documentation/devicetree/bindings/timer/
  F:    drivers/clocksource/
  
 +CLOSURES
 +M:    Kent Overstreet <[email protected]>
 +L:    [email protected]
 +S:    Supported
 +C:    irc://irc.oftc.net/bcache
 +F:    include/linux/closure.h
 +F:    lib/closure.c
 +
  CMPC ACPI DRIVER
  M:    Thadeu Lima de Souza Cascardo <[email protected]>
  M:    Daniel Oliveira Nascimento <[email protected]>
@@@ -5258,7 -5199,6 +5258,7 @@@ L:      [email protected]
  S:    Maintained
  F:    drivers/cxl/
  F:    include/uapi/linux/cxl_mem.h
 +F:    tools/testing/cxl/
  
  COMPUTE EXPRESS LINK PMU (CPMU)
  M:    Jonathan Cameron <[email protected]>
@@@ -5273,12 -5213,6 +5273,12 @@@ S:    Orpha
  W:    http://accessrunner.sourceforge.net/
  F:    drivers/usb/atm/cxacru.c
  
 +CONFIDENTIAL COMPUTING THREAT MODEL FOR X86 VIRTUALIZATION (SNP/TDX)
 +M:    Elena Reshetova <[email protected]>
 +M:    Carlos Bilbao <[email protected]>
 +S:    Maintained
 +F:    Documentation/security/snp-tdx-threat-model.rst
 +
  CONFIGFS
  M:    Joel Becker <[email protected]>
  M:    Christoph Hellwig <[email protected]>
@@@ -5353,7 -5287,6 +5353,7 @@@ S:      Maintaine
  F:    mm/memcontrol.c
  F:    mm/swap_cgroup.c
  F:    tools/testing/selftests/cgroup/memcg_protection.m
 +F:    tools/testing/selftests/cgroup/test_hugetlb_memcg.c
  F:    tools/testing/selftests/cgroup/test_kmem.c
  F:    tools/testing/selftests/cgroup/test_memcontrol.c
  
@@@ -5394,6 -5327,12 +5394,6 @@@ M:     Bence Csókás <[email protected]
  S:    Maintained
  F:    drivers/i2c/busses/i2c-cp2615.c
  
 -CPMAC ETHERNET DRIVER
 -M:    Florian Fainelli <[email protected]>
 -L:    [email protected]
 -S:    Maintained
 -F:    drivers/net/ethernet/ti/cpmac.c
 -
  CPU FREQUENCY DRIVERS - VEXPRESS SPC ARM BIG LITTLE
  M:    Viresh Kumar <[email protected]>
  M:    Sudeep Holla <[email protected]>
@@@ -5677,7 -5616,7 +5677,7 @@@ M:      Andrew Donnellan <[email protected]
  L:    [email protected]
  S:    Supported
  F:    Documentation/ABI/testing/sysfs-class-cxl
 -F:    Documentation/powerpc/cxl.rst
 +F:    Documentation/arch/powerpc/cxl.rst
  F:    arch/powerpc/platforms/powernv/pci-cxl.c
  F:    drivers/misc/cxl/
  F:    include/misc/cxl*
@@@ -5689,7 -5628,7 +5689,7 @@@ M:      Matthew R. Ochs <[email protected]
  M:    Uma Krishnan <[email protected]>
  L:    [email protected]
  S:    Supported
 -F:    Documentation/powerpc/cxlflash.rst
 +F:    Documentation/arch/powerpc/cxlflash.rst
  F:    drivers/scsi/cxlflash/
  F:    include/uapi/scsi/cxlflash_ioctl.h
  
@@@ -6064,7 -6003,6 +6064,7 @@@ F:      include/linux/devm-helpers.
  DEVICE-MAPPER  (LVM)
  M:    Alasdair Kergon <[email protected]>
  M:    Mike Snitzer <[email protected]>
 +M:    Mikulas Patocka <[email protected]>
  M:    [email protected]
  L:    [email protected]
  S:    Maintained
  S:    Maintained
  F:    drivers/gpio/gpio-gpio-mm.c
  
 +DIGITEQ AUTOMOTIVE MGB4 V4L2 DRIVER
 +M:    Martin Tuma <[email protected]>
 +L:    [email protected]
 +S:    Maintained
 +F:    Documentation/admin-guide/media/mgb4.rst
 +F:    drivers/media/pci/mgb4/
 +
  DIOLAN U2C-12 I2C DRIVER
  M:    Guenter Roeck <[email protected]>
  L:    [email protected]
@@@ -6202,11 -6133,11 +6202,11 @@@ F:   drivers/video/fbdev/udlfb.
  F:    include/video/udlfb.h
  
  DISTRIBUTED LOCK MANAGER (DLM)
 -M:    Christine Caulfield <ccaulfie@redhat.com>
 +M:    Alexander Aring <aahringo@redhat.com>
  M:    David Teigland <[email protected]>
  L:    [email protected]
  S:    Supported
 -W:    http://sources.redhat.com/cluster/
 +W:    https://pagure.io/dlm
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/teigland/linux-dlm.git
  F:    fs/dlm/
  
@@@ -6219,7 -6150,6 +6219,7 @@@ L:      [email protected] (mode
  S:    Maintained
  T:    git git://anongit.freedesktop.org/drm/drm-misc
  F:    Documentation/driver-api/dma-buf.rst
 +F:    Documentation/userspace-api/dma-buf-alloc-exchange.rst
  F:    drivers/dma-buf/
  F:    include/linux/*fence.h
  F:    include/linux/dma-buf.h
@@@ -6422,17 -6352,6 +6422,17 @@@ F:    Documentation/networking/device_driv
  F:    drivers/net/ethernet/freescale/dpaa2/dpaa2-switch*
  F:    drivers/net/ethernet/freescale/dpaa2/dpsw*
  
 +DPLL SUBSYSTEM
 +M:    Vadim Fedorenko <[email protected]>
 +M:    Arkadiusz Kubalewski <[email protected]>
 +M:    Jiri Pirko <[email protected]>
 +L:    [email protected]
 +S:    Supported
 +F:    Documentation/driver-api/dpll.rst
 +F:    drivers/dpll/*
 +F:    include/linux/dpll.h
 +F:    include/uapi/linux/dpll.h
 +
  DRBD DRIVER
  M:    Philipp Reisner <[email protected]>
  M:    Lars Ellenberg <[email protected]>
@@@ -6712,7 -6631,6 +6712,7 @@@ S:      Maintaine
  B:    https://gitlab.freedesktop.org/drm/msm/-/issues
  T:    git https://gitlab.freedesktop.org/drm/msm.git
  F:    Documentation/devicetree/bindings/display/msm/
 +F:    drivers/gpu/drm/ci/xfails/msm*
  F:    drivers/gpu/drm/msm/
  F:    include/uapi/drm/msm_drm.h
  
@@@ -6848,7 -6766,7 +6848,7 @@@ F:      drivers/gpu/drm/panel/panel-sitronix
  DRM DRIVER FOR SITRONIX ST7703 PANELS
  M:    Guido Günther <[email protected]>
  R:    Purism Kernel Team <[email protected]>
 -R:    Ondrej Jirman <meg[email protected]>
 +R:    Ondrej Jirman <meg[email protected]>
  S:    Maintained
  F:    Documentation/devicetree/bindings/display/panel/rocktech,jh057n00900.yaml
  F:    drivers/gpu/drm/panel/panel-sitronix-st7703.c
@@@ -6864,8 -6782,7 +6864,8 @@@ DRM DRIVER FOR SOLOMON SSD130X OLED DIS
  M:    Javier Martinez Canillas <[email protected]>
  S:    Maintained
  T:    git git://anongit.freedesktop.org/drm/drm-misc
 -F:    Documentation/devicetree/bindings/display/solomon,ssd1307fb.yaml
 +F:    Documentation/devicetree/bindings/display/solomon,ssd-common.yaml
 +F:    Documentation/devicetree/bindings/display/solomon,ssd13*.yaml
  F:    drivers/gpu/drm/solomon/ssd130x*
  
  DRM DRIVER FOR ST-ERICSSON MCDE
@@@ -6960,26 -6877,12 +6960,26 @@@ M:   Thomas Zimmermann <tzimmermann@suse.
  S:    Maintained
  W:    https://01.org/linuxgraphics/gfx-docs/maintainer-tools/drm-misc.html
  T:    git git://anongit.freedesktop.org/drm/drm-misc
 +F:    Documentation/devicetree/bindings/display/
 +F:    Documentation/devicetree/bindings/gpu/
  F:    Documentation/gpu/
 -F:    drivers/gpu/drm/*
 +F:    drivers/gpu/drm/
  F:    drivers/gpu/vga/
 -F:    include/drm/drm*
 +F:    include/drm/drm
  F:    include/linux/vga*
 -F:    include/uapi/drm/drm*
 +F:    include/uapi/drm/
 +X:    drivers/gpu/drm/amd/
 +X:    drivers/gpu/drm/armada/
 +X:    drivers/gpu/drm/etnaviv/
 +X:    drivers/gpu/drm/exynos/
 +X:    drivers/gpu/drm/i915/
 +X:    drivers/gpu/drm/kmb/
 +X:    drivers/gpu/drm/mediatek/
 +X:    drivers/gpu/drm/msm/
 +X:    drivers/gpu/drm/nouveau/
 +X:    drivers/gpu/drm/radeon/
 +X:    drivers/gpu/drm/renesas/
 +X:    drivers/gpu/drm/tegra/
  
  DRM DRIVERS FOR ALLWINNER A10
  M:    Maxime Ripard <[email protected]>
@@@ -7000,7 -6903,6 +7000,7 @@@ T:      git git://anongit.freedesktop.org/dr
  F:    Documentation/devicetree/bindings/display/amlogic,meson-dw-hdmi.yaml
  F:    Documentation/devicetree/bindings/display/amlogic,meson-vpu.yaml
  F:    Documentation/gpu/meson.rst
 +F:    drivers/gpu/drm/ci/xfails/meson*
  F:    drivers/gpu/drm/meson/
  
  DRM DRIVERS FOR ATMEL HLCDC
@@@ -7024,9 -6926,7 +7024,9 @@@ T:      git git://anongit.freedesktop.org/dr
  F:    Documentation/devicetree/bindings/display/bridge/
  F:    drivers/gpu/drm/bridge/
  F:    drivers/gpu/drm/drm_bridge.c
 +F:    drivers/gpu/drm/drm_bridge_connector.c
  F:    include/drm/drm_bridge.h
 +F:    include/drm/drm_bridge_connector.h
  
  DRM DRIVERS FOR EXYNOS
  M:    Inki Dae <[email protected]>
@@@ -7050,12 -6950,10 +7050,12 @@@ F:   Documentation/devicetree/bindings/di
  F:    Documentation/devicetree/bindings/display/fsl,tcon.txt
  F:    drivers/gpu/drm/fsl-dcu/
  
 -DRM DRIVERS FOR FREESCALE IMX
 +DRM DRIVERS FOR FREESCALE IMX 5/6
  M:    Philipp Zabel <[email protected]>
  L:    [email protected]
  S:    Maintained
 +T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git git://git.pengutronix.de/git/pza/linux
  F:    Documentation/devicetree/bindings/display/imx/
  F:    drivers/gpu/drm/imx/ipuv3/
  F:    drivers/gpu/ipu-v3/
@@@ -7074,7 -6972,7 +7074,7 @@@ DRM DRIVERS FOR GMA500 (Poulsbo, Moores
  M:    Patrik Jakobsson <[email protected]>
  L:    [email protected]
  S:    Maintained
 -T:    git git://github.com/patjak/drm-gma500
 +T:    git git://anongit.freedesktop.org/drm/drm-misc
  F:    drivers/gpu/drm/gma500/
  
  DRM DRIVERS FOR HISILICON
@@@ -7113,7 -7011,6 +7113,7 @@@ L:      [email protected]
  L:    [email protected] (moderated for non-subscribers)
  S:    Supported
  F:    Documentation/devicetree/bindings/display/mediatek/
 +F:    drivers/gpu/drm/ci/xfails/mediatek*
  F:    drivers/gpu/drm/mediatek/
  F:    drivers/phy/mediatek/phy-mtk-dp.c
  F:    drivers/phy/mediatek/phy-mtk-hdmi*
@@@ -7154,7 -7051,6 +7154,7 @@@ L:      [email protected]
  S:    Maintained
  T:    git git://anongit.freedesktop.org/drm/drm-misc
  F:    Documentation/devicetree/bindings/display/rockchip/
 +F:    drivers/gpu/drm/ci/xfails/rockchip*
  F:    drivers/gpu/drm/rockchip/
  
  DRM DRIVERS FOR STI
@@@ -7251,7 -7147,7 +7251,7 @@@ F:      Documentation/devicetree/bindings/di
  F:    drivers/gpu/drm/xlnx/
  
  DRM GPU SCHEDULER
 -M:    Luben Tuikov <luben.tuikov@amd.com>
 +M:    Luben Tuikov <ltuikov89@gmail.com>
  L:    [email protected]
  S:    Maintained
  T:    git git://anongit.freedesktop.org/drm/drm-misc
@@@ -7260,7 -7156,6 +7260,7 @@@ F:      include/drm/gpu_scheduler.
  
  DRM PANEL DRIVERS
  M:    Neil Armstrong <[email protected]>
 +R:    Jessica Zhang <[email protected]>
  R:    Sam Ravnborg <[email protected]>
  L:    [email protected]
  S:    Maintained
@@@ -8156,15 -8051,18 +8156,27 @@@ F:   include/linux/fs_types.
  F:    include/uapi/linux/fs.h
  F:    include/uapi/linux/openat2.h
  
+ FILESYSTEMS [EXPORTFS]
+ M:    Chuck Lever <[email protected]>
+ M:    Jeff Layton <[email protected]>
+ R:    Amir Goldstein <[email protected]>
+ L:    [email protected]
+ L:    [email protected]
+ S:    Supported
+ F:    Documentation/filesystems/nfs/exporting.rst
+ F:    fs/exportfs/
+ F:    fs/fhandle.c
+ F:    include/linux/exportfs.h
 +FILESYSTEMS [IOMAP]
 +M:    Christian Brauner <[email protected]>
 +R:    Darrick J. Wong <[email protected]>
 +L:    [email protected]
 +L:    [email protected]
 +S:    Supported
 +F:    fs/iomap/
 +F:    include/linux/iomap.h
 +
  FINTEK F75375S HARDWARE MONITOR AND FAN CONTROLLER DRIVER
  M:    Riku Voipio <[email protected]>
  L:    [email protected]
@@@ -8256,7 -8154,7 +8268,7 @@@ M:      Geoffrey D. Bennett <[email protected]
  L:    [email protected] (moderated for non-subscribers)
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound.git
 -F:    sound/usb/mixer_scarlett_gen2.c
 +F:    sound/usb/mixer_scarlett2.c
  
  FORCEDETH GIGABIT ETHERNET DRIVER
  M:    Rain River <[email protected]>
@@@ -8369,14 -8267,6 +8381,14 @@@ F:    Documentation/devicetree/bindings/sp
  F:    drivers/spi/spi-fsl-dspi.c
  F:    include/linux/spi/spi-fsl-dspi.h
  
 +FREESCALE eDMA DRIVER
 +M:    Frank Li <[email protected]>
 +L:    [email protected]
 +L:    [email protected]
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/dma/fsl,edma.yaml
 +F:    drivers/dma/fsl-edma*.*
 +
  FREESCALE ENETC ETHERNET DRIVERS
  M:    Claudiu Manoil <[email protected]>
  M:    Vladimir Oltean <[email protected]>
@@@ -8755,8 -8645,6 +8767,8 @@@ L:      [email protected]
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux.git for-next/hardening
  F:    Documentation/kbuild/gcc-plugins.rst
 +F:    include/linux/stackleak.h
 +F:    kernel/stackleak.c
  F:    scripts/Makefile.gcc-plugins
  F:    scripts/gcc-plugins/
  
@@@ -8853,7 -8741,6 +8865,7 @@@ F:      include/linux/phy
  GENERIC PINCTRL I2C DEMULTIPLEXER DRIVER
  M:    Wolfram Sang <[email protected]>
  S:    Supported
 +F:    Documentation/devicetree/bindings/i2c/i2c-demux-pinctrl.yaml
  F:    drivers/i2c/muxes/i2c-demux-pinctrl.c
  
  GENERIC PM DOMAINS
@@@ -8873,13 -8760,6 +8885,13 @@@ S:    Supporte
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/ulfh/linux-pm.git
  F:    drivers/pmdomain/
  
 +GENERIC RADIX TREE
 +M:    Kent Overstreet <[email protected]>
 +S:    Supported
 +C:    irc://irc.oftc.net/bcache
 +F:    include/linux/generic-radix-tree.h
 +F:    lib/generic-radix-tree.c
 +
  GENERIC RESISTIVE TOUCHSCREEN ADC DRIVER
  M:    Eugen Hristev <[email protected]>
  L:    [email protected]
@@@ -9120,13 -9000,6 +9132,13 @@@ F:    drivers/staging/greybus/sdio.
  F:    drivers/staging/greybus/spi.c
  F:    drivers/staging/greybus/spilib.c
  
 +GREYBUS BEAGLEPLAY DRIVERS
 +M:    Ayush Singh <[email protected]>
 +L:    [email protected] (moderated for non-subscribers)
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/net/ti,cc1352p7.yaml
 +F:    drivers/greybus/gb-beagleplay.c
 +
  GREYBUS SUBSYSTEM
  M:    Johan Hovold <[email protected]>
  M:    Alex Elder <[email protected]>
@@@ -9223,7 -9096,6 +9235,7 @@@ T:      git https://git.kernel.org/pub/scm/l
  F:    Documentation/ABI/testing/debugfs-driver-habanalabs
  F:    Documentation/ABI/testing/sysfs-driver-habanalabs
  F:    drivers/accel/habanalabs/
 +F:    include/linux/habanalabs/
  F:    include/trace/events/habanalabs.h
  F:    include/uapi/drm/habanalabs_accel.h
  
@@@ -9808,7 -9680,6 +9820,7 @@@ F:      include/linux/hugetlb.
  F:    mm/hugetlb.c
  F:    mm/hugetlb_vmemmap.c
  F:    mm/hugetlb_vmemmap.h
 +F:    tools/testing/selftests/cgroup/test_hugetlb_memcg.c
  
  HVA ST MEDIA DRIVER
  M:    Jean-Christophe Trotin <[email protected]>
@@@ -10091,6 -9962,12 +10103,6 @@@ F:   Documentation/driver-api/i3
  F:    drivers/i3c/
  F:    include/linux/i3c/
  
 -IA64 (Itanium) PLATFORM
 -L:    [email protected]
 -S:    Orphan
 -F:    Documentation/arch/ia64/
 -F:    arch/ia64/
 -
  IBM Operation Panel Input Driver
  M:    Eddie James <[email protected]>
  L:    [email protected]
@@@ -10586,6 -10463,7 +10598,6 @@@ F:   drivers/platform/x86/intel/atomisp2/
  
  INTEL BIOS SAR INT1092 DRIVER
  M:    Shravan Sudhakar <[email protected]>
 -M:    Intel Corporation <[email protected]>
  L:    [email protected]
  S:    Maintained
  F:    drivers/platform/x86/intel/int1092/
@@@ -10625,7 -10503,6 +10637,7 @@@ C:   irc://irc.oftc.net/intel-gf
  T:    git git://anongit.freedesktop.org/drm-intel
  F:    Documentation/ABI/testing/sysfs-driver-intel-i915-hwmon
  F:    Documentation/gpu/i915.rst
 +F:    drivers/gpu/drm/ci/xfails/i915*
  F:    drivers/gpu/drm/i915/
  F:    include/drm/i915*
  F:    include/uapi/drm/i915_drm.h
@@@ -10836,7 -10713,7 +10848,7 @@@ F:   drivers/mfd/intel-m10-bmc
  F:    include/linux/mfd/intel-m10-bmc.h
  
  INTEL MAX10 BMC SECURE UPDATES
 -M:    Russ Weight <russell.h.weight@intel.com>
 +M:    Peter Colberg <peter.colberg@intel.com>
  L:    [email protected]
  S:    Maintained
  F:    Documentation/ABI/testing/sysfs-driver-intel-m10-bmc-sec-update
@@@ -11016,6 -10893,7 +11028,6 @@@ F:   drivers/platform/x86/intel/wmi/thund
  
  INTEL WWAN IOSM DRIVER
  M:    M Chetan Kumar <[email protected]>
 -M:    Intel Corporation <[email protected]>
  L:    [email protected]
  S:    Maintained
  F:    drivers/net/wwan/iosm/
  S:    Maintained
  F:    drivers/net/ethernet/sgi/ioc3-eth.c
  
 -IOMAP FILESYSTEM LIBRARY
 -M:    Darrick J. Wong <[email protected]>
 -L:    [email protected]
 -L:    [email protected]
 -S:    Supported
 -T:    git git://git.kernel.org/pub/scm/fs/xfs/xfs-linux.git
 -F:    fs/iomap/
 -F:    include/linux/iomap.h
 -
  IOMMU DMA-API LAYER
  M:    Robin Murphy <[email protected]>
  L:    [email protected]
@@@ -11267,6 -11154,7 +11279,6 @@@ M:   Sagi Grimberg <[email protected]
  L:    [email protected]
  L:    [email protected]
  S:    Supported
 -W:    http://www.linux-iscsi.org
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/nab/target-pending.git master
  F:    drivers/infiniband/ulp/isert
  
@@@ -11516,20 -11404,16 +11528,20 @@@ F:        usr
  
  KERNEL HARDENING (not covered by other areas)
  M:    Kees Cook <[email protected]>
 +R:    Gustavo A. R. Silva <[email protected]>
  L:    [email protected]
  S:    Supported
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux.git for-next/hardening
  F:    Documentation/ABI/testing/sysfs-kernel-oops_count
  F:    Documentation/ABI/testing/sysfs-kernel-warn_count
 +F:    arch/*/configs/hardening.config
  F:    include/linux/overflow.h
  F:    include/linux/randomize_kstack.h
 +F:    kernel/configs/hardening.config
  F:    mm/usercopy.c
  K:    \b(add|choose)_random_kstack_offset\b
  K:    \b__check_(object_size|heap_object)\b
 +K:    \b__counted_by\b
  
  KERNEL JANITORS
  L:    [email protected]
@@@ -11548,7 -11432,6 +11560,6 @@@ S:   Supporte
  W:    http://nfs.sourceforge.net/
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/cel/linux.git
  F:    Documentation/filesystems/nfs/
- F:    fs/exportfs/
  F:    fs/lockd/
  F:    fs/nfs_common/
  F:    fs/nfsd/
@@@ -11650,18 -11533,6 +11661,18 @@@ F: include/kvm/arm_
  F:    tools/testing/selftests/kvm/*/aarch64/
  F:    tools/testing/selftests/kvm/aarch64/
  
 +KERNEL VIRTUAL MACHINE FOR LOONGARCH (KVM/LoongArch)
 +M:    Tianrui Zhao <[email protected]>
 +M:    Bibo Mao <[email protected]>
 +M:    Huacai Chen <[email protected]>
 +L:    [email protected]
 +L:    [email protected]
 +S:    Maintained
 +T:    git git://git.kernel.org/pub/scm/virt/kvm/kvm.git
 +F:    arch/loongarch/include/asm/kvm*
 +F:    arch/loongarch/include/uapi/asm/kvm*
 +F:    arch/loongarch/kvm/
 +
  KERNEL VIRTUAL MACHINE FOR MIPS (KVM/mips)
  M:    Huacai Chen <[email protected]>
  L:    [email protected]
@@@ -11698,7 -11569,6 +11709,7 @@@ F:   arch/riscv/include/asm/kvm
  F:    arch/riscv/include/uapi/asm/kvm*
  F:    arch/riscv/kvm/
  F:    tools/testing/selftests/kvm/*/riscv/
 +F:    tools/testing/selftests/kvm/riscv/
  
  KERNEL VIRTUAL MACHINE for s390 (KVM/s390)
  M:    Christian Borntraeger <[email protected]>
@@@ -12035,6 -11905,12 +12046,6 @@@ F:  drivers/leds
  F:    include/dt-bindings/leds/
  F:    include/linux/leds.h
  
 -LEGACY EEPROM DRIVER
 -M:    Jean Delvare <[email protected]>
 -S:    Maintained
 -F:    Documentation/misc-devices/eeprom.rst
 -F:    drivers/misc/eeprom/eeprom.c
 -
  LEGO MINDSTORMS EV3
  R:    David Lechner <[email protected]>
  S:    Maintained
@@@ -12230,7 -12106,7 +12241,7 @@@ F:   Documentation/ABI/stable/sysfs-firmw
  F:    Documentation/devicetree/bindings/i2c/i2c-opal.txt
  F:    Documentation/devicetree/bindings/powerpc/
  F:    Documentation/devicetree/bindings/rtc/rtc-opal.txt
 -F:    Documentation/powerpc/
 +F:    Documentation/arch/powerpc/
  F:    arch/powerpc/
  F:    drivers/*/*/*pasemi*
  F:    drivers/*/*pasemi*
@@@ -12586,14 -12462,6 +12597,14 @@@ F: drivers/hwmon/ltc2947-i2c.
  F:    drivers/hwmon/ltc2947-spi.c
  F:    drivers/hwmon/ltc2947.h
  
 +LTC2991 HARDWARE MONITOR DRIVER
 +M:    Antoniu Miclaus <[email protected]>
 +L:    [email protected]
 +S:    Supported
 +W:    https://ez.analog.com/linux-software-drivers
 +F:    Documentation/devicetree/bindings/hwmon/adi,ltc2991.yaml
 +F:    drivers/hwmon/ltc2991.c
 +
  LTC2983 IIO TEMPERATURE DRIVER
  M:    Nuno Sá <[email protected]>
  L:    [email protected]
@@@ -12961,7 -12829,7 +12972,7 @@@ MAX31827 TEMPERATURE SWITCH DRIVE
  M:    Daniel Matyas <[email protected]>
  L:    [email protected]
  S:    Supported
 -W:    http://ez.analog.com/community/linux-device-drivers
 +W:    https://ez.analog.com/linux-software-drivers
  F:    Documentation/devicetree/bindings/hwmon/adi,max31827.yaml
  F:    Documentation/hwmon/max31827.rst
  F:    drivers/hwmon/max31827.c
@@@ -13645,6 -13513,7 +13656,6 @@@ F:   net/dsa/tag_mtk.
  
  MEDIATEK T7XX 5G WWAN MODEM DRIVER
  M:    Chandrashekar Devegowda <[email protected]>
 -M:    Intel Corporation <[email protected]>
  R:    Chiranjeevi Rapolu <[email protected]>
  R:    Liu Haijun <[email protected]>
  R:    M Chetan Kumar <[email protected]>
@@@ -13665,7 -13534,7 +13676,7 @@@ F:   drivers/usb/mtu3
  
  MEGACHIPS STDPXXXX-GE-B850V3-FW LVDS/DP++ BRIDGES
  M:    Peter Senna Tschudin <[email protected]>
 -M:    Martin Donnelly <martin.donnell[email protected]>
 +M:    Ian Ray <ian.ra[email protected]>
  M:    Martyn Welch <[email protected]>
  S:    Maintained
  F:    Documentation/devicetree/bindings/display/bridge/megachips-stdpxxxx-ge-b850v3-fw.txt
@@@ -13675,7 -13544,6 +13686,7 @@@ MEGARAID SCSI/SAS DRIVER
  M:    Kashyap Desai <[email protected]>
  M:    Sumit Saxena <[email protected]>
  M:    Shivasharan S <[email protected]>
 +M:    Chandrakanth patil <[email protected]>
  L:    [email protected]
  L:    [email protected]
  S:    Maintained
@@@ -13809,12 -13677,6 +13820,12 @@@ F: drivers/infiniband/hw/mlx5
  F:    include/linux/mlx5/
  F:    include/uapi/rdma/mlx5-abi.h
  
 +MELLANOX MLX5 VDPA DRIVER
 +M:    Dragos Tatulea <[email protected]>
 +L:    [email protected]
 +S:    Supported
 +F:    drivers/vdpa/mlx5/
 +
  MELLANOX MLXCPLD I2C AND MUX DRIVER
  M:    Vadim Pasternak <[email protected]>
  M:    Michael Shych <[email protected]>
@@@ -13995,10 -13857,9 +14006,10 @@@ F: Documentation/devicetree/bindings/me
  F:    drivers/staging/media/meson/vdec/
  
  METHODE UDPU SUPPORT
 -M:    Vladimir Vid <vladimir.vid@sartura.hr>
 +M:    Robert Marko <robert.marko@sartura.hr>
  S:    Maintained
 -F:    arch/arm64/boot/dts/marvell/armada-3720-uDPU.dts
 +F:    arch/arm64/boot/dts/marvell/armada-3720-eDPU.dts
 +F:    arch/arm64/boot/dts/marvell/armada-3720-uDPU.*
  
  MHI BUS
  M:    Manivannan Sadhasivam <[email protected]>
@@@ -14168,13 -14029,6 +14179,13 @@@ S: Supporte
  F:    Documentation/devicetree/bindings/regulator/mcp16502-regulator.txt
  F:    drivers/regulator/mcp16502.c
  
 +MICROCHIP MCP3564 ADC DRIVER
 +M:      Marius Cristea <[email protected]>
 +L:      [email protected]
 +S:      Supported
 +F:      Documentation/devicetree/bindings/iio/adc/microchip,mcp3564.yaml
 +F:      drivers/iio/adc/mcp3564.c
 +
  MICROCHIP MCP3911 ADC DRIVER
  M:    Marcus Folkesson <[email protected]>
  M:    Kent Gustavsson <[email protected]>
@@@ -14184,7 -14038,7 +14195,7 @@@ F:   Documentation/devicetree/bindings/ii
  F:    drivers/iio/adc/mcp3911.c
  
  MICROCHIP MMC/SD/SDIO MCI DRIVER
 -M:    Ludovic Desroches <ludovic.desroche[email protected]>
 +M:    Aubin Constans <aubin.constan[email protected]>
  S:    Maintained
  F:    drivers/mmc/host/atmel-mci.c
  
@@@ -14503,11 -14357,9 +14514,11 @@@ MIPS/LOONGSON1 ARCHITECTUR
  M:    Keguang Zhang <[email protected]>
  L:    [email protected]
  S:    Maintained
 +F:    Documentation/devicetree/bindings/*/loongson,ls1*.yaml
  F:    arch/mips/include/asm/mach-loongson32/
  F:    arch/mips/loongson32/
  F:    drivers/*/*loongson1*
 +F:    drivers/net/ethernet/stmicro/stmmac/dwmac-loongson1.c
  
  MIPS/LOONGSON2EF ARCHITECTURE
  M:    Jiaxun Yang <[email protected]>
@@@ -14535,11 -14387,6 +14546,11 @@@ W: https://linuxtv.or
  T:    git git://linuxtv.org/media_tree.git
  F:    drivers/media/radio/radio-miropcm20*
  
 +MITSUMI MM8013 FG DRIVER
 +M:    Konrad Dybcio <[email protected]>
 +F:    Documentation/devicetree/bindings/power/supply/mitsumi,mm8013.yaml
 +F:    drivers/power/supply/mm8013.c
 +
  MMP SUPPORT
  R:    Lubomir Rintel <[email protected]>
  L:    [email protected] (moderated for non-subscribers)
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/mcgrof/linux.git modules-next
  F:    include/linux/kmod.h
 -F:    include/linux/module.h
 +F:    include/linux/module*.h
  F:    kernel/module/
  F:    lib/test_kmod.c
  F:    scripts/module*
  S:    Maintained
  F:    drivers/mtd/devices/docg3*
  
 +MT9M114 ONSEMI SENSOR DRIVER
 +M:    Laurent Pinchart <[email protected]>
 +L:    [email protected]
 +S:    Maintained
 +T:    git git://linuxtv.org/media_tree.git
 +F:    Documentation/devicetree/bindings/media/i2c/onnn,mt9m114.yaml
 +F:    drivers/media/i2c/mt9m114.c
 +
  MT9P031 APTINA CAMERA SENSOR
  M:    Laurent Pinchart <[email protected]>
  L:    [email protected]
@@@ -15127,11 -14966,10 +15138,11 @@@ W:        https://github.com/multipath-tcp/mpt
  B:    https://github.com/multipath-tcp/mptcp_net-next/issues
  T:    git https://github.com/multipath-tcp/mptcp_net-next.git export-net
  T:    git https://github.com/multipath-tcp/mptcp_net-next.git export
 +F:    Documentation/netlink/specs/mptcp.yaml
  F:    Documentation/networking/mptcp-sysctl.rst
  F:    include/net/mptcp.h
  F:    include/trace/events/mptcp.h
 -F:    include/uapi/linux/mptcp.h
 +F:    include/uapi/linux/mptcp*.h
  F:    net/mptcp/
  F:    tools/testing/selftests/bpf/*/*mptcp*.c
  F:    tools/testing/selftests/net/mptcp/
@@@ -15304,7 -15142,7 +15315,7 @@@ NOLIBC HEADER FIL
  M:    Willy Tarreau <[email protected]>
  M:    Thomas Weißschuh <[email protected]>
  S:    Maintained
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/wtarreau/nolibc.git
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/nolibc/linux-nolibc.git
  F:    tools/include/nolibc/
  F:    tools/testing/selftests/nolibc/
  
@@@ -15524,7 -15362,6 +15535,7 @@@ M:   Laurentiu Palcu <laurentiu.palcu@oss
  R:    Lucas Stach <[email protected]>
  L:    [email protected]
  S:    Maintained
 +T:    git git://anongit.freedesktop.org/drm/drm-misc
  F:    Documentation/devicetree/bindings/display/imx/nxp,imx8mq-dcss.yaml
  F:    drivers/gpu/drm/imx/dcss/
  
@@@ -15597,7 -15434,7 +15608,7 @@@ NXP TFA9879 DRIVE
  M:    Peter Rosin <[email protected]>
  L:    [email protected] (moderated for non-subscribers)
  S:    Maintained
 -F:    Documentation/devicetree/bindings/sound/tfa9879.txt
 +F:    Documentation/devicetree/bindings/sound/nxp,tfa9879.yaml
  F:    sound/soc/codecs/tfa9879*
  
  NXP-NCI NFC DRIVER
@@@ -15634,13 -15471,6 +15645,13 @@@ F: include/linux/objagg.
  F:    lib/objagg.c
  F:    lib/test_objagg.c
  
 +OBJPOOL
 +M:    Matt Wu <[email protected]>
 +S:    Supported
 +F:    include/linux/objpool.h
 +F:    lib/objpool.c
 +F:    lib/test_objpool.c
 +
  OBJTOOL
  M:    Josh Poimboeuf <[email protected]>
  M:    Peter Zijlstra <[email protected]>
  S:    Maintained
  T:    git git://linuxtv.org/media_tree.git
  F:    Documentation/devicetree/bindings/media/i2c/ovti,ov4689.yaml
 -F:    drivers/media/i2c/ov5647.c
 +F:    drivers/media/i2c/ov4689.c
  
  OMNIVISION OV5640 SENSOR DRIVER
  M:    Steve Longerbeam <[email protected]>
@@@ -16043,7 -15873,8 +16054,7 @@@ F:   Documentation/devicetree/bindings/me
  F:    drivers/media/i2c/ov8858.c
  
  OMNIVISION OV9282 SENSOR DRIVER
 -M:    Paul J. Murphy <[email protected]>
 -M:    Daniele Alessandrelli <[email protected]>
 +M:    Dave Stevenson <[email protected]>
  L:    [email protected]
  S:    Maintained
  T:    git git://linuxtv.org/media_tree.git
@@@ -16151,7 -15982,6 +16162,7 @@@ F:   Documentation/ABI/testing/sysfs-firm
  F:    drivers/of/
  F:    include/linux/of*.h
  F:    scripts/dtc/
 +F:    tools/testing/selftests/dt/
  K:    of_overlay_notifier_
  K:    of_overlay_fdt_apply
  K:    of_overlay_remove
  S:    Maintained
  F:    drivers/i2c/muxes/i2c-mux-pca9541.c
  
 -PCDP - PRIMARY CONSOLE AND DEBUG PORT
 -M:    Khalid Aziz <[email protected]>
 -S:    Maintained
 -F:    drivers/firmware/pcdp.*
 -
  PCI DRIVER FOR AARDVARK (Marvell Armada 3700)
  M:    Thomas Petazzoni <[email protected]>
  M:    Pali Rohár <[email protected]>
  S:    Maintained
  F:    Documentation/devicetree/bindings/pci/*rcar*
  F:    drivers/pci/controller/*rcar*
 +F:    drivers/pci/controller/dwc/*rcar*
  
  PCI DRIVER FOR SAMSUNG EXYNOS
  M:    Jingoo Han <[email protected]>
@@@ -16668,7 -16502,7 +16679,7 @@@ R:   Oliver O'Halloran <[email protected]
  L:    [email protected]
  S:    Supported
  F:    Documentation/PCI/pci-error-recovery.rst
 -F:    Documentation/powerpc/eeh-pci-error-recovery.rst
 +F:    Documentation/arch/powerpc/eeh-pci-error-recovery.rst
  F:    arch/powerpc/include/*/eeh*.h
  F:    arch/powerpc/kernel/eeh*.c
  F:    arch/powerpc/platforms/*/eeh*.c
  S:    Supported
  F:    drivers/net/ethernet/qlogic/qlcnic/
  
 -QLOGIC QLGE 10Gb ETHERNET DRIVER
 -M:    Manish Chopra <[email protected]>
 -M:    [email protected]
 -M:    Coiby Xu <[email protected]>
 -L:    [email protected]
 -S:    Supported
 -F:    Documentation/networking/device_drivers/qlogic/qlge.rst
 -F:    drivers/staging/qlge/
 -
  QM1D1B0004 MEDIA DRIVER
  M:    Akihiro Tsukada <[email protected]>
  L:    [email protected]
@@@ -17969,18 -17812,6 +17980,18 @@@ S: Maintaine
  F:    Documentation/devicetree/bindings/mtd/qcom,nandc.yaml
  F:    drivers/mtd/nand/raw/qcom_nandc.c
  
 +QUALCOMM QSEECOM DRIVER
 +M:    Maximilian Luz <[email protected]>
 +L:    [email protected]
 +S:    Maintained
 +F:    drivers/firmware/qcom/qcom_qseecom.c
 +
 +QUALCOMM QSEECOM UEFISECAPP DRIVER
 +M:    Maximilian Luz <[email protected]>
 +L:    [email protected]
 +S:    Maintained
 +F:    drivers/firmware/qcom/qcom_qseecom_uefisecapp.c
 +
  QUALCOMM RMNET DRIVER
  M:    Subash Abhinov Kasiviswanathan <[email protected]>
  M:    Sean Tranchetti <[email protected]>
@@@ -18043,7 -17874,6 +18054,7 @@@ C:   irc://irc.oftc.net/radeo
  T:    git https://gitlab.freedesktop.org/agd5f/linux.git
  F:    Documentation/gpu/amdgpu/
  F:    drivers/gpu/drm/amd/
 +F:    drivers/gpu/drm/ci/xfails/amd*
  F:    drivers/gpu/drm/radeon/
  F:    include/uapi/drm/amdgpu_drm.h
  F:    include/uapi/drm/radeon_drm.h
@@@ -18108,6 -17938,7 +18119,6 @@@ F:   arch/mips/boot/dts/ralink/mt7621
  
  RALINK RT2X00 WIRELESS LAN DRIVER
  M:    Stanislaw Gruszka <[email protected]>
 -M:    Helmut Schaa <[email protected]>
  L:    [email protected]
  S:    Maintained
  F:    drivers/net/wireless/ralink/rt2x00/
  S:    Supported
  Q:    https://patchwork.kernel.org/project/linux-riscv/list/
  C:    irc://irc.libera.chat/riscv
 -P:    Documentation/riscv/patch-acceptance.rst
 +P:    Documentation/arch/riscv/patch-acceptance.rst
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/riscv/linux.git
  F:    arch/riscv/
  N:    riscv
@@@ -18692,7 -18523,6 +18703,7 @@@ F:   sound/soc/rockchip/rockchip_i2s_tdm.
  
  ROCKCHIP ISP V1 DRIVER
  M:    Dafna Hirschfeld <[email protected]>
 +M:    Laurent Pinchart <[email protected]>
  L:    [email protected]
  L:    [email protected]
  S:    Maintained
@@@ -18743,12 -18573,6 +18754,12 @@@ S: Maintaine
  F:    Documentation/devicetree/bindings/iio/light/bh1750.yaml
  F:    drivers/iio/light/bh1750.c
  
 +ROHM BM1390 PRESSURE SENSOR DRIVER
 +M:    Matti Vaittinen <[email protected]>
 +L:    [email protected]
 +S:    Supported
 +F:    drivers/iio/pressure/rohm-bm1390.c
 +
  ROHM BU270xx LIGHT SENSOR DRIVERs
  M:    Matti Vaittinen <[email protected]>
  L:    [email protected]
@@@ -18891,10 -18715,9 +18902,10 @@@ R: Andreas Hindborg <a.hindborg@samsung
  R:    Alice Ryhl <[email protected]>
  L:    [email protected]
  S:    Supported
 -W:    https://github.com/Rust-for-Linux/linux
 +W:    https://rust-for-linux.com
  B:    https://github.com/Rust-for-Linux/linux/issues
  C:    zulip://rust-for-linux.zulipchat.com
 +P:    https://rust-for-linux.com/contributing
  T:    git https://github.com/Rust-for-Linux/linux.git rust-next
  F:    Documentation/rust/
  F:    rust/
@@@ -19346,6 -19169,7 +19357,6 @@@ M:   "Martin K. Petersen" <martin.peterse
  L:    [email protected]
  L:    [email protected]
  S:    Supported
 -W:    http://www.linux-iscsi.org
  Q:    https://patchwork.kernel.org/project/target-devel/list/
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/mkp/scsi.git
  F:    Documentation/target/
@@@ -19428,8 -19252,7 +19439,8 @@@ F:   Documentation/devicetree/bindings/mm
  F:    drivers/mmc/host/sdhci*
  
  SECURE DIGITAL HOST CONTROLLER INTERFACE (SDHCI) MICROCHIP DRIVER
 -M:    Eugen Hristev <[email protected]>
 +M:    Aubin Constans <[email protected]>
 +R:    Eugen Hristev <[email protected]>
  L:    [email protected]
  S:    Supported
  F:    drivers/mmc/host/sdhci-of-at91.c
@@@ -19586,7 -19409,6 +19597,7 @@@ F:   drivers/net/ethernet/sfc
  
  SFCTEMP HWMON DRIVER
  M:    Emil Renner Berthing <[email protected]>
 +M:    Hal Feng <[email protected]>
  L:    [email protected]
  S:    Maintained
  F:    Documentation/devicetree/bindings/hwmon/starfive,jh71x0-temp.yaml
@@@ -20187,15 -20009,19 +20198,15 @@@ T:        git git://linuxtv.org/media_tree.gi
  F:    drivers/media/i2c/imx319.c
  
  SONY IMX334 SENSOR DRIVER
 -M:    Paul J. Murphy <[email protected]>
 -M:    Daniele Alessandrelli <[email protected]>
  L:    [email protected]
 -S:    Maintained
 +S:    Orphan
  T:    git git://linuxtv.org/media_tree.git
  F:    Documentation/devicetree/bindings/media/i2c/sony,imx334.yaml
  F:    drivers/media/i2c/imx334.c
  
  SONY IMX335 SENSOR DRIVER
 -M:    Paul J. Murphy <[email protected]>
 -M:    Daniele Alessandrelli <[email protected]>
  L:    [email protected]
 -S:    Maintained
 +S:    Orphan
  T:    git git://linuxtv.org/media_tree.git
  F:    Documentation/devicetree/bindings/media/i2c/sony,imx335.yaml
  F:    drivers/media/i2c/imx335.c
@@@ -20208,8 -20034,10 +20219,8 @@@ T:  git git://linuxtv.org/media_tree.gi
  F:    drivers/media/i2c/imx355.c
  
  SONY IMX412 SENSOR DRIVER
 -M:    Paul J. Murphy <[email protected]>
 -M:    Daniele Alessandrelli <[email protected]>
  L:    [email protected]
 -S:    Maintained
 +S:    Orphan
  T:    git git://linuxtv.org/media_tree.git
  F:    Documentation/devicetree/bindings/media/i2c/sony,imx412.yaml
  F:    drivers/media/i2c/imx412.c
@@@ -20242,17 -20070,10 +20253,17 @@@ F:        drivers/char/sonypi.
  F:    drivers/platform/x86/sony-laptop.c
  F:    include/linux/sony-laptop.h
  
 +SOPHGO DEVICETREES
 +M:    Chao Wei <[email protected]>
 +M:    Chen Wang <[email protected]>
 +S:    Maintained
 +F:    arch/riscv/boot/dts/sophgo/
 +F:    Documentation/devicetree/bindings/riscv/sophgo.yaml
 +
  SOUND
  M:    Jaroslav Kysela <[email protected]>
  M:    Takashi Iwai <[email protected]>
 -L:    [email protected] (moderated for non-subscribers)
 +L:    [email protected]
  S:    Maintained
  W:    http://www.alsa-project.org/
  Q:    http://patchwork.kernel.org/project/alsa-devel/list/
@@@ -20265,7 -20086,7 +20276,7 @@@ F:   tools/testing/selftests/als
  
  SOUND - ALSA SELFTESTS
  M:    Mark Brown <[email protected]>
 -L:    [email protected] (moderated for non-subscribers)
 +L:    [email protected]
  L:    [email protected]
  S:    Supported
  F:    tools/testing/selftests/alsa
@@@ -20291,7 -20112,7 +20302,7 @@@ F:   sound/soc/soc-generic-dmaengine-pcm.
  SOUND - SOC LAYER / DYNAMIC AUDIO POWER MANAGEMENT (ASoC)
  M:    Liam Girdwood <[email protected]>
  M:    Mark Brown <[email protected]>
 -L:    [email protected] (moderated for non-subscribers)
 +L:    [email protected]
  S:    Supported
  W:    http://alsa-project.org/main/index.php/ASoC
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git
@@@ -20299,10 -20120,6 +20310,10 @@@ F: Documentation/devicetree/bindings/so
  F:    Documentation/sound/soc/
  F:    include/dt-bindings/sound/
  F:    include/sound/soc*
 +F:    include/sound/sof.h
 +F:    include/sound/sof/
 +F:    include/trace/events/sof*.h
 +F:    include/uapi/sound/asoc.h
  F:    sound/soc/
  
  SOUND - SOUND OPEN FIRMWARE (SOF) DRIVERS
@@@ -20656,13 -20473,6 +20667,13 @@@ S: Supporte
  F:    Documentation/devicetree/bindings/clock/starfive,jh7110-pll.yaml
  F:    drivers/clk/starfive/clk-starfive-jh7110-pll.c
  
 +STARFIVE JH7110 PWMDAC DRIVER
 +M:    Hal Feng <[email protected]>
 +M:    Xingyu Wu <[email protected]>
 +S:    Supported
 +F:    Documentation/devicetree/bindings/sound/starfive,jh7110-pwmdac.yaml
 +F:    sound/soc/starfive/jh7110_pwmdac.c
 +
  STARFIVE JH7110 SYSCON
  M:    William Qiu <[email protected]>
  M:    Xingyu Wu <[email protected]>
@@@ -20710,10 -20520,9 +20721,10 @@@ F: drivers/usb/cdns3/cdns3-starfive.
  
  STARFIVE JH71XX PMU CONTROLLER DRIVER
  M:    Walker Chen <[email protected]>
 +M:    Changhuang Liang <[email protected]>
  S:    Supported
  F:    Documentation/devicetree/bindings/power/starfive*
 -F:    drivers/pmdomain/starfive/jh71xx-pmu.c
 +F:    drivers/pmdomain/starfive/
  F:    include/dt-bindings/power/starfive,jh7110-pmu.h
  
  STARFIVE SOC DRIVERS
@@@ -20721,6 -20530,7 +20732,6 @@@ M:   Conor Dooley <[email protected]
  S:    Maintained
  T:    git https://git.kernel.org/pub/scm/linux/kernel/git/conor/linux.git/
  F:    Documentation/devicetree/bindings/soc/starfive/
 -F:    drivers/soc/starfive/
  
  STARFIVE TRNG DRIVER
  M:    Jia Jie Ho <[email protected]>
@@@ -21101,7 -20911,6 +21112,7 @@@ F:   drivers/clk/clk-sc[mp]i.
  F:    drivers/cpufreq/sc[mp]i-cpufreq.c
  F:    drivers/firmware/arm_scmi/
  F:    drivers/firmware/arm_scpi.c
 +F:    drivers/pmdomain/arm/
  F:    drivers/powercap/arm_scmi_powercap.c
  F:    drivers/regulator/scmi-regulator.c
  F:    drivers/reset/reset-scmi.c
@@@ -21561,8 -21370,8 +21572,8 @@@ F:   drivers/media/radio/radio-raremono.
  THERMAL
  M:    Rafael J. Wysocki <[email protected]>
  M:    Daniel Lezcano <[email protected]>
 -R:    Amit Kucheria <[email protected]>
  R:    Zhang Rui <[email protected]>
 +R:    Lukasz Luba <[email protected]>
  L:    [email protected]
  S:    Supported
  Q:    https://patchwork.kernel.org/project/linux-pm/list/
@@@ -21773,13 -21582,6 +21784,13 @@@ F: Documentation/devicetree/bindings/me
  F:    drivers/media/i2c/ds90*
  F:    include/media/i2c/ds90*
  
 +TI J721E CSI2RX DRIVER
 +M:    Jai Luthra <[email protected]>
 +L:    [email protected]
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/media/ti,j721e-csi2rx-shim.yaml
 +F:    drivers/media/platform/ti/j721e-csi2rx/
 +
  TI KEYSTONE MULTICORE NAVIGATOR DRIVERS
  M:    Nishanth Menon <[email protected]>
  M:    Santosh Shilimkar <[email protected]>
@@@ -22036,11 -21838,9 +22047,11 @@@ W: https://www.tq-group.com/en/products
  F:    arch/arm/boot/dts/imx*mba*.dts*
  F:    arch/arm/boot/dts/imx*tqma*.dts*
  F:    arch/arm/boot/dts/mba*.dtsi
 +F:    arch/arm64/boot/dts/freescale/fsl-*tqml*.dts*
  F:    arch/arm64/boot/dts/freescale/imx*mba*.dts*
  F:    arch/arm64/boot/dts/freescale/imx*tqma*.dts*
  F:    arch/arm64/boot/dts/freescale/mba*.dtsi
 +F:    arch/arm64/boot/dts/freescale/tqml*.dts*
  F:    drivers/gpio/gpio-tqmx86.c
  F:    drivers/mfd/tqmx86.c
  F:    drivers/watchdog/tqmx86_wdt.c
@@@ -22096,14 -21896,6 +22107,14 @@@ W: https://github.com/srcres258/linux-d
  T:    git git://github.com/srcres258/linux-doc.git doc-zh-tw
  F:    Documentation/translations/zh_TW/
  
 +TRUSTED SECURITY MODULE (TSM) ATTESTATION REPORTS
 +M:    Dan Williams <[email protected]>
 +L:    [email protected]
 +S:    Maintained
 +F:    Documentation/ABI/testing/configfs-tsm
 +F:    drivers/virt/coco/tsm.c
 +F:    include/linux/tsm.h
 +
  TTY LAYER AND SERIAL DRIVERS
  M:    Greg Kroah-Hartman <[email protected]>
  M:    Jiri Slaby <[email protected]>
  L:    [email protected]
  S:    Maintained
  T:    git git://anongit.freedesktop.org/drm/drm-misc
 +F:    drivers/gpu/drm/ci/xfails/virtio*
  F:    drivers/gpu/drm/virtio/
  F:    include/uapi/linux/virtio_gpu.h
  
@@@ -23152,7 -22943,7 +23163,7 @@@ F:   fs/vboxsf/
  
  VIRTUAL PCM TEST DRIVER
  M:    Ivan Orlov <[email protected]>
 -L:    alsa-devel@alsa-project.org
 +L:    [email protected].org
  S:    Maintained
  F:    Documentation/sound/cards/pcmtest.rst
  F:    sound/drivers/pcmtest.c
@@@ -23255,7 -23046,7 +23266,7 @@@ F:   drivers/scsi/vmw_pvscsi.
  F:    drivers/scsi/vmw_pvscsi.h
  
  VMWARE VIRTUAL PTP CLOCK DRIVER
 -M:    Deep Shah <sdeep@vmware.com>
 +M:    Jeff Sipek <jsipek@vmware.com>
  R:    Ajay Kaher <[email protected]>
  R:    Alexey Makhalov <[email protected]>
  R:    VMware PV-Drivers Reviewers <[email protected]>
@@@ -23902,11 -23693,6 +23913,11 @@@ F: Documentation/devicetree/bindings/gp
  F:    drivers/gpio/gpio-xilinx.c
  F:    drivers/gpio/gpio-zynq.c
  
 +XILINX LL TEMAC ETHERNET DRIVER
 +L:    [email protected]
 +S:    Orphan
 +F:    drivers/net/ethernet/xilinx/ll_temac*
 +
  XILINX PWM DRIVER
  M:    Sean Anderson <[email protected]>
  S:    Maintained
@@@ -23939,13 -23725,6 +23950,13 @@@ F: Documentation/devicetree/bindings/me
  F:    drivers/media/platform/xilinx/
  F:    include/uapi/linux/xilinx-v4l2-controls.h
  
 +XILINX VERSAL EDAC DRIVER
 +M:    Shubhrajyoti Datta <[email protected]>
 +M:    Sai Krishna Potthuri <[email protected]>
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/memory-controllers/xlnx,versal-ddrmc-edac.yaml
 +F:    drivers/edac/versal_edac.c
 +
  XILINX WATCHDOG DRIVER
  M:    Srinivas Neeli <[email protected]>
  R:    Shubhrajyoti Datta <[email protected]>
diff --combined fs/befs/linuxvfs.c
index 9acdec56f626fdb3a5becd2c11fa9f4723bc8fb1,410dcaffd5ab88a3bd0dffa4755ecef3f526a034..a93d76df8ed8bb1502e6bcd261c1ef9cee60cb36
@@@ -96,6 -96,7 +96,7 @@@ static const struct address_space_opera
  };
  
  static const struct export_operations befs_export_operations = {
+       .encode_fh      = generic_encode_ino32_fh,
        .fh_to_dentry   = befs_fh_to_dentry,
        .fh_to_parent   = befs_fh_to_parent,
        .get_parent     = befs_get_parent,
@@@ -360,11 -361,11 +361,11 @@@ static struct inode *befs_iget(struct s
         * for indexing purposes. (PFD, page 54)
         */
  
 -      inode->i_mtime.tv_sec =
 -          fs64_to_cpu(sb, raw_inode->last_modified_time) >> 16;
 -      inode->i_mtime.tv_nsec = 0;   /* lower 16 bits are not a time */
 -      inode_set_ctime_to_ts(inode, inode->i_mtime);
 -      inode->i_atime = inode->i_mtime;
 +      inode_set_mtime(inode,
 +                      fs64_to_cpu(sb, raw_inode->last_modified_time) >> 16,
 +                      0);/* lower 16 bits are not a time */
 +      inode_set_ctime_to_ts(inode, inode_get_mtime(inode));
 +      inode_set_atime_to_ts(inode, inode_get_mtime(inode));
  
        befs_ino->i_inode_num = fsrun_to_cpu(sb, raw_inode->inode_num);
        befs_ino->i_parent = fsrun_to_cpu(sb, raw_inode->parent);
diff --combined fs/efivarfs/super.c
index b784c393a5041e05abcf06440b6fddba013debba,2933090ad11f2a8974a157824c41d4f44320b4f3..77240953a92e0e1d65a49fc946bd1c830836b909
@@@ -8,7 -8,6 +8,7 @@@
  #include <linux/efi.h>
  #include <linux/fs.h>
  #include <linux/fs_context.h>
 +#include <linux/fs_parser.h>
  #include <linux/module.h>
  #include <linux/pagemap.h>
  #include <linux/ucs2_string.h>
@@@ -25,27 -24,13 +25,28 @@@ static void efivarfs_evict_inode(struc
        clear_inode(inode);
  }
  
 +static int efivarfs_show_options(struct seq_file *m, struct dentry *root)
 +{
 +      struct super_block *sb = root->d_sb;
 +      struct efivarfs_fs_info *sbi = sb->s_fs_info;
 +      struct efivarfs_mount_opts *opts = &sbi->mount_opts;
 +
 +      if (!uid_eq(opts->uid, GLOBAL_ROOT_UID))
 +              seq_printf(m, ",uid=%u",
 +                              from_kuid_munged(&init_user_ns, opts->uid));
 +      if (!gid_eq(opts->gid, GLOBAL_ROOT_GID))
 +              seq_printf(m, ",gid=%u",
 +                              from_kgid_munged(&init_user_ns, opts->gid));
 +      return 0;
 +}
 +
  static int efivarfs_statfs(struct dentry *dentry, struct kstatfs *buf)
  {
        const u32 attr = EFI_VARIABLE_NON_VOLATILE |
                         EFI_VARIABLE_BOOTSERVICE_ACCESS |
                         EFI_VARIABLE_RUNTIME_ACCESS;
        u64 storage_space, remaining_space, max_variable_size;
+       u64 id = huge_encode_dev(dentry->d_sb->s_dev);
        efi_status_t status;
  
        /* Some UEFI firmware does not implement QueryVariableInfo() */
@@@ -69,6 -54,7 +70,7 @@@
        buf->f_blocks   = storage_space;
        buf->f_bfree    = remaining_space;
        buf->f_type     = dentry->d_sb->s_magic;
+       buf->f_fsid     = u64_to_fsid(id);
  
        /*
         * In f_bavail we declare the free space that the kernel will allow writing
@@@ -86,7 -72,6 +88,7 @@@ static const struct super_operations ef
        .statfs = efivarfs_statfs,
        .drop_inode = generic_delete_inode,
        .evict_inode = efivarfs_evict_inode,
 +      .show_options = efivarfs_show_options,
  };
  
  /*
@@@ -248,45 -233,6 +250,45 @@@ static int efivarfs_destroy(struct efiv
        return 0;
  }
  
 +enum {
 +      Opt_uid, Opt_gid,
 +};
 +
 +static const struct fs_parameter_spec efivarfs_parameters[] = {
 +      fsparam_u32("uid", Opt_uid),
 +      fsparam_u32("gid", Opt_gid),
 +      {},
 +};
 +
 +static int efivarfs_parse_param(struct fs_context *fc, struct fs_parameter *param)
 +{
 +      struct efivarfs_fs_info *sbi = fc->s_fs_info;
 +      struct efivarfs_mount_opts *opts = &sbi->mount_opts;
 +      struct fs_parse_result result;
 +      int opt;
 +
 +      opt = fs_parse(fc, efivarfs_parameters, param, &result);
 +      if (opt < 0)
 +              return opt;
 +
 +      switch (opt) {
 +      case Opt_uid:
 +              opts->uid = make_kuid(current_user_ns(), result.uint_32);
 +              if (!uid_valid(opts->uid))
 +                      return -EINVAL;
 +              break;
 +      case Opt_gid:
 +              opts->gid = make_kgid(current_user_ns(), result.uint_32);
 +              if (!gid_valid(opts->gid))
 +                      return -EINVAL;
 +              break;
 +      default:
 +              return -EINVAL;
 +      }
 +
 +      return 0;
 +}
 +
  static int efivarfs_fill_super(struct super_block *sb, struct fs_context *fc)
  {
        struct inode *inode = NULL;
@@@ -333,21 -279,10 +335,21 @@@ static int efivarfs_get_tree(struct fs_
  
  static const struct fs_context_operations efivarfs_context_ops = {
        .get_tree       = efivarfs_get_tree,
 +      .parse_param    = efivarfs_parse_param,
  };
  
  static int efivarfs_init_fs_context(struct fs_context *fc)
  {
 +      struct efivarfs_fs_info *sfi;
 +
 +      sfi = kzalloc(sizeof(*sfi), GFP_KERNEL);
 +      if (!sfi)
 +              return -ENOMEM;
 +
 +      sfi->mount_opts.uid = GLOBAL_ROOT_UID;
 +      sfi->mount_opts.gid = GLOBAL_ROOT_GID;
 +
 +      fc->s_fs_info = sfi;
        fc->ops = &efivarfs_context_ops;
        return 0;
  }
@@@ -368,7 -303,6 +370,7 @@@ static struct file_system_type efivarfs
        .name    = "efivarfs",
        .init_fs_context = efivarfs_init_fs_context,
        .kill_sb = efivarfs_kill_sb,
 +      .parameters = efivarfs_parameters,
  };
  
  static __init int efivarfs_init(void)
diff --combined fs/erofs/super.c
index 976dc39a88f74e858423eb1ab7bcbfd900f7a326,edbe07a241562713894f51a97634109ff91ce4ce..3789d62245136a488d7b5d1bf30e40bc53314ca5
@@@ -4,11 -4,14 +4,11 @@@
   *             https://www.huawei.com/
   * Copyright (C) 2021, Alibaba Cloud
   */
 -#include <linux/module.h>
  #include <linux/statfs.h>
 -#include <linux/parser.h>
  #include <linux/seq_file.h>
  #include <linux/crc32c.h>
  #include <linux/fs_context.h>
  #include <linux/fs_parser.h>
 -#include <linux/dax.h>
  #include <linux/exportfs.h>
  #include "xattr.h"
  
@@@ -153,15 -156,68 +153,15 @@@ void *erofs_read_metadata(struct super_
        return buffer;
  }
  
 -#ifdef CONFIG_EROFS_FS_ZIP
 -static int erofs_load_compr_cfgs(struct super_block *sb,
 -                               struct erofs_super_block *dsb)
 +#ifndef CONFIG_EROFS_FS_ZIP
 +static int z_erofs_parse_cfgs(struct super_block *sb,
 +                            struct erofs_super_block *dsb)
  {
 -      struct erofs_sb_info *sbi = EROFS_SB(sb);
 -      struct erofs_buf buf = __EROFS_BUF_INITIALIZER;
 -      unsigned int algs, alg;
 -      erofs_off_t offset;
 -      int size, ret = 0;
 -
 -      sbi->available_compr_algs = le16_to_cpu(dsb->u1.available_compr_algs);
 -      if (sbi->available_compr_algs & ~Z_EROFS_ALL_COMPR_ALGS) {
 -              erofs_err(sb, "try to load compressed fs with unsupported algorithms %x",
 -                        sbi->available_compr_algs & ~Z_EROFS_ALL_COMPR_ALGS);
 -              return -EINVAL;
 -      }
 -
 -      erofs_init_metabuf(&buf, sb);
 -      offset = EROFS_SUPER_OFFSET + sbi->sb_size;
 -      alg = 0;
 -      for (algs = sbi->available_compr_algs; algs; algs >>= 1, ++alg) {
 -              void *data;
 -
 -              if (!(algs & 1))
 -                      continue;
 -
 -              data = erofs_read_metadata(sb, &buf, &offset, &size);
 -              if (IS_ERR(data)) {
 -                      ret = PTR_ERR(data);
 -                      break;
 -              }
 +      if (!dsb->u1.available_compr_algs)
 +              return 0;
  
 -              switch (alg) {
 -              case Z_EROFS_COMPRESSION_LZ4:
 -                      ret = z_erofs_load_lz4_config(sb, dsb, data, size);
 -                      break;
 -              case Z_EROFS_COMPRESSION_LZMA:
 -                      ret = z_erofs_load_lzma_config(sb, dsb, data, size);
 -                      break;
 -              case Z_EROFS_COMPRESSION_DEFLATE:
 -                      ret = z_erofs_load_deflate_config(sb, dsb, data, size);
 -                      break;
 -              default:
 -                      DBG_BUGON(1);
 -                      ret = -EFAULT;
 -              }
 -              kfree(data);
 -              if (ret)
 -                      break;
 -      }
 -      erofs_put_metabuf(&buf);
 -      return ret;
 -}
 -#else
 -static int erofs_load_compr_cfgs(struct super_block *sb,
 -                               struct erofs_super_block *dsb)
 -{
 -      if (dsb->u1.available_compr_algs) {
 -              erofs_err(sb, "try to load compressed fs when compression is disabled");
 -              return -EINVAL;
 -      }
 -      return 0;
 +      erofs_err(sb, "compression disabled, unable to mount compressed EROFS");
 +      return -EOPNOTSUPP;
  }
  #endif
  
@@@ -171,7 -227,7 +171,7 @@@ static int erofs_init_device(struct ero
        struct erofs_sb_info *sbi = EROFS_SB(sb);
        struct erofs_fscache *fscache;
        struct erofs_deviceslot *dis;
 -      struct block_device *bdev;
 +      struct bdev_handle *bdev_handle;
        void *ptr;
  
        ptr = erofs_read_metabuf(buf, sb, erofs_blknr(sb, *pos), EROFS_KMAP);
                        return PTR_ERR(fscache);
                dif->fscache = fscache;
        } else if (!sbi->devs->flatdev) {
 -              bdev = blkdev_get_by_path(dif->path, BLK_OPEN_READ, sb->s_type,
 -                                        NULL);
 -              if (IS_ERR(bdev))
 -                      return PTR_ERR(bdev);
 -              dif->bdev = bdev;
 -              dif->dax_dev = fs_dax_get_by_bdev(bdev, &dif->dax_part_off,
 -                                                NULL, NULL);
 +              bdev_handle = bdev_open_by_path(dif->path, BLK_OPEN_READ,
 +                                              sb->s_type, NULL);
 +              if (IS_ERR(bdev_handle))
 +                      return PTR_ERR(bdev_handle);
 +              dif->bdev_handle = bdev_handle;
 +              dif->dax_dev = fs_dax_get_by_bdev(bdev_handle->bdev,
 +                              &dif->dax_part_off, NULL, NULL);
        }
  
        dif->blocks = le32_to_cpu(dis->blocks);
@@@ -350,7 -406,10 +350,7 @@@ static int erofs_read_superblock(struc
        }
  
        /* parse on-disk compression configurations */
 -      if (erofs_sb_has_compr_cfgs(sbi))
 -              ret = erofs_load_compr_cfgs(sb, dsb);
 -      else
 -              ret = z_erofs_load_lz4_config(sb, dsb, NULL, 0);
 +      ret = z_erofs_parse_cfgs(sb, dsb);
        if (ret < 0)
                goto out;
  
@@@ -567,6 -626,7 +567,7 @@@ static struct dentry *erofs_get_parent(
  }
  
  static const struct export_operations erofs_export_ops = {
+       .encode_fh = generic_encode_ino32_fh,
        .fh_to_dentry = erofs_fh_to_dentry,
        .fh_to_parent = erofs_fh_to_parent,
        .get_parent = erofs_get_parent,
@@@ -665,13 -725,13 +666,13 @@@ static int erofs_fc_fill_super(struct s
        xa_init(&sbi->managed_pslots);
  #endif
  
 -      inode = erofs_iget(sb, ROOT_NID(sbi));
 +      inode = erofs_iget(sb, sbi->root_nid);
        if (IS_ERR(inode))
                return PTR_ERR(inode);
  
        if (!S_ISDIR(inode->i_mode)) {
                erofs_err(sb, "rootino(nid %llu) is not a directory(i_mode %o)",
 -                        ROOT_NID(sbi), inode->i_mode);
 +                        sbi->root_nid, inode->i_mode);
                iput(inode);
                return -EINVAL;
        }
        if (err)
                return err;
  
 -      erofs_info(sb, "mounted with root inode @ nid %llu.", ROOT_NID(sbi));
 +      erofs_info(sb, "mounted with root inode @ nid %llu.", sbi->root_nid);
        return 0;
  }
  
@@@ -747,8 -807,8 +748,8 @@@ static int erofs_release_device_info(in
        struct erofs_device_info *dif = ptr;
  
        fs_put_dax(dif->dax_dev, NULL);
 -      if (dif->bdev)
 -              blkdev_put(dif->bdev, &erofs_fs_type);
 +      if (dif->bdev_handle)
 +              bdev_release(dif->bdev_handle);
        erofs_fscache_unregister_cookie(dif->fscache);
        dif->fscache = NULL;
        kfree(dif->path);
diff --combined fs/ext2/super.c
index 645ee6142f69e3bfa78b8c2eedd0325e134e68e7,b9f158a34997aadc13dcaf46b9784fbb18a63d4c..01f9addc8b1f60ab0ae8533e3673baa38fdae934
@@@ -397,6 -397,7 +397,7 @@@ static struct dentry *ext2_fh_to_parent
  }
  
  static const struct export_operations ext2_export_ops = {
+       .encode_fh = generic_encode_ino32_fh,
        .fh_to_dentry = ext2_fh_to_dentry,
        .fh_to_parent = ext2_fh_to_parent,
        .get_parent = ext2_get_parent,
@@@ -1572,7 -1573,7 +1573,7 @@@ out
        if (inode->i_size < off+len-towrite)
                i_size_write(inode, off+len-towrite);
        inode_inc_iversion(inode);
 -      inode->i_mtime = inode_set_ctime_current(inode);
 +      inode_set_mtime_to_ts(inode, inode_set_ctime_current(inode));
        mark_inode_dirty(inode);
        return len - towrite;
  }
diff --combined fs/ext4/super.c
index 54a9dde7483a5a505f41f75fde05a763a114c443,c44db19154375214d79018861eebd33d8a78edc6..c5fcf377ab1faad832c9165fd2ed299d9c3e94f6
@@@ -244,25 -244,18 +244,25 @@@ static struct buffer_head *__ext4_sb_br
  struct buffer_head *ext4_sb_bread(struct super_block *sb, sector_t block,
                                   blk_opf_t op_flags)
  {
 -      return __ext4_sb_bread_gfp(sb, block, op_flags, __GFP_MOVABLE);
 +      gfp_t gfp = mapping_gfp_constraint(sb->s_bdev->bd_inode->i_mapping,
 +                      ~__GFP_FS) | __GFP_MOVABLE;
 +
 +      return __ext4_sb_bread_gfp(sb, block, op_flags, gfp);
  }
  
  struct buffer_head *ext4_sb_bread_unmovable(struct super_block *sb,
                                            sector_t block)
  {
 -      return __ext4_sb_bread_gfp(sb, block, 0, 0);
 +      gfp_t gfp = mapping_gfp_constraint(sb->s_bdev->bd_inode->i_mapping,
 +                      ~__GFP_FS);
 +
 +      return __ext4_sb_bread_gfp(sb, block, 0, gfp);
  }
  
  void ext4_sb_breadahead_unmovable(struct super_block *sb, sector_t block)
  {
 -      struct buffer_head *bh = sb_getblk_gfp(sb, block, 0);
 +      struct buffer_head *bh = bdev_getblk(sb->s_bdev, block,
 +                      sb->s_blocksize, GFP_NOWAIT | __GFP_NOWARN);
  
        if (likely(bh)) {
                if (trylock_buffer(bh))
@@@ -775,8 -768,7 +775,8 @@@ static void update_super_work(struct wo
         */
        if (!sb_rdonly(sbi->s_sb) && journal) {
                struct buffer_head *sbh = sbi->s_sbh;
 -              bool call_notify_err;
 +              bool call_notify_err = false;
 +
                handle = jbd2_journal_start(journal, 1);
                if (IS_ERR(handle))
                        goto write_directly;
@@@ -1359,14 -1351,14 +1359,14 @@@ static void ext4_put_super(struct super
  
        sync_blockdev(sb->s_bdev);
        invalidate_bdev(sb->s_bdev);
 -      if (sbi->s_journal_bdev) {
 +      if (sbi->s_journal_bdev_handle) {
                /*
                 * Invalidate the journal device's buffers.  We don't want them
                 * floating about in memory - the physical journal device may
                 * hotswapped, and it breaks the `ro-after' testing code.
                 */
 -              sync_blockdev(sbi->s_journal_bdev);
 -              invalidate_bdev(sbi->s_journal_bdev);
 +              sync_blockdev(sbi->s_journal_bdev_handle->bdev);
 +              invalidate_bdev(sbi->s_journal_bdev_handle->bdev);
        }
  
        ext4_xattr_destroy_cache(sbi->s_ea_inode_cache);
@@@ -1654,6 -1646,7 +1654,7 @@@ static const struct super_operations ex
  };
  
  static const struct export_operations ext4_export_ops = {
+       .encode_fh = generic_encode_ino32_fh,
        .fh_to_dentry = ext4_fh_to_dentry,
        .fh_to_parent = ext4_fh_to_parent,
        .get_parent = ext4_get_parent,
@@@ -4241,7 -4234,7 +4242,7 @@@ int ext4_calculate_overhead(struct supe
         * Add the internal journal blocks whether the journal has been
         * loaded or not
         */
 -      if (sbi->s_journal && !sbi->s_journal_bdev)
 +      if (sbi->s_journal && !sbi->s_journal_bdev_handle)
                overhead += EXT4_NUM_B2C(sbi, sbi->s_journal->j_total_len);
        else if (ext4_has_feature_journal(sb) && !sbi->s_journal && j_inum) {
                /* j_inum for internal journal is non-zero */
@@@ -5678,9 -5671,9 +5679,9 @@@ failed_mount
  #endif
        fscrypt_free_dummy_policy(&sbi->s_dummy_enc_policy);
        brelse(sbi->s_sbh);
 -      if (sbi->s_journal_bdev) {
 -              invalidate_bdev(sbi->s_journal_bdev);
 -              blkdev_put(sbi->s_journal_bdev, sb);
 +      if (sbi->s_journal_bdev_handle) {
 +              invalidate_bdev(sbi->s_journal_bdev_handle->bdev);
 +              bdev_release(sbi->s_journal_bdev_handle);
        }
  out_fail:
        invalidate_bdev(sb->s_bdev);
@@@ -5850,13 -5843,12 +5851,13 @@@ static journal_t *ext4_open_inode_journ
        return journal;
  }
  
 -static struct block_device *ext4_get_journal_blkdev(struct super_block *sb,
 +static struct bdev_handle *ext4_get_journal_blkdev(struct super_block *sb,
                                        dev_t j_dev, ext4_fsblk_t *j_start,
                                        ext4_fsblk_t *j_len)
  {
        struct buffer_head *bh;
        struct block_device *bdev;
 +      struct bdev_handle *bdev_handle;
        int hblock, blocksize;
        ext4_fsblk_t sb_block;
        unsigned long offset;
  
        /* see get_tree_bdev why this is needed and safe */
        up_write(&sb->s_umount);
 -      bdev = blkdev_get_by_dev(j_dev, BLK_OPEN_READ | BLK_OPEN_WRITE, sb,
 -                               &fs_holder_ops);
 +      bdev_handle = bdev_open_by_dev(j_dev, BLK_OPEN_READ | BLK_OPEN_WRITE,
 +                                     sb, &fs_holder_ops);
        down_write(&sb->s_umount);
 -      if (IS_ERR(bdev)) {
 +      if (IS_ERR(bdev_handle)) {
                ext4_msg(sb, KERN_ERR,
                         "failed to open journal device unknown-block(%u,%u) %ld",
 -                       MAJOR(j_dev), MINOR(j_dev), PTR_ERR(bdev));
 -              return ERR_CAST(bdev);
 +                       MAJOR(j_dev), MINOR(j_dev), PTR_ERR(bdev_handle));
 +              return bdev_handle;
        }
  
 +      bdev = bdev_handle->bdev;
        blocksize = sb->s_blocksize;
        hblock = bdev_logical_block_size(bdev);
        if (blocksize < hblock) {
        *j_start = sb_block + 1;
        *j_len = ext4_blocks_count(es);
        brelse(bh);
 -      return bdev;
 +      return bdev_handle;
  
  out_bh:
        brelse(bh);
  out_bdev:
 -      blkdev_put(bdev, sb);
 +      bdev_release(bdev_handle);
        return ERR_PTR(errno);
  }
  
@@@ -5937,14 -5928,14 +5938,14 @@@ static journal_t *ext4_open_dev_journal
        journal_t *journal;
        ext4_fsblk_t j_start;
        ext4_fsblk_t j_len;
 -      struct block_device *journal_bdev;
 +      struct bdev_handle *bdev_handle;
        int errno = 0;
  
 -      journal_bdev = ext4_get_journal_blkdev(sb, j_dev, &j_start, &j_len);
 -      if (IS_ERR(journal_bdev))
 -              return ERR_CAST(journal_bdev);
 +      bdev_handle = ext4_get_journal_blkdev(sb, j_dev, &j_start, &j_len);
 +      if (IS_ERR(bdev_handle))
 +              return ERR_CAST(bdev_handle);
  
 -      journal = jbd2_journal_init_dev(journal_bdev, sb->s_bdev, j_start,
 +      journal = jbd2_journal_init_dev(bdev_handle->bdev, sb->s_bdev, j_start,
                                        j_len, sb->s_blocksize);
        if (IS_ERR(journal)) {
                ext4_msg(sb, KERN_ERR, "failed to create device journal");
                goto out_journal;
        }
        journal->j_private = sb;
 -      EXT4_SB(sb)->s_journal_bdev = journal_bdev;
 +      EXT4_SB(sb)->s_journal_bdev_handle = bdev_handle;
        ext4_init_journal_params(sb, journal);
        return journal;
  
  out_journal:
        jbd2_journal_destroy(journal);
  out_bdev:
 -      blkdev_put(journal_bdev, sb);
 +      bdev_release(bdev_handle);
        return ERR_PTR(errno);
  }
  
@@@ -6452,7 -6443,6 +6453,7 @@@ static int __ext4_remount(struct fs_con
        struct ext4_mount_options old_opts;
        ext4_group_t g;
        int err = 0;
 +      int alloc_ctx;
  #ifdef CONFIG_QUOTA
        int enable_quota = 0;
        int i, j;
  
        }
  
 +      /*
 +       * Changing the DIOREAD_NOLOCK or DELALLOC mount options may cause
 +       * two calls to ext4_should_dioread_nolock() to return inconsistent
 +       * values, triggering WARN_ON in ext4_add_complete_io(). we grab
 +       * here s_writepages_rwsem to avoid race between writepages ops and
 +       * remount.
 +       */
 +      alloc_ctx = ext4_writepages_down_write(sb);
        ext4_apply_options(fc, sb);
 +      ext4_writepages_up_write(sb, alloc_ctx);
  
        if ((old_opts.s_mount_opt & EXT4_MOUNT_JOURNAL_CHECKSUM) ^
            test_opt(sb, JOURNAL_CHECKSUM)) {
@@@ -6720,8 -6701,6 +6721,8 @@@ restore_opts
        if (sb_rdonly(sb) && !(old_sb_flags & SB_RDONLY) &&
            sb_any_quota_suspended(sb))
                dquot_resume(sb, -1);
 +
 +      alloc_ctx = ext4_writepages_down_write(sb);
        sb->s_flags = old_sb_flags;
        sbi->s_mount_opt = old_opts.s_mount_opt;
        sbi->s_mount_opt2 = old_opts.s_mount_opt2;
        sbi->s_commit_interval = old_opts.s_commit_interval;
        sbi->s_min_batch_time = old_opts.s_min_batch_time;
        sbi->s_max_batch_time = old_opts.s_max_batch_time;
 +      ext4_writepages_up_write(sb, alloc_ctx);
 +
        if (!test_opt(sb, BLOCK_VALIDITY) && sbi->s_system_blks)
                ext4_release_system_zone(sb);
  #ifdef CONFIG_QUOTA
@@@ -7151,7 -7128,7 +7152,7 @@@ static int ext4_quota_off(struct super_
        }
        EXT4_I(inode)->i_flags &= ~(EXT4_NOATIME_FL | EXT4_IMMUTABLE_FL);
        inode_set_flags(inode, 0, S_NOATIME | S_IMMUTABLE);
 -      inode->i_mtime = inode_set_ctime_current(inode);
 +      inode_set_mtime_to_ts(inode, inode_set_ctime_current(inode));
        err = ext4_mark_inode_dirty(handle, inode);
        ext4_journal_stop(handle);
  out_unlock:
@@@ -7324,12 -7301,12 +7325,12 @@@ static inline int ext3_feature_set_ok(s
  static void ext4_kill_sb(struct super_block *sb)
  {
        struct ext4_sb_info *sbi = EXT4_SB(sb);
 -      struct block_device *journal_bdev = sbi ? sbi->s_journal_bdev : NULL;
 +      struct bdev_handle *handle = sbi ? sbi->s_journal_bdev_handle : NULL;
  
        kill_block_super(sb);
  
 -      if (journal_bdev)
 -              blkdev_put(journal_bdev, sb);
 +      if (handle)
 +              bdev_release(handle);
  }
  
  static struct file_system_type ext4_fs_type = {
diff --combined fs/f2fs/super.c
index 1ed68158bac5c8935bd01b10e76020f2575e67b9,60cfa11f65bf38e8e34ac48e583fbefc22460071..033af907c3b1dc3059874fc689a32c0f0aaa45b2
@@@ -83,26 -83,11 +83,26 @@@ void f2fs_build_fault_attr(struct f2fs_
  #endif
  
  /* f2fs-wide shrinker description */
 -static struct shrinker f2fs_shrinker_info = {
 -      .scan_objects = f2fs_shrink_scan,
 -      .count_objects = f2fs_shrink_count,
 -      .seeks = DEFAULT_SEEKS,
 -};
 +static struct shrinker *f2fs_shrinker_info;
 +
 +static int __init f2fs_init_shrinker(void)
 +{
 +      f2fs_shrinker_info = shrinker_alloc(0, "f2fs-shrinker");
 +      if (!f2fs_shrinker_info)
 +              return -ENOMEM;
 +
 +      f2fs_shrinker_info->count_objects = f2fs_shrink_count;
 +      f2fs_shrinker_info->scan_objects = f2fs_shrink_scan;
 +
 +      shrinker_register(f2fs_shrinker_info);
 +
 +      return 0;
 +}
 +
 +static void f2fs_exit_shrinker(void)
 +{
 +      shrinker_free(f2fs_shrinker_info);
 +}
  
  enum {
        Opt_gc_background,
@@@ -562,29 -547,6 +562,29 @@@ static int f2fs_set_test_dummy_encrypti
  }
  
  #ifdef CONFIG_F2FS_FS_COMPRESSION
 +static bool is_compress_extension_exist(struct f2fs_sb_info *sbi,
 +                                      const char *new_ext, bool is_ext)
 +{
 +      unsigned char (*ext)[F2FS_EXTENSION_LEN];
 +      int ext_cnt;
 +      int i;
 +
 +      if (is_ext) {
 +              ext = F2FS_OPTION(sbi).extensions;
 +              ext_cnt = F2FS_OPTION(sbi).compress_ext_cnt;
 +      } else {
 +              ext = F2FS_OPTION(sbi).noextensions;
 +              ext_cnt = F2FS_OPTION(sbi).nocompress_ext_cnt;
 +      }
 +
 +      for (i = 0; i < ext_cnt; i++) {
 +              if (!strcasecmp(new_ext, ext[i]))
 +                      return true;
 +      }
 +
 +      return false;
 +}
 +
  /*
   * 1. The same extension name cannot not appear in both compress and non-compress extension
   * at the same time.
@@@ -1187,11 -1149,6 +1187,11 @@@ static int parse_options(struct super_b
                                return -EINVAL;
                        }
  
 +                      if (is_compress_extension_exist(sbi, name, true)) {
 +                              kfree(name);
 +                              break;
 +                      }
 +
                        strcpy(ext[ext_cnt], name);
                        F2FS_OPTION(sbi).compress_ext_cnt++;
                        kfree(name);
                                return -EINVAL;
                        }
  
 +                      if (is_compress_extension_exist(sbi, name, false)) {
 +                              kfree(name);
 +                              break;
 +                      }
 +
                        strcpy(noext[noext_cnt], name);
                        F2FS_OPTION(sbi).nocompress_ext_cnt++;
                        kfree(name);
@@@ -1610,7 -1562,7 +1610,7 @@@ static void destroy_device_list(struct 
  
        for (i = 0; i < sbi->s_ndevs; i++) {
                if (i > 0)
 -                      blkdev_put(FDEV(i).bdev, sbi->sb);
 +                      bdev_release(FDEV(i).bdev_handle);
  #ifdef CONFIG_BLK_DEV_ZONED
                kvfree(FDEV(i).blkz_seq);
  #endif
@@@ -1677,7 -1629,7 +1677,7 @@@ static void f2fs_put_super(struct super
  
        f2fs_wait_on_all_pages(sbi, F2FS_WB_CP_DATA);
  
 -      if (err) {
 +      if (err || f2fs_cp_error(sbi)) {
                truncate_inode_pages_final(NODE_MAPPING(sbi));
                truncate_inode_pages_final(META_MAPPING(sbi));
        }
@@@ -2334,9 -2286,9 +2334,9 @@@ static int f2fs_remount(struct super_bl
        unsigned long old_sb_flags;
        int err;
        bool need_restart_gc = false, need_stop_gc = false;
 -      bool need_restart_ckpt = false, need_stop_ckpt = false;
        bool need_restart_flush = false, need_stop_flush = false;
        bool need_restart_discard = false, need_stop_discard = false;
 +      bool need_enable_checkpoint = false, need_disable_checkpoint = false;
        bool no_read_extent_cache = !test_opt(sbi, READ_EXTENT_CACHE);
        bool no_age_extent_cache = !test_opt(sbi, AGE_EXTENT_CACHE);
        bool enable_checkpoint = !test_opt(sbi, DISABLE_CHECKPOINT);
                clear_sbi_flag(sbi, SBI_IS_CLOSE);
        }
  
 -      if ((*flags & SB_RDONLY) || test_opt(sbi, DISABLE_CHECKPOINT) ||
 -                      !test_opt(sbi, MERGE_CHECKPOINT)) {
 -              f2fs_stop_ckpt_thread(sbi);
 -              need_restart_ckpt = true;
 -      } else {
 -              /* Flush if the prevous checkpoint, if exists. */
 -              f2fs_flush_ckpt_thread(sbi);
 -
 -              err = f2fs_start_ckpt_thread(sbi);
 -              if (err) {
 -                      f2fs_err(sbi,
 -                          "Failed to start F2FS issue_checkpoint_thread (%d)",
 -                          err);
 -                      goto restore_gc;
 -              }
 -              need_stop_ckpt = true;
 -      }
 -
        /*
         * We stop issue flush thread if FS is mounted as RO
         * or if flush_merge is not passed in mount option.
        } else {
                err = f2fs_create_flush_cmd_control(sbi);
                if (err)
 -                      goto restore_ckpt;
 +                      goto restore_gc;
                need_stop_flush = true;
        }
  
                        err = f2fs_disable_checkpoint(sbi);
                        if (err)
                                goto restore_discard;
 +                      need_enable_checkpoint = true;
                } else {
                        f2fs_enable_checkpoint(sbi);
 +                      need_disable_checkpoint = true;
 +              }
 +      }
 +
 +      /*
 +       * Place this routine at the end, since a new checkpoint would be
 +       * triggered while remount and we need to take care of it before
 +       * returning from remount.
 +       */
 +      if ((*flags & SB_RDONLY) || test_opt(sbi, DISABLE_CHECKPOINT) ||
 +                      !test_opt(sbi, MERGE_CHECKPOINT)) {
 +              f2fs_stop_ckpt_thread(sbi);
 +      } else {
 +              /* Flush if the prevous checkpoint, if exists. */
 +              f2fs_flush_ckpt_thread(sbi);
 +
 +              err = f2fs_start_ckpt_thread(sbi);
 +              if (err) {
 +                      f2fs_err(sbi,
 +                          "Failed to start F2FS issue_checkpoint_thread (%d)",
 +                          err);
 +                      goto restore_checkpoint;
                }
        }
  
@@@ -2575,13 -2522,6 +2575,13 @@@ skip
        adjust_unusable_cap_perc(sbi);
        *flags = (*flags & ~SB_LAZYTIME) | (sb->s_flags & SB_LAZYTIME);
        return 0;
 +restore_checkpoint:
 +      if (need_enable_checkpoint) {
 +              f2fs_enable_checkpoint(sbi);
 +      } else if (need_disable_checkpoint) {
 +              if (f2fs_disable_checkpoint(sbi))
 +                      f2fs_warn(sbi, "checkpoint has not been disabled");
 +      }
  restore_discard:
        if (need_restart_discard) {
                if (f2fs_start_discard_thread(sbi))
@@@ -2597,6 -2537,13 +2597,6 @@@ restore_flush
                clear_opt(sbi, FLUSH_MERGE);
                f2fs_destroy_flush_cmd_control(sbi, false);
        }
 -restore_ckpt:
 -      if (need_restart_ckpt) {
 -              if (f2fs_start_ckpt_thread(sbi))
 -                      f2fs_warn(sbi, "background ckpt thread has stopped");
 -      } else if (need_stop_ckpt) {
 -              f2fs_stop_ckpt_thread(sbi);
 -      }
  restore_gc:
        if (need_restart_gc) {
                if (f2fs_start_gc_thread(sbi))
@@@ -2763,7 -2710,7 +2763,7 @@@ retry
  
        if (len == towrite)
                return err;
 -      inode->i_mtime = inode_set_ctime_current(inode);
 +      inode_set_mtime_to_ts(inode, inode_set_ctime_current(inode));
        f2fs_mark_inode_dirty_sync(inode, false);
        return len - towrite;
  }
@@@ -3256,6 -3203,13 +3256,6 @@@ static bool f2fs_has_stable_inodes(stru
        return true;
  }
  
 -static void f2fs_get_ino_and_lblk_bits(struct super_block *sb,
 -                                     int *ino_bits_ret, int *lblk_bits_ret)
 -{
 -      *ino_bits_ret = 8 * sizeof(nid_t);
 -      *lblk_bits_ret = 8 * sizeof(block_t);
 -}
 -
  static struct block_device **f2fs_get_devices(struct super_block *sb,
                                              unsigned int *num_devs)
  {
  }
  
  static const struct fscrypt_operations f2fs_cryptops = {
 -      .key_prefix             = "f2fs:",
 +      .needs_bounce_pages     = 1,
 +      .has_32bit_inodes       = 1,
 +      .supports_subblock_data_units = 1,
 +      .legacy_key_prefix      = "f2fs:",
        .get_context            = f2fs_get_context,
        .set_context            = f2fs_set_context,
        .get_dummy_policy       = f2fs_get_dummy_policy,
        .empty_dir              = f2fs_empty_dir,
        .has_stable_inodes      = f2fs_has_stable_inodes,
 -      .get_ino_and_lblk_bits  = f2fs_get_ino_and_lblk_bits,
        .get_devices            = f2fs_get_devices,
  };
  #endif
@@@ -3330,6 -3282,7 +3330,7 @@@ static struct dentry *f2fs_fh_to_parent
  }
  
  static const struct export_operations f2fs_export_ops = {
+       .encode_fh = generic_encode_ino32_fh,
        .fh_to_dentry = f2fs_fh_to_dentry,
        .fh_to_parent = f2fs_fh_to_parent,
        .get_parent = f2fs_get_parent,
@@@ -3517,7 -3470,7 +3518,7 @@@ static int sanity_check_raw_super(struc
                return -EFSCORRUPTED;
        }
  
 -      /* Currently, support 512/1024/2048/4096 bytes sector size */
 +      /* Currently, support 512/1024/2048/4096/16K bytes sector size */
        if (le32_to_cpu(raw_super->log_sectorsize) >
                                F2FS_MAX_LOG_SECTOR_SIZE ||
                le32_to_cpu(raw_super->log_sectorsize) <
@@@ -4246,7 -4199,7 +4247,7 @@@ static int f2fs_scan_devices(struct f2f
  
        for (i = 0; i < max_devices; i++) {
                if (i == 0)
 -                      FDEV(0).bdev = sbi->sb->s_bdev;
 +                      FDEV(0).bdev_handle = sbi->sb->s_bdev_handle;
                else if (!RDEV(i).path[0])
                        break;
  
                                FDEV(i).end_blk = FDEV(i).start_blk +
                                        (FDEV(i).total_segments <<
                                        sbi->log_blocks_per_seg) - 1;
 -                              FDEV(i).bdev = blkdev_get_by_path(FDEV(i).path,
 -                                      mode, sbi->sb, NULL);
 +                              FDEV(i).bdev_handle = bdev_open_by_path(
 +                                      FDEV(i).path, mode, sbi->sb, NULL);
                        }
                }
 -              if (IS_ERR(FDEV(i).bdev))
 -                      return PTR_ERR(FDEV(i).bdev);
 +              if (IS_ERR(FDEV(i).bdev_handle))
 +                      return PTR_ERR(FDEV(i).bdev_handle);
  
 +              FDEV(i).bdev = FDEV(i).bdev_handle->bdev;
                /* to release errored devices */
                sbi->s_ndevs = i + 1;
  
@@@ -4964,7 -4916,7 +4965,7 @@@ static int __init init_f2fs_fs(void
        int err;
  
        if (PAGE_SIZE != F2FS_BLKSIZE) {
 -              printk("F2FS not supported on PAGE_SIZE(%lu) != %d\n",
 +              printk("F2FS not supported on PAGE_SIZE(%lu) != BLOCK_SIZE(%lu)\n",
                                PAGE_SIZE, F2FS_BLKSIZE);
                return -EINVAL;
        }
        err = f2fs_init_sysfs();
        if (err)
                goto free_garbage_collection_cache;
 -      err = register_shrinker(&f2fs_shrinker_info, "f2fs-shrinker");
 +      err = f2fs_init_shrinker();
        if (err)
                goto free_sysfs;
        err = register_filesystem(&f2fs_fs_type);
@@@ -5038,7 -4990,7 +5039,7 @@@ free_root_stats
        f2fs_destroy_root_stats();
        unregister_filesystem(&f2fs_fs_type);
  free_shrinker:
 -      unregister_shrinker(&f2fs_shrinker_info);
 +      f2fs_exit_shrinker();
  free_sysfs:
        f2fs_exit_sysfs();
  free_garbage_collection_cache:
@@@ -5070,7 -5022,7 +5071,7 @@@ static void __exit exit_f2fs_fs(void
        f2fs_destroy_post_read_processing();
        f2fs_destroy_root_stats();
        unregister_filesystem(&f2fs_fs_type);
 -      unregister_shrinker(&f2fs_shrinker_info);
 +      f2fs_exit_shrinker();
        f2fs_exit_sysfs();
        f2fs_destroy_garbage_collection_cache();
        f2fs_destroy_extent_cache();
diff --combined fs/fuse/inode.c
index caa8121ad99c71fbc07a7a27e27de688c7df3561,e63f966698a5acb35d8cb67caaecae5f4bc83ce0..74d4f09d5827e8af92aef881eb8060fa69e4afca
@@@ -188,10 -188,12 +188,10 @@@ void fuse_change_attributes_common(stru
        attr->mtimensec = min_t(u32, attr->mtimensec, NSEC_PER_SEC - 1);
        attr->ctimensec = min_t(u32, attr->ctimensec, NSEC_PER_SEC - 1);
  
 -      inode->i_atime.tv_sec   = attr->atime;
 -      inode->i_atime.tv_nsec  = attr->atimensec;
 +      inode_set_atime(inode, attr->atime, attr->atimensec);
        /* mtime from server may be stale due to local buffered write */
        if (!(cache_mask & STATX_MTIME)) {
 -              inode->i_mtime.tv_sec   = attr->mtime;
 -              inode->i_mtime.tv_nsec  = attr->mtimensec;
 +              inode_set_mtime(inode, attr->mtime, attr->mtimensec);
        }
        if (!(cache_mask & STATX_CTIME)) {
                inode_set_ctime(inode, attr->ctime, attr->ctimensec);
@@@ -274,12 -276,12 +274,12 @@@ void fuse_change_attributes(struct inod
                attr->size = i_size_read(inode);
  
        if (cache_mask & STATX_MTIME) {
 -              attr->mtime = inode->i_mtime.tv_sec;
 -              attr->mtimensec = inode->i_mtime.tv_nsec;
 +              attr->mtime = inode_get_mtime_sec(inode);
 +              attr->mtimensec = inode_get_mtime_nsec(inode);
        }
        if (cache_mask & STATX_CTIME) {
 -              attr->ctime = inode_get_ctime(inode).tv_sec;
 -              attr->ctimensec = inode_get_ctime(inode).tv_nsec;
 +              attr->ctime = inode_get_ctime_sec(inode);
 +              attr->ctimensec = inode_get_ctime_nsec(inode);
        }
  
        if ((attr_version != 0 && fi->attr_version > attr_version) ||
                return;
        }
  
 -      old_mtime = inode->i_mtime;
 +      old_mtime = inode_get_mtime(inode);
        fuse_change_attributes_common(inode, attr, sx, attr_valid, cache_mask);
  
        oldsize = inode->i_size;
@@@ -335,7 -337,8 +335,7 @@@ static void fuse_init_inode(struct inod
  {
        inode->i_mode = attr->mode & S_IFMT;
        inode->i_size = attr->size;
 -      inode->i_mtime.tv_sec  = attr->mtime;
 -      inode->i_mtime.tv_nsec = attr->mtimensec;
 +      inode_set_mtime(inode, attr->mtime, attr->mtimensec);
        inode_set_ctime(inode, attr->ctime, attr->ctimensec);
        if (S_ISREG(inode->i_mode)) {
                fuse_init_common(inode);
@@@ -999,7 -1002,7 +999,7 @@@ static int fuse_encode_fh(struct inode 
        }
  
        *max_len = len;
-       return parent ? 0x82 : 0x81;
+       return parent ? FILEID_INO64_GEN_PARENT : FILEID_INO64_GEN;
  }
  
  static struct dentry *fuse_fh_to_dentry(struct super_block *sb,
  {
        struct fuse_inode_handle handle;
  
-       if ((fh_type != 0x81 && fh_type != 0x82) || fh_len < 3)
+       if ((fh_type != FILEID_INO64_GEN &&
+            fh_type != FILEID_INO64_GEN_PARENT) || fh_len < 3)
                return NULL;
  
        handle.nodeid = (u64) fid->raw[0] << 32;
@@@ -1021,7 -1025,7 +1022,7 @@@ static struct dentry *fuse_fh_to_parent
  {
        struct fuse_inode_handle parent;
  
-       if (fh_type != 0x82 || fh_len < 6)
+       if (fh_type != FILEID_INO64_GEN_PARENT || fh_len < 6)
                return NULL;
  
        parent.nodeid = (u64) fid->raw[3] << 32;
@@@ -1420,19 -1424,17 +1421,19 @@@ EXPORT_SYMBOL_GPL(fuse_dev_free)
  static void fuse_fill_attr_from_inode(struct fuse_attr *attr,
                                      const struct fuse_inode *fi)
  {
 +      struct timespec64 atime = inode_get_atime(&fi->inode);
 +      struct timespec64 mtime = inode_get_mtime(&fi->inode);
        struct timespec64 ctime = inode_get_ctime(&fi->inode);
  
        *attr = (struct fuse_attr){
                .ino            = fi->inode.i_ino,
                .size           = fi->inode.i_size,
                .blocks         = fi->inode.i_blocks,
 -              .atime          = fi->inode.i_atime.tv_sec,
 -              .mtime          = fi->inode.i_mtime.tv_sec,
 +              .atime          = atime.tv_sec,
 +              .mtime          = mtime.tv_sec,
                .ctime          = ctime.tv_sec,
 -              .atimensec      = fi->inode.i_atime.tv_nsec,
 -              .mtimensec      = fi->inode.i_mtime.tv_nsec,
 +              .atimensec      = atime.tv_nsec,
 +              .mtimensec      = mtime.tv_nsec,
                .ctimensec      = ctime.tv_nsec,
                .mode           = fi->inode.i_mode,
                .nlink          = fi->inode.i_nlink,
diff --combined fs/hugetlbfs/inode.c
index 54b3d489b6a7a52f7f876632dff55da6c5fc89c8,c003a27be6fe55d318940d1e24218b5dce2e029f..f757d4f7ad98a48542cb197fe8292ff91c868cd3
@@@ -83,6 -83,29 +83,6 @@@ static const struct fs_parameter_spec h
        {}
  };
  
 -#ifdef CONFIG_NUMA
 -static inline void hugetlb_set_vma_policy(struct vm_area_struct *vma,
 -                                      struct inode *inode, pgoff_t index)
 -{
 -      vma->vm_policy = mpol_shared_policy_lookup(&HUGETLBFS_I(inode)->policy,
 -                                                      index);
 -}
 -
 -static inline void hugetlb_drop_vma_policy(struct vm_area_struct *vma)
 -{
 -      mpol_cond_put(vma->vm_policy);
 -}
 -#else
 -static inline void hugetlb_set_vma_policy(struct vm_area_struct *vma,
 -                                      struct inode *inode, pgoff_t index)
 -{
 -}
 -
 -static inline void hugetlb_drop_vma_policy(struct vm_area_struct *vma)
 -{
 -}
 -#endif
 -
  /*
   * Mask used when checking the page offset value passed in via system
   * calls.  This value will be converted to a loff_t which is signed.
@@@ -112,7 -135,7 +112,7 @@@ static int hugetlbfs_file_mmap(struct f
        vm_flags_set(vma, VM_HUGETLB | VM_DONTEXPAND);
        vma->vm_ops = &hugetlb_vm_ops;
  
 -      ret = seal_check_future_write(info->seals, vma);
 +      ret = seal_check_write(info->seals, vma);
        if (ret)
                return ret;
  
@@@ -272,7 -295,7 +272,7 @@@ static size_t adjust_range_hwpoison(str
        size_t res = 0;
  
        /* First subpage to start the loop. */
 -      page += offset / PAGE_SIZE;
 +      page = nth_page(page, offset / PAGE_SIZE);
        offset %= PAGE_SIZE;
        while (1) {
                if (is_raw_hwpoison_page_in_hugepage(page))
                        break;
                offset += n;
                if (offset == PAGE_SIZE) {
 -                      page++;
 +                      page = nth_page(page, 1);
                        offset = 0;
                }
        }
@@@ -311,7 -334,7 +311,7 @@@ static ssize_t hugetlbfs_read_iter(stru
        ssize_t retval = 0;
  
        while (iov_iter_count(to)) {
 -              struct page *page;
 +              struct folio *folio;
                size_t nr, copied, want;
  
                /* nr is the maximum number of bytes to copy from this page */
                }
                nr = nr - offset;
  
 -              /* Find the page */
 -              page = find_lock_page(mapping, index);
 -              if (unlikely(page == NULL)) {
 +              /* Find the folio */
 +              folio = filemap_lock_hugetlb_folio(h, mapping, index);
 +              if (IS_ERR(folio)) {
                        /*
                         * We have a HOLE, zero out the user-buffer for the
                         * length of the hole or request.
                         */
                        copied = iov_iter_zero(nr, to);
                } else {
 -                      unlock_page(page);
 +                      folio_unlock(folio);
  
 -                      if (!PageHWPoison(page))
 +                      if (!folio_test_has_hwpoisoned(folio))
                                want = nr;
                        else {
                                /*
                                 * touching the 1st raw HWPOISON subpage after
                                 * offset.
                                 */
 -                              want = adjust_range_hwpoison(page, offset, nr);
 +                              want = adjust_range_hwpoison(&folio->page, offset, nr);
                                if (want == 0) {
 -                                      put_page(page);
 +                                      folio_put(folio);
                                        retval = -EIO;
                                        break;
                                }
                        }
  
                        /*
 -                       * We have the page, copy it to user space buffer.
 +                       * We have the folio, copy it to user space buffer.
                         */
 -                      copied = copy_page_to_iter(page, offset, want, to);
 -                      put_page(page);
 +                      copied = copy_folio_to_iter(folio, offset, want, to);
 +                      folio_put(folio);
                }
                offset += copied;
                retval += copied;
@@@ -638,20 -661,21 +638,20 @@@ static void remove_inode_hugepages(stru
  {
        struct hstate *h = hstate_inode(inode);
        struct address_space *mapping = &inode->i_data;
 -      const pgoff_t start = lstart >> huge_page_shift(h);
 -      const pgoff_t end = lend >> huge_page_shift(h);
 +      const pgoff_t end = lend >> PAGE_SHIFT;
        struct folio_batch fbatch;
        pgoff_t next, index;
        int i, freed = 0;
        bool truncate_op = (lend == LLONG_MAX);
  
        folio_batch_init(&fbatch);
 -      next = start;
 +      next = lstart >> PAGE_SHIFT;
        while (filemap_get_folios(mapping, &next, end - 1, &fbatch)) {
                for (i = 0; i < folio_batch_count(&fbatch); ++i) {
                        struct folio *folio = fbatch.folios[i];
                        u32 hash = 0;
  
 -                      index = folio->index;
 +                      index = folio->index >> huge_page_order(h);
                        hash = hugetlb_fault_mutex_hash(mapping, index);
                        mutex_lock(&hugetlb_fault_mutex_table[hash]);
  
        }
  
        if (truncate_op)
 -              (void)hugetlb_unreserve_pages(inode, start, LONG_MAX, freed);
 +              (void)hugetlb_unreserve_pages(inode,
 +                              lstart >> huge_page_shift(h),
 +                              LONG_MAX, freed);
  }
  
  static void hugetlbfs_evict_inode(struct inode *inode)
@@@ -719,7 -741,7 +719,7 @@@ static void hugetlbfs_zero_partial_page
        pgoff_t idx = start >> huge_page_shift(h);
        struct folio *folio;
  
 -      folio = filemap_lock_folio(mapping, idx);
 +      folio = filemap_lock_hugetlb_folio(h, mapping, idx);
        if (IS_ERR(folio))
                return;
  
@@@ -830,7 -852,8 +830,7 @@@ static long hugetlbfs_fallocate(struct 
  
        /*
         * Initialize a pseudo vma as this is required by the huge page
 -       * allocation routines.  If NUMA is configured, use page index
 -       * as input to create an allocation policy.
 +       * allocation routines.
         */
        vma_init(&pseudo_vma, mm);
        vm_flags_init(&pseudo_vma, VM_HUGETLB | VM_MAYSHARE | VM_SHARED);
                mutex_lock(&hugetlb_fault_mutex_table[hash]);
  
                /* See if already present in mapping to avoid alloc/free */
 -              folio = filemap_get_folio(mapping, index);
 +              folio = filemap_get_folio(mapping, index << huge_page_order(h));
                if (!IS_ERR(folio)) {
                        folio_put(folio);
                        mutex_unlock(&hugetlb_fault_mutex_table[hash]);
                 * folios in these areas, we need to consume the reserves
                 * to keep reservation accounting consistent.
                 */
 -              hugetlb_set_vma_policy(&pseudo_vma, inode, index);
                folio = alloc_hugetlb_folio(&pseudo_vma, addr, 0);
 -              hugetlb_drop_vma_policy(&pseudo_vma);
                if (IS_ERR(folio)) {
                        mutex_unlock(&hugetlb_fault_mutex_table[hash]);
                        error = PTR_ERR(folio);
@@@ -955,7 -980,7 +955,7 @@@ static struct inode *hugetlbfs_get_root
                inode->i_mode = S_IFDIR | ctx->mode;
                inode->i_uid = ctx->uid;
                inode->i_gid = ctx->gid;
 -              inode->i_atime = inode->i_mtime = inode_set_ctime_current(inode);
 +              simple_inode_init_ts(inode);
                inode->i_op = &hugetlbfs_dir_inode_operations;
                inode->i_fop = &simple_dir_operations;
                /* directory inodes start off with i_nlink == 2 (for "." entry) */
@@@ -999,7 -1024,7 +999,7 @@@ static struct inode *hugetlbfs_get_inod
                lockdep_set_class(&inode->i_mapping->i_mmap_rwsem,
                                &hugetlbfs_i_mmap_rwsem_key);
                inode->i_mapping->a_ops = &hugetlbfs_aops;
 -              inode->i_atime = inode->i_mtime = inode_set_ctime_current(inode);
 +              simple_inode_init_ts(inode);
                inode->i_mapping->private_data = resv_map;
                info->seals = F_SEAL_SEAL;
                switch (mode & S_IFMT) {
@@@ -1042,7 -1067,7 +1042,7 @@@ static int hugetlbfs_mknod(struct mnt_i
        inode = hugetlbfs_get_inode(dir->i_sb, dir, mode, dev);
        if (!inode)
                return -ENOSPC;
 -      dir->i_mtime = inode_set_ctime_current(dir);
 +      inode_set_mtime_to_ts(dir, inode_set_ctime_current(dir));
        d_instantiate(dentry, inode);
        dget(dentry);/* Extra count - pin the dentry in core */
        return 0;
@@@ -1074,7 -1099,7 +1074,7 @@@ static int hugetlbfs_tmpfile(struct mnt
        inode = hugetlbfs_get_inode(dir->i_sb, dir, mode | S_IFREG, 0);
        if (!inode)
                return -ENOSPC;
 -      dir->i_mtime = inode_set_ctime_current(dir);
 +      inode_set_mtime_to_ts(dir, inode_set_ctime_current(dir));
        d_tmpfile(file, inode);
        return finish_open_simple(file, 0);
  }
@@@ -1096,7 -1121,7 +1096,7 @@@ static int hugetlbfs_symlink(struct mnt
                } else
                        iput(inode);
        }
 -      dir->i_mtime = inode_set_ctime_current(dir);
 +      inode_set_mtime_to_ts(dir, inode_set_ctime_current(dir));
  
        return error;
  }
@@@ -1179,7 -1204,9 +1179,9 @@@ static int hugetlbfs_statfs(struct dent
  {
        struct hugetlbfs_sb_info *sbinfo = HUGETLBFS_SB(dentry->d_sb);
        struct hstate *h = hstate_inode(d_inode(dentry));
+       u64 id = huge_encode_dev(dentry->d_sb->s_dev);
  
+       buf->f_fsid = u64_to_fsid(id);
        buf->f_type = HUGETLBFS_MAGIC;
        buf->f_bsize = huge_page_size(h);
        if (sbinfo) {
@@@ -1257,6 -1284,18 +1259,6 @@@ static struct inode *hugetlbfs_alloc_in
                hugetlbfs_inc_free_inodes(sbinfo);
                return NULL;
        }
 -
 -      /*
 -       * Any time after allocation, hugetlbfs_destroy_inode can be called
 -       * for the inode.  mpol_free_shared_policy is unconditionally called
 -       * as part of hugetlbfs_destroy_inode.  So, initialize policy here
 -       * in case of a quick call to destroy.
 -       *
 -       * Note that the policy is initialized even if we are creating a
 -       * private inode.  This simplifies hugetlbfs_destroy_inode.
 -       */
 -      mpol_shared_policy_init(&p->policy, NULL);
 -
        return &p->vfs_inode;
  }
  
@@@ -1268,6 -1307,7 +1270,6 @@@ static void hugetlbfs_free_inode(struc
  static void hugetlbfs_destroy_inode(struct inode *inode)
  {
        hugetlbfs_inc_free_inodes(HUGETLBFS_SB(inode->i_sb));
 -      mpol_free_shared_policy(&HUGETLBFS_I(inode)->policy);
  }
  
  static const struct address_space_operations hugetlbfs_aops = {
diff --combined fs/jfs/super.c
index 966826c394ee4be419baccb4871a770e2d9e2248,2cc2632f3c4792fc5824cfbd8bfea5a13a64e203..8d8e556bd6104eca1ec55d7ea4da3bcfec0c967f
@@@ -818,7 -818,7 +818,7 @@@ out
        }
        if (inode->i_size < off+len-towrite)
                i_size_write(inode, off+len-towrite);
 -      inode->i_mtime = inode_set_ctime_current(inode);
 +      inode_set_mtime_to_ts(inode, inode_set_ctime_current(inode));
        mark_inode_dirty(inode);
        inode_unlock(inode);
        return len - towrite;
@@@ -896,6 -896,7 +896,7 @@@ static const struct super_operations jf
  };
  
  static const struct export_operations jfs_export_operations = {
+       .encode_fh      = generic_encode_ino32_fh,
        .fh_to_dentry   = jfs_fh_to_dentry,
        .fh_to_parent   = jfs_fh_to_parent,
        .get_parent     = jfs_get_parent,
diff --combined fs/libfs.c
index abe2b5a40ba1b69ab4a8ad65b76c907a28fdb693,38950cce135b72791d1bb099a382354b025240e8..e9440d55073c50962486f3f4f047a7872544fcff
@@@ -41,6 -41,9 +41,9 @@@ EXPORT_SYMBOL(simple_getattr)
  
  int simple_statfs(struct dentry *dentry, struct kstatfs *buf)
  {
+       u64 id = huge_encode_dev(dentry->d_sb->s_dev);
+       buf->f_fsid = u64_to_fsid(id);
        buf->f_type = dentry->d_sb->s_magic;
        buf->f_bsize = PAGE_SIZE;
        buf->f_namelen = NAME_MAX;
@@@ -541,8 -544,7 +544,8 @@@ void simple_recursive_removal(struct de
                                dput(victim);           // unpin it
                        }
                        if (victim == dentry) {
 -                              inode->i_mtime = inode_set_ctime_current(inode);
 +                              inode_set_mtime_to_ts(inode,
 +                                                    inode_set_ctime_current(inode));
                                if (d_is_dir(dentry))
                                        drop_nlink(inode);
                                inode_unlock(inode);
@@@ -583,7 -585,7 +586,7 @@@ static int pseudo_fs_fill_super(struct 
         */
        root->i_ino = 1;
        root->i_mode = S_IFDIR | S_IRUSR | S_IWUSR;
 -      root->i_atime = root->i_mtime = inode_set_ctime_current(root);
 +      simple_inode_init_ts(root);
        s->s_root = d_make_root(root);
        if (!s->s_root)
                return -ENOMEM;
@@@ -639,8 -641,8 +642,8 @@@ int simple_link(struct dentry *old_dent
  {
        struct inode *inode = d_inode(old_dentry);
  
 -      dir->i_mtime = inode_set_ctime_to_ts(dir,
 -                                           inode_set_ctime_current(inode));
 +      inode_set_mtime_to_ts(dir,
 +                            inode_set_ctime_to_ts(dir, inode_set_ctime_current(inode)));
        inc_nlink(inode);
        ihold(inode);
        dget(dentry);
@@@ -674,8 -676,8 +677,8 @@@ int simple_unlink(struct inode *dir, st
  {
        struct inode *inode = d_inode(dentry);
  
 -      dir->i_mtime = inode_set_ctime_to_ts(dir,
 -                                           inode_set_ctime_current(inode));
 +      inode_set_mtime_to_ts(dir,
 +                            inode_set_ctime_to_ts(dir, inode_set_ctime_current(inode)));
        drop_nlink(inode);
        dput(dentry);
        return 0;
@@@ -710,10 -712,9 +713,10 @@@ void simple_rename_timestamp(struct ino
  {
        struct inode *newino = d_inode(new_dentry);
  
 -      old_dir->i_mtime = inode_set_ctime_current(old_dir);
 +      inode_set_mtime_to_ts(old_dir, inode_set_ctime_current(old_dir));
        if (new_dir != old_dir)
 -              new_dir->i_mtime = inode_set_ctime_current(new_dir);
 +              inode_set_mtime_to_ts(new_dir,
 +                                    inode_set_ctime_current(new_dir));
        inode_set_ctime_current(d_inode(old_dentry));
        if (newino)
                inode_set_ctime_current(newino);
@@@ -928,7 -929,7 +931,7 @@@ int simple_fill_super(struct super_bloc
         */
        inode->i_ino = 1;
        inode->i_mode = S_IFDIR | 0755;
 -      inode->i_atime = inode->i_mtime = inode_set_ctime_current(inode);
 +      simple_inode_init_ts(inode);
        inode->i_op = &simple_dir_inode_operations;
        inode->i_fop = &simple_dir_operations;
        set_nlink(inode, 2);
                        goto out;
                }
                inode->i_mode = S_IFREG | files->mode;
 -              inode->i_atime = inode->i_mtime = inode_set_ctime_current(inode);
 +              simple_inode_init_ts(inode);
                inode->i_fop = files->ops;
                inode->i_ino = i;
                d_add(dentry, inode);
@@@ -1309,6 -1310,47 +1312,47 @@@ ssize_t simple_attr_write_signed(struc
  }
  EXPORT_SYMBOL_GPL(simple_attr_write_signed);
  
+ /**
+  * generic_encode_ino32_fh - generic export_operations->encode_fh function
+  * @inode:   the object to encode
+  * @fh:      where to store the file handle fragment
+  * @max_len: maximum length to store there (in 4 byte units)
+  * @parent:  parent directory inode, if wanted
+  *
+  * This generic encode_fh function assumes that the 32 inode number
+  * is suitable for locating an inode, and that the generation number
+  * can be used to check that it is still valid.  It places them in the
+  * filehandle fragment where export_decode_fh expects to find them.
+  */
+ int generic_encode_ino32_fh(struct inode *inode, __u32 *fh, int *max_len,
+                           struct inode *parent)
+ {
+       struct fid *fid = (void *)fh;
+       int len = *max_len;
+       int type = FILEID_INO32_GEN;
+       if (parent && (len < 4)) {
+               *max_len = 4;
+               return FILEID_INVALID;
+       } else if (len < 2) {
+               *max_len = 2;
+               return FILEID_INVALID;
+       }
+       len = 2;
+       fid->i32.ino = inode->i_ino;
+       fid->i32.gen = inode->i_generation;
+       if (parent) {
+               fid->i32.parent_ino = parent->i_ino;
+               fid->i32.parent_gen = parent->i_generation;
+               len = 4;
+               type = FILEID_INO32_GEN_PARENT;
+       }
+       *max_len = len;
+       return type;
+ }
+ EXPORT_SYMBOL_GPL(generic_encode_ino32_fh);
  /**
   * generic_fh_to_dentry - generic helper for the fh_to_dentry export operation
   * @sb:               filesystem to do the file handle conversion on
@@@ -1522,7 -1564,7 +1566,7 @@@ struct inode *alloc_anon_inode(struct s
        inode->i_uid = current_fsuid();
        inode->i_gid = current_fsgid();
        inode->i_flags |= S_PRIVATE;
 -      inode->i_atime = inode->i_mtime = inode_set_ctime_current(inode);
 +      simple_inode_init_ts(inode);
        return inode;
  }
  EXPORT_SYMBOL(alloc_anon_inode);
@@@ -1914,20 -1956,3 +1958,20 @@@ ssize_t direct_write_fallback(struct ki
        return direct_written + buffered_written;
  }
  EXPORT_SYMBOL_GPL(direct_write_fallback);
 +
 +/**
 + * simple_inode_init_ts - initialize the timestamps for a new inode
 + * @inode: inode to be initialized
 + *
 + * When a new inode is created, most filesystems set the timestamps to the
 + * current time. Add a helper to do this.
 + */
 +struct timespec64 simple_inode_init_ts(struct inode *inode)
 +{
 +      struct timespec64 ts = inode_set_ctime_current(inode);
 +
 +      inode_set_atime_to_ts(inode, ts);
 +      inode_set_mtime_to_ts(inode, ts);
 +      return ts;
 +}
 +EXPORT_SYMBOL(simple_inode_init_ts);
diff --combined fs/nfsd/export.c
index b7da17e530077e7c4cd0f530d17db53046ceff0a,dc99dfc1d41157b84e28a58f784aa806228bb6f1..7b641095a665fde11850eb670831ce89ceead18c
@@@ -339,16 -339,12 +339,16 @@@ static int export_stats_init(struct exp
  
  static void export_stats_reset(struct export_stats *stats)
  {
 -      nfsd_percpu_counters_reset(stats->counter, EXP_STATS_COUNTERS_NUM);
 +      if (stats)
 +              nfsd_percpu_counters_reset(stats->counter,
 +                                         EXP_STATS_COUNTERS_NUM);
  }
  
  static void export_stats_destroy(struct export_stats *stats)
  {
 -      nfsd_percpu_counters_destroy(stats->counter, EXP_STATS_COUNTERS_NUM);
 +      if (stats)
 +              nfsd_percpu_counters_destroy(stats->counter,
 +                                           EXP_STATS_COUNTERS_NUM);
  }
  
  static void svc_export_put(struct kref *ref)
        path_put(&exp->ex_path);
        auth_domain_put(exp->ex_client);
        nfsd4_fslocs_free(&exp->ex_fslocs);
 -      export_stats_destroy(&exp->ex_stats);
 +      export_stats_destroy(exp->ex_stats);
 +      kfree(exp->ex_stats);
        kfree(exp->ex_uuid);
        kfree_rcu(exp, ex_rcu);
  }
@@@ -426,8 -421,7 +426,7 @@@ static int check_export(struct path *pa
                return -EINVAL;
        }
  
-       if (!inode->i_sb->s_export_op ||
-           !inode->i_sb->s_export_op->fh_to_dentry) {
+       if (!exportfs_can_decode_fh(inode->i_sb->s_export_op)) {
                dprintk("exp_export: export of invalid fs type.\n");
                return -EINVAL;
        }
@@@ -772,15 -766,13 +771,15 @@@ static int svc_export_show(struct seq_f
        seq_putc(m, '\t');
        seq_escape(m, exp->ex_client->name, " \t\n\\");
        if (export_stats) {
 -              seq_printf(m, "\t%lld\n", exp->ex_stats.start_time);
 +              struct percpu_counter *counter = exp->ex_stats->counter;
 +
 +              seq_printf(m, "\t%lld\n", exp->ex_stats->start_time);
                seq_printf(m, "\tfh_stale: %lld\n",
 -                         percpu_counter_sum_positive(&exp->ex_stats.counter[EXP_STATS_FH_STALE]));
 +                         percpu_counter_sum_positive(&counter[EXP_STATS_FH_STALE]));
                seq_printf(m, "\tio_read: %lld\n",
 -                         percpu_counter_sum_positive(&exp->ex_stats.counter[EXP_STATS_IO_READ]));
 +                         percpu_counter_sum_positive(&counter[EXP_STATS_IO_READ]));
                seq_printf(m, "\tio_write: %lld\n",
 -                         percpu_counter_sum_positive(&exp->ex_stats.counter[EXP_STATS_IO_WRITE]));
 +                         percpu_counter_sum_positive(&counter[EXP_STATS_IO_WRITE]));
                seq_putc(m, '\n');
                return 0;
        }
@@@ -826,7 -818,7 +825,7 @@@ static void svc_export_init(struct cach
        new->ex_layout_types = 0;
        new->ex_uuid = NULL;
        new->cd = item->cd;
 -      export_stats_reset(&new->ex_stats);
 +      export_stats_reset(new->ex_stats);
  }
  
  static void export_update(struct cache_head *cnew, struct cache_head *citem)
@@@ -863,14 -855,7 +862,14 @@@ static struct cache_head *svc_export_al
        if (!i)
                return NULL;
  
 -      if (export_stats_init(&i->ex_stats)) {
 +      i->ex_stats = kmalloc(sizeof(*(i->ex_stats)), GFP_KERNEL);
 +      if (!i->ex_stats) {
 +              kfree(i);
 +              return NULL;
 +      }
 +
 +      if (export_stats_init(i->ex_stats)) {
 +              kfree(i->ex_stats);
                kfree(i);
                return NULL;
        }
index 45aecdc302f4d9a41fee3cc364a553f2aeb59a3f,0eb9622e8a9f66067d33892d28f2e9b8fb0fc011..4d765c72496f0a59bbf06dd44e455ce84433907d
@@@ -112,10 -112,10 +112,10 @@@ static void __init fanotify_sysctls_ini
  
  extern const struct fsnotify_ops fanotify_fsnotify_ops;
  
 -struct kmem_cache *fanotify_mark_cache __read_mostly;
 -struct kmem_cache *fanotify_fid_event_cachep __read_mostly;
 -struct kmem_cache *fanotify_path_event_cachep __read_mostly;
 -struct kmem_cache *fanotify_perm_event_cachep __read_mostly;
 +struct kmem_cache *fanotify_mark_cache __ro_after_init;
 +struct kmem_cache *fanotify_fid_event_cachep __ro_after_init;
 +struct kmem_cache *fanotify_path_event_cachep __ro_after_init;
 +struct kmem_cache *fanotify_perm_event_cachep __ro_after_init;
  
  #define FANOTIFY_EVENT_ALIGN 4
  #define FANOTIFY_FID_INFO_HDR_LEN \
@@@ -1595,7 -1595,7 +1595,7 @@@ static int fanotify_test_fid(struct den
         * file handles so user can use name_to_handle_at() to compare fids
         * reported with events to the file handle of watched objects.
         */
-       if (!nop)
+       if (!exportfs_can_encode_fid(nop))
                return -EOPNOTSUPP;
  
        /*
         * supports decoding file handles, so user has a way to map back the
         * reported fids to filesystem objects.
         */
-       if (mark_type != FAN_MARK_INODE && !nop->fh_to_dentry)
+       if (mark_type != FAN_MARK_INODE && !exportfs_can_decode_fh(nop))
                return -EOPNOTSUPP;
  
        return 0;
diff --combined fs/overlayfs/util.c
index 73ac47b49218dbaab3c2125d1e3b48c8a01c204e,f0a712214ec22762b447c72fffb0ff4d076faf5d..50a201e9cd398aab74a61634f26e51a7f6b47893
  #include <linux/ratelimit.h>
  #include "overlayfs.h"
  
 +/* Get write access to upper mnt - may fail if upper sb was remounted ro */
 +int ovl_get_write_access(struct dentry *dentry)
 +{
 +      struct ovl_fs *ofs = OVL_FS(dentry->d_sb);
 +      return mnt_get_write_access(ovl_upper_mnt(ofs));
 +}
 +
 +/* Get write access to upper sb - may block if upper sb is frozen */
 +void ovl_start_write(struct dentry *dentry)
 +{
 +      struct ovl_fs *ofs = OVL_FS(dentry->d_sb);
 +      sb_start_write(ovl_upper_mnt(ofs)->mnt_sb);
 +}
 +
  int ovl_want_write(struct dentry *dentry)
  {
        struct ovl_fs *ofs = OVL_FS(dentry->d_sb);
        return mnt_want_write(ovl_upper_mnt(ofs));
  }
  
 +void ovl_put_write_access(struct dentry *dentry)
 +{
 +      struct ovl_fs *ofs = OVL_FS(dentry->d_sb);
 +      mnt_put_write_access(ovl_upper_mnt(ofs));
 +}
 +
 +void ovl_end_write(struct dentry *dentry)
 +{
 +      struct ovl_fs *ofs = OVL_FS(dentry->d_sb);
 +      sb_end_write(ovl_upper_mnt(ofs)->mnt_sb);
 +}
 +
  void ovl_drop_write(struct dentry *dentry)
  {
        struct ovl_fs *ofs = OVL_FS(dentry->d_sb);
@@@ -81,7 -55,7 +81,7 @@@ int ovl_can_decode_fh(struct super_bloc
        if (!capable(CAP_DAC_READ_SEARCH))
                return 0;
  
-       if (!sb->s_export_op || !sb->s_export_op->fh_to_dentry)
+       if (!exportfs_can_decode_fh(sb->s_export_op))
                return 0;
  
        return sb->s_export_op->encode_fh ? -1 : FILEID_INO32_GEN;
@@@ -601,16 -575,6 +601,16 @@@ bool ovl_is_whiteout(struct dentry *den
        return inode && IS_WHITEOUT(inode);
  }
  
 +/*
 + * Use this over ovl_is_whiteout for upper and lower files, as it also
 + * handles overlay.whiteout xattr whiteout files.
 + */
 +bool ovl_path_is_whiteout(struct ovl_fs *ofs, const struct path *path)
 +{
 +      return ovl_is_whiteout(path->dentry) ||
 +              ovl_path_check_xwhiteout_xattr(ofs, path);
 +}
 +
  struct file *ovl_path_open(const struct path *path, int flags)
  {
        struct inode *inode = d_inode(path->dentry);
@@@ -680,36 -644,22 +680,36 @@@ bool ovl_already_copied_up(struct dentr
        return false;
  }
  
 +/*
 + * The copy up "transaction" keeps an elevated mnt write count on upper mnt,
 + * but leaves taking freeze protection on upper sb to lower level helpers.
 + */
  int ovl_copy_up_start(struct dentry *dentry, int flags)
  {
        struct inode *inode = d_inode(dentry);
        int err;
  
        err = ovl_inode_lock_interruptible(inode);
 -      if (!err && ovl_already_copied_up_locked(dentry, flags)) {
 +      if (err)
 +              return err;
 +
 +      if (ovl_already_copied_up_locked(dentry, flags))
                err = 1; /* Already copied up */
 -              ovl_inode_unlock(inode);
 -      }
 +      else
 +              err = ovl_get_write_access(dentry);
 +      if (err)
 +              goto out_unlock;
 +
 +      return 0;
  
 +out_unlock:
 +      ovl_inode_unlock(inode);
        return err;
  }
  
  void ovl_copy_up_end(struct dentry *dentry)
  {
 +      ovl_put_write_access(dentry);
        ovl_inode_unlock(d_inode(dentry));
  }
  
@@@ -726,32 -676,6 +726,32 @@@ bool ovl_path_check_origin_xattr(struc
        return false;
  }
  
 +bool ovl_path_check_xwhiteout_xattr(struct ovl_fs *ofs, const struct path *path)
 +{
 +      struct dentry *dentry = path->dentry;
 +      int res;
 +
 +      /* xattr.whiteout must be a zero size regular file */
 +      if (!d_is_reg(dentry) || i_size_read(d_inode(dentry)) != 0)
 +              return false;
 +
 +      res = ovl_path_getxattr(ofs, path, OVL_XATTR_XWHITEOUT, NULL, 0);
 +      return res >= 0;
 +}
 +
 +bool ovl_path_check_xwhiteouts_xattr(struct ovl_fs *ofs, const struct path *path)
 +{
 +      struct dentry *dentry = path->dentry;
 +      int res;
 +
 +      /* xattr.whiteouts must be a directory */
 +      if (!d_is_dir(dentry))
 +              return false;
 +
 +      res = ovl_path_getxattr(ofs, path, OVL_XATTR_XWHITEOUTS, NULL, 0);
 +      return res >= 0;
 +}
 +
  /*
   * Load persistent uuid from xattr into s_uuid if found, or store a new
   * random generated value in s_uuid and in xattr.
@@@ -836,8 -760,6 +836,8 @@@ bool ovl_path_check_dir_xattr(struct ov
  #define OVL_XATTR_UUID_POSTFIX                "uuid"
  #define OVL_XATTR_METACOPY_POSTFIX    "metacopy"
  #define OVL_XATTR_PROTATTR_POSTFIX    "protattr"
 +#define OVL_XATTR_XWHITEOUT_POSTFIX   "whiteout"
 +#define OVL_XATTR_XWHITEOUTS_POSTFIX  "whiteouts"
  
  #define OVL_XATTR_TAB_ENTRY(x) \
        [x] = { [false] = OVL_XATTR_TRUSTED_PREFIX x ## _POSTFIX, \
@@@ -853,8 -775,6 +853,8 @@@ const char *const ovl_xattr_table[][2] 
        OVL_XATTR_TAB_ENTRY(OVL_XATTR_UUID),
        OVL_XATTR_TAB_ENTRY(OVL_XATTR_METACOPY),
        OVL_XATTR_TAB_ENTRY(OVL_XATTR_PROTATTR),
 +      OVL_XATTR_TAB_ENTRY(OVL_XATTR_XWHITEOUT),
 +      OVL_XATTR_TAB_ENTRY(OVL_XATTR_XWHITEOUTS),
  };
  
  int ovl_check_setxattr(struct ovl_fs *ofs, struct dentry *upperdentry,
@@@ -1053,18 -973,12 +1053,18 @@@ static void ovl_cleanup_index(struct de
        struct dentry *index = NULL;
        struct inode *inode;
        struct qstr name = { };
 +      bool got_write = false;
        int err;
  
        err = ovl_get_index_name(ofs, lowerdentry, &name);
        if (err)
                goto fail;
  
 +      err = ovl_want_write(dentry);
 +      if (err)
 +              goto fail;
 +
 +      got_write = true;
        inode = d_inode(upperdentry);
        if (!S_ISDIR(inode->i_mode) && inode->i_nlink != 1) {
                pr_warn_ratelimited("cleanup linked index (%pd2, ino=%lu, nlink=%u)\n",
                goto fail;
  
  out:
 +      if (got_write)
 +              ovl_drop_write(dentry);
        kfree(name.name);
        dput(index);
        return;
@@@ -1150,12 -1062,8 +1150,12 @@@ int ovl_nlink_start(struct dentry *dent
        if (err)
                return err;
  
 +      err = ovl_want_write(dentry);
 +      if (err)
 +              goto out_unlock;
 +
        if (d_is_dir(dentry) || !ovl_test_flag(OVL_INDEX, inode))
 -              goto out;
 +              return 0;
  
        old_cred = ovl_override_creds(dentry->d_sb);
        /*
         */
        err = ovl_set_nlink_upper(dentry);
        revert_creds(old_cred);
 -
 -out:
        if (err)
 -              ovl_inode_unlock(inode);
 +              goto out_drop_write;
 +
 +      return 0;
 +
 +out_drop_write:
 +      ovl_drop_write(dentry);
 +out_unlock:
 +      ovl_inode_unlock(inode);
  
        return err;
  }
@@@ -1183,8 -1086,6 +1183,8 @@@ void ovl_nlink_end(struct dentry *dentr
  {
        struct inode *inode = d_inode(dentry);
  
 +      ovl_drop_write(dentry);
 +
        if (ovl_test_flag(OVL_INDEX, inode) && inode->i_nlink == 0) {
                const struct cred *old_cred;
  
@@@ -1502,16 -1403,14 +1502,16 @@@ void ovl_copyattr(struct inode *inode
        realinode = ovl_i_path_real(inode, &realpath);
        real_idmap = mnt_idmap(realpath.mnt);
  
 +      spin_lock(&inode->i_lock);
        vfsuid = i_uid_into_vfsuid(real_idmap, realinode);
        vfsgid = i_gid_into_vfsgid(real_idmap, realinode);
  
        inode->i_uid = vfsuid_into_kuid(vfsuid);
        inode->i_gid = vfsgid_into_kgid(vfsgid);
        inode->i_mode = realinode->i_mode;
 -      inode->i_atime = realinode->i_atime;
 -      inode->i_mtime = realinode->i_mtime;
 +      inode_set_atime_to_ts(inode, inode_get_atime(realinode));
 +      inode_set_mtime_to_ts(inode, inode_get_mtime(realinode));
        inode_set_ctime_to_ts(inode, inode_get_ctime(realinode));
        i_size_write(inode, i_size_read(realinode));
 +      spin_unlock(&inode->i_lock);
  }
diff --combined include/linux/exportfs.h
index 0388e8c20f5284f2adafad0611157e5f40354ca2,e0e69dafaa43bd2098e1f1e588e8638483bef3bd..bb37ad5cc954a4ce7d5aaf002ff506aff8862136
@@@ -98,18 -98,23 +98,29 @@@ enum fid_type 
         */
        FILEID_FAT_WITH_PARENT = 0x72,
  
+       /*
+        * 64 bit inode number, 32 bit generation number.
+        */
+       FILEID_INO64_GEN = 0x81,
+       /*
+        * 64 bit inode number, 32 bit generation number,
+        * 64 bit parent inode number, 32 bit parent generation.
+        */
+       FILEID_INO64_GEN_PARENT = 0x82,
        /*
         * 128 bit child FID (struct lu_fid)
         * 128 bit parent FID (struct lu_fid)
         */
        FILEID_LUSTRE = 0x97,
  
 +      /*
 +       * 64 bit inode number, 32 bit subvolume, 32 bit generation number:
 +       */
 +      FILEID_BCACHEFS_WITHOUT_PARENT = 0xb1,
 +      FILEID_BCACHEFS_WITH_PARENT = 0xb2,
 +
        /*
         * 64 bit unique kernfs id
         */
@@@ -129,7 -134,11 +140,11 @@@ struct fid 
                        u32 parent_ino;
                        u32 parent_gen;
                } i32;
-               struct {
+               struct {
+                       u64 ino;
+                       u32 gen;
+               } __packed i64;
+               struct {
                        u32 block;
                        u16 partref;
                        u16 parent_partref;
@@@ -230,29 -239,42 +245,56 @@@ struct export_operations 
                                                  atomic attribute updates
                                                */
  #define EXPORT_OP_FLUSH_ON_CLOSE      (0x20) /* fs flushes file data on close */
 +#define EXPORT_OP_ASYNC_LOCK          (0x40) /* fs can do async lock request */
        unsigned long   flags;
  };
  
 +/**
 + * exportfs_lock_op_is_async() - export op supports async lock operation
 + * @export_ops:       the nfs export operations to check
 + *
 + * Returns true if the nfs export_operations structure has
 + * EXPORT_OP_ASYNC_LOCK in their flags set
 + */
 +static inline bool
 +exportfs_lock_op_is_async(const struct export_operations *export_ops)
 +{
 +      return export_ops->flags & EXPORT_OP_ASYNC_LOCK;
 +}
 +
  extern int exportfs_encode_inode_fh(struct inode *inode, struct fid *fid,
                                    int *max_len, struct inode *parent,
                                    int flags);
  extern int exportfs_encode_fh(struct dentry *dentry, struct fid *fid,
                              int *max_len, int flags);
  
+ static inline bool exportfs_can_encode_fid(const struct export_operations *nop)
+ {
+       return !nop || nop->encode_fh;
+ }
+ static inline bool exportfs_can_decode_fh(const struct export_operations *nop)
+ {
+       return nop && nop->fh_to_dentry;
+ }
+ static inline bool exportfs_can_encode_fh(const struct export_operations *nop,
+                                         int fh_flags)
+ {
+       /*
+        * If a non-decodeable file handle was requested, we only need to make
+        * sure that filesystem did not opt-out of encoding fid.
+        */
+       if (fh_flags & EXPORT_FH_FID)
+               return exportfs_can_encode_fid(nop);
+       /*
+        * If a decodeable file handle was requested, we need to make sure that
+        * filesystem can also decode file handles.
+        */
+       return exportfs_can_decode_fh(nop);
+ }
  static inline int exportfs_encode_fid(struct inode *inode, struct fid *fid,
                                      int *max_len)
  {
@@@ -272,10 -294,12 +314,12 @@@ extern struct dentry *exportfs_decode_f
  /*
   * Generic helpers for filesystems.
   */
- extern struct dentry *generic_fh_to_dentry(struct super_block *sb,
+ int generic_encode_ino32_fh(struct inode *inode, __u32 *fh, int *max_len,
+                           struct inode *parent);
+ struct dentry *generic_fh_to_dentry(struct super_block *sb,
        struct fid *fid, int fh_len, int fh_type,
        struct inode *(*get_inode) (struct super_block *sb, u64 ino, u32 gen));
extern struct dentry *generic_fh_to_parent(struct super_block *sb,
+ struct dentry *generic_fh_to_parent(struct super_block *sb,
        struct fid *fid, int fh_len, int fh_type,
        struct inode *(*get_inode) (struct super_block *sb, u64 ino, u32 gen));
  
This page took 0.243967 seconds and 4 git commands to generate.