]> git.pld-linux.org Git - packages/kernel.git/blobdiff - kernel-aufs.patch
update arm/arm64 configs for 6.8
[packages/kernel.git] / kernel-aufs.patch
index 9d9946ba295e1670874277bb1ca94deaa3bb5be7..dcdb3f87165dc70ca3f10567c02a3d560070f12b 100644 (file)
@@ -1,11 +1,11 @@
 SPDX-License-Identifier: GPL-2.0
-aufs6.2 kbuild patch
+aufs6.x-rcN kbuild patch
 
 diff --git a/fs/Kconfig b/fs/Kconfig
-index 2685a4d0d353..a2df3d4bb3aa 100644
+index 89fdbefd1075..0038eb501478 100644
 --- a/fs/Kconfig
 +++ b/fs/Kconfig
-@@ -319,6 +319,7 @@ source "fs/sysv/Kconfig"
+@@ -338,6 +338,7 @@ source "fs/sysv/Kconfig"
  source "fs/ufs/Kconfig"
  source "fs/erofs/Kconfig"
  source "fs/vboxsf/Kconfig"
@@ -14,24 +14,24 @@ index 2685a4d0d353..a2df3d4bb3aa 100644
  endif # MISC_FILESYSTEMS
  
 diff --git a/fs/Makefile b/fs/Makefile
-index 4dea17840761..9795cbfdd0bf 100644
+index c09016257f05..3899fae66d3f 100644
 --- a/fs/Makefile
 +++ b/fs/Makefile
-@@ -137,3 +137,4 @@ obj-$(CONFIG_EFIVAR_FS)            += efivarfs/
+@@ -130,3 +130,4 @@ obj-$(CONFIG_EFIVAR_FS)            += efivarfs/
  obj-$(CONFIG_EROFS_FS)                += erofs/
  obj-$(CONFIG_VBOXSF_FS)               += vboxsf/
  obj-$(CONFIG_ZONEFS_FS)               += zonefs/
 +obj-$(CONFIG_AUFS_FS)           += aufs/
 SPDX-License-Identifier: GPL-2.0
-aufs6.2 base patch
+aufs6.x-rcN base patch
 
 diff --git a/MAINTAINERS b/MAINTAINERS
-index 135d93368d36..7d3230ef47ec 100644
+index 9ed4d3868539..c0f45969bcf8 100644
 --- a/MAINTAINERS
 +++ b/MAINTAINERS
-@@ -3526,6 +3526,19 @@ F:      include/uapi/linux/audit.h
- F:    kernel/audit*
+@@ -3365,6 +3365,19 @@ F:      kernel/audit*
  F:    lib/*audit.c
+ K:    \baudit_[a-z_0-9]\+\b
  
 +AUFS (advanced multi layered unification filesystem) FILESYSTEM
 +M:    "J. R. Okajima" <hooanon05g@gmail.com>
@@ -46,14 +46,14 @@ index 135d93368d36..7d3230ef47ec 100644
 +F:    fs/aufs/
 +F:    include/uapi/linux/aufs_type.h
 +
- AUXILIARY DISPLAY DRIVERS
- M:    Miguel Ojeda <ojeda@kernel.org>
- S:    Maintained
+ AUXILIARY BUS DRIVER
+ M:    Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+ R:    Dave Ertman <david.m.ertman@intel.com>
 diff --git a/drivers/block/loop.c b/drivers/block/loop.c
-index 1518a6423279..7a9928c6db9d 100644
+index f8145499da38..333b3915fe86 100644
 --- a/drivers/block/loop.c
 +++ b/drivers/block/loop.c
-@@ -645,6 +645,24 @@ static int loop_change_fd(struct loop_device *lo, struct block_device *bdev,
+@@ -641,6 +641,24 @@ static int loop_change_fd(struct loop_device *lo, struct block_device *bdev,
        goto done;
  }
  
@@ -79,10 +79,10 @@ index 1518a6423279..7a9928c6db9d 100644
  
  static ssize_t loop_attr_show(struct device *dev, char *page,
 diff --git a/fs/dcache.c b/fs/dcache.c
-index 52e6d5fdab6b..519321f32f95 100644
+index b813528fb147..78e322b59b8d 100644
 --- a/fs/dcache.c
 +++ b/fs/dcache.c
-@@ -1345,7 +1345,7 @@ enum d_walk_ret {
+@@ -1219,7 +1219,7 @@ enum d_walk_ret {
   *
   * The @enter() callbacks are called with d_lock held.
   */
@@ -90,21 +90,21 @@ index 52e6d5fdab6b..519321f32f95 100644
 +void d_walk(struct dentry *parent, void *data,
                   enum d_walk_ret (*enter)(void *, struct dentry *))
  {
-       struct dentry *this_parent;
+       struct dentry *this_parent, *dentry;
 diff --git a/fs/fcntl.c b/fs/fcntl.c
-index 146c9ab0cd4b..c980a0524118 100644
+index c80a6acad742..96a562b48ec7 100644
 --- a/fs/fcntl.c
 +++ b/fs/fcntl.c
-@@ -33,7 +33,7 @@
+@@ -34,7 +34,7 @@
  
  #define SETFL_MASK (O_APPEND | O_NONBLOCK | O_NDELAY | O_DIRECT | O_NOATIME)
  
--static int setfl(int fd, struct file * filp, unsigned long arg)
-+int setfl(int fd, struct file *filp, unsigned long arg)
+-static int setfl(int fd, struct file * filp, unsigned int arg)
++int setfl(int fd, struct file * filp, unsigned int arg)
  {
        struct inode * inode = file_inode(filp);
        int error = 0;
-@@ -63,6 +63,8 @@ static int setfl(int fd, struct file * filp, unsigned long arg)
+@@ -64,6 +64,8 @@ static int setfl(int fd, struct file * filp, unsigned int arg)
  
        if (filp->f_op->check_flags)
                error = filp->f_op->check_flags(arg);
@@ -114,10 +114,10 @@ index 146c9ab0cd4b..c980a0524118 100644
                return error;
  
 diff --git a/fs/namespace.c b/fs/namespace.c
-index ab467ee58341..8cd34f760f63 100644
+index 5a51315c6678..a4b6ce51848e 100644
 --- a/fs/namespace.c
 +++ b/fs/namespace.c
-@@ -963,6 +963,12 @@ static inline int check_mnt(struct mount *mnt)
+@@ -860,6 +860,12 @@ static inline int check_mnt(struct mount *mnt)
        return mnt->mnt_ns == current->nsproxy->mnt_ns;
  }
  
@@ -131,47 +131,32 @@ index ab467ee58341..8cd34f760f63 100644
   * vfsmount lock must be held for write
   */
 diff --git a/fs/splice.c b/fs/splice.c
-index 5969b7a1d353..21db9b057d60 100644
+index 218e24b1ac40..7210ddc5aa81 100644
 --- a/fs/splice.c
 +++ b/fs/splice.c
-@@ -756,8 +756,8 @@ static int warn_unsupported(struct file *file, const char *op)
+@@ -933,7 +933,7 @@ static int warn_unsupported(struct file *file, const char *op)
  /*
   * Attempt to initiate a splice from pipe to file.
   */
--static long do_splice_from(struct pipe_inode_info *pipe, struct file *out,
--                         loff_t *ppos, size_t len, unsigned int flags)
-+long do_splice_from(struct pipe_inode_info *pipe, struct file *out,
-+                  loff_t *ppos, size_t len, unsigned int flags)
+-static ssize_t do_splice_from(struct pipe_inode_info *pipe, struct file *out,
++ssize_t do_splice_from(struct pipe_inode_info *pipe, struct file *out,
+                             loff_t *ppos, size_t len, unsigned int flags)
  {
        if (unlikely(!out->f_op->splice_write))
-               return warn_unsupported(out, "write");
-@@ -767,9 +767,9 @@ static long do_splice_from(struct pipe_inode_info *pipe, struct file *out,
- /*
-  * Attempt to initiate a splice from a file to a pipe.
-  */
--static long do_splice_to(struct file *in, loff_t *ppos,
--                       struct pipe_inode_info *pipe, size_t len,
--                       unsigned int flags)
-+long do_splice_to(struct file *in, loff_t *ppos,
-+                struct pipe_inode_info *pipe, size_t len,
-+                unsigned int flags)
- {
-       unsigned int p_space;
-       int ret;
 diff --git a/include/linux/fs.h b/include/linux/fs.h
-index c1769a2c5d70..ec560e8704a4 100644
+index 023f37c60709..96ca249ee1e6 100644
 --- a/include/linux/fs.h
 +++ b/include/linux/fs.h
-@@ -1386,6 +1386,7 @@ extern void fasync_free(struct fasync_struct *);
+@@ -1104,6 +1104,7 @@ extern void fasync_free(struct fasync_struct *);
  /* can be called from interrupts */
  extern void kill_fasync(struct fasync_struct **, int, int);
  
-+extern int setfl(int fd, struct file *filp, unsigned long arg);
++extern int setfl(int fd, struct file *filp, unsigned int arg);
  extern void __f_setown(struct file *filp, struct pid *, enum pid_type, int force);
- extern int f_setown(struct file *filp, unsigned long arg, int force);
+ extern int f_setown(struct file *filp, int who, int force);
  extern void f_delown(struct file *filp);
-@@ -2113,6 +2114,7 @@ struct file_operations {
-       ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int);
+@@ -2001,6 +2002,7 @@ struct file_operations {
+       int (*lock) (struct file *, int, struct file_lock *);
        unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long);
        int (*check_flags)(int);
 +      int (*setfl)(struct file *, unsigned long);
@@ -179,10 +164,10 @@ index c1769a2c5d70..ec560e8704a4 100644
        ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, loff_t *, size_t, unsigned int);
        ssize_t (*splice_read)(struct file *, loff_t *, struct pipe_inode_info *, size_t, unsigned int);
 diff --git a/include/linux/lockdep.h b/include/linux/lockdep.h
-index 1f1099dac3f0..81d10b8e9dc0 100644
+index 08b0d1d9d78b..009f69c4e09d 100644
 --- a/include/linux/lockdep.h
 +++ b/include/linux/lockdep.h
-@@ -248,6 +248,8 @@ static inline int lockdep_match_key(struct lockdep_map *lock,
+@@ -192,6 +192,8 @@ static inline int lockdep_match_key(struct lockdep_map *lock,
        return lock->key == key;
  }
  
@@ -212,25 +197,22 @@ index 8f882f5881e8..6b9808f09843 100644
  extern const struct file_operations proc_mountinfo_operations;
  extern const struct file_operations proc_mountstats_operations;
 diff --git a/include/linux/splice.h b/include/linux/splice.h
-index a55179fd60fc..8e21c53cf883 100644
+index 9dec4861d09f..14583d846864 100644
 --- a/include/linux/splice.h
 +++ b/include/linux/splice.h
-@@ -93,4 +93,10 @@ extern void splice_shrink_spd(struct splice_pipe_desc *);
+@@ -108,4 +108,7 @@ extern void splice_shrink_spd(struct splice_pipe_desc *);
  
  extern const struct pipe_buf_operations page_cache_pipe_buf_ops;
  extern const struct pipe_buf_operations default_pipe_buf_ops;
 +
-+extern long do_splice_from(struct pipe_inode_info *pipe, struct file *out,
-+                         loff_t *ppos, size_t len, unsigned int flags);
-+extern long do_splice_to(struct file *in, loff_t *ppos,
-+                       struct pipe_inode_info *pipe, size_t len,
-+                       unsigned int flags);
++extern ssize_t do_splice_from(struct pipe_inode_info *pipe, struct file *out,
++                            loff_t *ppos, size_t len, unsigned int flags);
  #endif
 diff --git a/kernel/locking/lockdep.c b/kernel/locking/lockdep.c
-index e3375bc40dad..c1f0aadde539 100644
+index 151bd3de5936..2223ee909c10 100644
 --- a/kernel/locking/lockdep.c
 +++ b/kernel/locking/lockdep.c
-@@ -217,7 +217,7 @@ unsigned long max_lock_class_idx;
+@@ -218,7 +218,7 @@ unsigned long max_lock_class_idx;
  struct lock_class lock_classes[MAX_LOCKDEP_KEYS];
  DECLARE_BITMAP(lock_classes_in_use, MAX_LOCKDEP_KEYS);
  
@@ -239,7 +221,7 @@ index e3375bc40dad..c1f0aadde539 100644
  {
        unsigned int class_idx = hlock->class_idx;
  
-@@ -238,6 +238,7 @@ static inline struct lock_class *hlock_class(struct held_lock *hlock)
+@@ -239,6 +239,7 @@ static inline struct lock_class *hlock_class(struct held_lock *hlock)
         */
        return lock_classes + class_idx;
  }
@@ -248,23 +230,23 @@ index e3375bc40dad..c1f0aadde539 100644
  #ifdef CONFIG_LOCK_STAT
  static DEFINE_PER_CPU(struct lock_class_stats[MAX_LOCKDEP_KEYS], cpu_lock_stats);
 SPDX-License-Identifier: GPL-2.0
-aufs6.2 mmap patch
+aufs6.x-rcN mmap patch
 
 diff --git a/fs/proc/base.c b/fs/proc/base.c
-index 9e479d7d202b..986c2ae12f8b 100644
+index 98a031ac2648..a7a2ff2a7f61 100644
 --- a/fs/proc/base.c
 +++ b/fs/proc/base.c
-@@ -2218,7 +2218,7 @@ static int map_files_get_link(struct dentry *dentry, struct path *path)
+@@ -2215,7 +2215,7 @@ static int map_files_get_link(struct dentry *dentry, struct path *path)
        rc = -ENOENT;
        vma = find_exact_vma(mm, vm_start, vm_end);
        if (vma && vma->vm_file) {
--              *path = vma->vm_file->f_path;
+-              *path = *file_user_path(vma->vm_file);
 +              *path = vma_pr_or_file(vma)->f_path;
                path_get(path);
                rc = 0;
        }
 diff --git a/fs/proc/nommu.c b/fs/proc/nommu.c
-index 4d3493579458..42edd9a42c78 100644
+index c6e7ebc63756..d7ccfd909764 100644
 --- a/fs/proc/nommu.c
 +++ b/fs/proc/nommu.c
 @@ -39,7 +39,10 @@ static int nommu_region_show(struct seq_file *m, struct vm_region *region)
@@ -280,35 +262,33 @@ index 4d3493579458..42edd9a42c78 100644
                ino = inode->i_ino;
        }
 diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c
-index af1c49ae11b1..cd6a4e461763 100644
+index 3f78ebbb795f..f96ec77db39e 100644
 --- a/fs/proc/task_mmu.c
 +++ b/fs/proc/task_mmu.c
-@@ -285,7 +285,10 @@ show_map_vma(struct seq_file *m, struct vm_area_struct *vma)
+@@ -273,7 +273,8 @@ show_map_vma(struct seq_file *m, struct vm_area_struct *vma)
        const char *name = NULL;
  
        if (file) {
--              struct inode *inode = file_inode(vma->vm_file);
-+              struct inode *inode;
-+
-+              file = vma_pr_or_file(vma);
-+              inode = file_inode(file);
+-              const struct inode *inode = file_user_inode(vma->vm_file);
++              const struct inode *inode
++                      = file_inode(file = vma_pr_or_file(vma));
                dev = inode->i_sb->s_dev;
                ino = inode->i_ino;
-               pgoff = ((loff_t)vma->vm_pgoff) << PAGE_SHIFT;
-@@ -1940,7 +1943,7 @@ static int show_numa_map(struct seq_file *m, void *v)
+@@ -2701,7 +2702,7 @@ static int show_numa_map(struct seq_file *m, void *v)
        struct proc_maps_private *proc_priv = &numa_priv->proc_maps;
        struct vm_area_struct *vma = v;
        struct numa_maps *md = &numa_priv->md;
 -      struct file *file = vma->vm_file;
 +      struct file *file = vma_pr_or_file(vma);
        struct mm_struct *mm = vma->vm_mm;
-       struct mempolicy *pol;
        char buffer[64];
+       struct mempolicy *pol;
 diff --git a/fs/proc/task_nommu.c b/fs/proc/task_nommu.c
-index 2fd06f52b6a4..b01030da424f 100644
+index bce674533000..b12b5a75c799 100644
 --- a/fs/proc/task_nommu.c
 +++ b/fs/proc/task_nommu.c
-@@ -150,7 +150,10 @@ static int nommu_vma_show(struct seq_file *m, struct vm_area_struct *vma)
+@@ -137,7 +137,10 @@ static int nommu_vma_show(struct seq_file *m, struct vm_area_struct *vma)
        file = vma->vm_file;
  
        if (file) {
@@ -321,12 +301,12 @@ index 2fd06f52b6a4..b01030da424f 100644
                ino = inode->i_ino;
                pgoff = (loff_t)vma->vm_pgoff << PAGE_SHIFT;
 diff --git a/include/linux/mm.h b/include/linux/mm.h
-index f13f20258ce9..25f4878a0835 100644
+index f5a97dec5169..a5b0edc8e290 100644
 --- a/include/linux/mm.h
 +++ b/include/linux/mm.h
-@@ -2065,6 +2065,43 @@ static inline void unmap_shared_mapping_range(struct address_space *mapping,
-       unmap_mapping_range(mapping, holebegin, holelen, 0);
- }
+@@ -2432,6 +2432,43 @@ static inline void unmap_shared_mapping_range(struct address_space *mapping,
+ static inline struct vm_area_struct *vma_lookup(struct mm_struct *mm,
+                                               unsigned long addr);
  
 +#if 1 /* IS_ENABLED(CONFIG_AUFS_FS) */
 +extern void vma_do_file_update_time(struct vm_area_struct *, const char[], int);
@@ -369,10 +349,10 @@ index f13f20258ce9..25f4878a0835 100644
                void *buf, int len, unsigned int gup_flags);
  extern int access_remote_vm(struct mm_struct *mm, unsigned long addr,
 diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h
-index 9757067c3053..b6a0f30cd722 100644
+index 8b611e13153e..838af328941a 100644
 --- a/include/linux/mm_types.h
 +++ b/include/linux/mm_types.h
-@@ -504,6 +504,9 @@ struct vm_region {
+@@ -527,6 +527,9 @@ struct vm_region {
        unsigned long   vm_top;         /* region allocated to here */
        unsigned long   vm_pgoff;       /* the offset in vm_file corresponding to vm_start */
        struct file     *vm_file;       /* the backing file or NULL */
@@ -382,7 +362,7 @@ index 9757067c3053..b6a0f30cd722 100644
  
        int             vm_usage;       /* region usage count (access under nommu_region_sem) */
        bool            vm_icache_flushed : 1; /* true if the icache has been flushed for
-@@ -575,6 +578,9 @@ struct vm_area_struct {
+@@ -691,6 +694,9 @@ struct vm_area_struct {
        unsigned long vm_pgoff;         /* Offset (within vm_file) in PAGE_SIZE
                                           units */
        struct file * vm_file;          /* File we map to (can be NULL). */
@@ -393,32 +373,32 @@ index 9757067c3053..b6a0f30cd722 100644
  
  #ifdef CONFIG_ANON_VMA_NAME
 diff --git a/kernel/fork.c b/kernel/fork.c
-index 9f7fe3541897..f9e44ca88a7d 100644
+index 0d944e92a43f..bc073aaca2dc 100644
 --- a/kernel/fork.c
 +++ b/kernel/fork.c
-@@ -664,7 +664,7 @@ static __latent_entropy int dup_mmap(struct mm_struct *mm,
+@@ -716,7 +716,7 @@ static __latent_entropy int dup_mmap(struct mm_struct *mm,
                if (file) {
                        struct address_space *mapping = file->f_mapping;
  
 -                      get_file(file);
 +                      vma_get_file(tmp);
                        i_mmap_lock_write(mapping);
-                       if (tmp->vm_flags & VM_SHARED)
+                       if (vma_is_shared_maywrite(tmp))
                                mapping_allow_writable(mapping);
 diff --git a/mm/Makefile b/mm/Makefile
-index 8e105e5b3e29..c218d042dbce 100644
+index e4b5b75aaec9..2ec2544009fb 100644
 --- a/mm/Makefile
 +++ b/mm/Makefile
-@@ -138,3 +138,4 @@ obj-$(CONFIG_IO_MAPPING) += io-mapping.o
+@@ -134,3 +134,4 @@ obj-$(CONFIG_IO_MAPPING) += io-mapping.o
  obj-$(CONFIG_HAVE_BOOTMEM_INFO_NODE) += bootmem_info.o
  obj-$(CONFIG_GENERIC_IOREMAP) += ioremap.o
  obj-$(CONFIG_SHRINKER_DEBUG) += shrinker_debug.o
 +obj-y += prfile.o
 diff --git a/mm/filemap.c b/mm/filemap.c
-index 0e20a8d6dd93..ba1b238d928a 100644
+index 750e779c23db..b84a752ff676 100644
 --- a/mm/filemap.c
 +++ b/mm/filemap.c
-@@ -3438,7 +3438,7 @@ vm_fault_t filemap_page_mkwrite(struct vm_fault *vmf)
+@@ -3587,7 +3587,7 @@ vm_fault_t filemap_page_mkwrite(struct vm_fault *vmf)
        vm_fault_t ret = VM_FAULT_LOCKED;
  
        sb_start_pagefault(mapping->host->i_sb);
@@ -428,37 +408,28 @@ index 0e20a8d6dd93..ba1b238d928a 100644
        if (folio->mapping != mapping) {
                folio_unlock(folio);
 diff --git a/mm/mmap.c b/mm/mmap.c
-index 425a9349e610..004eb9dbd99a 100644
+index d89770eaab6b..6bfba84b5ff0 100644
 --- a/mm/mmap.c
 +++ b/mm/mmap.c
-@@ -139,7 +139,7 @@ static void remove_vma(struct vm_area_struct *vma)
+@@ -140,7 +140,7 @@ static void remove_vma(struct vm_area_struct *vma, bool unreachable)
        if (vma->vm_ops && vma->vm_ops->close)
                vma->vm_ops->close(vma);
        if (vma->vm_file)
 -              fput(vma->vm_file);
 +              vma_fput(vma);
        mpol_put(vma_policy(vma));
-       vm_area_free(vma);
- }
-@@ -589,7 +589,7 @@ inline int vma_expand(struct ma_state *mas, struct vm_area_struct *vma,
-       if (remove_next) {
-               if (file) {
-                       uprobe_munmap(next, next->vm_start, next->vm_end);
--                      fput(file);
-+                      vma_fput(vma);
+       if (unreachable)
+               __vm_area_free(vma);
+@@ -554,7 +554,7 @@ static inline void vma_complete(struct vma_prepare *vp,
+               if (vp->file) {
+                       uprobe_munmap(vp->remove, vp->remove->vm_start,
+                                     vp->remove->vm_end);
+-                      fput(vp->file);
++                      vma_fput(vp->vma);
                }
-               if (next->anon_vma)
-                       anon_vma_merge(vma, next);
-@@ -830,7 +830,7 @@ int __vma_adjust(struct vm_area_struct *vma, unsigned long start,
- again:
-               if (file) {
-                       uprobe_munmap(next, next->vm_start, next->vm_end);
--                      fput(file);
-+                      vma_fput(vma);
-               }
-               if (next->anon_vma)
-                       anon_vma_merge(vma, next);
-@@ -2228,7 +2228,7 @@ int __split_vma(struct mm_struct *mm, struct vm_area_struct *vma,
+               if (vp->remove->anon_vma)
+                       anon_vma_merge(vp->vma, vp->remove);
+@@ -2357,7 +2357,7 @@ static int __split_vma(struct vma_iterator *vmi, struct vm_area_struct *vma,
                goto out_free_mpol;
  
        if (new->vm_file)
@@ -467,25 +438,25 @@ index 425a9349e610..004eb9dbd99a 100644
  
        if (new->vm_ops && new->vm_ops->open)
                new->vm_ops->open(new);
-@@ -2250,7 +2250,7 @@ int __split_vma(struct mm_struct *mm, struct vm_area_struct *vma,
-       if (new->vm_ops && new->vm_ops->close)
-               new->vm_ops->close(new);
-       if (new->vm_file)
--              fput(new->vm_file);
-+              vma_fput(new);
-       unlink_anon_vmas(new);
-  out_free_mpol:
-       mpol_put(vma_policy(new));
-@@ -2750,7 +2750,7 @@ unsigned long mmap_region(struct file *file, unsigned long addr,
-       if (vma->vm_ops && vma->vm_ops->close)
-               vma->vm_ops->close(vma);
+@@ -2855,7 +2855,7 @@ unsigned long mmap_region(struct file *file, unsigned long addr,
+                                * and cause general protection fault
+                                * ultimately.
+                                */
+-                              fput(vma->vm_file);
++                              vma_fput(vma);
+                               vm_area_free(vma);
+                               vma = merge;
+                               /* Update vm_flags to pick up the change. */
+@@ -2950,7 +2950,7 @@ unsigned long mmap_region(struct file *file, unsigned long addr,
+       if (file || vma->vm_file) {
  unmap_and_free_vma:
--      fput(vma->vm_file);
-+      vma_fput(vma);
-       vma->vm_file = NULL;
+-              fput(vma->vm_file);
++              vma_fput(vma);
+               vma->vm_file = NULL;
  
-       /* Undo any partial mapping done by a device driver. */
-@@ -2817,6 +2817,9 @@ SYSCALL_DEFINE5(remap_file_pages, unsigned long, start, unsigned long, size,
+               vma_iter_set(&vmi, vma->vm_end);
+@@ -3012,6 +3012,9 @@ SYSCALL_DEFINE5(remap_file_pages, unsigned long, start, unsigned long, size,
        unsigned long populate = 0;
        unsigned long ret = -EINVAL;
        struct file *file;
@@ -495,7 +466,7 @@ index 425a9349e610..004eb9dbd99a 100644
  
        pr_warn_once("%s (%d) uses deprecated remap_file_pages() syscall. See Documentation/mm/remap_file_pages.rst.\n",
                     current->comm, current->pid);
-@@ -2875,10 +2878,34 @@ SYSCALL_DEFINE5(remap_file_pages, unsigned long, start, unsigned long, size,
+@@ -3070,10 +3073,34 @@ SYSCALL_DEFINE5(remap_file_pages, unsigned long, start, unsigned long, size,
        if (vma->vm_flags & VM_LOCKED)
                flags |= MAP_LOCKED;
  
@@ -504,14 +475,14 @@ index 425a9349e610..004eb9dbd99a 100644
 +      file = vma->vm_file;
 +      prfile = vma->vm_prfile;
 +      ret = do_mmap(vma->vm_file, start, size,
-+                      prot, flags, pgoff, &populate, NULL);
++                      prot, flags, /*vm_flags*/0, pgoff, &populate, NULL);
 +      if (!IS_ERR_VALUE(ret) && file && prfile) {
 +              struct vm_area_struct *new_vma;
 +
 +              new_vma = find_vma(mm, ret);
 +              if (!new_vma->vm_prfile)
 +                      new_vma->vm_prfile = prfile;
-+              if (new_vma != vma)
++              if (prfile)
 +                      get_file(prfile);
 +      }
 +      /*
@@ -524,13 +495,13 @@ index 425a9349e610..004eb9dbd99a 100644
 +#else
        file = get_file(vma->vm_file);
        ret = do_mmap(vma->vm_file, start, size,
-                       prot, flags, pgoff, &populate, NULL);
+                       prot, flags, 0, pgoff, &populate, NULL);
        fput(file);
 +#endif /* CONFIG_AUFS_FS */
  out:
        mmap_write_unlock(mm);
        if (populate)
-@@ -3226,7 +3253,7 @@ struct vm_area_struct *copy_vma(struct vm_area_struct **vmap,
+@@ -3420,7 +3447,7 @@ struct vm_area_struct *copy_vma(struct vm_area_struct **vmap,
                if (anon_vma_clone(new_vma, vma))
                        goto out_free_mempol;
                if (new_vma->vm_file)
@@ -539,8 +510,17 @@ index 425a9349e610..004eb9dbd99a 100644
                if (new_vma->vm_ops && new_vma->vm_ops->open)
                        new_vma->vm_ops->open(new_vma);
                if (vma_link(mm, new_vma))
+@@ -3434,7 +3461,7 @@ struct vm_area_struct *copy_vma(struct vm_area_struct **vmap,
+               new_vma->vm_ops->close(new_vma);
+       if (new_vma->vm_file)
+-              fput(new_vma->vm_file);
++              vma_fput(new_vma);
+       unlink_anon_vmas(new_vma);
+ out_free_mempol:
 diff --git a/mm/nommu.c b/mm/nommu.c
-index 5b83938ecb67..59d483b9c3d3 100644
+index b6dc558d3144..d96655486468 100644
 --- a/mm/nommu.c
 +++ b/mm/nommu.c
 @@ -523,7 +523,7 @@ static void __put_nommu_region(struct vm_region *region)
@@ -552,7 +532,7 @@ index 5b83938ecb67..59d483b9c3d3 100644
  
                /* IO memory and memory shared directly out of the pagecache
                 * from ramfs/tmpfs mustn't be released here */
-@@ -653,7 +653,7 @@ static void delete_vma(struct mm_struct *mm, struct vm_area_struct *vma)
+@@ -603,7 +603,7 @@ static void delete_vma(struct mm_struct *mm, struct vm_area_struct *vma)
        if (vma->vm_ops && vma->vm_ops->close)
                vma->vm_ops->close(vma);
        if (vma->vm_file)
@@ -561,7 +541,7 @@ index 5b83938ecb67..59d483b9c3d3 100644
        put_nommu_region(vma->vm_region);
        vm_area_free(vma);
  }
-@@ -1164,7 +1164,7 @@ unsigned long do_mmap(struct file *file,
+@@ -1135,7 +1135,7 @@ unsigned long do_mmap(struct file *file,
                                        goto error_just_free;
                                }
                        }
@@ -570,9 +550,9 @@ index 5b83938ecb67..59d483b9c3d3 100644
                        kmem_cache_free(vm_region_jar, region);
                        region = pregion;
                        result = start;
-@@ -1242,10 +1242,10 @@ unsigned long do_mmap(struct file *file,
+@@ -1221,10 +1221,10 @@ unsigned long do_mmap(struct file *file,
  error:
-       mas_destroy(&mas);
+       vma_iter_free(&vmi);
        if (region->vm_file)
 -              fput(region->vm_file);
 +              vmr_fput(region);
@@ -676,13 +656,13 @@ index 000000000000..8f820a235364
 +}
 +#endif /* !CONFIG_MMU */
 SPDX-License-Identifier: GPL-2.0
-aufs6.2 standalone patch
+aufs6.x-rcN standalone patch
 
 diff --git a/fs/dcache.c b/fs/dcache.c
-index 519321f32f95..267e0c65914a 100644
+index 78e322b59b8d..7d8fbe5b7ce5 100644
 --- a/fs/dcache.c
 +++ b/fs/dcache.c
-@@ -1450,6 +1450,7 @@ void d_walk(struct dentry *parent, void *data,
+@@ -1318,6 +1318,7 @@ void d_walk(struct dentry *parent, void *data,
        seq = 1;
        goto again;
  }
@@ -690,7 +670,7 @@ index 519321f32f95..267e0c65914a 100644
  
  struct check_mount {
        struct vfsmount *mnt;
-@@ -3052,6 +3053,7 @@ void d_exchange(struct dentry *dentry1, struct dentry *dentry2)
+@@ -2880,6 +2881,7 @@ void d_exchange(struct dentry *dentry1, struct dentry *dentry2)
  
        write_sequnlock(&rename_lock);
  }
@@ -699,10 +679,10 @@ index 519321f32f95..267e0c65914a 100644
  /**
   * d_ancestor - search for an ancestor
 diff --git a/fs/exec.c b/fs/exec.c
-index ab913243a367..d84461fddf7d 100644
+index af4fbb61cd53..aa5161ad2c1f 100644
 --- a/fs/exec.c
 +++ b/fs/exec.c
-@@ -111,6 +111,7 @@ bool path_noexec(const struct path *path)
+@@ -113,6 +113,7 @@ bool path_noexec(const struct path *path)
        return (path->mnt->mnt_flags & MNT_NOEXEC) ||
               (path->mnt->mnt_sb->s_iflags & SB_I_NOEXEC);
  }
@@ -711,10 +691,10 @@ index ab913243a367..d84461fddf7d 100644
  #ifdef CONFIG_USELIB
  /*
 diff --git a/fs/fcntl.c b/fs/fcntl.c
-index c980a0524118..40087d11a974 100644
+index 96a562b48ec7..e21a0fcff538 100644
 --- a/fs/fcntl.c
 +++ b/fs/fcntl.c
-@@ -86,6 +86,7 @@ int setfl(int fd, struct file *filp, unsigned long arg)
+@@ -87,6 +87,7 @@ int setfl(int fd, struct file * filp, unsigned int arg)
   out:
        return error;
  }
@@ -723,10 +703,10 @@ index c980a0524118..40087d11a974 100644
  static void f_modown(struct file *filp, struct pid *pid, enum pid_type type,
                       int force)
 diff --git a/fs/file_table.c b/fs/file_table.c
-index dd88701e54a9..ecdb7817b074 100644
+index b991f90571b4..a3ba5726194a 100644
 --- a/fs/file_table.c
 +++ b/fs/file_table.c
-@@ -198,6 +198,7 @@ struct file *alloc_empty_file(int flags, const struct cred *cred)
+@@ -222,6 +222,7 @@ struct file *alloc_empty_file(int flags, const struct cred *cred)
        }
        return ERR_PTR(-ENFILE);
  }
@@ -735,18 +715,10 @@ index dd88701e54a9..ecdb7817b074 100644
  /*
   * Variant of alloc_empty_file() that doesn't check and modify nr_files.
 diff --git a/fs/namespace.c b/fs/namespace.c
-index 8cd34f760f63..799a94205906 100644
+index a4b6ce51848e..c7415f75ab4c 100644
 --- a/fs/namespace.c
 +++ b/fs/namespace.c
-@@ -571,6 +571,7 @@ void __mnt_drop_write(struct vfsmount *mnt)
-       mnt_dec_writers(real_mount(mnt));
-       preempt_enable();
- }
-+EXPORT_SYMBOL_GPL(__mnt_drop_write);
- /**
-  * mnt_drop_write - give up write access to a mount
-@@ -968,6 +969,7 @@ int is_current_mnt_ns(struct vfsmount *mnt)
+@@ -865,6 +865,7 @@ int is_current_mnt_ns(struct vfsmount *mnt)
  {
        return check_mnt(real_mount(mnt));
  }
@@ -754,7 +726,23 @@ index 8cd34f760f63..799a94205906 100644
  
  /*
   * vfsmount lock must be held for write
-@@ -2165,6 +2167,7 @@ int iterate_mounts(int (*f)(struct vfsmount *, void *), void *arg,
+@@ -2053,6 +2054,7 @@ struct vfsmount *collect_mounts(const struct path *path)
+               return ERR_CAST(tree);
+       return &tree->mnt;
+ }
++EXPORT_SYMBOL_GPL(collect_mounts);
+ static void free_mnt_ns(struct mnt_namespace *);
+ static struct mnt_namespace *alloc_mnt_ns(struct user_namespace *, bool);
+@@ -2083,6 +2085,7 @@ void drop_collected_mounts(struct vfsmount *mnt)
+       unlock_mount_hash();
+       namespace_unlock();
+ }
++EXPORT_SYMBOL_GPL(drop_collected_mounts);
+ static bool has_locked_children(struct mount *mnt, struct dentry *dentry)
+ {
+@@ -2154,6 +2157,7 @@ int iterate_mounts(int (*f)(struct vfsmount *, void *), void *arg,
        }
        return 0;
  }
@@ -775,10 +763,10 @@ index 1de6631a3925..3008eb37a18d 100644
  /*
   * Drop a reference to a group.  Free it if it's through.
 diff --git a/fs/open.c b/fs/open.c
-index 82c1a28b3308..e7bd6f1c9474 100644
+index a84d21e55c39..35183a95dafd 100644
 --- a/fs/open.c
 +++ b/fs/open.c
-@@ -66,6 +66,7 @@ int do_truncate(struct user_namespace *mnt_userns, struct dentry *dentry,
+@@ -67,6 +67,7 @@ int do_truncate(struct mnt_idmap *idmap, struct dentry *dentry,
        inode_unlock(dentry->d_inode);
        return ret;
  }
@@ -787,10 +775,10 @@ index 82c1a28b3308..e7bd6f1c9474 100644
  long vfs_truncate(const struct path *path, loff_t length)
  {
 diff --git a/fs/read_write.c b/fs/read_write.c
-index 7a2ff6157eda..76f5d4d08687 100644
+index d4c036e82b6c..c61361ff5e67 100644
 --- a/fs/read_write.c
 +++ b/fs/read_write.c
-@@ -477,6 +477,7 @@ ssize_t vfs_read(struct file *file, char __user *buf, size_t count, loff_t *pos)
+@@ -483,6 +483,7 @@ ssize_t vfs_read(struct file *file, char __user *buf, size_t count, loff_t *pos)
        inc_syscr(current);
        return ret;
  }
@@ -798,7 +786,7 @@ index 7a2ff6157eda..76f5d4d08687 100644
  
  static ssize_t new_sync_write(struct file *filp, const char __user *buf, size_t len, loff_t *ppos)
  {
-@@ -592,6 +593,7 @@ ssize_t vfs_write(struct file *file, const char __user *buf, size_t count, loff_
+@@ -598,6 +599,7 @@ ssize_t vfs_write(struct file *file, const char __user *buf, size_t count, loff_
        file_end_write(file);
        return ret;
  }
@@ -807,30 +795,22 @@ index 7a2ff6157eda..76f5d4d08687 100644
  /* file_ppos returns &file->f_pos or NULL if file is stream */
  static inline loff_t *file_ppos(struct file *file)
 diff --git a/fs/splice.c b/fs/splice.c
-index 21db9b057d60..abcd14f52c1e 100644
+index 7210ddc5aa81..9e83f46eacc8 100644
 --- a/fs/splice.c
 +++ b/fs/splice.c
-@@ -763,6 +763,7 @@ long do_splice_from(struct pipe_inode_info *pipe, struct file *out,
+@@ -940,6 +940,7 @@ ssize_t do_splice_from(struct pipe_inode_info *pipe, struct file *out,
                return warn_unsupported(out, "write");
        return out->f_op->splice_write(pipe, out, ppos, len, flags);
  }
 +EXPORT_SYMBOL_GPL(do_splice_from);
  
  /*
-  * Attempt to initiate a splice from a file to a pipe.
-@@ -792,6 +793,7 @@ long do_splice_to(struct file *in, loff_t *ppos,
-               return warn_unsupported(in, "read");
-       return in->f_op->splice_read(in, ppos, pipe, len, flags);
- }
-+EXPORT_SYMBOL_GPL(do_splice_to);
- /**
-  * splice_direct_to_actor - splices data directly between two non-pipes
+  * Indicate to the caller that there was a premature EOF when reading from the
 diff --git a/fs/xattr.c b/fs/xattr.c
-index adab9a70b536..b2dc4fc0b25b 100644
+index 09d927603433..890daee95a7b 100644
 --- a/fs/xattr.c
 +++ b/fs/xattr.c
-@@ -407,6 +407,7 @@ vfs_getxattr_alloc(struct user_namespace *mnt_userns, struct dentry *dentry,
+@@ -406,6 +406,7 @@ vfs_getxattr_alloc(struct mnt_idmap *idmap, struct dentry *dentry,
        *xattr_value = value;
        return error;
  }
@@ -839,10 +819,10 @@ index adab9a70b536..b2dc4fc0b25b 100644
  ssize_t
  __vfs_getxattr(struct dentry *dentry, struct inode *inode, const char *name,
 diff --git a/kernel/locking/lockdep.c b/kernel/locking/lockdep.c
-index c1f0aadde539..278e0a322d20 100644
+index 2223ee909c10..d0ac4fc69a31 100644
 --- a/kernel/locking/lockdep.c
 +++ b/kernel/locking/lockdep.c
-@@ -238,6 +238,7 @@ inline struct lock_class *lockdep_hlock_class(struct held_lock *hlock)
+@@ -239,6 +239,7 @@ inline struct lock_class *lockdep_hlock_class(struct held_lock *hlock)
         */
        return lock_classes + class_idx;
  }
@@ -851,85 +831,85 @@ index c1f0aadde539..278e0a322d20 100644
  
  #ifdef CONFIG_LOCK_STAT
 diff --git a/kernel/task_work.c b/kernel/task_work.c
-index 065e1ef8fc8d..c623c6f0c645 100644
+index 95a7e1b7f1da..5053670775d3 100644
 --- a/kernel/task_work.c
 +++ b/kernel/task_work.c
-@@ -182,3 +182,4 @@ void task_work_run(void)
+@@ -183,3 +183,4 @@ void task_work_run(void)
                } while (work);
        }
  }
 +EXPORT_SYMBOL_GPL(task_work_run);
 diff --git a/security/security.c b/security/security.c
-index d1571900a8c7..6fdcf98bf7ea 100644
+index 7035ee35a393..eb461a68073f 100644
 --- a/security/security.c
 +++ b/security/security.c
-@@ -1195,6 +1195,7 @@ int security_path_rmdir(const struct path *dir, struct dentry *dentry)
+@@ -1835,6 +1835,7 @@ int security_path_rmdir(const struct path *dir, struct dentry *dentry)
                return 0;
        return call_int_hook(path_rmdir, 0, dir, dentry);
  }
 +EXPORT_SYMBOL_GPL(security_path_rmdir);
  
- int security_path_unlink(const struct path *dir, struct dentry *dentry)
- {
-@@ -1211,6 +1212,7 @@ int security_path_symlink(const struct path *dir, struct dentry *dentry,
+ /**
+  * security_path_unlink() - Check if removing a hard link is allowed
+@@ -1870,6 +1871,7 @@ int security_path_symlink(const struct path *dir, struct dentry *dentry,
                return 0;
        return call_int_hook(path_symlink, 0, dir, dentry, old_name);
  }
 +EXPORT_SYMBOL_GPL(security_path_symlink);
  
- int security_path_link(struct dentry *old_dentry, const struct path *new_dir,
-                      struct dentry *new_dentry)
-@@ -1219,6 +1221,7 @@ int security_path_link(struct dentry *old_dentry, const struct path *new_dir,
+ /**
+  * security_path_link - Check if creating a hard link is allowed
+@@ -1888,6 +1890,7 @@ int security_path_link(struct dentry *old_dentry, const struct path *new_dir,
                return 0;
        return call_int_hook(path_link, 0, old_dentry, new_dir, new_dentry);
  }
 +EXPORT_SYMBOL_GPL(security_path_link);
  
- int security_path_rename(const struct path *old_dir, struct dentry *old_dentry,
-                        const struct path *new_dir, struct dentry *new_dentry,
-@@ -1246,6 +1249,7 @@ int security_path_chmod(const struct path *path, umode_t mode)
+ /**
+  * security_path_rename() - Check if renaming a file is allowed
+@@ -1949,6 +1952,7 @@ int security_path_chmod(const struct path *path, umode_t mode)
                return 0;
        return call_int_hook(path_chmod, 0, path, mode);
  }
 +EXPORT_SYMBOL_GPL(security_path_chmod);
  
- int security_path_chown(const struct path *path, kuid_t uid, kgid_t gid)
- {
-@@ -1253,6 +1257,7 @@ int security_path_chown(const struct path *path, kuid_t uid, kgid_t gid)
+ /**
+  * security_path_chown() - Check if changing the file's owner/group is allowed
+@@ -1966,6 +1970,7 @@ int security_path_chown(const struct path *path, kuid_t uid, kgid_t gid)
                return 0;
        return call_int_hook(path_chown, 0, path, uid, gid);
  }
 +EXPORT_SYMBOL_GPL(security_path_chown);
  
- int security_path_chroot(const struct path *path)
- {
-@@ -1353,6 +1358,7 @@ int security_inode_permission(struct inode *inode, int mask)
+ /**
+  * security_path_chroot() - Check if changing the root directory is allowed
+@@ -2195,6 +2200,7 @@ int security_inode_permission(struct inode *inode, int mask)
                return 0;
        return call_int_hook(inode_permission, 0, inode, mask);
  }
 +EXPORT_SYMBOL_GPL(security_inode_permission);
  
- int security_inode_setattr(struct user_namespace *mnt_userns,
-                          struct dentry *dentry, struct iattr *attr)
-@@ -1593,6 +1599,7 @@ int security_file_permission(struct file *file, int mask)
-       return fsnotify_perm(file, mask);
+ /**
+  * security_inode_setattr() - Check if setting file attributes is allowed
+@@ -2667,6 +2673,7 @@ int security_file_permission(struct file *file, int mask)
+ {
+       return call_int_hook(file_permission, 0, file, mask);
  }
 +EXPORT_SYMBOL_GPL(security_file_permission);
  
- int security_file_alloc(struct file *file)
- {
-@@ -1726,6 +1733,7 @@ int security_file_truncate(struct file *file)
+ /**
+  * security_file_alloc() - Allocate and init a file's LSM blob
+@@ -2951,6 +2958,7 @@ int security_file_truncate(struct file *file)
  {
        return call_int_hook(file_truncate, 0, file);
  }
 +EXPORT_SYMBOL_GPL(security_file_truncate);
  
- int security_task_alloc(struct task_struct *task, unsigned long clone_flags)
- {
+ /**
+  * security_task_alloc() - Allocate a task's LSM blob
 diff -urN /usr/share/empty/Documentation/ABI/testing/debugfs-aufs linux/Documentation/ABI/testing/debugfs-aufs
 --- /usr/share/empty/Documentation/ABI/testing/debugfs-aufs    1970-01-01 01:00:00.000000000 +0100
-+++ linux/Documentation/ABI/testing/debugfs-aufs       2023-04-07 12:29:13.123045930 +0200
++++ linux/Documentation/ABI/testing/debugfs-aufs       2022-11-05 23:02:18.955889283 +0100
 @@ -0,0 +1,55 @@
 +What:         /debug/aufs/si_<id>/
 +Date:         March 2009
@@ -988,7 +968,7 @@ diff -urN /usr/share/empty/Documentation/ABI/testing/debugfs-aufs linux/Document
 +              will be empty. About XINO files, see the aufs manual.
 diff -urN /usr/share/empty/Documentation/ABI/testing/sysfs-aufs linux/Documentation/ABI/testing/sysfs-aufs
 --- /usr/share/empty/Documentation/ABI/testing/sysfs-aufs      1970-01-01 01:00:00.000000000 +0100
-+++ linux/Documentation/ABI/testing/sysfs-aufs 2023-04-07 12:29:13.123045930 +0200
++++ linux/Documentation/ABI/testing/sysfs-aufs 2022-11-05 23:02:18.955889283 +0100
 @@ -0,0 +1,31 @@
 +What:         /sys/fs/aufs/si_<id>/
 +Date:         March 2009
@@ -1023,7 +1003,7 @@ diff -urN /usr/share/empty/Documentation/ABI/testing/sysfs-aufs linux/Documentat
 +              will be empty. About XINO files, see the aufs manual.
 diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/01intro.txt linux/Documentation/filesystems/aufs/design/01intro.txt
 --- /usr/share/empty/Documentation/filesystems/aufs/design/01intro.txt 1970-01-01 01:00:00.000000000 +0100
-+++ linux/Documentation/filesystems/aufs/design/01intro.txt    2023-04-07 12:29:13.123045930 +0200
++++ linux/Documentation/filesystems/aufs/design/01intro.txt    2022-11-05 23:02:18.955889283 +0100
 @@ -0,0 +1,171 @@
 +
 +# Copyright (C) 2005-2022 Junjiro R. Okajima
@@ -1198,7 +1178,7 @@ diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/01intro.txt lin
 +about it. But currently I have implemented it in kernel space.
 diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/02struct.txt linux/Documentation/filesystems/aufs/design/02struct.txt
 --- /usr/share/empty/Documentation/filesystems/aufs/design/02struct.txt        1970-01-01 01:00:00.000000000 +0100
-+++ linux/Documentation/filesystems/aufs/design/02struct.txt   2023-04-07 12:29:13.123045930 +0200
++++ linux/Documentation/filesystems/aufs/design/02struct.txt   2022-11-05 23:02:18.955889283 +0100
 @@ -0,0 +1,258 @@
 +
 +# Copyright (C) 2005-2022 Junjiro R. Okajima
@@ -1460,7 +1440,7 @@ diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/02struct.txt li
 +For this purpose, use "aumvdown" command in aufs-util.git.
 diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/03atomic_open.txt linux/Documentation/filesystems/aufs/design/03atomic_open.txt
 --- /usr/share/empty/Documentation/filesystems/aufs/design/03atomic_open.txt   1970-01-01 01:00:00.000000000 +0100
-+++ linux/Documentation/filesystems/aufs/design/03atomic_open.txt      2023-04-07 12:29:13.123045930 +0200
++++ linux/Documentation/filesystems/aufs/design/03atomic_open.txt      2022-11-05 23:02:18.955889283 +0100
 @@ -0,0 +1,85 @@
 +
 +# Copyright (C) 2015-2022 Junjiro R. Okajima
@@ -1549,7 +1529,7 @@ diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/03atomic_open.t
 +       be implemented in aufs, but not all I am afraid.
 diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/03lookup.txt linux/Documentation/filesystems/aufs/design/03lookup.txt
 --- /usr/share/empty/Documentation/filesystems/aufs/design/03lookup.txt        1970-01-01 01:00:00.000000000 +0100
-+++ linux/Documentation/filesystems/aufs/design/03lookup.txt   2023-04-07 12:29:13.123045930 +0200
++++ linux/Documentation/filesystems/aufs/design/03lookup.txt   2022-11-05 23:02:18.959222617 +0100
 @@ -0,0 +1,113 @@
 +
 +# Copyright (C) 2005-2022 Junjiro R. Okajima
@@ -1666,7 +1646,7 @@ diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/03lookup.txt li
 +   by over-mounting something (or another method).
 diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/04branch.txt linux/Documentation/filesystems/aufs/design/04branch.txt
 --- /usr/share/empty/Documentation/filesystems/aufs/design/04branch.txt        1970-01-01 01:00:00.000000000 +0100
-+++ linux/Documentation/filesystems/aufs/design/04branch.txt   2023-04-07 12:29:13.123045930 +0200
++++ linux/Documentation/filesystems/aufs/design/04branch.txt   2022-11-05 23:02:18.959222617 +0100
 @@ -0,0 +1,74 @@
 +
 +# Copyright (C) 2005-2022 Junjiro R. Okajima
@@ -1744,7 +1724,7 @@ diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/04branch.txt li
 +    same named entry on the upper branch.
 diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/05wbr_policy.txt linux/Documentation/filesystems/aufs/design/05wbr_policy.txt
 --- /usr/share/empty/Documentation/filesystems/aufs/design/05wbr_policy.txt    1970-01-01 01:00:00.000000000 +0100
-+++ linux/Documentation/filesystems/aufs/design/05wbr_policy.txt       2023-04-07 12:29:13.123045930 +0200
++++ linux/Documentation/filesystems/aufs/design/05wbr_policy.txt       2022-11-05 23:02:18.959222617 +0100
 @@ -0,0 +1,64 @@
 +
 +# Copyright (C) 2005-2022 Junjiro R. Okajima
@@ -1812,7 +1792,7 @@ diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/05wbr_policy.tx
 +  copyup policy.
 diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/06dirren.dot linux/Documentation/filesystems/aufs/design/06dirren.dot
 --- /usr/share/empty/Documentation/filesystems/aufs/design/06dirren.dot        1970-01-01 01:00:00.000000000 +0100
-+++ linux/Documentation/filesystems/aufs/design/06dirren.dot   2023-04-07 12:29:13.123045930 +0200
++++ linux/Documentation/filesystems/aufs/design/06dirren.dot   2022-11-05 23:02:18.959222617 +0100
 @@ -0,0 +1,44 @@
 +
 +// to view this graph, run dot(1) command in GRAPHVIZ.
@@ -1860,7 +1840,7 @@ diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/06dirren.dot li
 +}
 diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/06dirren.txt linux/Documentation/filesystems/aufs/design/06dirren.txt
 --- /usr/share/empty/Documentation/filesystems/aufs/design/06dirren.txt        1970-01-01 01:00:00.000000000 +0100
-+++ linux/Documentation/filesystems/aufs/design/06dirren.txt   2023-04-07 12:29:13.123045930 +0200
++++ linux/Documentation/filesystems/aufs/design/06dirren.txt   2022-11-05 23:02:18.959222617 +0100
 @@ -0,0 +1,102 @@
 +
 +# Copyright (C) 2017-2022 Junjiro R. Okajima
@@ -1966,7 +1946,7 @@ diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/06dirren.txt li
 +equivalen to udba=reval case.
 diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/06fhsm.txt linux/Documentation/filesystems/aufs/design/06fhsm.txt
 --- /usr/share/empty/Documentation/filesystems/aufs/design/06fhsm.txt  1970-01-01 01:00:00.000000000 +0100
-+++ linux/Documentation/filesystems/aufs/design/06fhsm.txt     2023-04-07 12:29:13.123045930 +0200
++++ linux/Documentation/filesystems/aufs/design/06fhsm.txt     2022-11-05 23:02:18.959222617 +0100
 @@ -0,0 +1,118 @@
 +
 +# Copyright (C) 2011-2022 Junjiro R. Okajima
@@ -2088,7 +2068,7 @@ diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/06fhsm.txt linu
 +should restore the original file state after an error happens.
 diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/06mmap.txt linux/Documentation/filesystems/aufs/design/06mmap.txt
 --- /usr/share/empty/Documentation/filesystems/aufs/design/06mmap.txt  1970-01-01 01:00:00.000000000 +0100
-+++ linux/Documentation/filesystems/aufs/design/06mmap.txt     2023-04-07 12:29:13.123045930 +0200
++++ linux/Documentation/filesystems/aufs/design/06mmap.txt     2022-11-05 23:02:18.959222617 +0100
 @@ -0,0 +1,72 @@
 +
 +# Copyright (C) 2005-2022 Junjiro R. Okajima
@@ -2164,7 +2144,7 @@ diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/06mmap.txt linu
 +I have to give up this "looks-smater" approach.
 diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/06xattr.txt linux/Documentation/filesystems/aufs/design/06xattr.txt
 --- /usr/share/empty/Documentation/filesystems/aufs/design/06xattr.txt 1970-01-01 01:00:00.000000000 +0100
-+++ linux/Documentation/filesystems/aufs/design/06xattr.txt    2023-04-07 12:29:13.123045930 +0200
++++ linux/Documentation/filesystems/aufs/design/06xattr.txt    2022-11-05 23:02:18.959222617 +0100
 @@ -0,0 +1,94 @@
 +
 +# Copyright (C) 2014-2022 Junjiro R. Okajima
@@ -2262,7 +2242,7 @@ diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/06xattr.txt lin
 +now, aufs implements the branch attributes to ignore the error.
 diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/07export.txt linux/Documentation/filesystems/aufs/design/07export.txt
 --- /usr/share/empty/Documentation/filesystems/aufs/design/07export.txt        1970-01-01 01:00:00.000000000 +0100
-+++ linux/Documentation/filesystems/aufs/design/07export.txt   2023-04-07 12:29:13.123045930 +0200
++++ linux/Documentation/filesystems/aufs/design/07export.txt   2022-11-05 23:02:18.959222617 +0100
 @@ -0,0 +1,58 @@
 +
 +# Copyright (C) 2005-2022 Junjiro R. Okajima
@@ -2324,7 +2304,7 @@ diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/07export.txt li
 +  lookup_one_len(), vfs_getattr(), encode_fh() and others.
 diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/08shwh.txt linux/Documentation/filesystems/aufs/design/08shwh.txt
 --- /usr/share/empty/Documentation/filesystems/aufs/design/08shwh.txt  1970-01-01 01:00:00.000000000 +0100
-+++ linux/Documentation/filesystems/aufs/design/08shwh.txt     2023-04-07 12:29:13.123045930 +0200
++++ linux/Documentation/filesystems/aufs/design/08shwh.txt     2022-11-05 23:02:18.959222617 +0100
 @@ -0,0 +1,52 @@
 +
 +# Copyright (C) 2005-2022 Junjiro R. Okajima
@@ -2380,7 +2360,7 @@ diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/08shwh.txt linu
 +initramfs will use it to replace the old one at the next boot.
 diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/10dynop.txt linux/Documentation/filesystems/aufs/design/10dynop.txt
 --- /usr/share/empty/Documentation/filesystems/aufs/design/10dynop.txt 1970-01-01 01:00:00.000000000 +0100
-+++ linux/Documentation/filesystems/aufs/design/10dynop.txt    2023-04-07 12:29:13.123045930 +0200
++++ linux/Documentation/filesystems/aufs/design/10dynop.txt    2022-11-05 23:02:18.959222617 +0100
 @@ -0,0 +1,47 @@
 +
 +# Copyright (C) 2010-2022 Junjiro R. Okajima
@@ -2431,8 +2411,8 @@ diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/10dynop.txt lin
 +regular files only.
 diff -urN /usr/share/empty/Documentation/filesystems/aufs/README linux/Documentation/filesystems/aufs/README
 --- /usr/share/empty/Documentation/filesystems/aufs/README     1970-01-01 01:00:00.000000000 +0100
-+++ linux/Documentation/filesystems/aufs/README        2023-04-07 12:29:13.123045930 +0200
-@@ -0,0 +1,408 @@
++++ linux/Documentation/filesystems/aufs/README        2023-09-02 12:00:06.376642958 +0200
+@@ -0,0 +1,409 @@
 +
 +Aufs6 -- advanced multi layered unification filesystem version 6.x
 +http://aufs.sf.net
@@ -2823,7 +2803,8 @@ diff -urN /usr/share/empty/Documentation/filesystems/aufs/README linux/Documenta
 +James Burry made a donation (2016/12).
 +Carsten Rose made a donation (2018/9).
 +Porteus Kiosk made a donation (2018/10).
-+Enya Quetzalli Gomez Rodriguez made a donation (2022/5).
++huronOS team: Enya Quetzalli made donations (2022/5, 2023/5 and 8).
++Vasily Mikhaylichenko made a donation (2023/5).
 +
 +Thank you very much.
 +Donations are always, including future donations, very important and
@@ -2843,7 +2824,7 @@ diff -urN /usr/share/empty/Documentation/filesystems/aufs/README linux/Documenta
 +# End: ;
 diff -urN /usr/share/empty/fs/aufs/aufs.h linux/fs/aufs/aufs.h
 --- /usr/share/empty/fs/aufs/aufs.h    1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/aufs.h       2023-04-07 12:29:13.126380830 +0200
++++ linux/fs/aufs/aufs.h       2022-11-05 23:02:18.959222617 +0100
 @@ -0,0 +1,62 @@
 +/* SPDX-License-Identifier: GPL-2.0 */
 +/*
@@ -2909,7 +2890,7 @@ diff -urN /usr/share/empty/fs/aufs/aufs.h linux/fs/aufs/aufs.h
 +#endif /* __AUFS_H__ */
 diff -urN /usr/share/empty/fs/aufs/branch.c linux/fs/aufs/branch.c
 --- /usr/share/empty/fs/aufs/branch.c  1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/branch.c     2023-04-07 12:29:13.126380830 +0200
++++ linux/fs/aufs/branch.c     2024-03-10 23:40:47.083143450 +0100
 @@ -0,0 +1,1427 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
@@ -4206,7 +4187,7 @@ diff -urN /usr/share/empty/fs/aufs/branch.c linux/fs/aufs/branch.c
 +                      if (hf->f_mode & FMODE_READ)
 +                              i_readcount_inc(h_inode);
 +                      put_write_access(h_inode);
-+                      __mnt_drop_write(hf->f_path.mnt);
++                      mnt_put_write_access(hf->f_path.mnt);
 +              }
 +      }
 +
@@ -4340,7 +4321,7 @@ diff -urN /usr/share/empty/fs/aufs/branch.c linux/fs/aufs/branch.c
 +}
 diff -urN /usr/share/empty/fs/aufs/branch.h linux/fs/aufs/branch.h
 --- /usr/share/empty/fs/aufs/branch.h  1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/branch.h     2023-04-07 12:29:13.126380830 +0200
++++ linux/fs/aufs/branch.h     2023-10-31 09:31:04.196547417 +0100
 @@ -0,0 +1,375 @@
 +/* SPDX-License-Identifier: GPL-2.0 */
 +/*
@@ -4490,9 +4471,9 @@ diff -urN /usr/share/empty/fs/aufs/branch.h linux/fs/aufs/branch.h
 +      return br->br_path.dentry;
 +}
 +
-+static inline struct user_namespace *au_br_userns(struct au_branch *br)
++static inline struct mnt_idmap *au_br_idmap(struct au_branch *br)
 +{
-+      return mnt_user_ns(br->br_path.mnt);
++      return mnt_idmap(br->br_path.mnt);
 +}
 +
 +static inline struct super_block *au_br_sb(struct au_branch *br)
@@ -4654,9 +4635,9 @@ diff -urN /usr/share/empty/fs/aufs/branch.h linux/fs/aufs/branch.h
 +}
 +
 +static inline
-+struct user_namespace *au_sbr_userns(struct super_block *sb, aufs_bindex_t bindex)
++struct mnt_idmap *au_sbr_idmap(struct super_block *sb, aufs_bindex_t bindex)
 +{
-+      return au_br_userns(au_sbr(sb, bindex));
++      return au_br_idmap(au_sbr(sb, bindex));
 +}
 +
 +static inline
@@ -4719,7 +4700,7 @@ diff -urN /usr/share/empty/fs/aufs/branch.h linux/fs/aufs/branch.h
 +#endif /* __AUFS_BRANCH_H__ */
 diff -urN /usr/share/empty/fs/aufs/conf.mk linux/fs/aufs/conf.mk
 --- /usr/share/empty/fs/aufs/conf.mk   1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/conf.mk      2023-04-07 12:29:13.126380830 +0200
++++ linux/fs/aufs/conf.mk      2022-11-05 23:02:18.959222617 +0100
 @@ -0,0 +1,40 @@
 +# SPDX-License-Identifier: GPL-2.0
 +
@@ -4763,7 +4744,7 @@ diff -urN /usr/share/empty/fs/aufs/conf.mk linux/fs/aufs/conf.mk
 +-include ${srctree}/${src}/conf_priv.mk
 diff -urN /usr/share/empty/fs/aufs/cpup.c linux/fs/aufs/cpup.c
 --- /usr/share/empty/fs/aufs/cpup.c    1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/cpup.c       2023-04-07 12:29:13.126380830 +0200
++++ linux/fs/aufs/cpup.c       2024-03-10 23:40:47.083143450 +0100
 @@ -0,0 +1,1459 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
@@ -4900,8 +4881,8 @@ diff -urN /usr/share/empty/fs/aufs/cpup.c linux/fs/aufs/cpup.c
 +      dt->dt_dentry = dentry;
 +      dt->dt_h_path = *h_path;
 +      h_inode = d_inode(h_path->dentry);
-+      dt->dt_atime = h_inode->i_atime;
-+      dt->dt_mtime = h_inode->i_mtime;
++      dt->dt_atime = inode_get_atime(h_inode);
++      dt->dt_mtime = inode_get_mtime(h_inode);
 +      /* smp_mb(); */
 +}
 +
@@ -4967,8 +4948,8 @@ diff -urN /usr/share/empty/fs/aufs/cpup.c linux/fs/aufs/cpup.c
 +      } else {
 +              ia.ia_uid = h_isrc->i_uid;
 +              ia.ia_gid = h_isrc->i_gid;
-+              ia.ia_atime = h_isrc->i_atime;
-+              ia.ia_mtime = h_isrc->i_mtime;
++              ia.ia_atime = inode_get_atime(h_isrc);
++              ia.ia_mtime = inode_get_mtime(h_isrc);
 +              if (h_idst->i_mode != h_isrc->i_mode
 +                  && !S_ISLNK(h_idst->i_mode)) {
 +                      ia.ia_valid |= ATTR_MODE;
@@ -5361,18 +5342,18 @@ diff -urN /usr/share/empty/fs/aufs/cpup.c linux/fs/aufs/cpup.c
 +      int err;
 +      struct dentry *h_dentry;
 +      /* struct inode *h_inode; */
-+      struct user_namespace *h_userns;
++      struct mnt_idmap *h_idmap;
 +
-+      h_userns = mnt_user_ns(h_path->mnt);
++      h_idmap = mnt_idmap(h_path->mnt);
 +      h_dentry = h_path->dentry;
 +      /* h_inode = d_inode(h_dentry); */
 +      /* forget_all_cached_acls(h_inode)); */
-+      err = vfsub_remove_acl(h_userns, h_dentry, XATTR_NAME_POSIX_ACL_ACCESS);
++      err = vfsub_remove_acl(h_idmap, h_dentry, XATTR_NAME_POSIX_ACL_ACCESS);
 +      AuTraceErr(err);
 +      if (err == -EOPNOTSUPP)
 +              err = 0;
 +      if (!err)
-+              err = vfsub_acl_chmod(h_userns, h_dentry, mode);
++              err = vfsub_acl_chmod(h_idmap, h_dentry, mode);
 +
 +      AuTraceErr(err);
 +      return err;
@@ -5383,10 +5364,10 @@ diff -urN /usr/share/empty/fs/aufs/cpup.c linux/fs/aufs/cpup.c
 +{
 +      int err;
 +      struct inode *dir, *inode;
-+      struct user_namespace *h_userns;
++      struct mnt_idmap *h_idmap;
 +
-+      h_userns = mnt_user_ns(h_path->mnt);
-+      err = vfsub_remove_acl(h_userns, h_path->dentry,
++      h_idmap = mnt_idmap(h_path->mnt);
++      err = vfsub_remove_acl(h_idmap, h_path->dentry,
 +                             XATTR_NAME_POSIX_ACL_DEFAULT);
 +      AuTraceErr(err);
 +      if (err == -EOPNOTSUPP)
@@ -5866,7 +5847,7 @@ diff -urN /usr/share/empty/fs/aufs/cpup.c linux/fs/aufs/cpup.c
 +      struct dentry *dentry, *parent;
 +      struct file *h_file;
 +      struct inode *h_dir;
-+      struct user_namespace *h_userns;
++      struct mnt_idmap *h_idmap;
 +
 +      dentry = cpg->dentry;
 +      h_file = NULL;
@@ -5880,8 +5861,8 @@ diff -urN /usr/share/empty/fs/aufs/cpup.c linux/fs/aufs/cpup.c
 +
 +      parent = dget_parent(dentry);
 +      h_dir = au_h_iptr(d_inode(parent), cpg->bdst);
-+      h_userns = au_sbr_userns(dentry->d_sb, cpg->bdst);
-+      if (!au_test_h_perm_sio(h_userns, h_dir, MAY_EXEC | MAY_WRITE)
++      h_idmap = au_sbr_idmap(dentry->d_sb, cpg->bdst);
++      if (!au_test_h_perm_sio(h_idmap, h_dir, MAY_EXEC | MAY_WRITE)
 +          && !au_cpup_sio_test(cpg->pin, d_inode(dentry)->i_mode))
 +              err = au_cpup_simple(cpg);
 +      else {
@@ -6051,7 +6032,7 @@ diff -urN /usr/share/empty/fs/aufs/cpup.c linux/fs/aufs/cpup.c
 +      struct inode *dir, *h_dir, *h_tmpdir;
 +      struct au_wbr *wbr;
 +      struct au_pin wh_pin, *pin_orig;
-+      struct user_namespace *h_userns;
++      struct mnt_idmap *h_idmap;
 +
 +      dentry = cpg->dentry;
 +      bdst = cpg->bdst;
@@ -6080,8 +6061,8 @@ diff -urN /usr/share/empty/fs/aufs/cpup.c linux/fs/aufs/cpup.c
 +              cpg->pin = &wh_pin;
 +      }
 +
-+      h_userns = au_sbr_userns(dentry->d_sb, bdst);
-+      if (!au_test_h_perm_sio(h_userns, h_tmpdir, MAY_EXEC | MAY_WRITE)
++      h_idmap = au_sbr_idmap(dentry->d_sb, bdst);
++      if (!au_test_h_perm_sio(h_idmap, h_tmpdir, MAY_EXEC | MAY_WRITE)
 +          && !au_cpup_sio_test(cpg->pin, d_inode(dentry)->i_mode))
 +              err = au_cpup_wh(cpg, file);
 +      else {
@@ -6226,7 +6207,7 @@ diff -urN /usr/share/empty/fs/aufs/cpup.c linux/fs/aufs/cpup.c
 +}
 diff -urN /usr/share/empty/fs/aufs/cpup.h linux/fs/aufs/cpup.h
 --- /usr/share/empty/fs/aufs/cpup.h    1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/cpup.h       2023-04-07 12:29:13.126380830 +0200
++++ linux/fs/aufs/cpup.h       2024-03-10 23:40:47.083143450 +0100
 @@ -0,0 +1,100 @@
 +/* SPDX-License-Identifier: GPL-2.0 */
 +/*
@@ -6279,15 +6260,15 @@ diff -urN /usr/share/empty/fs/aufs/cpup.h linux/fs/aufs/cpup.h
 +};
 +
 +/* cpup flags */
-+#define AuCpup_DTIME          1               /* do dtime_store/revert */
-+#define AuCpup_KEEPLINO               (1 << 1)        /* do not clear the lower xino,
++#define AuCpup_DTIME          BIT(0)          /* do dtime_store/revert */
++#define AuCpup_KEEPLINO               BIT(1)          /* do not clear the lower xino,
 +                                                 for link(2) */
-+#define AuCpup_RENAME         (1 << 2)        /* rename after cpup */
-+#define AuCpup_HOPEN          (1 << 3)        /* call h_open_pre/post() in
++#define AuCpup_RENAME         BIT(2)          /* rename after cpup */
++#define AuCpup_HOPEN          BIT(3)          /* call h_open_pre/post() in
 +                                                 cpup */
-+#define AuCpup_OVERWRITE      (1 << 4)        /* allow overwriting the
++#define AuCpup_OVERWRITE      BIT(4)          /* allow overwriting the
 +                                                 existing entry */
-+#define AuCpup_RWDST          (1 << 5)        /* force write target even if
++#define AuCpup_RWDST          BIT(5)          /* force write target even if
 +                                                 the branch is marked as RO */
 +
 +#ifndef CONFIG_AUFS_BR_HFSPLUS
@@ -6330,7 +6311,7 @@ diff -urN /usr/share/empty/fs/aufs/cpup.h linux/fs/aufs/cpup.h
 +#endif /* __AUFS_CPUP_H__ */
 diff -urN /usr/share/empty/fs/aufs/dbgaufs.c linux/fs/aufs/dbgaufs.c
 --- /usr/share/empty/fs/aufs/dbgaufs.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/dbgaufs.c    2023-04-07 12:29:13.126380830 +0200
++++ linux/fs/aufs/dbgaufs.c    2023-10-10 22:51:18.033248030 +0200
 @@ -0,0 +1,526 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
@@ -6498,7 +6479,7 @@ diff -urN /usr/share/empty/fs/aufs/dbgaufs.c linux/fs/aufs/dbgaufs.c
 +      } else {
 +#define str "1\n0\n0\n"
 +              p->n = sizeof(str) - 1;
-+              strcpy(p->a, str);
++              strscpy(p->a, str, sizeof(str));
 +#undef str
 +      }
 +      si_read_unlock(sb);
@@ -6860,7 +6841,7 @@ diff -urN /usr/share/empty/fs/aufs/dbgaufs.c linux/fs/aufs/dbgaufs.c
 +}
 diff -urN /usr/share/empty/fs/aufs/dbgaufs.h linux/fs/aufs/dbgaufs.h
 --- /usr/share/empty/fs/aufs/dbgaufs.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/dbgaufs.h    2023-04-07 12:29:13.126380830 +0200
++++ linux/fs/aufs/dbgaufs.h    2022-11-05 23:02:18.962555950 +0100
 @@ -0,0 +1,53 @@
 +/* SPDX-License-Identifier: GPL-2.0 */
 +/*
@@ -6917,7 +6898,7 @@ diff -urN /usr/share/empty/fs/aufs/dbgaufs.h linux/fs/aufs/dbgaufs.h
 +#endif /* __DBGAUFS_H__ */
 diff -urN /usr/share/empty/fs/aufs/dcsub.c linux/fs/aufs/dcsub.c
 --- /usr/share/empty/fs/aufs/dcsub.c   1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/dcsub.c      2023-04-07 12:29:13.126380830 +0200
++++ linux/fs/aufs/dcsub.c      2022-11-05 23:02:18.962555950 +0100
 @@ -0,0 +1,225 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
@@ -7146,7 +7127,7 @@ diff -urN /usr/share/empty/fs/aufs/dcsub.c linux/fs/aufs/dcsub.c
 +}
 diff -urN /usr/share/empty/fs/aufs/dcsub.h linux/fs/aufs/dcsub.h
 --- /usr/share/empty/fs/aufs/dcsub.h   1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/dcsub.h      2023-04-07 12:29:13.126380830 +0200
++++ linux/fs/aufs/dcsub.h      2022-11-05 23:02:18.962555950 +0100
 @@ -0,0 +1,137 @@
 +/* SPDX-License-Identifier: GPL-2.0 */
 +/*
@@ -7287,8 +7268,8 @@ diff -urN /usr/share/empty/fs/aufs/dcsub.h linux/fs/aufs/dcsub.h
 +#endif /* __AUFS_DCSUB_H__ */
 diff -urN /usr/share/empty/fs/aufs/debug.c linux/fs/aufs/debug.c
 --- /usr/share/empty/fs/aufs/debug.c   1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/debug.c      2023-04-07 12:29:13.126380830 +0200
-@@ -0,0 +1,446 @@
++++ linux/fs/aufs/debug.c      2023-10-31 09:31:04.196547417 +0100
+@@ -0,0 +1,448 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
 + * Copyright (C) 2005-2022 Junjiro R. Okajima
@@ -7403,6 +7384,7 @@ diff -urN /usr/share/empty/fs/aufs/debug.c linux/fs/aufs/debug.c
 +{
 +      char *n = NULL;
 +      int l = 0;
++      struct timespec64 ctime;
 +
 +      if (!inode || IS_ERR(inode)) {
 +              dpri("i%d: err %ld\n", bindex, PTR_ERR(inode));
@@ -7417,6 +7399,7 @@ diff -urN /usr/share/empty/fs/aufs/debug.c linux/fs/aufs/debug.c
 +              l = wh->d_name.len;
 +      }
 +
++      ctime = inode_get_ctime(inode);
 +      dpri("i%d: %p, i%lu, %s, cnt %d, nl %u, 0%o, sz %llu, blk %llu,"
 +           " acl %p, def_acl %p,"
 +           " hn %d, ct %lld, np %lu, st 0x%lx, f 0x%x, v %llu, g %x%s%.*s\n",
@@ -7425,7 +7408,7 @@ diff -urN /usr/share/empty/fs/aufs/debug.c linux/fs/aufs/debug.c
 +           atomic_read(&inode->i_count), inode->i_nlink, inode->i_mode,
 +           i_size_read(inode), (unsigned long long)inode->i_blocks,
 +           inode->i_acl, inode->i_default_acl,
-+           hn, (long long)timespec64_to_ns(&inode->i_ctime) & 0x0ffff,
++           hn, (long long)timespec64_to_ns(&ctime) & 0x0ffff,
 +           inode->i_mapping ? inode->i_mapping->nrpages : 0,
 +           inode->i_state, inode->i_flags, inode_peek_iversion(inode),
 +           inode->i_generation,
@@ -7737,7 +7720,7 @@ diff -urN /usr/share/empty/fs/aufs/debug.c linux/fs/aufs/debug.c
 +}
 diff -urN /usr/share/empty/fs/aufs/debug.h linux/fs/aufs/debug.h
 --- /usr/share/empty/fs/aufs/debug.h   1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/debug.h      2023-04-07 12:29:13.126380830 +0200
++++ linux/fs/aufs/debug.h      2022-11-05 23:02:18.962555950 +0100
 @@ -0,0 +1,226 @@
 +/* SPDX-License-Identifier: GPL-2.0 */
 +/*
@@ -7967,7 +7950,7 @@ diff -urN /usr/share/empty/fs/aufs/debug.h linux/fs/aufs/debug.h
 +#endif /* __AUFS_DEBUG_H__ */
 diff -urN /usr/share/empty/fs/aufs/dentry.c linux/fs/aufs/dentry.c
 --- /usr/share/empty/fs/aufs/dentry.c  1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/dentry.c     2023-04-07 12:29:13.126380830 +0200
++++ linux/fs/aufs/dentry.c     2023-10-31 09:31:04.196547417 +0100
 @@ -0,0 +1,1168 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
@@ -8005,7 +7988,7 @@ diff -urN /usr/share/empty/fs/aufs/dentry.c linux/fs/aufs/dentry.c
 +      struct dentry *h_dentry;
 +      struct inode *h_inode;
 +      struct au_branch *br;
-+      struct user_namespace *h_userns;
++      struct mnt_idmap *h_idmap;
 +      struct path h_path;
 +      int wh_found, opq;
 +      unsigned char wh_able;
@@ -8017,10 +8000,10 @@ diff -urN /usr/share/empty/fs/aufs/dentry.c linux/fs/aufs/dentry.c
 +      br = au_sbr(dentry->d_sb, bindex);
 +      h_path.dentry = h_parent;
 +      h_path.mnt = au_br_mnt(br);
-+      h_userns = au_br_userns(br);
++      h_idmap = au_br_idmap(br);
 +      wh_able = !!au_br_whable(br->br_perm);
 +      if (wh_able)
-+              wh_found = au_wh_test(h_userns, &h_path, &args->whname,
++              wh_found = au_wh_test(h_idmap, &h_path, &args->whname,
 +                                    ignore_perm);
 +      h_dentry = ERR_PTR(wh_found);
 +      if (!wh_found)
@@ -8038,7 +8021,7 @@ diff -urN /usr/share/empty/fs/aufs/dentry.c linux/fs/aufs/dentry.c
 +      if (!ignore_perm)
 +              h_dentry = vfsub_lkup_one(args->name, &h_path);
 +      else
-+              h_dentry = au_sio_lkup_one(h_userns, args->name, &h_path);
++              h_dentry = au_sio_lkup_one(h_idmap, args->name, &h_path);
 +      if (IS_ERR(h_dentry)) {
 +              if (PTR_ERR(h_dentry) == -ENAMETOOLONG
 +                  && !allow_neg)
@@ -8074,7 +8057,7 @@ diff -urN /usr/share/empty/fs/aufs/dentry.c linux/fs/aufs/dentry.c
 +
 +      h_path.dentry = h_dentry;
 +      inode_lock_shared_nested(h_inode, AuLsc_I_CHILD);
-+      opq = au_diropq_test(h_userns, &h_path);
++      opq = au_diropq_test(h_idmap, &h_path);
 +      inode_unlock_shared(h_inode);
 +      if (opq > 0)
 +              au_set_dbdiropq(dentry, bindex);
@@ -8219,13 +8202,13 @@ diff -urN /usr/share/empty/fs/aufs/dentry.c linux/fs/aufs/dentry.c
 +      return err;
 +}
 +
-+struct dentry *au_sio_lkup_one(struct user_namespace *userns, struct qstr *name,
++struct dentry *au_sio_lkup_one(struct mnt_idmap *idmap, struct qstr *name,
 +                             struct path *ppath)
 +{
 +      struct dentry *dentry;
 +      int wkq_err;
 +
-+      if (!au_test_h_perm_sio(userns, d_inode(ppath->dentry), MAY_EXEC))
++      if (!au_test_h_perm_sio(idmap, d_inode(ppath->dentry), MAY_EXEC))
 +              dentry = vfsub_lkup_one(name, ppath);
 +      else {
 +              struct vfsub_lkup_one_args args = {
@@ -8250,18 +8233,18 @@ diff -urN /usr/share/empty/fs/aufs/dentry.c linux/fs/aufs/dentry.c
 +      int err;
 +      struct dentry *parent, *h_dentry;
 +      struct au_branch *br;
-+      struct user_namespace *h_userns;
++      struct mnt_idmap *h_idmap;
 +      struct path h_ppath;
 +
 +      parent = dget_parent(dentry);
 +      br = au_sbr(dentry->d_sb, bindex);
 +      h_ppath.dentry = au_h_dptr(parent, bindex);
 +      h_ppath.mnt = au_br_mnt(br);
-+      h_userns = au_br_userns(br);
++      h_idmap = au_br_idmap(br);
 +      if (wh)
 +              h_dentry = au_whtmp_lkup(h_ppath.dentry, br, &dentry->d_name);
 +      else
-+              h_dentry = au_sio_lkup_one(h_userns, &dentry->d_name, &h_ppath);
++              h_dentry = au_sio_lkup_one(h_idmap, &dentry->d_name, &h_ppath);
 +      err = PTR_ERR(h_dentry);
 +      if (IS_ERR(h_dentry))
 +              goto out;
@@ -9139,7 +9122,7 @@ diff -urN /usr/share/empty/fs/aufs/dentry.c linux/fs/aufs/dentry.c
 +};
 diff -urN /usr/share/empty/fs/aufs/dentry.h linux/fs/aufs/dentry.h
 --- /usr/share/empty/fs/aufs/dentry.h  1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/dentry.h     2023-04-07 12:29:13.126380830 +0200
++++ linux/fs/aufs/dentry.h     2024-03-10 23:40:47.083143450 +0100
 @@ -0,0 +1,270 @@
 +/* SPDX-License-Identifier: GPL-2.0 */
 +/*
@@ -9191,9 +9174,9 @@ diff -urN /usr/share/empty/fs/aufs/dentry.h linux/fs/aufs/dentry.h
 +/* ---------------------------------------------------------------------- */
 +
 +/* flags for au_lkup_dentry() */
-+#define AuLkup_ALLOW_NEG      1
-+#define AuLkup_IGNORE_PERM    (1 << 1)
-+#define AuLkup_DIRREN         (1 << 2)
++#define AuLkup_ALLOW_NEG      BIT(0)
++#define AuLkup_IGNORE_PERM    BIT(1)
++#define AuLkup_DIRREN         BIT(2)
 +#define au_ftest_lkup(flags, name)    ((flags) & AuLkup_##name)
 +#define au_fset_lkup(flags, name) \
 +      do { (flags) |= AuLkup_##name; } while (0)
@@ -9217,7 +9200,7 @@ diff -urN /usr/share/empty/fs/aufs/dentry.h linux/fs/aufs/dentry.h
 +/* dentry.c */
 +extern const struct dentry_operations aufs_dop, aufs_dop_noreval;
 +struct au_branch;
-+struct dentry *au_sio_lkup_one(struct user_namespace *userns, struct qstr *name,
++struct dentry *au_sio_lkup_one(struct mnt_idmap *idmap, struct qstr *name,
 +                             struct path *ppath);
 +int au_h_verify(struct dentry *h_dentry, unsigned int udba, struct inode *h_dir,
 +              struct dentry *h_parent, struct au_branch *br);
@@ -9413,7 +9396,7 @@ diff -urN /usr/share/empty/fs/aufs/dentry.h linux/fs/aufs/dentry.h
 +#endif /* __AUFS_DENTRY_H__ */
 diff -urN /usr/share/empty/fs/aufs/dinfo.c linux/fs/aufs/dinfo.c
 --- /usr/share/empty/fs/aufs/dinfo.c   1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/dinfo.c      2023-04-07 12:29:13.126380830 +0200
++++ linux/fs/aufs/dinfo.c      2022-12-17 09:21:34.796521861 +0100
 @@ -0,0 +1,555 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
@@ -9972,8 +9955,8 @@ diff -urN /usr/share/empty/fs/aufs/dinfo.c linux/fs/aufs/dinfo.c
 +}
 diff -urN /usr/share/empty/fs/aufs/dir.c linux/fs/aufs/dir.c
 --- /usr/share/empty/fs/aufs/dir.c     1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/dir.c        2023-04-07 12:29:13.126380830 +0200
-@@ -0,0 +1,765 @@
++++ linux/fs/aufs/dir.c        2024-03-10 23:40:47.083143450 +0100
+@@ -0,0 +1,767 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
 + * Copyright (C) 2005-2022 Junjiro R. Okajima
@@ -10083,6 +10066,7 @@ diff -urN /usr/share/empty/fs/aufs/dir.c linux/fs/aufs/dir.c
 +      struct au_dir_ts_arg *a = arg;
 +      struct au_dtime dt;
 +      struct path h_path;
++      struct timespec64 ts;
 +      struct inode *dir, *h_dir;
 +      struct super_block *sb;
 +      struct au_branch *br;
@@ -10120,8 +10104,9 @@ diff -urN /usr/share/empty/fs/aufs/dir.c linux/fs/aufs/dir.c
 +      hdir = au_hi(dir, btop);
 +      au_hn_inode_lock_nested(hdir, AuLsc_I_PARENT);
 +      h_dir = au_h_iptr(dir, btop);
++      ts = inode_get_mtime(h_dir);
 +      if (h_dir->i_nlink
-+          && timespec64_compare(&h_dir->i_mtime, &dt.dt_mtime) < 0) {
++          && timespec64_compare(&ts, &dt.dt_mtime) < 0) {
 +              dt.dt_h_path = h_path;
 +              au_dtime_revert(&dt);
 +      }
@@ -10503,9 +10488,9 @@ diff -urN /usr/share/empty/fs/aufs/dir.c linux/fs/aufs/dir.c
 +
 +/* ---------------------------------------------------------------------- */
 +
-+#define AuTestEmpty_WHONLY    1
-+#define AuTestEmpty_CALLED    (1 << 1)
-+#define AuTestEmpty_SHWH      (1 << 2)
++#define AuTestEmpty_WHONLY    BIT(0)
++#define AuTestEmpty_CALLED    BIT(1)
++#define AuTestEmpty_SHWH      BIT(2)
 +#define au_ftest_testempty(flags, name)       ((flags) & AuTestEmpty_##name)
 +#define au_fset_testempty(flags, name) \
 +      do { (flags) |= AuTestEmpty_##name; } while (0)
@@ -10613,14 +10598,14 @@ diff -urN /usr/share/empty/fs/aufs/dir.c linux/fs/aufs/dir.c
 +      int err, wkq_err;
 +      struct dentry *h_dentry;
 +      struct inode *h_inode;
-+      struct user_namespace *h_userns;
++      struct mnt_idmap *h_idmap;
 +
-+      h_userns = au_sbr_userns(dentry->d_sb, arg->bindex);
++      h_idmap = au_sbr_idmap(dentry->d_sb, arg->bindex);
 +      h_dentry = au_h_dptr(dentry, arg->bindex);
 +      h_inode = d_inode(h_dentry);
 +      /* todo: i_mode changes anytime? */
 +      inode_lock_shared_nested(h_inode, AuLsc_I_CHILD);
-+      err = au_test_h_perm_sio(h_userns, h_inode, MAY_EXEC | MAY_READ);
++      err = au_test_h_perm_sio(h_idmap, h_inode, MAY_EXEC | MAY_READ);
 +      inode_unlock_shared(h_inode);
 +      if (!err)
 +              err = do_test_empty(dentry, arg);
@@ -10741,7 +10726,7 @@ diff -urN /usr/share/empty/fs/aufs/dir.c linux/fs/aufs/dir.c
 +};
 diff -urN /usr/share/empty/fs/aufs/dir.h linux/fs/aufs/dir.h
 --- /usr/share/empty/fs/aufs/dir.h     1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/dir.h        2023-04-07 12:29:13.126380830 +0200
++++ linux/fs/aufs/dir.h        2022-11-05 23:02:18.962555950 +0100
 @@ -0,0 +1,134 @@
 +/* SPDX-License-Identifier: GPL-2.0 */
 +/*
@@ -10879,7 +10864,7 @@ diff -urN /usr/share/empty/fs/aufs/dir.h linux/fs/aufs/dir.h
 +#endif /* __AUFS_DIR_H__ */
 diff -urN /usr/share/empty/fs/aufs/dirren.c linux/fs/aufs/dirren.c
 --- /usr/share/empty/fs/aufs/dirren.c  1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/dirren.c     2023-04-07 12:29:13.126380830 +0200
++++ linux/fs/aufs/dirren.c     2023-10-10 22:51:18.033248030 +0200
 @@ -0,0 +1,1315 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
@@ -11618,7 +11603,7 @@ diff -urN /usr/share/empty/fs/aufs/dirren.c linux/fs/aufs/dirren.c
 +
 +      memset(w, 0, sizeof(*w));
 +      w->allocated = roundup_pow_of_two(sizeof(*w->fdata) + 40);
-+      strcpy(w->whname, AUFS_WH_DR_INFO_PFX);
++      strscpy(w->whname, AUFS_WH_DR_INFO_PFX, sizeof(AUFS_WH_DR_INFO_PFX));
 +      w->infoname = w->whname + sizeof(AUFS_WH_DR_INFO_PFX) - 1;
 +      w->infonamelen = sizeof(w->whname) - sizeof(AUFS_WH_DR_INFO_PFX);
 +      w->btgt = btgt;
@@ -12198,7 +12183,7 @@ diff -urN /usr/share/empty/fs/aufs/dirren.c linux/fs/aufs/dirren.c
 +}
 diff -urN /usr/share/empty/fs/aufs/dirren.h linux/fs/aufs/dirren.h
 --- /usr/share/empty/fs/aufs/dirren.h  1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/dirren.h     2023-04-07 12:29:13.126380830 +0200
++++ linux/fs/aufs/dirren.h     2022-11-05 23:02:18.962555950 +0100
 @@ -0,0 +1,140 @@
 +/* SPDX-License-Identifier: GPL-2.0 */
 +/*
@@ -12342,7 +12327,7 @@ diff -urN /usr/share/empty/fs/aufs/dirren.h linux/fs/aufs/dirren.h
 +#endif /* __AUFS_DIRREN_H__ */
 diff -urN /usr/share/empty/fs/aufs/dynop.c linux/fs/aufs/dynop.c
 --- /usr/share/empty/fs/aufs/dynop.c   1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/dynop.c      2023-04-07 12:29:13.126380830 +0200
++++ linux/fs/aufs/dynop.c      2024-03-10 23:40:47.083143450 +0100
 @@ -0,0 +1,366 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
@@ -12538,7 +12523,7 @@ diff -urN /usr/share/empty/fs/aufs/dynop.c linux/fs/aufs/dynop.c
 +      DySetAop(launder_folio);
 +      DySetAop(is_partially_uptodate);
 +      DySetAop(is_dirty_writeback);
-+      DySetAop(error_remove_page);
++      DySetAop(error_remove_folio);
 +      DySetAop(swap_activate);
 +      DySetAop(swap_deactivate);
 +      DySetAop(swap_rw);
@@ -12712,7 +12697,7 @@ diff -urN /usr/share/empty/fs/aufs/dynop.c linux/fs/aufs/dynop.c
 +}
 diff -urN /usr/share/empty/fs/aufs/dynop.h linux/fs/aufs/dynop.h
 --- /usr/share/empty/fs/aufs/dynop.h   1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/dynop.h      2023-04-07 12:29:13.126380830 +0200
++++ linux/fs/aufs/dynop.h      2022-11-05 23:02:18.962555950 +0100
 @@ -0,0 +1,77 @@
 +/* SPDX-License-Identifier: GPL-2.0 */
 +/*
@@ -12793,8 +12778,8 @@ diff -urN /usr/share/empty/fs/aufs/dynop.h linux/fs/aufs/dynop.h
 +#endif /* __AUFS_DYNOP_H__ */
 diff -urN /usr/share/empty/fs/aufs/export.c linux/fs/aufs/export.c
 --- /usr/share/empty/fs/aufs/export.c  1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/export.c     2023-04-07 12:29:13.126380830 +0200
-@@ -0,0 +1,830 @@
++++ linux/fs/aufs/export.c     2024-03-10 23:40:47.083143450 +0100
+@@ -0,0 +1,846 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
 + * Copyright (C) 2005-2022 Junjiro R. Okajima
@@ -13091,17 +13076,33 @@ diff -urN /usr/share/empty/fs/aufs/export.c linux/fs/aufs/export.c
 +{
 +      int err;
 +      struct path root;
++      struct vfsmount *mnt;
 +      struct au_compare_mnt_args args = {
 +              .sb = sb
 +      };
 +
 +      get_fs_root(current->fs, &root);
++      /*
++       * as long as this sb is alive, this temporary unlock is safe.
++       * Really?
++       */
++      si_read_unlock(sb);
++      mnt = collect_mounts(&root);
++      if (IS_ERR(mnt)) {
++              args.mnt = mnt;
++              goto out;
++      }
++
 +      rcu_read_lock();
-+      err = iterate_mounts(au_compare_mnt, &args, root.mnt);
++      err = iterate_mounts(au_compare_mnt, &args, mnt);
 +      rcu_read_unlock();
-+      path_put(&root);
++      drop_collected_mounts(mnt);
 +      AuDebugOn(!err);
++
++out:
++      si_noflush_read_lock(sb);
 +      AuDebugOn(!args.mnt);
++      path_put(&root);
 +      return args.mnt;
 +}
 +
@@ -13627,7 +13628,7 @@ diff -urN /usr/share/empty/fs/aufs/export.c linux/fs/aufs/export.c
 +}
 diff -urN /usr/share/empty/fs/aufs/fhsm.c linux/fs/aufs/fhsm.c
 --- /usr/share/empty/fs/aufs/fhsm.c    1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/fhsm.c       2023-04-07 12:29:13.126380830 +0200
++++ linux/fs/aufs/fhsm.c       2022-11-05 23:02:18.962555950 +0100
 @@ -0,0 +1,426 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
@@ -14057,8 +14058,8 @@ diff -urN /usr/share/empty/fs/aufs/fhsm.c linux/fs/aufs/fhsm.c
 +}
 diff -urN /usr/share/empty/fs/aufs/file.c linux/fs/aufs/file.c
 --- /usr/share/empty/fs/aufs/file.c    1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/file.c       2023-04-07 12:29:13.126380830 +0200
-@@ -0,0 +1,860 @@
++++ linux/fs/aufs/file.c       2024-03-10 23:40:47.083143450 +0100
+@@ -0,0 +1,865 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
 + * Copyright (C) 2005-2022 Junjiro R. Okajima
@@ -14147,6 +14148,11 @@ diff -urN /usr/share/empty/fs/aufs/file.c linux/fs/aufs/file.c
 +      au_lcnt_inc(&br->br_nfiles);
 +      h_path.dentry = h_dentry;
 +      h_path.mnt = au_br_mnt(br);
++      /*
++       * vfs::backing_file_open() looks promising since it can get rid of
++       * mm::vm_prfile approach from my mind.
++       * but I keep current approach for a while.
++       */
 +      h_file = vfsub_dentry_open(&h_path, flags);
 +      if (IS_ERR(h_file))
 +              goto out_br;
@@ -14883,8 +14889,8 @@ diff -urN /usr/share/empty/fs/aufs/file.c linux/fs/aufs/file.c
 +static void aufs_is_dirty_writeback(struct folio *folio, bool *dirty,
 +                                  bool *writeback)
 +{ AuUnsupport(); }
-+static int aufs_error_remove_page(struct address_space *mapping,
-+                                struct page *page)
++static int aufs_error_remove_folio(struct address_space *mapping,
++                                 struct folio *folio)
 +{ AuUnsupport(); return 0; }
 +static int aufs_swap_activate(struct swap_info_struct *sis, struct file *file,
 +                            sector_t *span)
@@ -14913,7 +14919,7 @@ diff -urN /usr/share/empty/fs/aufs/file.c linux/fs/aufs/file.c
 +      .launder_folio          = aufs_launder_folio,
 +      .is_partially_uptodate  = aufs_is_partially_uptodate,
 +      .is_dirty_writeback     = aufs_is_dirty_writeback,
-+      .error_remove_page      = aufs_error_remove_page,
++      .error_remove_folio     = aufs_error_remove_folio,
 +      .swap_activate          = aufs_swap_activate,
 +      .swap_deactivate        = aufs_swap_deactivate,
 +      .swap_rw                = aufs_swap_rw
@@ -14921,7 +14927,7 @@ diff -urN /usr/share/empty/fs/aufs/file.c linux/fs/aufs/file.c
 +};
 diff -urN /usr/share/empty/fs/aufs/file.h linux/fs/aufs/file.h
 --- /usr/share/empty/fs/aufs/file.h    1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/file.h       2023-04-07 12:29:13.126380830 +0200
++++ linux/fs/aufs/file.h       2022-11-05 23:02:18.965889284 +0100
 @@ -0,0 +1,342 @@
 +/* SPDX-License-Identifier: GPL-2.0 */
 +/*
@@ -15267,7 +15273,7 @@ diff -urN /usr/share/empty/fs/aufs/file.h linux/fs/aufs/file.h
 +#endif /* __AUFS_FILE_H__ */
 diff -urN /usr/share/empty/fs/aufs/finfo.c linux/fs/aufs/finfo.c
 --- /usr/share/empty/fs/aufs/finfo.c   1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/finfo.c      2023-04-07 12:29:13.126380830 +0200
++++ linux/fs/aufs/finfo.c      2022-11-05 23:02:18.965889284 +0100
 @@ -0,0 +1,149 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
@@ -15420,8 +15426,8 @@ diff -urN /usr/share/empty/fs/aufs/finfo.c linux/fs/aufs/finfo.c
 +}
 diff -urN /usr/share/empty/fs/aufs/f_op.c linux/fs/aufs/f_op.c
 --- /usr/share/empty/fs/aufs/f_op.c    1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/f_op.c       2023-04-07 12:29:13.126380830 +0200
-@@ -0,0 +1,780 @@
++++ linux/fs/aufs/f_op.c       2023-10-31 09:31:04.196547417 +0100
+@@ -0,0 +1,771 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
 + * Copyright (C) 2005-2022 Junjiro R. Okajima
@@ -15647,6 +15653,7 @@ diff -urN /usr/share/empty/fs/aufs/f_op.c linux/fs/aufs/f_op.c
 +      if (do_ready)
 +              au_unpin(&pin);
 +      di_read_unlock(dentry, /*flags*/0);
++      vfsub_file_start_write(h_file);
 +
 +out_fi:
 +      fi_write_unlock(file);
@@ -15659,6 +15666,7 @@ diff -urN /usr/share/empty/fs/aufs/f_op.c linux/fs/aufs/f_op.c
 +{
 +      struct inode *h_inode;
 +
++      vfsub_file_end_write(h_file);
 +      au_cpup_attr_timesizes(inode);
 +      AuDebugOn(au_ibtop(inode) != wpre->btop);
 +      h_inode = file_inode(h_file);
@@ -15815,7 +15823,7 @@ diff -urN /usr/share/empty/fs/aufs/f_op.c linux/fs/aufs/f_op.c
 +      if (IS_ERR(h_file))
 +              goto out;
 +
-+      err = vfsub_splice_to(h_file, ppos, pipe, len, flags);
++      err = vfsub_splice_read(h_file, ppos, pipe, len, flags);
 +      /* todo: necessary? */
 +      /* file->f_ra = h_file->f_ra; */
 +      au_read_post(inode, h_file);
@@ -16160,16 +16168,6 @@ diff -urN /usr/share/empty/fs/aufs/f_op.c linux/fs/aufs/f_op.c
 +
 +/* ---------------------------------------------------------------------- */
 +
-+/* no one supports this operation, currently */
-+#if 0 /* reserved for future use */
-+static ssize_t aufs_sendpage(struct file *file, struct page *page, int offset,
-+                           size_t len, loff_t *pos, int more)
-+{
-+}
-+#endif
-+
-+/* ---------------------------------------------------------------------- */
-+
 +const struct file_operations aufs_file_fop = {
 +      .owner          = THIS_MODULE,
 +
@@ -16191,7 +16189,6 @@ diff -urN /usr/share/empty/fs/aufs/f_op.c linux/fs/aufs/f_op.c
 +      .release        = aufs_release_nondir,
 +      .fsync          = aufs_fsync_nondir,
 +      .fasync         = aufs_fasync,
-+      /* .sendpage    = aufs_sendpage, */
 +      .setfl          = aufs_setfl,
 +      .splice_write   = aufs_splice_write,
 +      .splice_read    = aufs_splice_read,
@@ -16204,7 +16201,7 @@ diff -urN /usr/share/empty/fs/aufs/f_op.c linux/fs/aufs/f_op.c
 +};
 diff -urN /usr/share/empty/fs/aufs/fsctx.c linux/fs/aufs/fsctx.c
 --- /usr/share/empty/fs/aufs/fsctx.c   1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/fsctx.c      2023-04-07 12:29:13.126380830 +0200
++++ linux/fs/aufs/fsctx.c      2022-11-05 23:02:18.965889284 +0100
 @@ -0,0 +1,1242 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
@@ -17450,7 +17447,7 @@ diff -urN /usr/share/empty/fs/aufs/fsctx.c linux/fs/aufs/fsctx.c
 +}
 diff -urN /usr/share/empty/fs/aufs/fstype.h linux/fs/aufs/fstype.h
 --- /usr/share/empty/fs/aufs/fstype.h  1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/fstype.h     2023-04-07 12:29:13.126380830 +0200
++++ linux/fs/aufs/fstype.h     2022-11-05 23:02:18.965889284 +0100
 @@ -0,0 +1,401 @@
 +/* SPDX-License-Identifier: GPL-2.0 */
 +/*
@@ -17855,7 +17852,7 @@ diff -urN /usr/share/empty/fs/aufs/fstype.h linux/fs/aufs/fstype.h
 +#endif /* __AUFS_FSTYPE_H__ */
 diff -urN /usr/share/empty/fs/aufs/hbl.h linux/fs/aufs/hbl.h
 --- /usr/share/empty/fs/aufs/hbl.h     1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/hbl.h        2023-04-07 12:29:13.126380830 +0200
++++ linux/fs/aufs/hbl.h        2022-11-05 23:02:18.965889284 +0100
 @@ -0,0 +1,65 @@
 +/* SPDX-License-Identifier: GPL-2.0 */
 +/*
@@ -17924,7 +17921,7 @@ diff -urN /usr/share/empty/fs/aufs/hbl.h linux/fs/aufs/hbl.h
 +#endif /* __AUFS_HBL_H__ */
 diff -urN /usr/share/empty/fs/aufs/hfsnotify.c linux/fs/aufs/hfsnotify.c
 --- /usr/share/empty/fs/aufs/hfsnotify.c       1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/hfsnotify.c  2023-04-07 12:29:13.126380830 +0200
++++ linux/fs/aufs/hfsnotify.c  2022-11-05 23:02:18.965889284 +0100
 @@ -0,0 +1,290 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
@@ -18218,7 +18215,7 @@ diff -urN /usr/share/empty/fs/aufs/hfsnotify.c linux/fs/aufs/hfsnotify.c
 +};
 diff -urN /usr/share/empty/fs/aufs/hfsplus.c linux/fs/aufs/hfsplus.c
 --- /usr/share/empty/fs/aufs/hfsplus.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/hfsplus.c    2023-04-07 12:29:13.126380830 +0200
++++ linux/fs/aufs/hfsplus.c    2022-11-05 23:02:18.965889284 +0100
 @@ -0,0 +1,60 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
@@ -18282,7 +18279,7 @@ diff -urN /usr/share/empty/fs/aufs/hfsplus.c linux/fs/aufs/hfsplus.c
 +}
 diff -urN /usr/share/empty/fs/aufs/hnotify.c linux/fs/aufs/hnotify.c
 --- /usr/share/empty/fs/aufs/hnotify.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/hnotify.c    2023-04-07 12:29:13.126380830 +0200
++++ linux/fs/aufs/hnotify.c    2024-03-10 23:40:47.083143450 +0100
 @@ -0,0 +1,715 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
@@ -18558,12 +18555,12 @@ diff -urN /usr/share/empty/fs/aufs/hnotify.c linux/fs/aufs/hnotify.c
 +/* ---------------------------------------------------------------------- */
 +
 +/* hnotify job flags */
-+#define AuHnJob_XINO0         1
-+#define AuHnJob_GEN           (1 << 1)
-+#define AuHnJob_DIRENT                (1 << 2)
-+#define AuHnJob_ISDIR         (1 << 3)
-+#define AuHnJob_TRYXINO0      (1 << 4)
-+#define AuHnJob_MNTPNT                (1 << 5)
++#define AuHnJob_XINO0         BIT(0)
++#define AuHnJob_GEN           BIT(1)
++#define AuHnJob_DIRENT                BIT(2)
++#define AuHnJob_ISDIR         BIT(3)
++#define AuHnJob_TRYXINO0      BIT(4)
++#define AuHnJob_MNTPNT                BIT(5)
 +#define au_ftest_hnjob(flags, name)   ((flags) & AuHnJob_##name)
 +#define au_fset_hnjob(flags, name) \
 +      do { (flags) |= AuHnJob_##name; } while (0)
@@ -18656,7 +18653,7 @@ diff -urN /usr/share/empty/fs/aufs/hnotify.c linux/fs/aufs/hnotify.c
 +
 +      dentry = NULL;
 +      spin_lock(&parent->d_lock);
-+      list_for_each_entry(d, &parent->d_subdirs, d_child) {
++      hlist_for_each_entry(d, &parent->d_children, d_sib) {
 +              /* AuDbg("%pd\n", d); */
 +              spin_lock_nested(&d->d_lock, DENTRY_D_LOCK_NESTED);
 +              dname = &d->d_name;
@@ -19001,7 +18998,7 @@ diff -urN /usr/share/empty/fs/aufs/hnotify.c linux/fs/aufs/hnotify.c
 +}
 diff -urN /usr/share/empty/fs/aufs/iinfo.c linux/fs/aufs/iinfo.c
 --- /usr/share/empty/fs/aufs/iinfo.c   1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/iinfo.c      2023-04-07 12:29:13.126380830 +0200
++++ linux/fs/aufs/iinfo.c      2022-11-05 23:02:18.965889284 +0100
 @@ -0,0 +1,286 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
@@ -19291,7 +19288,7 @@ diff -urN /usr/share/empty/fs/aufs/iinfo.c linux/fs/aufs/iinfo.c
 +}
 diff -urN /usr/share/empty/fs/aufs/inode.c linux/fs/aufs/inode.c
 --- /usr/share/empty/fs/aufs/inode.c   1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/inode.c      2023-04-07 12:29:13.126380830 +0200
++++ linux/fs/aufs/inode.c      2023-10-31 09:31:04.199880750 +0100
 @@ -0,0 +1,531 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
@@ -19807,26 +19804,26 @@ diff -urN /usr/share/empty/fs/aufs/inode.c linux/fs/aufs/inode.c
 +      return err;
 +}
 +
-+int au_test_h_perm(struct user_namespace *h_userns, struct inode *h_inode,
++int au_test_h_perm(struct mnt_idmap *h_idmap, struct inode *h_inode,
 +                 int mask)
 +{
 +      if (uid_eq(current_fsuid(), GLOBAL_ROOT_UID))
 +              return 0;
-+      return inode_permission(h_userns, h_inode, mask);
++      return inode_permission(h_idmap, h_inode, mask);
 +}
 +
-+int au_test_h_perm_sio(struct user_namespace *h_userns, struct inode *h_inode,
++int au_test_h_perm_sio(struct mnt_idmap *h_idmap, struct inode *h_inode,
 +                     int mask)
 +{
 +      if (au_test_nfs(h_inode->i_sb)
 +          && (mask & MAY_WRITE)
 +          && S_ISDIR(h_inode->i_mode))
 +              mask |= MAY_READ; /* force permission check */
-+      return au_test_h_perm(h_userns, h_inode, mask);
++      return au_test_h_perm(h_idmap, h_inode, mask);
 +}
 diff -urN /usr/share/empty/fs/aufs/inode.h linux/fs/aufs/inode.h
 --- /usr/share/empty/fs/aufs/inode.h   1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/inode.h      2023-04-07 12:29:13.126380830 +0200
++++ linux/fs/aufs/inode.h      2024-03-10 23:40:47.086476782 +0100
 @@ -0,0 +1,707 @@
 +/* SPDX-License-Identifier: GPL-2.0 */
 +/*
@@ -19915,8 +19912,8 @@ diff -urN /usr/share/empty/fs/aufs/inode.h linux/fs/aufs/inode.h
 +} ____cacheline_aligned_in_smp;
 +
 +/* au_pin flags */
-+#define AuPin_DI_LOCKED               1
-+#define AuPin_MNT_WRITE               (1 << 1)
++#define AuPin_DI_LOCKED               BIT(0)
++#define AuPin_MNT_WRITE               BIT(1)
 +#define au_ftest_pin(flags, name)     ((flags) & AuPin_##name)
 +#define au_fset_pin(flags, name) \
 +      do { (flags) |= AuPin_##name; } while (0)
@@ -19967,9 +19964,9 @@ diff -urN /usr/share/empty/fs/aufs/inode.h linux/fs/aufs/inode.h
 +struct inode *au_new_inode(struct dentry *dentry, int must_new);
 +int au_test_ro(struct super_block *sb, aufs_bindex_t bindex,
 +             struct inode *inode);
-+int au_test_h_perm(struct user_namespace *h_userns, struct inode *h_inode,
++int au_test_h_perm(struct mnt_idmap *h_idmap, struct inode *h_inode,
 +                 int mask);
-+int au_test_h_perm_sio(struct user_namespace *h_userns, struct inode *h_inode,
++int au_test_h_perm_sio(struct mnt_idmap *h_idmap, struct inode *h_inode,
 +                     int mask);
 +
 +static inline int au_wh_ino(struct super_block *sb, aufs_bindex_t bindex,
@@ -19993,9 +19990,9 @@ diff -urN /usr/share/empty/fs/aufs/inode.h linux/fs/aufs/inode.h
 +      aufs_iop_nogetattr[AuIop_Last];
 +
 +/* au_wr_dir flags */
-+#define AuWrDir_ADD_ENTRY     1
-+#define AuWrDir_ISDIR         (1 << 1)
-+#define AuWrDir_TMPFILE               (1 << 2)
++#define AuWrDir_ADD_ENTRY     BIT(0)
++#define AuWrDir_ISDIR         BIT(1)
++#define AuWrDir_TMPFILE               BIT(2)
 +#define au_ftest_wrdir(flags, name)   ((flags) & AuWrDir_##name)
 +#define au_fset_wrdir(flags, name) \
 +      do { (flags) |= AuWrDir_##name; } while (0)
@@ -20045,20 +20042,20 @@ diff -urN /usr/share/empty/fs/aufs/inode.h linux/fs/aufs/inode.h
 +/* i_op_add.c */
 +int au_may_add(struct dentry *dentry, aufs_bindex_t bindex,
 +             struct dentry *h_parent, int isdir);
-+int aufs_mknod(struct user_namespace *userns, struct inode *dir,
++int aufs_mknod(struct mnt_idmap *idmap, struct inode *dir,
 +             struct dentry *dentry, umode_t mode, dev_t dev);
-+int aufs_symlink(struct user_namespace *userns, struct inode *dir,
++int aufs_symlink(struct mnt_idmap *idmap, struct inode *dir,
 +               struct dentry *dentry, const char *symname);
-+int aufs_create(struct user_namespace *userns, struct inode *dir,
++int aufs_create(struct mnt_idmap *idmap, struct inode *dir,
 +              struct dentry *dentry, umode_t mode, bool want_excl);
 +struct vfsub_aopen_args;
 +int au_aopen_or_create(struct inode *dir, struct dentry *dentry,
 +                     struct vfsub_aopen_args *args);
-+int aufs_tmpfile(struct user_namespace *userns, struct inode *dir,
++int aufs_tmpfile(struct mnt_idmap *idmap, struct inode *dir,
 +               struct file *file, umode_t mode);
 +int aufs_link(struct dentry *src_dentry, struct inode *dir,
 +            struct dentry *dentry);
-+int aufs_mkdir(struct user_namespace *userns, struct inode *dir,
++int aufs_mkdir(struct mnt_idmap *idmap, struct inode *dir,
 +             struct dentry *dentry, umode_t mode);
 +
 +/* i_op_del.c */
@@ -20070,7 +20067,7 @@ diff -urN /usr/share/empty/fs/aufs/inode.h linux/fs/aufs/inode.h
 +
 +/* i_op_ren.c */
 +int au_wbr(struct dentry *dentry, aufs_bindex_t btgt);
-+int aufs_rename(struct user_namespace *userns,
++int aufs_rename(struct mnt_idmap *idmap,
 +              struct inode *_src_dir, struct dentry *_src_dentry,
 +              struct inode *_dst_dir, struct dentry *_dst_dentry,
 +              unsigned int _flags);
@@ -20083,8 +20080,8 @@ diff -urN /usr/share/empty/fs/aufs/inode.h linux/fs/aufs/inode.h
 +unsigned int au_hi_flags(struct inode *inode, int isdir);
 +
 +/* hinode flags */
-+#define AuHi_XINO     1
-+#define AuHi_HNOTIFY  (1 << 1)
++#define AuHi_XINO     BIT(0)
++#define AuHi_HNOTIFY  BIT(1)
 +#define au_ftest_hi(flags, name)      ((flags) & AuHi_##name)
 +#define au_fset_hi(flags, name) \
 +      do { (flags) |= AuHi_##name; } while (0)
@@ -20155,9 +20152,9 @@ diff -urN /usr/share/empty/fs/aufs/inode.h linux/fs/aufs/inode.h
 +
 +#ifdef CONFIG_FS_POSIX_ACL
 +struct posix_acl *aufs_get_inode_acl(struct inode *inode, int type, bool rcu);
-+struct posix_acl *aufs_get_acl(struct user_namespace *userns,
++struct posix_acl *aufs_get_acl(struct mnt_idmap *idmap,
 +                             struct dentry *dentry, int type);
-+int aufs_set_acl(struct user_namespace *userns, struct dentry *dentry,
++int aufs_set_acl(struct mnt_idmap *idmap, struct dentry *dentry,
 +               struct posix_acl *acl, int type);
 +#endif
 +
@@ -20537,7 +20534,7 @@ diff -urN /usr/share/empty/fs/aufs/inode.h linux/fs/aufs/inode.h
 +#endif /* __AUFS_INODE_H__ */
 diff -urN /usr/share/empty/fs/aufs/ioctl.c linux/fs/aufs/ioctl.c
 --- /usr/share/empty/fs/aufs/ioctl.c   1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/ioctl.c      2023-04-07 12:29:13.126380830 +0200
++++ linux/fs/aufs/ioctl.c      2022-11-05 23:02:18.965889284 +0100
 @@ -0,0 +1,220 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
@@ -20761,7 +20758,7 @@ diff -urN /usr/share/empty/fs/aufs/ioctl.c linux/fs/aufs/ioctl.c
 +#endif
 diff -urN /usr/share/empty/fs/aufs/i_op_add.c linux/fs/aufs/i_op_add.c
 --- /usr/share/empty/fs/aufs/i_op_add.c        1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/i_op_add.c   2023-04-07 12:29:13.126380830 +0200
++++ linux/fs/aufs/i_op_add.c   2023-10-31 09:31:04.199880750 +0100
 @@ -0,0 +1,972 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
@@ -21131,7 +21128,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op_add.c linux/fs/aufs/i_op_add.c
 +      return err;
 +}
 +
-+int aufs_mknod(struct user_namespace *userns, struct inode *dir,
++int aufs_mknod(struct mnt_idmap *idmap, struct inode *dir,
 +             struct dentry *dentry, umode_t mode, dev_t dev)
 +{
 +      struct simple_arg arg = {
@@ -21144,7 +21141,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op_add.c linux/fs/aufs/i_op_add.c
 +      return add_simple(dir, dentry, &arg);
 +}
 +
-+int aufs_symlink(struct user_namespace *userns, struct inode *dir,
++int aufs_symlink(struct mnt_idmap *idmap, struct inode *dir,
 +               struct dentry *dentry, const char *symname)
 +{
 +      struct simple_arg arg = {
@@ -21154,7 +21151,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op_add.c linux/fs/aufs/i_op_add.c
 +      return add_simple(dir, dentry, &arg);
 +}
 +
-+int aufs_create(struct user_namespace *userns, struct inode *dir,
++int aufs_create(struct mnt_idmap *idmap, struct inode *dir,
 +              struct dentry *dentry, umode_t mode, bool want_excl)
 +{
 +      struct simple_arg arg = {
@@ -21182,7 +21179,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op_add.c linux/fs/aufs/i_op_add.c
 +      return add_simple(dir, dentry, &arg);
 +}
 +
-+int aufs_tmpfile(struct user_namespace *userns, struct inode *dir,
++int aufs_tmpfile(struct mnt_idmap *idmap, struct inode *dir,
 +               struct file *file, umode_t mode)
 +{
 +      int err;
@@ -21193,7 +21190,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op_add.c linux/fs/aufs/i_op_add.c
 +      struct dentry *dentry, *parent, *h_parent, *h_dentry;
 +      struct inode *h_dir, *inode;
 +      struct vfsmount *h_mnt;
-+      struct user_namespace *h_userns;
++      struct mnt_idmap *h_idmap;
 +      struct file *h_file;
 +      struct au_wr_dir_args wr_dir_args = {
 +              .force_btgt     = -1,
@@ -21244,12 +21241,12 @@ diff -urN /usr/share/empty/fs/aufs/i_op_add.c linux/fs/aufs/i_op_add.c
 +      if (unlikely(err))
 +              goto out_parent;
 +
-+      h_userns = mnt_user_ns(h_mnt);
++      h_idmap = mnt_idmap(h_mnt);
 +      h_parent = au_h_dptr(parent, bindex);
 +      h_ppath.mnt = h_mnt;
 +      h_ppath.dentry = h_parent;
-+      h_file = vfs_tmpfile_open(h_userns, &h_ppath, mode, /*open_flag*/0,
-+                                current_cred());
++      h_file = kernel_tmpfile_open(h_idmap, &h_ppath, mode, /*open_flag*/0,
++                                   current_cred());
 +      if (IS_ERR(h_file)) {
 +              err = PTR_ERR(h_file);
 +              h_file = NULL;
@@ -21589,7 +21586,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op_add.c linux/fs/aufs/i_op_add.c
 +      au_dir_ts(dir, a->bdst);
 +      inode_inc_iversion(dir);
 +      inc_nlink(inode);
-+      inode->i_ctime = dir->i_ctime;
++      inode_set_ctime_to_ts(inode, inode_get_ctime(dir));
 +      d_instantiate(dentry, au_igrab(inode));
 +      if (d_unhashed(a->h_path.dentry))
 +              /* some filesystem calls d_drop() */
@@ -21627,7 +21624,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op_add.c linux/fs/aufs/i_op_add.c
 +      return err;
 +}
 +
-+int aufs_mkdir(struct user_namespace *userns, struct inode *dir,
++int aufs_mkdir(struct mnt_idmap *idmap, struct inode *dir,
 +             struct dentry *dentry, umode_t mode)
 +{
 +      int err, rerr;
@@ -21737,8 +21734,8 @@ diff -urN /usr/share/empty/fs/aufs/i_op_add.c linux/fs/aufs/i_op_add.c
 +}
 diff -urN /usr/share/empty/fs/aufs/i_op.c linux/fs/aufs/i_op.c
 --- /usr/share/empty/fs/aufs/i_op.c    1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/i_op.c       2023-04-07 12:29:13.126380830 +0200
-@@ -0,0 +1,1516 @@
++++ linux/fs/aufs/i_op.c       2024-03-10 23:40:47.083143450 +0100
+@@ -0,0 +1,1520 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
 + * Copyright (C) 2005-2022 Junjiro R. Okajima
@@ -21762,6 +21759,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op.c linux/fs/aufs/i_op.c
 + */
 +
 +#include <linux/device_cgroup.h>
++#include <linux/filelock.h>
 +#include <linux/fs_stack.h>
 +#include <linux/iversion.h>
 +#include <linux/security.h>
@@ -21772,7 +21770,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op.c linux/fs/aufs/i_op.c
 +{
 +      int err;
 +      const unsigned char write_mask = !!(mask & (MAY_WRITE | MAY_APPEND));
-+      struct user_namespace *h_userns;
++      struct mnt_idmap *h_idmap;
 +
 +      err = -EPERM;
 +      if (write_mask && IS_IMMUTABLE(h_inode))
@@ -21792,7 +21790,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op.c linux/fs/aufs/i_op.c
 +       * - nfs always sets SB_POSIXACL regardless its mount option 'noacl.'
 +       *   in this case, generic_permission() returns -EOPNOTSUPP.
 +       */
-+      h_userns = mnt_user_ns(h_path->mnt);
++      h_idmap = mnt_idmap(h_path->mnt);
 +      if ((write_mask && !au_br_writable(brperm))
 +          || (au_test_nfs(h_inode->i_sb) && S_ISDIR(h_inode->i_mode)
 +              && write_mask && !(mask & MAY_READ))
@@ -21800,14 +21798,14 @@ diff -urN /usr/share/empty/fs/aufs/i_op.c linux/fs/aufs/i_op.c
 +              /* AuLabel(generic_permission); */
 +              /* AuDbg("get_inode_acl %ps\n",
 +                 h_inode->i_op->get_inode_acl); */
-+              err = generic_permission(h_userns, h_inode, mask);
++              err = generic_permission(h_idmap, h_inode, mask);
 +              if (err == -EOPNOTSUPP && au_test_nfs_noacl(h_inode))
-+                      err = h_inode->i_op->permission(h_userns, h_inode,
++                      err = h_inode->i_op->permission(h_idmap, h_inode,
 +                                                      mask);
 +              AuTraceErr(err);
 +      } else {
 +              /* AuLabel(h_inode->permission); */
-+              err = h_inode->i_op->permission(h_userns, h_inode, mask);
++              err = h_inode->i_op->permission(h_idmap, h_inode, mask);
 +              AuTraceErr(err);
 +      }
 +
@@ -21820,7 +21818,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op.c linux/fs/aufs/i_op.c
 +      return err;
 +}
 +
-+static int aufs_permission(struct user_namespace *userns, struct inode *inode,
++static int aufs_permission(struct mnt_idmap *idmap, struct inode *inode,
 +                         int mask)
 +{
 +      int err;
@@ -22669,7 +22667,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op.c linux/fs/aufs/i_op.c
 +      return err;
 +}
 +
-+static int aufs_setattr(struct user_namespace *userns, struct dentry *dentry,
++static int aufs_setattr(struct mnt_idmap *idmap, struct dentry *dentry,
 +                      struct iattr *ia)
 +{
 +      int err;
@@ -22677,12 +22675,12 @@ diff -urN /usr/share/empty/fs/aufs/i_op.c linux/fs/aufs/i_op.c
 +      struct super_block *sb;
 +      struct file *file;
 +      struct au_icpup_args *a;
-+      struct user_namespace *h_userns;
++      struct mnt_idmap *h_idmap;
 +
 +      inode = d_inode(dentry);
 +      IMustLock(inode);
 +
-+      err = setattr_prepare(userns, dentry, ia);
++      err = setattr_prepare(idmap, dentry, ia);
 +      if (unlikely(err))
 +              goto out;
 +
@@ -22776,8 +22774,8 @@ diff -urN /usr/share/empty/fs/aufs/i_op.c linux/fs/aufs/i_op.c
 +       * why don't all acl-aware fs call this func from their ->setattr()?
 +       */
 +      if (!err && (ia->ia_valid & ATTR_MODE)) {
-+              h_userns = mnt_user_ns(a->h_path.mnt);
-+              err = vfsub_acl_chmod(h_userns, a->h_path.dentry, ia->ia_mode);
++              h_idmap = mnt_idmap(a->h_path.mnt);
++              err = vfsub_acl_chmod(h_idmap, a->h_path.dentry, ia->ia_mode);
 +      }
 +      if (!err)
 +              au_cpup_attr_changeable(inode);
@@ -22840,7 +22838,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op.c linux/fs/aufs/i_op.c
 +      struct super_block *sb;
 +      struct au_icpup_args *a;
 +      struct inode *h_inode;
-+      struct user_namespace *h_userns;
++      struct mnt_idmap *h_idmap;
 +
 +      IMustLock(inode);
 +
@@ -22859,13 +22857,13 @@ diff -urN /usr/share/empty/fs/aufs/i_op.c linux/fs/aufs/i_op.c
 +      err = au_h_path_to_set_attr(dentry, a, &h_path);
 +      if (unlikely(err))
 +              goto out_di;
-+      h_userns = mnt_user_ns(h_path.mnt);
++      h_idmap = mnt_idmap(h_path.mnt);
 +
 +      inode_unlock(a->h_inode);
 +      switch (arg->type) {
 +      case AU_XATTR_SET:
 +              AuDebugOn(d_is_negative(h_path.dentry));
-+              err = vfsub_setxattr(h_userns, h_path.dentry,
++              err = vfsub_setxattr(h_idmap, h_path.dentry,
 +                                   arg->u.set.name, arg->u.set.value,
 +                                   arg->u.set.size, arg->u.set.flags);
 +              break;
@@ -22874,7 +22872,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op.c linux/fs/aufs/i_op.c
 +              h_inode = d_inode(h_path.dentry);
 +              if (h_inode->i_op->set_acl) {
 +                      /* this will call posix_acl_update_mode */
-+                      err = h_inode->i_op->set_acl(h_userns, h_path.dentry,
++                      err = h_inode->i_op->set_acl(h_idmap, h_path.dentry,
 +                                                   arg->u.acl_set.acl,
 +                                                   arg->u.acl_set.type);
 +              }
@@ -22907,9 +22905,9 @@ diff -urN /usr/share/empty/fs/aufs/i_op.c linux/fs/aufs/i_op.c
 +      /* don't i_[ug]id_write() here */
 +      inode->i_uid = st->uid;
 +      inode->i_gid = st->gid;
-+      inode->i_atime = st->atime;
-+      inode->i_mtime = st->mtime;
-+      inode->i_ctime = st->ctime;
++      inode_set_atime_to_ts(inode, st->atime);
++      inode_set_mtime_to_ts(inode, st->mtime);
++      inode_set_ctime_to_ts(inode, st->ctime);
 +
 +      au_cpup_attr_nlink(inode, /*force*/0);
 +      if (S_ISDIR(inode->i_mode)) {
@@ -23008,7 +23006,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op.c linux/fs/aufs/i_op.c
 +      return err;
 +}
 +
-+static int aufs_getattr(struct user_namespace *userns, const struct path *path,
++static int aufs_getattr(struct mnt_idmap *idmap, const struct path *path,
 +                      struct kstat *st, u32 request, unsigned int query)
 +{
 +      int err;
@@ -23033,9 +23031,13 @@ diff -urN /usr/share/empty/fs/aufs/i_op.c linux/fs/aufs/i_op.c
 +              goto out_fill; /* pretending success */
 +
 +      positive = d_is_positive(h_path.dentry);
-+      if (positive)
++      if (positive) {
 +              /* no vfsub version */
-+              err = vfs_getattr(&h_path, st, request, query);
++              if (query & AT_GETATTR_NOSEC)
++                      err = vfs_getattr_nosec(&h_path, st, request, query);
++              else
++                      err = vfs_getattr(&h_path, st, request, query);
++      }
 +      if (!err) {
 +              if (positive)
 +                      au_refresh_iattr(inode, st,
@@ -23046,7 +23048,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op.c linux/fs/aufs/i_op.c
 +      goto out_di;
 +
 +out_fill:
-+      generic_fillattr(userns, inode, st);
++      generic_fillattr(idmap, request, inode, st);
 +out_di:
 +      di_read_unlock(dentry, AuLock_IR);
 +out_si:
@@ -23128,8 +23130,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op.c linux/fs/aufs/i_op.c
 +      return (inode->i_mode & (S_IFBLK | S_IFCHR | S_IFIFO | S_IFSOCK));
 +}
 +
-+static int aufs_update_time(struct inode *inode, struct timespec64 *ts,
-+                          int flags)
++static int aufs_update_time(struct inode *inode, int flags)
 +{
 +      int err;
 +      aufs_bindex_t bindex;
@@ -23153,7 +23154,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op.c linux/fs/aufs/i_op.c
 +              h_mnt = au_sbr_mnt(sb, bindex);
 +              err = vfsub_mnt_want_write(h_mnt);
 +              if (!err) {
-+                      err = vfsub_update_time(h_inode, ts, flags);
++                      err = vfsub_update_time(h_inode, flags);
 +                      vfsub_mnt_drop_write(h_mnt);
 +              }
 +      } else if (au_is_special(h_inode)) {
@@ -23257,8 +23258,8 @@ diff -urN /usr/share/empty/fs/aufs/i_op.c linux/fs/aufs/i_op.c
 +};
 diff -urN /usr/share/empty/fs/aufs/i_op_del.c linux/fs/aufs/i_op_del.c
 --- /usr/share/empty/fs/aufs/i_op_del.c        1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/i_op_del.c   2023-04-07 12:29:13.126380830 +0200
-@@ -0,0 +1,522 @@
++++ linux/fs/aufs/i_op_del.c   2023-10-31 09:31:04.199880750 +0100
+@@ -0,0 +1,523 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
 + * Copyright (C) 2005-2022 Junjiro R. Okajima
@@ -23358,7 +23359,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op_del.c linux/fs/aufs/i_op_del.c
 +      struct path h_ppath;
 +      struct super_block *sb;
 +      struct au_branch *br;
-+      struct user_namespace *h_userns;
++      struct mnt_idmap *h_idmap;
 +
 +      h_dentry = au_h_dptr(dentry, bindex);
 +      if (d_really_is_positive(dentry)) {
@@ -23398,15 +23399,15 @@ diff -urN /usr/share/empty/fs/aufs/i_op_del.c linux/fs/aufs/i_op_del.c
 +      err = -EACCES;
 +      sb = dentry->d_sb;
 +      br = au_sbr(sb, bindex);
-+      h_userns = au_br_userns(br);
++      h_idmap = au_br_idmap(br);
 +      if (unlikely(!au_opt_test(au_mntflags(sb), DIRPERM1)
-+                   && au_test_h_perm(h_userns, d_inode(h_parent),
++                   && au_test_h_perm(h_idmap, d_inode(h_parent),
 +                                     MAY_EXEC | MAY_WRITE)))
 +              goto out;
 +
 +      h_ppath.dentry = h_parent;
 +      h_ppath.mnt = au_br_mnt(br);
-+      h_latest = au_sio_lkup_one(h_userns, &dentry->d_name, &h_ppath);
++      h_latest = au_sio_lkup_one(h_idmap, &dentry->d_name, &h_ppath);
 +      err = -EIO;
 +      if (IS_ERR(h_latest))
 +              goto out;
@@ -23538,7 +23539,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op_del.c linux/fs/aufs/i_op_del.c
 +
 +      inode = d_inode(dentry);
 +      d_drop(dentry);
-+      inode->i_ctime = dir->i_ctime;
++      inode_set_ctime_to_ts(inode, inode_get_ctime(dir));
 +
 +      au_dir_ts(dir, bindex);
 +      inode_inc_iversion(dir);
@@ -23574,7 +23575,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op_del.c linux/fs/aufs/i_op_del.c
 +{
 +      int err;
 +      aufs_bindex_t bwh, bindex, btop;
-+      struct inode *inode, *h_dir, *delegated;
++      struct inode *inode, *h_dir, *delegated, *h_inode;
 +      struct dentry *parent, *wh_dentry;
 +      /* to reduce stack size */
 +      struct {
@@ -23640,10 +23641,11 @@ diff -urN /usr/share/empty/fs/aufs/i_op_del.c linux/fs/aufs/i_op_del.c
 +              if (bindex == btop) {
 +                      vfsub_update_h_iattr(&a->h_path, /*did*/NULL);
 +                      /*ignore*/
-+                      inode->i_ctime = d_inode(a->h_path.dentry)->i_ctime;
++                      h_inode = d_inode(a->h_path.dentry);
++                      inode_set_ctime_to_ts(inode, inode_get_ctime(h_inode));
 +              } else
 +                      /* todo: this timestamp may be reverted later */
-+                      inode->i_ctime = h_dir->i_ctime;
++                      inode_set_ctime_to_ts(inode, inode_get_ctime(h_dir));
 +              goto out_unpin; /* success */
 +      }
 +
@@ -23783,8 +23785,8 @@ diff -urN /usr/share/empty/fs/aufs/i_op_del.c linux/fs/aufs/i_op_del.c
 +}
 diff -urN /usr/share/empty/fs/aufs/i_op_ren.c linux/fs/aufs/i_op_ren.c
 --- /usr/share/empty/fs/aufs/i_op_ren.c        1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/i_op_ren.c   2023-04-07 12:29:13.126380830 +0200
-@@ -0,0 +1,1257 @@
++++ linux/fs/aufs/i_op_ren.c   2024-03-10 23:40:47.083143450 +0100
+@@ -0,0 +1,1264 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
 + * Copyright (C) 2005-2022 Junjiro R. Okajima
@@ -23814,18 +23816,18 @@ diff -urN /usr/share/empty/fs/aufs/i_op_ren.c linux/fs/aufs/i_op_ren.c
 +enum { AuSRC, AuDST, AuSrcDst };
 +enum { AuPARENT, AuCHILD, AuParentChild };
 +
-+#define AuRen_ISDIR_SRC               1
-+#define AuRen_ISDIR_DST               (1 << 1)
-+#define AuRen_ISSAMEDIR               (1 << 2)
-+#define AuRen_WHSRC           (1 << 3)
-+#define AuRen_WHDST           (1 << 4)
-+#define AuRen_MNT_WRITE               (1 << 5)
-+#define AuRen_DT_DSTDIR               (1 << 6)
-+#define AuRen_DIROPQ_SRC      (1 << 7)
-+#define AuRen_DIROPQ_DST      (1 << 8)
-+#define AuRen_DIRREN          (1 << 9)
-+#define AuRen_DROPPED_SRC     (1 << 10)
-+#define AuRen_DROPPED_DST     (1 << 11)
++#define AuRen_ISDIR_SRC               BIT(0)
++#define AuRen_ISDIR_DST               BIT(1)
++#define AuRen_ISSAMEDIR               BIT(2)
++#define AuRen_WHSRC           BIT(3)
++#define AuRen_WHDST           BIT(4)
++#define AuRen_MNT_WRITE               BIT(5)
++#define AuRen_DT_DSTDIR               BIT(6)
++#define AuRen_DIROPQ_SRC      BIT(7)
++#define AuRen_DIROPQ_DST      BIT(8)
++#define AuRen_DIRREN          BIT(9)
++#define AuRen_DROPPED_SRC     BIT(10)
++#define AuRen_DROPPED_DST     BIT(11)
 +#define au_ftest_ren(flags, name)     ((flags) & AuRen_##name)
 +#define au_fset_ren(flags, name) \
 +      do { (flags) |= AuRen_##name; } while (0)
@@ -24153,6 +24155,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op_ren.c linux/fs/aufs/i_op_ren.c
 +{
 +      int err;
 +      struct dentry *d, *h_d;
++      struct inode *h_inode;
 +
 +      if (!a->exchange) {
 +              /* prepare workqueue args for asynchronous rmdir */
@@ -24230,12 +24233,14 @@ diff -urN /usr/share/empty/fs/aufs/i_op_ren.c linux/fs/aufs/i_op_ren.c
 +              AuDebugOn(au_dbtop(a->dst_dentry) != a->btgt);
 +              a->h_path.dentry = au_h_dptr(a->dst_dentry, a->btgt);
 +              vfsub_update_h_iattr(&a->h_path, /*did*/NULL); /*ignore*/
-+              a->dst_inode->i_ctime = d_inode(a->h_path.dentry)->i_ctime;
++              h_inode = d_inode(a->h_path.dentry);
++              inode_set_ctime_to_ts(a->dst_inode, inode_get_ctime(h_inode));
 +      }
 +      AuDebugOn(au_dbtop(a->src_dentry) != a->btgt);
 +      a->h_path.dentry = au_h_dptr(a->src_dentry, a->btgt);
 +      vfsub_update_h_iattr(&a->h_path, /*did*/NULL); /*ignore*/
-+      a->src_inode->i_ctime = d_inode(a->h_path.dentry)->i_ctime;
++      h_inode = d_inode(a->h_path.dentry);
++      inode_set_ctime_to_ts(a->src_inode, inode_get_ctime(h_inode));
 +
 +      if (!a->exchange) {
 +              /* remove whiteout for dentry */
@@ -24517,6 +24522,10 @@ diff -urN /usr/share/empty/fs/aufs/i_op_ren.c linux/fs/aufs/i_op_ren.c
 +      }
 +      a->h_trap = vfsub_lock_rename(a->src_h_parent, a->src_hdir,
 +                                    a->dst_h_parent, a->dst_hdir);
++      if (IS_ERR(a->h_trap)) {
++              err = PTR_ERR(a->h_trap);
++              goto out;
++      }
 +      udba = au_opt_udba(a->src_dentry->d_sb);
 +      if (unlikely(a->src_hdir->hi_inode != d_inode(a->src_h_parent)
 +                   || a->dst_hdir->hi_inode != d_inode(a->dst_h_parent)))
@@ -24746,7 +24755,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op_ren.c linux/fs/aufs/i_op_ren.c
 +
 +/* ---------------------------------------------------------------------- */
 +
-+int aufs_rename(struct user_namespace *userns,
++int aufs_rename(struct mnt_idmap *idmap,
 +              struct inode *_src_dir, struct dentry *_src_dentry,
 +              struct inode *_dst_dir, struct dentry *_dst_dentry,
 +              unsigned int _flags)
@@ -25044,7 +25053,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op_ren.c linux/fs/aufs/i_op_ren.c
 +}
 diff -urN /usr/share/empty/fs/aufs/Kconfig linux/fs/aufs/Kconfig
 --- /usr/share/empty/fs/aufs/Kconfig   1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/Kconfig      2023-04-07 12:29:13.123045930 +0200
++++ linux/fs/aufs/Kconfig      2022-11-05 23:02:18.959222617 +0100
 @@ -0,0 +1,199 @@
 +# SPDX-License-Identifier: GPL-2.0
 +config AUFS_FS
@@ -25247,7 +25256,7 @@ diff -urN /usr/share/empty/fs/aufs/Kconfig linux/fs/aufs/Kconfig
 +endif
 diff -urN /usr/share/empty/fs/aufs/lcnt.h linux/fs/aufs/lcnt.h
 --- /usr/share/empty/fs/aufs/lcnt.h    1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/lcnt.h       2023-04-07 12:29:13.126380830 +0200
++++ linux/fs/aufs/lcnt.h       2022-11-05 23:02:18.965889284 +0100
 @@ -0,0 +1,186 @@
 +/* SPDX-License-Identifier: GPL-2.0 */
 +/*
@@ -25437,7 +25446,7 @@ diff -urN /usr/share/empty/fs/aufs/lcnt.h linux/fs/aufs/lcnt.h
 +#endif /* __AUFS_LCNT_H__ */
 diff -urN /usr/share/empty/fs/aufs/loop.c linux/fs/aufs/loop.c
 --- /usr/share/empty/fs/aufs/loop.c    1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/loop.c       2023-04-07 12:29:13.126380830 +0200
++++ linux/fs/aufs/loop.c       2022-11-05 23:02:18.965889284 +0100
 @@ -0,0 +1,148 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
@@ -25589,7 +25598,7 @@ diff -urN /usr/share/empty/fs/aufs/loop.c linux/fs/aufs/loop.c
 +}
 diff -urN /usr/share/empty/fs/aufs/loop.h linux/fs/aufs/loop.h
 --- /usr/share/empty/fs/aufs/loop.h    1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/loop.h       2023-04-07 12:29:13.126380830 +0200
++++ linux/fs/aufs/loop.h       2022-11-05 23:02:18.965889284 +0100
 @@ -0,0 +1,55 @@
 +/* SPDX-License-Identifier: GPL-2.0 */
 +/*
@@ -25648,7 +25657,7 @@ diff -urN /usr/share/empty/fs/aufs/loop.h linux/fs/aufs/loop.h
 +#endif /* __AUFS_LOOP_H__ */
 diff -urN /usr/share/empty/fs/aufs/magic.mk linux/fs/aufs/magic.mk
 --- /usr/share/empty/fs/aufs/magic.mk  1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/magic.mk     2023-04-07 12:29:13.126380830 +0200
++++ linux/fs/aufs/magic.mk     2022-11-05 23:02:18.965889284 +0100
 @@ -0,0 +1,31 @@
 +# SPDX-License-Identifier: GPL-2.0
 +
@@ -25683,7 +25692,7 @@ diff -urN /usr/share/empty/fs/aufs/magic.mk linux/fs/aufs/magic.mk
 +endif
 diff -urN /usr/share/empty/fs/aufs/Makefile linux/fs/aufs/Makefile
 --- /usr/share/empty/fs/aufs/Makefile  1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/Makefile     2023-04-07 12:29:13.123045930 +0200
++++ linux/fs/aufs/Makefile     2022-11-05 23:02:18.959222617 +0100
 @@ -0,0 +1,46 @@
 +# SPDX-License-Identifier: GPL-2.0
 +
@@ -25733,7 +25742,7 @@ diff -urN /usr/share/empty/fs/aufs/Makefile linux/fs/aufs/Makefile
 +aufs-$(CONFIG_AUFS_MAGIC_SYSRQ) += sysrq.o
 diff -urN /usr/share/empty/fs/aufs/module.c linux/fs/aufs/module.c
 --- /usr/share/empty/fs/aufs/module.c  1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/module.c     2023-04-07 12:29:13.126380830 +0200
++++ linux/fs/aufs/module.c     2022-11-05 23:02:18.965889284 +0100
 @@ -0,0 +1,273 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
@@ -26010,7 +26019,7 @@ diff -urN /usr/share/empty/fs/aufs/module.c linux/fs/aufs/module.c
 +module_exit(aufs_exit);
 diff -urN /usr/share/empty/fs/aufs/module.h linux/fs/aufs/module.h
 --- /usr/share/empty/fs/aufs/module.h  1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/module.h     2023-04-07 12:29:13.126380830 +0200
++++ linux/fs/aufs/module.h     2022-11-05 23:02:18.969222617 +0100
 @@ -0,0 +1,180 @@
 +/* SPDX-License-Identifier: GPL-2.0 */
 +/*
@@ -26194,8 +26203,8 @@ diff -urN /usr/share/empty/fs/aufs/module.h linux/fs/aufs/module.h
 +#endif /* __AUFS_MODULE_H__ */
 diff -urN /usr/share/empty/fs/aufs/mvdown.c linux/fs/aufs/mvdown.c
 --- /usr/share/empty/fs/aufs/mvdown.c  1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/mvdown.c     2023-04-07 12:29:13.126380830 +0200
-@@ -0,0 +1,706 @@
++++ linux/fs/aufs/mvdown.c     2024-03-10 23:40:47.086476782 +0100
+@@ -0,0 +1,713 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
 + * Copyright (C) 2011-2022 Junjiro R. Okajima
@@ -26372,6 +26381,13 @@ diff -urN /usr/share/empty/fs/aufs/mvdown.c linux/fs/aufs/mvdown.c
 +      au_pin_hdir_unlock(&a->mvd_pin_src);
 +      h_trap = vfsub_lock_rename(a->mvd_h_src_parent, a->mvd_hdir_src,
 +                                 a->mvd_h_dst_parent, a->mvd_hdir_dst);
++      if (IS_ERR(h_trap)) {
++              err = PTR_ERR(h_trap);
++              au_pin_hdir_lock(&a->mvd_pin_src);
++              au_unpin(&a->mvd_pin_src);
++              au_pin_hdir_lock(&a->mvd_pin_dst);
++              goto out_dst;
++      }
 +      if (h_trap) {
 +              err = (h_trap != a->mvd_h_src_parent);
 +              if (err)
@@ -26904,7 +26920,7 @@ diff -urN /usr/share/empty/fs/aufs/mvdown.c linux/fs/aufs/mvdown.c
 +}
 diff -urN /usr/share/empty/fs/aufs/opts.c linux/fs/aufs/opts.c
 --- /usr/share/empty/fs/aufs/opts.c    1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/opts.c       2023-04-07 12:29:13.126380830 +0200
++++ linux/fs/aufs/opts.c       2024-03-10 23:40:47.086476782 +0100
 @@ -0,0 +1,1032 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
@@ -27579,8 +27595,8 @@ diff -urN /usr/share/empty/fs/aufs/opts.c linux/fs/aufs/opts.c
 +      case Opt_prepend:
 +              opt->add.bindex = 0;
 +              fallthrough;
-+      add: /* indented label */
 +      case Opt_add:
++      add: /* indented label */
 +              err = au_br_add(sb, &opt->add,
 +                              au_ftest_opts(opts->flags, REMOUNT));
 +              if (!err) {
@@ -27940,7 +27956,7 @@ diff -urN /usr/share/empty/fs/aufs/opts.c linux/fs/aufs/opts.c
 +}
 diff -urN /usr/share/empty/fs/aufs/opts.h linux/fs/aufs/opts.h
 --- /usr/share/empty/fs/aufs/opts.h    1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/opts.h       2023-04-07 12:29:13.126380830 +0200
++++ linux/fs/aufs/opts.h       2024-03-10 23:40:47.086476782 +0100
 @@ -0,0 +1,263 @@
 +/* SPDX-License-Identifier: GPL-2.0 */
 +/*
@@ -28001,23 +28017,23 @@ diff -urN /usr/share/empty/fs/aufs/opts.h linux/fs/aufs/opts.h
 +/* ---------------------------------------------------------------------- */
 +
 +/* mount flags */
-+#define AuOpt_XINO            1               /* external inode number bitmap
++#define AuOpt_XINO            BIT(0)          /* external inode number bitmap
 +                                                 and translation table */
-+#define AuOpt_TRUNC_XINO      (1 << 1)        /* truncate xino files */
-+#define AuOpt_UDBA_NONE               (1 << 2)        /* users direct branch access */
-+#define AuOpt_UDBA_REVAL      (1 << 3)
-+#define AuOpt_UDBA_HNOTIFY    (1 << 4)
-+#define AuOpt_SHWH            (1 << 5)        /* show whiteout */
-+#define AuOpt_PLINK           (1 << 6)        /* pseudo-link */
-+#define AuOpt_DIRPERM1                (1 << 7)        /* ignore the lower dir's perm
++#define AuOpt_TRUNC_XINO      BIT(1)          /* truncate xino files */
++#define AuOpt_UDBA_NONE               BIT(2)          /* users direct branch access */
++#define AuOpt_UDBA_REVAL      BIT(3)
++#define AuOpt_UDBA_HNOTIFY    BIT(4)
++#define AuOpt_SHWH            BIT(5)          /* show whiteout */
++#define AuOpt_PLINK           BIT(6)          /* pseudo-link */
++#define AuOpt_DIRPERM1                BIT(7)          /* ignore the lower dir's perm
 +                                                 bits */
-+#define AuOpt_ALWAYS_DIROPQ   (1 << 9)        /* policy to creating diropq */
-+#define AuOpt_SUM             (1 << 10)       /* summation for statfs(2) */
-+#define AuOpt_SUM_W           (1 << 11)       /* unimplemented */
-+#define AuOpt_WARN_PERM               (1 << 12)       /* warn when add-branch */
-+#define AuOpt_VERBOSE         (1 << 13)       /* print the cause of error */
-+#define AuOpt_DIO             (1 << 14)       /* direct io */
-+#define AuOpt_DIRREN          (1 << 15)       /* directory rename */
++#define AuOpt_ALWAYS_DIROPQ   BIT(8)          /* policy to creating diropq */
++#define AuOpt_SUM             BIT(9)          /* summation for statfs(2) */
++#define AuOpt_SUM_W           BIT(10)         /* unimplemented */
++#define AuOpt_WARN_PERM               BIT(11)         /* warn when add-branch */
++#define AuOpt_VERBOSE         BIT(12)         /* print the cause of error */
++#define AuOpt_DIO             BIT(13)         /* direct io */
++#define AuOpt_DIRREN          BIT(14)         /* directory rename */
 +
 +#ifndef CONFIG_AUFS_HNOTIFY
 +#undef AuOpt_UDBA_HNOTIFY
@@ -28151,12 +28167,12 @@ diff -urN /usr/share/empty/fs/aufs/opts.h linux/fs/aufs/opts.h
 +};
 +
 +/* opts flags */
-+#define AuOpts_REMOUNT                1
-+#define AuOpts_REFRESH                (1 << 1)
-+#define AuOpts_TRUNC_XIB      (1 << 2)
-+#define AuOpts_REFRESH_DYAOP  (1 << 3)
-+#define AuOpts_REFRESH_IDOP   (1 << 4)
-+#define AuOpts_DR_FLUSHED     (1 << 5)
++#define AuOpts_REMOUNT                BIT(0)
++#define AuOpts_REFRESH                BIT(1)
++#define AuOpts_TRUNC_XIB      BIT(2)
++#define AuOpts_REFRESH_DYAOP  BIT(3)
++#define AuOpts_REFRESH_IDOP   BIT(4)
++#define AuOpts_DR_FLUSHED     BIT(5)
 +#define au_ftest_opts(flags, name)    ((flags) & AuOpts_##name)
 +#define au_fset_opts(flags, name) \
 +      do { (flags) |= AuOpts_##name; } while (0)
@@ -28207,7 +28223,7 @@ diff -urN /usr/share/empty/fs/aufs/opts.h linux/fs/aufs/opts.h
 +#endif /* __AUFS_OPTS_H__ */
 diff -urN /usr/share/empty/fs/aufs/plink.c linux/fs/aufs/plink.c
 --- /usr/share/empty/fs/aufs/plink.c   1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/plink.c      2023-04-07 12:29:13.126380830 +0200
++++ linux/fs/aufs/plink.c      2022-11-05 23:02:18.969222617 +0100
 @@ -0,0 +1,516 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
@@ -28727,7 +28743,7 @@ diff -urN /usr/share/empty/fs/aufs/plink.c linux/fs/aufs/plink.c
 +}
 diff -urN /usr/share/empty/fs/aufs/poll.c linux/fs/aufs/poll.c
 --- /usr/share/empty/fs/aufs/poll.c    1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/poll.c       2023-04-07 12:29:13.126380830 +0200
++++ linux/fs/aufs/poll.c       2022-11-05 23:02:18.969222617 +0100
 @@ -0,0 +1,51 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
@@ -28782,7 +28798,7 @@ diff -urN /usr/share/empty/fs/aufs/poll.c linux/fs/aufs/poll.c
 +}
 diff -urN /usr/share/empty/fs/aufs/posix_acl.c linux/fs/aufs/posix_acl.c
 --- /usr/share/empty/fs/aufs/posix_acl.c       1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/posix_acl.c  2023-04-07 12:29:13.126380830 +0200
++++ linux/fs/aufs/posix_acl.c  2023-10-31 09:31:04.199880750 +0100
 @@ -0,0 +1,108 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
@@ -28854,7 +28870,7 @@ diff -urN /usr/share/empty/fs/aufs/posix_acl.c linux/fs/aufs/posix_acl.c
 +      return acl;
 +}
 +
-+struct posix_acl *aufs_get_acl(struct user_namespace *userns,
++struct posix_acl *aufs_get_acl(struct mnt_idmap *idmap,
 +                             struct dentry *dentry, int type)
 +{
 +      struct posix_acl *acl;
@@ -28866,7 +28882,7 @@ diff -urN /usr/share/empty/fs/aufs/posix_acl.c linux/fs/aufs/posix_acl.c
 +      return acl;
 +}
 +
-+int aufs_set_acl(struct user_namespace *userns, struct dentry *dentry,
++int aufs_set_acl(struct mnt_idmap *idmap, struct dentry *dentry,
 +               struct posix_acl *acl, int type)
 +{
 +      int err;
@@ -28894,7 +28910,7 @@ diff -urN /usr/share/empty/fs/aufs/posix_acl.c linux/fs/aufs/posix_acl.c
 +}
 diff -urN /usr/share/empty/fs/aufs/procfs.c linux/fs/aufs/procfs.c
 --- /usr/share/empty/fs/aufs/procfs.c  1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/procfs.c     2023-04-07 12:29:13.126380830 +0200
++++ linux/fs/aufs/procfs.c     2022-11-05 23:02:18.969222617 +0100
 @@ -0,0 +1,170 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
@@ -29068,7 +29084,7 @@ diff -urN /usr/share/empty/fs/aufs/procfs.c linux/fs/aufs/procfs.c
 +}
 diff -urN /usr/share/empty/fs/aufs/rdu.c linux/fs/aufs/rdu.c
 --- /usr/share/empty/fs/aufs/rdu.c     1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/rdu.c        2023-04-07 12:29:13.126380830 +0200
++++ linux/fs/aufs/rdu.c        2024-03-10 23:40:47.086476782 +0100
 @@ -0,0 +1,384 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
@@ -29098,9 +29114,9 @@ diff -urN /usr/share/empty/fs/aufs/rdu.c linux/fs/aufs/rdu.c
 +#include "aufs.h"
 +
 +/* bits for struct aufs_rdu.flags */
-+#define       AuRdu_CALLED    1
-+#define       AuRdu_CONT      (1 << 1)
-+#define       AuRdu_FULL      (1 << 2)
++#define       AuRdu_CALLED    BIT(0)
++#define       AuRdu_CONT      BIT(1)
++#define       AuRdu_FULL      BIT(2)
 +#define au_ftest_rdu(flags, name)     ((flags) & AuRdu_##name)
 +#define au_fset_rdu(flags, name) \
 +      do { (flags) |= AuRdu_##name; } while (0)
@@ -29222,7 +29238,7 @@ diff -urN /usr/share/empty/fs/aufs/rdu.c linux/fs/aufs/rdu.c
 +      arg.end += rdu->sz;
 +
 +      err = -ENOTDIR;
-+      if (unlikely(!file->f_op->iterate && !file->f_op->iterate_shared))
++      if (unlikely(!file->f_op->iterate_shared))
 +              goto out;
 +
 +      err = security_file_permission(file, MAY_READ);
@@ -29456,7 +29472,7 @@ diff -urN /usr/share/empty/fs/aufs/rdu.c linux/fs/aufs/rdu.c
 +#endif
 diff -urN /usr/share/empty/fs/aufs/rwsem.h linux/fs/aufs/rwsem.h
 --- /usr/share/empty/fs/aufs/rwsem.h   1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/rwsem.h      2023-04-07 12:29:13.129715729 +0200
++++ linux/fs/aufs/rwsem.h      2022-11-05 23:02:18.969222617 +0100
 @@ -0,0 +1,85 @@
 +/* SPDX-License-Identifier: GPL-2.0 */
 +/*
@@ -29545,7 +29561,7 @@ diff -urN /usr/share/empty/fs/aufs/rwsem.h linux/fs/aufs/rwsem.h
 +#endif /* __AUFS_RWSEM_H__ */
 diff -urN /usr/share/empty/fs/aufs/sbinfo.c linux/fs/aufs/sbinfo.c
 --- /usr/share/empty/fs/aufs/sbinfo.c  1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/sbinfo.c     2023-04-07 12:29:13.129715729 +0200
++++ linux/fs/aufs/sbinfo.c     2022-11-05 23:02:18.969222617 +0100
 @@ -0,0 +1,316 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
@@ -29865,7 +29881,7 @@ diff -urN /usr/share/empty/fs/aufs/sbinfo.c linux/fs/aufs/sbinfo.c
 +}
 diff -urN /usr/share/empty/fs/aufs/super.c linux/fs/aufs/super.c
 --- /usr/share/empty/fs/aufs/super.c   1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/super.c      2023-04-07 12:29:13.129715729 +0200
++++ linux/fs/aufs/super.c      2023-10-10 22:51:18.033248030 +0200
 @@ -0,0 +1,871 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
@@ -29986,7 +30002,7 @@ diff -urN /usr/share/empty/fs/aufs/super.c linux/fs/aufs/super.c
 +      return err;
 +}
 +
-+static void au_gen_fmt(char *fmt, int len __maybe_unused, const char *pat,
++static void au_gen_fmt(char *fmt, int len, const char *pat,
 +                     const char *append)
 +{
 +      char *p;
@@ -29995,7 +30011,7 @@ diff -urN /usr/share/empty/fs/aufs/super.c linux/fs/aufs/super.c
 +      while (*pat != ':')
 +              *p++ = *pat++;
 +      *p++ = *pat++;
-+      strcpy(p, append);
++      strscpy(p, append, len - (p - fmt));
 +      AuDebugOn(strlen(fmt) >= len);
 +}
 +
@@ -30740,7 +30756,7 @@ diff -urN /usr/share/empty/fs/aufs/super.c linux/fs/aufs/super.c
 +};
 diff -urN /usr/share/empty/fs/aufs/super.h linux/fs/aufs/super.h
 --- /usr/share/empty/fs/aufs/super.h   1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/super.h      2023-04-07 12:29:13.129715729 +0200
++++ linux/fs/aufs/super.h      2024-03-10 23:40:47.086476782 +0100
 @@ -0,0 +1,592 @@
 +/* SPDX-License-Identifier: GPL-2.0 */
 +/*
@@ -30781,8 +30797,8 @@ diff -urN /usr/share/empty/fs/aufs/super.h linux/fs/aufs/super.h
 +      int (*copyup)(struct dentry *dentry);
 +};
 +
-+#define AuWbr_DIR     1               /* target is a dir */
-+#define AuWbr_PARENT  (1 << 1)        /* always require a parent */
++#define AuWbr_DIR     BIT(0)          /* target is a dir */
++#define AuWbr_PARENT  BIT(1)          /* always require a parent */
 +
 +#define au_ftest_wbr(flags, name)     ((flags) & AuWbr_##name)
 +#define au_fset_wbr(flags, name)      { (flags) |= AuWbr_##name; }
@@ -30953,9 +30969,9 @@ diff -urN /usr/share/empty/fs/aufs/super.h linux/fs/aufs/super.h
 + * then try refreshing dirs at access time again.
 + * if it is false, refreshing dirs at access time is unnecessary
 + */
-+#define AuSi_FAILED_REFRESH_DIR       1
-+#define AuSi_FHSM             (1 << 1)        /* fhsm is active now */
-+#define AuSi_NO_DREVAL                (1 << 2)        /* disable all d_revalidate */
++#define AuSi_FAILED_REFRESH_DIR       BIT(0)
++#define AuSi_FHSM             BIT(1)          /* fhsm is active now */
++#define AuSi_NO_DREVAL                BIT(2)          /* disable all d_revalidate */
 +
 +#ifndef CONFIG_AUFS_FHSM
 +#undef AuSi_FHSM
@@ -30987,15 +31003,15 @@ diff -urN /usr/share/empty/fs/aufs/super.h linux/fs/aufs/super.h
 +      ((sbinfo)->si_wbr_create_ops->create(__VA_ARGS__))
 +
 +/* flags for si_read_lock()/aufs_read_lock()/di_read_lock() */
-+#define AuLock_DW             1               /* write-lock dentry */
-+#define AuLock_IR             (1 << 1)        /* read-lock inode */
-+#define AuLock_IW             (1 << 2)        /* write-lock inode */
-+#define AuLock_FLUSH          (1 << 3)        /* wait for 'nowait' tasks */
-+#define AuLock_DIRS           (1 << 4)        /* target is a pair of dirs */
++#define AuLock_DW             BIT(0)          /* write-lock dentry */
++#define AuLock_IR             BIT(1)          /* read-lock inode */
++#define AuLock_IW             BIT(2)          /* write-lock inode */
++#define AuLock_FLUSH          BIT(3)          /* wait for 'nowait' tasks */
++#define AuLock_DIRS           BIT(4)          /* target is a pair of dirs */
 +                                              /* except RENAME_EXCHANGE */
-+#define AuLock_NOPLM          (1 << 5)        /* return err in plm mode */
-+#define AuLock_NOPLMW         (1 << 6)        /* wait for plm mode ends */
-+#define AuLock_GEN            (1 << 7)        /* test digen/iigen */
++#define AuLock_NOPLM          BIT(5)          /* return err in plm mode */
++#define AuLock_NOPLMW         BIT(6)          /* wait for plm mode ends */
++#define AuLock_GEN            BIT(7)          /* test digen/iigen */
 +#define au_ftest_lock(flags, name)    ((flags) & AuLock_##name)
 +#define au_fset_lock(flags, name) \
 +      do { (flags) |= AuLock_##name; } while (0)
@@ -31336,7 +31352,7 @@ diff -urN /usr/share/empty/fs/aufs/super.h linux/fs/aufs/super.h
 +#endif /* __AUFS_SUPER_H__ */
 diff -urN /usr/share/empty/fs/aufs/sysaufs.c linux/fs/aufs/sysaufs.c
 --- /usr/share/empty/fs/aufs/sysaufs.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/sysaufs.c    2023-04-07 12:29:13.129715729 +0200
++++ linux/fs/aufs/sysaufs.c    2023-10-10 22:51:18.033248030 +0200
 @@ -0,0 +1,94 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
@@ -31383,7 +31399,7 @@ diff -urN /usr/share/empty/fs/aufs/sysaufs.c linux/fs/aufs/sysaufs.c
 +      .show   = sysaufs_si_show
 +};
 +
-+static struct kobj_type au_sbi_ktype = {
++static const struct kobj_type au_sbi_ktype = {
 +      .release        = au_si_free,
 +      .sysfs_ops      = &au_sbi_ops,
 +      .default_groups = sysaufs_si_groups
@@ -31434,7 +31450,7 @@ diff -urN /usr/share/empty/fs/aufs/sysaufs.c linux/fs/aufs/sysaufs.c
 +}
 diff -urN /usr/share/empty/fs/aufs/sysaufs.h linux/fs/aufs/sysaufs.h
 --- /usr/share/empty/fs/aufs/sysaufs.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/sysaufs.h    2023-04-07 12:29:13.129715729 +0200
++++ linux/fs/aufs/sysaufs.h    2022-11-05 23:02:18.969222617 +0100
 @@ -0,0 +1,102 @@
 +/* SPDX-License-Identifier: GPL-2.0 */
 +/*
@@ -31540,7 +31556,7 @@ diff -urN /usr/share/empty/fs/aufs/sysaufs.h linux/fs/aufs/sysaufs.h
 +#endif /* __SYSAUFS_H__ */
 diff -urN /usr/share/empty/fs/aufs/sysfs.c linux/fs/aufs/sysfs.c
 --- /usr/share/empty/fs/aufs/sysfs.c   1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/sysfs.c      2023-04-07 12:29:13.129715729 +0200
++++ linux/fs/aufs/sysfs.c      2022-11-05 23:02:18.969222617 +0100
 @@ -0,0 +1,374 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
@@ -31918,7 +31934,7 @@ diff -urN /usr/share/empty/fs/aufs/sysfs.c linux/fs/aufs/sysfs.c
 +}
 diff -urN /usr/share/empty/fs/aufs/sysrq.c linux/fs/aufs/sysrq.c
 --- /usr/share/empty/fs/aufs/sysrq.c   1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/sysrq.c      2023-04-07 12:29:13.129715729 +0200
++++ linux/fs/aufs/sysrq.c      2023-10-31 09:31:04.199880750 +0100
 @@ -0,0 +1,149 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
@@ -32025,7 +32041,7 @@ diff -urN /usr/share/empty/fs/aufs/sysrq.c linux/fs/aufs/sysrq.c
 +module_param_named(sysrq, aufs_sysrq_key, charp, 0444);
 +MODULE_PARM_DESC(sysrq, "MagicSysRq key for " AUFS_NAME);
 +
-+static void au_sysrq(int key __maybe_unused)
++static void au_sysrq(u8 key __maybe_unused)
 +{
 +      struct au_sbinfo *sbinfo;
 +      struct hlist_bl_node *pos;
@@ -32071,7 +32087,7 @@ diff -urN /usr/share/empty/fs/aufs/sysrq.c linux/fs/aufs/sysrq.c
 +}
 diff -urN /usr/share/empty/fs/aufs/vdir.c linux/fs/aufs/vdir.c
 --- /usr/share/empty/fs/aufs/vdir.c    1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/vdir.c       2023-04-07 12:29:13.129715729 +0200
++++ linux/fs/aufs/vdir.c       2024-03-10 23:40:47.086476782 +0100
 @@ -0,0 +1,896 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
@@ -32502,9 +32518,9 @@ diff -urN /usr/share/empty/fs/aufs/vdir.c linux/fs/aufs/vdir.c
 +
 +/* ---------------------------------------------------------------------- */
 +
-+#define AuFillVdir_CALLED     1
-+#define AuFillVdir_WHABLE     (1 << 1)
-+#define AuFillVdir_SHWH               (1 << 2)
++#define AuFillVdir_CALLED     BIT(0)
++#define AuFillVdir_WHABLE     BIT(1)
++#define AuFillVdir_SHWH               BIT(2)
 +#define au_ftest_fillvdir(flags, name)        ((flags) & AuFillVdir_##name)
 +#define au_fset_fillvdir(flags, name) \
 +      do { (flags) |= AuFillVdir_##name; } while (0)
@@ -32971,8 +32987,8 @@ diff -urN /usr/share/empty/fs/aufs/vdir.c linux/fs/aufs/vdir.c
 +}
 diff -urN /usr/share/empty/fs/aufs/vfsub.c linux/fs/aufs/vfsub.c
 --- /usr/share/empty/fs/aufs/vfsub.c   1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/vfsub.c      2023-04-07 12:29:13.129715729 +0200
-@@ -0,0 +1,918 @@
++++ linux/fs/aufs/vfsub.c      2024-03-10 23:40:47.086476782 +0100
+@@ -0,0 +1,921 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
 + * Copyright (C) 2005-2022 Junjiro R. Okajima
@@ -33199,10 +33215,13 @@ diff -urN /usr/share/empty/fs/aufs/vfsub.c linux/fs/aufs/vfsub.c
 +      lockdep_off();
 +      d = lock_rename(d1, d2);
 +      lockdep_on();
++      if (IS_ERR(d))
++              goto out;
 +      au_hn_suspend(hdir1);
 +      if (hdir1 != hdir2)
 +              au_hn_suspend(hdir2);
 +
++out:
 +      return d;
 +}
 +
@@ -33223,7 +33242,7 @@ diff -urN /usr/share/empty/fs/aufs/vfsub.c linux/fs/aufs/vfsub.c
 +{
 +      int err;
 +      struct dentry *d;
-+      struct user_namespace *userns;
++      struct mnt_idmap *idmap;
 +
 +      IMustLock(dir);
 +
@@ -33233,10 +33252,10 @@ diff -urN /usr/share/empty/fs/aufs/vfsub.c linux/fs/aufs/vfsub.c
 +      path->dentry = d;
 +      if (unlikely(err))
 +              goto out;
-+      userns = mnt_user_ns(path->mnt);
++      idmap = mnt_idmap(path->mnt);
 +
 +      lockdep_off();
-+      err = vfs_create(userns, dir, path->dentry, mode, want_excl);
++      err = vfs_create(idmap, dir, path->dentry, mode, want_excl);
 +      lockdep_on();
 +      if (!err) {
 +              struct path tmp = *path;
@@ -33258,7 +33277,7 @@ diff -urN /usr/share/empty/fs/aufs/vfsub.c linux/fs/aufs/vfsub.c
 +{
 +      int err;
 +      struct dentry *d;
-+      struct user_namespace *userns;
++      struct mnt_idmap *idmap;
 +
 +      IMustLock(dir);
 +
@@ -33268,10 +33287,10 @@ diff -urN /usr/share/empty/fs/aufs/vfsub.c linux/fs/aufs/vfsub.c
 +      path->dentry = d;
 +      if (unlikely(err))
 +              goto out;
-+      userns = mnt_user_ns(path->mnt);
++      idmap = mnt_idmap(path->mnt);
 +
 +      lockdep_off();
-+      err = vfs_symlink(userns, dir, path->dentry, symname);
++      err = vfs_symlink(idmap, dir, path->dentry, symname);
 +      lockdep_on();
 +      if (!err) {
 +              struct path tmp = *path;
@@ -33293,7 +33312,7 @@ diff -urN /usr/share/empty/fs/aufs/vfsub.c linux/fs/aufs/vfsub.c
 +{
 +      int err;
 +      struct dentry *d;
-+      struct user_namespace *userns;
++      struct mnt_idmap *idmap;
 +
 +      IMustLock(dir);
 +
@@ -33303,10 +33322,10 @@ diff -urN /usr/share/empty/fs/aufs/vfsub.c linux/fs/aufs/vfsub.c
 +      path->dentry = d;
 +      if (unlikely(err))
 +              goto out;
-+      userns = mnt_user_ns(path->mnt);
++      idmap = mnt_idmap(path->mnt);
 +
 +      lockdep_off();
-+      err = vfs_mknod(userns, dir, path->dentry, mode, dev);
++      err = vfs_mknod(idmap, dir, path->dentry, mode, dev);
 +      lockdep_on();
 +      if (!err) {
 +              struct path tmp = *path;
@@ -33339,7 +33358,7 @@ diff -urN /usr/share/empty/fs/aufs/vfsub.c linux/fs/aufs/vfsub.c
 +{
 +      int err;
 +      struct dentry *d;
-+      struct user_namespace *userns;
++      struct mnt_idmap *idmap;
 +
 +      IMustLock(dir);
 +
@@ -33354,10 +33373,10 @@ diff -urN /usr/share/empty/fs/aufs/vfsub.c linux/fs/aufs/vfsub.c
 +      path->dentry = d;
 +      if (unlikely(err))
 +              goto out;
-+      userns = mnt_user_ns(path->mnt);
++      idmap = mnt_idmap(path->mnt);
 +
 +      lockdep_off();
-+      err = vfs_link(src_dentry, userns, dir, path->dentry, delegated_inode);
++      err = vfs_link(src_dentry, idmap, dir, path->dentry, delegated_inode);
 +      lockdep_on();
 +      if (!err) {
 +              struct path tmp = *path;
@@ -33400,10 +33419,10 @@ diff -urN /usr/share/empty/fs/aufs/vfsub.c linux/fs/aufs/vfsub.c
 +      if (unlikely(err))
 +              goto out;
 +
-+      rd.old_mnt_userns = mnt_user_ns(path->mnt);
++      rd.old_mnt_idmap = mnt_idmap(path->mnt);
 +      rd.old_dir = src_dir;
 +      rd.old_dentry = src_dentry;
-+      rd.new_mnt_userns = rd.old_mnt_userns;
++      rd.new_mnt_idmap = rd.old_mnt_idmap;
 +      rd.new_dir = dir;
 +      rd.new_dentry = path->dentry;
 +      rd.delegated_inode = delegated_inode;
@@ -33433,7 +33452,7 @@ diff -urN /usr/share/empty/fs/aufs/vfsub.c linux/fs/aufs/vfsub.c
 +{
 +      int err;
 +      struct dentry *d;
-+      struct user_namespace *userns;
++      struct mnt_idmap *idmap;
 +
 +      IMustLock(dir);
 +
@@ -33443,10 +33462,10 @@ diff -urN /usr/share/empty/fs/aufs/vfsub.c linux/fs/aufs/vfsub.c
 +      path->dentry = d;
 +      if (unlikely(err))
 +              goto out;
-+      userns = mnt_user_ns(path->mnt);
++      idmap = mnt_idmap(path->mnt);
 +
 +      lockdep_off();
-+      err = vfs_mkdir(userns, dir, path->dentry, mode);
++      err = vfs_mkdir(idmap, dir, path->dentry, mode);
 +      lockdep_on();
 +      if (!err) {
 +              struct path tmp = *path;
@@ -33468,7 +33487,7 @@ diff -urN /usr/share/empty/fs/aufs/vfsub.c linux/fs/aufs/vfsub.c
 +{
 +      int err;
 +      struct dentry *d;
-+      struct user_namespace *userns;
++      struct mnt_idmap *idmap;
 +
 +      IMustLock(dir);
 +
@@ -33478,10 +33497,10 @@ diff -urN /usr/share/empty/fs/aufs/vfsub.c linux/fs/aufs/vfsub.c
 +      path->dentry = d;
 +      if (unlikely(err))
 +              goto out;
-+      userns = mnt_user_ns(path->mnt);
++      idmap = mnt_idmap(path->mnt);
 +
 +      lockdep_off();
-+      err = vfs_rmdir(userns, dir, path->dentry);
++      err = vfs_rmdir(idmap, dir, path->dentry);
 +      lockdep_on();
 +      if (!err) {
 +              struct path tmp = {
@@ -33586,14 +33605,14 @@ diff -urN /usr/share/empty/fs/aufs/vfsub.c linux/fs/aufs/vfsub.c
 +      return err;
 +}
 +
-+long vfsub_splice_to(struct file *in, loff_t *ppos,
-+                   struct pipe_inode_info *pipe, size_t len,
-+                   unsigned int flags)
++ssize_t vfsub_splice_read(struct file *in, loff_t *ppos,
++                        struct pipe_inode_info *pipe, size_t len,
++                        unsigned int flags)
 +{
-+      long err;
++      ssize_t err;
 +
 +      lockdep_off();
-+      err = do_splice_to(in, ppos, pipe, len, flags);
++      err = vfs_splice_read(in, ppos, pipe, len, flags);
 +      lockdep_on();
 +      file_accessed(in);
 +      if (err >= 0)
@@ -33601,10 +33620,10 @@ diff -urN /usr/share/empty/fs/aufs/vfsub.c linux/fs/aufs/vfsub.c
 +      return err;
 +}
 +
-+long vfsub_splice_from(struct pipe_inode_info *pipe, struct file *out,
-+                     loff_t *ppos, size_t len, unsigned int flags)
++ssize_t vfsub_splice_from(struct pipe_inode_info *pipe, struct file *out,
++                        loff_t *ppos, size_t len, unsigned int flags)
 +{
-+      long err;
++      ssize_t err;
 +
 +      lockdep_off();
 +      err = do_splice_from(pipe, out, ppos, len, flags);
@@ -33639,7 +33658,7 @@ diff -urN /usr/share/empty/fs/aufs/vfsub.c linux/fs/aufs/vfsub.c
 +      int err;
 +      struct inode *h_inode;
 +      struct super_block *h_sb;
-+      struct user_namespace *h_userns;
++      struct mnt_idmap *h_idmap;
 +
 +      if (!h_file) {
 +              err = vfsub_truncate(h_path, length);
@@ -33653,9 +33672,9 @@ diff -urN /usr/share/empty/fs/aufs/vfsub.c linux/fs/aufs/vfsub.c
 +      lockdep_on();
 +      err = security_file_truncate(h_file);
 +      if (!err) {
-+              h_userns = mnt_user_ns(h_path->mnt);
++              h_idmap = mnt_idmap(h_path->mnt);
 +              lockdep_off();
-+              err = do_truncate(h_userns, h_path->dentry, length, attr,
++              err = do_truncate(h_idmap, h_path->dentry, length, attr,
 +                                h_file);
 +              lockdep_on();
 +      }
@@ -33685,10 +33704,10 @@ diff -urN /usr/share/empty/fs/aufs/vfsub.c linux/fs/aufs/vfsub.c
 +int vfsub_sio_mkdir(struct inode *dir, struct path *path, int mode)
 +{
 +      int err, do_sio, wkq_err;
-+      struct user_namespace *userns;
++      struct mnt_idmap *idmap;
 +
-+      userns = mnt_user_ns(path->mnt);
-+      do_sio = au_test_h_perm_sio(userns, dir, MAY_EXEC | MAY_WRITE);
++      idmap = mnt_idmap(path->mnt);
++      do_sio = au_test_h_perm_sio(idmap, dir, MAY_EXEC | MAY_WRITE);
 +      if (!do_sio) {
 +              lockdep_off();
 +              err = vfsub_mkdir(dir, path, mode);
@@ -33723,10 +33742,10 @@ diff -urN /usr/share/empty/fs/aufs/vfsub.c linux/fs/aufs/vfsub.c
 +int vfsub_sio_rmdir(struct inode *dir, struct path *path)
 +{
 +      int err, do_sio, wkq_err;
-+      struct user_namespace *userns;
++      struct mnt_idmap *idmap;
 +
-+      userns = mnt_user_ns(path->mnt);
-+      do_sio = au_test_h_perm_sio(userns, dir, MAY_EXEC | MAY_WRITE);
++      idmap = mnt_idmap(path->mnt);
++      do_sio = au_test_h_perm_sio(idmap, dir, MAY_EXEC | MAY_WRITE);
 +      if (!do_sio) {
 +              lockdep_off();
 +              err = vfsub_rmdir(dir, path);
@@ -33758,16 +33777,16 @@ diff -urN /usr/share/empty/fs/aufs/vfsub.c linux/fs/aufs/vfsub.c
 +{
 +      struct notify_change_args *a = args;
 +      struct inode *h_inode;
-+      struct user_namespace *userns;
++      struct mnt_idmap *idmap;
 +
 +      h_inode = d_inode(a->path->dentry);
 +      IMustLock(h_inode);
 +
 +      *a->errp = -EPERM;
 +      if (!IS_IMMUTABLE(h_inode) && !IS_APPEND(h_inode)) {
-+              userns = mnt_user_ns(a->path->mnt);
++              idmap = mnt_idmap(a->path->mnt);
 +              lockdep_off();
-+              *a->errp = notify_change(userns, a->path->dentry, a->ia,
++              *a->errp = notify_change(idmap, a->path->dentry, a->ia,
 +                                       a->delegated_inode);
 +              lockdep_on();
 +              if (!*a->errp)
@@ -33824,7 +33843,7 @@ diff -urN /usr/share/empty/fs/aufs/vfsub.c linux/fs/aufs/vfsub.c
 +      struct unlink_args *a = args;
 +      struct dentry *d = a->path->dentry;
 +      struct inode *h_inode;
-+      struct user_namespace *userns;
++      struct mnt_idmap *idmap;
 +      const int stop_sillyrename = (au_test_nfs(d->d_sb)
 +                                    && au_dcount(d) == 1);
 +
@@ -33844,9 +33863,9 @@ diff -urN /usr/share/empty/fs/aufs/vfsub.c linux/fs/aufs/vfsub.c
 +              ihold(h_inode);
 +      }
 +
-+      userns = mnt_user_ns(a->path->mnt);
++      idmap = mnt_idmap(a->path->mnt);
 +      lockdep_off();
-+      *a->errp = vfs_unlink(userns, a->dir, d, a->delegated_inode);
++      *a->errp = vfs_unlink(idmap, a->dir, d, a->delegated_inode);
 +      lockdep_on();
 +      if (!*a->errp) {
 +              struct path tmp = {
@@ -33893,8 +33912,8 @@ diff -urN /usr/share/empty/fs/aufs/vfsub.c linux/fs/aufs/vfsub.c
 +}
 diff -urN /usr/share/empty/fs/aufs/vfsub.h linux/fs/aufs/vfsub.h
 --- /usr/share/empty/fs/aufs/vfsub.h   1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/vfsub.h      2023-04-07 12:29:13.129715729 +0200
-@@ -0,0 +1,390 @@
++++ linux/fs/aufs/vfsub.h      2024-03-10 23:40:47.086476782 +0100
+@@ -0,0 +1,402 @@
 +/* SPDX-License-Identifier: GPL-2.0 */
 +/*
 + * Copyright (C) 2005-2022 Junjiro R. Okajima
@@ -33930,7 +33949,6 @@ diff -urN /usr/share/empty/fs/aufs/vfsub.h linux/fs/aufs/vfsub.h
 +
 +/* copied from linux/fs/internal.h */
 +/* todo: BAD approach!! */
-+extern void __mnt_drop_write(struct vfsmount *);
 +extern struct file *alloc_empty_file(int, const struct cred *);
 +
 +/* ---------------------------------------------------------------------- */
@@ -34046,6 +34064,20 @@ diff -urN /usr/share/empty/fs/aufs/vfsub.h linux/fs/aufs/vfsub.h
 +}
 +#endif
 +
++static inline void vfsub_file_start_write(struct file *file)
++{
++      lockdep_off();
++      file_start_write(file);
++      lockdep_on();
++}
++
++static inline void vfsub_file_end_write(struct file *file)
++{
++      lockdep_off();
++      file_end_write(file);
++      lockdep_on();
++}
++
 +/* ---------------------------------------------------------------------- */
 +
 +struct au_hinode;
@@ -34123,34 +34155,33 @@ diff -urN /usr/share/empty/fs/aufs/vfsub.h linux/fs/aufs/vfsub.h
 +}
 +#endif
 +
-+static inline int vfsub_update_time(struct inode *h_inode,
-+                                  struct timespec64 *ts, int flags)
++static inline int vfsub_update_time(struct inode *h_inode, int flags)
 +{
-+      return inode_update_time(h_inode, ts, flags);
++      return inode_update_time(h_inode, flags);
 +      /* no vfsub_update_h_iattr() since we don't have struct path */
 +}
 +
 +#ifdef CONFIG_FS_POSIX_ACL
-+static inline int vfsub_acl_chmod(struct user_namespace *h_userns,
++static inline int vfsub_acl_chmod(struct mnt_idmap *h_idmap,
 +                                struct dentry *h_dentry, umode_t h_mode)
 +{
 +      int err;
 +
-+      err = posix_acl_chmod(h_userns, h_dentry, h_mode);
++      err = posix_acl_chmod(h_idmap, h_dentry, h_mode);
 +      if (err == -EOPNOTSUPP)
 +              err = 0;
 +      return err;
 +}
 +#else
-+AuStubInt0(vfsub_acl_chmod, struct user_namespace *h_userns,
++AuStubInt0(vfsub_acl_chmod, struct mnt_idmap *h_idmap,
 +         struct dentry *h_dentry, umode_t h_mode);
 +#endif
 +
-+long vfsub_splice_to(struct file *in, loff_t *ppos,
-+                   struct pipe_inode_info *pipe, size_t len,
-+                   unsigned int flags);
-+long vfsub_splice_from(struct pipe_inode_info *pipe, struct file *out,
-+                     loff_t *ppos, size_t len, unsigned int flags);
++ssize_t vfsub_splice_read(struct file *in, loff_t *ppos,
++                        struct pipe_inode_info *pipe, size_t len,
++                        unsigned int flags);
++ssize_t vfsub_splice_from(struct pipe_inode_info *pipe, struct file *out,
++                        loff_t *ppos, size_t len, unsigned int flags);
 +
 +static inline long vfsub_truncate(struct path *path, loff_t length)
 +{
@@ -34226,60 +34257,60 @@ diff -urN /usr/share/empty/fs/aufs/vfsub.h linux/fs/aufs/vfsub.h
 +
 +/* ---------------------------------------------------------------------- */
 +
-+static inline int vfsub_setxattr(struct user_namespace *userns,
++static inline int vfsub_setxattr(struct mnt_idmap *idmap,
 +                               struct dentry *dentry, const char *name,
 +                               const void *value, size_t size, int flags)
 +{
 +      int err;
 +
 +      lockdep_off();
-+      err = vfs_setxattr(userns, dentry, name, value, size, flags);
++      err = vfs_setxattr(idmap, dentry, name, value, size, flags);
 +      lockdep_on();
 +
 +      return err;
 +}
 +
-+static inline int vfsub_removexattr(struct user_namespace *userns,
++static inline int vfsub_removexattr(struct mnt_idmap *idmap,
 +                                  struct dentry *dentry, const char *name)
 +{
 +      int err;
 +
 +      lockdep_off();
-+      err = vfs_removexattr(userns, dentry, name);
++      err = vfs_removexattr(idmap, dentry, name);
 +      lockdep_on();
 +
 +      return err;
 +}
 +
 +#ifdef CONFIG_FS_POSIX_ACL
-+static inline int vfsub_set_acl(struct user_namespace *userns,
++static inline int vfsub_set_acl(struct mnt_idmap *idmap,
 +                              struct dentry *dentry, const char *name,
 +                              struct posix_acl *acl)
 +{
 +      int err;
 +
 +      lockdep_off();
-+      err = vfs_set_acl(userns, dentry, name, acl);
++      err = vfs_set_acl(idmap, dentry, name, acl);
 +      lockdep_on();
 +
 +      return err;
 +}
 +
-+static inline int vfsub_remove_acl(struct user_namespace *userns,
++static inline int vfsub_remove_acl(struct mnt_idmap *idmap,
 +                                 struct dentry *dentry, const char *name)
 +{
 +      int err;
 +
 +      lockdep_off();
-+      err = vfs_remove_acl(userns, dentry, name);
++      err = vfs_remove_acl(idmap, dentry, name);
 +      lockdep_on();
 +
 +      return err;
 +}
 +#else
-+AuStubInt0(vfsub_set_acl, struct user_namespace *userns, struct dentry *dentry,
++AuStubInt0(vfsub_set_acl, struct mnt_idmap *idmap, struct dentry *dentry,
 +         const char *name, struct posix_acl *acl);
-+AuStubInt0(vfsub_remove_acl, struct user_namespace *userns,
++AuStubInt0(vfsub_remove_acl, struct mnt_idmap *idmap,
 +         struct dentry *dentry, const char *name);
 +#endif
 +
@@ -34287,7 +34318,7 @@ diff -urN /usr/share/empty/fs/aufs/vfsub.h linux/fs/aufs/vfsub.h
 +#endif /* __AUFS_VFSUB_H__ */
 diff -urN /usr/share/empty/fs/aufs/wbr_policy.c linux/fs/aufs/wbr_policy.c
 --- /usr/share/empty/fs/aufs/wbr_policy.c      1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/wbr_policy.c 2023-04-07 12:29:13.129715729 +0200
++++ linux/fs/aufs/wbr_policy.c 2024-03-10 23:40:47.086476782 +0100
 @@ -0,0 +1,830 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
@@ -34342,10 +34373,10 @@ diff -urN /usr/share/empty/fs/aufs/wbr_policy.c linux/fs/aufs/wbr_policy.c
 +      return err;
 +}
 +
-+#define AuCpdown_PARENT_OPQ   1
-+#define AuCpdown_WHED         (1 << 1)
-+#define AuCpdown_MADE_DIR     (1 << 2)
-+#define AuCpdown_DIROPQ               (1 << 3)
++#define AuCpdown_PARENT_OPQ   BIT(0)
++#define AuCpdown_WHED         BIT(1)
++#define AuCpdown_MADE_DIR     BIT(2)
++#define AuCpdown_DIROPQ               BIT(3)
 +#define au_ftest_cpdown(flags, name)  ((flags) & AuCpdown_##name)
 +#define au_fset_cpdown(flags, name) \
 +      do { (flags) |= AuCpdown_##name; } while (0)
@@ -35121,7 +35152,7 @@ diff -urN /usr/share/empty/fs/aufs/wbr_policy.c linux/fs/aufs/wbr_policy.c
 +};
 diff -urN /usr/share/empty/fs/aufs/whout.c linux/fs/aufs/whout.c
 --- /usr/share/empty/fs/aufs/whout.c   1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/whout.c      2023-04-07 12:29:13.129715729 +0200
++++ linux/fs/aufs/whout.c      2023-10-31 09:31:04.199880750 +0100
 @@ -0,0 +1,1072 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
@@ -35189,7 +35220,7 @@ diff -urN /usr/share/empty/fs/aufs/whout.c linux/fs/aufs/whout.c
 + * test if the @wh_name exists under @h_ppath.
 + * @try_sio specifies the necessary of super-io.
 + */
-+int au_wh_test(struct user_namespace *h_userns, struct path *h_ppath,
++int au_wh_test(struct mnt_idmap *h_idmap, struct path *h_ppath,
 +             struct qstr *wh_name, int try_sio)
 +{
 +      int err;
@@ -35198,7 +35229,7 @@ diff -urN /usr/share/empty/fs/aufs/whout.c linux/fs/aufs/whout.c
 +      if (!try_sio)
 +              wh_dentry = vfsub_lkup_one(wh_name, h_ppath);
 +      else
-+              wh_dentry = au_sio_lkup_one(h_userns, wh_name, h_ppath);
++              wh_dentry = au_sio_lkup_one(h_idmap, wh_name, h_ppath);
 +      err = PTR_ERR(wh_dentry);
 +      if (IS_ERR(wh_dentry)) {
 +              if (err == -ENAMETOOLONG)
@@ -35227,14 +35258,14 @@ diff -urN /usr/share/empty/fs/aufs/whout.c linux/fs/aufs/whout.c
 +/*
 + * test if the @h_path->dentry sets opaque or not.
 + */
-+int au_diropq_test(struct user_namespace *h_userns, struct path *h_path)
++int au_diropq_test(struct mnt_idmap *h_idmap, struct path *h_path)
 +{
 +      int err;
 +      struct inode *h_dir;
 +
 +      h_dir = d_inode(h_path->dentry);
-+      err = au_wh_test(h_userns, h_path, &diropq_name,
-+                       au_test_h_perm_sio(h_userns, h_dir, MAY_EXEC));
++      err = au_wh_test(h_idmap, h_path, &diropq_name,
++                       au_test_h_perm_sio(h_idmap, h_dir, MAY_EXEC));
 +      return err;
 +}
 +
@@ -35252,7 +35283,7 @@ diff -urN /usr/share/empty/fs/aufs/whout.c linux/fs/aufs/whout.c
 +      static unsigned short cnt;
 +      struct qstr qs;
 +      struct path h_ppath;
-+      struct user_namespace *h_userns;
++      struct mnt_idmap *h_idmap;
 +
 +      BUILD_BUG_ON(sizeof(cnt) * 2 > AUFS_WH_TMP_LEN);
 +
@@ -35278,11 +35309,11 @@ diff -urN /usr/share/empty/fs/aufs/whout.c linux/fs/aufs/whout.c
 +
 +      h_ppath.dentry = h_parent;
 +      h_ppath.mnt = au_br_mnt(br);
-+      h_userns = au_br_userns(br);
++      h_idmap = au_br_idmap(br);
 +      qs.name = name;
 +      for (i = 0; i < 3; i++) {
 +              sprintf(p, "%.*x", AUFS_WH_TMP_LEN, cnt++);
-+              dentry = au_sio_lkup_one(h_userns, &qs, &h_ppath);
++              dentry = au_sio_lkup_one(h_idmap, &qs, &h_ppath);
 +              if (IS_ERR(dentry) || d_is_negative(dentry))
 +                      goto out_name;
 +              dput(dentry);
@@ -35879,11 +35910,11 @@ diff -urN /usr/share/empty/fs/aufs/whout.c linux/fs/aufs/whout.c
 +                           unsigned int flags)
 +{
 +      struct dentry *diropq, *h_dentry;
-+      struct user_namespace *h_userns;
++      struct mnt_idmap *h_idmap;
 +
-+      h_userns = au_sbr_userns(dentry->d_sb, bindex);
++      h_idmap = au_sbr_idmap(dentry->d_sb, bindex);
 +      h_dentry = au_h_dptr(dentry, bindex);
-+      if (!au_test_h_perm_sio(h_userns, d_inode(h_dentry),
++      if (!au_test_h_perm_sio(h_idmap, d_inode(h_dentry),
 +                              MAY_EXEC | MAY_WRITE))
 +              diropq = do_diropq(dentry, bindex, flags);
 +      else {
@@ -36072,7 +36103,7 @@ diff -urN /usr/share/empty/fs/aufs/whout.c linux/fs/aufs/whout.c
 +      struct path wh_path;
 +      struct inode *wh_inode, *h_dir;
 +      struct au_branch *br;
-+      struct user_namespace *h_userns;
++      struct mnt_idmap *h_idmap;
 +
 +      h_dir = d_inode(wh_dentry->d_parent); /* dir inode is locked */
 +      IMustLock(h_dir);
@@ -36080,7 +36111,7 @@ diff -urN /usr/share/empty/fs/aufs/whout.c linux/fs/aufs/whout.c
 +      br = au_sbr(dir->i_sb, bindex);
 +      wh_path.dentry = wh_dentry;
 +      wh_path.mnt = au_br_mnt(br);
-+      h_userns = au_br_userns(br);
++      h_idmap = au_br_idmap(br);
 +      wh_inode = d_inode(wh_dentry);
 +      inode_lock_nested(wh_inode, AuLsc_I_CHILD);
 +
@@ -36088,7 +36119,7 @@ diff -urN /usr/share/empty/fs/aufs/whout.c linux/fs/aufs/whout.c
 +       * someone else might change some whiteouts while we were sleeping.
 +       * it means this whlist may have an obsoleted entry.
 +       */
-+      if (!au_test_h_perm_sio(h_userns, wh_inode, MAY_EXEC | MAY_WRITE))
++      if (!au_test_h_perm_sio(h_idmap, wh_inode, MAY_EXEC | MAY_WRITE))
 +              err = del_wh_children(&wh_path, whlist, bindex);
 +      else {
 +              int wkq_err;
@@ -36197,7 +36228,7 @@ diff -urN /usr/share/empty/fs/aufs/whout.c linux/fs/aufs/whout.c
 +}
 diff -urN /usr/share/empty/fs/aufs/whout.h linux/fs/aufs/whout.h
 --- /usr/share/empty/fs/aufs/whout.h   1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/whout.h      2023-04-07 12:29:13.129715729 +0200
++++ linux/fs/aufs/whout.h      2023-10-31 09:31:04.199880750 +0100
 @@ -0,0 +1,87 @@
 +/* SPDX-License-Identifier: GPL-2.0 */
 +/*
@@ -36230,9 +36261,9 @@ diff -urN /usr/share/empty/fs/aufs/whout.h linux/fs/aufs/whout.h
 +
 +/* whout.c */
 +int au_wh_name_alloc(struct qstr *wh, const struct qstr *name);
-+int au_wh_test(struct user_namespace *h_userns, struct path *h_ppath,
++int au_wh_test(struct mnt_idmap *h_idmap, struct path *h_ppath,
 +             struct qstr *wh_name, int try_sio);
-+int au_diropq_test(struct user_namespace *h_userns, struct path *h_path);
++int au_diropq_test(struct mnt_idmap *h_idmap, struct path *h_path);
 +struct au_branch;
 +struct dentry *au_whtmp_lkup(struct dentry *h_parent, struct au_branch *br,
 +                           struct qstr *prefix);
@@ -36288,7 +36319,7 @@ diff -urN /usr/share/empty/fs/aufs/whout.h linux/fs/aufs/whout.h
 +#endif /* __AUFS_WHOUT_H__ */
 diff -urN /usr/share/empty/fs/aufs/wkq.c linux/fs/aufs/wkq.c
 --- /usr/share/empty/fs/aufs/wkq.c     1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/wkq.c        2023-04-07 12:29:13.129715729 +0200
++++ linux/fs/aufs/wkq.c        2022-11-05 23:02:18.972555950 +0100
 @@ -0,0 +1,372 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
@@ -36664,7 +36695,7 @@ diff -urN /usr/share/empty/fs/aufs/wkq.c linux/fs/aufs/wkq.c
 +}
 diff -urN /usr/share/empty/fs/aufs/wkq.h linux/fs/aufs/wkq.h
 --- /usr/share/empty/fs/aufs/wkq.h     1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/wkq.h        2023-04-07 12:29:13.129715729 +0200
++++ linux/fs/aufs/wkq.h        2024-03-10 23:40:47.086476782 +0100
 @@ -0,0 +1,89 @@
 +/* SPDX-License-Identifier: GPL-2.0 */
 +/*
@@ -36713,8 +36744,8 @@ diff -urN /usr/share/empty/fs/aufs/wkq.h linux/fs/aufs/wkq.h
 +typedef void (*au_wkq_func_t)(void *args);
 +
 +/* wkq flags */
-+#define AuWkq_WAIT    1
-+#define AuWkq_NEST    (1 << 1)
++#define AuWkq_WAIT    BIT(0)
++#define AuWkq_NEST    BIT(1)
 +#define au_ftest_wkq(flags, name)     ((flags) & AuWkq_##name)
 +#define au_fset_wkq(flags, name) \
 +      do { (flags) |= AuWkq_##name; } while (0)
@@ -36757,8 +36788,8 @@ diff -urN /usr/share/empty/fs/aufs/wkq.h linux/fs/aufs/wkq.h
 +#endif /* __AUFS_WKQ_H__ */
 diff -urN /usr/share/empty/fs/aufs/xattr.c linux/fs/aufs/xattr.c
 --- /usr/share/empty/fs/aufs/xattr.c   1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/xattr.c      2023-04-07 12:29:13.129715729 +0200
-@@ -0,0 +1,365 @@
++++ linux/fs/aufs/xattr.c      2024-03-10 23:40:47.086476782 +0100
+@@ -0,0 +1,360 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
 + * Copyright (C) 2014-2022 Junjiro R. Okajima
@@ -36782,7 +36813,6 @@ diff -urN /usr/share/empty/fs/aufs/xattr.c linux/fs/aufs/xattr.c
 + */
 +
 +#include <linux/fs.h>
-+#include <linux/posix_acl_xattr.h>
 +#include <linux/xattr.h>
 +#include "aufs.h"
 +
@@ -36833,16 +36863,16 @@ diff -urN /usr/share/empty/fs/aufs/xattr.c linux/fs/aufs/xattr.c
 +      ssize_t ssz;
 +      struct inode *h_idst;
 +      struct dentry *h_dst_dentry, *h_src_dentry;
-+      struct user_namespace *h_dst_userns, *h_src_userns;
++      struct mnt_idmap *h_dst_idmap, *h_src_idmap;
 +      struct posix_acl *acl;
 +
 +      is_acl = !!is_posix_acl_xattr(name);
-+      h_src_userns = mnt_user_ns(h_src->mnt);
++      h_src_idmap = mnt_idmap(h_src->mnt);
 +      h_src_dentry = h_src->dentry;
 +      if (is_acl) {
-+              acl = vfs_get_acl(h_src_userns, h_src_dentry, name);
++              acl = vfs_get_acl(h_src_idmap, h_src_dentry, name);
 +              AuDebugOn(!acl);
-+              if (unlikely(IS_ERR(acl))) {
++              if (IS_ERR(acl)) {
 +                      err = PTR_ERR(acl);
 +                      if (err == -ENODATA)
 +                              err = 0;
@@ -36854,7 +36884,7 @@ diff -urN /usr/share/empty/fs/aufs/xattr.c linux/fs/aufs/xattr.c
 +                      goto out;
 +              }
 +      } else {
-+              ssz = vfs_getxattr_alloc(h_src_userns, h_src_dentry, name, buf,
++              ssz = vfs_getxattr_alloc(h_src_idmap, h_src_dentry, name, buf,
 +                                       0, GFP_NOFS);
 +              if (unlikely(ssz <= 0)) {
 +                      err = ssz;
@@ -36870,15 +36900,15 @@ diff -urN /usr/share/empty/fs/aufs/xattr.c linux/fs/aufs/xattr.c
 +      }
 +
 +      /* unlock it temporary */
-+      h_dst_userns = mnt_user_ns(h_dst->mnt);
++      h_dst_idmap = mnt_idmap(h_dst->mnt);
 +      h_dst_dentry = h_dst->dentry;
 +      h_idst = d_inode(h_dst_dentry);
 +      inode_unlock(h_idst);
 +      if (is_acl) {
-+              err = vfsub_set_acl(h_dst_userns, h_dst_dentry, name, acl);
++              err = vfsub_set_acl(h_dst_idmap, h_dst_dentry, name, acl);
 +              posix_acl_release(acl);
 +      } else
-+              err = vfsub_setxattr(h_dst_userns, h_dst_dentry, name, *buf,
++              err = vfsub_setxattr(h_dst_idmap, h_dst_dentry, name, *buf,
 +                                   ssz, /*flags*/0);
 +      inode_lock_nested(h_idst, AuLsc_I_CHILD2);
 +      if (unlikely(err)) {
@@ -37024,7 +37054,7 @@ diff -urN /usr/share/empty/fs/aufs/xattr.c linux/fs/aufs/xattr.c
 +              break;
 +      case AU_XATTR_GET:
 +              AuDebugOn(d_is_negative(h_path.dentry));
-+              err = vfs_getxattr(mnt_user_ns(h_path.mnt), h_path.dentry,
++              err = vfs_getxattr(mnt_idmap(h_path.mnt), h_path.dentry,
 +                                 arg->u.get.name, arg->u.get.value,
 +                                 arg->u.get.size);
 +              break;
@@ -37096,7 +37126,7 @@ diff -urN /usr/share/empty/fs/aufs/xattr.c linux/fs/aufs/xattr.c
 +}
 +
 +static int au_xattr_set(const struct xattr_handler *handler,
-+                      struct user_namespace *userns,
++                      struct mnt_idmap *idmap,
 +                      struct dentry *dentry, struct inode *inode,
 +                      const char *name, const void *value, size_t size,
 +                      int flags)
@@ -37112,10 +37142,6 @@ diff -urN /usr/share/empty/fs/aufs/xattr.c linux/fs/aufs/xattr.c
 +};
 +
 +static const struct xattr_handler *au_xattr_handlers[] = {
-+#ifdef CONFIG_FS_POSIX_ACL
-+      &posix_acl_access_xattr_handler,
-+      &posix_acl_default_xattr_handler,
-+#endif
 +      &au_xattr_handler, /* must be last */
 +      NULL
 +};
@@ -37126,7 +37152,7 @@ diff -urN /usr/share/empty/fs/aufs/xattr.c linux/fs/aufs/xattr.c
 +}
 diff -urN /usr/share/empty/fs/aufs/xino.c linux/fs/aufs/xino.c
 --- /usr/share/empty/fs/aufs/xino.c    1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/xino.c       2023-04-07 12:29:13.129715729 +0200
++++ linux/fs/aufs/xino.c       2023-10-31 09:31:04.203214083 +0100
 @@ -0,0 +1,1926 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
@@ -37389,7 +37415,7 @@ diff -urN /usr/share/empty/fs/aufs/xino.c linux/fs/aufs/xino.c
 +      }
 +
 +      /* no need to mnt_want_write() since we call dentry_open() later */
-+      err = vfs_create(mnt_user_ns(base->mnt), dir, path.dentry, 0666, NULL);
++      err = vfs_create(mnt_idmap(base->mnt), dir, path.dentry, 0666, NULL);
 +      if (unlikely(err)) {
 +              file = ERR_PTR(err);
 +              pr_err("%pd create err %d\n", dentry, err);
@@ -39056,7 +39082,7 @@ diff -urN /usr/share/empty/fs/aufs/xino.c linux/fs/aufs/xino.c
 +}
 diff -urN /usr/share/empty/include/uapi/linux/aufs_type.h linux/include/uapi/linux/aufs_type.h
 --- /usr/share/empty/include/uapi/linux/aufs_type.h    1970-01-01 01:00:00.000000000 +0100
-+++ linux/include/uapi/linux/aufs_type.h       2023-04-07 12:29:13.129715729 +0200
++++ linux/include/uapi/linux/aufs_type.h       2024-03-10 23:40:47.086476782 +0100
 @@ -0,0 +1,452 @@
 +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 +/*
@@ -39100,7 +39126,7 @@ diff -urN /usr/share/empty/include/uapi/linux/aufs_type.h linux/include/uapi/lin
 +#include <limits.h>
 +#endif /* __KERNEL__ */
 +
-+#define AUFS_VERSION  "6.2-20230227"
++#define AUFS_VERSION  "6.x-rcN-20240226"
 +
 +/* todo? move this to linux-2.6.19/include/magic.h */
 +#define AUFS_SUPER_MAGIC      ('a' << 24 | 'u' << 16 | 'f' << 8 | 's')
@@ -39511,10 +39537,10 @@ diff -urN /usr/share/empty/include/uapi/linux/aufs_type.h linux/include/uapi/lin
 +
 +#endif /* __AUFS_TYPE_H__ */
 SPDX-License-Identifier: GPL-2.0
-aufs6.2 loopback patch
+aufs6.x-rcN loopback patch
 
 diff --git a/drivers/block/loop.c b/drivers/block/loop.c
-index 7a9928c6db9d..0bac486deea2 100644
+index 333b3915fe86..1eb5bde57477 100644
 --- a/drivers/block/loop.c
 +++ b/drivers/block/loop.c
 @@ -54,7 +54,7 @@ struct loop_device {
@@ -39526,7 +39552,7 @@ index 7a9928c6db9d..0bac486deea2 100644
        struct block_device *lo_device;
  
        gfp_t           old_gfp_mask;
-@@ -510,6 +510,15 @@ static inline void loop_update_dio(struct loop_device *lo)
+@@ -506,6 +506,15 @@ static inline void loop_update_dio(struct loop_device *lo)
                                lo->use_dio);
  }
  
@@ -39542,7 +39568,7 @@ index 7a9928c6db9d..0bac486deea2 100644
  static void loop_reread_partitions(struct loop_device *lo)
  {
        int rc;
-@@ -567,6 +576,7 @@ static int loop_change_fd(struct loop_device *lo, struct block_device *bdev,
+@@ -563,6 +572,7 @@ static int loop_change_fd(struct loop_device *lo, struct block_device *bdev,
  {
        struct file *file = fget(arg);
        struct file *old_file;
@@ -39550,7 +39576,7 @@ index 7a9928c6db9d..0bac486deea2 100644
        int error;
        bool partscan;
        bool is_loop;
-@@ -590,11 +600,19 @@ static int loop_change_fd(struct loop_device *lo, struct block_device *bdev,
+@@ -586,11 +596,19 @@ static int loop_change_fd(struct loop_device *lo, struct block_device *bdev,
        if (!(lo->lo_flags & LO_FLAGS_READ_ONLY))
                goto out_err;
  
@@ -39570,7 +39596,7 @@ index 7a9928c6db9d..0bac486deea2 100644
  
        error = -EINVAL;
  
-@@ -607,6 +625,7 @@ static int loop_change_fd(struct loop_device *lo, struct block_device *bdev,
+@@ -603,6 +621,7 @@ static int loop_change_fd(struct loop_device *lo, struct block_device *bdev,
        blk_mq_freeze_queue(lo->lo_queue);
        mapping_set_gfp_mask(old_file->f_mapping, lo->old_gfp_mask);
        lo->lo_backing_file = file;
@@ -39578,7 +39604,7 @@ index 7a9928c6db9d..0bac486deea2 100644
        lo->old_gfp_mask = mapping_gfp_mask(file->f_mapping);
        mapping_set_gfp_mask(file->f_mapping,
                             lo->old_gfp_mask & ~(__GFP_IO|__GFP_FS));
-@@ -629,6 +648,8 @@ static int loop_change_fd(struct loop_device *lo, struct block_device *bdev,
+@@ -625,6 +644,8 @@ static int loop_change_fd(struct loop_device *lo, struct block_device *bdev,
         * dependency.
         */
        fput(old_file);
@@ -39587,7 +39613,7 @@ index 7a9928c6db9d..0bac486deea2 100644
        if (partscan)
                loop_reread_partitions(lo);
  
-@@ -642,6 +663,8 @@ static int loop_change_fd(struct loop_device *lo, struct block_device *bdev,
+@@ -638,6 +659,8 @@ static int loop_change_fd(struct loop_device *lo, struct block_device *bdev,
        loop_global_unlock(lo, is_loop);
  out_putf:
        fput(file);
@@ -39596,7 +39622,7 @@ index 7a9928c6db9d..0bac486deea2 100644
        goto done;
  }
  
-@@ -1013,6 +1036,7 @@ static int loop_configure(struct loop_device *lo, fmode_t mode,
+@@ -1009,6 +1032,7 @@ static int loop_configure(struct loop_device *lo, blk_mode_t mode,
                          const struct loop_config *config)
  {
        struct file *file = fget(config->fd);
@@ -39604,7 +39630,7 @@ index 7a9928c6db9d..0bac486deea2 100644
        struct inode *inode;
        struct address_space *mapping;
        int error;
-@@ -1031,6 +1055,13 @@ static int loop_configure(struct loop_device *lo, fmode_t mode,
+@@ -1024,6 +1048,13 @@ static int loop_configure(struct loop_device *lo, blk_mode_t mode,
        /* This is safe, since we have a reference from open(). */
        __module_get(THIS_MODULE);
  
@@ -39618,7 +39644,7 @@ index 7a9928c6db9d..0bac486deea2 100644
        /*
         * If we don't hold exclusive handle for the device, upgrade to it
         * here to avoid changing device under exclusive owner.
-@@ -1091,6 +1122,7 @@ static int loop_configure(struct loop_device *lo, fmode_t mode,
+@@ -1087,6 +1118,7 @@ static int loop_configure(struct loop_device *lo, blk_mode_t mode,
        lo->use_dio = lo->lo_flags & LO_FLAGS_DIRECT_IO;
        lo->lo_device = bdev;
        lo->lo_backing_file = file;
@@ -39626,7 +39652,7 @@ index 7a9928c6db9d..0bac486deea2 100644
        lo->old_gfp_mask = mapping_gfp_mask(mapping);
        mapping_set_gfp_mask(mapping, lo->old_gfp_mask & ~(__GFP_IO|__GFP_FS));
  
-@@ -1146,6 +1178,8 @@ static int loop_configure(struct loop_device *lo, fmode_t mode,
+@@ -1142,6 +1174,8 @@ static int loop_configure(struct loop_device *lo, blk_mode_t mode,
                bd_abort_claiming(bdev, loop_configure);
  out_putf:
        fput(file);
@@ -39635,7 +39661,7 @@ index 7a9928c6db9d..0bac486deea2 100644
        /* This is safe: open() is still holding a reference. */
        module_put(THIS_MODULE);
        return error;
-@@ -1154,6 +1188,7 @@ static int loop_configure(struct loop_device *lo, fmode_t mode,
+@@ -1150,6 +1184,7 @@ static int loop_configure(struct loop_device *lo, blk_mode_t mode,
  static void __loop_clr_fd(struct loop_device *lo, bool release)
  {
        struct file *filp;
@@ -39643,7 +39669,7 @@ index 7a9928c6db9d..0bac486deea2 100644
        gfp_t gfp = lo->old_gfp_mask;
  
        if (test_bit(QUEUE_FLAG_WC, &lo->lo_queue->queue_flags))
-@@ -1170,6 +1205,7 @@ static void __loop_clr_fd(struct loop_device *lo, bool release)
+@@ -1166,6 +1201,7 @@ static void __loop_clr_fd(struct loop_device *lo, bool release)
        spin_lock_irq(&lo->lo_lock);
        filp = lo->lo_backing_file;
        lo->lo_backing_file = NULL;
@@ -39651,7 +39677,7 @@ index 7a9928c6db9d..0bac486deea2 100644
        spin_unlock_irq(&lo->lo_lock);
  
        lo->lo_device = NULL;
-@@ -1232,6 +1268,8 @@ static void __loop_clr_fd(struct loop_device *lo, bool release)
+@@ -1228,6 +1264,8 @@ static void __loop_clr_fd(struct loop_device *lo, bool release)
         * fput can take open_mutex which is usually taken before lo_mutex.
         */
        fput(filp);
@@ -39661,10 +39687,10 @@ index 7a9928c6db9d..0bac486deea2 100644
  
  static int loop_clr_fd(struct loop_device *lo)
 diff --git a/fs/aufs/f_op.c b/fs/aufs/f_op.c
-index 1ed300047a41..ea63191d6473 100644
+index fa8a517ffd0c..c18f7bcef81b 100644
 --- a/fs/aufs/f_op.c
 +++ b/fs/aufs/f_op.c
-@@ -309,7 +309,7 @@ static ssize_t aufs_read_iter(struct kiocb *kio, struct iov_iter *iov_iter)
+@@ -311,7 +311,7 @@ static ssize_t aufs_read_iter(struct kiocb *kio, struct iov_iter *iov_iter)
        if (IS_ERR(h_file))
                goto out;
  
@@ -39720,7 +39746,7 @@ index 03d4908a6c03..34d356e181d5 100644
  
  #endif /* __KERNEL__ */
 diff --git a/fs/aufs/super.c b/fs/aufs/super.c
-index 81922d4faf54..c8a62c267d72 100644
+index 07d3412e950f..c4a00f620e57 100644
 --- a/fs/aufs/super.c
 +++ b/fs/aufs/super.c
 @@ -758,7 +758,10 @@ const struct super_operations aufs_sop = {
@@ -39736,13 +39762,14 @@ index 81922d4faf54..c8a62c267d72 100644
  
  /* ---------------------------------------------------------------------- */
 diff --git a/include/linux/fs.h b/include/linux/fs.h
-index ec560e8704a4..fc6e4d469419 100644
+index 96ca249ee1e6..b21abb1a2134 100644
 --- a/include/linux/fs.h
 +++ b/include/linux/fs.h
-@@ -2255,6 +2255,10 @@ struct super_operations {
-                                 struct shrink_control *);
+@@ -2165,6 +2165,11 @@ struct super_operations {
        long (*free_cached_objects)(struct super_block *,
                                    struct shrink_control *);
+       void (*shutdown)(struct super_block *sb);
++
 +#if IS_ENABLED(CONFIG_BLK_DEV_LOOP) || IS_ENABLED(CONFIG_BLK_DEV_LOOP_MODULE)
 +      /* and aufs */
 +      struct file *(*real_loop)(struct file *);
This page took 0.471881 seconds and 4 git commands to generate.