]> git.pld-linux.org Git - packages/kernel.git/blobdiff - kernel-aufs5.patch
- 5.16.15
[packages/kernel.git] / kernel-aufs5.patch
index c5917fda9632c6afb384beb07effc86882a689f2..f937d3a4279e2f6b9514e07af21c0ffb37dd98c3 100644 (file)
@@ -2,10 +2,10 @@ SPDX-License-Identifier: GPL-2.0
 aufs5.x-rcN kbuild patch
 
 diff --git a/fs/Kconfig b/fs/Kconfig
-index 141a856c50e71..6741d695b1df8 100644
+index a6313a969bc5f..aca4b89d41a14 100644
 --- a/fs/Kconfig
 +++ b/fs/Kconfig
-@@ -292,6 +292,7 @@ source "fs/sysv/Kconfig"
+@@ -312,6 +312,7 @@ source "fs/sysv/Kconfig"
  source "fs/ufs/Kconfig"
  source "fs/erofs/Kconfig"
  source "fs/vboxsf/Kconfig"
@@ -14,10 +14,10 @@ index 141a856c50e71..6741d695b1df8 100644
  endif # MISC_FILESYSTEMS
  
 diff --git a/fs/Makefile b/fs/Makefile
-index 9c708e1fbe8fb..fde6be84a0830 100644
+index 84c5e4cdfee5a..b4fcdad8412ed 100644
 --- a/fs/Makefile
 +++ b/fs/Makefile
-@@ -136,3 +136,4 @@ obj-$(CONFIG_EFIVAR_FS)            += efivarfs/
+@@ -138,3 +138,4 @@ obj-$(CONFIG_EFIVAR_FS)            += efivarfs/
  obj-$(CONFIG_EROFS_FS)                += erofs/
  obj-$(CONFIG_VBOXSF_FS)               += vboxsf/
  obj-$(CONFIG_ZONEFS_FS)               += zonefs/
@@ -26,10 +26,10 @@ SPDX-License-Identifier: GPL-2.0
 aufs5.x-rcN base patch
 
 diff --git a/MAINTAINERS b/MAINTAINERS
-index bd7aff0c120f2..7c4bc08596e0b 100644
+index 5250298d28170..6b11c93d6750a 100644
 --- a/MAINTAINERS
 +++ b/MAINTAINERS
-@@ -3040,6 +3040,19 @@ F:      include/uapi/linux/audit.h
+@@ -3169,6 +3169,19 @@ F:      include/uapi/linux/audit.h
  F:    kernel/audit*
  F:    lib/*audit.c
  
@@ -50,10 +50,10 @@ index bd7aff0c120f2..7c4bc08596e0b 100644
  M:    Miguel Ojeda <ojeda@kernel.org>
  S:    Maintained
 diff --git a/drivers/block/loop.c b/drivers/block/loop.c
-index d58d68f3c7cd0..794a8a1341989 100644
+index a154cab6cd989..52776d48e306a 100644
 --- a/drivers/block/loop.c
 +++ b/drivers/block/loop.c
-@@ -762,6 +762,24 @@ static int loop_change_fd(struct loop_device *lo, struct block_device *bdev,
+@@ -635,6 +635,24 @@ static int loop_change_fd(struct loop_device *lo, struct block_device *bdev,
        return error;
  }
  
@@ -92,7 +92,7 @@ index cf871a81f4fdc..bc5095b734f58 100644
  {
        struct dentry *this_parent;
 diff --git a/fs/fcntl.c b/fs/fcntl.c
-index dfc72f15be7fc..d8a12eb63961d 100644
+index 9c6c6a3e2de51..02382fa9bd341 100644
 --- a/fs/fcntl.c
 +++ b/fs/fcntl.c
 @@ -33,7 +33,7 @@
@@ -113,24 +113,11 @@ index dfc72f15be7fc..d8a12eb63961d 100644
        if (error)
                return error;
  
-diff --git a/fs/inode.c b/fs/inode.c
-index c93500d84264d..f24d21236ad01 100644
---- a/fs/inode.c
-+++ b/fs/inode.c
-@@ -1778,7 +1778,7 @@ EXPORT_SYMBOL(generic_update_time);
-  * This does the actual work of updating an inodes time or version.  Must have
-  * had called mnt_want_write() before calling this.
-  */
--static int update_time(struct inode *inode, struct timespec64 *time, int flags)
-+int update_time(struct inode *inode, struct timespec64 *time, int flags)
- {
-       if (inode->i_op->update_time)
-               return inode->i_op->update_time(inode, time, flags);
 diff --git a/fs/namespace.c b/fs/namespace.c
-index f63337828e1c4..099e89c81af7c 100644
+index 659a8f39c61af..1283670737826 100644
 --- a/fs/namespace.c
 +++ b/fs/namespace.c
-@@ -807,6 +807,12 @@ static inline int check_mnt(struct mount *mnt)
+@@ -808,6 +808,12 @@ static inline int check_mnt(struct mount *mnt)
        return mnt->mnt_ns == current->nsproxy->mnt_ns;
  }
  
@@ -171,24 +158,11 @@ index 5dbce4dcc1a7d..3e6ba363b7775 100644
  {
        unsigned int p_space;
        int ret;
-diff --git a/fs/sync.c b/fs/sync.c
-index 1373a610dc784..b7b5a0a0df6ff 100644
---- a/fs/sync.c
-+++ b/fs/sync.c
-@@ -28,7 +28,7 @@
-  * wait == 1 case since in that case write_inode() functions do
-  * sync_dirty_buffer() and thus effectively write one block at a time.
-  */
--static int __sync_filesystem(struct super_block *sb, int wait)
-+int __sync_filesystem(struct super_block *sb, int wait)
- {
-       if (wait)
-               sync_inodes_sb(sb);
 diff --git a/include/linux/fs.h b/include/linux/fs.h
-index c3c88fdb9b2a5..93eb43e002d97 100644
+index 1cb616fc11053..02ce64c28ef15 100644
 --- a/include/linux/fs.h
 +++ b/include/linux/fs.h
-@@ -1335,6 +1335,7 @@ extern void fasync_free(struct fasync_struct *);
+@@ -1378,6 +1378,7 @@ extern void fasync_free(struct fasync_struct *);
  /* can be called from interrupts */
  extern void kill_fasync(struct fasync_struct **, int, int);
  
@@ -196,7 +170,7 @@ index c3c88fdb9b2a5..93eb43e002d97 100644
  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 void f_delown(struct file *filp);
-@@ -2043,6 +2044,7 @@ struct file_operations {
+@@ -2091,6 +2092,7 @@ struct file_operations {
        ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int);
        unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long);
        int (*check_flags)(int);
@@ -204,7 +178,7 @@ index c3c88fdb9b2a5..93eb43e002d97 100644
        int (*flock) (struct file *, int, struct file_lock *);
        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);
-@@ -2565,6 +2567,7 @@ extern int current_umask(void);
+@@ -2614,6 +2616,7 @@ extern int current_umask(void);
  extern void ihold(struct inode * inode);
  extern void iput(struct inode *);
  extern int generic_update_time(struct inode *, struct timespec64 *, int);
@@ -212,7 +186,7 @@ index c3c88fdb9b2a5..93eb43e002d97 100644
  
  /* /sys/fs */
  extern struct kobject *fs_kobj;
-@@ -2805,6 +2808,7 @@ static inline bool sb_is_blkdev_sb(struct super_block *sb)
+@@ -2777,6 +2780,7 @@ static inline bool sb_is_blkdev_sb(struct super_block *sb)
  }
  
  void emergency_thaw_all(void);
@@ -221,7 +195,7 @@ index c3c88fdb9b2a5..93eb43e002d97 100644
  extern const struct file_operations def_blk_fops;
  extern const struct file_operations def_chr_fops;
 diff --git a/include/linux/lockdep.h b/include/linux/lockdep.h
-index 5cf3878137549..59b65e1a9e85c 100644
+index 467b94257105e..dab20282c82e2 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,
@@ -269,7 +243,7 @@ index a55179fd60fc3..8e21c53cf8831 100644
 +                       unsigned int flags);
  #endif
 diff --git a/kernel/locking/lockdep.c b/kernel/locking/lockdep.c
-index 48d736aa03b24..dce278159546c 100644
+index 2270ec68f10a1..fbb8e650c1749 100644
 --- a/kernel/locking/lockdep.c
 +++ b/kernel/locking/lockdep.c
 @@ -189,7 +189,7 @@ static
@@ -293,10 +267,10 @@ SPDX-License-Identifier: GPL-2.0
 aufs5.x-rcN mmap patch
 
 diff --git a/fs/proc/base.c b/fs/proc/base.c
-index 3851bfcdba56e..d632ddd5f5ee8 100644
+index 13eda8de29981..24fd5e986cb79 100644
 --- a/fs/proc/base.c
 +++ b/fs/proc/base.c
-@@ -2183,7 +2183,7 @@ static int map_files_get_link(struct dentry *dentry, struct path *path)
+@@ -2191,7 +2191,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) {
@@ -322,7 +296,7 @@ index 13452b32e2bd5..38acccfef9d49 100644
                ino = inode->i_ino;
        }
 diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c
-index fc9784544b241..84ba06f5158e9 100644
+index ad667dbc96f5c..d50423613c8ed 100644
 --- a/fs/proc/task_mmu.c
 +++ b/fs/proc/task_mmu.c
 @@ -280,7 +280,10 @@ show_map_vma(struct seq_file *m, struct vm_area_struct *vma)
@@ -337,7 +311,7 @@ index fc9784544b241..84ba06f5158e9 100644
                dev = inode->i_sb->s_dev;
                ino = inode->i_ino;
                pgoff = ((loff_t)vma->vm_pgoff) << PAGE_SHIFT;
-@@ -1864,7 +1867,7 @@ static int show_numa_map(struct seq_file *m, void *v)
+@@ -1869,7 +1872,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;
@@ -363,10 +337,10 @@ index a6d21fc0033c6..02c2de31196e0 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 322ec61d0da79..ae6f0584e4c98 100644
+index a7e4a9e7d807a..30699240b45d6 100644
 --- a/include/linux/mm.h
 +++ b/include/linux/mm.h
-@@ -1798,6 +1798,28 @@ static inline void unmap_shared_mapping_range(struct address_space *mapping,
+@@ -1926,6 +1926,28 @@ static inline void unmap_shared_mapping_range(struct address_space *mapping,
        unmap_mapping_range(mapping, holebegin, holelen, 0);
  }
  
@@ -396,10 +370,10 @@ index 322ec61d0da79..ae6f0584e4c98 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 6613b26a88946..e94df45b5483a 100644
+index c3a6e62096006..45f5754d51cd1 100644
 --- a/include/linux/mm_types.h
 +++ b/include/linux/mm_types.h
-@@ -279,6 +279,7 @@ struct vm_region {
+@@ -370,6 +370,7 @@ 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 */
@@ -407,7 +381,7 @@ index 6613b26a88946..e94df45b5483a 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
-@@ -358,6 +359,7 @@ struct vm_area_struct {
+@@ -449,6 +450,7 @@ 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). */
@@ -416,20 +390,20 @@ index 6613b26a88946..e94df45b5483a 100644
  
  #ifdef CONFIG_SWAP
 diff --git a/kernel/fork.c b/kernel/fork.c
-index dc06afd725cbd..66f1486e63e35 100644
+index 3244cc56b697d..ae63cce182fdc 100644
 --- a/kernel/fork.c
 +++ b/kernel/fork.c
-@@ -559,7 +559,7 @@ static __latent_entropy int dup_mmap(struct mm_struct *mm,
-                       struct inode *inode = file_inode(file);
+@@ -572,7 +572,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);
-                       if (tmp->vm_flags & VM_DENYWRITE)
-                               put_write_access(inode);
                        i_mmap_lock_write(mapping);
+                       if (tmp->vm_flags & VM_SHARED)
+                               mapping_allow_writable(mapping);
 diff --git a/mm/Makefile b/mm/Makefile
-index bf71e295e9f69..bd223b81c564c 100644
+index d6c0042e3aa0d..1f11c655a632b 100644
 --- a/mm/Makefile
 +++ b/mm/Makefile
 @@ -52,7 +52,7 @@ obj-y                        := filemap.o mempool.o oom_kill.o fadvise.o \
@@ -442,10 +416,10 @@ index bf71e295e9f69..bd223b81c564c 100644
  # Give 'page_alloc' its own module-parameter namespace
  page-alloc-y := page_alloc.o
 diff --git a/mm/filemap.c b/mm/filemap.c
-index 66f7e9fdfbc4f..f9a8ff48e697a 100644
+index daa0e23a6ee66..1c1f517516f26 100644
 --- a/mm/filemap.c
 +++ b/mm/filemap.c
-@@ -3240,7 +3240,7 @@ vm_fault_t filemap_page_mkwrite(struct vm_fault *vmf)
+@@ -3358,7 +3358,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);
@@ -455,10 +429,10 @@ index 66f7e9fdfbc4f..f9a8ff48e697a 100644
        if (page->mapping != mapping) {
                unlock_page(page);
 diff --git a/mm/mmap.c b/mm/mmap.c
-index 0584e540246e1..8b2f082002a9c 100644
+index bfb0ea164a90a..6bbc17d4733df 100644
 --- a/mm/mmap.c
 +++ b/mm/mmap.c
-@@ -185,7 +185,7 @@ static struct vm_area_struct *remove_vma(struct vm_area_struct *vma)
+@@ -183,7 +183,7 @@ static struct vm_area_struct *remove_vma(struct vm_area_struct *vma)
        if (vma->vm_ops && vma->vm_ops->close)
                vma->vm_ops->close(vma);
        if (vma->vm_file)
@@ -467,7 +441,7 @@ index 0584e540246e1..8b2f082002a9c 100644
        mpol_put(vma_policy(vma));
        vm_area_free(vma);
        return next;
-@@ -955,7 +955,7 @@ int __vma_adjust(struct vm_area_struct *vma, unsigned long start,
+@@ -952,7 +952,7 @@ int __vma_adjust(struct vm_area_struct *vma, unsigned long start,
        if (remove_next) {
                if (file) {
                        uprobe_munmap(next, next->vm_start, next->vm_end);
@@ -476,7 +450,7 @@ index 0584e540246e1..8b2f082002a9c 100644
                }
                if (next->anon_vma)
                        anon_vma_merge(vma, next);
-@@ -1901,7 +1901,7 @@ unsigned long mmap_region(struct file *file, unsigned long addr,
+@@ -1872,7 +1872,7 @@ unsigned long mmap_region(struct file *file, unsigned long addr,
        return addr;
  
  unmap_and_free_vma:
@@ -485,7 +459,7 @@ index 0584e540246e1..8b2f082002a9c 100644
        vma->vm_file = NULL;
  
        /* Undo any partial mapping done by a device driver. */
-@@ -2761,7 +2761,7 @@ int __split_vma(struct mm_struct *mm, struct vm_area_struct *vma,
+@@ -2730,7 +2730,7 @@ int __split_vma(struct mm_struct *mm, struct vm_area_struct *vma,
                goto out_free_mpol;
  
        if (new->vm_file)
@@ -494,7 +468,7 @@ index 0584e540246e1..8b2f082002a9c 100644
  
        if (new->vm_ops && new->vm_ops->open)
                new->vm_ops->open(new);
-@@ -2780,7 +2780,7 @@ int __split_vma(struct mm_struct *mm, struct vm_area_struct *vma,
+@@ -2749,7 +2749,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)
@@ -503,7 +477,7 @@ index 0584e540246e1..8b2f082002a9c 100644
        unlink_anon_vmas(new);
   out_free_mpol:
        mpol_put(vma_policy(new));
-@@ -2973,7 +2973,7 @@ SYSCALL_DEFINE5(remap_file_pages, unsigned long, start, unsigned long, size,
+@@ -2944,7 +2944,7 @@ SYSCALL_DEFINE5(remap_file_pages, unsigned long, start, unsigned long, size,
        struct vm_area_struct *vma;
        unsigned long populate = 0;
        unsigned long ret = -EINVAL;
@@ -512,7 +486,7 @@ index 0584e540246e1..8b2f082002a9c 100644
  
        pr_warn_once("%s (%d) uses deprecated remap_file_pages() syscall. See Documentation/vm/remap_file_pages.rst.\n",
                     current->comm, current->pid);
-@@ -3032,10 +3032,27 @@ SYSCALL_DEFINE5(remap_file_pages, unsigned long, start, unsigned long, size,
+@@ -3000,10 +3000,27 @@ SYSCALL_DEFINE5(remap_file_pages, unsigned long, start, unsigned long, size,
        if (vma->vm_flags & VM_LOCKED)
                flags |= MAP_LOCKED;
  
@@ -541,7 +515,7 @@ index 0584e540246e1..8b2f082002a9c 100644
  out:
        mmap_write_unlock(mm);
        if (populate)
-@@ -3322,7 +3339,7 @@ struct vm_area_struct *copy_vma(struct vm_area_struct **vmap,
+@@ -3284,7 +3301,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)
@@ -551,10 +525,10 @@ index 0584e540246e1..8b2f082002a9c 100644
                        new_vma->vm_ops->open(new_vma);
                vma_link(mm, new_vma, prev, rb_link, rb_parent);
 diff --git a/mm/nommu.c b/mm/nommu.c
-index 85a3a68dffb68..a2bee44172ccc 100644
+index 55a9e48a7a026..8dc77ce96335a 100644
 --- a/mm/nommu.c
 +++ b/mm/nommu.c
-@@ -523,7 +523,7 @@ static void __put_nommu_region(struct vm_region *region)
+@@ -522,7 +522,7 @@ static void __put_nommu_region(struct vm_region *region)
                up_write(&nommu_region_sem);
  
                if (region->vm_file)
@@ -563,7 +537,7 @@ index 85a3a68dffb68..a2bee44172ccc 100644
  
                /* IO memory and memory shared directly out of the pagecache
                 * from ramfs/tmpfs mustn't be released here */
-@@ -655,7 +655,7 @@ static void delete_vma(struct mm_struct *mm, struct vm_area_struct *vma)
+@@ -654,7 +654,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)
@@ -572,7 +546,7 @@ index 85a3a68dffb68..a2bee44172ccc 100644
        put_nommu_region(vma->vm_region);
        vm_area_free(vma);
  }
-@@ -1178,7 +1178,7 @@ unsigned long do_mmap(struct file *file,
+@@ -1174,7 +1174,7 @@ unsigned long do_mmap(struct file *file,
                                        goto error_just_free;
                                }
                        }
@@ -581,7 +555,7 @@ index 85a3a68dffb68..a2bee44172ccc 100644
                        kmem_cache_free(vm_region_jar, region);
                        region = pregion;
                        result = start;
-@@ -1255,10 +1255,10 @@ unsigned long do_mmap(struct file *file,
+@@ -1251,10 +1251,10 @@ unsigned long do_mmap(struct file *file,
        up_write(&nommu_region_sem);
  error:
        if (region->vm_file)
@@ -596,7 +570,7 @@ index 85a3a68dffb68..a2bee44172ccc 100644
  
 diff --git a/mm/prfile.c b/mm/prfile.c
 new file mode 100644
-index 0000000000000..00d51187c3250
+index 0000000000000..511543ab1b418
 --- /dev/null
 +++ b/mm/prfile.c
 @@ -0,0 +1,86 @@
@@ -608,7 +582,7 @@ index 0000000000000..00d51187c3250
 + *
 + * See Documentation/filesystems/aufs/design/06mmap.txt
 + *
-+ * Copyright (c) 2014-2020 Junjro R. Okajima
++ * Copyright (c) 2014-2021 Junjro R. Okajima
 + * Copyright (c) 2014 Ian Campbell
 + */
 +
@@ -710,10 +684,10 @@ index bc5095b734f58..9508bd57a3bc0 100644
  /**
   * d_ancestor - search for an ancestor
 diff --git a/fs/exec.c b/fs/exec.c
-index 18594f11c31fe..ac38c0424d2a3 100644
+index 537d92c41105b..0ab811e0fdaae 100644
 --- a/fs/exec.c
 +++ b/fs/exec.c
-@@ -114,6 +114,7 @@ bool path_noexec(const struct path *path)
+@@ -111,6 +111,7 @@ bool path_noexec(const struct path *path)
        return (path->mnt->mnt_flags & MNT_NOEXEC) ||
               (path->mnt->mnt_sb->s_iflags & SB_I_NOEXEC);
  }
@@ -722,7 +696,7 @@ index 18594f11c31fe..ac38c0424d2a3 100644
  #ifdef CONFIG_USELIB
  /*
 diff --git a/fs/fcntl.c b/fs/fcntl.c
-index d8a12eb63961d..0532996186311 100644
+index 02382fa9bd341..3418c60b90146 100644
 --- a/fs/fcntl.c
 +++ b/fs/fcntl.c
 @@ -86,6 +86,7 @@ int setfl(int fd, struct file *filp, unsigned long arg)
@@ -753,23 +727,11 @@ index 45437f8e1003e..786af52904fcf 100644
  
  void __init files_init(void)
  {
-diff --git a/fs/inode.c b/fs/inode.c
-index f24d21236ad01..78de5b5dc0840 100644
---- a/fs/inode.c
-+++ b/fs/inode.c
-@@ -1784,6 +1784,7 @@ int update_time(struct inode *inode, struct timespec64 *time, int flags)
-               return inode->i_op->update_time(inode, time, flags);
-       return generic_update_time(inode, time, flags);
- }
-+EXPORT_SYMBOL_GPL(update_time);
- /**
-  *    atime_needs_update      -       update the access time
 diff --git a/fs/namespace.c b/fs/namespace.c
-index 099e89c81af7c..3e46b53795b1e 100644
+index 1283670737826..db99365620118 100644
 --- a/fs/namespace.c
 +++ b/fs/namespace.c
-@@ -438,6 +438,7 @@ void __mnt_drop_write(struct vfsmount *mnt)
+@@ -439,6 +439,7 @@ void __mnt_drop_write(struct vfsmount *mnt)
        mnt_dec_writers(real_mount(mnt));
        preempt_enable();
  }
@@ -777,7 +739,7 @@ index 099e89c81af7c..3e46b53795b1e 100644
  
  /**
   * mnt_drop_write - give up write access to a mount
-@@ -812,6 +813,7 @@ int is_current_mnt_ns(struct vfsmount *mnt)
+@@ -813,6 +814,7 @@ int is_current_mnt_ns(struct vfsmount *mnt)
  {
        return check_mnt(real_mount(mnt));
  }
@@ -785,7 +747,7 @@ index 099e89c81af7c..3e46b53795b1e 100644
  
  /*
   * vfsmount lock must be held for write
-@@ -1987,6 +1989,7 @@ int iterate_mounts(int (*f)(struct vfsmount *, void *), void *arg,
+@@ -2011,6 +2013,7 @@ int iterate_mounts(int (*f)(struct vfsmount *, void *), void *arg,
        }
        return 0;
  }
@@ -794,7 +756,7 @@ index 099e89c81af7c..3e46b53795b1e 100644
  static void lock_mnt_tree(struct mount *mnt)
  {
 diff --git a/fs/notify/group.c b/fs/notify/group.c
-index fb89c351295d6..460ad19c2570a 100644
+index 6a297efc47887..ed394ccb10e00 100644
 --- a/fs/notify/group.c
 +++ b/fs/notify/group.c
 @@ -100,6 +100,7 @@ void fsnotify_get_group(struct fsnotify_group *group)
@@ -806,7 +768,7 @@ index fb89c351295d6..460ad19c2570a 100644
  /*
   * Drop a reference to a group.  Free it if it's through.
 diff --git a/fs/open.c b/fs/open.c
-index e53af13b5835f..f37da065e6544 100644
+index f732fb94600ce..ca33d86e73fd2 100644
 --- a/fs/open.c
 +++ b/fs/open.c
 @@ -65,6 +65,7 @@ int do_truncate(struct user_namespace *mnt_userns, struct dentry *dentry,
@@ -818,10 +780,10 @@ index e53af13b5835f..f37da065e6544 100644
  long vfs_truncate(const struct path *path, loff_t length)
  {
 diff --git a/fs/read_write.c b/fs/read_write.c
-index 9db7adf160d20..8dc93a57a933f 100644
+index 0074afa7ecb3e..612cf04d9f6b9 100644
 --- a/fs/read_write.c
 +++ b/fs/read_write.c
-@@ -503,6 +503,7 @@ ssize_t vfs_read(struct file *file, char __user *buf, size_t count, loff_t *pos)
+@@ -488,6 +488,7 @@ ssize_t vfs_read(struct file *file, char __user *buf, size_t count, loff_t *pos)
        inc_syscr(current);
        return ret;
  }
@@ -829,7 +791,7 @@ index 9db7adf160d20..8dc93a57a933f 100644
  
  static ssize_t new_sync_write(struct file *filp, const char __user *buf, size_t len, loff_t *ppos)
  {
-@@ -613,6 +614,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;
  }
@@ -857,18 +819,6 @@ index 3e6ba363b7775..7c1be373eb7cd 100644
  
  /**
   * splice_direct_to_actor - splices data directly between two non-pipes
-diff --git a/fs/sync.c b/fs/sync.c
-index b7b5a0a0df6ff..fa5c7fba7f1ba 100644
---- a/fs/sync.c
-+++ b/fs/sync.c
-@@ -39,6 +39,7 @@ int __sync_filesystem(struct super_block *sb, int wait)
-               sb->s_op->sync_fs(sb, wait);
-       return __sync_blockdev(sb->s_bdev, wait);
- }
-+EXPORT_SYMBOL_GPL(__sync_filesystem);
- /*
-  * Write out and wait upon all dirty data associated with this
 diff --git a/fs/xattr.c b/fs/xattr.c
 index 5c8c5175b385c..ff7e9ff774b73 100644
 --- a/fs/xattr.c
@@ -882,7 +832,7 @@ index 5c8c5175b385c..ff7e9ff774b73 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 dce278159546c..5b0c571dbca2f 100644
+index fbb8e650c1749..49c4d11b08938 100644
 --- a/kernel/locking/lockdep.c
 +++ b/kernel/locking/lockdep.c
 @@ -210,6 +210,7 @@ inline struct lock_class *lockdep_hlock_class(struct held_lock *hlock)
@@ -903,10 +853,10 @@ index 1698fbe6f0e13..081b05acadf82 100644
  }
 +EXPORT_SYMBOL_GPL(task_work_run);
 diff --git a/security/security.c b/security/security.c
-index b38155b2de83f..386c2741886ce 100644
+index c88167a414b41..125724525d5c0 100644
 --- a/security/security.c
 +++ b/security/security.c
-@@ -1146,6 +1146,7 @@ int security_path_rmdir(const struct path *dir, struct dentry *dentry)
+@@ -1148,6 +1148,7 @@ int security_path_rmdir(const struct path *dir, struct dentry *dentry)
                return 0;
        return call_int_hook(path_rmdir, 0, dir, dentry);
  }
@@ -914,7 +864,7 @@ index b38155b2de83f..386c2741886ce 100644
  
  int security_path_unlink(const struct path *dir, struct dentry *dentry)
  {
-@@ -1162,6 +1163,7 @@ int security_path_symlink(const struct path *dir, struct dentry *dentry,
+@@ -1164,6 +1165,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);
  }
@@ -922,7 +872,7 @@ index b38155b2de83f..386c2741886ce 100644
  
  int security_path_link(struct dentry *old_dentry, const struct path *new_dir,
                       struct dentry *new_dentry)
-@@ -1170,6 +1172,7 @@ int security_path_link(struct dentry *old_dentry, const struct path *new_dir,
+@@ -1172,6 +1174,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);
  }
@@ -930,7 +880,7 @@ index b38155b2de83f..386c2741886ce 100644
  
  int security_path_rename(const struct path *old_dir, struct dentry *old_dentry,
                         const struct path *new_dir, struct dentry *new_dentry,
-@@ -1197,6 +1200,7 @@ int security_path_truncate(const struct path *path)
+@@ -1199,6 +1202,7 @@ int security_path_truncate(const struct path *path)
                return 0;
        return call_int_hook(path_truncate, 0, path);
  }
@@ -938,7 +888,7 @@ index b38155b2de83f..386c2741886ce 100644
  
  int security_path_chmod(const struct path *path, umode_t mode)
  {
-@@ -1204,6 +1208,7 @@ int security_path_chmod(const struct path *path, umode_t mode)
+@@ -1206,6 +1210,7 @@ int security_path_chmod(const struct path *path, umode_t mode)
                return 0;
        return call_int_hook(path_chmod, 0, path, mode);
  }
@@ -946,7 +896,7 @@ index b38155b2de83f..386c2741886ce 100644
  
  int security_path_chown(const struct path *path, kuid_t uid, kgid_t gid)
  {
-@@ -1211,6 +1216,7 @@ int security_path_chown(const struct path *path, kuid_t uid, kgid_t gid)
+@@ -1213,6 +1218,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);
  }
@@ -954,7 +904,7 @@ index b38155b2de83f..386c2741886ce 100644
  
  int security_path_chroot(const struct path *path)
  {
-@@ -1311,6 +1317,7 @@ int security_inode_permission(struct inode *inode, int mask)
+@@ -1313,6 +1319,7 @@ int security_inode_permission(struct inode *inode, int mask)
                return 0;
        return call_int_hook(inode_permission, 0, inode, mask);
  }
@@ -962,7 +912,7 @@ index b38155b2de83f..386c2741886ce 100644
  
  int security_inode_setattr(struct dentry *dentry, struct iattr *attr)
  {
-@@ -1508,6 +1515,7 @@ int security_file_permission(struct file *file, int mask)
+@@ -1510,6 +1517,7 @@ int security_file_permission(struct file *file, int mask)
  
        return fsnotify_perm(file, mask);
  }
@@ -972,7 +922,7 @@ index b38155b2de83f..386c2741886ce 100644
  {
 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       2021-06-30 21:35:11.393873211 +0200
++++ linux/Documentation/ABI/testing/debugfs-aufs       2021-12-03 15:38:59.926647310 +0100
 @@ -0,0 +1,55 @@
 +What:         /debug/aufs/si_<id>/
 +Date:         March 2009
@@ -1031,7 +981,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 2021-06-30 21:35:11.393873211 +0200
++++ linux/Documentation/ABI/testing/sysfs-aufs 2021-12-03 15:38:59.926647310 +0100
 @@ -0,0 +1,31 @@
 +What:         /sys/fs/aufs/si_<id>/
 +Date:         March 2009
@@ -1066,10 +1016,10 @@ 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    2021-02-24 13:33:42.737680181 +0100
++++ linux/Documentation/filesystems/aufs/design/01intro.txt    2021-12-03 15:38:59.929980643 +0100
 @@ -0,0 +1,171 @@
 +
-+# Copyright (C) 2005-2020 Junjiro R. Okajima
++# Copyright (C) 2005-2021 Junjiro R. Okajima
 +# 
 +# This program is free software; you can redistribute it and/or modify
 +# it under the terms of the GNU General Public License as published by
@@ -1241,10 +1191,10 @@ 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   2021-02-24 13:33:42.737680181 +0100
++++ linux/Documentation/filesystems/aufs/design/02struct.txt   2021-12-03 15:38:59.929980643 +0100
 @@ -0,0 +1,258 @@
 +
-+# Copyright (C) 2005-2020 Junjiro R. Okajima
++# Copyright (C) 2005-2021 Junjiro R. Okajima
 +# 
 +# This program is free software; you can redistribute it and/or modify
 +# it under the terms of the GNU General Public License as published by
@@ -1503,10 +1453,10 @@ 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      2021-02-24 13:33:42.737680181 +0100
++++ linux/Documentation/filesystems/aufs/design/03atomic_open.txt      2021-12-03 15:38:59.929980643 +0100
 @@ -0,0 +1,85 @@
 +
-+# Copyright (C) 2015-2020 Junjiro R. Okajima
++# Copyright (C) 2015-2021 Junjiro R. Okajima
 +# 
 +# This program is free software; you can redistribute it and/or modify
 +# it under the terms of the GNU General Public License as published by
@@ -1592,10 +1542,10 @@ 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   2021-02-24 13:33:42.737680181 +0100
++++ linux/Documentation/filesystems/aufs/design/03lookup.txt   2021-12-03 15:38:59.929980643 +0100
 @@ -0,0 +1,113 @@
 +
-+# Copyright (C) 2005-2020 Junjiro R. Okajima
++# Copyright (C) 2005-2021 Junjiro R. Okajima
 +# 
 +# This program is free software; you can redistribute it and/or modify
 +# it under the terms of the GNU General Public License as published by
@@ -1709,10 +1659,10 @@ 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   2021-02-24 13:33:42.737680181 +0100
++++ linux/Documentation/filesystems/aufs/design/04branch.txt   2021-12-03 15:38:59.929980643 +0100
 @@ -0,0 +1,74 @@
 +
-+# Copyright (C) 2005-2020 Junjiro R. Okajima
++# Copyright (C) 2005-2021 Junjiro R. Okajima
 +# 
 +# This program is free software; you can redistribute it and/or modify
 +# it under the terms of the GNU General Public License as published by
@@ -1787,10 +1737,10 @@ 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       2021-02-24 13:33:42.737680181 +0100
++++ linux/Documentation/filesystems/aufs/design/05wbr_policy.txt       2021-12-03 15:38:59.929980643 +0100
 @@ -0,0 +1,64 @@
 +
-+# Copyright (C) 2005-2020 Junjiro R. Okajima
++# Copyright (C) 2005-2021 Junjiro R. Okajima
 +# 
 +# This program is free software; you can redistribute it and/or modify
 +# it under the terms of the GNU General Public License as published by
@@ -1855,7 +1805,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   2021-02-24 13:33:42.737680181 +0100
++++ linux/Documentation/filesystems/aufs/design/06dirren.dot   2021-12-03 15:38:59.929980643 +0100
 @@ -0,0 +1,31 @@
 +
 +// to view this graph, run dot(1) command in GRAPHVIZ.
@@ -1890,10 +1840,10 @@ 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   2021-02-24 13:33:42.737680181 +0100
++++ linux/Documentation/filesystems/aufs/design/06dirren.txt   2021-12-03 15:38:59.929980643 +0100
 @@ -0,0 +1,102 @@
 +
-+# Copyright (C) 2017-2020 Junjiro R. Okajima
++# Copyright (C) 2017-2021 Junjiro R. Okajima
 +#
 +# This program is free software; you can redistribute it and/or modify
 +# it under the terms of the GNU General Public License as published by
@@ -1996,10 +1946,10 @@ 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     2021-02-24 13:33:42.737680181 +0100
++++ linux/Documentation/filesystems/aufs/design/06fhsm.txt     2021-12-03 15:38:59.929980643 +0100
 @@ -0,0 +1,120 @@
 +
-+# Copyright (C) 2011-2020 Junjiro R. Okajima
++# Copyright (C) 2011-2021 Junjiro R. Okajima
 +# 
 +# This program is free software; you can redistribute it and/or modify
 +# it under the terms of the GNU General Public License as published by
@@ -2120,10 +2070,10 @@ 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     2021-02-24 13:33:42.737680181 +0100
++++ linux/Documentation/filesystems/aufs/design/06mmap.txt     2021-12-03 15:38:59.929980643 +0100
 @@ -0,0 +1,72 @@
 +
-+# Copyright (C) 2005-2020 Junjiro R. Okajima
++# Copyright (C) 2005-2021 Junjiro R. Okajima
 +# 
 +# This program is free software; you can redistribute it and/or modify
 +# it under the terms of the GNU General Public License as published by
@@ -2196,10 +2146,10 @@ 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    2021-02-24 13:33:42.737680181 +0100
++++ linux/Documentation/filesystems/aufs/design/06xattr.txt    2021-12-03 15:38:59.929980643 +0100
 @@ -0,0 +1,96 @@
 +
-+# Copyright (C) 2014-2020 Junjiro R. Okajima
++# Copyright (C) 2014-2021 Junjiro R. Okajima
 +#
 +# This program is free software; you can redistribute it and/or modify
 +# it under the terms of the GNU General Public License as published by
@@ -2296,10 +2246,10 @@ 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   2021-02-24 13:33:42.737680181 +0100
++++ linux/Documentation/filesystems/aufs/design/07export.txt   2021-12-03 15:38:59.929980643 +0100
 @@ -0,0 +1,58 @@
 +
-+# Copyright (C) 2005-2020 Junjiro R. Okajima
++# Copyright (C) 2005-2021 Junjiro R. Okajima
 +# 
 +# This program is free software; you can redistribute it and/or modify
 +# it under the terms of the GNU General Public License as published by
@@ -2358,10 +2308,10 @@ 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     2021-02-24 13:33:42.737680181 +0100
++++ linux/Documentation/filesystems/aufs/design/08shwh.txt     2021-12-03 15:38:59.929980643 +0100
 @@ -0,0 +1,52 @@
 +
-+# Copyright (C) 2005-2020 Junjiro R. Okajima
++# Copyright (C) 2005-2021 Junjiro R. Okajima
 +# 
 +# This program is free software; you can redistribute it and/or modify
 +# it under the terms of the GNU General Public License as published by
@@ -2414,10 +2364,10 @@ 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    2021-02-24 13:33:42.737680181 +0100
++++ linux/Documentation/filesystems/aufs/design/10dynop.txt    2021-12-03 15:38:59.929980643 +0100
 @@ -0,0 +1,47 @@
 +
-+# Copyright (C) 2010-2020 Junjiro R. Okajima
++# Copyright (C) 2010-2021 Junjiro R. Okajima
 +#
 +# This program is free software; you can redistribute it and/or modify
 +# it under the terms of the GNU General Public License as published by
@@ -2465,7 +2415,7 @@ 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        2021-06-30 21:35:11.393873211 +0200
++++ linux/Documentation/filesystems/aufs/README        2021-12-03 15:40:58.233313963 +0100
 @@ -0,0 +1,396 @@
 +
 +Aufs5 -- advanced multi layered unification filesystem version 5.x
@@ -2865,11 +2815,11 @@ 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       2021-02-24 13:33:42.741013619 +0100
++++ linux/fs/aufs/aufs.h       2021-12-03 15:38:59.929980643 +0100
 @@ -0,0 +1,62 @@
 +/* SPDX-License-Identifier: GPL-2.0 */
 +/*
-+ * Copyright (C) 2005-2020 Junjiro R. Okajima
++ * Copyright (C) 2005-2021 Junjiro R. Okajima
 + *
 + * This program, aufs is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
@@ -2931,11 +2881,11 @@ 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     2021-02-24 13:33:42.741013619 +0100
++++ linux/fs/aufs/branch.c     2021-12-03 15:38:59.933313976 +0100
 @@ -0,0 +1,1427 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
-+ * Copyright (C) 2005-2020 Junjiro R. Okajima
++ * Copyright (C) 2005-2021 Junjiro R. Okajima
 + *
 + * This program, aufs is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
@@ -4362,11 +4312,11 @@ 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     2021-06-30 21:35:11.393873211 +0200
++++ linux/fs/aufs/branch.h     2021-12-03 15:40:58.233313963 +0100
 @@ -0,0 +1,375 @@
 +/* SPDX-License-Identifier: GPL-2.0 */
 +/*
-+ * Copyright (C) 2005-2020 Junjiro R. Okajima
++ * Copyright (C) 2005-2021 Junjiro R. Okajima
 + *
 + * This program, aufs is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
@@ -4741,7 +4691,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      2021-02-24 13:33:42.741013619 +0100
++++ linux/fs/aufs/conf.mk      2021-12-03 15:38:59.933313976 +0100
 @@ -0,0 +1,40 @@
 +# SPDX-License-Identifier: GPL-2.0
 +
@@ -4785,11 +4735,11 @@ 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       2021-06-30 21:35:11.393873211 +0200
-@@ -0,0 +1,1457 @@
++++ linux/fs/aufs/cpup.c       2021-12-03 15:40:58.233313963 +0100
+@@ -0,0 +1,1459 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
-+ * Copyright (C) 2005-2020 Junjiro R. Okajima
++ * Copyright (C) 2005-2021 Junjiro R. Okajima
 + *
 + * This program, aufs is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
@@ -5534,11 +5484,13 @@ diff -urN /usr/share/empty/fs/aufs/cpup.c linux/fs/aufs/cpup.c
 +{
 +      int err;
 +      struct dentry *dentry, *h_dentry, *h_parent, *parent;
++      struct path h_ppath;
 +      struct inode *h_dir;
 +      aufs_bindex_t bdst;
 +
 +      dentry = cpg->dentry;
 +      bdst = cpg->bdst;
++      h_ppath.mnt = au_sbr_mnt(dentry->d_sb, bdst);
 +      h_dentry = au_h_dptr(dentry, bdst);
 +      if (!au_ftest_cpup(cpg->flags, OVERWRITE)) {
 +              dget(h_dentry);
@@ -5550,9 +5502,9 @@ diff -urN /usr/share/empty/fs/aufs/cpup.c linux/fs/aufs/cpup.c
 +      } else {
 +              err = 0;
 +              parent = dget_parent(dentry);
-+              h_parent = au_h_dptr(parent, bdst);
++              h_ppath.dentry = au_h_dptr(parent, bdst);
 +              dput(parent);
-+              h_path->dentry = vfsub_lkup_one(&dentry->d_name, h_parent);
++              h_path->dentry = vfsub_lkup_one(&dentry->d_name, &h_ppath);
 +              if (IS_ERR(h_path->dentry))
 +                      err = PTR_ERR(h_path->dentry);
 +      }
@@ -6246,11 +6198,11 @@ 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       2021-02-24 13:33:42.741013619 +0100
++++ linux/fs/aufs/cpup.h       2021-12-03 15:38:59.933313976 +0100
 @@ -0,0 +1,100 @@
 +/* SPDX-License-Identifier: GPL-2.0 */
 +/*
-+ * Copyright (C) 2005-2020 Junjiro R. Okajima
++ * Copyright (C) 2005-2021 Junjiro R. Okajima
 + *
 + * This program, aufs is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
@@ -6350,11 +6302,11 @@ 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    2021-02-24 13:33:42.741013619 +0100
++++ linux/fs/aufs/dbgaufs.c    2021-12-03 15:38:59.933313976 +0100
 @@ -0,0 +1,526 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
-+ * Copyright (C) 2005-2020 Junjiro R. Okajima
++ * Copyright (C) 2005-2021 Junjiro R. Okajima
 + *
 + * This program, aufs is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
@@ -6880,11 +6832,11 @@ 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    2021-02-24 13:33:42.741013619 +0100
++++ linux/fs/aufs/dbgaufs.h    2021-12-03 15:38:59.933313976 +0100
 @@ -0,0 +1,53 @@
 +/* SPDX-License-Identifier: GPL-2.0 */
 +/*
-+ * Copyright (C) 2005-2020 Junjiro R. Okajima
++ * Copyright (C) 2005-2021 Junjiro R. Okajima
 + *
 + * This program, aufs is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
@@ -6937,11 +6889,11 @@ 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      2021-02-24 13:33:42.741013619 +0100
++++ linux/fs/aufs/dcsub.c      2021-12-03 15:38:59.933313976 +0100
 @@ -0,0 +1,225 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
-+ * Copyright (C) 2005-2020 Junjiro R. Okajima
++ * Copyright (C) 2005-2021 Junjiro R. Okajima
 + *
 + * This program, aufs is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
@@ -7166,11 +7118,11 @@ 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      2021-02-24 13:33:42.741013619 +0100
++++ linux/fs/aufs/dcsub.h      2021-12-03 15:38:59.933313976 +0100
 @@ -0,0 +1,137 @@
 +/* SPDX-License-Identifier: GPL-2.0 */
 +/*
-+ * Copyright (C) 2005-2020 Junjiro R. Okajima
++ * Copyright (C) 2005-2021 Junjiro R. Okajima
 + *
 + * This program, aufs is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
@@ -7307,11 +7259,11 @@ 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      2021-02-24 13:33:42.741013619 +0100
-@@ -0,0 +1,441 @@
++++ linux/fs/aufs/debug.c      2021-12-03 15:38:59.933313976 +0100
+@@ -0,0 +1,444 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
-+ * Copyright (C) 2005-2020 Junjiro R. Okajima
++ * Copyright (C) 2005-2021 Junjiro R. Okajima
 + *
 + * This program, aufs is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
@@ -7694,7 +7646,10 @@ diff -urN /usr/share/empty/fs/aufs/debug.c linux/fs/aufs/debug.c
 +                      AuDbgDentry(dentry);
 +                      AuDbgInode(inode);
 +                      au_debug_off();
-+                      BUG();
++                      if (au_test_fuse(h_inode->i_sb))
++                              WARN_ON_ONCE(1);
++                      else
++                              BUG();
 +              }
 +      }
 +}
@@ -7752,11 +7707,11 @@ 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      2021-02-24 13:33:42.741013619 +0100
++++ linux/fs/aufs/debug.h      2021-12-03 15:38:59.933313976 +0100
 @@ -0,0 +1,226 @@
 +/* SPDX-License-Identifier: GPL-2.0 */
 +/*
-+ * Copyright (C) 2005-2020 Junjiro R. Okajima
++ * Copyright (C) 2005-2021 Junjiro R. Okajima
 + *
 + * This program, aufs is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
@@ -7982,11 +7937,11 @@ 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     2021-06-30 21:35:11.393873211 +0200
-@@ -0,0 +1,1160 @@
++++ linux/fs/aufs/dentry.c     2021-12-03 15:40:58.233313963 +0100
+@@ -0,0 +1,1169 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
-+ * Copyright (C) 2005-2020 Junjiro R. Okajima
++ * Copyright (C) 2005-2021 Junjiro R. Okajima
 + *
 + * This program, aufs is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
@@ -8022,6 +7977,7 @@ diff -urN /usr/share/empty/fs/aufs/dentry.c linux/fs/aufs/dentry.c
 +      struct inode *h_inode;
 +      struct au_branch *br;
 +      struct user_namespace *h_userns;
++      struct path h_path;
 +      int wh_found, opq;
 +      unsigned char wh_able;
 +      const unsigned char allow_neg = !!au_ftest_lkup(args->flags, ALLOW_NEG);
@@ -8030,10 +7986,12 @@ diff -urN /usr/share/empty/fs/aufs/dentry.c linux/fs/aufs/dentry.c
 +
 +      wh_found = 0;
 +      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);
 +      wh_able = !!au_br_whable(br->br_perm);
 +      if (wh_able)
-+              wh_found = au_wh_test(h_userns, h_parent, &args->whname,
++              wh_found = au_wh_test(h_userns, &h_path, &args->whname,
 +                                    ignore_perm);
 +      h_dentry = ERR_PTR(wh_found);
 +      if (!wh_found)
@@ -8049,9 +8007,9 @@ diff -urN /usr/share/empty/fs/aufs/dentry.c linux/fs/aufs/dentry.c
 +
 +real_lookup:
 +      if (!ignore_perm)
-+              h_dentry = vfsub_lkup_one(args->name, h_parent);
++              h_dentry = vfsub_lkup_one(args->name, &h_path);
 +      else
-+              h_dentry = au_sio_lkup_one(h_userns, args->name, h_parent);
++              h_dentry = au_sio_lkup_one(h_userns, args->name, &h_path);
 +      if (IS_ERR(h_dentry)) {
 +              if (PTR_ERR(h_dentry) == -ENAMETOOLONG
 +                  && !allow_neg)
@@ -8085,8 +8043,9 @@ diff -urN /usr/share/empty/fs/aufs/dentry.c linux/fs/aufs/dentry.c
 +          || (d_really_is_positive(dentry) && !d_is_dir(dentry)))
 +              goto out; /* success */
 +
++      h_path.dentry = h_dentry;
 +      inode_lock_shared_nested(h_inode, AuLsc_I_CHILD);
-+      opq = au_diropq_test(h_userns, h_dentry);
++      opq = au_diropq_test(h_userns, &h_path);
 +      inode_unlock_shared(h_inode);
 +      if (opq > 0)
 +              au_set_dbdiropq(dentry, bindex);
@@ -8232,18 +8191,18 @@ diff -urN /usr/share/empty/fs/aufs/dentry.c linux/fs/aufs/dentry.c
 +}
 +
 +struct dentry *au_sio_lkup_one(struct user_namespace *userns, struct qstr *name,
-+                             struct dentry *parent)
++                             struct path *ppath)
 +{
 +      struct dentry *dentry;
 +      int wkq_err;
 +
-+      if (!au_test_h_perm_sio(userns, d_inode(parent), MAY_EXEC))
-+              dentry = vfsub_lkup_one(name, parent);
++      if (!au_test_h_perm_sio(userns, d_inode(ppath->dentry), MAY_EXEC))
++              dentry = vfsub_lkup_one(name, ppath);
 +      else {
 +              struct vfsub_lkup_one_args args = {
 +                      .errp   = &dentry,
 +                      .name   = name,
-+                      .parent = parent
++                      .ppath  = ppath
 +              };
 +
 +              wkq_err = au_wkq_wait(vfsub_call_lkup_one, &args);
@@ -8260,18 +8219,20 @@ diff -urN /usr/share/empty/fs/aufs/dentry.c linux/fs/aufs/dentry.c
 +int au_lkup_neg(struct dentry *dentry, aufs_bindex_t bindex, int wh)
 +{
 +      int err;
-+      struct dentry *parent, *h_parent, *h_dentry;
++      struct dentry *parent, *h_dentry;
 +      struct au_branch *br;
 +      struct user_namespace *h_userns;
++      struct path h_ppath;
 +
 +      parent = dget_parent(dentry);
-+      h_parent = au_h_dptr(parent, bindex);
 +      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);
 +      if (wh)
-+              h_dentry = au_whtmp_lkup(h_parent, br, &dentry->d_name);
++              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_parent);
++              h_dentry = au_sio_lkup_one(h_userns, &dentry->d_name, &h_ppath);
 +      err = PTR_ERR(h_dentry);
 +      if (IS_ERR(h_dentry))
 +              goto out;
@@ -8346,6 +8307,7 @@ diff -urN /usr/share/empty/fs/aufs/dentry.c linux/fs/aufs/dentry.c
 +      struct inode *h_inode;
 +      struct dentry *h_d;
 +      struct super_block *h_sb;
++      struct path h_ppath;
 +
 +      err = 0;
 +      memset(&ia, -1, sizeof(ia));
@@ -8360,7 +8322,9 @@ diff -urN /usr/share/empty/fs/aufs/dentry.c linux/fs/aufs/dentry.c
 +              goto out;
 +
 +      /* main purpose is namei.c:cached_lookup() and d_revalidate */
-+      h_d = vfsub_lkup_one(&h_dentry->d_name, h_parent);
++      h_ppath.dentry = h_parent;
++      h_ppath.mnt = au_br_mnt(br);
++      h_d = vfsub_lkup_one(&h_dentry->d_name, &h_ppath);
 +      err = PTR_ERR(h_d);
 +      if (IS_ERR(h_d))
 +              goto out;
@@ -9146,11 +9110,11 @@ 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     2021-06-30 21:35:11.393873211 +0200
++++ linux/fs/aufs/dentry.h     2021-12-03 15:40:58.233313963 +0100
 @@ -0,0 +1,269 @@
 +/* SPDX-License-Identifier: GPL-2.0 */
 +/*
-+ * Copyright (C) 2005-2020 Junjiro R. Okajima
++ * Copyright (C) 2005-2021 Junjiro R. Okajima
 + *
 + * This program, aufs is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
@@ -9224,7 +9188,7 @@ diff -urN /usr/share/empty/fs/aufs/dentry.h linux/fs/aufs/dentry.h
 +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 *parent);
++                             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);
 +
@@ -9419,11 +9383,11 @@ 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      2021-02-24 13:33:42.741013619 +0100
++++ linux/fs/aufs/dinfo.c      2021-12-03 15:38:59.933313976 +0100
 @@ -0,0 +1,554 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
-+ * Copyright (C) 2005-2020 Junjiro R. Okajima
++ * Copyright (C) 2005-2021 Junjiro R. Okajima
 + *
 + * This program, aufs is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
@@ -9977,11 +9941,11 @@ 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        2021-06-30 21:35:11.393873211 +0200
++++ linux/fs/aufs/dir.c        2021-12-03 15:40:58.233313963 +0100
 @@ -0,0 +1,765 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
-+ * Copyright (C) 2005-2020 Junjiro R. Okajima
++ * Copyright (C) 2005-2021 Junjiro R. Okajima
 + *
 + * This program, aufs is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
@@ -10746,11 +10710,11 @@ 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        2021-02-24 13:33:42.741013619 +0100
++++ linux/fs/aufs/dir.h        2021-12-03 15:38:59.933313976 +0100
 @@ -0,0 +1,134 @@
 +/* SPDX-License-Identifier: GPL-2.0 */
 +/*
-+ * Copyright (C) 2005-2020 Junjiro R. Okajima
++ * Copyright (C) 2005-2021 Junjiro R. Okajima
 + *
 + * This program, aufs is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
@@ -10884,11 +10848,11 @@ 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     2021-06-30 21:35:11.393873211 +0200
-@@ -0,0 +1,1316 @@
++++ linux/fs/aufs/dirren.c     2021-12-03 15:38:59.933313976 +0100
+@@ -0,0 +1,1315 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
-+ * Copyright (C) 2017-2020 Junjiro R. Okajima
++ * Copyright (C) 2017-2021 Junjiro R. Okajima
 + *
 + * This program, aufs is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
@@ -11151,11 +11115,11 @@ diff -urN /usr/share/empty/fs/aufs/dirren.c linux/fs/aufs/dirren.c
 +              dir = d_inode(path->dentry);
 +              inode_lock_nested(dir, AuLsc_I_CHILD);
 +      }
-+      hinopath.dentry = vfsub_lkup_one(&hinoname, path->dentry);
++      hinopath.mnt = path->mnt;
++      hinopath.dentry = vfsub_lkup_one(&hinoname, (struct path *)path);
 +      err = PTR_ERR(hinopath.dentry);
 +      if (IS_ERR(hinopath.dentry))
 +              goto out_unlock;
-+      hinopath.mnt = path->mnt;
 +
 +      err = 0;
 +      flags = O_RDONLY;
@@ -11507,7 +11471,7 @@ diff -urN /usr/share/empty/fs/aufs/dirren.c linux/fs/aufs/dirren.c
 +      AuDebugOn(elm
 +                && memcmp(elm, page_address(ZERO_PAGE(0)), sizeof(*elm)));
 +
-+      infopath.dentry = vfsub_lookup_one_len(w->whname, w->h_ppath.dentry,
++      infopath.dentry = vfsub_lookup_one_len(w->whname, &w->h_ppath,
 +                                             w->whnamelen);
 +      AuTraceErrPtr(infopath.dentry);
 +      if (IS_ERR(infopath.dentry)) {
@@ -11891,8 +11855,7 @@ diff -urN /usr/share/empty/fs/aufs/dirren.c linux/fs/aufs/dirren.c
 +      unlocked = 0;
 +      h_dir = d_inode(h_ppath->dentry);
 +      inode_lock_shared_nested(h_dir, AuLsc_I_PARENT);
-+      infopath.dentry = vfsub_lookup_one_len(whname, h_ppath->dentry,
-+                                             whnamelen);
++      infopath.dentry = vfsub_lookup_one_len(whname, h_ppath, whnamelen);
 +      if (IS_ERR(infopath.dentry)) {
 +              drinfo = (void *)infopath.dentry;
 +              goto out;
@@ -12204,11 +12167,11 @@ 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     2021-02-24 13:33:42.741013619 +0100
++++ linux/fs/aufs/dirren.h     2021-12-03 15:38:59.933313976 +0100
 @@ -0,0 +1,140 @@
 +/* SPDX-License-Identifier: GPL-2.0 */
 +/*
-+ * Copyright (C) 2017-2020 Junjiro R. Okajima
++ * Copyright (C) 2017-2021 Junjiro R. Okajima
 + *
 + * This program, aufs is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
@@ -12348,11 +12311,11 @@ 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      2021-02-24 13:33:42.744347058 +0100
++++ linux/fs/aufs/dynop.c      2021-12-03 15:38:59.933313976 +0100
 @@ -0,0 +1,368 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
-+ * Copyright (C) 2010-2020 Junjiro R. Okajima
++ * Copyright (C) 2010-2021 Junjiro R. Okajima
 + *
 + * This program, aufs is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
@@ -12720,11 +12683,11 @@ 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      2021-02-24 13:33:42.744347058 +0100
++++ linux/fs/aufs/dynop.h      2021-12-03 15:38:59.933313976 +0100
 @@ -0,0 +1,77 @@
 +/* SPDX-License-Identifier: GPL-2.0 */
 +/*
-+ * Copyright (C) 2010-2020 Junjiro R. Okajima
++ * Copyright (C) 2010-2021 Junjiro R. Okajima
 + *
 + * This program, aufs is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
@@ -12801,11 +12764,11 @@ 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     2021-02-24 13:33:42.744347058 +0100
-@@ -0,0 +1,837 @@
++++ linux/fs/aufs/export.c     2021-12-03 15:40:58.233313963 +0100
+@@ -0,0 +1,831 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
-+ * Copyright (C) 2005-2020 Junjiro R. Okajima
++ * Copyright (C) 2005-2021 Junjiro R. Okajima
 + *
 + * This program, aufs is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
@@ -13211,7 +13174,7 @@ diff -urN /usr/share/empty/fs/aufs/export.c linux/fs/aufs/export.c
 +
 +      /* do not call vfsub_lkup_one() */
 +      dir = d_inode(parent);
-+      dentry = vfsub_lookup_one_len_unlocked(arg.name, parent, arg.namelen);
++      dentry = vfsub_lookup_one_len_unlocked(arg.name, path, arg.namelen);
 +      AuTraceErrPtr(dentry);
 +      if (IS_ERR(dentry))
 +              goto out_name;
@@ -13599,14 +13562,8 @@ diff -urN /usr/share/empty/fs/aufs/export.c linux/fs/aufs/export.c
 +      f = h_inode->i_sb->s_export_op->commit_metadata;
 +      if (f)
 +              err = f(h_inode);
-+      else {
-+              struct writeback_control wbc = {
-+                      .sync_mode      = WB_SYNC_ALL,
-+                      .nr_to_write    = 0 /* metadata only */
-+              };
-+
-+              err = sync_inode(h_inode, &wbc);
-+      }
++      else
++              err = sync_inode_metadata(h_inode, /*wait*/1);
 +
 +      au_cpup_attr_timesizes(inode);
 +      ii_write_unlock(inode);
@@ -13642,11 +13599,11 @@ 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       2021-02-24 13:33:42.744347058 +0100
++++ linux/fs/aufs/fhsm.c       2021-12-03 15:38:59.933313976 +0100
 @@ -0,0 +1,427 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
-+ * Copyright (C) 2011-2020 Junjiro R. Okajima
++ * Copyright (C) 2011-2021 Junjiro R. Okajima
 + *
 + * This program, aufs is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
@@ -14073,11 +14030,11 @@ 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       2021-02-24 13:33:42.744347058 +0100
++++ linux/fs/aufs/file.c       2021-12-03 15:38:59.936647310 +0100
 @@ -0,0 +1,863 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
-+ * Copyright (C) 2005-2020 Junjiro R. Okajima
++ * Copyright (C) 2005-2021 Junjiro R. Okajima
 + *
 + * This program, aufs is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
@@ -14940,11 +14897,11 @@ 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       2021-02-24 13:33:42.744347058 +0100
++++ linux/fs/aufs/file.h       2021-12-03 15:38:59.936647310 +0100
 @@ -0,0 +1,342 @@
 +/* SPDX-License-Identifier: GPL-2.0 */
 +/*
-+ * Copyright (C) 2005-2020 Junjiro R. Okajima
++ * Copyright (C) 2005-2021 Junjiro R. Okajima
 + *
 + * This program, aufs is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
@@ -15286,11 +15243,11 @@ 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      2021-02-24 13:33:42.744347058 +0100
++++ linux/fs/aufs/finfo.c      2021-12-03 15:38:59.936647310 +0100
 @@ -0,0 +1,149 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
-+ * Copyright (C) 2005-2020 Junjiro R. Okajima
++ * Copyright (C) 2005-2021 Junjiro R. Okajima
 + *
 + * This program, aufs is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
@@ -15439,11 +15396,11 @@ 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       2021-06-30 21:35:11.393873211 +0200
++++ linux/fs/aufs/f_op.c       2021-12-03 15:38:59.933313976 +0100
 @@ -0,0 +1,771 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
-+ * Copyright (C) 2005-2020 Junjiro R. Okajima
++ * Copyright (C) 2005-2021 Junjiro R. Okajima
 + *
 + * This program, aufs is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
@@ -16214,11 +16171,11 @@ diff -urN /usr/share/empty/fs/aufs/f_op.c linux/fs/aufs/f_op.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     2021-02-24 13:33:42.744347058 +0100
++++ linux/fs/aufs/fstype.h     2021-12-03 15:38:59.936647310 +0100
 @@ -0,0 +1,401 @@
 +/* SPDX-License-Identifier: GPL-2.0 */
 +/*
-+ * Copyright (C) 2005-2020 Junjiro R. Okajima
++ * Copyright (C) 2005-2021 Junjiro R. Okajima
 + *
 + * This program, aufs is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
@@ -16619,11 +16576,11 @@ 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        2021-02-24 13:33:42.744347058 +0100
++++ linux/fs/aufs/hbl.h        2021-12-03 15:38:59.936647310 +0100
 @@ -0,0 +1,65 @@
 +/* SPDX-License-Identifier: GPL-2.0 */
 +/*
-+ * Copyright (C) 2017-2020 Junjiro R. Okajima
++ * Copyright (C) 2017-2021 Junjiro R. Okajima
 + *
 + * This program, aufs is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
@@ -16688,11 +16645,11 @@ 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  2021-02-24 13:33:42.744347058 +0100
-@@ -0,0 +1,288 @@
++++ linux/fs/aufs/hfsnotify.c  2022-01-13 12:42:15.929566135 +0100
+@@ -0,0 +1,289 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
-+ * Copyright (C) 2005-2020 Junjiro R. Okajima
++ * Copyright (C) 2005-2021 Junjiro R. Okajima
 + *
 + * This program, aufs is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
@@ -16862,7 +16819,8 @@ diff -urN /usr/share/empty/fs/aufs/hfsnotify.c linux/fs/aufs/hfsnotify.c
 +      struct inode *h_dir, *h_inode;
 +      struct fsnotify_mark *inode_mark;
 +
-+      AuDebugOn(data_type != FSNOTIFY_EVENT_INODE);
++      AuDebugOn(!(data_type == FSNOTIFY_EVENT_INODE
++                  || data_type == FSNOTIFY_EVENT_DENTRY));
 +
 +      err = 0;
 +      /* if FS_UNMOUNT happens, there must be another bug */
@@ -16980,11 +16938,11 @@ 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    2021-02-24 13:33:42.744347058 +0100
++++ linux/fs/aufs/hfsplus.c    2021-12-03 15:38:59.936647310 +0100
 @@ -0,0 +1,60 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
-+ * Copyright (C) 2010-2020 Junjiro R. Okajima
++ * Copyright (C) 2010-2021 Junjiro R. Okajima
 + *
 + * This program, aufs is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
@@ -17044,11 +17002,11 @@ 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    2021-02-24 13:33:42.744347058 +0100
++++ linux/fs/aufs/hnotify.c    2021-12-03 15:38:59.936647310 +0100
 @@ -0,0 +1,715 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
-+ * Copyright (C) 2005-2020 Junjiro R. Okajima
++ * Copyright (C) 2005-2021 Junjiro R. Okajima
 + *
 + * This program, aufs is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
@@ -17763,11 +17721,11 @@ 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      2021-02-24 13:33:42.744347058 +0100
++++ linux/fs/aufs/iinfo.c      2021-12-03 15:38:59.936647310 +0100
 @@ -0,0 +1,286 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
-+ * Copyright (C) 2005-2020 Junjiro R. Okajima
++ * Copyright (C) 2005-2021 Junjiro R. Okajima
 + *
 + * This program, aufs is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
@@ -18053,11 +18011,11 @@ 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      2021-06-30 21:35:11.397206648 +0200
++++ linux/fs/aufs/inode.c      2021-12-03 15:40:58.236647297 +0100
 @@ -0,0 +1,531 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
-+ * Copyright (C) 2005-2020 Junjiro R. Okajima
++ * Copyright (C) 2005-2021 Junjiro R. Okajima
 + *
 + * This program, aufs is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
@@ -18588,11 +18546,11 @@ diff -urN /usr/share/empty/fs/aufs/inode.c linux/fs/aufs/inode.c
 +}
 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      2021-06-30 21:35:11.397206648 +0200
++++ linux/fs/aufs/inode.h      2021-12-03 15:40:58.236647297 +0100
 @@ -0,0 +1,705 @@
 +/* SPDX-License-Identifier: GPL-2.0 */
 +/*
-+ * Copyright (C) 2005-2020 Junjiro R. Okajima
++ * Copyright (C) 2005-2021 Junjiro R. Okajima
 + *
 + * This program, aufs is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
@@ -18916,7 +18874,7 @@ diff -urN /usr/share/empty/fs/aufs/inode.h linux/fs/aufs/inode.h
 +#endif
 +
 +#ifdef CONFIG_FS_POSIX_ACL
-+struct posix_acl *aufs_get_acl(struct inode *inode, int type);
++struct posix_acl *aufs_get_acl(struct inode *inode, int type, bool rcu);
 +int aufs_set_acl(struct user_namespace *userns, struct inode *inode,
 +               struct posix_acl *acl, int type);
 +#endif
@@ -19297,11 +19255,11 @@ 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      2021-02-24 13:33:42.744347058 +0100
++++ linux/fs/aufs/ioctl.c      2021-12-03 15:38:59.936647310 +0100
 @@ -0,0 +1,220 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
-+ * Copyright (C) 2005-2020 Junjiro R. Okajima
++ * Copyright (C) 2005-2021 Junjiro R. Okajima
 + *
 + * This program, aufs is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
@@ -19521,11 +19479,11 @@ 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   2021-06-30 21:35:11.397206648 +0200
++++ linux/fs/aufs/i_op_add.c   2021-12-03 15:40:58.236647297 +0100
 @@ -0,0 +1,941 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
-+ * Copyright (C) 2005-2020 Junjiro R. Okajima
++ * Copyright (C) 2005-2021 Junjiro R. Okajima
 + *
 + * This program, aufs is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
@@ -20466,11 +20424,11 @@ 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       2021-06-30 21:35:11.397206648 +0200
++++ linux/fs/aufs/i_op.c       2021-12-03 15:40:58.236647297 +0100
 @@ -0,0 +1,1513 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
-+ * Copyright (C) 2005-2020 Junjiro R. Okajima
++ * Copyright (C) 2005-2021 Junjiro R. Okajima
 + *
 + * This program, aufs is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
@@ -21983,11 +21941,11 @@ 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   2021-06-30 21:35:11.397206648 +0200
-@@ -0,0 +1,515 @@
++++ linux/fs/aufs/i_op_del.c   2021-12-03 15:40:58.236647297 +0100
+@@ -0,0 +1,522 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
-+ * Copyright (C) 2005-2020 Junjiro R. Okajima
++ * Copyright (C) 2005-2021 Junjiro R. Okajima
 + *
 + * This program, aufs is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
@@ -22081,6 +22039,9 @@ diff -urN /usr/share/empty/fs/aufs/i_op_del.c linux/fs/aufs/i_op_del.c
 +      umode_t h_mode;
 +      struct dentry *h_dentry, *h_latest;
 +      struct inode *h_inode;
++      struct path h_ppath;
++      struct super_block *sb;
++      struct au_branch *br;
 +      struct user_namespace *h_userns;
 +
 +      h_dentry = au_h_dptr(dentry, bindex);
@@ -22119,13 +22080,17 @@ diff -urN /usr/share/empty/fs/aufs/i_op_del.c linux/fs/aufs/i_op_del.c
 +       * let's try heavy test.
 +       */
 +      err = -EACCES;
-+      h_userns = au_sbr_userns(dentry->d_sb, bindex);
-+      if (unlikely(!au_opt_test(au_mntflags(dentry->d_sb), DIRPERM1)
++      sb = dentry->d_sb;
++      br = au_sbr(sb, bindex);
++      h_userns = au_br_userns(br);
++      if (unlikely(!au_opt_test(au_mntflags(sb), DIRPERM1)
 +                   && au_test_h_perm(h_userns, d_inode(h_parent),
 +                                     MAY_EXEC | MAY_WRITE)))
 +              goto out;
 +
-+      h_latest = au_sio_lkup_one(h_userns, &dentry->d_name, h_parent);
++      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);
 +      err = -EIO;
 +      if (IS_ERR(h_latest))
 +              goto out;
@@ -22502,11 +22467,11 @@ 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   2021-06-30 21:35:11.397206648 +0200
-@@ -0,0 +1,1251 @@
++++ linux/fs/aufs/i_op_ren.c   2021-12-03 15:40:58.236647297 +0100
+@@ -0,0 +1,1257 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
-+ * Copyright (C) 2005-2020 Junjiro R. Okajima
++ * Copyright (C) 2005-2021 Junjiro R. Okajima
 + *
 + * This program, aufs is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
@@ -22656,9 +22621,12 @@ diff -urN /usr/share/empty/fs/aufs/i_op_ren.c linux/fs/aufs/i_op_ren.c
 +{
 +      int rerr;
 +      struct inode *delegated;
++      struct path h_ppath = {
++              .dentry = a->src_h_parent,
++              .mnt    = a->h_path.mnt
++      };
 +
-+      a->h_path.dentry = vfsub_lkup_one(&a->src_dentry->d_name,
-+                                        a->src_h_parent);
++      a->h_path.dentry = vfsub_lkup_one(&a->src_dentry->d_name, &h_ppath);
 +      rerr = PTR_ERR(a->h_path.dentry);
 +      if (IS_ERR(a->h_path.dentry)) {
 +              RevertFailure("lkup one %pd", a->src_dentry);
@@ -22685,9 +22653,12 @@ diff -urN /usr/share/empty/fs/aufs/i_op_ren.c linux/fs/aufs/i_op_ren.c
 +{
 +      int rerr;
 +      struct inode *delegated;
++      struct path h_ppath = {
++              .dentry = a->dst_h_parent,
++              .mnt    = a->h_path.mnt
++      };
 +
-+      a->h_path.dentry = vfsub_lkup_one(&a->dst_dentry->d_name,
-+                                        a->dst_h_parent);
++      a->h_path.dentry = vfsub_lkup_one(&a->dst_dentry->d_name, &h_ppath);
 +      rerr = PTR_ERR(a->h_path.dentry);
 +      if (IS_ERR(a->h_path.dentry)) {
 +              RevertFailure("lkup one %pd", a->dst_dentry);
@@ -23757,7 +23728,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      2021-02-24 13:33:42.741013619 +0100
++++ linux/fs/aufs/Kconfig      2021-12-03 15:38:59.929980643 +0100
 @@ -0,0 +1,199 @@
 +# SPDX-License-Identifier: GPL-2.0
 +config AUFS_FS
@@ -23960,11 +23931,11 @@ 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       2021-02-24 13:33:42.747680497 +0100
++++ linux/fs/aufs/lcnt.h       2021-12-03 15:38:59.936647310 +0100
 @@ -0,0 +1,186 @@
 +/* SPDX-License-Identifier: GPL-2.0 */
 +/*
-+ * Copyright (C) 2018-2020 Junjiro R. Okajima
++ * Copyright (C) 2018-2021 Junjiro R. Okajima
 + *
 + * This program, aufs is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
@@ -24150,11 +24121,11 @@ 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       2021-02-24 13:33:42.747680497 +0100
++++ linux/fs/aufs/loop.c       2021-12-03 15:38:59.936647310 +0100
 @@ -0,0 +1,148 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
-+ * Copyright (C) 2005-2020 Junjiro R. Okajima
++ * Copyright (C) 2005-2021 Junjiro R. Okajima
 + *
 + * This program, aufs is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
@@ -24302,11 +24273,11 @@ 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       2021-02-24 13:33:42.747680497 +0100
++++ linux/fs/aufs/loop.h       2021-12-03 15:38:59.936647310 +0100
 @@ -0,0 +1,55 @@
 +/* SPDX-License-Identifier: GPL-2.0 */
 +/*
-+ * Copyright (C) 2005-2020 Junjiro R. Okajima
++ * Copyright (C) 2005-2021 Junjiro R. Okajima
 + *
 + * This program, aufs is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
@@ -24361,7 +24332,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     2021-02-24 13:33:42.747680497 +0100
++++ linux/fs/aufs/magic.mk     2021-12-03 15:38:59.936647310 +0100
 @@ -0,0 +1,31 @@
 +# SPDX-License-Identifier: GPL-2.0
 +
@@ -24396,7 +24367,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     2021-02-24 13:33:42.741013619 +0100
++++ linux/fs/aufs/Makefile     2021-12-03 15:38:59.929980643 +0100
 @@ -0,0 +1,46 @@
 +# SPDX-License-Identifier: GPL-2.0
 +
@@ -24446,11 +24417,11 @@ 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     2021-02-24 13:33:42.747680497 +0100
++++ linux/fs/aufs/module.c     2021-12-03 15:38:59.936647310 +0100
 @@ -0,0 +1,273 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
-+ * Copyright (C) 2005-2020 Junjiro R. Okajima
++ * Copyright (C) 2005-2021 Junjiro R. Okajima
 + *
 + * This program, aufs is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
@@ -24723,11 +24694,11 @@ 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     2021-02-24 13:33:42.747680497 +0100
++++ linux/fs/aufs/module.h     2021-12-03 15:40:58.236647297 +0100
 @@ -0,0 +1,166 @@
 +/* SPDX-License-Identifier: GPL-2.0 */
 +/*
-+ * Copyright (C) 2005-2020 Junjiro R. Okajima
++ * Copyright (C) 2005-2021 Junjiro R. Okajima
 + *
 + * This program, aufs is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
@@ -24824,7 +24795,7 @@ diff -urN /usr/share/empty/fs/aufs/module.h linux/fs/aufs/module.h
 +static inline int au_kmidx_sub(size_t sz, size_t new_sz)
 +{
 +#ifndef CONFIG_SLOB
-+      return kmalloc_index(sz) - kmalloc_index(new_sz);
++      return __kmalloc_index(sz, false) - __kmalloc_index(new_sz, false);
 +#else
 +      return -1; /* SLOB is untested */
 +#endif
@@ -24893,11 +24864,11 @@ 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     2021-02-24 13:33:42.747680497 +0100
++++ linux/fs/aufs/mvdown.c     2021-12-03 15:38:59.939980643 +0100
 @@ -0,0 +1,706 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
-+ * Copyright (C) 2011-2020 Junjiro R. Okajima
++ * Copyright (C) 2011-2021 Junjiro R. Okajima
 + *
 + * This program, aufs is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
@@ -25603,11 +25574,11 @@ 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       2021-02-24 13:33:42.747680497 +0100
++++ linux/fs/aufs/opts.c       2021-12-03 15:38:59.939980643 +0100
 @@ -0,0 +1,1880 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
-+ * Copyright (C) 2005-2020 Junjiro R. Okajima
++ * Copyright (C) 2005-2021 Junjiro R. Okajima
 + *
 + * This program, aufs is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
@@ -27487,11 +27458,11 @@ 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       2021-02-24 13:33:42.747680497 +0100
++++ linux/fs/aufs/opts.h       2021-12-03 15:38:59.939980643 +0100
 @@ -0,0 +1,225 @@
 +/* SPDX-License-Identifier: GPL-2.0 */
 +/*
-+ * Copyright (C) 2005-2020 Junjiro R. Okajima
++ * Copyright (C) 2005-2021 Junjiro R. Okajima
 + *
 + * This program, aufs is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
@@ -27716,11 +27687,11 @@ 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      2021-02-24 13:33:42.747680497 +0100
++++ linux/fs/aufs/plink.c      2021-12-03 15:38:59.939980643 +0100
 @@ -0,0 +1,516 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
-+ * Copyright (C) 2005-2020 Junjiro R. Okajima
++ * Copyright (C) 2005-2021 Junjiro R. Okajima
 + *
 + * This program, aufs is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
@@ -27926,35 +27897,35 @@ diff -urN /usr/share/empty/fs/aufs/plink.c linux/fs/aufs/plink.c
 +struct au_do_plink_lkup_args {
 +      struct dentry **errp;
 +      struct qstr *tgtname;
-+      struct dentry *h_parent;
-+      struct au_branch *br;
++      struct path *h_ppath;
 +};
 +
 +static struct dentry *au_do_plink_lkup(struct qstr *tgtname,
-+                                     struct dentry *h_parent,
-+                                     struct au_branch *br)
++                                     struct path *h_ppath)
 +{
 +      struct dentry *h_dentry;
 +      struct inode *h_inode;
 +
-+      h_inode = d_inode(h_parent);
++      h_inode = d_inode(h_ppath->dentry);
 +      inode_lock_shared_nested(h_inode, AuLsc_I_CHILD2);
-+      h_dentry = vfsub_lkup_one(tgtname, h_parent);
++      h_dentry = vfsub_lkup_one(tgtname, h_ppath);
 +      inode_unlock_shared(h_inode);
++
 +      return h_dentry;
 +}
 +
 +static void au_call_do_plink_lkup(void *args)
 +{
 +      struct au_do_plink_lkup_args *a = args;
-+      *a->errp = au_do_plink_lkup(a->tgtname, a->h_parent, a->br);
++      *a->errp = au_do_plink_lkup(a->tgtname, a->h_ppath);
 +}
 +
 +/* lookup the plink-ed @inode under the branch at @bindex */
 +struct dentry *au_plink_lkup(struct inode *inode, aufs_bindex_t bindex)
 +{
-+      struct dentry *h_dentry, *h_parent;
++      struct dentry *h_dentry;
 +      struct au_branch *br;
++      struct path h_ppath;
 +      int wkq_err;
 +      char a[PLINK_NAME_LEN];
 +      struct qstr tgtname = QSTR_INIT(a, 0);
@@ -27962,40 +27933,39 @@ diff -urN /usr/share/empty/fs/aufs/plink.c linux/fs/aufs/plink.c
 +      AuDebugOn(au_plink_maint(inode->i_sb, AuLock_NOPLM));
 +
 +      br = au_sbr(inode->i_sb, bindex);
-+      h_parent = br->br_wbr->wbr_plink;
++      h_ppath.dentry = br->br_wbr->wbr_plink;
++      h_ppath.mnt = au_br_mnt(br);
 +      tgtname.len = plink_name(a, sizeof(a), inode, bindex);
 +
 +      if (!uid_eq(current_fsuid(), GLOBAL_ROOT_UID)) {
 +              struct au_do_plink_lkup_args args = {
 +                      .errp           = &h_dentry,
 +                      .tgtname        = &tgtname,
-+                      .h_parent       = h_parent,
-+                      .br             = br
++                      .h_ppath        = &h_ppath
 +              };
 +
 +              wkq_err = au_wkq_wait(au_call_do_plink_lkup, &args);
 +              if (unlikely(wkq_err))
 +                      h_dentry = ERR_PTR(wkq_err);
 +      } else
-+              h_dentry = au_do_plink_lkup(&tgtname, h_parent, br);
++              h_dentry = au_do_plink_lkup(&tgtname, &h_ppath);
 +
 +      return h_dentry;
 +}
 +
 +/* create a pseudo-link */
-+static int do_whplink(struct qstr *tgt, struct dentry *h_parent,
-+                    struct dentry *h_dentry, struct au_branch *br)
++static int do_whplink(struct qstr *tgt, struct path *h_ppath,
++                    struct dentry *h_dentry)
 +{
 +      int err;
-+      struct path h_path = {
-+              .mnt = au_br_mnt(br)
-+      };
++      struct path h_path;
 +      struct inode *h_dir, *delegated;
 +
-+      h_dir = d_inode(h_parent);
++      h_dir = d_inode(h_ppath->dentry);
 +      inode_lock_nested(h_dir, AuLsc_I_CHILD2);
++      h_path.mnt = h_ppath->mnt;
 +again:
-+      h_path.dentry = vfsub_lkup_one(tgt, h_parent);
++      h_path.dentry = vfsub_lkup_one(tgt, h_ppath);
 +      err = PTR_ERR(h_path.dentry);
 +      if (IS_ERR(h_path.dentry))
 +              goto out;
@@ -28036,28 +28006,30 @@ diff -urN /usr/share/empty/fs/aufs/plink.c linux/fs/aufs/plink.c
 +struct do_whplink_args {
 +      int *errp;
 +      struct qstr *tgt;
-+      struct dentry *h_parent;
++      struct path *h_ppath;
 +      struct dentry *h_dentry;
-+      struct au_branch *br;
 +};
 +
 +static void call_do_whplink(void *args)
 +{
 +      struct do_whplink_args *a = args;
-+      *a->errp = do_whplink(a->tgt, a->h_parent, a->h_dentry, a->br);
++      *a->errp = do_whplink(a->tgt, a->h_ppath, a->h_dentry);
 +}
 +
 +static int whplink(struct dentry *h_dentry, struct inode *inode,
-+                 aufs_bindex_t bindex, struct au_branch *br)
++                 aufs_bindex_t bindex)
 +{
 +      int err, wkq_err;
++      struct au_branch *br;
 +      struct au_wbr *wbr;
-+      struct dentry *h_parent;
++      struct path h_ppath;
 +      char a[PLINK_NAME_LEN];
 +      struct qstr tgtname = QSTR_INIT(a, 0);
 +
-+      wbr = au_sbr(inode->i_sb, bindex)->br_wbr;
-+      h_parent = wbr->wbr_plink;
++      br = au_sbr(inode->i_sb, bindex);
++      wbr = br->br_wbr;
++      h_ppath.dentry = wbr->wbr_plink;
++      h_ppath.mnt = au_br_mnt(br);
 +      tgtname.len = plink_name(a, sizeof(a), inode, bindex);
 +
 +      /* always superio. */
@@ -28065,15 +28037,14 @@ diff -urN /usr/share/empty/fs/aufs/plink.c linux/fs/aufs/plink.c
 +              struct do_whplink_args args = {
 +                      .errp           = &err,
 +                      .tgt            = &tgtname,
-+                      .h_parent       = h_parent,
-+                      .h_dentry       = h_dentry,
-+                      .br             = br
++                      .h_ppath        = &h_ppath,
++                      .h_dentry       = h_dentry
 +              };
 +              wkq_err = au_wkq_wait(call_do_whplink, &args);
 +              if (unlikely(wkq_err))
 +                      err = wkq_err;
 +      } else
-+              err = do_whplink(&tgtname, h_parent, h_dentry, br);
++              err = do_whplink(&tgtname, &h_ppath, h_dentry);
 +
 +      return err;
 +}
@@ -28123,7 +28094,7 @@ diff -urN /usr/share/empty/fs/aufs/plink.c linux/fs/aufs/plink.c
 +              if (cnt > AUFS_PLINK_WARN)
 +                      AuWarn1(msg ", %d\n", cnt);
 +#undef msg
-+              err = whplink(h_dentry, inode, bindex, au_sbr(sb, bindex));
++              err = whplink(h_dentry, inode, bindex);
 +              if (unlikely(err)) {
 +                      pr_warn("err %d, damaged pseudo link.\n", err);
 +                      au_hbl_del(&icntnr->plink, hbl);
@@ -28236,11 +28207,11 @@ 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       2021-02-24 13:33:42.747680497 +0100
++++ linux/fs/aufs/poll.c       2021-12-03 15:38:59.939980643 +0100
 @@ -0,0 +1,51 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
-+ * Copyright (C) 2005-2020 Junjiro R. Okajima
++ * Copyright (C) 2005-2021 Junjiro R. Okajima
 + *
 + * This program, aufs is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
@@ -28291,11 +28262,11 @@ 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  2021-06-30 21:35:11.397206648 +0200
-@@ -0,0 +1,106 @@
++++ linux/fs/aufs/posix_acl.c  2021-12-03 15:40:58.236647297 +0100
+@@ -0,0 +1,111 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
-+ * Copyright (C) 2014-2020 Junjiro R. Okajima
++ * Copyright (C) 2014-2021 Junjiro R. Okajima
 + *
 + * This program, aufs is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
@@ -28318,7 +28289,7 @@ diff -urN /usr/share/empty/fs/aufs/posix_acl.c linux/fs/aufs/posix_acl.c
 +#include <linux/fs.h>
 +#include "aufs.h"
 +
-+struct posix_acl *aufs_get_acl(struct inode *inode, int type)
++struct posix_acl *aufs_get_acl(struct inode *inode, int type, bool rcu)
 +{
 +      struct posix_acl *acl;
 +      int err;
@@ -28326,12 +28297,16 @@ diff -urN /usr/share/empty/fs/aufs/posix_acl.c linux/fs/aufs/posix_acl.c
 +      struct inode *h_inode;
 +      struct super_block *sb;
 +
++      acl = ERR_PTR(-ECHILD);
++      if (rcu)
++              goto out;
++
 +      acl = NULL;
 +      sb = inode->i_sb;
 +      si_read_lock(sb, AuLock_FLUSH);
 +      ii_read_lock_child(inode);
 +      if (!(sb->s_flags & SB_POSIXACL))
-+              goto out;
++              goto unlock;
 +
 +      bindex = au_ibtop(inode);
 +      h_inode = au_h_iptr(inode, bindex);
@@ -28340,7 +28315,7 @@ diff -urN /usr/share/empty/fs/aufs/posix_acl.c linux/fs/aufs/posix_acl.c
 +                       != (inode->i_mode & S_IFMT)))) {
 +              err = au_busy_or_stale();
 +              acl = ERR_PTR(err);
-+              goto out;
++              goto unlock;
 +      }
 +
 +      /* always topmost only */
@@ -28350,10 +28325,11 @@ diff -urN /usr/share/empty/fs/aufs/posix_acl.c linux/fs/aufs/posix_acl.c
 +      else
 +              set_cached_acl(inode, type, acl);
 +
-+out:
++unlock:
 +      ii_read_unlock(inode);
 +      si_read_unlock(sb);
 +
++out:
 +      AuTraceErrPtr(acl);
 +      return acl;
 +}
@@ -28401,11 +28377,11 @@ 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     2021-02-24 13:33:42.747680497 +0100
++++ linux/fs/aufs/procfs.c     2021-12-03 15:38:59.939980643 +0100
 @@ -0,0 +1,170 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
-+ * Copyright (C) 2010-2020 Junjiro R. Okajima
++ * Copyright (C) 2010-2021 Junjiro R. Okajima
 + *
 + * This program, aufs is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
@@ -28575,11 +28551,11 @@ 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        2021-02-24 13:33:42.747680497 +0100
++++ linux/fs/aufs/rdu.c        2021-12-03 15:38:59.939980643 +0100
 @@ -0,0 +1,384 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
-+ * Copyright (C) 2005-2020 Junjiro R. Okajima
++ * Copyright (C) 2005-2021 Junjiro R. Okajima
 + *
 + * This program, aufs is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
@@ -28963,11 +28939,11 @@ 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      2021-02-24 13:33:42.747680497 +0100
++++ linux/fs/aufs/rwsem.h      2021-12-03 15:40:58.236647297 +0100
 @@ -0,0 +1,85 @@
 +/* SPDX-License-Identifier: GPL-2.0 */
 +/*
-+ * Copyright (C) 2005-2020 Junjiro R. Okajima
++ * Copyright (C) 2005-2021 Junjiro R. Okajima
 + *
 + * This program, aufs is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
@@ -29052,11 +29028,11 @@ 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     2021-02-24 13:33:42.747680497 +0100
++++ linux/fs/aufs/sbinfo.c     2021-12-03 15:38:59.939980643 +0100
 @@ -0,0 +1,314 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
-+ * Copyright (C) 2005-2020 Junjiro R. Okajima
++ * Copyright (C) 2005-2021 Junjiro R. Okajima
 + *
 + * This program, aufs is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
@@ -29370,11 +29346,11 @@ 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      2021-06-30 21:35:11.397206648 +0200
++++ linux/fs/aufs/super.c      2022-01-13 12:42:15.932899468 +0100
 @@ -0,0 +1,1050 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
-+ * Copyright (C) 2005-2020 Junjiro R. Okajima
++ * Copyright (C) 2005-2021 Junjiro R. Okajima
 + *
 + * This program, aufs is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
@@ -29827,7 +29803,7 @@ diff -urN /usr/share/empty/fs/aufs/super.c linux/fs/aufs/super.c
 +                      continue;
 +
 +              h_sb = au_sbr_sb(sb, bindex);
-+              e = vfsub_sync_filesystem(h_sb, wait);
++              e = vfsub_sync_filesystem(h_sb);
 +              if (unlikely(e && !err))
 +                      err = e;
 +              /* go on even if an error happens */
@@ -30424,11 +30400,11 @@ 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      2021-02-24 13:33:42.747680497 +0100
++++ linux/fs/aufs/super.h      2021-12-03 15:38:59.939980643 +0100
 @@ -0,0 +1,587 @@
 +/* SPDX-License-Identifier: GPL-2.0 */
 +/*
-+ * Copyright (C) 2005-2020 Junjiro R. Okajima
++ * Copyright (C) 2005-2021 Junjiro R. Okajima
 + *
 + * This program, aufs is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
@@ -31015,11 +30991,11 @@ 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    2021-02-24 13:33:42.747680497 +0100
++++ linux/fs/aufs/sysaufs.c    2021-12-03 15:38:59.939980643 +0100
 @@ -0,0 +1,93 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
-+ * Copyright (C) 2005-2020 Junjiro R. Okajima
++ * Copyright (C) 2005-2021 Junjiro R. Okajima
 + *
 + * This program, aufs is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
@@ -31112,11 +31088,11 @@ 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    2021-02-24 13:33:42.747680497 +0100
++++ linux/fs/aufs/sysaufs.h    2021-12-03 15:38:59.939980643 +0100
 @@ -0,0 +1,102 @@
 +/* SPDX-License-Identifier: GPL-2.0 */
 +/*
-+ * Copyright (C) 2005-2020 Junjiro R. Okajima
++ * Copyright (C) 2005-2021 Junjiro R. Okajima
 + *
 + * This program, aufs is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
@@ -31218,11 +31194,11 @@ 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      2021-02-24 13:33:42.747680497 +0100
++++ linux/fs/aufs/sysfs.c      2021-12-03 15:38:59.939980643 +0100
 @@ -0,0 +1,374 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
-+ * Copyright (C) 2005-2020 Junjiro R. Okajima
++ * Copyright (C) 2005-2021 Junjiro R. Okajima
 + *
 + * This program, aufs is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
@@ -31596,11 +31572,11 @@ 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      2021-02-24 13:33:42.747680497 +0100
++++ linux/fs/aufs/sysrq.c      2021-12-03 15:38:59.939980643 +0100
 @@ -0,0 +1,149 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
-+ * Copyright (C) 2005-2020 Junjiro R. Okajima
++ * Copyright (C) 2005-2021 Junjiro R. Okajima
 + *
 + * This program, aufs is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
@@ -31749,11 +31725,11 @@ 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       2021-02-24 13:33:42.747680497 +0100
++++ linux/fs/aufs/vdir.c       2021-12-03 15:38:59.939980643 +0100
 @@ -0,0 +1,896 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
-+ * Copyright (C) 2005-2020 Junjiro R. Okajima
++ * Copyright (C) 2005-2021 Junjiro R. Okajima
 + *
 + * This program, aufs is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
@@ -32649,11 +32625,11 @@ 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      2021-06-30 21:35:11.397206648 +0200
-@@ -0,0 +1,916 @@
++++ linux/fs/aufs/vfsub.c      2022-01-13 12:42:15.932899468 +0100
+@@ -0,0 +1,919 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
-+ * Copyright (C) 2005-2020 Junjiro R. Okajima
++ * Copyright (C) 2005-2021 Junjiro R. Okajima
 + *
 + * This program, aufs is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
@@ -32690,13 +32666,13 @@ diff -urN /usr/share/empty/fs/aufs/vfsub.c linux/fs/aufs/vfsub.c
 +}
 +#endif
 +
-+int vfsub_sync_filesystem(struct super_block *h_sb, int wait)
++int vfsub_sync_filesystem(struct super_block *h_sb)
 +{
 +      int err;
 +
 +      lockdep_off();
 +      down_read(&h_sb->s_umount);
-+      err = __sync_filesystem(h_sb, wait);
++      err = sync_filesystem(h_sb);
 +      up_read(&h_sb->s_umount);
 +      lockdep_on();
 +
@@ -32711,6 +32687,11 @@ diff -urN /usr/share/empty/fs/aufs/vfsub.c linux/fs/aufs/vfsub.c
 +      struct kstat st;
 +      struct super_block *h_sb;
 +
++      /*
++       * Always needs h_path->mnt for LSM or FUSE branch.
++       */
++      AuDebugOn(!h_path->mnt);
++
 +      /* for remote fs, leave work for its getattr or d_revalidate */
 +      /* for bad i_attr fs, handle them in aufs_getattr() */
 +      /* still some fs may acquire i_mutex. we need to skip them */
@@ -32819,38 +32800,38 @@ diff -urN /usr/share/empty/fs/aufs/vfsub.c linux/fs/aufs/vfsub.c
 +}
 +
 +struct dentry *vfsub_lookup_one_len_unlocked(const char *name,
-+                                           struct dentry *parent, int len)
++                                           struct path *ppath, int len)
 +{
-+      struct path path = {
-+              .mnt = NULL
-+      };
++      struct path path;
 +
-+      path.dentry = lookup_one_len_unlocked(name, parent, len);
++      path.dentry = lookup_one_len_unlocked(name, ppath->dentry, len);
 +      if (IS_ERR(path.dentry))
 +              goto out;
-+      if (d_is_positive(path.dentry))
++      if (d_is_positive(path.dentry)) {
++              path.mnt = ppath->mnt;
 +              vfsub_update_h_iattr(&path, /*did*/NULL); /*ignore*/
++      }
 +
 +out:
 +      AuTraceErrPtr(path.dentry);
 +      return path.dentry;
 +}
 +
-+struct dentry *vfsub_lookup_one_len(const char *name, struct dentry *parent,
++struct dentry *vfsub_lookup_one_len(const char *name, struct path *ppath,
 +                                  int len)
 +{
-+      struct path path = {
-+              .mnt = NULL
-+      };
++      struct path path;
 +
 +      /* VFS checks it too, but by WARN_ON_ONCE() */
-+      IMustLock(d_inode(parent));
++      IMustLock(d_inode(ppath->dentry));
 +
-+      path.dentry = lookup_one_len(name, parent, len);
++      path.dentry = lookup_one_len(name, ppath->dentry, len);
 +      if (IS_ERR(path.dentry))
 +              goto out;
-+      if (d_is_positive(path.dentry))
++      if (d_is_positive(path.dentry)) {
++              path.mnt = ppath->mnt;
 +              vfsub_update_h_iattr(&path, /*did*/NULL); /*ignore*/
++      }
 +
 +out:
 +      AuTraceErrPtr(path.dentry);
@@ -32860,7 +32841,7 @@ diff -urN /usr/share/empty/fs/aufs/vfsub.c linux/fs/aufs/vfsub.c
 +void vfsub_call_lkup_one(void *args)
 +{
 +      struct vfsub_lkup_one_args *a = args;
-+      *a->errp = vfsub_lkup_one(a->name, a->parent);
++      *a->errp = vfsub_lkup_one(a->name, a->ppath);
 +}
 +
 +/* ---------------------------------------------------------------------- */
@@ -33325,9 +33306,7 @@ diff -urN /usr/share/empty/fs/aufs/vfsub.c linux/fs/aufs/vfsub.c
 +      lockdep_off();
 +      sb_start_write(h_sb);
 +      lockdep_on();
-+      err = locks_verify_truncate(h_inode, h_file, length);
-+      if (!err)
-+              err = security_path_truncate(h_path);
++      err = security_path_truncate(h_path);
 +      if (!err) {
 +              h_userns = mnt_user_ns(h_path->mnt);
 +              lockdep_off();
@@ -33569,11 +33548,11 @@ 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      2021-06-30 21:35:11.397206648 +0200
++++ linux/fs/aufs/vfsub.h      2022-01-13 12:42:15.932899468 +0100
 @@ -0,0 +1,358 @@
 +/* SPDX-License-Identifier: GPL-2.0 */
 +/*
-+ * Copyright (C) 2005-2020 Junjiro R. Okajima
++ * Copyright (C) 2005-2021 Junjiro R. Okajima
 + *
 + * This program, aufs is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
@@ -33657,7 +33636,7 @@ diff -urN /usr/share/empty/fs/aufs/vfsub.h linux/fs/aufs/vfsub.h
 +AuStubInt0(vfsub_test_mntns, struct vfsmount *mnt, struct super_block *h_sb);
 +#endif
 +
-+int vfsub_sync_filesystem(struct super_block *h_sb, int wait);
++int vfsub_sync_filesystem(struct super_block *h_sb);
 +
 +/* ---------------------------------------------------------------------- */
 +
@@ -33676,20 +33655,20 @@ diff -urN /usr/share/empty/fs/aufs/vfsub.h linux/fs/aufs/vfsub.h
 +int vfsub_kern_path(const char *name, unsigned int flags, struct path *path);
 +
 +struct dentry *vfsub_lookup_one_len_unlocked(const char *name,
-+                                           struct dentry *parent, int len);
-+struct dentry *vfsub_lookup_one_len(const char *name, struct dentry *parent,
++                                           struct path *ppath, int len);
++struct dentry *vfsub_lookup_one_len(const char *name, struct path *ppath,
 +                                  int len);
 +
 +struct vfsub_lkup_one_args {
 +      struct dentry **errp;
 +      struct qstr *name;
-+      struct dentry *parent;
++      struct path *ppath;
 +};
 +
 +static inline struct dentry *vfsub_lkup_one(struct qstr *name,
-+                                          struct dentry *parent)
++                                          struct path *ppath)
 +{
-+      return vfsub_lookup_one_len(name->name, parent, name->len);
++      return vfsub_lookup_one_len(name->name, ppath, name->len);
 +}
 +
 +void vfsub_call_lkup_one(void *args);
@@ -33802,7 +33781,7 @@ diff -urN /usr/share/empty/fs/aufs/vfsub.h linux/fs/aufs/vfsub.h
 +static inline int vfsub_update_time(struct inode *h_inode,
 +                                  struct timespec64 *ts, int flags)
 +{
-+      return update_time(h_inode, ts, flags);
++      return inode_update_time(h_inode, ts, flags);
 +      /* no vfsub_update_h_iattr() since we don't have struct path */
 +}
 +
@@ -33931,11 +33910,11 @@ 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 2021-02-24 13:33:42.747680497 +0100
++++ linux/fs/aufs/wbr_policy.c 2021-12-03 15:38:59.939980643 +0100
 @@ -0,0 +1,830 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
-+ * Copyright (C) 2005-2020 Junjiro R. Okajima
++ * Copyright (C) 2005-2021 Junjiro R. Okajima
 + *
 + * This program, aufs is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
@@ -34765,11 +34744,11 @@ 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      2021-06-30 21:35:11.397206648 +0200
-@@ -0,0 +1,1070 @@
++++ linux/fs/aufs/whout.c      2021-12-03 15:40:58.236647297 +0100
+@@ -0,0 +1,1072 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
-+ * Copyright (C) 2005-2020 Junjiro R. Okajima
++ * Copyright (C) 2005-2021 Junjiro R. Okajima
 + *
 + * This program, aufs is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
@@ -34830,19 +34809,19 @@ diff -urN /usr/share/empty/fs/aufs/whout.c linux/fs/aufs/whout.c
 +/* ---------------------------------------------------------------------- */
 +
 +/*
-+ * test if the @wh_name exists under @h_parent.
++ * 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 dentry *h_parent,
++int au_wh_test(struct user_namespace *h_userns, struct path *h_ppath,
 +             struct qstr *wh_name, int try_sio)
 +{
 +      int err;
 +      struct dentry *wh_dentry;
 +
 +      if (!try_sio)
-+              wh_dentry = vfsub_lkup_one(wh_name, h_parent);
++              wh_dentry = vfsub_lkup_one(wh_name, h_ppath);
 +      else
-+              wh_dentry = au_sio_lkup_one(h_userns, wh_name, h_parent);
++              wh_dentry = au_sio_lkup_one(h_userns, wh_name, h_ppath);
 +      err = PTR_ERR(wh_dentry);
 +      if (IS_ERR(wh_dentry)) {
 +              if (err == -ENAMETOOLONG)
@@ -34869,15 +34848,15 @@ diff -urN /usr/share/empty/fs/aufs/whout.c linux/fs/aufs/whout.c
 +}
 +
 +/*
-+ * test if the @h_dentry sets opaque or not.
++ * test if the @h_path->dentry sets opaque or not.
 + */
-+int au_diropq_test(struct user_namespace *h_userns, struct dentry *h_dentry)
++int au_diropq_test(struct user_namespace *h_userns, struct path *h_path)
 +{
 +      int err;
 +      struct inode *h_dir;
 +
-+      h_dir = d_inode(h_dentry);
-+      err = au_wh_test(h_userns, h_dentry, &diropq_name,
++      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));
 +      return err;
 +}
@@ -34895,6 +34874,7 @@ diff -urN /usr/share/empty/fs/aufs/whout.c linux/fs/aufs/whout.c
 +      /* strict atomic_t is unnecessary here */
 +      static unsigned short cnt;
 +      struct qstr qs;
++      struct path h_ppath;
 +      struct user_namespace *h_userns;
 +
 +      BUILD_BUG_ON(sizeof(cnt) * 2 > AUFS_WH_TMP_LEN);
@@ -34919,11 +34899,13 @@ diff -urN /usr/share/empty/fs/aufs/whout.c linux/fs/aufs/whout.c
 +      *p++ = '.';
 +      AuDebugOn(name + qs.len + 1 - p <= AUFS_WH_TMP_LEN);
 +
++      h_ppath.dentry = h_parent;
++      h_ppath.mnt = au_br_mnt(br);
 +      h_userns = au_br_userns(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_parent);
++              dentry = au_sio_lkup_one(h_userns, &qs, &h_ppath);
 +              if (IS_ERR(dentry) || d_is_negative(dentry))
 +                      goto out_name;
 +              dput(dentry);
@@ -35017,21 +34999,20 @@ diff -urN /usr/share/empty/fs/aufs/whout.c linux/fs/aufs/whout.c
 +      return err;
 +}
 +
-+static int unlink_wh_name(struct dentry *h_parent, struct qstr *wh,
-+                        struct au_branch *br)
++static int unlink_wh_name(struct path *h_ppath, struct qstr *wh)
 +{
 +      int err;
-+      struct path h_path = {
-+              .mnt = au_br_mnt(br)
-+      };
++      struct path h_path;
 +
 +      err = 0;
-+      h_path.dentry = vfsub_lkup_one(wh, h_parent);
++      h_path.dentry = vfsub_lkup_one(wh, h_ppath);
 +      if (IS_ERR(h_path.dentry))
 +              err = PTR_ERR(h_path.dentry);
 +      else {
-+              if (d_is_reg(h_path.dentry))
-+                      err = do_unlink_wh(d_inode(h_parent), &h_path);
++              if (d_is_reg(h_path.dentry)) {
++                      h_path.mnt = h_ppath->mnt;
++                      err = do_unlink_wh(d_inode(h_ppath->dentry), &h_path);
++              }
 +              dput(h_path.dentry);
 +      }
 +
@@ -35471,15 +35452,17 @@ diff -urN /usr/share/empty/fs/aufs/whout.c linux/fs/aufs/whout.c
 +static struct dentry *do_diropq(struct dentry *dentry, aufs_bindex_t bindex,
 +                              unsigned int flags)
 +{
-+      struct dentry *opq_dentry, *h_dentry;
++      struct dentry *opq_dentry;
 +      struct super_block *sb;
 +      struct au_branch *br;
++      struct path h_path;
 +      int err;
 +
 +      sb = dentry->d_sb;
 +      br = au_sbr(sb, bindex);
-+      h_dentry = au_h_dptr(dentry, bindex);
-+      opq_dentry = vfsub_lkup_one(&diropq_name, h_dentry);
++      h_path.dentry = au_h_dptr(dentry, bindex);
++      h_path.mnt = au_br_mnt(br);
++      opq_dentry = vfsub_lkup_one(&diropq_name, &h_path);
 +      if (IS_ERR(opq_dentry))
 +              goto out;
 +
@@ -35490,11 +35473,8 @@ diff -urN /usr/share/empty/fs/aufs/whout.c linux/fs/aufs/whout.c
 +                      goto out; /* success */
 +              }
 +      } else {
-+              struct path tmp = {
-+                      .dentry = opq_dentry,
-+                      .mnt    = au_br_mnt(br)
-+              };
-+              err = do_unlink_wh(au_h_iptr(d_inode(dentry), bindex), &tmp);
++              h_path.dentry = opq_dentry;
++              err = do_unlink_wh(au_h_iptr(d_inode(dentry), bindex), &h_path);
 +              if (!err)
 +                      au_set_dbdiropq(dentry, -1);
 +      }
@@ -35560,11 +35540,14 @@ diff -urN /usr/share/empty/fs/aufs/whout.c linux/fs/aufs/whout.c
 +      int err;
 +      struct qstr wh_name;
 +      struct dentry *wh_dentry;
++      struct path h_path;
 +
 +      err = au_wh_name_alloc(&wh_name, base_name);
 +      wh_dentry = ERR_PTR(err);
 +      if (!err) {
-+              wh_dentry = vfsub_lkup_one(&wh_name, h_parent);
++              h_path.dentry = h_parent;
++              h_path.mnt = au_br_mnt(br);
++              wh_dentry = vfsub_lkup_one(&wh_name, &h_path);
 +              au_kfree_try_rcu(wh_name.name);
 +      }
 +      return wh_dentry;
@@ -35599,8 +35582,8 @@ diff -urN /usr/share/empty/fs/aufs/whout.c linux/fs/aufs/whout.c
 +/* ---------------------------------------------------------------------- */
 +
 +/* Delete all whiteouts in this directory on branch bindex. */
-+static int del_wh_children(struct dentry *h_dentry, struct au_nhash *whlist,
-+                         aufs_bindex_t bindex, struct au_branch *br)
++static int del_wh_children(struct path *h_path, struct au_nhash *whlist,
++                         aufs_bindex_t bindex)
 +{
 +      int err;
 +      unsigned long ul, n;
@@ -35630,7 +35613,7 @@ diff -urN /usr/share/empty/fs/aufs/whout.c linux/fs/aufs/whout.c
 +                      if (str->len + AUFS_WH_PFX_LEN <= PATH_MAX) {
 +                              memcpy(p, str->name, str->len);
 +                              wh_name.len = AUFS_WH_PFX_LEN + str->len;
-+                              err = unlink_wh_name(h_dentry, &wh_name, br);
++                              err = unlink_wh_name(h_path, &wh_name);
 +                              if (!err)
 +                                      continue;
 +                              break;
@@ -35649,16 +35632,15 @@ diff -urN /usr/share/empty/fs/aufs/whout.c linux/fs/aufs/whout.c
 +
 +struct del_wh_children_args {
 +      int *errp;
-+      struct dentry *h_dentry;
++      struct path *h_path;
 +      struct au_nhash *whlist;
 +      aufs_bindex_t bindex;
-+      struct au_branch *br;
 +};
 +
 +static void call_del_wh_children(void *args)
 +{
 +      struct del_wh_children_args *a = args;
-+      *a->errp = del_wh_children(a->h_dentry, a->whlist, a->bindex, a->br);
++      *a->errp = del_wh_children(a->h_path, a->whlist, a->bindex);
 +}
 +
 +/* ---------------------------------------------------------------------- */
@@ -35710,7 +35692,7 @@ diff -urN /usr/share/empty/fs/aufs/whout.c linux/fs/aufs/whout.c
 +{
 +      int err;
 +      unsigned int h_nlink;
-+      struct path h_tmp;
++      struct path wh_path;
 +      struct inode *wh_inode, *h_dir;
 +      struct au_branch *br;
 +      struct user_namespace *h_userns;
@@ -35719,6 +35701,8 @@ diff -urN /usr/share/empty/fs/aufs/whout.c linux/fs/aufs/whout.c
 +      IMustLock(h_dir);
 +
 +      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);
 +      wh_inode = d_inode(wh_dentry);
 +      inode_lock_nested(wh_inode, AuLsc_I_CHILD);
@@ -35728,15 +35712,14 @@ diff -urN /usr/share/empty/fs/aufs/whout.c linux/fs/aufs/whout.c
 +       * it means this whlist may have an obsoleted entry.
 +       */
 +      if (!au_test_h_perm_sio(h_userns, wh_inode, MAY_EXEC | MAY_WRITE))
-+              err = del_wh_children(wh_dentry, whlist, bindex, br);
++              err = del_wh_children(&wh_path, whlist, bindex);
 +      else {
 +              int wkq_err;
 +              struct del_wh_children_args args = {
 +                      .errp           = &err,
-+                      .h_dentry       = wh_dentry,
++                      .h_path         = &wh_path,
 +                      .whlist         = whlist,
-+                      .bindex         = bindex,
-+                      .br             = br
++                      .bindex         = bindex
 +              };
 +
 +              wkq_err = au_wkq_wait(call_del_wh_children, &args);
@@ -35746,10 +35729,8 @@ diff -urN /usr/share/empty/fs/aufs/whout.c linux/fs/aufs/whout.c
 +      inode_unlock(wh_inode);
 +
 +      if (!err) {
-+              h_tmp.dentry = wh_dentry;
-+              h_tmp.mnt = au_br_mnt(br);
 +              h_nlink = h_dir->i_nlink;
-+              err = vfsub_rmdir(h_dir, &h_tmp);
++              err = vfsub_rmdir(h_dir, &wh_path);
 +              /* some fs doesn't change the parent nlink in some cases */
 +              h_nlink -= h_dir->i_nlink;
 +      }
@@ -35839,11 +35820,11 @@ 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      2021-06-30 21:35:11.397206648 +0200
++++ linux/fs/aufs/whout.h      2021-12-03 15:40:58.236647297 +0100
 @@ -0,0 +1,87 @@
 +/* SPDX-License-Identifier: GPL-2.0 */
 +/*
-+ * Copyright (C) 2005-2020 Junjiro R. Okajima
++ * Copyright (C) 2005-2021 Junjiro R. Okajima
 + *
 + * This program, aufs is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
@@ -35872,9 +35853,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 dentry *h_parent,
++int au_wh_test(struct user_namespace *h_userns, struct path *h_ppath,
 +             struct qstr *wh_name, int try_sio);
-+int au_diropq_test(struct user_namespace *h_userns, struct dentry *h_dentry);
++int au_diropq_test(struct user_namespace *h_userns, struct path *h_path);
 +struct au_branch;
 +struct dentry *au_whtmp_lkup(struct dentry *h_parent, struct au_branch *br,
 +                           struct qstr *prefix);
@@ -35930,11 +35911,11 @@ 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        2021-02-24 13:33:42.751013936 +0100
++++ linux/fs/aufs/wkq.c        2021-12-03 15:38:59.943313977 +0100
 @@ -0,0 +1,372 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
-+ * Copyright (C) 2005-2020 Junjiro R. Okajima
++ * Copyright (C) 2005-2021 Junjiro R. Okajima
 + *
 + * This program, aufs is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
@@ -36306,11 +36287,11 @@ 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        2021-02-24 13:33:42.751013936 +0100
++++ linux/fs/aufs/wkq.h        2021-12-03 15:38:59.943313977 +0100
 @@ -0,0 +1,89 @@
 +/* SPDX-License-Identifier: GPL-2.0 */
 +/*
-+ * Copyright (C) 2005-2020 Junjiro R. Okajima
++ * Copyright (C) 2005-2021 Junjiro R. Okajima
 + *
 + * This program, aufs is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
@@ -36399,11 +36380,11 @@ 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      2021-06-30 21:35:11.397206648 +0200
++++ linux/fs/aufs/xattr.c      2021-12-03 15:40:58.236647297 +0100
 @@ -0,0 +1,368 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
-+ * Copyright (C) 2014-2020 Junjiro R. Okajima
++ * Copyright (C) 2014-2021 Junjiro R. Okajima
 + *
 + * This program, aufs is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
@@ -36771,11 +36752,11 @@ 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       2021-06-30 21:35:11.397206648 +0200
-@@ -0,0 +1,1925 @@
++++ linux/fs/aufs/xino.c       2021-12-03 15:40:58.236647297 +0100
+@@ -0,0 +1,1926 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
-+ * Copyright (C) 2005-2020 Junjiro R. Okajima
++ * Copyright (C) 2005-2021 Junjiro R. Okajima
 + *
 + * This program, aufs is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
@@ -37010,22 +36991,23 @@ diff -urN /usr/share/empty/fs/aufs/xino.c linux/fs/aufs/xino.c
 +                           struct file *copy_src)
 +{
 +      struct file *file;
-+      struct dentry *dentry, *parent;
++      struct dentry *dentry;
 +      struct inode *dir, *delegated;
 +      struct qstr *name;
-+      struct path path;
++      struct path ppath, path;
 +      int err, do_unlock;
 +      struct au_xino_lock_dir ldir;
 +
 +      do_unlock = 1;
 +      au_xino_lock_dir(sb, base, &ldir);
 +      dentry = base->dentry;
-+      parent = dentry->d_parent; /* dir inode is locked */
-+      dir = d_inode(parent);
++      ppath.dentry = dentry->d_parent; /* dir inode is locked */
++      ppath.mnt = base->mnt;
++      dir = d_inode(ppath.dentry);
 +      IMustLock(dir);
 +
 +      name = &dentry->d_name;
-+      path.dentry = vfsub_lookup_one_len(name->name, parent, name->len);
++      path.dentry = vfsub_lookup_one_len(name->name, &ppath, name->len);
 +      if (IS_ERR(path.dentry)) {
 +              file = (void *)path.dentry;
 +              pr_err("%pd lookup err %ld\n", dentry, PTR_ERR(path.dentry));
@@ -38700,11 +38682,11 @@ 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       2021-06-30 21:35:11.397206648 +0200
++++ linux/include/uapi/linux/aufs_type.h       2022-01-13 12:42:15.932899468 +0100
 @@ -0,0 +1,452 @@
 +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 +/*
-+ * Copyright (C) 2005-2020 Junjiro R. Okajima
++ * Copyright (C) 2005-2021 Junjiro R. Okajima
 + *
 + * This program, aufs is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
@@ -38744,7 +38726,7 @@ diff -urN /usr/share/empty/include/uapi/linux/aufs_type.h linux/include/uapi/lin
 +#include <limits.h>
 +#endif /* __KERNEL__ */
 +
-+#define AUFS_VERSION  "5.x-rcN-20210517"
++#define AUFS_VERSION  "5.x-rcN-20211129"
 +
 +/* todo? move this to linux-2.6.19/include/magic.h */
 +#define AUFS_SUPER_MAGIC      ('a' << 24 | 'u' << 16 | 'f' << 8 | 's')
@@ -39158,10 +39140,10 @@ SPDX-License-Identifier: GPL-2.0
 aufs5.x-rcN loopback patch
 
 diff --git a/drivers/block/loop.c b/drivers/block/loop.c
-index 794a8a1341989..0e5664a6753e5 100644
+index 52776d48e306a..64112f1cf8b18 100644
 --- a/drivers/block/loop.c
 +++ b/drivers/block/loop.c
-@@ -647,6 +647,15 @@ static inline void loop_update_dio(struct loop_device *lo)
+@@ -509,6 +509,15 @@ static inline void loop_update_dio(struct loop_device *lo)
                                lo->use_dio);
  }
  
@@ -39174,28 +39156,28 @@ index 794a8a1341989..0e5664a6753e5 100644
 +      return f;
 +}
 +
- static void loop_reread_partitions(struct loop_device *lo,
-                                  struct block_device *bdev)
+ static void loop_reread_partitions(struct loop_device *lo)
  {
-@@ -702,6 +711,7 @@ static int loop_change_fd(struct loop_device *lo, struct block_device *bdev,
-                         unsigned int arg)
+       int rc;
+@@ -566,6 +575,7 @@ static int loop_change_fd(struct loop_device *lo, struct block_device *bdev,
  {
-       struct file     *file = NULL, *old_file;
-+      struct file     *f, *virt_file = NULL, *old_virt_file;
-       int             error;
-       bool            partscan;
-@@ -721,12 +731,19 @@ static int loop_change_fd(struct loop_device *lo, struct block_device *bdev,
-       file = fget(arg);
-       if (!file)
+       struct file *file = fget(arg);
+       struct file *old_file;
++      struct file *f, *virt_file = NULL, *old_virt_file;
+       int error;
+       bool partscan;
+       bool is_loop;
+@@ -585,11 +595,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;
 +      f = loop_real_file(file);
 +      if (f) {
 +              virt_file = file;
 +              file = f;
 +              get_file(file);
 +      }
++
        error = loop_validate_file(file, bdev);
        if (error)
                goto out_err;
@@ -39205,7 +39187,7 @@ index 794a8a1341989..0e5664a6753e5 100644
  
        error = -EINVAL;
  
-@@ -738,6 +755,7 @@ static int loop_change_fd(struct loop_device *lo, struct block_device *bdev,
+@@ -602,6 +620,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;
@@ -39213,47 +39195,47 @@ index 794a8a1341989..0e5664a6753e5 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));
-@@ -751,6 +769,8 @@ static int loop_change_fd(struct loop_device *lo, struct block_device *bdev,
+@@ -624,6 +643,8 @@ static int loop_change_fd(struct loop_device *lo, struct block_device *bdev,
         * dependency.
         */
        fput(old_file);
 +      if (old_virt_file)
 +              fput(old_virt_file);
        if (partscan)
-               loop_reread_partitions(lo, bdev);
+               loop_reread_partitions(lo);
        return 0;
-@@ -759,6 +779,8 @@ static int loop_change_fd(struct loop_device *lo, struct block_device *bdev,
-       mutex_unlock(&lo->lo_mutex);
-       if (file)
-               fput(file);
+@@ -632,6 +653,8 @@ static int loop_change_fd(struct loop_device *lo, struct block_device *bdev,
+       loop_global_unlock(lo, is_loop);
+ out_putf:
+       fput(file);
 +      if (virt_file)
 +              fput(virt_file);
        return error;
  }
  
-@@ -1085,7 +1107,7 @@ static int loop_configure(struct loop_device *lo, fmode_t mode,
-                         struct block_device *bdev,
+@@ -965,6 +988,7 @@ static int loop_configure(struct loop_device *lo, fmode_t mode,
                          const struct loop_config *config)
  {
--      struct file     *file;
-+      struct file     *file, *f, *virt_file = NULL;
-       struct inode    *inode;
+       struct file *file = fget(config->fd);
++      struct file *f, *virt_file = NULL;
+       struct inode *inode;
        struct address_space *mapping;
-       int             error;
-@@ -1100,6 +1122,12 @@ static int loop_configure(struct loop_device *lo, fmode_t mode,
-       file = fget(config->fd);
-       if (!file)
-               goto out;
+       int error;
+@@ -980,6 +1004,13 @@ static int loop_configure(struct loop_device *lo, fmode_t mode,
+       /* This is safe, since we have a reference from open(). */
+       __module_get(THIS_MODULE);
 +      f = loop_real_file(file);
 +      if (f) {
 +              virt_file = file;
 +              file = f;
 +              get_file(file);
 +      }
++
        /*
         * If we don't hold exclusive handle for the device, upgrade to it
-@@ -1154,6 +1182,7 @@ static int loop_configure(struct loop_device *lo, fmode_t mode,
+        * here to avoid changing device under exclusive owner.
+@@ -1045,6 +1076,7 @@ static int loop_configure(struct loop_device *lo, fmode_t mode,
        lo->use_dio = lo->lo_flags & LO_FLAGS_DIRECT_IO;
        lo->lo_device = bdev;
        lo->lo_backing_file = file;
@@ -39261,32 +39243,32 @@ index 794a8a1341989..0e5664a6753e5 100644
        lo->old_gfp_mask = mapping_gfp_mask(mapping);
        mapping_set_gfp_mask(mapping, lo->old_gfp_mask & ~(__GFP_IO|__GFP_FS));
  
-@@ -1204,6 +1233,8 @@ static int loop_configure(struct loop_device *lo, fmode_t mode,
+@@ -1095,6 +1127,8 @@ static int loop_configure(struct loop_device *lo, fmode_t mode,
                bd_abort_claiming(bdev, loop_configure);
  out_putf:
        fput(file);
 +      if (virt_file)
 +              fput(virt_file);
- out:
        /* This is safe: open() is still holding a reference. */
        module_put(THIS_MODULE);
-@@ -1213,6 +1244,7 @@ static int loop_configure(struct loop_device *lo, fmode_t mode,
+       return error;
+@@ -1103,6 +1137,7 @@ static int loop_configure(struct loop_device *lo, fmode_t mode,
  static int __loop_clr_fd(struct loop_device *lo, bool release)
  {
        struct file *filp = NULL;
 +      struct file *virt_filp = lo->lo_backing_virt_file;
        gfp_t gfp = lo->old_gfp_mask;
-       struct block_device *bdev = lo->lo_device;
        int err = 0;
-@@ -1239,6 +1271,7 @@ static int __loop_clr_fd(struct loop_device *lo, bool release)
+       bool partscan = false;
+@@ -1153,6 +1188,7 @@ static int __loop_clr_fd(struct loop_device *lo, bool release)
  
        spin_lock_irq(&lo->lo_lock);
        lo->lo_backing_file = NULL;
 +      lo->lo_backing_virt_file = NULL;
        spin_unlock_irq(&lo->lo_lock);
  
-       loop_release_xfer(lo);
-@@ -1320,6 +1353,8 @@ static int __loop_clr_fd(struct loop_device *lo, bool release)
+       lo->lo_device = NULL;
+@@ -1220,6 +1256,8 @@ static int __loop_clr_fd(struct loop_device *lo, bool release)
         */
        if (filp)
                fput(filp);
@@ -39296,20 +39278,20 @@ index 794a8a1341989..0e5664a6753e5 100644
  }
  
 diff --git a/drivers/block/loop.h b/drivers/block/loop.h
-index a3c04f310672e..161c3c5d1c22b 100644
+index 082d4b6bfc6a6..61feca64688df 100644
 --- a/drivers/block/loop.h
 +++ b/drivers/block/loop.h
-@@ -46,7 +46,7 @@ struct loop_device {
-       int             (*ioctl)(struct loop_device *, int cmd, 
-                                unsigned long arg); 
+@@ -34,7 +34,7 @@ struct loop_device {
+       int             lo_flags;
+       char            lo_file_name[LO_NAME_SIZE];
  
 -      struct file *   lo_backing_file;
 +      struct file     *lo_backing_file, *lo_backing_virt_file;
        struct block_device *lo_device;
-       void            *key_data; 
  
+       gfp_t           old_gfp_mask;
 diff --git a/fs/aufs/f_op.c b/fs/aufs/f_op.c
-index 9f58ba0cb769f..1c2267a5a2ae1 100644
+index 99ceca1440449..e49dfe8550329 100644
 --- a/fs/aufs/f_op.c
 +++ b/fs/aufs/f_op.c
 @@ -304,7 +304,7 @@ static ssize_t aufs_read_iter(struct kiocb *kio, struct iov_iter *iov_iter)
@@ -39322,7 +39304,7 @@ index 9f58ba0cb769f..1c2267a5a2ae1 100644
                if (file->f_mapping != h_file->f_mapping) {
                        file->f_mapping = h_file->f_mapping;
 diff --git a/fs/aufs/loop.c b/fs/aufs/loop.c
-index a8b63acc62045..9d97c3af5686a 100644
+index 74347bd75b380..5ef888a1d53f4 100644
 --- a/fs/aufs/loop.c
 +++ b/fs/aufs/loop.c
 @@ -133,3 +133,19 @@ void au_loopback_fin(void)
@@ -39346,7 +39328,7 @@ index a8b63acc62045..9d97c3af5686a 100644
 +      return f;
 +}
 diff --git a/fs/aufs/loop.h b/fs/aufs/loop.h
-index 94f4f80ae33bf..ca1194354aff4 100644
+index 7293bee427f96..3345c098d0d47 100644
 --- a/fs/aufs/loop.h
 +++ b/fs/aufs/loop.h
 @@ -26,6 +26,8 @@ void au_warn_loopback(struct super_block *h_sb);
@@ -39368,7 +39350,7 @@ index 94f4f80ae33bf..ca1194354aff4 100644
  
  #endif /* __KERNEL__ */
 diff --git a/fs/aufs/super.c b/fs/aufs/super.c
-index d252963a87b53..ecfc5fc96ad8c 100644
+index cfa90537d9d38..028ee1ceeed1a 100644
 --- a/fs/aufs/super.c
 +++ b/fs/aufs/super.c
 @@ -844,7 +844,10 @@ static const struct super_operations aufs_sop = {
@@ -39384,10 +39366,10 @@ index d252963a87b53..ecfc5fc96ad8c 100644
  
  /* ---------------------------------------------------------------------- */
 diff --git a/include/linux/fs.h b/include/linux/fs.h
-index 93eb43e002d97..8b392f6b36a62 100644
+index 02ce64c28ef15..eed5ad4a414ac 100644
 --- a/include/linux/fs.h
 +++ b/include/linux/fs.h
-@@ -2178,6 +2178,10 @@ struct super_operations {
+@@ -2225,6 +2225,10 @@ struct super_operations {
                                  struct shrink_control *);
        long (*free_cached_objects)(struct super_block *,
                                    struct shrink_control *);
This page took 0.223292 seconds and 4 git commands to generate.