SPDX-License-Identifier: GPL-2.0
-aufs6.5 kbuild patch
+aufs6.x-rcN kbuild patch
diff --git a/fs/Kconfig b/fs/Kconfig
-index 18d034ec7953..3159bcb16918 100644
+index 89fdbefd1075..0038eb501478 100644
--- a/fs/Kconfig
+++ b/fs/Kconfig
-@@ -316,6 +316,7 @@ source "fs/sysv/Kconfig"
+@@ -338,6 +338,7 @@ source "fs/sysv/Kconfig"
source "fs/ufs/Kconfig"
source "fs/erofs/Kconfig"
source "fs/vboxsf/Kconfig"
endif # MISC_FILESYSTEMS
diff --git a/fs/Makefile b/fs/Makefile
-index e513aaee0603..acdea5771285 100644
+index c09016257f05..3899fae66d3f 100644
--- a/fs/Makefile
+++ b/fs/Makefile
-@@ -129,3 +129,4 @@ obj-$(CONFIG_EFIVAR_FS) += efivarfs/
+@@ -130,3 +130,4 @@ obj-$(CONFIG_EFIVAR_FS) += efivarfs/
obj-$(CONFIG_EROFS_FS) += erofs/
obj-$(CONFIG_VBOXSF_FS) += vboxsf/
obj-$(CONFIG_ZONEFS_FS) += zonefs/
+obj-$(CONFIG_AUFS_FS) += aufs/
SPDX-License-Identifier: GPL-2.0
-aufs6.5 base patch
+aufs6.x-rcN base patch
diff --git a/MAINTAINERS b/MAINTAINERS
-index 4cc6bf79fdd8..5578e44ad7e2 100644
+index 9ed4d3868539..c0f45969bcf8 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
-@@ -3310,6 +3310,19 @@ F: include/uapi/linux/audit.h
- F: kernel/audit*
+@@ -3365,6 +3365,19 @@ F: kernel/audit*
F: lib/*audit.c
+ K: \baudit_[a-z_0-9]\+\b
+AUFS (advanced multi layered unification filesystem) FILESYSTEM
+M: "J. R. Okajima" <hooanon05g@gmail.com>
M: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
R: Dave Ertman <david.m.ertman@intel.com>
diff --git a/drivers/block/loop.c b/drivers/block/loop.c
-index 637c5bda2387..cbefd23beb44 100644
+index f8145499da38..333b3915fe86 100644
--- a/drivers/block/loop.c
+++ b/drivers/block/loop.c
-@@ -645,6 +645,24 @@ static int loop_change_fd(struct loop_device *lo, struct block_device *bdev,
+@@ -641,6 +641,24 @@ static int loop_change_fd(struct loop_device *lo, struct block_device *bdev,
goto done;
}
static ssize_t loop_attr_show(struct device *dev, char *page,
diff --git a/fs/dcache.c b/fs/dcache.c
-index 52e6d5fdab6b..519321f32f95 100644
+index b813528fb147..78e322b59b8d 100644
--- a/fs/dcache.c
+++ b/fs/dcache.c
-@@ -1345,7 +1345,7 @@ enum d_walk_ret {
+@@ -1219,7 +1219,7 @@ enum d_walk_ret {
*
* The @enter() callbacks are called with d_lock held.
*/
+void d_walk(struct dentry *parent, void *data,
enum d_walk_ret (*enter)(void *, struct dentry *))
{
- struct dentry *this_parent;
+ struct dentry *this_parent, *dentry;
diff --git a/fs/fcntl.c b/fs/fcntl.c
-index b622be119706..9ea58b7bb580 100644
+index c80a6acad742..96a562b48ec7 100644
--- a/fs/fcntl.c
+++ b/fs/fcntl.c
@@ -34,7 +34,7 @@
#define SETFL_MASK (O_APPEND | O_NONBLOCK | O_NDELAY | O_DIRECT | O_NOATIME)
--static int setfl(int fd, struct file * filp, unsigned long arg)
-+int setfl(int fd, struct file *filp, unsigned long arg)
+-static int setfl(int fd, struct file * filp, unsigned int arg)
++int setfl(int fd, struct file * filp, unsigned int arg)
{
struct inode * inode = file_inode(filp);
int error = 0;
-@@ -64,6 +64,8 @@ static int setfl(int fd, struct file * filp, unsigned long arg)
+@@ -64,6 +64,8 @@ static int setfl(int fd, struct file * filp, unsigned int arg)
if (filp->f_op->check_flags)
error = filp->f_op->check_flags(arg);
return error;
diff --git a/fs/namespace.c b/fs/namespace.c
-index e157efc54023..6c57487f126b 100644
+index 5a51315c6678..a4b6ce51848e 100644
--- a/fs/namespace.c
+++ b/fs/namespace.c
-@@ -872,6 +872,12 @@ static inline int check_mnt(struct mount *mnt)
+@@ -860,6 +860,12 @@ static inline int check_mnt(struct mount *mnt)
return mnt->mnt_ns == current->nsproxy->mnt_ns;
}
* vfsmount lock must be held for write
*/
diff --git a/fs/splice.c b/fs/splice.c
-index 3e2a31e1ce6a..a724fe9ccb80 100644
+index 218e24b1ac40..7210ddc5aa81 100644
--- a/fs/splice.c
+++ b/fs/splice.c
-@@ -928,8 +928,8 @@ static int warn_unsupported(struct file *file, const char *op)
+@@ -933,7 +933,7 @@ static int warn_unsupported(struct file *file, const char *op)
/*
* Attempt to initiate a splice from pipe to file.
*/
--static long do_splice_from(struct pipe_inode_info *pipe, struct file *out,
-- loff_t *ppos, size_t len, unsigned int flags)
-+long do_splice_from(struct pipe_inode_info *pipe, struct file *out,
-+ loff_t *ppos, size_t len, unsigned int flags)
+-static ssize_t do_splice_from(struct pipe_inode_info *pipe, struct file *out,
++ssize_t do_splice_from(struct pipe_inode_info *pipe, struct file *out,
+ loff_t *ppos, size_t len, unsigned int flags)
{
if (unlikely(!out->f_op->splice_write))
- return warn_unsupported(out, "write");
diff --git a/include/linux/fs.h b/include/linux/fs.h
-index 562f2623c9c9..5a2db7b8eca5 100644
+index 023f37c60709..96ca249ee1e6 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
-@@ -1068,6 +1068,7 @@ extern void fasync_free(struct fasync_struct *);
+@@ -1104,6 +1104,7 @@ extern void fasync_free(struct fasync_struct *);
/* can be called from interrupts */
extern void kill_fasync(struct fasync_struct **, int, int);
-+extern int setfl(int fd, struct file *filp, unsigned long arg);
++extern int setfl(int fd, struct file *filp, unsigned int arg);
extern void __f_setown(struct file *filp, struct pid *, enum pid_type, int force);
- extern int f_setown(struct file *filp, unsigned long arg, int force);
+ extern int f_setown(struct file *filp, int who, int force);
extern void f_delown(struct file *filp);
-@@ -1794,6 +1795,7 @@ struct file_operations {
+@@ -2001,6 +2002,7 @@ struct file_operations {
int (*lock) (struct file *, int, struct file_lock *);
unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long);
int (*check_flags)(int);
ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, loff_t *, size_t, unsigned int);
ssize_t (*splice_read)(struct file *, loff_t *, struct pipe_inode_info *, size_t, unsigned int);
diff --git a/include/linux/lockdep.h b/include/linux/lockdep.h
-index 310f85903c91..46ff52c1a522 100644
+index 08b0d1d9d78b..009f69c4e09d 100644
--- a/include/linux/lockdep.h
+++ b/include/linux/lockdep.h
-@@ -249,6 +249,8 @@ static inline int lockdep_match_key(struct lockdep_map *lock,
+@@ -192,6 +192,8 @@ static inline int lockdep_match_key(struct lockdep_map *lock,
return lock->key == key;
}
extern const struct file_operations proc_mountinfo_operations;
extern const struct file_operations proc_mountstats_operations;
diff --git a/include/linux/splice.h b/include/linux/splice.h
-index 6c461573434d..7416cf375ad1 100644
+index 9dec4861d09f..14583d846864 100644
--- a/include/linux/splice.h
+++ b/include/linux/splice.h
-@@ -99,4 +99,10 @@ extern void splice_shrink_spd(struct splice_pipe_desc *);
+@@ -108,4 +108,7 @@ extern void splice_shrink_spd(struct splice_pipe_desc *);
extern const struct pipe_buf_operations page_cache_pipe_buf_ops;
extern const struct pipe_buf_operations default_pipe_buf_ops;
+
-+extern long do_splice_from(struct pipe_inode_info *pipe, struct file *out,
-+ loff_t *ppos, size_t len, unsigned int flags);
-+extern long do_splice_to(struct file *in, loff_t *ppos,
-+ struct pipe_inode_info *pipe, size_t len,
-+ unsigned int flags);
++extern ssize_t do_splice_from(struct pipe_inode_info *pipe, struct file *out,
++ loff_t *ppos, size_t len, unsigned int flags);
#endif
diff --git a/kernel/locking/lockdep.c b/kernel/locking/lockdep.c
-index 111607d91489..22af30abc781 100644
+index 151bd3de5936..2223ee909c10 100644
--- a/kernel/locking/lockdep.c
+++ b/kernel/locking/lockdep.c
@@ -218,7 +218,7 @@ unsigned long max_lock_class_idx;
#ifdef CONFIG_LOCK_STAT
static DEFINE_PER_CPU(struct lock_class_stats[MAX_LOCKDEP_KEYS], cpu_lock_stats);
SPDX-License-Identifier: GPL-2.0
-aufs6.5 mmap patch
+aufs6.x-rcN mmap patch
diff --git a/fs/proc/base.c b/fs/proc/base.c
-index 9df3f4839662..102a56aebeef 100644
+index 98a031ac2648..a7a2ff2a7f61 100644
--- a/fs/proc/base.c
+++ b/fs/proc/base.c
-@@ -2218,7 +2218,7 @@ static int map_files_get_link(struct dentry *dentry, struct path *path)
+@@ -2215,7 +2215,7 @@ static int map_files_get_link(struct dentry *dentry, struct path *path)
rc = -ENOENT;
vma = find_exact_vma(mm, vm_start, vm_end);
if (vma && vma->vm_file) {
-- *path = vma->vm_file->f_path;
+- *path = *file_user_path(vma->vm_file);
+ *path = vma_pr_or_file(vma)->f_path;
path_get(path);
rc = 0;
}
diff --git a/fs/proc/nommu.c b/fs/proc/nommu.c
-index 4d3493579458..42edd9a42c78 100644
+index c6e7ebc63756..d7ccfd909764 100644
--- a/fs/proc/nommu.c
+++ b/fs/proc/nommu.c
@@ -39,7 +39,10 @@ static int nommu_region_show(struct seq_file *m, struct vm_region *region)
ino = inode->i_ino;
}
diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c
-index fafff1bd34cd..4387f43addcd 100644
+index 3f78ebbb795f..f96ec77db39e 100644
--- a/fs/proc/task_mmu.c
+++ b/fs/proc/task_mmu.c
-@@ -285,7 +285,10 @@ show_map_vma(struct seq_file *m, struct vm_area_struct *vma)
+@@ -273,7 +273,8 @@ show_map_vma(struct seq_file *m, struct vm_area_struct *vma)
const char *name = NULL;
if (file) {
-- struct inode *inode = file_inode(vma->vm_file);
-+ struct inode *inode;
-+
-+ file = vma_pr_or_file(vma);
-+ inode = file_inode(file);
+- const struct inode *inode = file_user_inode(vma->vm_file);
++ const struct inode *inode
++ = file_inode(file = vma_pr_or_file(vma));
+
dev = inode->i_sb->s_dev;
ino = inode->i_ino;
- pgoff = ((loff_t)vma->vm_pgoff) << PAGE_SHIFT;
-@@ -1950,7 +1953,7 @@ static int show_numa_map(struct seq_file *m, void *v)
+@@ -2701,7 +2702,7 @@ static int show_numa_map(struct seq_file *m, void *v)
struct proc_maps_private *proc_priv = &numa_priv->proc_maps;
struct vm_area_struct *vma = v;
struct numa_maps *md = &numa_priv->md;
- struct file *file = vma->vm_file;
+ struct file *file = vma_pr_or_file(vma);
struct mm_struct *mm = vma->vm_mm;
- struct mempolicy *pol;
char buffer[64];
+ struct mempolicy *pol;
diff --git a/fs/proc/task_nommu.c b/fs/proc/task_nommu.c
-index 2c8b62265981..9f65138246a8 100644
+index bce674533000..b12b5a75c799 100644
--- a/fs/proc/task_nommu.c
+++ b/fs/proc/task_nommu.c
-@@ -150,7 +150,10 @@ static int nommu_vma_show(struct seq_file *m, struct vm_area_struct *vma)
+@@ -137,7 +137,10 @@ static int nommu_vma_show(struct seq_file *m, struct vm_area_struct *vma)
file = vma->vm_file;
if (file) {
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 34f9dba17c1a..0f01f02a3112 100644
+index f5a97dec5169..a5b0edc8e290 100644
--- a/include/linux/mm.h
+++ b/include/linux/mm.h
-@@ -2387,6 +2387,43 @@ static inline void unmap_shared_mapping_range(struct address_space *mapping,
+@@ -2432,6 +2432,43 @@ static inline void unmap_shared_mapping_range(struct address_space *mapping,
static inline struct vm_area_struct *vma_lookup(struct mm_struct *mm,
unsigned long addr);
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 7d30dc4ff0ff..5a712268b2d7 100644
+index 8b611e13153e..838af328941a 100644
--- a/include/linux/mm_types.h
+++ b/include/linux/mm_types.h
-@@ -449,6 +449,9 @@ struct vm_region {
+@@ -527,6 +527,9 @@ struct vm_region {
unsigned long vm_top; /* region allocated to here */
unsigned long vm_pgoff; /* the offset in vm_file corresponding to vm_start */
struct file *vm_file; /* the backing file or NULL */
int vm_usage; /* region usage count (access under nommu_region_sem) */
bool vm_icache_flushed : 1; /* true if the icache has been flushed for
-@@ -562,6 +565,9 @@ struct vm_area_struct {
+@@ -691,6 +694,9 @@ struct vm_area_struct {
unsigned long vm_pgoff; /* Offset (within vm_file) in PAGE_SIZE
units */
struct file * vm_file; /* File we map to (can be NULL). */
#ifdef CONFIG_ANON_VMA_NAME
diff --git a/kernel/fork.c b/kernel/fork.c
-index d2e12b6d2b18..39da83472c1d 100644
+index 0d944e92a43f..bc073aaca2dc 100644
--- a/kernel/fork.c
+++ b/kernel/fork.c
-@@ -731,7 +731,7 @@ static __latent_entropy int dup_mmap(struct mm_struct *mm,
+@@ -716,7 +716,7 @@ static __latent_entropy int dup_mmap(struct mm_struct *mm,
if (file) {
struct address_space *mapping = file->f_mapping;
- get_file(file);
+ vma_get_file(tmp);
i_mmap_lock_write(mapping);
- if (tmp->vm_flags & VM_SHARED)
+ if (vma_is_shared_maywrite(tmp))
mapping_allow_writable(mapping);
diff --git a/mm/Makefile b/mm/Makefile
-index 678530a07326..ce3cbfef4a61 100644
+index e4b5b75aaec9..2ec2544009fb 100644
--- a/mm/Makefile
+++ b/mm/Makefile
-@@ -139,3 +139,4 @@ obj-$(CONFIG_IO_MAPPING) += io-mapping.o
+@@ -134,3 +134,4 @@ obj-$(CONFIG_IO_MAPPING) += io-mapping.o
obj-$(CONFIG_HAVE_BOOTMEM_INFO_NODE) += bootmem_info.o
obj-$(CONFIG_GENERIC_IOREMAP) += ioremap.o
obj-$(CONFIG_SHRINKER_DEBUG) += shrinker_debug.o
+obj-y += prfile.o
diff --git a/mm/filemap.c b/mm/filemap.c
-index 9e44a49bbd74..334425b2903b 100644
+index 750e779c23db..b84a752ff676 100644
--- a/mm/filemap.c
+++ b/mm/filemap.c
-@@ -3580,7 +3580,7 @@ vm_fault_t filemap_page_mkwrite(struct vm_fault *vmf)
+@@ -3587,7 +3587,7 @@ vm_fault_t filemap_page_mkwrite(struct vm_fault *vmf)
vm_fault_t ret = VM_FAULT_LOCKED;
sb_start_pagefault(mapping->host->i_sb);
if (folio->mapping != mapping) {
folio_unlock(folio);
diff --git a/mm/mmap.c b/mm/mmap.c
-index 3937479d0e07..db30d8a8cea3 100644
+index d89770eaab6b..6bfba84b5ff0 100644
--- a/mm/mmap.c
+++ b/mm/mmap.c
@@ -140,7 +140,7 @@ static void remove_vma(struct vm_area_struct *vma, bool unreachable)
mpol_put(vma_policy(vma));
if (unreachable)
__vm_area_free(vma);
-@@ -575,7 +575,7 @@ static inline void vma_complete(struct vma_prepare *vp,
+@@ -554,7 +554,7 @@ static inline void vma_complete(struct vma_prepare *vp,
if (vp->file) {
uprobe_munmap(vp->remove, vp->remove->vm_start,
vp->remove->vm_end);
}
if (vp->remove->anon_vma)
anon_vma_merge(vp->vma, vp->remove);
-@@ -2365,7 +2365,7 @@ int __split_vma(struct vma_iterator *vmi, struct vm_area_struct *vma,
+@@ -2357,7 +2357,7 @@ static int __split_vma(struct vma_iterator *vmi, struct vm_area_struct *vma,
goto out_free_mpol;
if (new->vm_file)
if (new->vm_ops && new->vm_ops->open)
new->vm_ops->open(new);
-@@ -2778,7 +2778,7 @@ unsigned long mmap_region(struct file *file, unsigned long addr,
+@@ -2855,7 +2855,7 @@ unsigned long mmap_region(struct file *file, unsigned long addr,
* and cause general protection fault
* ultimately.
*/
vm_area_free(vma);
vma = merge;
/* Update vm_flags to pick up the change. */
-@@ -2875,7 +2875,7 @@ unsigned long mmap_region(struct file *file, unsigned long addr,
+@@ -2950,7 +2950,7 @@ unsigned long mmap_region(struct file *file, unsigned long addr,
if (file || vma->vm_file) {
unmap_and_free_vma:
+ vma_fput(vma);
vma->vm_file = NULL;
- /* Undo any partial mapping done by a device driver. */
-@@ -2936,6 +2936,9 @@ SYSCALL_DEFINE5(remap_file_pages, unsigned long, start, unsigned long, size,
+ vma_iter_set(&vmi, vma->vm_end);
+@@ -3012,6 +3012,9 @@ SYSCALL_DEFINE5(remap_file_pages, unsigned long, start, unsigned long, size,
unsigned long populate = 0;
unsigned long ret = -EINVAL;
struct file *file;
pr_warn_once("%s (%d) uses deprecated remap_file_pages() syscall. See Documentation/mm/remap_file_pages.rst.\n",
current->comm, current->pid);
-@@ -2994,10 +2997,34 @@ SYSCALL_DEFINE5(remap_file_pages, unsigned long, start, unsigned long, size,
+@@ -3070,10 +3073,34 @@ SYSCALL_DEFINE5(remap_file_pages, unsigned long, start, unsigned long, size,
if (vma->vm_flags & VM_LOCKED)
flags |= MAP_LOCKED;
+ file = vma->vm_file;
+ prfile = vma->vm_prfile;
+ ret = do_mmap(vma->vm_file, start, size,
-+ prot, flags, pgoff, &populate, NULL);
++ prot, flags, /*vm_flags*/0, pgoff, &populate, NULL);
+ if (!IS_ERR_VALUE(ret) && file && prfile) {
+ struct vm_area_struct *new_vma;
+
+#else
file = get_file(vma->vm_file);
ret = do_mmap(vma->vm_file, start, size,
- prot, flags, pgoff, &populate, NULL);
+ prot, flags, 0, pgoff, &populate, NULL);
fput(file);
+#endif /* CONFIG_AUFS_FS */
out:
mmap_write_unlock(mm);
if (populate)
-@@ -3342,7 +3369,7 @@ struct vm_area_struct *copy_vma(struct vm_area_struct **vmap,
+@@ -3420,7 +3447,7 @@ struct vm_area_struct *copy_vma(struct vm_area_struct **vmap,
if (anon_vma_clone(new_vma, vma))
goto out_free_mempol;
if (new_vma->vm_file)
+ vma_get_file(new_vma);
if (new_vma->vm_ops && new_vma->vm_ops->open)
new_vma->vm_ops->open(new_vma);
- vma_start_write(new_vma);
-@@ -3358,7 +3385,7 @@ struct vm_area_struct *copy_vma(struct vm_area_struct **vmap,
+ if (vma_link(mm, new_vma))
+@@ -3434,7 +3461,7 @@ struct vm_area_struct *copy_vma(struct vm_area_struct **vmap,
new_vma->vm_ops->close(new_vma);
if (new_vma->vm_file)
unlink_anon_vmas(new_vma);
out_free_mempol:
diff --git a/mm/nommu.c b/mm/nommu.c
-index c072a660ec2c..62e67267f79d 100644
+index b6dc558d3144..d96655486468 100644
--- a/mm/nommu.c
+++ b/mm/nommu.c
@@ -523,7 +523,7 @@ static void __put_nommu_region(struct vm_region *region)
/* IO memory and memory shared directly out of the pagecache
* from ramfs/tmpfs mustn't be released here */
-@@ -602,7 +602,7 @@ static void delete_vma(struct mm_struct *mm, struct vm_area_struct *vma)
+@@ -603,7 +603,7 @@ static void delete_vma(struct mm_struct *mm, struct vm_area_struct *vma)
if (vma->vm_ops && vma->vm_ops->close)
vma->vm_ops->close(vma);
if (vma->vm_file)
put_nommu_region(vma->vm_region);
vm_area_free(vma);
}
-@@ -1137,7 +1137,7 @@ unsigned long do_mmap(struct file *file,
+@@ -1135,7 +1135,7 @@ unsigned long do_mmap(struct file *file,
goto error_just_free;
}
}
kmem_cache_free(vm_region_jar, region);
region = pregion;
result = start;
-@@ -1219,10 +1219,10 @@ unsigned long do_mmap(struct file *file,
+@@ -1221,10 +1221,10 @@ unsigned long do_mmap(struct file *file,
error:
vma_iter_free(&vmi);
if (region->vm_file)
+}
+#endif /* !CONFIG_MMU */
SPDX-License-Identifier: GPL-2.0
-aufs6.5 standalone patch
+aufs6.x-rcN standalone patch
diff --git a/fs/dcache.c b/fs/dcache.c
-index 519321f32f95..267e0c65914a 100644
+index 78e322b59b8d..7d8fbe5b7ce5 100644
--- a/fs/dcache.c
+++ b/fs/dcache.c
-@@ -1450,6 +1450,7 @@ void d_walk(struct dentry *parent, void *data,
+@@ -1318,6 +1318,7 @@ void d_walk(struct dentry *parent, void *data,
seq = 1;
goto again;
}
struct check_mount {
struct vfsmount *mnt;
-@@ -3052,6 +3053,7 @@ void d_exchange(struct dentry *dentry1, struct dentry *dentry2)
+@@ -2880,6 +2881,7 @@ void d_exchange(struct dentry *dentry1, struct dentry *dentry2)
write_sequnlock(&rename_lock);
}
/**
* d_ancestor - search for an ancestor
diff --git a/fs/exec.c b/fs/exec.c
-index 1a827d55ba94..d7b12f1e7af2 100644
+index af4fbb61cd53..aa5161ad2c1f 100644
--- a/fs/exec.c
+++ b/fs/exec.c
-@@ -112,6 +112,7 @@ bool path_noexec(const struct path *path)
+@@ -113,6 +113,7 @@ bool path_noexec(const struct path *path)
return (path->mnt->mnt_flags & MNT_NOEXEC) ||
(path->mnt->mnt_sb->s_iflags & SB_I_NOEXEC);
}
#ifdef CONFIG_USELIB
/*
diff --git a/fs/fcntl.c b/fs/fcntl.c
-index 9ea58b7bb580..99fef189bcd6 100644
+index 96a562b48ec7..e21a0fcff538 100644
--- a/fs/fcntl.c
+++ b/fs/fcntl.c
-@@ -87,6 +87,7 @@ int setfl(int fd, struct file *filp, unsigned long arg)
+@@ -87,6 +87,7 @@ int setfl(int fd, struct file * filp, unsigned int arg)
out:
return error;
}
static void f_modown(struct file *filp, struct pid *pid, enum pid_type type,
int force)
diff --git a/fs/file_table.c b/fs/file_table.c
-index fc7d677ff5ad..a2fbedb58c0a 100644
+index b991f90571b4..a3ba5726194a 100644
--- a/fs/file_table.c
+++ b/fs/file_table.c
-@@ -225,6 +225,7 @@ struct file *alloc_empty_file(int flags, const struct cred *cred)
+@@ -222,6 +222,7 @@ struct file *alloc_empty_file(int flags, const struct cred *cred)
}
return ERR_PTR(-ENFILE);
}
/*
* Variant of alloc_empty_file() that doesn't check and modify nr_files.
diff --git a/fs/namespace.c b/fs/namespace.c
-index 6c57487f126b..16be9ac1c734 100644
+index a4b6ce51848e..c7415f75ab4c 100644
--- a/fs/namespace.c
+++ b/fs/namespace.c
-@@ -466,6 +466,7 @@ void __mnt_drop_write(struct vfsmount *mnt)
- mnt_dec_writers(real_mount(mnt));
- preempt_enable();
- }
-+EXPORT_SYMBOL_GPL(__mnt_drop_write);
-
- /**
- * mnt_drop_write - give up write access to a mount
-@@ -877,6 +878,7 @@ int is_current_mnt_ns(struct vfsmount *mnt)
+@@ -865,6 +865,7 @@ int is_current_mnt_ns(struct vfsmount *mnt)
{
return check_mnt(real_mount(mnt));
}
/*
* vfsmount lock must be held for write
-@@ -2152,6 +2154,7 @@ int iterate_mounts(int (*f)(struct vfsmount *, void *), void *arg,
+@@ -2053,6 +2054,7 @@ struct vfsmount *collect_mounts(const struct path *path)
+ return ERR_CAST(tree);
+ return &tree->mnt;
+ }
++EXPORT_SYMBOL_GPL(collect_mounts);
+
+ static void free_mnt_ns(struct mnt_namespace *);
+ static struct mnt_namespace *alloc_mnt_ns(struct user_namespace *, bool);
+@@ -2083,6 +2085,7 @@ void drop_collected_mounts(struct vfsmount *mnt)
+ unlock_mount_hash();
+ namespace_unlock();
+ }
++EXPORT_SYMBOL_GPL(drop_collected_mounts);
+
+ static bool has_locked_children(struct mount *mnt, struct dentry *dentry)
+ {
+@@ -2154,6 +2157,7 @@ int iterate_mounts(int (*f)(struct vfsmount *, void *), void *arg,
}
return 0;
}
/*
* Drop a reference to a group. Free it if it's through.
diff --git a/fs/open.c b/fs/open.c
-index e6ead0f19964..1f4deda436ec 100644
+index a84d21e55c39..35183a95dafd 100644
--- a/fs/open.c
+++ b/fs/open.c
@@ -67,6 +67,7 @@ int do_truncate(struct mnt_idmap *idmap, struct dentry *dentry,
long vfs_truncate(const struct path *path, loff_t length)
{
diff --git a/fs/read_write.c b/fs/read_write.c
-index b07de77ef126..e07fadb4afe2 100644
+index d4c036e82b6c..c61361ff5e67 100644
--- a/fs/read_write.c
+++ b/fs/read_write.c
-@@ -477,6 +477,7 @@ ssize_t vfs_read(struct file *file, char __user *buf, size_t count, loff_t *pos)
+@@ -483,6 +483,7 @@ ssize_t vfs_read(struct file *file, char __user *buf, size_t count, loff_t *pos)
inc_syscr(current);
return ret;
}
static ssize_t new_sync_write(struct file *filp, const char __user *buf, size_t len, loff_t *ppos)
{
-@@ -592,6 +593,7 @@ ssize_t vfs_write(struct file *file, const char __user *buf, size_t count, loff_
+@@ -598,6 +599,7 @@ ssize_t vfs_write(struct file *file, const char __user *buf, size_t count, loff_
file_end_write(file);
return ret;
}
/* file_ppos returns &file->f_pos or NULL if file is stream */
static inline loff_t *file_ppos(struct file *file)
diff --git a/fs/splice.c b/fs/splice.c
-index a724fe9ccb80..ebb2c4ceb598 100644
+index 7210ddc5aa81..9e83f46eacc8 100644
--- a/fs/splice.c
+++ b/fs/splice.c
-@@ -935,6 +935,7 @@ long do_splice_from(struct pipe_inode_info *pipe, struct file *out,
+@@ -940,6 +940,7 @@ ssize_t do_splice_from(struct pipe_inode_info *pipe, struct file *out,
return warn_unsupported(out, "write");
return out->f_op->splice_write(pipe, out, ppos, len, flags);
}
/*
* Indicate to the caller that there was a premature EOF when reading from the
diff --git a/fs/xattr.c b/fs/xattr.c
-index e7bbb7f57557..edb0190da4d5 100644
+index 09d927603433..890daee95a7b 100644
--- a/fs/xattr.c
+++ b/fs/xattr.c
@@ -406,6 +406,7 @@ vfs_getxattr_alloc(struct mnt_idmap *idmap, struct dentry *dentry,
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 22af30abc781..eaf4e02bcb4d 100644
+index 2223ee909c10..d0ac4fc69a31 100644
--- a/kernel/locking/lockdep.c
+++ b/kernel/locking/lockdep.c
@@ -239,6 +239,7 @@ inline struct lock_class *lockdep_hlock_class(struct held_lock *hlock)
#ifdef CONFIG_LOCK_STAT
diff --git a/kernel/task_work.c b/kernel/task_work.c
-index 065e1ef8fc8d..c623c6f0c645 100644
+index 95a7e1b7f1da..5053670775d3 100644
--- a/kernel/task_work.c
+++ b/kernel/task_work.c
-@@ -182,3 +182,4 @@ void task_work_run(void)
+@@ -183,3 +183,4 @@ void task_work_run(void)
} while (work);
}
}
+EXPORT_SYMBOL_GPL(task_work_run);
diff --git a/security/security.c b/security/security.c
-index b720424ca37d..635ee0582e05 100644
+index 7035ee35a393..eb461a68073f 100644
--- a/security/security.c
+++ b/security/security.c
-@@ -1711,6 +1711,7 @@ int security_path_rmdir(const struct path *dir, struct dentry *dentry)
+@@ -1835,6 +1835,7 @@ int security_path_rmdir(const struct path *dir, struct dentry *dentry)
return 0;
return call_int_hook(path_rmdir, 0, dir, dentry);
}
/**
* security_path_unlink() - Check if removing a hard link is allowed
-@@ -1746,6 +1747,7 @@ int security_path_symlink(const struct path *dir, struct dentry *dentry,
+@@ -1870,6 +1871,7 @@ int security_path_symlink(const struct path *dir, struct dentry *dentry,
return 0;
return call_int_hook(path_symlink, 0, dir, dentry, old_name);
}
/**
* security_path_link - Check if creating a hard link is allowed
-@@ -1764,6 +1766,7 @@ int security_path_link(struct dentry *old_dentry, const struct path *new_dir,
+@@ -1888,6 +1890,7 @@ int security_path_link(struct dentry *old_dentry, const struct path *new_dir,
return 0;
return call_int_hook(path_link, 0, old_dentry, new_dir, new_dentry);
}
/**
* security_path_rename() - Check if renaming a file is allowed
-@@ -1825,6 +1828,7 @@ int security_path_chmod(const struct path *path, umode_t mode)
+@@ -1949,6 +1952,7 @@ int security_path_chmod(const struct path *path, umode_t mode)
return 0;
return call_int_hook(path_chmod, 0, path, mode);
}
/**
* security_path_chown() - Check if changing the file's owner/group is allowed
-@@ -1842,6 +1846,7 @@ int security_path_chown(const struct path *path, kuid_t uid, kgid_t gid)
+@@ -1966,6 +1970,7 @@ int security_path_chown(const struct path *path, kuid_t uid, kgid_t gid)
return 0;
return call_int_hook(path_chown, 0, path, uid, gid);
}
/**
* security_path_chroot() - Check if changing the root directory is allowed
-@@ -2071,6 +2076,7 @@ int security_inode_permission(struct inode *inode, int mask)
+@@ -2195,6 +2200,7 @@ int security_inode_permission(struct inode *inode, int mask)
return 0;
return call_int_hook(inode_permission, 0, inode, mask);
}
/**
* security_inode_setattr() - Check if setting file attributes is allowed
-@@ -2549,6 +2555,7 @@ int security_file_permission(struct file *file, int mask)
-
- return fsnotify_perm(file, mask);
+@@ -2667,6 +2673,7 @@ int security_file_permission(struct file *file, int mask)
+ {
+ return call_int_hook(file_permission, 0, file, mask);
}
+EXPORT_SYMBOL_GPL(security_file_permission);
/**
* security_file_alloc() - Allocate and init a file's LSM blob
-@@ -2815,6 +2822,7 @@ int security_file_truncate(struct file *file)
+@@ -2951,6 +2958,7 @@ int security_file_truncate(struct file *file)
{
return call_int_hook(file_truncate, 0, file);
}
+#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 2022-11-05 23:02:18.959222617 +0100
++++ linux/fs/aufs/branch.c 2024-03-10 23:40:47.083143450 +0100
@@ -0,0 +1,1427 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ if (hf->f_mode & FMODE_READ)
+ i_readcount_inc(h_inode);
+ put_write_access(h_inode);
-+ __mnt_drop_write(hf->f_path.mnt);
++ mnt_put_write_access(hf->f_path.mnt);
+ }
+ }
+
+}
diff -urN /usr/share/empty/fs/aufs/branch.h linux/fs/aufs/branch.h
--- /usr/share/empty/fs/aufs/branch.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/branch.h 2023-09-03 02:21:58.856637674 +0200
++++ linux/fs/aufs/branch.h 2023-10-31 09:31:04.196547417 +0100
@@ -0,0 +1,375 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+-include ${srctree}/${src}/conf_priv.mk
diff -urN /usr/share/empty/fs/aufs/cpup.c linux/fs/aufs/cpup.c
--- /usr/share/empty/fs/aufs/cpup.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/cpup.c 2023-09-03 02:21:58.859971007 +0200
++++ linux/fs/aufs/cpup.c 2024-03-10 23:40:47.083143450 +0100
@@ -0,0 +1,1459 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ dt->dt_dentry = dentry;
+ dt->dt_h_path = *h_path;
+ h_inode = d_inode(h_path->dentry);
-+ dt->dt_atime = h_inode->i_atime;
-+ dt->dt_mtime = h_inode->i_mtime;
++ dt->dt_atime = inode_get_atime(h_inode);
++ dt->dt_mtime = inode_get_mtime(h_inode);
+ /* smp_mb(); */
+}
+
+ } else {
+ ia.ia_uid = h_isrc->i_uid;
+ ia.ia_gid = h_isrc->i_gid;
-+ ia.ia_atime = h_isrc->i_atime;
-+ ia.ia_mtime = h_isrc->i_mtime;
++ ia.ia_atime = inode_get_atime(h_isrc);
++ ia.ia_mtime = inode_get_mtime(h_isrc);
+ if (h_idst->i_mode != h_isrc->i_mode
+ && !S_ISLNK(h_idst->i_mode)) {
+ ia.ia_valid |= ATTR_MODE;
+}
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 2022-11-05 23:02:18.962555950 +0100
++++ linux/fs/aufs/cpup.h 2024-03-10 23:40:47.083143450 +0100
@@ -0,0 +1,100 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+};
+
+/* cpup flags */
-+#define AuCpup_DTIME 1 /* do dtime_store/revert */
-+#define AuCpup_KEEPLINO (1 << 1) /* do not clear the lower xino,
++#define AuCpup_DTIME BIT(0) /* do dtime_store/revert */
++#define AuCpup_KEEPLINO BIT(1) /* do not clear the lower xino,
+ for link(2) */
-+#define AuCpup_RENAME (1 << 2) /* rename after cpup */
-+#define AuCpup_HOPEN (1 << 3) /* call h_open_pre/post() in
++#define AuCpup_RENAME BIT(2) /* rename after cpup */
++#define AuCpup_HOPEN BIT(3) /* call h_open_pre/post() in
+ cpup */
-+#define AuCpup_OVERWRITE (1 << 4) /* allow overwriting the
++#define AuCpup_OVERWRITE BIT(4) /* allow overwriting the
+ existing entry */
-+#define AuCpup_RWDST (1 << 5) /* force write target even if
++#define AuCpup_RWDST BIT(5) /* force write target even if
+ the branch is marked as RO */
+
+#ifndef CONFIG_AUFS_BR_HFSPLUS
+#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 2022-11-05 23:02:18.962555950 +0100
++++ linux/fs/aufs/dbgaufs.c 2023-10-10 22:51:18.033248030 +0200
@@ -0,0 +1,526 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ } else {
+#define str "1\n0\n0\n"
+ p->n = sizeof(str) - 1;
-+ strcpy(p->a, str);
++ strscpy(p->a, str, sizeof(str));
+#undef str
+ }
+ si_read_unlock(sb);
+#endif /* __AUFS_DCSUB_H__ */
diff -urN /usr/share/empty/fs/aufs/debug.c linux/fs/aufs/debug.c
--- /usr/share/empty/fs/aufs/debug.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/debug.c 2023-09-03 02:21:58.859971007 +0200
-@@ -0,0 +1,446 @@
++++ linux/fs/aufs/debug.c 2023-10-31 09:31:04.196547417 +0100
+@@ -0,0 +1,448 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2005-2022 Junjiro R. Okajima
+{
+ char *n = NULL;
+ int l = 0;
++ struct timespec64 ctime;
+
+ if (!inode || IS_ERR(inode)) {
+ dpri("i%d: err %ld\n", bindex, PTR_ERR(inode));
+ l = wh->d_name.len;
+ }
+
++ ctime = inode_get_ctime(inode);
+ dpri("i%d: %p, i%lu, %s, cnt %d, nl %u, 0%o, sz %llu, blk %llu,"
+ " acl %p, def_acl %p,"
+ " hn %d, ct %lld, np %lu, st 0x%lx, f 0x%x, v %llu, g %x%s%.*s\n",
+ atomic_read(&inode->i_count), inode->i_nlink, inode->i_mode,
+ i_size_read(inode), (unsigned long long)inode->i_blocks,
+ inode->i_acl, inode->i_default_acl,
-+ hn, (long long)timespec64_to_ns(&inode->i_ctime) & 0x0ffff,
++ hn, (long long)timespec64_to_ns(&ctime) & 0x0ffff,
+ inode->i_mapping ? inode->i_mapping->nrpages : 0,
+ inode->i_state, inode->i_flags, inode_peek_iversion(inode),
+ inode->i_generation,
+#endif /* __AUFS_DEBUG_H__ */
diff -urN /usr/share/empty/fs/aufs/dentry.c linux/fs/aufs/dentry.c
--- /usr/share/empty/fs/aufs/dentry.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/dentry.c 2023-09-03 02:21:58.859971007 +0200
++++ linux/fs/aufs/dentry.c 2023-10-31 09:31:04.196547417 +0100
@@ -0,0 +1,1168 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+};
diff -urN /usr/share/empty/fs/aufs/dentry.h linux/fs/aufs/dentry.h
--- /usr/share/empty/fs/aufs/dentry.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/dentry.h 2023-09-03 02:21:58.859971007 +0200
++++ linux/fs/aufs/dentry.h 2024-03-10 23:40:47.083143450 +0100
@@ -0,0 +1,270 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+/* ---------------------------------------------------------------------- */
+
+/* flags for au_lkup_dentry() */
-+#define AuLkup_ALLOW_NEG 1
-+#define AuLkup_IGNORE_PERM (1 << 1)
-+#define AuLkup_DIRREN (1 << 2)
++#define AuLkup_ALLOW_NEG BIT(0)
++#define AuLkup_IGNORE_PERM BIT(1)
++#define AuLkup_DIRREN BIT(2)
+#define au_ftest_lkup(flags, name) ((flags) & AuLkup_##name)
+#define au_fset_lkup(flags, name) \
+ do { (flags) |= AuLkup_##name; } while (0)
+}
diff -urN /usr/share/empty/fs/aufs/dir.c linux/fs/aufs/dir.c
--- /usr/share/empty/fs/aufs/dir.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/dir.c 2023-09-03 02:21:58.859971007 +0200
-@@ -0,0 +1,765 @@
++++ linux/fs/aufs/dir.c 2024-03-10 23:40:47.083143450 +0100
+@@ -0,0 +1,767 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2005-2022 Junjiro R. Okajima
+ struct au_dir_ts_arg *a = arg;
+ struct au_dtime dt;
+ struct path h_path;
++ struct timespec64 ts;
+ struct inode *dir, *h_dir;
+ struct super_block *sb;
+ struct au_branch *br;
+ hdir = au_hi(dir, btop);
+ au_hn_inode_lock_nested(hdir, AuLsc_I_PARENT);
+ h_dir = au_h_iptr(dir, btop);
++ ts = inode_get_mtime(h_dir);
+ if (h_dir->i_nlink
-+ && timespec64_compare(&h_dir->i_mtime, &dt.dt_mtime) < 0) {
++ && timespec64_compare(&ts, &dt.dt_mtime) < 0) {
+ dt.dt_h_path = h_path;
+ au_dtime_revert(&dt);
+ }
+
+/* ---------------------------------------------------------------------- */
+
-+#define AuTestEmpty_WHONLY 1
-+#define AuTestEmpty_CALLED (1 << 1)
-+#define AuTestEmpty_SHWH (1 << 2)
++#define AuTestEmpty_WHONLY BIT(0)
++#define AuTestEmpty_CALLED BIT(1)
++#define AuTestEmpty_SHWH BIT(2)
+#define au_ftest_testempty(flags, name) ((flags) & AuTestEmpty_##name)
+#define au_fset_testempty(flags, name) \
+ do { (flags) |= AuTestEmpty_##name; } while (0)
+#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 2022-11-05 23:02:18.962555950 +0100
++++ linux/fs/aufs/dirren.c 2023-10-10 22:51:18.033248030 +0200
@@ -0,0 +1,1315 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+
+ memset(w, 0, sizeof(*w));
+ w->allocated = roundup_pow_of_two(sizeof(*w->fdata) + 40);
-+ strcpy(w->whname, AUFS_WH_DR_INFO_PFX);
++ strscpy(w->whname, AUFS_WH_DR_INFO_PFX, sizeof(AUFS_WH_DR_INFO_PFX));
+ w->infoname = w->whname + sizeof(AUFS_WH_DR_INFO_PFX) - 1;
+ w->infonamelen = sizeof(w->whname) - sizeof(AUFS_WH_DR_INFO_PFX);
+ w->btgt = btgt;
+#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 2022-11-05 23:02:18.962555950 +0100
++++ linux/fs/aufs/dynop.c 2024-03-10 23:40:47.083143450 +0100
@@ -0,0 +1,366 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ DySetAop(launder_folio);
+ DySetAop(is_partially_uptodate);
+ DySetAop(is_dirty_writeback);
-+ DySetAop(error_remove_page);
++ DySetAop(error_remove_folio);
+ DySetAop(swap_activate);
+ DySetAop(swap_deactivate);
+ DySetAop(swap_rw);
+#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 2022-12-17 09:21:34.796521861 +0100
-@@ -0,0 +1,830 @@
++++ linux/fs/aufs/export.c 2024-03-10 23:40:47.083143450 +0100
+@@ -0,0 +1,846 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2005-2022 Junjiro R. Okajima
+{
+ int err;
+ struct path root;
++ struct vfsmount *mnt;
+ struct au_compare_mnt_args args = {
+ .sb = sb
+ };
+
+ get_fs_root(current->fs, &root);
++ /*
++ * as long as this sb is alive, this temporary unlock is safe.
++ * Really?
++ */
++ si_read_unlock(sb);
++ mnt = collect_mounts(&root);
++ if (IS_ERR(mnt)) {
++ args.mnt = mnt;
++ goto out;
++ }
++
+ rcu_read_lock();
-+ err = iterate_mounts(au_compare_mnt, &args, root.mnt);
++ err = iterate_mounts(au_compare_mnt, &args, mnt);
+ rcu_read_unlock();
-+ path_put(&root);
++ drop_collected_mounts(mnt);
+ AuDebugOn(!err);
++
++out:
++ si_noflush_read_lock(sb);
+ AuDebugOn(!args.mnt);
++ path_put(&root);
+ return args.mnt;
+}
+
+}
diff -urN /usr/share/empty/fs/aufs/file.c linux/fs/aufs/file.c
--- /usr/share/empty/fs/aufs/file.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/file.c 2023-09-04 13:39:55.763295607 +0200
++++ linux/fs/aufs/file.c 2024-03-10 23:40:47.083143450 +0100
@@ -0,0 +1,865 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+static void aufs_is_dirty_writeback(struct folio *folio, bool *dirty,
+ bool *writeback)
+{ AuUnsupport(); }
-+static int aufs_error_remove_page(struct address_space *mapping,
-+ struct page *page)
++static int aufs_error_remove_folio(struct address_space *mapping,
++ struct folio *folio)
+{ AuUnsupport(); return 0; }
+static int aufs_swap_activate(struct swap_info_struct *sis, struct file *file,
+ sector_t *span)
+ .launder_folio = aufs_launder_folio,
+ .is_partially_uptodate = aufs_is_partially_uptodate,
+ .is_dirty_writeback = aufs_is_dirty_writeback,
-+ .error_remove_page = aufs_error_remove_page,
++ .error_remove_folio = aufs_error_remove_folio,
+ .swap_activate = aufs_swap_activate,
+ .swap_deactivate = aufs_swap_deactivate,
+ .swap_rw = aufs_swap_rw
+}
diff -urN /usr/share/empty/fs/aufs/f_op.c linux/fs/aufs/f_op.c
--- /usr/share/empty/fs/aufs/f_op.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/f_op.c 2023-09-04 13:39:55.763295607 +0200
-@@ -0,0 +1,769 @@
++++ linux/fs/aufs/f_op.c 2023-10-31 09:31:04.196547417 +0100
+@@ -0,0 +1,771 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2005-2022 Junjiro R. Okajima
+ if (do_ready)
+ au_unpin(&pin);
+ di_read_unlock(dentry, /*flags*/0);
++ vfsub_file_start_write(h_file);
+
+out_fi:
+ fi_write_unlock(file);
+{
+ struct inode *h_inode;
+
++ vfsub_file_end_write(h_file);
+ au_cpup_attr_timesizes(inode);
+ AuDebugOn(au_ibtop(inode) != wpre->btop);
+ h_inode = file_inode(h_file);
+}
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 2022-11-05 23:02:18.965889284 +0100
++++ linux/fs/aufs/hnotify.c 2024-03-10 23:40:47.083143450 +0100
@@ -0,0 +1,715 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+/* ---------------------------------------------------------------------- */
+
+/* hnotify job flags */
-+#define AuHnJob_XINO0 1
-+#define AuHnJob_GEN (1 << 1)
-+#define AuHnJob_DIRENT (1 << 2)
-+#define AuHnJob_ISDIR (1 << 3)
-+#define AuHnJob_TRYXINO0 (1 << 4)
-+#define AuHnJob_MNTPNT (1 << 5)
++#define AuHnJob_XINO0 BIT(0)
++#define AuHnJob_GEN BIT(1)
++#define AuHnJob_DIRENT BIT(2)
++#define AuHnJob_ISDIR BIT(3)
++#define AuHnJob_TRYXINO0 BIT(4)
++#define AuHnJob_MNTPNT BIT(5)
+#define au_ftest_hnjob(flags, name) ((flags) & AuHnJob_##name)
+#define au_fset_hnjob(flags, name) \
+ do { (flags) |= AuHnJob_##name; } while (0)
+
+ dentry = NULL;
+ spin_lock(&parent->d_lock);
-+ list_for_each_entry(d, &parent->d_subdirs, d_child) {
++ hlist_for_each_entry(d, &parent->d_children, d_sib) {
+ /* AuDbg("%pd\n", d); */
+ spin_lock_nested(&d->d_lock, DENTRY_D_LOCK_NESTED);
+ dname = &d->d_name;
+}
diff -urN /usr/share/empty/fs/aufs/inode.c linux/fs/aufs/inode.c
--- /usr/share/empty/fs/aufs/inode.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/inode.c 2023-09-03 02:21:58.863304341 +0200
++++ linux/fs/aufs/inode.c 2023-10-31 09:31:04.199880750 +0100
@@ -0,0 +1,531 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+}
diff -urN /usr/share/empty/fs/aufs/inode.h linux/fs/aufs/inode.h
--- /usr/share/empty/fs/aufs/inode.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/inode.h 2023-09-03 02:21:58.863304341 +0200
++++ linux/fs/aufs/inode.h 2024-03-10 23:40:47.086476782 +0100
@@ -0,0 +1,707 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+} ____cacheline_aligned_in_smp;
+
+/* au_pin flags */
-+#define AuPin_DI_LOCKED 1
-+#define AuPin_MNT_WRITE (1 << 1)
++#define AuPin_DI_LOCKED BIT(0)
++#define AuPin_MNT_WRITE BIT(1)
+#define au_ftest_pin(flags, name) ((flags) & AuPin_##name)
+#define au_fset_pin(flags, name) \
+ do { (flags) |= AuPin_##name; } while (0)
+ aufs_iop_nogetattr[AuIop_Last];
+
+/* au_wr_dir flags */
-+#define AuWrDir_ADD_ENTRY 1
-+#define AuWrDir_ISDIR (1 << 1)
-+#define AuWrDir_TMPFILE (1 << 2)
++#define AuWrDir_ADD_ENTRY BIT(0)
++#define AuWrDir_ISDIR BIT(1)
++#define AuWrDir_TMPFILE BIT(2)
+#define au_ftest_wrdir(flags, name) ((flags) & AuWrDir_##name)
+#define au_fset_wrdir(flags, name) \
+ do { (flags) |= AuWrDir_##name; } while (0)
+unsigned int au_hi_flags(struct inode *inode, int isdir);
+
+/* hinode flags */
-+#define AuHi_XINO 1
-+#define AuHi_HNOTIFY (1 << 1)
++#define AuHi_XINO BIT(0)
++#define AuHi_HNOTIFY BIT(1)
+#define au_ftest_hi(flags, name) ((flags) & AuHi_##name)
+#define au_fset_hi(flags, name) \
+ do { (flags) |= AuHi_##name; } while (0)
+#endif
diff -urN /usr/share/empty/fs/aufs/i_op_add.c linux/fs/aufs/i_op_add.c
--- /usr/share/empty/fs/aufs/i_op_add.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/i_op_add.c 2023-09-04 13:39:55.763295607 +0200
++++ linux/fs/aufs/i_op_add.c 2023-10-31 09:31:04.199880750 +0100
@@ -0,0 +1,972 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ au_dir_ts(dir, a->bdst);
+ inode_inc_iversion(dir);
+ inc_nlink(inode);
-+ inode->i_ctime = dir->i_ctime;
++ inode_set_ctime_to_ts(inode, inode_get_ctime(dir));
+ d_instantiate(dentry, au_igrab(inode));
+ if (d_unhashed(a->h_path.dentry))
+ /* some filesystem calls d_drop() */
+}
diff -urN /usr/share/empty/fs/aufs/i_op.c linux/fs/aufs/i_op.c
--- /usr/share/empty/fs/aufs/i_op.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/i_op.c 2023-09-03 02:21:58.859971007 +0200
-@@ -0,0 +1,1517 @@
++++ linux/fs/aufs/i_op.c 2024-03-10 23:40:47.083143450 +0100
+@@ -0,0 +1,1520 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2005-2022 Junjiro R. Okajima
+ /* don't i_[ug]id_write() here */
+ inode->i_uid = st->uid;
+ inode->i_gid = st->gid;
-+ inode->i_atime = st->atime;
-+ inode->i_mtime = st->mtime;
-+ inode->i_ctime = st->ctime;
++ inode_set_atime_to_ts(inode, st->atime);
++ inode_set_mtime_to_ts(inode, st->mtime);
++ inode_set_ctime_to_ts(inode, st->ctime);
+
+ au_cpup_attr_nlink(inode, /*force*/0);
+ if (S_ISDIR(inode->i_mode)) {
+ goto out_fill; /* pretending success */
+
+ positive = d_is_positive(h_path.dentry);
-+ if (positive)
++ if (positive) {
+ /* no vfsub version */
-+ err = vfs_getattr(&h_path, st, request, query);
++ if (query & AT_GETATTR_NOSEC)
++ err = vfs_getattr_nosec(&h_path, st, request, query);
++ else
++ err = vfs_getattr(&h_path, st, request, query);
++ }
+ if (!err) {
+ if (positive)
+ au_refresh_iattr(inode, st,
+ goto out_di;
+
+out_fill:
-+ generic_fillattr(idmap, inode, st);
++ generic_fillattr(idmap, request, inode, st);
+out_di:
+ di_read_unlock(dentry, AuLock_IR);
+out_si:
+ return (inode->i_mode & (S_IFBLK | S_IFCHR | S_IFIFO | S_IFSOCK));
+}
+
-+static int aufs_update_time(struct inode *inode, struct timespec64 *ts,
-+ int flags)
++static int aufs_update_time(struct inode *inode, int flags)
+{
+ int err;
+ aufs_bindex_t bindex;
+ h_mnt = au_sbr_mnt(sb, bindex);
+ err = vfsub_mnt_want_write(h_mnt);
+ if (!err) {
-+ err = vfsub_update_time(h_inode, ts, flags);
++ err = vfsub_update_time(h_inode, flags);
+ vfsub_mnt_drop_write(h_mnt);
+ }
+ } else if (au_is_special(h_inode)) {
+};
diff -urN /usr/share/empty/fs/aufs/i_op_del.c linux/fs/aufs/i_op_del.c
--- /usr/share/empty/fs/aufs/i_op_del.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/i_op_del.c 2023-09-03 02:21:58.859971007 +0200
-@@ -0,0 +1,522 @@
++++ linux/fs/aufs/i_op_del.c 2023-10-31 09:31:04.199880750 +0100
+@@ -0,0 +1,523 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2005-2022 Junjiro R. Okajima
+
+ inode = d_inode(dentry);
+ d_drop(dentry);
-+ inode->i_ctime = dir->i_ctime;
++ inode_set_ctime_to_ts(inode, inode_get_ctime(dir));
+
+ au_dir_ts(dir, bindex);
+ inode_inc_iversion(dir);
+{
+ int err;
+ aufs_bindex_t bwh, bindex, btop;
-+ struct inode *inode, *h_dir, *delegated;
++ struct inode *inode, *h_dir, *delegated, *h_inode;
+ struct dentry *parent, *wh_dentry;
+ /* to reduce stack size */
+ struct {
+ if (bindex == btop) {
+ vfsub_update_h_iattr(&a->h_path, /*did*/NULL);
+ /*ignore*/
-+ inode->i_ctime = d_inode(a->h_path.dentry)->i_ctime;
++ h_inode = d_inode(a->h_path.dentry);
++ inode_set_ctime_to_ts(inode, inode_get_ctime(h_inode));
+ } else
+ /* todo: this timestamp may be reverted later */
-+ inode->i_ctime = h_dir->i_ctime;
++ inode_set_ctime_to_ts(inode, inode_get_ctime(h_dir));
+ goto out_unpin; /* success */
+ }
+
+}
diff -urN /usr/share/empty/fs/aufs/i_op_ren.c linux/fs/aufs/i_op_ren.c
--- /usr/share/empty/fs/aufs/i_op_ren.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/i_op_ren.c 2023-09-03 02:21:58.863304341 +0200
-@@ -0,0 +1,1257 @@
++++ linux/fs/aufs/i_op_ren.c 2024-03-10 23:40:47.083143450 +0100
+@@ -0,0 +1,1264 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2005-2022 Junjiro R. Okajima
+enum { AuSRC, AuDST, AuSrcDst };
+enum { AuPARENT, AuCHILD, AuParentChild };
+
-+#define AuRen_ISDIR_SRC 1
-+#define AuRen_ISDIR_DST (1 << 1)
-+#define AuRen_ISSAMEDIR (1 << 2)
-+#define AuRen_WHSRC (1 << 3)
-+#define AuRen_WHDST (1 << 4)
-+#define AuRen_MNT_WRITE (1 << 5)
-+#define AuRen_DT_DSTDIR (1 << 6)
-+#define AuRen_DIROPQ_SRC (1 << 7)
-+#define AuRen_DIROPQ_DST (1 << 8)
-+#define AuRen_DIRREN (1 << 9)
-+#define AuRen_DROPPED_SRC (1 << 10)
-+#define AuRen_DROPPED_DST (1 << 11)
++#define AuRen_ISDIR_SRC BIT(0)
++#define AuRen_ISDIR_DST BIT(1)
++#define AuRen_ISSAMEDIR BIT(2)
++#define AuRen_WHSRC BIT(3)
++#define AuRen_WHDST BIT(4)
++#define AuRen_MNT_WRITE BIT(5)
++#define AuRen_DT_DSTDIR BIT(6)
++#define AuRen_DIROPQ_SRC BIT(7)
++#define AuRen_DIROPQ_DST BIT(8)
++#define AuRen_DIRREN BIT(9)
++#define AuRen_DROPPED_SRC BIT(10)
++#define AuRen_DROPPED_DST BIT(11)
+#define au_ftest_ren(flags, name) ((flags) & AuRen_##name)
+#define au_fset_ren(flags, name) \
+ do { (flags) |= AuRen_##name; } while (0)
+{
+ int err;
+ struct dentry *d, *h_d;
++ struct inode *h_inode;
+
+ if (!a->exchange) {
+ /* prepare workqueue args for asynchronous rmdir */
+ AuDebugOn(au_dbtop(a->dst_dentry) != a->btgt);
+ a->h_path.dentry = au_h_dptr(a->dst_dentry, a->btgt);
+ vfsub_update_h_iattr(&a->h_path, /*did*/NULL); /*ignore*/
-+ a->dst_inode->i_ctime = d_inode(a->h_path.dentry)->i_ctime;
++ h_inode = d_inode(a->h_path.dentry);
++ inode_set_ctime_to_ts(a->dst_inode, inode_get_ctime(h_inode));
+ }
+ AuDebugOn(au_dbtop(a->src_dentry) != a->btgt);
+ a->h_path.dentry = au_h_dptr(a->src_dentry, a->btgt);
+ vfsub_update_h_iattr(&a->h_path, /*did*/NULL); /*ignore*/
-+ a->src_inode->i_ctime = d_inode(a->h_path.dentry)->i_ctime;
++ h_inode = d_inode(a->h_path.dentry);
++ inode_set_ctime_to_ts(a->src_inode, inode_get_ctime(h_inode));
+
+ if (!a->exchange) {
+ /* remove whiteout for dentry */
+ }
+ a->h_trap = vfsub_lock_rename(a->src_h_parent, a->src_hdir,
+ a->dst_h_parent, a->dst_hdir);
++ if (IS_ERR(a->h_trap)) {
++ err = PTR_ERR(a->h_trap);
++ goto out;
++ }
+ udba = au_opt_udba(a->src_dentry->d_sb);
+ if (unlikely(a->src_hdir->hi_inode != d_inode(a->src_h_parent)
+ || a->dst_hdir->hi_inode != d_inode(a->dst_h_parent)))
+#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 2022-11-05 23:02:18.969222617 +0100
-@@ -0,0 +1,706 @@
++++ linux/fs/aufs/mvdown.c 2024-03-10 23:40:47.086476782 +0100
+@@ -0,0 +1,713 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2011-2022 Junjiro R. Okajima
+ au_pin_hdir_unlock(&a->mvd_pin_src);
+ h_trap = vfsub_lock_rename(a->mvd_h_src_parent, a->mvd_hdir_src,
+ a->mvd_h_dst_parent, a->mvd_hdir_dst);
++ if (IS_ERR(h_trap)) {
++ err = PTR_ERR(h_trap);
++ au_pin_hdir_lock(&a->mvd_pin_src);
++ au_unpin(&a->mvd_pin_src);
++ au_pin_hdir_lock(&a->mvd_pin_dst);
++ goto out_dst;
++ }
+ if (h_trap) {
+ err = (h_trap != a->mvd_h_src_parent);
+ if (err)
+}
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 2022-11-05 23:02:18.969222617 +0100
++++ linux/fs/aufs/opts.c 2024-03-10 23:40:47.086476782 +0100
@@ -0,0 +1,1032 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ case Opt_prepend:
+ opt->add.bindex = 0;
+ fallthrough;
-+ add: /* indented label */
+ case Opt_add:
++ add: /* indented label */
+ err = au_br_add(sb, &opt->add,
+ au_ftest_opts(opts->flags, REMOUNT));
+ if (!err) {
+}
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 2022-11-05 23:02:18.969222617 +0100
++++ linux/fs/aufs/opts.h 2024-03-10 23:40:47.086476782 +0100
@@ -0,0 +1,263 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+/* ---------------------------------------------------------------------- */
+
+/* mount flags */
-+#define AuOpt_XINO 1 /* external inode number bitmap
++#define AuOpt_XINO BIT(0) /* external inode number bitmap
+ and translation table */
-+#define AuOpt_TRUNC_XINO (1 << 1) /* truncate xino files */
-+#define AuOpt_UDBA_NONE (1 << 2) /* users direct branch access */
-+#define AuOpt_UDBA_REVAL (1 << 3)
-+#define AuOpt_UDBA_HNOTIFY (1 << 4)
-+#define AuOpt_SHWH (1 << 5) /* show whiteout */
-+#define AuOpt_PLINK (1 << 6) /* pseudo-link */
-+#define AuOpt_DIRPERM1 (1 << 7) /* ignore the lower dir's perm
++#define AuOpt_TRUNC_XINO BIT(1) /* truncate xino files */
++#define AuOpt_UDBA_NONE BIT(2) /* users direct branch access */
++#define AuOpt_UDBA_REVAL BIT(3)
++#define AuOpt_UDBA_HNOTIFY BIT(4)
++#define AuOpt_SHWH BIT(5) /* show whiteout */
++#define AuOpt_PLINK BIT(6) /* pseudo-link */
++#define AuOpt_DIRPERM1 BIT(7) /* ignore the lower dir's perm
+ bits */
-+#define AuOpt_ALWAYS_DIROPQ (1 << 9) /* policy to creating diropq */
-+#define AuOpt_SUM (1 << 10) /* summation for statfs(2) */
-+#define AuOpt_SUM_W (1 << 11) /* unimplemented */
-+#define AuOpt_WARN_PERM (1 << 12) /* warn when add-branch */
-+#define AuOpt_VERBOSE (1 << 13) /* print the cause of error */
-+#define AuOpt_DIO (1 << 14) /* direct io */
-+#define AuOpt_DIRREN (1 << 15) /* directory rename */
++#define AuOpt_ALWAYS_DIROPQ BIT(8) /* policy to creating diropq */
++#define AuOpt_SUM BIT(9) /* summation for statfs(2) */
++#define AuOpt_SUM_W BIT(10) /* unimplemented */
++#define AuOpt_WARN_PERM BIT(11) /* warn when add-branch */
++#define AuOpt_VERBOSE BIT(12) /* print the cause of error */
++#define AuOpt_DIO BIT(13) /* direct io */
++#define AuOpt_DIRREN BIT(14) /* directory rename */
+
+#ifndef CONFIG_AUFS_HNOTIFY
+#undef AuOpt_UDBA_HNOTIFY
+};
+
+/* opts flags */
-+#define AuOpts_REMOUNT 1
-+#define AuOpts_REFRESH (1 << 1)
-+#define AuOpts_TRUNC_XIB (1 << 2)
-+#define AuOpts_REFRESH_DYAOP (1 << 3)
-+#define AuOpts_REFRESH_IDOP (1 << 4)
-+#define AuOpts_DR_FLUSHED (1 << 5)
++#define AuOpts_REMOUNT BIT(0)
++#define AuOpts_REFRESH BIT(1)
++#define AuOpts_TRUNC_XIB BIT(2)
++#define AuOpts_REFRESH_DYAOP BIT(3)
++#define AuOpts_REFRESH_IDOP BIT(4)
++#define AuOpts_DR_FLUSHED BIT(5)
+#define au_ftest_opts(flags, name) ((flags) & AuOpts_##name)
+#define au_fset_opts(flags, name) \
+ do { (flags) |= AuOpts_##name; } while (0)
+}
diff -urN /usr/share/empty/fs/aufs/posix_acl.c linux/fs/aufs/posix_acl.c
--- /usr/share/empty/fs/aufs/posix_acl.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/posix_acl.c 2023-09-03 02:21:58.863304341 +0200
++++ linux/fs/aufs/posix_acl.c 2023-10-31 09:31:04.199880750 +0100
@@ -0,0 +1,108 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+}
diff -urN /usr/share/empty/fs/aufs/rdu.c linux/fs/aufs/rdu.c
--- /usr/share/empty/fs/aufs/rdu.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/rdu.c 2023-09-04 13:39:55.763295607 +0200
++++ linux/fs/aufs/rdu.c 2024-03-10 23:40:47.086476782 +0100
@@ -0,0 +1,384 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+#include "aufs.h"
+
+/* bits for struct aufs_rdu.flags */
-+#define AuRdu_CALLED 1
-+#define AuRdu_CONT (1 << 1)
-+#define AuRdu_FULL (1 << 2)
++#define AuRdu_CALLED BIT(0)
++#define AuRdu_CONT BIT(1)
++#define AuRdu_FULL BIT(2)
+#define au_ftest_rdu(flags, name) ((flags) & AuRdu_##name)
+#define au_fset_rdu(flags, name) \
+ do { (flags) |= AuRdu_##name; } while (0)
+}
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 2022-11-05 23:02:18.969222617 +0100
++++ linux/fs/aufs/super.c 2023-10-10 22:51:18.033248030 +0200
@@ -0,0 +1,871 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ return err;
+}
+
-+static void au_gen_fmt(char *fmt, int len __maybe_unused, const char *pat,
++static void au_gen_fmt(char *fmt, int len, const char *pat,
+ const char *append)
+{
+ char *p;
+ while (*pat != ':')
+ *p++ = *pat++;
+ *p++ = *pat++;
-+ strcpy(p, append);
++ strscpy(p, append, len - (p - fmt));
+ AuDebugOn(strlen(fmt) >= len);
+}
+
+};
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 2022-11-05 23:02:18.969222617 +0100
++++ linux/fs/aufs/super.h 2024-03-10 23:40:47.086476782 +0100
@@ -0,0 +1,592 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ int (*copyup)(struct dentry *dentry);
+};
+
-+#define AuWbr_DIR 1 /* target is a dir */
-+#define AuWbr_PARENT (1 << 1) /* always require a parent */
++#define AuWbr_DIR BIT(0) /* target is a dir */
++#define AuWbr_PARENT BIT(1) /* always require a parent */
+
+#define au_ftest_wbr(flags, name) ((flags) & AuWbr_##name)
+#define au_fset_wbr(flags, name) { (flags) |= AuWbr_##name; }
+ * then try refreshing dirs at access time again.
+ * if it is false, refreshing dirs at access time is unnecessary
+ */
-+#define AuSi_FAILED_REFRESH_DIR 1
-+#define AuSi_FHSM (1 << 1) /* fhsm is active now */
-+#define AuSi_NO_DREVAL (1 << 2) /* disable all d_revalidate */
++#define AuSi_FAILED_REFRESH_DIR BIT(0)
++#define AuSi_FHSM BIT(1) /* fhsm is active now */
++#define AuSi_NO_DREVAL BIT(2) /* disable all d_revalidate */
+
+#ifndef CONFIG_AUFS_FHSM
+#undef AuSi_FHSM
+ ((sbinfo)->si_wbr_create_ops->create(__VA_ARGS__))
+
+/* flags for si_read_lock()/aufs_read_lock()/di_read_lock() */
-+#define AuLock_DW 1 /* write-lock dentry */
-+#define AuLock_IR (1 << 1) /* read-lock inode */
-+#define AuLock_IW (1 << 2) /* write-lock inode */
-+#define AuLock_FLUSH (1 << 3) /* wait for 'nowait' tasks */
-+#define AuLock_DIRS (1 << 4) /* target is a pair of dirs */
++#define AuLock_DW BIT(0) /* write-lock dentry */
++#define AuLock_IR BIT(1) /* read-lock inode */
++#define AuLock_IW BIT(2) /* write-lock inode */
++#define AuLock_FLUSH BIT(3) /* wait for 'nowait' tasks */
++#define AuLock_DIRS BIT(4) /* target is a pair of dirs */
+ /* except RENAME_EXCHANGE */
-+#define AuLock_NOPLM (1 << 5) /* return err in plm mode */
-+#define AuLock_NOPLMW (1 << 6) /* wait for plm mode ends */
-+#define AuLock_GEN (1 << 7) /* test digen/iigen */
++#define AuLock_NOPLM BIT(5) /* return err in plm mode */
++#define AuLock_NOPLMW BIT(6) /* wait for plm mode ends */
++#define AuLock_GEN BIT(7) /* test digen/iigen */
+#define au_ftest_lock(flags, name) ((flags) & AuLock_##name)
+#define au_fset_lock(flags, name) \
+ do { (flags) |= AuLock_##name; } while (0)
+#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 2022-11-05 23:02:18.969222617 +0100
++++ linux/fs/aufs/sysaufs.c 2023-10-10 22:51:18.033248030 +0200
@@ -0,0 +1,94 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ .show = sysaufs_si_show
+};
+
-+static struct kobj_type au_sbi_ktype = {
++static const struct kobj_type au_sbi_ktype = {
+ .release = au_si_free,
+ .sysfs_ops = &au_sbi_ops,
+ .default_groups = sysaufs_si_groups
+}
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 2022-11-05 23:02:18.969222617 +0100
++++ linux/fs/aufs/sysrq.c 2023-10-31 09:31:04.199880750 +0100
@@ -0,0 +1,149 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+module_param_named(sysrq, aufs_sysrq_key, charp, 0444);
+MODULE_PARM_DESC(sysrq, "MagicSysRq key for " AUFS_NAME);
+
-+static void au_sysrq(int key __maybe_unused)
++static void au_sysrq(u8 key __maybe_unused)
+{
+ struct au_sbinfo *sbinfo;
+ struct hlist_bl_node *pos;
+}
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 2022-12-17 09:21:34.799855195 +0100
++++ linux/fs/aufs/vdir.c 2024-03-10 23:40:47.086476782 +0100
@@ -0,0 +1,896 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+
+/* ---------------------------------------------------------------------- */
+
-+#define AuFillVdir_CALLED 1
-+#define AuFillVdir_WHABLE (1 << 1)
-+#define AuFillVdir_SHWH (1 << 2)
++#define AuFillVdir_CALLED BIT(0)
++#define AuFillVdir_WHABLE BIT(1)
++#define AuFillVdir_SHWH BIT(2)
+#define au_ftest_fillvdir(flags, name) ((flags) & AuFillVdir_##name)
+#define au_fset_fillvdir(flags, name) \
+ do { (flags) |= AuFillVdir_##name; } while (0)
+}
diff -urN /usr/share/empty/fs/aufs/vfsub.c linux/fs/aufs/vfsub.c
--- /usr/share/empty/fs/aufs/vfsub.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/vfsub.c 2023-09-04 13:39:55.763295607 +0200
-@@ -0,0 +1,918 @@
++++ linux/fs/aufs/vfsub.c 2024-03-10 23:40:47.086476782 +0100
+@@ -0,0 +1,921 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2005-2022 Junjiro R. Okajima
+ lockdep_off();
+ d = lock_rename(d1, d2);
+ lockdep_on();
++ if (IS_ERR(d))
++ goto out;
+ au_hn_suspend(hdir1);
+ if (hdir1 != hdir2)
+ au_hn_suspend(hdir2);
+
++out:
+ return d;
+}
+
+ return err;
+}
+
-+long vfsub_splice_read(struct file *in, loff_t *ppos,
-+ struct pipe_inode_info *pipe, size_t len,
-+ unsigned int flags)
++ssize_t vfsub_splice_read(struct file *in, loff_t *ppos,
++ struct pipe_inode_info *pipe, size_t len,
++ unsigned int flags)
+{
-+ long err;
++ ssize_t err;
+
+ lockdep_off();
+ err = vfs_splice_read(in, ppos, pipe, len, flags);
+ return err;
+}
+
-+long vfsub_splice_from(struct pipe_inode_info *pipe, struct file *out,
-+ loff_t *ppos, size_t len, unsigned int flags)
++ssize_t vfsub_splice_from(struct pipe_inode_info *pipe, struct file *out,
++ loff_t *ppos, size_t len, unsigned int flags)
+{
-+ long err;
++ ssize_t err;
+
+ lockdep_off();
+ err = do_splice_from(pipe, out, ppos, len, flags);
+}
diff -urN /usr/share/empty/fs/aufs/vfsub.h linux/fs/aufs/vfsub.h
--- /usr/share/empty/fs/aufs/vfsub.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/vfsub.h 2023-09-04 13:39:55.763295607 +0200
-@@ -0,0 +1,390 @@
++++ linux/fs/aufs/vfsub.h 2024-03-10 23:40:47.086476782 +0100
+@@ -0,0 +1,402 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2005-2022 Junjiro R. Okajima
+
+/* copied from linux/fs/internal.h */
+/* todo: BAD approach!! */
-+extern void __mnt_drop_write(struct vfsmount *);
+extern struct file *alloc_empty_file(int, const struct cred *);
+
+/* ---------------------------------------------------------------------- */
+}
+#endif
+
++static inline void vfsub_file_start_write(struct file *file)
++{
++ lockdep_off();
++ file_start_write(file);
++ lockdep_on();
++}
++
++static inline void vfsub_file_end_write(struct file *file)
++{
++ lockdep_off();
++ file_end_write(file);
++ lockdep_on();
++}
++
+/* ---------------------------------------------------------------------- */
+
+struct au_hinode;
+}
+#endif
+
-+static inline int vfsub_update_time(struct inode *h_inode,
-+ struct timespec64 *ts, int flags)
++static inline int vfsub_update_time(struct inode *h_inode, int flags)
+{
-+ return inode_update_time(h_inode, ts, flags);
++ return inode_update_time(h_inode, flags);
+ /* no vfsub_update_h_iattr() since we don't have struct path */
+}
+
+ struct dentry *h_dentry, umode_t h_mode);
+#endif
+
-+long vfsub_splice_read(struct file *in, loff_t *ppos,
-+ struct pipe_inode_info *pipe, size_t len,
-+ unsigned int flags);
-+long vfsub_splice_from(struct pipe_inode_info *pipe, struct file *out,
-+ loff_t *ppos, size_t len, unsigned int flags);
++ssize_t vfsub_splice_read(struct file *in, loff_t *ppos,
++ struct pipe_inode_info *pipe, size_t len,
++ unsigned int flags);
++ssize_t vfsub_splice_from(struct pipe_inode_info *pipe, struct file *out,
++ loff_t *ppos, size_t len, unsigned int flags);
+
+static inline long vfsub_truncate(struct path *path, loff_t length)
+{
+#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 2022-11-05 23:02:18.969222617 +0100
++++ linux/fs/aufs/wbr_policy.c 2024-03-10 23:40:47.086476782 +0100
@@ -0,0 +1,830 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ return err;
+}
+
-+#define AuCpdown_PARENT_OPQ 1
-+#define AuCpdown_WHED (1 << 1)
-+#define AuCpdown_MADE_DIR (1 << 2)
-+#define AuCpdown_DIROPQ (1 << 3)
++#define AuCpdown_PARENT_OPQ BIT(0)
++#define AuCpdown_WHED BIT(1)
++#define AuCpdown_MADE_DIR BIT(2)
++#define AuCpdown_DIROPQ BIT(3)
+#define au_ftest_cpdown(flags, name) ((flags) & AuCpdown_##name)
+#define au_fset_cpdown(flags, name) \
+ do { (flags) |= AuCpdown_##name; } while (0)
+};
diff -urN /usr/share/empty/fs/aufs/whout.c linux/fs/aufs/whout.c
--- /usr/share/empty/fs/aufs/whout.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/whout.c 2023-09-03 02:21:58.863304341 +0200
++++ linux/fs/aufs/whout.c 2023-10-31 09:31:04.199880750 +0100
@@ -0,0 +1,1072 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+}
diff -urN /usr/share/empty/fs/aufs/whout.h linux/fs/aufs/whout.h
--- /usr/share/empty/fs/aufs/whout.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/whout.h 2023-09-03 02:21:58.863304341 +0200
++++ linux/fs/aufs/whout.h 2023-10-31 09:31:04.199880750 +0100
@@ -0,0 +1,87 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+}
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 2022-11-05 23:02:18.972555950 +0100
++++ linux/fs/aufs/wkq.h 2024-03-10 23:40:47.086476782 +0100
@@ -0,0 +1,89 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+typedef void (*au_wkq_func_t)(void *args);
+
+/* wkq flags */
-+#define AuWkq_WAIT 1
-+#define AuWkq_NEST (1 << 1)
++#define AuWkq_WAIT BIT(0)
++#define AuWkq_NEST BIT(1)
+#define au_ftest_wkq(flags, name) ((flags) & AuWkq_##name)
+#define au_fset_wkq(flags, name) \
+ do { (flags) |= AuWkq_##name; } while (0)
+#endif /* __AUFS_WKQ_H__ */
diff -urN /usr/share/empty/fs/aufs/xattr.c linux/fs/aufs/xattr.c
--- /usr/share/empty/fs/aufs/xattr.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/xattr.c 2023-09-03 02:21:58.863304341 +0200
++++ linux/fs/aufs/xattr.c 2024-03-10 23:40:47.086476782 +0100
@@ -0,0 +1,360 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ if (is_acl) {
+ acl = vfs_get_acl(h_src_idmap, h_src_dentry, name);
+ AuDebugOn(!acl);
-+ if (unlikely(IS_ERR(acl))) {
++ if (IS_ERR(acl)) {
+ err = PTR_ERR(acl);
+ if (err == -ENODATA)
+ err = 0;
+}
diff -urN /usr/share/empty/fs/aufs/xino.c linux/fs/aufs/xino.c
--- /usr/share/empty/fs/aufs/xino.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/xino.c 2023-09-03 02:21:58.863304341 +0200
++++ linux/fs/aufs/xino.c 2023-10-31 09:31:04.203214083 +0100
@@ -0,0 +1,1926 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+}
diff -urN /usr/share/empty/include/uapi/linux/aufs_type.h linux/include/uapi/linux/aufs_type.h
--- /usr/share/empty/include/uapi/linux/aufs_type.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux/include/uapi/linux/aufs_type.h 2023-09-04 13:40:14.109962274 +0200
++++ linux/include/uapi/linux/aufs_type.h 2024-03-10 23:40:47.086476782 +0100
@@ -0,0 +1,452 @@
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+/*
+#include <limits.h>
+#endif /* __KERNEL__ */
+
-+#define AUFS_VERSION "6.5-20230904"
++#define AUFS_VERSION "6.x-rcN-20240226"
+
+/* todo? move this to linux-2.6.19/include/magic.h */
+#define AUFS_SUPER_MAGIC ('a' << 24 | 'u' << 16 | 'f' << 8 | 's')
+
+#endif /* __AUFS_TYPE_H__ */
SPDX-License-Identifier: GPL-2.0
-aufs6.5 loopback patch
+aufs6.x-rcN loopback patch
diff --git a/drivers/block/loop.c b/drivers/block/loop.c
-index cbefd23beb44..53b9f81161d4 100644
+index 333b3915fe86..1eb5bde57477 100644
--- a/drivers/block/loop.c
+++ b/drivers/block/loop.c
@@ -54,7 +54,7 @@ struct loop_device {
struct block_device *lo_device;
gfp_t old_gfp_mask;
-@@ -510,6 +510,15 @@ static inline void loop_update_dio(struct loop_device *lo)
+@@ -506,6 +506,15 @@ static inline void loop_update_dio(struct loop_device *lo)
lo->use_dio);
}
static void loop_reread_partitions(struct loop_device *lo)
{
int rc;
-@@ -567,6 +576,7 @@ static int loop_change_fd(struct loop_device *lo, struct block_device *bdev,
+@@ -563,6 +572,7 @@ static int loop_change_fd(struct loop_device *lo, struct block_device *bdev,
{
struct file *file = fget(arg);
struct file *old_file;
int error;
bool partscan;
bool is_loop;
-@@ -590,11 +600,19 @@ static int loop_change_fd(struct loop_device *lo, struct block_device *bdev,
+@@ -586,11 +596,19 @@ static int loop_change_fd(struct loop_device *lo, struct block_device *bdev,
if (!(lo->lo_flags & LO_FLAGS_READ_ONLY))
goto out_err;
error = -EINVAL;
-@@ -607,6 +625,7 @@ static int loop_change_fd(struct loop_device *lo, struct block_device *bdev,
+@@ -603,6 +621,7 @@ static int loop_change_fd(struct loop_device *lo, struct block_device *bdev,
blk_mq_freeze_queue(lo->lo_queue);
mapping_set_gfp_mask(old_file->f_mapping, lo->old_gfp_mask);
lo->lo_backing_file = file;
lo->old_gfp_mask = mapping_gfp_mask(file->f_mapping);
mapping_set_gfp_mask(file->f_mapping,
lo->old_gfp_mask & ~(__GFP_IO|__GFP_FS));
-@@ -629,6 +648,8 @@ static int loop_change_fd(struct loop_device *lo, struct block_device *bdev,
+@@ -625,6 +644,8 @@ static int loop_change_fd(struct loop_device *lo, struct block_device *bdev,
* dependency.
*/
fput(old_file);
if (partscan)
loop_reread_partitions(lo);
-@@ -642,6 +663,8 @@ static int loop_change_fd(struct loop_device *lo, struct block_device *bdev,
+@@ -638,6 +659,8 @@ static int loop_change_fd(struct loop_device *lo, struct block_device *bdev,
loop_global_unlock(lo, is_loop);
out_putf:
fput(file);
goto done;
}
-@@ -1013,6 +1036,7 @@ static int loop_configure(struct loop_device *lo, blk_mode_t mode,
+@@ -1009,6 +1032,7 @@ static int loop_configure(struct loop_device *lo, blk_mode_t mode,
const struct loop_config *config)
{
struct file *file = fget(config->fd);
struct inode *inode;
struct address_space *mapping;
int error;
-@@ -1028,6 +1052,13 @@ static int loop_configure(struct loop_device *lo, blk_mode_t mode,
+@@ -1024,6 +1048,13 @@ static int loop_configure(struct loop_device *lo, blk_mode_t mode,
/* This is safe, since we have a reference from open(). */
__module_get(THIS_MODULE);
/*
* If we don't hold exclusive handle for the device, upgrade to it
* here to avoid changing device under exclusive owner.
-@@ -1091,6 +1122,7 @@ static int loop_configure(struct loop_device *lo, blk_mode_t mode,
+@@ -1087,6 +1118,7 @@ static int loop_configure(struct loop_device *lo, blk_mode_t mode,
lo->use_dio = lo->lo_flags & LO_FLAGS_DIRECT_IO;
lo->lo_device = bdev;
lo->lo_backing_file = file;
lo->old_gfp_mask = mapping_gfp_mask(mapping);
mapping_set_gfp_mask(mapping, lo->old_gfp_mask & ~(__GFP_IO|__GFP_FS));
-@@ -1146,6 +1178,8 @@ static int loop_configure(struct loop_device *lo, blk_mode_t mode,
+@@ -1142,6 +1174,8 @@ static int loop_configure(struct loop_device *lo, blk_mode_t mode,
bd_abort_claiming(bdev, loop_configure);
out_putf:
fput(file);
/* This is safe: open() is still holding a reference. */
module_put(THIS_MODULE);
return error;
-@@ -1154,6 +1188,7 @@ static int loop_configure(struct loop_device *lo, blk_mode_t mode,
+@@ -1150,6 +1184,7 @@ static int loop_configure(struct loop_device *lo, blk_mode_t mode,
static void __loop_clr_fd(struct loop_device *lo, bool release)
{
struct file *filp;
gfp_t gfp = lo->old_gfp_mask;
if (test_bit(QUEUE_FLAG_WC, &lo->lo_queue->queue_flags))
-@@ -1170,6 +1205,7 @@ static void __loop_clr_fd(struct loop_device *lo, bool release)
+@@ -1166,6 +1201,7 @@ static void __loop_clr_fd(struct loop_device *lo, bool release)
spin_lock_irq(&lo->lo_lock);
filp = lo->lo_backing_file;
lo->lo_backing_file = NULL;
spin_unlock_irq(&lo->lo_lock);
lo->lo_device = NULL;
-@@ -1232,6 +1268,8 @@ static void __loop_clr_fd(struct loop_device *lo, bool release)
+@@ -1228,6 +1264,8 @@ static void __loop_clr_fd(struct loop_device *lo, bool release)
* fput can take open_mutex which is usually taken before lo_mutex.
*/
fput(filp);
static int loop_clr_fd(struct loop_device *lo)
diff --git a/fs/aufs/f_op.c b/fs/aufs/f_op.c
-index 6b9cfc26b56b..e8878a13a0c8 100644
+index fa8a517ffd0c..c18f7bcef81b 100644
--- a/fs/aufs/f_op.c
+++ b/fs/aufs/f_op.c
-@@ -309,7 +309,7 @@ static ssize_t aufs_read_iter(struct kiocb *kio, struct iov_iter *iov_iter)
+@@ -311,7 +311,7 @@ static ssize_t aufs_read_iter(struct kiocb *kio, struct iov_iter *iov_iter)
if (IS_ERR(h_file))
goto out;
#endif /* __KERNEL__ */
diff --git a/fs/aufs/super.c b/fs/aufs/super.c
-index 81922d4faf54..c8a62c267d72 100644
+index 07d3412e950f..c4a00f620e57 100644
--- a/fs/aufs/super.c
+++ b/fs/aufs/super.c
@@ -758,7 +758,10 @@ const struct super_operations aufs_sop = {
/* ---------------------------------------------------------------------- */
diff --git a/include/linux/fs.h b/include/linux/fs.h
-index 5a2db7b8eca5..fc74b8e852c3 100644
+index 96ca249ee1e6..b21abb1a2134 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
-@@ -1944,6 +1944,11 @@ struct super_operations {
+@@ -2165,6 +2165,11 @@ struct super_operations {
long (*free_cached_objects)(struct super_block *,
struct shrink_control *);
void (*shutdown)(struct super_block *sb);