From 6f85592cbb316f2936242eebfd788d858ccdb289 Mon Sep 17 00:00:00 2001 From: Rmys Date: Fri, 20 Dec 2024 16:12:31 +0300 Subject: [PATCH] kernel-6.6.67 --- .../files/patches/aufs6/aufs6-base.patch | 6 +- .../files/patches/aufs6/aufs6-kbuild.patch | 2 +- .../files/patches/aufs6/aufs6-loopback.patch | 32 +- .../files/patches/aufs6/aufs6-mmap.patch | 66 +- .../patches/aufs6/aufs6-standalone.patch | 10 +- ...241014.patch => aufs6.6.63-20241202.patch} | 685 +++++++++++------- .../files/patches/aufs6/lockdep-debug.patch | 2 +- .../files/patches/aufs6/tmpfs-idr.patch | 22 +- .../files/patches/linux/patch-6.6.67.xz | Bin 0 -> 3606008 bytes kernel/tools/cpupowertools/pspec.xml | 11 +- 10 files changed, 484 insertions(+), 352 deletions(-) rename kernel/tools/cpupowertools/files/patches/aufs6/{aufs6.6.54-20241014.patch => aufs6.6.63-20241202.patch} (98%) create mode 100644 kernel/tools/cpupowertools/files/patches/linux/patch-6.6.67.xz diff --git a/kernel/tools/cpupowertools/files/patches/aufs6/aufs6-base.patch b/kernel/tools/cpupowertools/files/patches/aufs6/aufs6-base.patch index a328c2ab..bbfd5f47 100644 --- a/kernel/tools/cpupowertools/files/patches/aufs6/aufs6-base.patch +++ b/kernel/tools/cpupowertools/files/patches/aufs6/aufs6-base.patch @@ -1,5 +1,5 @@ SPDX-License-Identifier: GPL-2.0 -aufs6.6.54 base patch +aufs6.6.63 base patch diff --git a/MAINTAINERS b/MAINTAINERS index ae4c0cec5073..2b5edd2836a7 100644 @@ -26,10 +26,10 @@ index ae4c0cec5073..2b5edd2836a7 100644 M: Greg Kroah-Hartman R: Dave Ertman diff --git a/drivers/block/loop.c b/drivers/block/loop.c -index 552f56a84a7e..ad953bc6d08a 100644 +index 886c63599037..73dae3b1bd4e 100644 --- a/drivers/block/loop.c +++ b/drivers/block/loop.c -@@ -643,6 +643,24 @@ static int loop_change_fd(struct loop_device *lo, struct block_device *bdev, +@@ -640,6 +640,24 @@ static int loop_change_fd(struct loop_device *lo, struct block_device *bdev, goto done; } diff --git a/kernel/tools/cpupowertools/files/patches/aufs6/aufs6-kbuild.patch b/kernel/tools/cpupowertools/files/patches/aufs6/aufs6-kbuild.patch index 936f8771..ebe2feb1 100644 --- a/kernel/tools/cpupowertools/files/patches/aufs6/aufs6-kbuild.patch +++ b/kernel/tools/cpupowertools/files/patches/aufs6/aufs6-kbuild.patch @@ -1,5 +1,5 @@ SPDX-License-Identifier: GPL-2.0 -aufs6.6.54 kbuild patch +aufs6.6.63 kbuild patch diff --git a/fs/Kconfig b/fs/Kconfig index aa7e03cc1941..bf780967b6c4 100644 diff --git a/kernel/tools/cpupowertools/files/patches/aufs6/aufs6-loopback.patch b/kernel/tools/cpupowertools/files/patches/aufs6/aufs6-loopback.patch index 70d74d8e..c9b1cc5a 100644 --- a/kernel/tools/cpupowertools/files/patches/aufs6/aufs6-loopback.patch +++ b/kernel/tools/cpupowertools/files/patches/aufs6/aufs6-loopback.patch @@ -1,8 +1,8 @@ SPDX-License-Identifier: GPL-2.0 -aufs6.6.54 loopback patch +aufs6.6.63 loopback patch diff --git a/drivers/block/loop.c b/drivers/block/loop.c -index ad953bc6d08a..799119d6b95a 100644 +index 73dae3b1bd4e..ae84fb81acbf 100644 --- a/drivers/block/loop.c +++ b/drivers/block/loop.c @@ -54,7 +54,7 @@ struct loop_device { @@ -14,7 +14,7 @@ index ad953bc6d08a..799119d6b95a 100644 struct block_device *lo_device; gfp_t old_gfp_mask; -@@ -508,6 +508,15 @@ static inline void loop_update_dio(struct loop_device *lo) +@@ -505,6 +505,15 @@ static inline void loop_update_dio(struct loop_device *lo) lo->use_dio); } @@ -30,7 +30,7 @@ index ad953bc6d08a..799119d6b95a 100644 static void loop_reread_partitions(struct loop_device *lo) { int rc; -@@ -565,6 +574,7 @@ static int loop_change_fd(struct loop_device *lo, struct block_device *bdev, +@@ -562,6 +571,7 @@ static int loop_change_fd(struct loop_device *lo, struct block_device *bdev, { struct file *file = fget(arg); struct file *old_file; @@ -38,7 +38,7 @@ index ad953bc6d08a..799119d6b95a 100644 int error; bool partscan; bool is_loop; -@@ -588,11 +598,19 @@ static int loop_change_fd(struct loop_device *lo, struct block_device *bdev, +@@ -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; @@ -58,7 +58,7 @@ index ad953bc6d08a..799119d6b95a 100644 error = -EINVAL; -@@ -605,6 +623,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; @@ -66,7 +66,7 @@ index ad953bc6d08a..799119d6b95a 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)); -@@ -627,6 +646,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); @@ -75,7 +75,7 @@ index ad953bc6d08a..799119d6b95a 100644 if (partscan) loop_reread_partitions(lo); -@@ -640,6 +661,8 @@ static int loop_change_fd(struct loop_device *lo, struct block_device *bdev, +@@ -637,6 +658,8 @@ static int loop_change_fd(struct loop_device *lo, struct block_device *bdev, loop_global_unlock(lo, is_loop); out_putf: fput(file); @@ -84,7 +84,7 @@ index ad953bc6d08a..799119d6b95a 100644 goto done; } -@@ -1011,6 +1034,7 @@ static int loop_configure(struct loop_device *lo, blk_mode_t mode, +@@ -1008,6 +1031,7 @@ static int loop_configure(struct loop_device *lo, blk_mode_t mode, const struct loop_config *config) { struct file *file = fget(config->fd); @@ -92,7 +92,7 @@ index ad953bc6d08a..799119d6b95a 100644 struct inode *inode; struct address_space *mapping; int error; -@@ -1026,6 +1050,13 @@ static int loop_configure(struct loop_device *lo, blk_mode_t mode, +@@ -1023,6 +1047,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); @@ -106,7 +106,7 @@ index ad953bc6d08a..799119d6b95a 100644 /* * If we don't hold exclusive handle for the device, upgrade to it * here to avoid changing device under exclusive owner. -@@ -1089,6 +1120,7 @@ static int loop_configure(struct loop_device *lo, blk_mode_t mode, +@@ -1086,6 +1117,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; @@ -114,7 +114,7 @@ index ad953bc6d08a..799119d6b95a 100644 lo->old_gfp_mask = mapping_gfp_mask(mapping); mapping_set_gfp_mask(mapping, lo->old_gfp_mask & ~(__GFP_IO|__GFP_FS)); -@@ -1144,6 +1176,8 @@ static int loop_configure(struct loop_device *lo, blk_mode_t mode, +@@ -1141,6 +1173,8 @@ static int loop_configure(struct loop_device *lo, blk_mode_t mode, bd_abort_claiming(bdev, loop_configure); out_putf: fput(file); @@ -123,7 +123,7 @@ index ad953bc6d08a..799119d6b95a 100644 /* This is safe: open() is still holding a reference. */ module_put(THIS_MODULE); return error; -@@ -1152,6 +1186,7 @@ static int loop_configure(struct loop_device *lo, blk_mode_t mode, +@@ -1149,6 +1183,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; @@ -131,7 +131,7 @@ index ad953bc6d08a..799119d6b95a 100644 gfp_t gfp = lo->old_gfp_mask; if (test_bit(QUEUE_FLAG_WC, &lo->lo_queue->queue_flags)) -@@ -1168,6 +1203,7 @@ static void __loop_clr_fd(struct loop_device *lo, bool release) +@@ -1165,6 +1200,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; @@ -139,7 +139,7 @@ index ad953bc6d08a..799119d6b95a 100644 spin_unlock_irq(&lo->lo_lock); lo->lo_device = NULL; -@@ -1230,6 +1266,8 @@ static void __loop_clr_fd(struct loop_device *lo, bool release) +@@ -1227,6 +1263,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); @@ -208,7 +208,7 @@ index 03d4908a6c03..34d356e181d5 100644 #endif /* __KERNEL__ */ diff --git a/fs/aufs/super.c b/fs/aufs/super.c -index 07d3412e950f..c4a00f620e57 100644 +index 6da6270e98ca..5f9bbcd90851 100644 --- a/fs/aufs/super.c +++ b/fs/aufs/super.c @@ -758,7 +758,10 @@ const struct super_operations aufs_sop = { diff --git a/kernel/tools/cpupowertools/files/patches/aufs6/aufs6-mmap.patch b/kernel/tools/cpupowertools/files/patches/aufs6/aufs6-mmap.patch index ea35227a..6fa78fbd 100644 --- a/kernel/tools/cpupowertools/files/patches/aufs6/aufs6-mmap.patch +++ b/kernel/tools/cpupowertools/files/patches/aufs6/aufs6-mmap.patch @@ -1,11 +1,11 @@ SPDX-License-Identifier: GPL-2.0 -aufs6.6.54 mmap patch +aufs6.6.63 mmap patch diff --git a/fs/proc/base.c b/fs/proc/base.c -index 6e61d93ffa55..cf8cc0f18b36 100644 +index 699f085d4de7..8e7cb5a20a30 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) +@@ -2277,7 +2277,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) { @@ -144,10 +144,10 @@ index 43c19d85dfe7..c6bdd132b7ff 100644 #ifdef CONFIG_ANON_VMA_NAME diff --git a/kernel/fork.c b/kernel/fork.c -index 177ce7438db6..869467885640 100644 +index 23efaa2c42e4..50b94374b715 100644 --- a/kernel/fork.c +++ b/kernel/fork.c -@@ -731,7 +731,7 @@ static __latent_entropy int dup_mmap(struct mm_struct *mm, +@@ -732,7 +732,7 @@ static __latent_entropy int dup_mmap(struct mm_struct *mm, if (file) { struct address_space *mapping = file->f_mapping; @@ -166,10 +166,10 @@ index ec65984e2ade..d59461647ccd 100644 obj-$(CONFIG_SHRINKER_DEBUG) += shrinker_debug.o +obj-y += prfile.o diff --git a/mm/filemap.c b/mm/filemap.c -index e6c112f3a211..4d794ca8b6d2 100644 +index 2c308413387f..82051ef9f5dd 100644 --- a/mm/filemap.c +++ b/mm/filemap.c -@@ -3663,7 +3663,7 @@ vm_fault_t filemap_page_mkwrite(struct vm_fault *vmf) +@@ -3661,7 +3661,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); @@ -179,19 +179,19 @@ index e6c112f3a211..4d794ca8b6d2 100644 if (folio->mapping != mapping) { folio_unlock(folio); diff --git a/mm/mmap.c b/mm/mmap.c -index 6530e9cac458..3a696f12c0f6 100644 +index e4dfeaef668a..a15b967bb0f8 100644 --- a/mm/mmap.c +++ b/mm/mmap.c -@@ -140,7 +140,7 @@ static void remove_vma(struct vm_area_struct *vma, bool unreachable) - if (vma->vm_ops && vma->vm_ops->close) - vma->vm_ops->close(vma); +@@ -139,7 +139,7 @@ static void remove_vma(struct vm_area_struct *vma, bool unreachable) + might_sleep(); + vma_close(vma); if (vma->vm_file) - fput(vma->vm_file); + vma_fput(vma); mpol_put(vma_policy(vma)); if (unreachable) __vm_area_free(vma); -@@ -554,7 +554,7 @@ static inline void vma_complete(struct vma_prepare *vp, +@@ -553,7 +553,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); @@ -200,7 +200,7 @@ index 6530e9cac458..3a696f12c0f6 100644 } if (vp->remove->anon_vma) anon_vma_merge(vp->vma, vp->remove); -@@ -2392,7 +2392,7 @@ int __split_vma(struct vma_iterator *vmi, struct vm_area_struct *vma, +@@ -2391,7 +2391,7 @@ int __split_vma(struct vma_iterator *vmi, struct vm_area_struct *vma, goto out_free_mpol; if (new->vm_file) @@ -209,7 +209,7 @@ index 6530e9cac458..3a696f12c0f6 100644 if (new->vm_ops && new->vm_ops->open) new->vm_ops->open(new); -@@ -2809,7 +2809,7 @@ unsigned long mmap_region(struct file *file, unsigned long addr, +@@ -2810,7 +2810,7 @@ static unsigned long __mmap_region(struct file *file, unsigned long addr, * and cause general protection fault * ultimately. */ @@ -218,16 +218,16 @@ index 6530e9cac458..3a696f12c0f6 100644 vm_area_free(vma); vma = merge; /* Update vm_flags to pick up the change. */ -@@ -2904,7 +2904,7 @@ unsigned long mmap_region(struct file *file, unsigned long addr, +@@ -2887,7 +2887,7 @@ static unsigned long __mmap_region(struct file *file, unsigned long addr, + return addr; - if (file || vma->vm_file) { - unmap_and_free_vma: -- fput(vma->vm_file); -+ vma_fput(vma); - vma->vm_file = NULL; + unmap_and_free_file_vma: +- fput(vma->vm_file); ++ vma_fput(vma); + vma->vm_file = NULL; - vma_iter_set(&vmi, vma->vm_end); -@@ -2966,6 +2966,9 @@ SYSCALL_DEFINE5(remap_file_pages, unsigned long, start, unsigned long, size, + vma_iter_set(&vmi, vma->vm_end); +@@ -2981,6 +2981,9 @@ SYSCALL_DEFINE5(remap_file_pages, unsigned long, start, unsigned long, size, unsigned long populate = 0; unsigned long ret = -EINVAL; struct file *file; @@ -237,7 +237,7 @@ index 6530e9cac458..3a696f12c0f6 100644 pr_warn_once("%s (%d) uses deprecated remap_file_pages() syscall. See Documentation/mm/remap_file_pages.rst.\n", current->comm, current->pid); -@@ -3024,6 +3027,32 @@ SYSCALL_DEFINE5(remap_file_pages, unsigned long, start, unsigned long, size, +@@ -3039,6 +3042,32 @@ SYSCALL_DEFINE5(remap_file_pages, unsigned long, start, unsigned long, size, if (vma->vm_flags & VM_LOCKED) flags |= MAP_LOCKED; @@ -270,7 +270,7 @@ index 6530e9cac458..3a696f12c0f6 100644 file = get_file(vma->vm_file); ret = security_mmap_file(vma->vm_file, prot, flags); if (ret) -@@ -3032,6 +3061,7 @@ SYSCALL_DEFINE5(remap_file_pages, unsigned long, start, unsigned long, size, +@@ -3047,6 +3076,7 @@ SYSCALL_DEFINE5(remap_file_pages, unsigned long, start, unsigned long, size, prot, flags, 0, pgoff, &populate, NULL); out_fput: fput(file); @@ -278,7 +278,7 @@ index 6530e9cac458..3a696f12c0f6 100644 out: mmap_write_unlock(mm); if (populate) -@@ -3382,7 +3412,7 @@ struct vm_area_struct *copy_vma(struct vm_area_struct **vmap, +@@ -3397,7 +3427,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) @@ -287,8 +287,8 @@ index 6530e9cac458..3a696f12c0f6 100644 if (new_vma->vm_ops && new_vma->vm_ops->open) new_vma->vm_ops->open(new_vma); if (vma_link(mm, new_vma)) -@@ -3396,7 +3426,7 @@ struct vm_area_struct *copy_vma(struct vm_area_struct **vmap, - new_vma->vm_ops->close(new_vma); +@@ -3410,7 +3440,7 @@ struct vm_area_struct *copy_vma(struct vm_area_struct **vmap, + vma_close(new_vma); if (new_vma->vm_file) - fput(new_vma->vm_file); @@ -297,7 +297,7 @@ index 6530e9cac458..3a696f12c0f6 100644 unlink_anon_vmas(new_vma); out_free_mempol: diff --git a/mm/nommu.c b/mm/nommu.c -index 7f9e9e5a0e12..69663f2bd4c4 100644 +index f848d98e8997..a6f5ef257fd4 100644 --- a/mm/nommu.c +++ b/mm/nommu.c @@ -523,7 +523,7 @@ static void __put_nommu_region(struct vm_region *region) @@ -309,16 +309,16 @@ index 7f9e9e5a0e12..69663f2bd4c4 100644 /* IO memory and memory shared directly out of the pagecache * from ramfs/tmpfs mustn't be released here */ -@@ -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); +@@ -602,7 +602,7 @@ static void delete_vma(struct mm_struct *mm, struct vm_area_struct *vma) + { + vma_close(vma); if (vma->vm_file) - fput(vma->vm_file); + vma_fput(vma); put_nommu_region(vma->vm_region); vm_area_free(vma); } -@@ -1135,7 +1135,7 @@ unsigned long do_mmap(struct file *file, +@@ -1134,7 +1134,7 @@ unsigned long do_mmap(struct file *file, goto error_just_free; } } @@ -327,7 +327,7 @@ index 7f9e9e5a0e12..69663f2bd4c4 100644 kmem_cache_free(vm_region_jar, region); region = pregion; result = start; -@@ -1221,10 +1221,10 @@ unsigned long do_mmap(struct file *file, +@@ -1220,10 +1220,10 @@ unsigned long do_mmap(struct file *file, error: vma_iter_free(&vmi); if (region->vm_file) diff --git a/kernel/tools/cpupowertools/files/patches/aufs6/aufs6-standalone.patch b/kernel/tools/cpupowertools/files/patches/aufs6/aufs6-standalone.patch index dec98d35..db54abcb 100644 --- a/kernel/tools/cpupowertools/files/patches/aufs6/aufs6-standalone.patch +++ b/kernel/tools/cpupowertools/files/patches/aufs6/aufs6-standalone.patch @@ -1,5 +1,5 @@ SPDX-License-Identifier: GPL-2.0 -aufs6.6.54 standalone patch +aufs6.6.63 standalone patch diff --git a/fs/dcache.c b/fs/dcache.c index e2877ac9a1e6..f20b4ac29a1d 100644 @@ -22,7 +22,7 @@ index e2877ac9a1e6..f20b4ac29a1d 100644 /** * d_ancestor - search for an ancestor diff --git a/fs/exec.c b/fs/exec.c -index 1cbbef281f8c..d4f50eb57e67 100644 +index 7776209d98c1..372bbb606c38 100644 --- a/fs/exec.c +++ b/fs/exec.c @@ -112,6 +112,7 @@ bool path_noexec(const struct path *path) @@ -98,7 +98,7 @@ index 1de6631a3925..3008eb37a18d 100644 /* * Drop a reference to a group. Free it if it's through. diff --git a/fs/open.c b/fs/open.c -index 59db720693f9..523a714839aa 100644 +index f9ac703ec1b2..d5c83814332e 100644 --- a/fs/open.c +++ b/fs/open.c @@ -67,6 +67,7 @@ int do_truncate(struct mnt_idmap *idmap, struct dentry *dentry, @@ -166,10 +166,10 @@ index 64b9aedbe941..903a23230775 100644 #ifdef CONFIG_LOCK_STAT diff --git a/kernel/task_work.c b/kernel/task_work.c -index 2134ac8057a9..71150628e6b8 100644 +index c969f1f26be5..68eb672f425d 100644 --- a/kernel/task_work.c +++ b/kernel/task_work.c -@@ -207,3 +207,4 @@ void task_work_run(void) +@@ -242,3 +242,4 @@ void task_work_run(void) } while (work); } } diff --git a/kernel/tools/cpupowertools/files/patches/aufs6/aufs6.6.54-20241014.patch b/kernel/tools/cpupowertools/files/patches/aufs6/aufs6.6.63-20241202.patch similarity index 98% rename from kernel/tools/cpupowertools/files/patches/aufs6/aufs6.6.54-20241014.patch rename to kernel/tools/cpupowertools/files/patches/aufs6/aufs6.6.63-20241202.patch index 71e6bd85..1ea4751e 100644 --- a/kernel/tools/cpupowertools/files/patches/aufs6/aufs6.6.54-20241014.patch +++ b/kernel/tools/cpupowertools/files/patches/aufs6/aufs6.6.63-20241202.patch @@ -1,6 +1,6 @@ -diff -Naur null/Documentation/ABI/testing/debugfs-aufs linux-6.6.54/Documentation/ABI/testing/debugfs-aufs +diff -Naur null/Documentation/ABI/testing/debugfs-aufs linux-6.6.63/Documentation/ABI/testing/debugfs-aufs --- /dev/null -+++ linux-6.6.54/Documentation/ABI/testing/debugfs-aufs 2024-10-14 10:37:56.016536679 +0300 ++++ linux-6.6.63/Documentation/ABI/testing/debugfs-aufs 2024-12-18 15:12:59.290519651 +0300 @@ -0,0 +1,55 @@ +What: /debug/aufs/si_/ +Date: March 2009 @@ -57,9 +57,9 @@ diff -Naur null/Documentation/ABI/testing/debugfs-aufs linux-6.6.54/Documentatio + be created. + When the aufs mount option 'noxino' is specified, it + will be empty. About XINO files, see the aufs manual. -diff -Naur null/Documentation/ABI/testing/sysfs-aufs linux-6.6.54/Documentation/ABI/testing/sysfs-aufs +diff -Naur null/Documentation/ABI/testing/sysfs-aufs linux-6.6.63/Documentation/ABI/testing/sysfs-aufs --- /dev/null -+++ linux-6.6.54/Documentation/ABI/testing/sysfs-aufs 2024-10-14 10:37:56.016536679 +0300 ++++ linux-6.6.63/Documentation/ABI/testing/sysfs-aufs 2024-12-18 15:12:59.290519651 +0300 @@ -0,0 +1,31 @@ +What: /sys/fs/aufs/si_/ +Date: March 2009 @@ -92,9 +92,9 @@ diff -Naur null/Documentation/ABI/testing/sysfs-aufs linux-6.6.54/Documentation/ + even if it is the default path. + When the aufs mount option 'noxino' is specified, it + will be empty. About XINO files, see the aufs manual. -diff -Naur null/Documentation/filesystems/aufs/design/01intro.txt linux-6.6.54/Documentation/filesystems/aufs/design/01intro.txt +diff -Naur null/Documentation/filesystems/aufs/design/01intro.txt linux-6.6.63/Documentation/filesystems/aufs/design/01intro.txt --- /dev/null -+++ linux-6.6.54/Documentation/filesystems/aufs/design/01intro.txt 2024-10-14 10:37:56.016536679 +0300 ++++ linux-6.6.63/Documentation/filesystems/aufs/design/01intro.txt 2024-12-18 15:12:59.290519651 +0300 @@ -0,0 +1,171 @@ + +# Copyright (C) 2005-2022 Junjiro R. Okajima @@ -267,9 +267,9 @@ diff -Naur null/Documentation/filesystems/aufs/design/01intro.txt linux-6.6.54/D +Some people may think it is better to pass such work to user space +helper, instead of doing in kernel space. Actually I am still thinking +about it. But currently I have implemented it in kernel space. -diff -Naur null/Documentation/filesystems/aufs/design/02struct.txt linux-6.6.54/Documentation/filesystems/aufs/design/02struct.txt +diff -Naur null/Documentation/filesystems/aufs/design/02struct.txt linux-6.6.63/Documentation/filesystems/aufs/design/02struct.txt --- /dev/null -+++ linux-6.6.54/Documentation/filesystems/aufs/design/02struct.txt 2024-10-14 10:37:56.016536679 +0300 ++++ linux-6.6.63/Documentation/filesystems/aufs/design/02struct.txt 2024-12-18 15:12:59.291519638 +0300 @@ -0,0 +1,258 @@ + +# Copyright (C) 2005-2022 Junjiro R. Okajima @@ -529,9 +529,9 @@ diff -Naur null/Documentation/filesystems/aufs/design/02struct.txt linux-6.6.54/ +- etc. + +For this purpose, use "aumvdown" command in aufs-util.git. -diff -Naur null/Documentation/filesystems/aufs/design/03atomic_open.txt linux-6.6.54/Documentation/filesystems/aufs/design/03atomic_open.txt +diff -Naur null/Documentation/filesystems/aufs/design/03atomic_open.txt linux-6.6.63/Documentation/filesystems/aufs/design/03atomic_open.txt --- /dev/null -+++ linux-6.6.54/Documentation/filesystems/aufs/design/03atomic_open.txt 2024-10-14 10:37:56.016536679 +0300 ++++ linux-6.6.63/Documentation/filesystems/aufs/design/03atomic_open.txt 2024-12-18 15:12:59.291519638 +0300 @@ -0,0 +1,85 @@ + +# Copyright (C) 2015-2022 Junjiro R. Okajima @@ -618,9 +618,9 @@ diff -Naur null/Documentation/filesystems/aufs/design/03atomic_open.txt linux-6. + ->atomic_open() are lost. in the ordinary case, the checks are + done by VFS:do_last(), lookup_open() and atomic_open(). some can + be implemented in aufs, but not all I am afraid. -diff -Naur null/Documentation/filesystems/aufs/design/03lookup.txt linux-6.6.54/Documentation/filesystems/aufs/design/03lookup.txt +diff -Naur null/Documentation/filesystems/aufs/design/03lookup.txt linux-6.6.63/Documentation/filesystems/aufs/design/03lookup.txt --- /dev/null -+++ linux-6.6.54/Documentation/filesystems/aufs/design/03lookup.txt 2024-10-14 10:37:56.017536666 +0300 ++++ linux-6.6.63/Documentation/filesystems/aufs/design/03lookup.txt 2024-12-18 15:12:59.291519638 +0300 @@ -0,0 +1,113 @@ + +# Copyright (C) 2005-2022 Junjiro R. Okajima @@ -735,9 +735,9 @@ diff -Naur null/Documentation/filesystems/aufs/design/03lookup.txt linux-6.6.54/ + test, and skip the revalidation in step 4. It is useful and improves + aufs performance when system surely hide the aufs branches from user, + by over-mounting something (or another method). -diff -Naur null/Documentation/filesystems/aufs/design/04branch.txt linux-6.6.54/Documentation/filesystems/aufs/design/04branch.txt +diff -Naur null/Documentation/filesystems/aufs/design/04branch.txt linux-6.6.63/Documentation/filesystems/aufs/design/04branch.txt --- /dev/null -+++ linux-6.6.54/Documentation/filesystems/aufs/design/04branch.txt 2024-10-14 10:37:56.017536666 +0300 ++++ linux-6.6.63/Documentation/filesystems/aufs/design/04branch.txt 2024-12-18 15:12:59.291519638 +0300 @@ -0,0 +1,74 @@ + +# Copyright (C) 2005-2022 Junjiro R. Okajima @@ -813,9 +813,9 @@ diff -Naur null/Documentation/filesystems/aufs/design/04branch.txt linux-6.6.54/ + - a file on the branch is mmap-ed. + - a regular file on the branch is opened for write and there is no + same named entry on the upper branch. -diff -Naur null/Documentation/filesystems/aufs/design/05wbr_policy.txt linux-6.6.54/Documentation/filesystems/aufs/design/05wbr_policy.txt +diff -Naur null/Documentation/filesystems/aufs/design/05wbr_policy.txt linux-6.6.63/Documentation/filesystems/aufs/design/05wbr_policy.txt --- /dev/null -+++ linux-6.6.54/Documentation/filesystems/aufs/design/05wbr_policy.txt 2024-10-14 10:37:56.017536666 +0300 ++++ linux-6.6.63/Documentation/filesystems/aufs/design/05wbr_policy.txt 2024-12-18 15:12:59.291519638 +0300 @@ -0,0 +1,64 @@ + +# Copyright (C) 2005-2022 Junjiro R. Okajima @@ -881,9 +881,9 @@ diff -Naur null/Documentation/filesystems/aufs/design/05wbr_policy.txt linux-6.6 + where the source and the target exists and selects the higher + one. If the selected branch is readonly, then aufs follows the + copyup policy. -diff -Naur null/Documentation/filesystems/aufs/design/06dirren.dot linux-6.6.54/Documentation/filesystems/aufs/design/06dirren.dot +diff -Naur null/Documentation/filesystems/aufs/design/06dirren.dot linux-6.6.63/Documentation/filesystems/aufs/design/06dirren.dot --- /dev/null -+++ linux-6.6.54/Documentation/filesystems/aufs/design/06dirren.dot 2024-10-14 10:37:56.017536666 +0300 ++++ linux-6.6.63/Documentation/filesystems/aufs/design/06dirren.dot 2024-12-18 15:12:59.291519638 +0300 @@ -0,0 +1,44 @@ + +// to view this graph, run dot(1) command in GRAPHVIZ. @@ -929,9 +929,9 @@ diff -Naur null/Documentation/filesystems/aufs/design/06dirren.dot linux-6.6.54/ + +aufs_lookup -> whinfo [label="load/remove"]; +} -diff -Naur null/Documentation/filesystems/aufs/design/06dirren.txt linux-6.6.54/Documentation/filesystems/aufs/design/06dirren.txt +diff -Naur null/Documentation/filesystems/aufs/design/06dirren.txt linux-6.6.63/Documentation/filesystems/aufs/design/06dirren.txt --- /dev/null -+++ linux-6.6.54/Documentation/filesystems/aufs/design/06dirren.txt 2024-10-14 10:37:56.017536666 +0300 ++++ linux-6.6.63/Documentation/filesystems/aufs/design/06dirren.txt 2024-12-18 15:12:59.291519638 +0300 @@ -0,0 +1,102 @@ + +# Copyright (C) 2017-2022 Junjiro R. Okajima @@ -1035,9 +1035,9 @@ diff -Naur null/Documentation/filesystems/aufs/design/06dirren.txt linux-6.6.54/ +contains two names, before- and after-rename, the name comparision in +UDBA handler may not work correctly. In this case, the behaviour will be +equivalen to udba=reval case. -diff -Naur null/Documentation/filesystems/aufs/design/06fhsm.txt linux-6.6.54/Documentation/filesystems/aufs/design/06fhsm.txt +diff -Naur null/Documentation/filesystems/aufs/design/06fhsm.txt linux-6.6.63/Documentation/filesystems/aufs/design/06fhsm.txt --- /dev/null -+++ linux-6.6.54/Documentation/filesystems/aufs/design/06fhsm.txt 2024-10-14 10:37:56.017536666 +0300 ++++ linux-6.6.63/Documentation/filesystems/aufs/design/06fhsm.txt 2024-12-18 15:12:59.291519638 +0300 @@ -0,0 +1,118 @@ + +# Copyright (C) 2011-2022 Junjiro R. Okajima @@ -1157,9 +1157,9 @@ diff -Naur null/Documentation/filesystems/aufs/design/06fhsm.txt linux-6.6.54/Do + +And of course, in every step, an error may happen. So the operation +should restore the original file state after an error happens. -diff -Naur null/Documentation/filesystems/aufs/design/06mmap.txt linux-6.6.54/Documentation/filesystems/aufs/design/06mmap.txt +diff -Naur null/Documentation/filesystems/aufs/design/06mmap.txt linux-6.6.63/Documentation/filesystems/aufs/design/06mmap.txt --- /dev/null -+++ linux-6.6.54/Documentation/filesystems/aufs/design/06mmap.txt 2024-10-14 10:37:56.017536666 +0300 ++++ linux-6.6.63/Documentation/filesystems/aufs/design/06mmap.txt 2024-12-18 15:12:59.291519638 +0300 @@ -0,0 +1,72 @@ + +# Copyright (C) 2005-2022 Junjiro R. Okajima @@ -1233,9 +1233,9 @@ diff -Naur null/Documentation/filesystems/aufs/design/06mmap.txt linux-6.6.54/Do + equivalent to vm_prfile described above. + +I have to give up this "looks-smater" approach. -diff -Naur null/Documentation/filesystems/aufs/design/06xattr.txt linux-6.6.54/Documentation/filesystems/aufs/design/06xattr.txt +diff -Naur null/Documentation/filesystems/aufs/design/06xattr.txt linux-6.6.63/Documentation/filesystems/aufs/design/06xattr.txt --- /dev/null -+++ linux-6.6.54/Documentation/filesystems/aufs/design/06xattr.txt 2024-10-14 10:37:56.017536666 +0300 ++++ linux-6.6.63/Documentation/filesystems/aufs/design/06xattr.txt 2024-12-18 15:12:59.291519638 +0300 @@ -0,0 +1,94 @@ + +# Copyright (C) 2014-2022 Junjiro R. Okajima @@ -1331,9 +1331,9 @@ diff -Naur null/Documentation/filesystems/aufs/design/06xattr.txt linux-6.6.54/D +Some contradiction may happen I am afraid. +Do we need another attribute to stop copying XATTR? I am unsure. For +now, aufs implements the branch attributes to ignore the error. -diff -Naur null/Documentation/filesystems/aufs/design/07export.txt linux-6.6.54/Documentation/filesystems/aufs/design/07export.txt +diff -Naur null/Documentation/filesystems/aufs/design/07export.txt linux-6.6.63/Documentation/filesystems/aufs/design/07export.txt --- /dev/null -+++ linux-6.6.54/Documentation/filesystems/aufs/design/07export.txt 2024-10-14 10:37:56.017536666 +0300 ++++ linux-6.6.63/Documentation/filesystems/aufs/design/07export.txt 2024-12-18 15:12:59.291519638 +0300 @@ -0,0 +1,58 @@ + +# Copyright (C) 2005-2022 Junjiro R. Okajima @@ -1393,9 +1393,9 @@ diff -Naur null/Documentation/filesystems/aufs/design/07export.txt linux-6.6.54/ + convert it into ESTALE for NFSD. +- readdir(): call lockdep_on/off() because filldir in NFSD calls + lookup_one_len(), vfs_getattr(), encode_fh() and others. -diff -Naur null/Documentation/filesystems/aufs/design/08shwh.txt linux-6.6.54/Documentation/filesystems/aufs/design/08shwh.txt +diff -Naur null/Documentation/filesystems/aufs/design/08shwh.txt linux-6.6.63/Documentation/filesystems/aufs/design/08shwh.txt --- /dev/null -+++ linux-6.6.54/Documentation/filesystems/aufs/design/08shwh.txt 2024-10-14 10:37:56.017536666 +0300 ++++ linux-6.6.63/Documentation/filesystems/aufs/design/08shwh.txt 2024-12-18 15:12:59.291519638 +0300 @@ -0,0 +1,52 @@ + +# Copyright (C) 2005-2022 Junjiro R. Okajima @@ -1449,9 +1449,9 @@ diff -Naur null/Documentation/filesystems/aufs/design/08shwh.txt linux-6.6.54/Do + +This new squashfs archive can be stored on the boot device and the +initramfs will use it to replace the old one at the next boot. -diff -Naur null/Documentation/filesystems/aufs/design/10dynop.txt linux-6.6.54/Documentation/filesystems/aufs/design/10dynop.txt +diff -Naur null/Documentation/filesystems/aufs/design/10dynop.txt linux-6.6.63/Documentation/filesystems/aufs/design/10dynop.txt --- /dev/null -+++ linux-6.6.54/Documentation/filesystems/aufs/design/10dynop.txt 2024-10-14 10:37:56.017536666 +0300 ++++ linux-6.6.63/Documentation/filesystems/aufs/design/10dynop.txt 2024-12-18 15:12:59.291519638 +0300 @@ -0,0 +1,47 @@ + +# Copyright (C) 2010-2022 Junjiro R. Okajima @@ -1500,9 +1500,9 @@ diff -Naur null/Documentation/filesystems/aufs/design/10dynop.txt linux-6.6.54/D +XIP (DAX) mainly. +Currently this approach is applied to address_space_operations for +regular files only. -diff -Naur null/Documentation/filesystems/aufs/README linux-6.6.54/Documentation/filesystems/aufs/README +diff -Naur null/Documentation/filesystems/aufs/README linux-6.6.63/Documentation/filesystems/aufs/README --- /dev/null -+++ linux-6.6.54/Documentation/filesystems/aufs/README 2024-10-14 10:37:56.016536679 +0300 ++++ linux-6.6.63/Documentation/filesystems/aufs/README 2024-12-18 15:12:59.290519651 +0300 @@ -0,0 +1,409 @@ + +Aufs6 -- advanced multi layered unification filesystem version 6.x @@ -1913,9 +1913,9 @@ diff -Naur null/Documentation/filesystems/aufs/README linux-6.6.54/Documentation +# Local variables: ; +# mode: text; +# End: ; -diff -Naur null/fs/aufs/aufs.h linux-6.6.54/fs/aufs/aufs.h +diff -Naur null/fs/aufs/aufs.h linux-6.6.63/fs/aufs/aufs.h --- /dev/null -+++ linux-6.6.54/fs/aufs/aufs.h 2024-10-14 10:37:56.019536641 +0300 ++++ linux-6.6.63/fs/aufs/aufs.h 2024-12-18 15:12:59.293519613 +0300 @@ -0,0 +1,62 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* @@ -1979,9 +1979,9 @@ diff -Naur null/fs/aufs/aufs.h linux-6.6.54/fs/aufs/aufs.h + +#endif /* __KERNEL__ */ +#endif /* __AUFS_H__ */ -diff -Naur null/fs/aufs/branch.c linux-6.6.54/fs/aufs/branch.c +diff -Naur null/fs/aufs/branch.c linux-6.6.63/fs/aufs/branch.c --- /dev/null -+++ linux-6.6.54/fs/aufs/branch.c 2024-10-14 10:37:56.019536641 +0300 ++++ linux-6.6.63/fs/aufs/branch.c 2024-12-18 15:12:59.293519613 +0300 @@ -0,0 +1,1427 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -2228,7 +2228,7 @@ diff -Naur null/fs/aufs/branch.c linux-6.6.54/fs/aufs/branch.c + + inode = d_inode(add->path.dentry); + err = -ENOENT; -+ if (unlikely(!inode->i_nlink)) { ++ if (unlikely(!vfsub_inode_nlink(inode, AU_I_UNKNOWN))) { + pr_err("no existence %s\n", add->pathname); + goto out; + } @@ -3410,9 +3410,9 @@ diff -Naur null/fs/aufs/branch.c linux-6.6.54/fs/aufs/branch.c + + return err; +} -diff -Naur null/fs/aufs/branch.h linux-6.6.54/fs/aufs/branch.h +diff -Naur null/fs/aufs/branch.h linux-6.6.63/fs/aufs/branch.h --- /dev/null -+++ linux-6.6.54/fs/aufs/branch.h 2024-10-14 10:37:56.019536641 +0300 ++++ linux-6.6.63/fs/aufs/branch.h 2024-12-18 15:12:59.293519613 +0300 @@ -0,0 +1,375 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* @@ -3789,9 +3789,9 @@ diff -Naur null/fs/aufs/branch.h linux-6.6.54/fs/aufs/branch.h + +#endif /* __KERNEL__ */ +#endif /* __AUFS_BRANCH_H__ */ -diff -Naur null/fs/aufs/conf.mk linux-6.6.54/fs/aufs/conf.mk +diff -Naur null/fs/aufs/conf.mk linux-6.6.63/fs/aufs/conf.mk --- /dev/null -+++ linux-6.6.54/fs/aufs/conf.mk 2024-10-14 10:37:56.019536641 +0300 ++++ linux-6.6.63/fs/aufs/conf.mk 2024-12-18 15:12:59.293519613 +0300 @@ -0,0 +1,40 @@ +# SPDX-License-Identifier: GPL-2.0 + @@ -3833,10 +3833,10 @@ diff -Naur null/fs/aufs/conf.mk linux-6.6.54/fs/aufs/conf.mk +${obj}/sysfs.o: ${AuConfName} + +-include ${srctree}/${src}/conf_priv.mk -diff -Naur null/fs/aufs/cpup.c linux-6.6.54/fs/aufs/cpup.c +diff -Naur null/fs/aufs/cpup.c linux-6.6.63/fs/aufs/cpup.c --- /dev/null -+++ linux-6.6.54/fs/aufs/cpup.c 2024-10-14 10:37:56.019536641 +0300 -@@ -0,0 +1,1459 @@ ++++ linux-6.6.63/fs/aufs/cpup.c 2024-12-18 15:12:59.293519613 +0300 +@@ -0,0 +1,1458 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) 2005-2022 Junjiro R. Okajima @@ -3908,7 +3908,7 @@ diff -Naur null/fs/aufs/cpup.c linux-6.6.54/fs/aufs/cpup.c + * todo: O_TMPFILE+linkat(AT_SYMLINK_FOLLOW) bypassing aufs may cause + * the incorrect link count. + */ -+ set_nlink(inode, h_inode->i_nlink); ++ vfsub_set_nlink(inode, vfsub_inode_nlink(h_inode, AU_I_BRANCH)); + + /* + * fewer nlink makes find(1) noisy, but larger nlink doesn't. @@ -3952,8 +3952,7 @@ diff -Naur null/fs/aufs/cpup.c linux-6.6.54/fs/aufs/cpup.c + + h_inode = au_h_iptr(inode, au_ibtop(inode)); + au_cpup_attr_changeable(inode); -+ if (inode->i_nlink > 0) -+ au_cpup_attr_nlink(inode, force); ++ au_cpup_attr_nlink(inode, force); + inode->i_rdev = h_inode->i_rdev; + inode->i_blkbits = h_inode->i_blkbits; + au_cpup_igen(inode, h_inode); @@ -4382,7 +4381,7 @@ diff -Naur null/fs/aufs/cpup.c linux-6.6.54/fs/aufs/cpup.c + goto out; + } + h_src_attr->valid = 1; -+ if (!au_test_nfs(h_src_inode->i_sb)) { ++ if (!au_test_fs_unlock_for_open(h_src_inode->i_sb)) { + err = au_cp_regular(cpg); + inode_unlock_shared(h_src_inode); + } else { @@ -4556,7 +4555,7 @@ diff -Naur null/fs/aufs/cpup.c linux-6.6.54/fs/aufs/cpup.c + if (!au_opt_test(mnt_flags, UDBA_NONE) + && !isdir + && au_opt_test(mnt_flags, XINO) -+ && (h_inode->i_nlink == 1 ++ && (vfsub_inode_nlink(h_inode, AU_I_BRANCH) == 1 + || (h_inode->i_state & I_LINKABLE)) + /* todo: unnecessary? */ + /* && d_inode(cpg->dentry)->i_nlink == 1 */ @@ -4683,7 +4682,7 @@ diff -Naur null/fs/aufs/cpup.c linux-6.6.54/fs/aufs/cpup.c + goto out_parent; + } + -+ if (dst_inode->i_nlink) { ++ if (vfsub_inode_nlink(dst_inode, AU_I_BRANCH)) { + const int do_dt = au_ftest_cpup(cpg->flags, DTIME); + + h_src = au_plink_lkup(inode, cpg->bdst); @@ -4768,7 +4767,7 @@ diff -Naur null/fs/aufs/cpup.c linux-6.6.54/fs/aufs/cpup.c + + src_inode = d_inode(h_src); + if (!isdir -+ && (src_inode->i_nlink > 1 ++ && (vfsub_inode_nlink(src_inode, AU_I_BRANCH) > 1 + || src_inode->i_state & I_LINKABLE) + && plink) + au_plink_append(inode, cpg->bdst, h_dst); @@ -5134,7 +5133,7 @@ diff -Naur null/fs/aufs/cpup.c linux-6.6.54/fs/aufs/cpup.c + h_dir = au_igrab(au_h_iptr(dir, bdst)); + h_tmpdir = h_dir; + pin_orig = NULL; -+ if (!h_dir->i_nlink) { ++ if (!vfsub_inode_nlink(h_dir, AU_I_BRANCH)) { + wbr = au_sbr(dentry->d_sb, bdst)->br_wbr; + h_orph = wbr->wbr_orph; + @@ -5296,9 +5295,9 @@ diff -Naur null/fs/aufs/cpup.c linux-6.6.54/fs/aufs/cpup.c + dput(parent); + return err; +} -diff -Naur null/fs/aufs/cpup.h linux-6.6.54/fs/aufs/cpup.h +diff -Naur null/fs/aufs/cpup.h linux-6.6.63/fs/aufs/cpup.h --- /dev/null -+++ linux-6.6.54/fs/aufs/cpup.h 2024-10-14 10:37:56.019536641 +0300 ++++ linux-6.6.63/fs/aufs/cpup.h 2024-12-18 15:12:59.293519613 +0300 @@ -0,0 +1,100 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* @@ -5400,9 +5399,9 @@ diff -Naur null/fs/aufs/cpup.h linux-6.6.54/fs/aufs/cpup.h + +#endif /* __KERNEL__ */ +#endif /* __AUFS_CPUP_H__ */ -diff -Naur null/fs/aufs/dbgaufs.c linux-6.6.54/fs/aufs/dbgaufs.c +diff -Naur null/fs/aufs/dbgaufs.c linux-6.6.63/fs/aufs/dbgaufs.c --- /dev/null -+++ linux-6.6.54/fs/aufs/dbgaufs.c 2024-10-14 10:37:56.019536641 +0300 ++++ linux-6.6.63/fs/aufs/dbgaufs.c 2024-12-18 15:12:59.293519613 +0300 @@ -0,0 +1,526 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -5930,9 +5929,9 @@ diff -Naur null/fs/aufs/dbgaufs.c linux-6.6.54/fs/aufs/dbgaufs.c + err = 0; + return err; +} -diff -Naur null/fs/aufs/dbgaufs.h linux-6.6.54/fs/aufs/dbgaufs.h +diff -Naur null/fs/aufs/dbgaufs.h linux-6.6.63/fs/aufs/dbgaufs.h --- /dev/null -+++ linux-6.6.54/fs/aufs/dbgaufs.h 2024-10-14 10:37:56.020536629 +0300 ++++ linux-6.6.63/fs/aufs/dbgaufs.h 2024-12-18 15:12:59.294519601 +0300 @@ -0,0 +1,53 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* @@ -5987,9 +5986,9 @@ diff -Naur null/fs/aufs/dbgaufs.h linux-6.6.54/fs/aufs/dbgaufs.h + +#endif /* __KERNEL__ */ +#endif /* __DBGAUFS_H__ */ -diff -Naur null/fs/aufs/dcsub.c linux-6.6.54/fs/aufs/dcsub.c +diff -Naur null/fs/aufs/dcsub.c linux-6.6.63/fs/aufs/dcsub.c --- /dev/null -+++ linux-6.6.54/fs/aufs/dcsub.c 2024-10-14 10:37:56.020536629 +0300 ++++ linux-6.6.63/fs/aufs/dcsub.c 2024-12-18 15:12:59.294519601 +0300 @@ -0,0 +1,225 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -6216,10 +6215,10 @@ diff -Naur null/fs/aufs/dcsub.c linux-6.6.54/fs/aufs/dcsub.c + + return path_is_under(path + 0, path + 1); +} -diff -Naur null/fs/aufs/dcsub.h linux-6.6.54/fs/aufs/dcsub.h +diff -Naur null/fs/aufs/dcsub.h linux-6.6.63/fs/aufs/dcsub.h --- /dev/null -+++ linux-6.6.54/fs/aufs/dcsub.h 2024-10-14 10:37:56.020536629 +0300 -@@ -0,0 +1,137 @@ ++++ linux-6.6.63/fs/aufs/dcsub.h 2024-12-18 15:12:59.294519601 +0300 +@@ -0,0 +1,139 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Copyright (C) 2005-2022 Junjiro R. Okajima @@ -6249,6 +6248,7 @@ diff -Naur null/fs/aufs/dcsub.h linux-6.6.54/fs/aufs/dcsub.h + +#include +#include ++#include "vfsub.h" + +struct au_dpage { + int ndentry; @@ -6289,7 +6289,8 @@ diff -Naur null/fs/aufs/dcsub.h linux-6.6.54/fs/aufs/dcsub.h + err = 0; + if (unlikely(d_unhashed(d) + || d_is_negative(d) -+ || !inode->i_nlink)) ++ /* to support both aufs and branches */ ++ || !vfsub_inode_nlink(inode, AU_I_UNKNOWN))) + err = -ENOENT; + return err; +} @@ -6319,7 +6320,7 @@ diff -Naur null/fs/aufs/dcsub.h linux-6.6.54/fs/aufs/dcsub.h + inode = d_inode(d); + if (unlikely(d_unlinked(d) + || d_is_negative(d) -+ || !inode->i_nlink)) ++ || !vfsub_inode_nlink(inode, AU_I_UNKNOWN))) + err = -ENOENT; + } + return err; @@ -6357,10 +6358,10 @@ diff -Naur null/fs/aufs/dcsub.h linux-6.6.54/fs/aufs/dcsub.h + +#endif /* __KERNEL__ */ +#endif /* __AUFS_DCSUB_H__ */ -diff -Naur null/fs/aufs/debug.c linux-6.6.54/fs/aufs/debug.c +diff -Naur null/fs/aufs/debug.c linux-6.6.63/fs/aufs/debug.c --- /dev/null -+++ linux-6.6.54/fs/aufs/debug.c 2024-10-14 10:37:56.020536629 +0300 -@@ -0,0 +1,448 @@ ++++ linux-6.6.63/fs/aufs/debug.c 2024-12-18 15:12:59.294519601 +0300 +@@ -0,0 +1,449 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) 2005-2022 Junjiro R. Okajima @@ -6496,7 +6497,8 @@ diff -Naur null/fs/aufs/debug.c linux-6.6.54/fs/aufs/debug.c + " hn %d, ct %lld, np %lu, st 0x%lx, f 0x%x, v %llu, g %x%s%.*s\n", + bindex, inode, + inode->i_ino, inode->i_sb ? au_sbtype(inode->i_sb) : "??", -+ atomic_read(&inode->i_count), inode->i_nlink, inode->i_mode, ++ atomic_read(&inode->i_count), ++ vfsub_inode_nlink(inode, AU_I_UNKNOWN), 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(&ctime) & 0x0ffff, @@ -6809,9 +6811,9 @@ diff -Naur null/fs/aufs/debug.c linux-6.6.54/fs/aufs/debug.c + + return 0; +} -diff -Naur null/fs/aufs/debug.h linux-6.6.54/fs/aufs/debug.h +diff -Naur null/fs/aufs/debug.h linux-6.6.63/fs/aufs/debug.h --- /dev/null -+++ linux-6.6.54/fs/aufs/debug.h 2024-10-14 10:37:56.020536629 +0300 ++++ linux-6.6.63/fs/aufs/debug.h 2024-12-18 15:12:59.294519601 +0300 @@ -0,0 +1,226 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* @@ -6864,7 +6866,7 @@ diff -Naur null/fs/aufs/debug.h linux-6.6.54/fs/aufs/debug.h + return atomic_read(&aufs_debug) > 0; +} +#else -+#define AuDebugOn(a) do {} while (0) ++AuStubVoid(AuDebugOn, bool expr __maybe_unused) +AuStubVoid(au_debug_on, void) +AuStubVoid(au_debug_off, void) +AuStubInt0(au_debug_test, void) @@ -6923,14 +6925,14 @@ diff -Naur null/fs/aufs/debug.h linux-6.6.54/fs/aufs/debug.h +/* ---------------------------------------------------------------------- */ + +struct dentry; ++struct inode; ++struct au_nhash; ++struct au_vdir; +#ifdef CONFIG_AUFS_DEBUG +extern struct mutex au_dbg_mtx; +extern char *au_plevel; -+struct au_nhash; +void au_dpri_whlist(struct au_nhash *whlist); -+struct au_vdir; +void au_dpri_vdir(struct au_vdir *vdir); -+struct inode; +void au_dpri_inode(struct inode *inode); +void au_dpri_dalias(struct inode *inode); +void au_dpri_dentry(struct dentry *dentry); @@ -7039,10 +7041,10 @@ diff -Naur null/fs/aufs/debug.h linux-6.6.54/fs/aufs/debug.h + +#endif /* __KERNEL__ */ +#endif /* __AUFS_DEBUG_H__ */ -diff -Naur null/fs/aufs/dentry.c linux-6.6.54/fs/aufs/dentry.c +diff -Naur null/fs/aufs/dentry.c linux-6.6.63/fs/aufs/dentry.c --- /dev/null -+++ linux-6.6.54/fs/aufs/dentry.c 2024-10-14 10:37:56.020536629 +0300 -@@ -0,0 +1,1175 @@ ++++ linux-6.6.63/fs/aufs/dentry.c 2024-12-18 15:12:59.294519601 +0300 +@@ -0,0 +1,1176 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) 2005-2022 Junjiro R. Okajima @@ -7551,10 +7553,11 @@ diff -Naur null/fs/aufs/dentry.c linux-6.6.54/fs/aufs/dentry.c + if (d_really_is_positive(dentry)) { + inode = d_inode(dentry); + if (!d_is_dir(dentry)) { -+ if (inode->i_nlink && !d_unhashed(dentry)) -+ drop_nlink(inode); ++ if (vfsub_inode_nlink(inode, AU_I_AUFS) ++ && !d_unhashed(dentry)) ++ vfsub_drop_nlink(inode); + } else { -+ clear_nlink(inode); ++ vfsub_clear_nlink(inode); + /* stop next lookup */ + inode->i_flags |= S_DEAD; + } @@ -7934,7 +7937,7 @@ diff -Naur null/fs/aufs/dentry.c linux-6.6.54/fs/aufs/dentry.c + */ + if (do_udba && inode) { + mode = (inode->i_mode & S_IFMT); -+ plus = (inode->i_nlink > 0); ++ plus = (vfsub_inode_nlink(inode, AU_I_AUFS) > 0); + ibs = au_ibtop(inode); + ibe = au_ibbot(inode); + } @@ -8002,7 +8005,7 @@ diff -Naur null/fs/aufs/dentry.c linux-6.6.54/fs/aufs/dentry.c + h_cached_inode = h_inode; + if (h_inode && bindex != bwh) { + h_mode = (h_inode->i_mode & S_IFMT); -+ h_plus = (h_inode->i_nlink > 0); ++ h_plus = (vfsub_inode_nlink(h_inode, AU_I_BRANCH) > 0); + } + if (inode && ibs <= bindex && bindex <= ibe) + h_cached_inode = au_h_iptr(inode, bindex); @@ -8158,7 +8161,7 @@ diff -Naur null/fs/aufs/dentry.c linux-6.6.54/fs/aufs/dentry.c + if (!(flags & (LOOKUP_OPEN | LOOKUP_EMPTY)) + && inode + && !(inode->i_state && I_LINKABLE) -+ && (IS_DEADDIR(inode) || !inode->i_nlink)) { ++ && (IS_DEADDIR(inode) || !vfsub_inode_nlink(inode, AU_I_AUFS))) { + AuTraceErr(err); + goto out_inval; + } @@ -8218,9 +8221,9 @@ diff -Naur null/fs/aufs/dentry.c linux-6.6.54/fs/aufs/dentry.c +const struct dentry_operations aufs_dop_noreval = { + .d_release = aufs_d_release +}; -diff -Naur null/fs/aufs/dentry.h linux-6.6.54/fs/aufs/dentry.h +diff -Naur null/fs/aufs/dentry.h linux-6.6.63/fs/aufs/dentry.h --- /dev/null -+++ linux-6.6.54/fs/aufs/dentry.h 2024-10-14 10:37:56.020536629 +0300 ++++ linux-6.6.63/fs/aufs/dentry.h 2024-12-18 15:12:59.294519601 +0300 @@ -0,0 +1,270 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* @@ -8492,9 +8495,9 @@ diff -Naur null/fs/aufs/dentry.h linux-6.6.54/fs/aufs/dentry.h + +#endif /* __KERNEL__ */ +#endif /* __AUFS_DENTRY_H__ */ -diff -Naur null/fs/aufs/dinfo.c linux-6.6.54/fs/aufs/dinfo.c +diff -Naur null/fs/aufs/dinfo.c linux-6.6.63/fs/aufs/dinfo.c --- /dev/null -+++ linux-6.6.54/fs/aufs/dinfo.c 2024-10-14 10:37:56.020536629 +0300 ++++ linux-6.6.63/fs/aufs/dinfo.c 2024-12-18 15:12:59.294519601 +0300 @@ -0,0 +1,555 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -9051,9 +9054,9 @@ diff -Naur null/fs/aufs/dinfo.c linux-6.6.54/fs/aufs/dinfo.c + return bindex; + return -1; +} -diff -Naur null/fs/aufs/dir.c linux-6.6.54/fs/aufs/dir.c +diff -Naur null/fs/aufs/dir.c linux-6.6.63/fs/aufs/dir.c --- /dev/null -+++ linux-6.6.54/fs/aufs/dir.c 2024-10-14 10:37:56.020536629 +0300 ++++ linux-6.6.63/fs/aufs/dir.c 2024-12-18 15:12:59.294519601 +0300 @@ -0,0 +1,765 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -9083,32 +9086,32 @@ diff -Naur null/fs/aufs/dir.c linux-6.6.54/fs/aufs/dir.c + +void au_add_nlink(struct inode *dir, struct inode *h_dir) +{ -+ unsigned int nlink; ++ unsigned int nlink, h_nlink; + + AuDebugOn(!S_ISDIR(dir->i_mode) || !S_ISDIR(h_dir->i_mode)); + -+ nlink = dir->i_nlink; -+ nlink += h_dir->i_nlink - 2; -+ if (h_dir->i_nlink < 2) ++ nlink = vfsub_inode_nlink(dir, AU_I_AUFS); ++ h_nlink = vfsub_inode_nlink(h_dir, AU_I_BRANCH); ++ nlink += h_nlink - 2; ++ if (h_nlink < 2) + nlink += 2; -+ smp_mb(); /* for i_nlink */ + /* 0 can happen in revaliding */ -+ set_nlink(dir, nlink); ++ vfsub_set_nlink(dir, nlink); +} + +void au_sub_nlink(struct inode *dir, struct inode *h_dir) +{ -+ unsigned int nlink; ++ unsigned int nlink, h_nlink; + + AuDebugOn(!S_ISDIR(dir->i_mode) || !S_ISDIR(h_dir->i_mode)); + -+ nlink = dir->i_nlink; -+ nlink -= h_dir->i_nlink - 2; -+ if (h_dir->i_nlink < 2) ++ nlink = vfsub_inode_nlink(dir, AU_I_AUFS); ++ h_nlink = vfsub_inode_nlink(h_dir, AU_I_BRANCH); ++ nlink -= h_nlink - 2; ++ if (h_nlink < 2) + nlink -= 2; -+ smp_mb(); /* for i_nlink */ + /* nlink == 0 means the branch-fs is broken */ -+ set_nlink(dir, nlink); ++ vfsub_set_nlink(dir, nlink); +} + +loff_t au_dir_size(struct file *file, struct dentry *dentry) @@ -9201,7 +9204,7 @@ diff -Naur null/fs/aufs/dir.c linux-6.6.54/fs/aufs/dir.c + hdir = au_hi(dir, btop); + au_hn_inode_lock_nested(hdir, AuLsc_I_PARENT); + h_dir = au_h_iptr(dir, btop); -+ if (h_dir->i_nlink ++ if (vfsub_inode_nlink(h_dir, AU_I_BRANCH) + && timespec64_compare(&h_dir->i_mtime, &dt.dt_mtime) < 0) { + dt.dt_h_path = h_path; + au_dtime_revert(&dt); @@ -9657,7 +9660,7 @@ diff -Naur null/fs/aufs/dir.c linux-6.6.54/fs/aufs/dir.c + + err = 0; + if (!au_opt_test(au_mntflags(dentry->d_sb), UDBA_NONE) -+ && !file_inode(h_file)->i_nlink) ++ && !vfsub_inode_nlink(file_inode(h_file), AU_I_BRANCH)) + goto out_put; + + do { @@ -9820,9 +9823,9 @@ diff -Naur null/fs/aufs/dir.c linux-6.6.54/fs/aufs/dir.c + .flush = aufs_flush_dir, + .fsync = aufs_fsync_dir +}; -diff -Naur null/fs/aufs/dir.h linux-6.6.54/fs/aufs/dir.h +diff -Naur null/fs/aufs/dir.h linux-6.6.63/fs/aufs/dir.h --- /dev/null -+++ linux-6.6.54/fs/aufs/dir.h 2024-10-14 10:37:56.021536616 +0300 ++++ linux-6.6.63/fs/aufs/dir.h 2024-12-18 15:12:59.295519588 +0300 @@ -0,0 +1,134 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* @@ -9958,9 +9961,9 @@ diff -Naur null/fs/aufs/dir.h linux-6.6.54/fs/aufs/dir.h + +#endif /* __KERNEL__ */ +#endif /* __AUFS_DIR_H__ */ -diff -Naur null/fs/aufs/dirren.c linux-6.6.54/fs/aufs/dirren.c +diff -Naur null/fs/aufs/dirren.c linux-6.6.63/fs/aufs/dirren.c --- /dev/null -+++ linux-6.6.54/fs/aufs/dirren.c 2024-10-14 10:37:56.021536616 +0300 ++++ linux-6.6.63/fs/aufs/dirren.c 2024-12-18 15:12:59.295519588 +0300 @@ -0,0 +1,1315 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -11277,9 +11280,9 @@ diff -Naur null/fs/aufs/dirren.c linux-6.6.54/fs/aufs/dirren.c +out: + return err; +} -diff -Naur null/fs/aufs/dirren.h linux-6.6.54/fs/aufs/dirren.h +diff -Naur null/fs/aufs/dirren.h linux-6.6.63/fs/aufs/dirren.h --- /dev/null -+++ linux-6.6.54/fs/aufs/dirren.h 2024-10-14 10:37:56.021536616 +0300 ++++ linux-6.6.63/fs/aufs/dirren.h 2024-12-18 15:12:59.295519588 +0300 @@ -0,0 +1,140 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* @@ -11421,10 +11424,10 @@ diff -Naur null/fs/aufs/dirren.h linux-6.6.54/fs/aufs/dirren.h + +#endif /* __KERNEL__ */ +#endif /* __AUFS_DIRREN_H__ */ -diff -Naur null/fs/aufs/dynop.c linux-6.6.54/fs/aufs/dynop.c +diff -Naur null/fs/aufs/dynop.c linux-6.6.63/fs/aufs/dynop.c --- /dev/null -+++ linux-6.6.54/fs/aufs/dynop.c 2024-10-14 10:37:56.021536616 +0300 -@@ -0,0 +1,366 @@ ++++ linux-6.6.63/fs/aufs/dynop.c 2024-12-18 15:12:59.295519588 +0300 +@@ -0,0 +1,365 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) 2010-2022 Junjiro R. Okajima @@ -11449,7 +11452,7 @@ diff -Naur null/fs/aufs/dynop.c linux-6.6.54/fs/aufs/dynop.c + +#include "aufs.h" + -+#define DyPrSym(key) AuDbgSym(key->dk_op.dy_hop) ++#define DyPrSym(key) AuDbgSym((void*)(key->dk_op.dy_hop)) + +/* + * How large will these lists be? @@ -11564,12 +11567,11 @@ diff -Naur null/fs/aufs/dynop.c linux-6.6.54/fs/aufs/dynop.c + +#define DyDbgSize(cnt, op) AuDebugOn(cnt != sizeof(op)/sizeof(void *)) + ++#define DyDbgDeclare(cnt) unsigned int cnt __maybe_unused = 0 +#ifdef CONFIG_AUFS_DEBUG -+#define DyDbgDeclare(cnt) unsigned int cnt = 0 +#define DyDbgInc(cnt) do { cnt++; } while (0) +#else -+#define DyDbgDeclare(cnt) do {} while (0) -+#define DyDbgInc(cnt) do {} while (0) ++AuStubVoid(DyDbgInc, unsigned int cnt __maybe_unused); +#endif + +#define DySet(func, dst, src, h_op, h_sb) do { \ @@ -11791,9 +11793,9 @@ diff -Naur null/fs/aufs/dynop.c linux-6.6.54/fs/aufs/dynop.c + for (i = 0; i < AuDyLast; i++) + WARN_ON(!hlist_bl_empty(dynop + i)); +} -diff -Naur null/fs/aufs/dynop.h linux-6.6.54/fs/aufs/dynop.h +diff -Naur null/fs/aufs/dynop.h linux-6.6.63/fs/aufs/dynop.h --- /dev/null -+++ linux-6.6.54/fs/aufs/dynop.h 2024-10-14 10:37:56.021536616 +0300 ++++ linux-6.6.63/fs/aufs/dynop.h 2024-12-18 15:12:59.295519588 +0300 @@ -0,0 +1,77 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* @@ -11872,9 +11874,9 @@ diff -Naur null/fs/aufs/dynop.h linux-6.6.54/fs/aufs/dynop.h + +#endif /* __KERNEL__ */ +#endif /* __AUFS_DYNOP_H__ */ -diff -Naur null/fs/aufs/export.c linux-6.6.54/fs/aufs/export.c +diff -Naur null/fs/aufs/export.c linux-6.6.63/fs/aufs/export.c --- /dev/null -+++ linux-6.6.54/fs/aufs/export.c 2024-10-14 10:37:56.021536616 +0300 ++++ linux-6.6.63/fs/aufs/export.c 2024-12-18 15:12:59.295519588 +0300 @@ -0,0 +1,830 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -12706,9 +12708,9 @@ diff -Naur null/fs/aufs/export.c linux-6.6.54/fs/aufs/export.c + BUILD_BUG_ON(sizeof(u) != sizeof(int)); + atomic_set(&sbinfo->si_xigen_next, u); +} -diff -Naur null/fs/aufs/fhsm.c linux-6.6.54/fs/aufs/fhsm.c +diff -Naur null/fs/aufs/fhsm.c linux-6.6.63/fs/aufs/fhsm.c --- /dev/null -+++ linux-6.6.54/fs/aufs/fhsm.c 2024-10-14 10:37:56.021536616 +0300 ++++ linux-6.6.63/fs/aufs/fhsm.c 2024-12-18 15:12:59.295519588 +0300 @@ -0,0 +1,426 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -13136,9 +13138,9 @@ diff -Naur null/fs/aufs/fhsm.c linux-6.6.54/fs/aufs/fhsm.c + if (u != AUFS_FHSM_CACHE_DEF_SEC) + seq_printf(seq, ",fhsm_sec=%u", u); +} -diff -Naur null/fs/aufs/file.c linux-6.6.54/fs/aufs/file.c +diff -Naur null/fs/aufs/file.c linux-6.6.63/fs/aufs/file.c --- /dev/null -+++ linux-6.6.54/fs/aufs/file.c 2024-10-14 10:37:56.022536604 +0300 ++++ linux-6.6.63/fs/aufs/file.c 2024-12-18 15:12:59.296519576 +0300 @@ -0,0 +1,866 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -13548,7 +13550,7 @@ diff -Naur null/fs/aufs/file.c linux-6.6.54/fs/aufs/file.c + err = au_reopen_wh(file, bcpup, hi_wh); + + if (!err -+ && (inode->i_nlink > 1 ++ && (vfsub_inode_nlink(inode, AU_I_AUFS) > 1 + || (inode->i_state & I_LINKABLE)) + && au_opt_test(au_mntflags(cpg.dentry->d_sb), PLINK)) + au_plink_append(inode, bcpup, au_h_dptr(cpg.dentry, bcpup)); @@ -14006,9 +14008,9 @@ diff -Naur null/fs/aufs/file.c linux-6.6.54/fs/aufs/file.c + .swap_rw = aufs_swap_rw +#endif /* CONFIG_AUFS_DEBUG */ +}; -diff -Naur null/fs/aufs/file.h linux-6.6.54/fs/aufs/file.h +diff -Naur null/fs/aufs/file.h linux-6.6.63/fs/aufs/file.h --- /dev/null -+++ linux-6.6.54/fs/aufs/file.h 2024-10-14 10:37:56.022536604 +0300 ++++ linux-6.6.63/fs/aufs/file.h 2024-12-18 15:12:59.296519576 +0300 @@ -0,0 +1,342 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* @@ -14352,9 +14354,9 @@ diff -Naur null/fs/aufs/file.h linux-6.6.54/fs/aufs/file.h + +#endif /* __KERNEL__ */ +#endif /* __AUFS_FILE_H__ */ -diff -Naur null/fs/aufs/finfo.c linux-6.6.54/fs/aufs/finfo.c +diff -Naur null/fs/aufs/finfo.c linux-6.6.63/fs/aufs/finfo.c --- /dev/null -+++ linux-6.6.54/fs/aufs/finfo.c 2024-10-14 10:37:56.022536604 +0300 ++++ linux-6.6.63/fs/aufs/finfo.c 2024-12-18 15:12:59.296519576 +0300 @@ -0,0 +1,149 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -14505,9 +14507,9 @@ diff -Naur null/fs/aufs/finfo.c linux-6.6.54/fs/aufs/finfo.c +out: + return err; +} -diff -Naur null/fs/aufs/f_op.c linux-6.6.54/fs/aufs/f_op.c +diff -Naur null/fs/aufs/f_op.c linux-6.6.63/fs/aufs/f_op.c --- /dev/null -+++ linux-6.6.54/fs/aufs/f_op.c 2024-10-14 10:37:56.021536616 +0300 ++++ linux-6.6.63/fs/aufs/f_op.c 2024-12-18 15:12:59.295519588 +0300 @@ -0,0 +1,782 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -15291,9 +15293,9 @@ diff -Naur null/fs/aufs/f_op.c linux-6.6.54/fs/aufs/f_op.c + .fallocate = aufs_fallocate, + .copy_file_range = aufs_copy_file_range +}; -diff -Naur null/fs/aufs/fsctx.c linux-6.6.54/fs/aufs/fsctx.c +diff -Naur null/fs/aufs/fsctx.c linux-6.6.63/fs/aufs/fsctx.c --- /dev/null -+++ linux-6.6.54/fs/aufs/fsctx.c 2024-10-14 10:37:56.022536604 +0300 ++++ linux-6.6.63/fs/aufs/fsctx.c 2024-12-18 15:12:59.296519576 +0300 @@ -0,0 +1,1244 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -16539,10 +16541,10 @@ diff -Naur null/fs/aufs/fsctx.c linux-6.6.54/fs/aufs/fsctx.c + AuTraceErr(err); + return err; +} -diff -Naur null/fs/aufs/fstype.h linux-6.6.54/fs/aufs/fstype.h +diff -Naur null/fs/aufs/fstype.h linux-6.6.63/fs/aufs/fstype.h --- /dev/null -+++ linux-6.6.54/fs/aufs/fstype.h 2024-10-14 10:37:56.022536604 +0300 -@@ -0,0 +1,401 @@ ++++ linux-6.6.63/fs/aufs/fstype.h 2024-12-18 15:12:59.296519576 +0300 +@@ -0,0 +1,419 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Copyright (C) 2005-2022 Junjiro R. Okajima @@ -16792,6 +16794,15 @@ diff -Naur null/fs/aufs/fstype.h linux-6.6.54/fs/aufs/fstype.h +#endif +} + ++static inline int au_test_f2fs(struct super_block *sb __maybe_unused) ++{ ++#if IS_ENABLED(CONFIG_F2FS_FS) ++ return sb->s_magic == F2FS_SUPER_MAGIC; ++#else ++ return 0; ++#endif ++} ++ +/* ---------------------------------------------------------------------- */ +/* + * they can't be an aufs branch. @@ -16942,11 +16953,20 @@ diff -Naur null/fs/aufs/fstype.h linux-6.6.54/fs/aufs/fstype.h + && !nfs_server_capable(inode, NFS_CAP_ACLS); +} + ++/* ++ * filesystems which requires inode-lock in open. ++ */ ++static inline int au_test_fs_unlock_for_open(struct super_block *sb) ++{ ++ return au_test_nfs(sb) ++ || au_test_f2fs(sb); ++} ++ +#endif /* __KERNEL__ */ +#endif /* __AUFS_FSTYPE_H__ */ -diff -Naur null/fs/aufs/hbl.h linux-6.6.54/fs/aufs/hbl.h +diff -Naur null/fs/aufs/hbl.h linux-6.6.63/fs/aufs/hbl.h --- /dev/null -+++ linux-6.6.54/fs/aufs/hbl.h 2024-10-14 10:37:56.022536604 +0300 ++++ linux-6.6.63/fs/aufs/hbl.h 2024-12-18 15:12:59.296519576 +0300 @@ -0,0 +1,65 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* @@ -17013,9 +17033,9 @@ diff -Naur null/fs/aufs/hbl.h linux-6.6.54/fs/aufs/hbl.h + +#endif /* __KERNEL__ */ +#endif /* __AUFS_HBL_H__ */ -diff -Naur null/fs/aufs/hfsnotify.c linux-6.6.54/fs/aufs/hfsnotify.c +diff -Naur null/fs/aufs/hfsnotify.c linux-6.6.63/fs/aufs/hfsnotify.c --- /dev/null -+++ linux-6.6.54/fs/aufs/hfsnotify.c 2024-10-14 10:37:56.022536604 +0300 ++++ linux-6.6.63/fs/aufs/hfsnotify.c 2024-12-18 15:12:59.296519576 +0300 @@ -0,0 +1,290 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -17307,9 +17327,9 @@ diff -Naur null/fs/aufs/hfsnotify.c linux-6.6.54/fs/aufs/hfsnotify.c + .fin_br = au_hfsn_fin_br, + .init_br = au_hfsn_init_br +}; -diff -Naur null/fs/aufs/hfsplus.c linux-6.6.54/fs/aufs/hfsplus.c +diff -Naur null/fs/aufs/hfsplus.c linux-6.6.63/fs/aufs/hfsplus.c --- /dev/null -+++ linux-6.6.54/fs/aufs/hfsplus.c 2024-10-14 10:37:56.022536604 +0300 ++++ linux-6.6.63/fs/aufs/hfsplus.c 2024-12-18 15:12:59.296519576 +0300 @@ -0,0 +1,60 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -17371,9 +17391,9 @@ diff -Naur null/fs/aufs/hfsplus.c linux-6.6.54/fs/aufs/hfsplus.c + au_lcnt_dec(&br->br_nfiles); + } +} -diff -Naur null/fs/aufs/hnotify.c linux-6.6.54/fs/aufs/hnotify.c +diff -Naur null/fs/aufs/hnotify.c linux-6.6.63/fs/aufs/hnotify.c --- /dev/null -+++ linux-6.6.54/fs/aufs/hnotify.c 2024-10-14 10:37:56.022536604 +0300 ++++ linux-6.6.63/fs/aufs/hnotify.c 2024-12-18 15:12:59.296519576 +0300 @@ -0,0 +1,715 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -17696,7 +17716,7 @@ diff -Naur null/fs/aufs/hnotify.c linux-6.6.54/fs/aufs/hnotify.c + && a->inode + && a->h_inode) { + inode_lock_shared_nested(a->h_inode, AuLsc_I_CHILD); -+ if (!a->h_inode->i_nlink ++ if (!vfsub_inode_nlink(a->h_inode, AU_I_BRANCH) + && !(a->h_inode->i_state & I_LINKABLE)) + hn_xino(a->inode, a->h_inode); /* ignore this error */ + inode_unlock_shared(a->h_inode); @@ -18010,7 +18030,7 @@ diff -Naur null/fs/aufs/hnotify.c linux-6.6.54/fs/aufs/hnotify.c + + /* NFS fires the event for silly-renamed one from kworker */ + f = 0; -+ if (!dir->i_nlink ++ if (!vfsub_inode_nlink(dir, AU_I_AUFS) + || (au_test_nfs(h_dir->i_sb) && (mask & FS_DELETE))) + f = AuWkq_NEST; + err = au_wkq_nowait(au_hn_bh, args, dir->i_sb, f); @@ -18090,10 +18110,10 @@ diff -Naur null/fs/aufs/hnotify.c linux-6.6.54/fs/aufs/hnotify.c + if (au_cache[AuCache_HNOTIFY]) + au_hn_destroy_cache(); +} -diff -Naur null/fs/aufs/iinfo.c linux-6.6.54/fs/aufs/iinfo.c +diff -Naur null/fs/aufs/iinfo.c linux-6.6.63/fs/aufs/iinfo.c --- /dev/null -+++ linux-6.6.54/fs/aufs/iinfo.c 2024-10-14 10:37:56.023536591 +0300 -@@ -0,0 +1,286 @@ ++++ linux-6.6.63/fs/aufs/iinfo.c 2024-12-18 15:12:59.297519563 +0300 +@@ -0,0 +1,287 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) 2005-2022 Junjiro R. Okajima @@ -18243,7 +18263,7 @@ diff -Naur null/fs/aufs/iinfo.c linux-6.6.54/fs/aufs/iinfo.c + + h_i = au_hinode(iinfo, bindex)->hi_inode; + if (h_i -+ && !h_i->i_nlink ++ && !vfsub_inode_nlink(h_i, AU_I_BRANCH) + && !(h_i->i_state & I_LINKABLE)) + au_set_h_iptr(inode, bindex, NULL, 0); + } @@ -18276,6 +18296,7 @@ diff -Naur null/fs/aufs/iinfo.c linux-6.6.54/fs/aufs/iinfo.c + spin_lock_init(&iinfo->ii_generation.ig_spin); + au_rw_init(&iinfo->ii_rwsem); + inode_init_once(&c->vfs_inode); ++ spin_lock_init(&c->nlink_spin); +} + +void au_hinode_init(struct au_hinode *hinode) @@ -18343,7 +18364,7 @@ diff -Naur null/fs/aufs/iinfo.c linux-6.6.54/fs/aufs/iinfo.c + struct au_hinode *hi; + struct super_block *sb; + aufs_bindex_t bindex, bbot; -+ const unsigned char unlinked = !inode->i_nlink; ++ const unsigned char unlinked = !vfsub_inode_nlink(inode, AU_I_AUFS); + + AuDebugOn(au_is_bad_inode(inode)); + @@ -18380,10 +18401,10 @@ diff -Naur null/fs/aufs/iinfo.c linux-6.6.54/fs/aufs/iinfo.c + au_kfree_rcu(iinfo->ii_hinode); + AuRwDestroy(&iinfo->ii_rwsem); +} -diff -Naur null/fs/aufs/inode.c linux-6.6.54/fs/aufs/inode.c +diff -Naur null/fs/aufs/inode.c linux-6.6.63/fs/aufs/inode.c --- /dev/null -+++ linux-6.6.54/fs/aufs/inode.c 2024-10-14 10:37:56.023536591 +0300 -@@ -0,0 +1,531 @@ ++++ linux-6.6.63/fs/aufs/inode.c 2024-12-18 15:12:59.297519563 +0300 +@@ -0,0 +1,532 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) 2005-2022 Junjiro R. Okajima @@ -18770,7 +18791,7 @@ diff -Naur null/fs/aufs/inode.c linux-6.6.54/fs/aufs/inode.c + h_dentry = au_h_dptr(dentry, btop); + h_inode = d_inode(h_dentry); + h_ino = h_inode->i_ino; -+ hlinked = !d_is_dir(h_dentry) && h_inode->i_nlink > 1; ++ hlinked = !d_is_dir(h_dentry) && vfsub_inode_nlink(h_inode, AU_I_BRANCH) > 1; + +new_ino: + /* @@ -18823,7 +18844,8 @@ diff -Naur null/fs/aufs/inode.c linux-6.6.54/fs/aufs/inode.c + au_xino_write(sb, btop, h_ino, /*ino*/0); + /* ignore this error */ + goto out_iput; -+ } else if (!must_new && !IS_DEADDIR(inode) && inode->i_nlink) { ++ } else if (!must_new && !IS_DEADDIR(inode) ++ && vfsub_inode_nlink(inode, AU_I_AUFS)) { + /* + * horrible race condition between lookup, readdir and copyup + * (or something). @@ -18915,10 +18937,10 @@ diff -Naur null/fs/aufs/inode.c linux-6.6.54/fs/aufs/inode.c + mask |= MAY_READ; /* force permission check */ + return au_test_h_perm(h_idmap, h_inode, mask); +} -diff -Naur null/fs/aufs/inode.h linux-6.6.54/fs/aufs/inode.h +diff -Naur null/fs/aufs/inode.h linux-6.6.63/fs/aufs/inode.h --- /dev/null -+++ linux-6.6.54/fs/aufs/inode.h 2024-10-14 10:37:56.023536591 +0300 -@@ -0,0 +1,707 @@ ++++ linux-6.6.63/fs/aufs/inode.h 2024-12-18 15:12:59.298519551 +0300 +@@ -0,0 +1,727 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Copyright (C) 2005-2022 Junjiro R. Okajima @@ -18947,6 +18969,7 @@ diff -Naur null/fs/aufs/inode.h linux-6.6.54/fs/aufs/inode.h +#ifdef __KERNEL__ + +#include ++#include "fstype.h" +#include "rwsem.h" + +struct vfsmount; @@ -19001,6 +19024,7 @@ diff -Naur null/fs/aufs/inode.h linux-6.6.54/fs/aufs/inode.h +struct au_icntnr { + struct au_iinfo iinfo; + struct inode vfs_inode; ++ spinlock_t nlink_spin; /* protects vfs_inode.i_nlink */ + struct hlist_bl_node plink; + struct rcu_head rcu; +} ____cacheline_aligned_in_smp; @@ -19046,6 +19070,24 @@ diff -Naur null/fs/aufs/inode.h linux-6.6.54/fs/aufs/inode.h + return &(container_of(inode, struct au_icntnr, vfs_inode)->iinfo); +} + ++static inline void au_nlink_lock(struct inode *inode) ++{ ++ spinlock_t *spin; ++ ++ AuDebugOn(!au_test_aufs(inode->i_sb)); ++ AuDebugOn(is_bad_inode(inode)); ++ spin = &(container_of(inode, struct au_icntnr, vfs_inode)->nlink_spin); ++ spin_lock(spin); ++} ++ ++static inline void au_nlink_unlock(struct inode *inode) ++{ ++ spinlock_t *spin; ++ ++ spin = &(container_of(inode, struct au_icntnr, vfs_inode)->nlink_spin); ++ spin_unlock(spin); ++} ++ +/* ---------------------------------------------------------------------- */ + +/* inode.c */ @@ -19626,9 +19668,9 @@ diff -Naur null/fs/aufs/inode.h linux-6.6.54/fs/aufs/inode.h + +#endif /* __KERNEL__ */ +#endif /* __AUFS_INODE_H__ */ -diff -Naur null/fs/aufs/ioctl.c linux-6.6.54/fs/aufs/ioctl.c +diff -Naur null/fs/aufs/ioctl.c linux-6.6.63/fs/aufs/ioctl.c --- /dev/null -+++ linux-6.6.54/fs/aufs/ioctl.c 2024-10-14 10:37:56.024536579 +0300 ++++ linux-6.6.63/fs/aufs/ioctl.c 2024-12-18 15:12:59.298519551 +0300 @@ -0,0 +1,220 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -19850,10 +19892,10 @@ diff -Naur null/fs/aufs/ioctl.c linux-6.6.54/fs/aufs/ioctl.c + return aufs_ioctl_nondir(file, cmd, (unsigned long)compat_ptr(arg)); +} +#endif -diff -Naur null/fs/aufs/i_op_add.c linux-6.6.54/fs/aufs/i_op_add.c +diff -Naur null/fs/aufs/i_op_add.c linux-6.6.63/fs/aufs/i_op_add.c --- /dev/null -+++ linux-6.6.54/fs/aufs/i_op_add.c 2024-10-14 10:37:56.023536591 +0300 -@@ -0,0 +1,972 @@ ++++ linux-6.6.63/fs/aufs/i_op_add.c 2024-12-18 15:12:59.297519563 +0300 +@@ -0,0 +1,971 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) 2005-2022 Junjiro R. Okajima @@ -19979,7 +20021,7 @@ diff -Naur null/fs/aufs/i_op_add.c linux-6.6.54/fs/aufs/i_op_add.c + if (unlikely(d_is_negative(h_dentry))) + goto out; + h_inode = d_inode(h_dentry); -+ if (unlikely(!h_inode->i_nlink)) ++ if (unlikely(!vfsub_inode_nlink(h_inode, AU_I_BRANCH))) + goto out; + + h_mode = h_inode->i_mode; @@ -20360,8 +20402,7 @@ diff -Naur null/fs/aufs/i_op_add.c linux-6.6.54/fs/aufs/i_op_add.c + goto out_h_file; + } + -+ if (!inode->i_nlink) -+ set_nlink(inode, 1); ++ vfsub_inode_nlink_init(inode, 1); + d_tmpfile(file, inode); + au_di(dentry)->di_tmpfile = 1; + get_file(h_file); @@ -20466,7 +20507,7 @@ diff -Naur null/fs/aufs/i_op_add.c linux-6.6.54/fs/aufs/i_op_add.c + inode = d_inode(src_dentry); + if (au_ibtop(inode) <= a->bdst) + h_inode = au_h_iptr(inode, a->bdst); -+ if (!h_inode || !h_inode->i_nlink) { ++ if (!h_inode || !vfsub_inode_nlink(h_inode, AU_I_BRANCH)) { + /* copyup src_dentry as the name of dentry. */ + bbot = au_dbbot(dentry); + if (bbot < a->bsrc) @@ -20679,7 +20720,7 @@ diff -Naur null/fs/aufs/i_op_add.c linux-6.6.54/fs/aufs/i_op_add.c + + au_dir_ts(dir, a->bdst); + inode_inc_iversion(dir); -+ inc_nlink(inode); ++ vfsub_inc_nlink(inode); + inode_set_ctime_to_ts(inode, inode_get_ctime(dir)); + d_instantiate(dentry, au_igrab(inode)); + if (d_unhashed(a->h_path.dentry)) @@ -20784,7 +20825,7 @@ diff -Naur null/fs/aufs/i_op_add.c linux-6.6.54/fs/aufs/i_op_add.c + + err = epilog(dir, bindex, wh_dentry, dentry); + if (!err) { -+ inc_nlink(dir); ++ vfsub_inc_nlink(dir); + goto out_unpin; /* success */ + } + @@ -20826,9 +20867,9 @@ diff -Naur null/fs/aufs/i_op_add.c linux-6.6.54/fs/aufs/i_op_add.c +out: + return err; +} -diff -Naur null/fs/aufs/i_op.c linux-6.6.54/fs/aufs/i_op.c +diff -Naur null/fs/aufs/i_op.c linux-6.6.63/fs/aufs/i_op.c --- /dev/null -+++ linux-6.6.54/fs/aufs/i_op.c 2024-10-14 10:37:56.023536591 +0300 ++++ linux-6.6.63/fs/aufs/i_op.c 2024-12-18 15:12:59.297519563 +0300 @@ -0,0 +1,1520 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -21460,7 +21501,7 @@ diff -Naur null/fs/aufs/i_op.c linux-6.6.54/fs/aufs/i_op.c + continue; + if (d_is_positive(h_d[i])) { + h_i = d_inode(h_d[i]); -+ err = !h_i->i_nlink; ++ err = !vfsub_inode_nlink(h_i, AU_I_BRANCH); + } + } + @@ -22005,12 +22046,11 @@ diff -Naur null/fs/aufs/i_op.c linux-6.6.54/fs/aufs/i_op.c + + au_cpup_attr_nlink(inode, /*force*/0); + if (S_ISDIR(inode->i_mode)) { -+ n = inode->i_nlink; ++ n = vfsub_inode_nlink(inode, AU_I_AUFS); + n -= nlink; + n += st->nlink; -+ smp_mb(); /* for i_nlink */ + /* 0 can happen */ -+ set_nlink(inode, n); ++ vfsub_set_nlink(inode, n); + } + + spin_lock(&inode->i_lock); @@ -22135,7 +22175,8 @@ diff -Naur null/fs/aufs/i_op.c linux-6.6.54/fs/aufs/i_op.c + if (!err) { + if (positive) + au_refresh_iattr(inode, st, -+ d_inode(h_path.dentry)->i_nlink); ++ vfsub_inode_nlink(d_inode(h_path.dentry), ++ AU_I_BRANCH)); + goto out_fill; /* success */ + } + AuTraceErr(err); @@ -22350,9 +22391,9 @@ diff -Naur null/fs/aufs/i_op.c linux-6.6.54/fs/aufs/i_op.c + .update_time = aufs_update_time + } +}; -diff -Naur null/fs/aufs/i_op_del.c linux-6.6.54/fs/aufs/i_op_del.c +diff -Naur null/fs/aufs/i_op_del.c linux-6.6.63/fs/aufs/i_op_del.c --- /dev/null -+++ linux-6.6.54/fs/aufs/i_op_del.c 2024-10-14 10:37:56.023536591 +0300 ++++ linux-6.6.63/fs/aufs/i_op_del.c 2024-12-18 15:12:59.297519563 +0300 @@ -0,0 +1,523 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -22461,7 +22502,7 @@ diff -Naur null/fs/aufs/i_op_del.c linux-6.6.54/fs/aufs/i_op_del.c + if (unlikely(d_is_negative(h_dentry))) + goto out; + h_inode = d_inode(h_dentry); -+ if (unlikely(!h_inode->i_nlink)) ++ if (unlikely(!vfsub_inode_nlink(h_inode, AU_I_BRANCH))) + goto out; + + h_mode = h_inode->i_mode; @@ -22877,9 +22918,9 @@ diff -Naur null/fs/aufs/i_op_del.c linux-6.6.54/fs/aufs/i_op_del.c + AuTraceErr(err); + return err; +} -diff -Naur null/fs/aufs/i_op_ren.c linux-6.6.54/fs/aufs/i_op_ren.c +diff -Naur null/fs/aufs/i_op_ren.c linux-6.6.63/fs/aufs/i_op_ren.c --- /dev/null -+++ linux-6.6.54/fs/aufs/i_op_ren.c 2024-10-14 10:37:56.023536591 +0300 ++++ linux-6.6.63/fs/aufs/i_op_ren.c 2024-12-18 15:12:59.297519563 +0300 @@ -0,0 +1,1260 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -23534,7 +23575,7 @@ diff -Naur null/fs/aufs/i_op_ren.c linux-6.6.54/fs/aufs/i_op_ren.c + if (unlikely(d_is_negative(a->dst_h_dentry))) + goto out; + h_inode = d_inode(a->dst_h_dentry); -+ if (h_inode->i_nlink) ++ if (vfsub_inode_nlink(h_inode, AU_I_BRANCH)) + err = au_may_del(a->dst_dentry, a->btgt, + a->dst_h_parent, isdir); + } @@ -23927,7 +23968,7 @@ diff -Naur null/fs/aufs/i_op_ren.c linux-6.6.54/fs/aufs/i_op_ren.c + * If it is a dir, VFS unhash it before this + * function. It means we cannot rely upon d_unhashed(). + */ -+ if (unlikely(!a->dst_inode->i_nlink)) ++ if (unlikely(!vfsub_inode_nlink(a->dst_inode, AU_I_AUFS))) + goto out_unlock; + if (!au_ftest_ren(a->auren_flags, ISDIR_DST)) { + err = au_d_hashed_positive(a->dst_dentry); @@ -24141,9 +24182,9 @@ diff -Naur null/fs/aufs/i_op_ren.c linux-6.6.54/fs/aufs/i_op_ren.c + AuTraceErr(err); + return err; +} -diff -Naur null/fs/aufs/Kconfig linux-6.6.54/fs/aufs/Kconfig +diff -Naur null/fs/aufs/Kconfig linux-6.6.63/fs/aufs/Kconfig --- /dev/null -+++ linux-6.6.54/fs/aufs/Kconfig 2024-10-14 10:37:56.018536654 +0300 ++++ linux-6.6.63/fs/aufs/Kconfig 2024-12-18 15:12:59.292519626 +0300 @@ -0,0 +1,199 @@ +# SPDX-License-Identifier: GPL-2.0 +config AUFS_FS @@ -24344,9 +24385,9 @@ diff -Naur null/fs/aufs/Kconfig linux-6.6.54/fs/aufs/Kconfig + Automatic configuration for internal use. + When aufs supports Magic SysRq, enabled automatically. +endif -diff -Naur null/fs/aufs/lcnt.h linux-6.6.54/fs/aufs/lcnt.h +diff -Naur null/fs/aufs/lcnt.h linux-6.6.63/fs/aufs/lcnt.h --- /dev/null -+++ linux-6.6.54/fs/aufs/lcnt.h 2024-10-14 10:37:56.024536579 +0300 ++++ linux-6.6.63/fs/aufs/lcnt.h 2024-12-18 15:12:59.298519551 +0300 @@ -0,0 +1,186 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* @@ -24529,14 +24570,14 @@ diff -Naur null/fs/aufs/lcnt.h linux-6.6.54/fs/aufs/lcnt.h + AuDbg("%s = %ld\n", #val, l); \ +} while (0) +#else -+#define AuLCntZero(val) do {} while (0) ++AuStubVoid(AuLCntZero, long val __maybe_unused); +#endif + +#endif /* __KERNEL__ */ +#endif /* __AUFS_LCNT_H__ */ -diff -Naur null/fs/aufs/loop.c linux-6.6.54/fs/aufs/loop.c +diff -Naur null/fs/aufs/loop.c linux-6.6.63/fs/aufs/loop.c --- /dev/null -+++ linux-6.6.54/fs/aufs/loop.c 2024-10-14 10:37:56.024536579 +0300 ++++ linux-6.6.63/fs/aufs/loop.c 2024-12-18 15:12:59.298519551 +0300 @@ -0,0 +1,148 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -24686,9 +24727,9 @@ diff -Naur null/fs/aufs/loop.c linux-6.6.54/fs/aufs/loop.c + symbol_put(loop_backing_file); + au_kfree_try_rcu(au_warn_loopback_array); +} -diff -Naur null/fs/aufs/loop.h linux-6.6.54/fs/aufs/loop.h +diff -Naur null/fs/aufs/loop.h linux-6.6.63/fs/aufs/loop.h --- /dev/null -+++ linux-6.6.54/fs/aufs/loop.h 2024-10-14 10:37:56.024536579 +0300 ++++ linux-6.6.63/fs/aufs/loop.h 2024-12-18 15:12:59.298519551 +0300 @@ -0,0 +1,55 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* @@ -24745,9 +24786,9 @@ diff -Naur null/fs/aufs/loop.h linux-6.6.54/fs/aufs/loop.h + +#endif /* __KERNEL__ */ +#endif /* __AUFS_LOOP_H__ */ -diff -Naur null/fs/aufs/magic.mk linux-6.6.54/fs/aufs/magic.mk +diff -Naur null/fs/aufs/magic.mk linux-6.6.63/fs/aufs/magic.mk --- /dev/null -+++ linux-6.6.54/fs/aufs/magic.mk 2024-10-14 10:37:56.024536579 +0300 ++++ linux-6.6.63/fs/aufs/magic.mk 2024-12-18 15:12:59.298519551 +0300 @@ -0,0 +1,31 @@ +# SPDX-License-Identifier: GPL-2.0 + @@ -24780,9 +24821,9 @@ diff -Naur null/fs/aufs/magic.mk linux-6.6.54/fs/aufs/magic.mk +ifdef CONFIG_HFSPLUS_FS +ccflags-y += -DHFSPLUS_SUPER_MAGIC=0x482b +endif -diff -Naur null/fs/aufs/Makefile linux-6.6.54/fs/aufs/Makefile +diff -Naur null/fs/aufs/Makefile linux-6.6.63/fs/aufs/Makefile --- /dev/null -+++ linux-6.6.54/fs/aufs/Makefile 2024-10-14 10:37:56.018536654 +0300 ++++ linux-6.6.63/fs/aufs/Makefile 2024-12-18 15:12:59.293519613 +0300 @@ -0,0 +1,46 @@ +# SPDX-License-Identifier: GPL-2.0 + @@ -24830,9 +24871,9 @@ diff -Naur null/fs/aufs/Makefile linux-6.6.54/fs/aufs/Makefile +aufs-$(CONFIG_AUFS_BR_HFSPLUS) += hfsplus.o +aufs-$(CONFIG_AUFS_DEBUG) += debug.o +aufs-$(CONFIG_AUFS_MAGIC_SYSRQ) += sysrq.o -diff -Naur null/fs/aufs/module.c linux-6.6.54/fs/aufs/module.c +diff -Naur null/fs/aufs/module.c linux-6.6.63/fs/aufs/module.c --- /dev/null -+++ linux-6.6.54/fs/aufs/module.c 2024-10-14 10:37:56.024536579 +0300 ++++ linux-6.6.63/fs/aufs/module.c 2024-12-18 15:12:59.298519551 +0300 @@ -0,0 +1,273 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -25107,9 +25148,9 @@ diff -Naur null/fs/aufs/module.c linux-6.6.54/fs/aufs/module.c + +module_init(aufs_init); +module_exit(aufs_exit); -diff -Naur null/fs/aufs/module.h linux-6.6.54/fs/aufs/module.h +diff -Naur null/fs/aufs/module.h linux-6.6.63/fs/aufs/module.h --- /dev/null -+++ linux-6.6.54/fs/aufs/module.h 2024-10-14 10:37:56.024536579 +0300 ++++ linux-6.6.63/fs/aufs/module.h 2024-12-18 15:12:59.298519551 +0300 @@ -0,0 +1,180 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* @@ -25291,10 +25332,10 @@ diff -Naur null/fs/aufs/module.h linux-6.6.54/fs/aufs/module.h + +#endif /* __KERNEL__ */ +#endif /* __AUFS_MODULE_H__ */ -diff -Naur null/fs/aufs/mvdown.c linux-6.6.54/fs/aufs/mvdown.c +diff -Naur null/fs/aufs/mvdown.c linux-6.6.63/fs/aufs/mvdown.c --- /dev/null -+++ linux-6.6.54/fs/aufs/mvdown.c 2024-10-14 10:37:56.024536579 +0300 -@@ -0,0 +1,706 @@ ++++ linux-6.6.63/fs/aufs/mvdown.c 2024-12-18 15:12:59.298519551 +0300 +@@ -0,0 +1,707 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) 2011-2022 Junjiro R. Okajima @@ -25697,15 +25738,16 @@ diff -Naur null/fs/aufs/mvdown.c linux-6.6.54/fs/aufs/mvdown.c + && atomic_read(&a->inode->i_count) == 1 + /* && a->mvd_h_src_inode->i_nlink == 1 */ + && (!plinked || !au_plink_test(a->inode)) -+ && a->inode->i_nlink == 1) ++ && vfsub_inode_nlink(a->inode, AU_I_AUFS) == 1) + goto out; + + err = -EBUSY; + AU_MVD_PR(dmsg, + "b%d, d{b%d, c%d?}, i{c%d?, l%u}, hi{l%u}, p{%d, %d}\n", + a->mvd_bsrc, au_dbtop(a->dentry), au_dcount(a->dentry), -+ atomic_read(&a->inode->i_count), a->inode->i_nlink, -+ a->mvd_h_src_inode->i_nlink, ++ atomic_read(&a->inode->i_count), ++ vfsub_inode_nlink(a->inode, AU_I_AUFS), ++ vfsub_inode_nlink(a->mvd_h_src_inode, AU_I_BRANCH), + plinked, plinked ? au_plink_test(a->inode) : 0); + +out: @@ -26001,9 +26043,9 @@ diff -Naur null/fs/aufs/mvdown.c linux-6.6.54/fs/aufs/mvdown.c + AuTraceErr(err); + return err; +} -diff -Naur null/fs/aufs/opts.c linux-6.6.54/fs/aufs/opts.c +diff -Naur null/fs/aufs/opts.c linux-6.6.63/fs/aufs/opts.c --- /dev/null -+++ linux-6.6.54/fs/aufs/opts.c 2024-10-14 10:37:56.024536579 +0300 ++++ linux-6.6.63/fs/aufs/opts.c 2024-12-18 15:12:59.298519551 +0300 @@ -0,0 +1,1032 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -27037,9 +27079,9 @@ diff -Naur null/fs/aufs/opts.c linux-6.6.54/fs/aufs/opts.c +{ + return au_mntflags(sb) & AuOptMask_UDBA; +} -diff -Naur null/fs/aufs/opts.h linux-6.6.54/fs/aufs/opts.h +diff -Naur null/fs/aufs/opts.h linux-6.6.63/fs/aufs/opts.h --- /dev/null -+++ linux-6.6.54/fs/aufs/opts.h 2024-10-14 10:37:56.024536579 +0300 ++++ linux-6.6.63/fs/aufs/opts.h 2024-12-18 15:12:59.298519551 +0300 @@ -0,0 +1,263 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* @@ -27304,9 +27346,9 @@ diff -Naur null/fs/aufs/opts.h linux-6.6.54/fs/aufs/opts.h + +#endif /* __KERNEL__ */ +#endif /* __AUFS_OPTS_H__ */ -diff -Naur null/fs/aufs/plink.c linux-6.6.54/fs/aufs/plink.c +diff -Naur null/fs/aufs/plink.c linux-6.6.63/fs/aufs/plink.c --- /dev/null -+++ linux-6.6.54/fs/aufs/plink.c 2024-10-14 10:37:56.024536579 +0300 ++++ linux-6.6.63/fs/aufs/plink.c 2024-12-18 15:12:59.299519538 +0300 @@ -0,0 +1,516 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -27824,9 +27866,9 @@ diff -Naur null/fs/aufs/plink.c linux-6.6.54/fs/aufs/plink.c + } + } +} -diff -Naur null/fs/aufs/poll.c linux-6.6.54/fs/aufs/poll.c +diff -Naur null/fs/aufs/poll.c linux-6.6.63/fs/aufs/poll.c --- /dev/null -+++ linux-6.6.54/fs/aufs/poll.c 2024-10-14 10:37:56.024536579 +0300 ++++ linux-6.6.63/fs/aufs/poll.c 2024-12-18 15:12:59.299519538 +0300 @@ -0,0 +1,51 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -27879,9 +27921,9 @@ diff -Naur null/fs/aufs/poll.c linux-6.6.54/fs/aufs/poll.c + AuDbg("mask 0x%x\n", mask); + return mask; +} -diff -Naur null/fs/aufs/posix_acl.c linux-6.6.54/fs/aufs/posix_acl.c +diff -Naur null/fs/aufs/posix_acl.c linux-6.6.63/fs/aufs/posix_acl.c --- /dev/null -+++ linux-6.6.54/fs/aufs/posix_acl.c 2024-10-14 10:37:56.025536566 +0300 ++++ linux-6.6.63/fs/aufs/posix_acl.c 2024-12-18 15:12:59.299519538 +0300 @@ -0,0 +1,108 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -27991,9 +28033,9 @@ diff -Naur null/fs/aufs/posix_acl.c linux-6.6.54/fs/aufs/posix_acl.c + + return err; +} -diff -Naur null/fs/aufs/procfs.c linux-6.6.54/fs/aufs/procfs.c +diff -Naur null/fs/aufs/procfs.c linux-6.6.63/fs/aufs/procfs.c --- /dev/null -+++ linux-6.6.54/fs/aufs/procfs.c 2024-10-14 10:37:56.025536566 +0300 ++++ linux-6.6.63/fs/aufs/procfs.c 2024-12-18 15:12:59.299519538 +0300 @@ -0,0 +1,170 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -28165,9 +28207,9 @@ diff -Naur null/fs/aufs/procfs.c linux-6.6.54/fs/aufs/procfs.c +out: + return err; +} -diff -Naur null/fs/aufs/rdu.c linux-6.6.54/fs/aufs/rdu.c +diff -Naur null/fs/aufs/rdu.c linux-6.6.63/fs/aufs/rdu.c --- /dev/null -+++ linux-6.6.54/fs/aufs/rdu.c 2024-10-14 10:37:56.025536566 +0300 ++++ linux-6.6.63/fs/aufs/rdu.c 2024-12-18 15:12:59.299519538 +0300 @@ -0,0 +1,384 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -28553,9 +28595,9 @@ diff -Naur null/fs/aufs/rdu.c linux-6.6.54/fs/aufs/rdu.c + return err; +} +#endif -diff -Naur null/fs/aufs/rwsem.h linux-6.6.54/fs/aufs/rwsem.h +diff -Naur null/fs/aufs/rwsem.h linux-6.6.63/fs/aufs/rwsem.h --- /dev/null -+++ linux-6.6.54/fs/aufs/rwsem.h 2024-10-14 10:37:56.025536566 +0300 ++++ linux-6.6.63/fs/aufs/rwsem.h 2024-12-18 15:12:59.299519538 +0300 @@ -0,0 +1,85 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* @@ -28642,9 +28684,9 @@ diff -Naur null/fs/aufs/rwsem.h linux-6.6.54/fs/aufs/rwsem.h + +#endif /* __KERNEL__ */ +#endif /* __AUFS_RWSEM_H__ */ -diff -Naur null/fs/aufs/sbinfo.c linux-6.6.54/fs/aufs/sbinfo.c +diff -Naur null/fs/aufs/sbinfo.c linux-6.6.63/fs/aufs/sbinfo.c --- /dev/null -+++ linux-6.6.54/fs/aufs/sbinfo.c 2024-10-14 10:37:56.025536566 +0300 ++++ linux-6.6.63/fs/aufs/sbinfo.c 2024-12-18 15:12:59.299519538 +0300 @@ -0,0 +1,316 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -28962,9 +29004,9 @@ diff -Naur null/fs/aufs/sbinfo.c linux-6.6.54/fs/aufs/sbinfo.c + di_write_unlock2(d1, d2); + si_read_unlock(d1->d_sb); +} -diff -Naur null/fs/aufs/super.c linux-6.6.54/fs/aufs/super.c +diff -Naur null/fs/aufs/super.c linux-6.6.63/fs/aufs/super.c --- /dev/null -+++ linux-6.6.54/fs/aufs/super.c 2024-10-14 10:37:56.025536566 +0300 ++++ linux-6.6.63/fs/aufs/super.c 2024-12-18 15:12:59.299519538 +0300 @@ -0,0 +1,871 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -29759,7 +29801,7 @@ diff -Naur null/fs/aufs/super.c linux-6.6.54/fs/aufs/super.c + inode->i_op = aufs_iop + AuIop_DIR; /* with getattr by default */ + inode->i_fop = &aufs_dir_fop; + inode->i_mode = S_IFDIR; -+ set_nlink(inode, 2); ++ vfsub_inode_nlink_init(inode, 2); + unlock_new_inode(inode); + + root = d_make_root(inode); @@ -29837,9 +29879,9 @@ diff -Naur null/fs/aufs/super.c linux-6.6.54/fs/aufs/super.c + /* no need to __module_get() and module_put(). */ + .owner = THIS_MODULE, +}; -diff -Naur null/fs/aufs/super.h linux-6.6.54/fs/aufs/super.h +diff -Naur null/fs/aufs/super.h linux-6.6.63/fs/aufs/super.h --- /dev/null -+++ linux-6.6.54/fs/aufs/super.h 2024-10-14 10:37:56.025536566 +0300 ++++ linux-6.6.63/fs/aufs/super.h 2024-12-18 15:12:59.299519538 +0300 @@ -0,0 +1,592 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* @@ -30433,9 +30475,9 @@ diff -Naur null/fs/aufs/super.h linux-6.6.54/fs/aufs/super.h + +#endif /* __KERNEL__ */ +#endif /* __AUFS_SUPER_H__ */ -diff -Naur null/fs/aufs/sysaufs.c linux-6.6.54/fs/aufs/sysaufs.c +diff -Naur null/fs/aufs/sysaufs.c linux-6.6.63/fs/aufs/sysaufs.c --- /dev/null -+++ linux-6.6.54/fs/aufs/sysaufs.c 2024-10-14 10:37:56.025536566 +0300 ++++ linux-6.6.63/fs/aufs/sysaufs.c 2024-12-18 15:12:59.299519538 +0300 @@ -0,0 +1,94 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -30531,9 +30573,9 @@ diff -Naur null/fs/aufs/sysaufs.c linux-6.6.54/fs/aufs/sysaufs.c +out: + return err; +} -diff -Naur null/fs/aufs/sysaufs.h linux-6.6.54/fs/aufs/sysaufs.h +diff -Naur null/fs/aufs/sysaufs.h linux-6.6.63/fs/aufs/sysaufs.h --- /dev/null -+++ linux-6.6.54/fs/aufs/sysaufs.h 2024-10-14 10:37:56.025536566 +0300 ++++ linux-6.6.63/fs/aufs/sysaufs.h 2024-12-18 15:12:59.299519538 +0300 @@ -0,0 +1,102 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* @@ -30637,9 +30679,9 @@ diff -Naur null/fs/aufs/sysaufs.h linux-6.6.54/fs/aufs/sysaufs.h + +#endif /* __KERNEL__ */ +#endif /* __SYSAUFS_H__ */ -diff -Naur null/fs/aufs/sysfs.c linux-6.6.54/fs/aufs/sysfs.c +diff -Naur null/fs/aufs/sysfs.c linux-6.6.63/fs/aufs/sysfs.c --- /dev/null -+++ linux-6.6.54/fs/aufs/sysfs.c 2024-10-14 10:37:56.025536566 +0300 ++++ linux-6.6.63/fs/aufs/sysfs.c 2024-12-18 15:12:59.299519538 +0300 @@ -0,0 +1,374 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -31015,9 +31057,9 @@ diff -Naur null/fs/aufs/sysfs.c linux-6.6.54/fs/aufs/sysfs.c + } + } +} -diff -Naur null/fs/aufs/sysrq.c linux-6.6.54/fs/aufs/sysrq.c +diff -Naur null/fs/aufs/sysrq.c linux-6.6.63/fs/aufs/sysrq.c --- /dev/null -+++ linux-6.6.54/fs/aufs/sysrq.c 2024-10-14 10:37:56.025536566 +0300 ++++ linux-6.6.63/fs/aufs/sysrq.c 2024-12-18 15:12:59.299519538 +0300 @@ -0,0 +1,149 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -31168,9 +31210,9 @@ diff -Naur null/fs/aufs/sysrq.c linux-6.6.54/fs/aufs/sysrq.c + if (unlikely(err)) + pr_err("err %d (ignored)\n", err); +} -diff -Naur null/fs/aufs/vdir.c linux-6.6.54/fs/aufs/vdir.c +diff -Naur null/fs/aufs/vdir.c linux-6.6.63/fs/aufs/vdir.c --- /dev/null -+++ linux-6.6.54/fs/aufs/vdir.c 2024-10-14 10:37:56.025536566 +0300 ++++ linux-6.6.63/fs/aufs/vdir.c 2024-12-18 15:12:59.300519526 +0300 @@ -0,0 +1,896 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -32068,10 +32110,10 @@ diff -Naur null/fs/aufs/vdir.c linux-6.6.54/fs/aufs/vdir.c + /* smp_mb(); */ + return 0; +} -diff -Naur null/fs/aufs/vfsub.c linux-6.6.54/fs/aufs/vfsub.c +diff -Naur null/fs/aufs/vfsub.c linux-6.6.63/fs/aufs/vfsub.c --- /dev/null -+++ linux-6.6.54/fs/aufs/vfsub.c 2024-10-14 10:37:56.026536554 +0300 -@@ -0,0 +1,918 @@ ++++ linux-6.6.63/fs/aufs/vfsub.c 2024-12-18 15:12:59.300519526 +0300 +@@ -0,0 +1,964 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) 2005-2022 Junjiro R. Okajima @@ -32125,6 +32167,52 @@ diff -Naur null/fs/aufs/vfsub.c linux-6.6.54/fs/aufs/vfsub.c + +/* ---------------------------------------------------------------------- */ + ++unsigned int vfsub_inode_nlink_aufs(struct inode *inode) ++{ ++ unsigned int nlink; ++ ++ au_nlink_lock(inode); ++ nlink = inode->i_nlink; ++ au_nlink_unlock(inode); ++ ++ return nlink; ++} ++ ++void vfsub_inc_nlink(struct inode *inode) ++{ ++ au_nlink_lock(inode); ++ inc_nlink(inode); ++ au_nlink_unlock(inode); ++} ++ ++void vfsub_drop_nlink(struct inode *inode) ++{ ++ au_nlink_lock(inode); ++ AuDebugOn(!inode->i_nlink); ++ drop_nlink(inode); ++ au_nlink_unlock(inode); ++} ++ ++void vfsub_clear_nlink(struct inode *inode) ++{ ++ au_nlink_lock(inode); ++ AuDebugOn(!inode->i_nlink); ++ clear_nlink(inode); ++ au_nlink_unlock(inode); ++} ++ ++void vfsub_set_nlink(struct inode *inode, unsigned int nlink) ++{ ++ /* ++ * stop setting the value equal to the current one, in order to stop ++ * a useless warning from vfs:destroy_inode() about sb->s_remove_count. ++ */ ++ au_nlink_lock(inode); ++ if (nlink != inode->i_nlink) ++ set_nlink(inode, nlink); ++ au_nlink_unlock(inode); ++} ++ +int vfsub_update_h_iattr(struct path *h_path, int *did) +{ + int err; @@ -32428,7 +32516,7 @@ diff -Naur null/fs/aufs/vfsub.c linux-6.6.54/fs/aufs/vfsub.c + const unsigned int link_max = UINT_MAX >> 1; /* rough margin */ + + if (!au_test_fs_no_limit_nlink(inode->i_sb) -+ || inode->i_nlink < link_max) ++ || vfsub_inode_nlink(inode, AU_I_BRANCH) < link_max) + return 0; + return -EMLINK; +} @@ -32990,10 +33078,10 @@ diff -Naur null/fs/aufs/vfsub.c linux-6.6.54/fs/aufs/vfsub.c + + return err; +} -diff -Naur null/fs/aufs/vfsub.h linux-6.6.54/fs/aufs/vfsub.h +diff -Naur null/fs/aufs/vfsub.h linux-6.6.63/fs/aufs/vfsub.h --- /dev/null -+++ linux-6.6.54/fs/aufs/vfsub.h 2024-10-14 10:37:56.026536554 +0300 -@@ -0,0 +1,403 @@ ++++ linux-6.6.63/fs/aufs/vfsub.h 2024-12-18 15:12:59.300519526 +0300 +@@ -0,0 +1,442 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Copyright (C) 2005-2022 Junjiro R. Okajima @@ -33026,6 +33114,7 @@ diff -Naur null/fs/aufs/vfsub.h linux-6.6.54/fs/aufs/vfsub.h +#include +#include +#include "debug.h" ++#include "fstype.h" + +/* copied from linux/fs/internal.h */ +/* todo: BAD approach!! */ @@ -33053,17 +33142,55 @@ diff -Naur null/fs/aufs/vfsub.h linux-6.6.54/fs/aufs/vfsub.h + +/* ---------------------------------------------------------------------- */ + -+static inline void vfsub_drop_nlink(struct inode *inode) ++unsigned int vfsub_inode_nlink_aufs(struct inode *inode); ++ ++enum au_inode_type { ++ AU_I_AUFS, ++ AU_I_BRANCH, ++ AU_I_UNKNOWN ++}; ++ ++static inline unsigned int vfsub_inode_nlink(struct inode *inode, ++ enum au_inode_type type) +{ -+ AuDebugOn(!inode->i_nlink); -+ drop_nlink(inode); ++ unsigned int nlink; ++ ++ switch (type) { ++ case AU_I_AUFS: ++ nlink = vfsub_inode_nlink_aufs(inode); ++ break; ++ case AU_I_BRANCH: /* aufs cannot be a branch of another aufs mount */ ++ AuDebugOn(au_test_aufs(inode->i_sb)); ++ nlink = inode->i_nlink; ++ break; ++ case AU_I_UNKNOWN: ++ if (au_test_aufs(inode->i_sb)) ++ nlink = vfsub_inode_nlink_aufs(inode); ++ else ++ nlink = inode->i_nlink; ++ break; ++ }; ++ ++ return nlink; ++} ++ ++void vfsub_inc_nlink(struct inode *inode); ++void vfsub_drop_nlink(struct inode *inode); ++void vfsub_clear_nlink(struct inode *inode); ++void vfsub_set_nlink(struct inode *inode, unsigned int nlink); ++ ++static inline void vfsub_inode_nlink_init(struct inode *inode, ++ unsigned int nlink) ++{ ++ /* to ignore sb->s_remove_count, do not use set_nlink() */ ++ inode->__i_nlink = nlink; +} + +static inline void vfsub_dead_dir(struct inode *inode) +{ + AuDebugOn(!S_ISDIR(inode->i_mode)); + inode->i_flags |= S_DEAD; -+ clear_nlink(inode); ++ vfsub_clear_nlink(inode); +} + +static inline int vfsub_native_ro(struct inode *inode) @@ -33397,9 +33524,9 @@ diff -Naur null/fs/aufs/vfsub.h linux-6.6.54/fs/aufs/vfsub.h + +#endif /* __KERNEL__ */ +#endif /* __AUFS_VFSUB_H__ */ -diff -Naur null/fs/aufs/wbr_policy.c linux-6.6.54/fs/aufs/wbr_policy.c +diff -Naur null/fs/aufs/wbr_policy.c linux-6.6.63/fs/aufs/wbr_policy.c --- /dev/null -+++ linux-6.6.54/fs/aufs/wbr_policy.c 2024-10-14 10:37:56.026536554 +0300 ++++ linux-6.6.63/fs/aufs/wbr_policy.c 2024-12-18 15:12:59.300519526 +0300 @@ -0,0 +1,830 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -34231,9 +34358,9 @@ diff -Naur null/fs/aufs/wbr_policy.c linux-6.6.54/fs/aufs/wbr_policy.c + .fin = au_wbr_create_fin_mfs + } +}; -diff -Naur null/fs/aufs/whout.c linux-6.6.54/fs/aufs/whout.c +diff -Naur null/fs/aufs/whout.c linux-6.6.63/fs/aufs/whout.c --- /dev/null -+++ linux-6.6.54/fs/aufs/whout.c 2024-10-14 10:37:56.026536554 +0300 ++++ linux-6.6.63/fs/aufs/whout.c 2024-12-18 15:12:59.300519526 +0300 @@ -0,0 +1,1072 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -35218,10 +35345,10 @@ diff -Naur null/fs/aufs/whout.c linux-6.6.54/fs/aufs/whout.c + inode_unlock(wh_inode); + + if (!err) { -+ h_nlink = h_dir->i_nlink; ++ h_nlink = vfsub_inode_nlink(h_dir, AU_I_BRANCH); + err = vfsub_rmdir(h_dir, &wh_path); + /* some fs doesn't change the parent nlink in some cases */ -+ h_nlink -= h_dir->i_nlink; ++ h_nlink -= vfsub_inode_nlink(h_dir, AU_I_BRANCH); + } + + if (!err) { @@ -35307,9 +35434,9 @@ diff -Naur null/fs/aufs/whout.c linux-6.6.54/fs/aufs/whout.c + au_whtmp_rmdir_free(args); + } +} -diff -Naur null/fs/aufs/whout.h linux-6.6.54/fs/aufs/whout.h +diff -Naur null/fs/aufs/whout.h linux-6.6.63/fs/aufs/whout.h --- /dev/null -+++ linux-6.6.54/fs/aufs/whout.h 2024-10-14 10:37:56.026536554 +0300 ++++ linux-6.6.63/fs/aufs/whout.h 2024-12-18 15:12:59.300519526 +0300 @@ -0,0 +1,87 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* @@ -35398,10 +35525,10 @@ diff -Naur null/fs/aufs/whout.h linux-6.6.54/fs/aufs/whout.h + +#endif /* __KERNEL__ */ +#endif /* __AUFS_WHOUT_H__ */ -diff -Naur null/fs/aufs/wkq.c linux-6.6.54/fs/aufs/wkq.c +diff -Naur null/fs/aufs/wkq.c linux-6.6.63/fs/aufs/wkq.c --- /dev/null -+++ linux-6.6.54/fs/aufs/wkq.c 2024-10-14 10:37:56.026536554 +0300 -@@ -0,0 +1,372 @@ ++++ linux-6.6.63/fs/aufs/wkq.c 2024-12-18 15:12:59.300519526 +0300 +@@ -0,0 +1,370 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) 2005-2022 Junjiro R. Okajima @@ -35635,8 +35762,6 @@ diff -Naur null/fs/aufs/wkq.c linux-6.6.54/fs/aufs/wkq.c +/* + * Since struct completion is large, try allocating it dynamically. + */ -+#define AuWkqCompDeclare(name) struct completion *comp = NULL -+ +static int au_wkq_comp_alloc(struct au_wkinfo *wkinfo, struct completion **comp) +{ + *comp = kmalloc(sizeof(**comp), GFP_NOFS); @@ -35683,7 +35808,7 @@ diff -Naur null/fs/aufs/wkq.c linux-6.6.54/fs/aufs/wkq.c +int au_wkq_do_wait(unsigned int flags, au_wkq_func_t func, void *args) +{ + int err; -+ AuWkqCompDeclare(comp); ++ struct completion *comp = NULL; + struct au_wkinfo wkinfo = { + .flags = flags, + .func = func, @@ -35774,9 +35899,9 @@ diff -Naur null/fs/aufs/wkq.c linux-6.6.54/fs/aufs/wkq.c + + return err; +} -diff -Naur null/fs/aufs/wkq.h linux-6.6.54/fs/aufs/wkq.h +diff -Naur null/fs/aufs/wkq.h linux-6.6.63/fs/aufs/wkq.h --- /dev/null -+++ linux-6.6.54/fs/aufs/wkq.h 2024-10-14 10:37:56.026536554 +0300 ++++ linux-6.6.63/fs/aufs/wkq.h 2024-12-18 15:12:59.300519526 +0300 @@ -0,0 +1,89 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* @@ -35867,9 +35992,9 @@ diff -Naur null/fs/aufs/wkq.h linux-6.6.54/fs/aufs/wkq.h + +#endif /* __KERNEL__ */ +#endif /* __AUFS_WKQ_H__ */ -diff -Naur null/fs/aufs/xattr.c linux-6.6.54/fs/aufs/xattr.c +diff -Naur null/fs/aufs/xattr.c linux-6.6.63/fs/aufs/xattr.c --- /dev/null -+++ linux-6.6.54/fs/aufs/xattr.c 2024-10-14 10:37:56.026536554 +0300 ++++ linux-6.6.63/fs/aufs/xattr.c 2024-12-18 15:12:59.301519513 +0300 @@ -0,0 +1,360 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -36231,9 +36356,9 @@ diff -Naur null/fs/aufs/xattr.c linux-6.6.54/fs/aufs/xattr.c +{ + sb->s_xattr = au_xattr_handlers; +} -diff -Naur null/fs/aufs/xino.c linux-6.6.54/fs/aufs/xino.c +diff -Naur null/fs/aufs/xino.c linux-6.6.63/fs/aufs/xino.c --- /dev/null -+++ linux-6.6.54/fs/aufs/xino.c 2024-10-14 10:37:56.027536541 +0300 ++++ linux-6.6.63/fs/aufs/xino.c 2024-12-18 15:12:59.301519513 +0300 @@ -0,0 +1,1926 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -36434,7 +36559,7 @@ diff -Naur null/fs/aufs/xino.c linux-6.6.54/fs/aufs/xino.c + h_dir = d_inode(h_parent); + inode = file_inode(file); + /* no delegation since it is just created */ -+ if (inode->i_nlink) ++ if (vfsub_inode_nlink(inode, AU_I_BRANCH)) + err = vfsub_unlink(h_dir, &file->f_path, /*delegated*/NULL, + /*force*/0); + inode_unlock(h_dir); @@ -37335,7 +37460,7 @@ diff -Naur null/fs/aufs/xino.c linux-6.6.54/fs/aufs/xino.c + struct super_block *sb; + struct au_sbinfo *sbinfo; + -+ AuDebugOn(inode->i_nlink); ++ AuDebugOn(vfsub_inode_nlink(inode, AU_I_AUFS)); + + sb = inode->i_sb; + xib_calc_bit(inode->i_ino, &pindex, &bit); @@ -38024,7 +38149,7 @@ diff -Naur null/fs/aufs/xino.c linux-6.6.54/fs/aufs/xino.c + for (; bindex <= bbot; bindex++, hi++) { + h_inode = hi->hi_inode; + if (!h_inode -+ || (!unlinked && h_inode->i_nlink)) ++ || (!unlinked && vfsub_inode_nlink(h_inode, AU_I_BRANCH))) + continue; + + /* inode may not be revalidated */ @@ -38161,9 +38286,9 @@ diff -Naur null/fs/aufs/xino.c linux-6.6.54/fs/aufs/xino.c +out: + return err; +} -diff -Naur null/include/uapi/linux/aufs_type.h linux-6.6.54/include/uapi/linux/aufs_type.h +diff -Naur null/include/uapi/linux/aufs_type.h linux-6.6.63/include/uapi/linux/aufs_type.h --- /dev/null -+++ linux-6.6.54/include/uapi/linux/aufs_type.h 2024-10-14 10:37:56.027536541 +0300 ++++ linux-6.6.63/include/uapi/linux/aufs_type.h 2024-12-18 15:12:59.301519513 +0300 @@ -0,0 +1,452 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +/* @@ -38207,7 +38332,7 @@ diff -Naur null/include/uapi/linux/aufs_type.h linux-6.6.54/include/uapi/linux/a +#include +#endif /* __KERNEL__ */ + -+#define AUFS_VERSION "6.6.54-20241014" ++#define AUFS_VERSION "6.6.63-20241202" + +/* todo? move this to linux-2.6.19/include/magic.h */ +#define AUFS_SUPER_MAGIC ('a' << 24 | 'u' << 16 | 'f' << 8 | 's') diff --git a/kernel/tools/cpupowertools/files/patches/aufs6/lockdep-debug.patch b/kernel/tools/cpupowertools/files/patches/aufs6/lockdep-debug.patch index 610d5a5a..543fa732 100644 --- a/kernel/tools/cpupowertools/files/patches/aufs6/lockdep-debug.patch +++ b/kernel/tools/cpupowertools/files/patches/aufs6/lockdep-debug.patch @@ -1,5 +1,5 @@ SPDX-License-Identifier: GPL-2.0 -aufs6.6.54 lockdep patch +aufs6.6.63 lockdep patch diff --git a/include/linux/lockdep_types.h b/include/linux/lockdep_types.h index 2ebc323d345a..9d7009190515 100644 diff --git a/kernel/tools/cpupowertools/files/patches/aufs6/tmpfs-idr.patch b/kernel/tools/cpupowertools/files/patches/aufs6/tmpfs-idr.patch index a3e97af0..150827f9 100644 --- a/kernel/tools/cpupowertools/files/patches/aufs6/tmpfs-idr.patch +++ b/kernel/tools/cpupowertools/files/patches/aufs6/tmpfs-idr.patch @@ -21,7 +21,7 @@ index 134c686c8676..632d447caf64 100644 umode_t mode; /* Mount mode for root directory */ unsigned char huge; /* Whether to try for hugepages */ diff --git a/mm/shmem.c b/mm/shmem.c -index 3d721d5591dd..b6065f7cb931 100644 +index db7dd45c9181..554f1c80882e 100644 --- a/mm/shmem.c +++ b/mm/shmem.c @@ -111,7 +111,7 @@ struct shmem_falloc { @@ -63,7 +63,7 @@ index 3d721d5591dd..b6065f7cb931 100644 shmem_free_inode(inode->i_sb, freed); WARN_ON(inode->i_blocks); clear_inode(inode); -@@ -2528,6 +2535,25 @@ static struct inode *__shmem_get_inode(struct mnt_idmap *idmap, +@@ -2525,6 +2532,25 @@ static struct inode *__shmem_get_inode(struct mnt_idmap *idmap, break; } @@ -89,7 +89,7 @@ index 3d721d5591dd..b6065f7cb931 100644 lockdep_annotate_inode_mutex_key(inode); return inode; } -@@ -3776,8 +3802,7 @@ static struct dentry *shmem_get_parent(struct dentry *child) +@@ -3773,8 +3799,7 @@ static struct dentry *shmem_get_parent(struct dentry *child) static int shmem_match(struct inode *ino, void *vfh) { __u32 *fh = vfh; @@ -99,7 +99,7 @@ index 3d721d5591dd..b6065f7cb931 100644 return ino->i_ino == inum && fh[0] == ino->i_generation; } -@@ -3797,14 +3822,11 @@ static struct dentry *shmem_fh_to_dentry(struct super_block *sb, +@@ -3794,14 +3819,11 @@ static struct dentry *shmem_fh_to_dentry(struct super_block *sb, struct dentry *dentry = NULL; u64 inum; @@ -117,7 +117,7 @@ index 3d721d5591dd..b6065f7cb931 100644 if (inode) { dentry = shmem_find_alias(inode); iput(inode); -@@ -3816,30 +3838,15 @@ static struct dentry *shmem_fh_to_dentry(struct super_block *sb, +@@ -3813,30 +3835,15 @@ static struct dentry *shmem_fh_to_dentry(struct super_block *sb, static int shmem_encode_fh(struct inode *inode, __u32 *fh, int *len, struct inode *parent) { @@ -151,7 +151,7 @@ index 3d721d5591dd..b6065f7cb931 100644 return 1; } -@@ -3938,7 +3945,7 @@ static int shmem_parse_one(struct fs_context *fc, struct fs_parameter *param) +@@ -3935,7 +3942,7 @@ static int shmem_parse_one(struct fs_context *fc, struct fs_parameter *param) break; case Opt_nr_inodes: ctx->inodes = memparse(param->string, &rest); @@ -160,7 +160,7 @@ index 3d721d5591dd..b6065f7cb931 100644 goto bad_value; ctx->seen |= SHMEM_SEEN_INODES; break; -@@ -4224,7 +4231,7 @@ static int shmem_show_options(struct seq_file *seq, struct dentry *root) +@@ -4221,7 +4228,7 @@ static int shmem_show_options(struct seq_file *seq, struct dentry *root) if (sbinfo->max_blocks != shmem_default_max_blocks()) seq_printf(seq, ",size=%luk", K(sbinfo->max_blocks)); if (sbinfo->max_inodes != shmem_default_max_inodes()) @@ -169,7 +169,7 @@ index 3d721d5591dd..b6065f7cb931 100644 if (sbinfo->mode != (0777 | S_ISVTX)) seq_printf(seq, ",mode=%03ho", sbinfo->mode); if (!uid_eq(sbinfo->uid, GLOBAL_ROOT_UID)) -@@ -4278,6 +4285,8 @@ static void shmem_put_super(struct super_block *sb) +@@ -4275,6 +4282,8 @@ static void shmem_put_super(struct super_block *sb) #ifdef CONFIG_TMPFS_QUOTA shmem_disable_quotas(sb); #endif @@ -178,7 +178,7 @@ index 3d721d5591dd..b6065f7cb931 100644 free_percpu(sbinfo->ino_batch); percpu_counter_destroy(&sbinfo->used_blocks); mpol_put(sbinfo->mpol); -@@ -4322,9 +4331,11 @@ static int shmem_fill_super(struct super_block *sb, struct fs_context *fc) +@@ -4319,9 +4328,11 @@ static int shmem_fill_super(struct super_block *sb, struct fs_context *fc) #else sb->s_flags |= SB_NOUSER; #endif @@ -191,7 +191,7 @@ index 3d721d5591dd..b6065f7cb931 100644 if (sb->s_flags & SB_KERNMOUNT) { sbinfo->ino_batch = alloc_percpu(ino_t); if (!sbinfo->ino_batch) -@@ -4467,6 +4478,15 @@ static int shmem_error_remove_page(struct address_space *mapping, +@@ -4464,6 +4475,15 @@ static int shmem_error_remove_page(struct address_space *mapping, return 0; } @@ -207,7 +207,7 @@ index 3d721d5591dd..b6065f7cb931 100644 const struct address_space_operations shmem_aops = { .writepage = shmem_writepage, .dirty_folio = noop_dirty_folio, -@@ -4640,6 +4660,7 @@ void __init shmem_init(void) +@@ -4637,6 +4657,7 @@ void __init shmem_init(void) pr_err("Could not kern_mount tmpfs\n"); goto out1; } diff --git a/kernel/tools/cpupowertools/files/patches/linux/patch-6.6.67.xz b/kernel/tools/cpupowertools/files/patches/linux/patch-6.6.67.xz new file mode 100644 index 0000000000000000000000000000000000000000..f91e3394c3e6a29b8ff90a3fc436a914e6afa08f GIT binary patch literal 3606008 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