diff --git a/kernel/tools/cpupowertools/files/patches/aufs6/aufs6-standalone.patch b/kernel/tools/cpupowertools/files/patches/aufs6/aufs6-standalone.patch index 828406cc..77d7f73d 100644 --- a/kernel/tools/cpupowertools/files/patches/aufs6/aufs6-standalone.patch +++ b/kernel/tools/cpupowertools/files/patches/aufs6/aufs6-standalone.patch @@ -183,10 +183,18 @@ index c969f1f26be58..68eb672f425d9 100644 } +EXPORT_SYMBOL_GPL(task_work_run); diff --git a/security/security.c b/security/security.c -index c5981e558bc26..045dd716e3400 100644 +index c5981e558bc26..bf24ac08acb64 100644 --- a/security/security.c +++ b/security/security.c -@@ -1944,6 +1944,7 @@ int security_path_rmdir(const struct path *dir, struct dentry *dentry) +@@ -1909,6 +1909,7 @@ void security_path_post_mknod(struct mnt_idmap *idmap, struct dentry *dentry) + return; + call_void_hook(path_post_mknod, idmap, dentry); + } ++EXPORT_SYMBOL_GPL(security_path_post_mknod); + + /** + * security_path_mkdir() - Check if creating a new directory is allowed +@@ -1944,6 +1945,7 @@ int security_path_rmdir(const struct path *dir, struct dentry *dentry) return 0; return call_int_hook(path_rmdir, dir, dentry); } @@ -194,7 +202,7 @@ index c5981e558bc26..045dd716e3400 100644 /** * security_path_unlink() - Check if removing a hard link is allowed -@@ -1979,6 +1980,7 @@ int security_path_symlink(const struct path *dir, struct dentry *dentry, +@@ -1979,6 +1981,7 @@ int security_path_symlink(const struct path *dir, struct dentry *dentry, return 0; return call_int_hook(path_symlink, dir, dentry, old_name); } @@ -202,7 +210,7 @@ index c5981e558bc26..045dd716e3400 100644 /** * security_path_link - Check if creating a hard link is allowed -@@ -1997,6 +1999,7 @@ int security_path_link(struct dentry *old_dentry, const struct path *new_dir, +@@ -1997,6 +2000,7 @@ int security_path_link(struct dentry *old_dentry, const struct path *new_dir, return 0; return call_int_hook(path_link, old_dentry, new_dir, new_dentry); } @@ -210,7 +218,7 @@ index c5981e558bc26..045dd716e3400 100644 /** * security_path_rename() - Check if renaming a file is allowed -@@ -2058,6 +2061,7 @@ int security_path_chmod(const struct path *path, umode_t mode) +@@ -2058,6 +2062,7 @@ int security_path_chmod(const struct path *path, umode_t mode) return 0; return call_int_hook(path_chmod, path, mode); } @@ -218,7 +226,7 @@ index c5981e558bc26..045dd716e3400 100644 /** * security_path_chown() - Check if changing the file's owner/group is allowed -@@ -2075,6 +2079,7 @@ int security_path_chown(const struct path *path, kuid_t uid, kgid_t gid) +@@ -2075,6 +2080,7 @@ int security_path_chown(const struct path *path, kuid_t uid, kgid_t gid) return 0; return call_int_hook(path_chown, path, uid, gid); } @@ -226,7 +234,7 @@ index c5981e558bc26..045dd716e3400 100644 /** * security_path_chroot() - Check if changing the root directory is allowed -@@ -2319,6 +2324,7 @@ int security_inode_permission(struct inode *inode, int mask) +@@ -2319,6 +2325,7 @@ int security_inode_permission(struct inode *inode, int mask) return 0; return call_int_hook(inode_permission, inode, mask); } @@ -234,7 +242,7 @@ index c5981e558bc26..045dd716e3400 100644 /** * security_inode_setattr() - Check if setting file attributes is allowed -@@ -2840,6 +2846,7 @@ int security_file_permission(struct file *file, int mask) +@@ -2840,6 +2847,7 @@ int security_file_permission(struct file *file, int mask) { return call_int_hook(file_permission, file, mask); } @@ -242,7 +250,7 @@ index c5981e558bc26..045dd716e3400 100644 /** * security_file_alloc() - Allocate and init a file's LSM blob -@@ -3144,6 +3151,7 @@ int security_file_truncate(struct file *file) +@@ -3144,6 +3152,7 @@ int security_file_truncate(struct file *file) { return call_int_hook(file_truncate, file); } diff --git a/kernel/tools/cpupowertools/files/patches/aufs6/aufs6.12-20251110.patch b/kernel/tools/cpupowertools/files/patches/aufs6/aufs6.12-20260112.patch similarity index 97% rename from kernel/tools/cpupowertools/files/patches/aufs6/aufs6.12-20251110.patch rename to kernel/tools/cpupowertools/files/patches/aufs6/aufs6.12-20260112.patch index 5730cddb..90a69c06 100644 --- a/kernel/tools/cpupowertools/files/patches/aufs6/aufs6.12-20251110.patch +++ b/kernel/tools/cpupowertools/files/patches/aufs6/aufs6.12-20260112.patch @@ -1,6 +1,6 @@ -diff -Naur null/Documentation/ABI/testing/debugfs-aufs linux-6.12.29/Documentation/ABI/testing/debugfs-aufs +diff -Naur null/Documentation/ABI/testing/debugfs-aufs linux-6.12.30/Documentation/ABI/testing/debugfs-aufs --- /dev/null -+++ linux-6.12.29/Documentation/ABI/testing/debugfs-aufs 2025-12-15 21:34:57.602338389 +0300 ++++ linux-6.12.30/Documentation/ABI/testing/debugfs-aufs 2026-01-22 12:14:10.998746517 +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.12.29/Documentati + 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.12.29/Documentation/ABI/testing/sysfs-aufs +diff -Naur null/Documentation/ABI/testing/sysfs-aufs linux-6.12.30/Documentation/ABI/testing/sysfs-aufs --- /dev/null -+++ linux-6.12.29/Documentation/ABI/testing/sysfs-aufs 2025-12-15 21:34:57.602338389 +0300 ++++ linux-6.12.30/Documentation/ABI/testing/sysfs-aufs 2026-01-22 12:14:10.998746517 +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.12.29/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.12.29/Documentation/filesystems/aufs/design/01intro.txt +diff -Naur null/Documentation/filesystems/aufs/design/01intro.txt linux-6.12.30/Documentation/filesystems/aufs/design/01intro.txt --- /dev/null -+++ linux-6.12.29/Documentation/filesystems/aufs/design/01intro.txt 2025-12-15 21:34:57.602338389 +0300 ++++ linux-6.12.30/Documentation/filesystems/aufs/design/01intro.txt 2026-01-22 12:14:10.999746505 +0300 @@ -0,0 +1,171 @@ + +# Copyright (C) 2005-2025 Junjiro R. Okajima @@ -267,9 +267,9 @@ diff -Naur null/Documentation/filesystems/aufs/design/01intro.txt linux-6.12.29/ +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.12.29/Documentation/filesystems/aufs/design/02struct.txt +diff -Naur null/Documentation/filesystems/aufs/design/02struct.txt linux-6.12.30/Documentation/filesystems/aufs/design/02struct.txt --- /dev/null -+++ linux-6.12.29/Documentation/filesystems/aufs/design/02struct.txt 2025-12-15 21:34:57.602338389 +0300 ++++ linux-6.12.30/Documentation/filesystems/aufs/design/02struct.txt 2026-01-22 12:14:10.999746505 +0300 @@ -0,0 +1,258 @@ + +# Copyright (C) 2005-2025 Junjiro R. Okajima @@ -529,9 +529,9 @@ diff -Naur null/Documentation/filesystems/aufs/design/02struct.txt linux-6.12.29 +- etc. + +For this purpose, use "aumvdown" command in aufs-util.git. -diff -Naur null/Documentation/filesystems/aufs/design/03atomic_open.txt linux-6.12.29/Documentation/filesystems/aufs/design/03atomic_open.txt +diff -Naur null/Documentation/filesystems/aufs/design/03atomic_open.txt linux-6.12.30/Documentation/filesystems/aufs/design/03atomic_open.txt --- /dev/null -+++ linux-6.12.29/Documentation/filesystems/aufs/design/03atomic_open.txt 2025-12-15 21:34:57.602338389 +0300 ++++ linux-6.12.30/Documentation/filesystems/aufs/design/03atomic_open.txt 2026-01-22 12:14:10.999746505 +0300 @@ -0,0 +1,85 @@ + +# Copyright (C) 2015-2025 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.12.29/Documentation/filesystems/aufs/design/03lookup.txt +diff -Naur null/Documentation/filesystems/aufs/design/03lookup.txt linux-6.12.30/Documentation/filesystems/aufs/design/03lookup.txt --- /dev/null -+++ linux-6.12.29/Documentation/filesystems/aufs/design/03lookup.txt 2025-12-15 21:34:57.602338389 +0300 ++++ linux-6.12.30/Documentation/filesystems/aufs/design/03lookup.txt 2026-01-22 12:14:10.999746505 +0300 @@ -0,0 +1,113 @@ + +# Copyright (C) 2005-2025 Junjiro R. Okajima @@ -735,9 +735,9 @@ diff -Naur null/Documentation/filesystems/aufs/design/03lookup.txt linux-6.12.29 + 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.12.29/Documentation/filesystems/aufs/design/04branch.txt +diff -Naur null/Documentation/filesystems/aufs/design/04branch.txt linux-6.12.30/Documentation/filesystems/aufs/design/04branch.txt --- /dev/null -+++ linux-6.12.29/Documentation/filesystems/aufs/design/04branch.txt 2025-12-15 21:34:57.602338389 +0300 ++++ linux-6.12.30/Documentation/filesystems/aufs/design/04branch.txt 2026-01-22 12:14:10.999746505 +0300 @@ -0,0 +1,74 @@ + +# Copyright (C) 2005-2025 Junjiro R. Okajima @@ -813,9 +813,9 @@ diff -Naur null/Documentation/filesystems/aufs/design/04branch.txt linux-6.12.29 + - 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.12.29/Documentation/filesystems/aufs/design/05wbr_policy.txt +diff -Naur null/Documentation/filesystems/aufs/design/05wbr_policy.txt linux-6.12.30/Documentation/filesystems/aufs/design/05wbr_policy.txt --- /dev/null -+++ linux-6.12.29/Documentation/filesystems/aufs/design/05wbr_policy.txt 2025-12-15 21:34:57.603338376 +0300 ++++ linux-6.12.30/Documentation/filesystems/aufs/design/05wbr_policy.txt 2026-01-22 12:14:10.999746505 +0300 @@ -0,0 +1,64 @@ + +# Copyright (C) 2005-2025 Junjiro R. Okajima @@ -881,9 +881,9 @@ diff -Naur null/Documentation/filesystems/aufs/design/05wbr_policy.txt linux-6.1 + 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.12.29/Documentation/filesystems/aufs/design/06dirren.dot +diff -Naur null/Documentation/filesystems/aufs/design/06dirren.dot linux-6.12.30/Documentation/filesystems/aufs/design/06dirren.dot --- /dev/null -+++ linux-6.12.29/Documentation/filesystems/aufs/design/06dirren.dot 2025-12-15 21:34:57.603338376 +0300 ++++ linux-6.12.30/Documentation/filesystems/aufs/design/06dirren.dot 2026-01-22 12:14:10.999746505 +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.12.29 + +aufs_lookup -> whinfo [label="load/remove"]; +} -diff -Naur null/Documentation/filesystems/aufs/design/06dirren.txt linux-6.12.29/Documentation/filesystems/aufs/design/06dirren.txt +diff -Naur null/Documentation/filesystems/aufs/design/06dirren.txt linux-6.12.30/Documentation/filesystems/aufs/design/06dirren.txt --- /dev/null -+++ linux-6.12.29/Documentation/filesystems/aufs/design/06dirren.txt 2025-12-15 21:34:57.603338376 +0300 ++++ linux-6.12.30/Documentation/filesystems/aufs/design/06dirren.txt 2026-01-22 12:14:10.999746505 +0300 @@ -0,0 +1,102 @@ + +# Copyright (C) 2017-2025 Junjiro R. Okajima @@ -1035,9 +1035,9 @@ diff -Naur null/Documentation/filesystems/aufs/design/06dirren.txt linux-6.12.29 +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.12.29/Documentation/filesystems/aufs/design/06fhsm.txt +diff -Naur null/Documentation/filesystems/aufs/design/06fhsm.txt linux-6.12.30/Documentation/filesystems/aufs/design/06fhsm.txt --- /dev/null -+++ linux-6.12.29/Documentation/filesystems/aufs/design/06fhsm.txt 2025-12-15 21:34:57.603338376 +0300 ++++ linux-6.12.30/Documentation/filesystems/aufs/design/06fhsm.txt 2026-01-22 12:14:10.999746505 +0300 @@ -0,0 +1,118 @@ + +# Copyright (C) 2011-2025 Junjiro R. Okajima @@ -1157,9 +1157,9 @@ diff -Naur null/Documentation/filesystems/aufs/design/06fhsm.txt linux-6.12.29/D + +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.12.29/Documentation/filesystems/aufs/design/06mmap.txt +diff -Naur null/Documentation/filesystems/aufs/design/06mmap.txt linux-6.12.30/Documentation/filesystems/aufs/design/06mmap.txt --- /dev/null -+++ linux-6.12.29/Documentation/filesystems/aufs/design/06mmap.txt 2025-12-15 21:34:57.603338376 +0300 ++++ linux-6.12.30/Documentation/filesystems/aufs/design/06mmap.txt 2026-01-22 12:14:10.999746505 +0300 @@ -0,0 +1,40 @@ + +# Copyright (C) 2005-2025 Junjiro R. Okajima @@ -1201,9 +1201,9 @@ diff -Naur null/Documentation/filesystems/aufs/design/06mmap.txt linux-6.12.29/D +approach and switched to modifiying file_user_{path,inode}() since +aufs6.12. It also requires to changes to 'vm_file' in mainline, but it +will be much smaller than the approach aufs used to take. -diff -Naur null/Documentation/filesystems/aufs/design/06xattr.txt linux-6.12.29/Documentation/filesystems/aufs/design/06xattr.txt +diff -Naur null/Documentation/filesystems/aufs/design/06xattr.txt linux-6.12.30/Documentation/filesystems/aufs/design/06xattr.txt --- /dev/null -+++ linux-6.12.29/Documentation/filesystems/aufs/design/06xattr.txt 2025-12-15 21:34:57.603338376 +0300 ++++ linux-6.12.30/Documentation/filesystems/aufs/design/06xattr.txt 2026-01-22 12:14:10.999746505 +0300 @@ -0,0 +1,94 @@ + +# Copyright (C) 2014-2025 Junjiro R. Okajima @@ -1299,9 +1299,9 @@ diff -Naur null/Documentation/filesystems/aufs/design/06xattr.txt linux-6.12.29/ +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.12.29/Documentation/filesystems/aufs/design/07export.txt +diff -Naur null/Documentation/filesystems/aufs/design/07export.txt linux-6.12.30/Documentation/filesystems/aufs/design/07export.txt --- /dev/null -+++ linux-6.12.29/Documentation/filesystems/aufs/design/07export.txt 2025-12-15 21:34:57.603338376 +0300 ++++ linux-6.12.30/Documentation/filesystems/aufs/design/07export.txt 2026-01-22 12:14:11.002746467 +0300 @@ -0,0 +1,58 @@ + +# Copyright (C) 2005-2025 Junjiro R. Okajima @@ -1361,9 +1361,9 @@ diff -Naur null/Documentation/filesystems/aufs/design/07export.txt linux-6.12.29 + 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.12.29/Documentation/filesystems/aufs/design/08shwh.txt +diff -Naur null/Documentation/filesystems/aufs/design/08shwh.txt linux-6.12.30/Documentation/filesystems/aufs/design/08shwh.txt --- /dev/null -+++ linux-6.12.29/Documentation/filesystems/aufs/design/08shwh.txt 2025-12-15 21:34:57.603338376 +0300 ++++ linux-6.12.30/Documentation/filesystems/aufs/design/08shwh.txt 2026-01-22 12:14:11.002746467 +0300 @@ -0,0 +1,52 @@ + +# Copyright (C) 2005-2025 Junjiro R. Okajima @@ -1417,9 +1417,9 @@ diff -Naur null/Documentation/filesystems/aufs/design/08shwh.txt linux-6.12.29/D + +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.12.29/Documentation/filesystems/aufs/design/10dynop.txt +diff -Naur null/Documentation/filesystems/aufs/design/10dynop.txt linux-6.12.30/Documentation/filesystems/aufs/design/10dynop.txt --- /dev/null -+++ linux-6.12.29/Documentation/filesystems/aufs/design/10dynop.txt 2025-12-15 21:34:57.603338376 +0300 ++++ linux-6.12.30/Documentation/filesystems/aufs/design/10dynop.txt 2026-01-22 12:14:11.002746467 +0300 @@ -0,0 +1,47 @@ + +# Copyright (C) 2010-2025 Junjiro R. Okajima @@ -1468,9 +1468,9 @@ diff -Naur null/Documentation/filesystems/aufs/design/10dynop.txt linux-6.12.29/ +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.12.29/Documentation/filesystems/aufs/README +diff -Naur null/Documentation/filesystems/aufs/README linux-6.12.30/Documentation/filesystems/aufs/README --- /dev/null -+++ linux-6.12.29/Documentation/filesystems/aufs/README 2025-12-15 21:34:57.602338389 +0300 ++++ linux-6.12.30/Documentation/filesystems/aufs/README 2026-01-22 12:14:10.999746505 +0300 @@ -0,0 +1,409 @@ + +Aufs6 -- advanced multi layered unification filesystem version 6.x @@ -1881,9 +1881,9 @@ diff -Naur null/Documentation/filesystems/aufs/README linux-6.12.29/Documentatio +# Local variables: ; +# mode: text; +# End: ; -diff -Naur null/fs/aufs/aufs.h linux-6.12.29/fs/aufs/aufs.h +diff -Naur null/fs/aufs/aufs.h linux-6.12.30/fs/aufs/aufs.h --- /dev/null -+++ linux-6.12.29/fs/aufs/aufs.h 2025-12-15 21:34:57.604338363 +0300 ++++ linux-6.12.30/fs/aufs/aufs.h 2026-01-22 12:14:11.003746455 +0300 @@ -0,0 +1,62 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* @@ -1947,9 +1947,9 @@ diff -Naur null/fs/aufs/aufs.h linux-6.12.29/fs/aufs/aufs.h + +#endif /* __KERNEL__ */ +#endif /* __AUFS_H__ */ -diff -Naur null/fs/aufs/branch.c linux-6.12.29/fs/aufs/branch.c +diff -Naur null/fs/aufs/branch.c linux-6.12.30/fs/aufs/branch.c --- /dev/null -+++ linux-6.12.29/fs/aufs/branch.c 2025-12-15 21:34:57.604338363 +0300 ++++ linux-6.12.30/fs/aufs/branch.c 2026-01-22 12:14:11.003746455 +0300 @@ -0,0 +1,1427 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -3378,9 +3378,9 @@ diff -Naur null/fs/aufs/branch.c linux-6.12.29/fs/aufs/branch.c + + return err; +} -diff -Naur null/fs/aufs/branch.h linux-6.12.29/fs/aufs/branch.h +diff -Naur null/fs/aufs/branch.h linux-6.12.30/fs/aufs/branch.h --- /dev/null -+++ linux-6.12.29/fs/aufs/branch.h 2025-12-15 21:34:57.605338351 +0300 ++++ linux-6.12.30/fs/aufs/branch.h 2026-01-22 12:14:11.003746455 +0300 @@ -0,0 +1,375 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* @@ -3757,9 +3757,9 @@ diff -Naur null/fs/aufs/branch.h linux-6.12.29/fs/aufs/branch.h + +#endif /* __KERNEL__ */ +#endif /* __AUFS_BRANCH_H__ */ -diff -Naur null/fs/aufs/conf.mk linux-6.12.29/fs/aufs/conf.mk +diff -Naur null/fs/aufs/conf.mk linux-6.12.30/fs/aufs/conf.mk --- /dev/null -+++ linux-6.12.29/fs/aufs/conf.mk 2025-12-15 21:34:57.605338351 +0300 ++++ linux-6.12.30/fs/aufs/conf.mk 2026-01-22 12:14:11.004746442 +0300 @@ -0,0 +1,40 @@ +# SPDX-License-Identifier: GPL-2.0 + @@ -3801,10 +3801,10 @@ diff -Naur null/fs/aufs/conf.mk linux-6.12.29/fs/aufs/conf.mk +${obj}/sysfs.o: ${AuConfName} + +-include ${srctree}/${src}/conf_priv.mk -diff -Naur null/fs/aufs/cpup.c linux-6.12.29/fs/aufs/cpup.c +diff -Naur null/fs/aufs/cpup.c linux-6.12.30/fs/aufs/cpup.c --- /dev/null -+++ linux-6.12.29/fs/aufs/cpup.c 2025-12-15 21:34:57.605338351 +0300 -@@ -0,0 +1,1458 @@ ++++ linux-6.12.30/fs/aufs/cpup.c 2026-01-22 12:14:11.004746442 +0300 +@@ -0,0 +1,1446 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) 2005-2025 Junjiro R. Okajima @@ -3954,8 +3954,7 @@ diff -Naur null/fs/aufs/cpup.c linux-6.12.29/fs/aufs/cpup.c + attr.ia_valid = ATTR_FORCE | ATTR_MTIME | ATTR_MTIME_SET + | ATTR_ATIME | ATTR_ATIME_SET; + -+ /* no delegation since this is a directory */ -+ err = vfsub_notify_change(&dt->dt_h_path, &attr, /*delegated*/NULL); ++ err = vfsub_notify_change(&dt->dt_h_path, &attr); + if (unlikely(err)) + pr_warn("restoring timestamps failed(%d). ignored\n", err); +} @@ -4016,14 +4015,13 @@ diff -Naur null/fs/aufs/cpup.c linux-6.12.29/fs/aufs/cpup.c + sbits = !!(h_isrc->i_mode & (S_ISUID | S_ISGID)); + au_cpup_attr_flags(h_idst, h_isrc->i_flags); + } -+ /* no delegation since it is just created */ -+ err = vfsub_notify_change(&h_path, &ia, /*delegated*/NULL); ++ err = vfsub_notify_change(&h_path, &ia); + + /* is this nfs only? */ + if (!err && sbits && au_test_nfs(h_path.dentry->d_sb)) { + ia.ia_valid = ATTR_FORCE | ATTR_MODE; + ia.ia_mode = h_isrc->i_mode; -+ err = vfsub_notify_change(&h_path, &ia, /*delegated*/NULL); ++ err = vfsub_notify_change(&h_path, &ia); + } + + icex = br->br_perm & AuBrAttr_ICEX; @@ -4127,9 +4125,7 @@ diff -Naur null/fs/aufs/cpup.c linux-6.12.29/fs/aufs/cpup.c + ia->ia_file = dst; + h_inode = file_inode(dst); + inode_lock_nested(h_inode, AuLsc_I_CHILD2); -+ /* no delegation since it is just created */ -+ err = vfsub_notify_change(&dst->f_path, ia, -+ /*delegated*/NULL); ++ err = vfsub_notify_change(&dst->f_path, ia); + inode_unlock(h_inode); + } + } @@ -4322,7 +4318,7 @@ diff -Naur null/fs/aufs/cpup.c linux-6.12.29/fs/aufs/cpup.c + int err, rerr; + loff_t l; + struct path h_path; -+ struct inode *h_src_inode, *h_dst_inode; ++ struct inode *h_src_inode; + + err = 0; + h_src_inode = au_h_iptr(d_inode(cpg->dentry), cpg->bsrc); @@ -4360,13 +4356,6 @@ diff -Naur null/fs/aufs/cpup.c linux-6.12.29/fs/aufs/cpup.c + if (!err && rerr) + err = rerr; + } -+ if (!err && (h_src_inode->i_state & I_LINKABLE)) { -+ h_path.dentry = au_h_dptr(cpg->dentry, cpg->bdst); -+ h_dst_inode = d_inode(h_path.dentry); -+ spin_lock(&h_dst_inode->i_lock); -+ h_dst_inode->i_state |= I_LINKABLE; -+ spin_unlock(&h_dst_inode->i_lock); -+ } + +out: + return err; @@ -4524,7 +4513,7 @@ diff -Naur null/fs/aufs/cpup.c linux-6.12.29/fs/aufs/cpup.c + && !isdir + && au_opt_test(mnt_flags, XINO) + && (vfsub_inode_nlink(h_inode, AU_I_BRANCH) == 1 -+ || (h_inode->i_state & I_LINKABLE)) ++ || au_ii(d_inode(cpg->dentry))->ii_tmpfile) + /* todo: unnecessary? */ + /* && d_inode(cpg->dentry)->i_nlink == 1 */ + && cpg->bdst < cpg->bsrc @@ -4582,9 +4571,7 @@ diff -Naur null/fs/aufs/cpup.c linux-6.12.29/fs/aufs/cpup.c + h_dir = d_inode(h_parent); + IMustLock(h_dir); + AuDbg("%pd %pd\n", h_dentry, h_path->dentry); -+ /* no delegation since it is just created */ -+ err = vfsub_rename(h_dir, h_dentry, h_dir, h_path, /*delegated*/NULL, -+ /*flags*/0); ++ err = vfsub_rename(h_dir, h_dentry, h_dir, h_path, /*flags*/0); + dput(h_path->dentry); + +out: @@ -4606,7 +4593,7 @@ diff -Naur null/fs/aufs/cpup.c linux-6.12.29/fs/aufs/cpup.c + aufs_bindex_t old_ibtop; + unsigned char isdir, plink; + struct dentry *h_src, *h_dst, *h_parent; -+ struct inode *dst_inode, *h_dir, *inode, *delegated, *src_inode; ++ struct inode *dst_inode, *h_dir, *inode, *src_inode; + struct super_block *sb; + struct au_branch *br; + struct path h_src_path; @@ -4639,6 +4626,10 @@ diff -Naur null/fs/aufs/cpup.c linux-6.12.29/fs/aufs/cpup.c + else + dget(dst_parent); + ++ err = vfsub_mnt_want_write(a->h_path.mnt); ++ if (unlikely(err)) ++ goto out_parent; ++ + plink = !!au_opt_test(au_mntflags(sb), PLINK); + dst_inode = au_h_iptr(inode, cpg->bdst); + if (dst_inode) { @@ -4647,7 +4638,7 @@ diff -Naur null/fs/aufs/cpup.c linux-6.12.29/fs/aufs/cpup.c + AuIOErr("hi%lu(i%lu) exists on b%d " + "but plink is disabled\n", + dst_inode->i_ino, inode->i_ino, cpg->bdst); -+ goto out_parent; ++ goto out_mnt_write; + } + + if (vfsub_inode_nlink(dst_inode, AU_I_BRANCH)) { @@ -4656,14 +4647,14 @@ diff -Naur null/fs/aufs/cpup.c linux-6.12.29/fs/aufs/cpup.c + h_src = au_plink_lkup(inode, cpg->bdst); + err = PTR_ERR(h_src); + if (IS_ERR(h_src)) -+ goto out_parent; ++ goto out_mnt_write; + if (unlikely(d_is_negative(h_src))) { + err = -EIO; + AuIOErr("i%lu exists on b%d " + "but not pseudo-linked\n", + inode->i_ino, cpg->bdst); + dput(h_src); -+ goto out_parent; ++ goto out_mnt_write; + } + + if (do_dt) { @@ -4672,19 +4663,13 @@ diff -Naur null/fs/aufs/cpup.c linux-6.12.29/fs/aufs/cpup.c + } + + a->h_path.dentry = h_dst; -+ delegated = NULL; -+ err = vfsub_link(h_src, h_dir, &a->h_path, &delegated); ++ err = vfsub_link(h_src, h_dir, &a->h_path); + if (!err && au_ftest_cpup(cpg->flags, RENAME)) + err = au_do_ren_after_cpup(cpg, &a->h_path); + if (do_dt) + au_dtime_revert(&a->dt); -+ if (unlikely(err == -EWOULDBLOCK)) { -+ pr_warn("cannot retry for NFSv4 delegation" -+ " for an internal link\n"); -+ iput(delegated); -+ } + dput(h_src); -+ goto out_parent; ++ goto out_mnt_write; + } else + /* todo: cpup_wh_file? */ + /* udba work */ @@ -4736,7 +4721,7 @@ diff -Naur null/fs/aufs/cpup.c linux-6.12.29/fs/aufs/cpup.c + src_inode = d_inode(h_src); + if (!isdir + && (vfsub_inode_nlink(src_inode, AU_I_BRANCH) > 1 -+ || src_inode->i_state & I_LINKABLE) ++ || au_ii(inode)->ii_tmpfile) + && plink) + au_plink_append(inode, cpg->bdst, h_dst); + @@ -4745,7 +4730,7 @@ diff -Naur null/fs/aufs/cpup.c linux-6.12.29/fs/aufs/cpup.c + err = au_do_ren_after_cpup(cpg, &a->h_path); + } + if (!err) -+ goto out_parent; /* success */ ++ goto out_mnt_write; /* success */ + + /* revert */ +out_rev: @@ -4755,9 +4740,7 @@ diff -Naur null/fs/aufs/cpup.c linux-6.12.29/fs/aufs/cpup.c + rerr = 0; + if (d_is_positive(h_dst)) { + if (!isdir) { -+ /* no delegation since it is just created */ -+ rerr = vfsub_unlink(h_dir, &a->h_path, -+ /*delegated*/NULL, /*force*/0); ++ rerr = vfsub_unlink(h_dir, &a->h_path, /*force*/0); + } else + rerr = vfsub_rmdir(h_dir, &a->h_path); + } @@ -4766,6 +4749,8 @@ diff -Naur null/fs/aufs/cpup.c linux-6.12.29/fs/aufs/cpup.c + AuIOErr("failed removing broken entry(%d, %d)\n", err, rerr); + err = -EIO; + } ++out_mnt_write: ++ vfsub_mnt_drop_write(a->h_path.mnt); +out_parent: + dput(dst_parent); + au_kfree_rcu(a); @@ -5044,12 +5029,14 @@ diff -Naur null/fs/aufs/cpup.c linux-6.12.29/fs/aufs/cpup.c + if (unlikely(err)) + goto out_wh; + ++ err = vfsub_mnt_want_write(h_path.mnt); ++ if (unlikely(err)) ++ goto out_wh; ++ + dget(wh_dentry); + h_path.dentry = wh_dentry; + if (!d_is_dir(wh_dentry)) { -+ /* no delegation since it is just created */ -+ err = vfsub_unlink(d_inode(h_parent), &h_path, -+ /*delegated*/NULL, /*force*/0); ++ err = vfsub_unlink(d_inode(h_parent), &h_path, /*force*/0); + } else + err = vfsub_rmdir(d_inode(h_parent), &h_path); + if (unlikely(err)) { @@ -5058,6 +5045,7 @@ diff -Naur null/fs/aufs/cpup.c linux-6.12.29/fs/aufs/cpup.c + err = -EIO; + } + au_dtime_revert(&dt); ++ vfsub_mnt_drop_write(h_path.mnt); + au_set_hi_wh(d_inode(dentry), bdst, wh_dentry); + +out_wh: @@ -5263,9 +5251,9 @@ diff -Naur null/fs/aufs/cpup.c linux-6.12.29/fs/aufs/cpup.c + dput(parent); + return err; +} -diff -Naur null/fs/aufs/cpup.h linux-6.12.29/fs/aufs/cpup.h +diff -Naur null/fs/aufs/cpup.h linux-6.12.30/fs/aufs/cpup.h --- /dev/null -+++ linux-6.12.29/fs/aufs/cpup.h 2025-12-15 21:34:57.605338351 +0300 ++++ linux-6.12.30/fs/aufs/cpup.h 2026-01-22 12:14:11.004746442 +0300 @@ -0,0 +1,101 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* @@ -5368,9 +5356,9 @@ diff -Naur null/fs/aufs/cpup.h linux-6.12.29/fs/aufs/cpup.h + +#endif /* __KERNEL__ */ +#endif /* __AUFS_CPUP_H__ */ -diff -Naur null/fs/aufs/dbgaufs.c linux-6.12.29/fs/aufs/dbgaufs.c +diff -Naur null/fs/aufs/dbgaufs.c linux-6.12.30/fs/aufs/dbgaufs.c --- /dev/null -+++ linux-6.12.29/fs/aufs/dbgaufs.c 2025-12-15 21:34:57.605338351 +0300 ++++ linux-6.12.30/fs/aufs/dbgaufs.c 2026-01-22 12:14:11.004746442 +0300 @@ -0,0 +1,526 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -5898,9 +5886,9 @@ diff -Naur null/fs/aufs/dbgaufs.c linux-6.12.29/fs/aufs/dbgaufs.c + err = 0; + return err; +} -diff -Naur null/fs/aufs/dbgaufs.h linux-6.12.29/fs/aufs/dbgaufs.h +diff -Naur null/fs/aufs/dbgaufs.h linux-6.12.30/fs/aufs/dbgaufs.h --- /dev/null -+++ linux-6.12.29/fs/aufs/dbgaufs.h 2025-12-15 21:34:57.605338351 +0300 ++++ linux-6.12.30/fs/aufs/dbgaufs.h 2026-01-22 12:14:11.004746442 +0300 @@ -0,0 +1,53 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* @@ -5955,9 +5943,9 @@ diff -Naur null/fs/aufs/dbgaufs.h linux-6.12.29/fs/aufs/dbgaufs.h + +#endif /* __KERNEL__ */ +#endif /* __DBGAUFS_H__ */ -diff -Naur null/fs/aufs/dcsub.c linux-6.12.29/fs/aufs/dcsub.c +diff -Naur null/fs/aufs/dcsub.c linux-6.12.30/fs/aufs/dcsub.c --- /dev/null -+++ linux-6.12.29/fs/aufs/dcsub.c 2025-12-15 21:34:57.605338351 +0300 ++++ linux-6.12.30/fs/aufs/dcsub.c 2026-01-22 12:14:11.004746442 +0300 @@ -0,0 +1,225 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -6184,9 +6172,9 @@ diff -Naur null/fs/aufs/dcsub.c linux-6.12.29/fs/aufs/dcsub.c + + return path_is_under(path + 0, path + 1); +} -diff -Naur null/fs/aufs/dcsub.h linux-6.12.29/fs/aufs/dcsub.h +diff -Naur null/fs/aufs/dcsub.h linux-6.12.30/fs/aufs/dcsub.h --- /dev/null -+++ linux-6.12.29/fs/aufs/dcsub.h 2025-12-15 21:34:57.605338351 +0300 ++++ linux-6.12.30/fs/aufs/dcsub.h 2026-01-22 12:14:11.004746442 +0300 @@ -0,0 +1,139 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* @@ -6327,9 +6315,9 @@ diff -Naur null/fs/aufs/dcsub.h linux-6.12.29/fs/aufs/dcsub.h + +#endif /* __KERNEL__ */ +#endif /* __AUFS_DCSUB_H__ */ -diff -Naur null/fs/aufs/debug.c linux-6.12.29/fs/aufs/debug.c +diff -Naur null/fs/aufs/debug.c linux-6.12.30/fs/aufs/debug.c --- /dev/null -+++ linux-6.12.29/fs/aufs/debug.c 2025-12-15 21:34:57.605338351 +0300 ++++ linux-6.12.30/fs/aufs/debug.c 2026-01-22 12:14:11.004746442 +0300 @@ -0,0 +1,448 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -6779,9 +6767,9 @@ diff -Naur null/fs/aufs/debug.c linux-6.12.29/fs/aufs/debug.c + + return 0; +} -diff -Naur null/fs/aufs/debug.h linux-6.12.29/fs/aufs/debug.h +diff -Naur null/fs/aufs/debug.h linux-6.12.30/fs/aufs/debug.h --- /dev/null -+++ linux-6.12.29/fs/aufs/debug.h 2025-12-15 21:34:57.605338351 +0300 ++++ linux-6.12.30/fs/aufs/debug.h 2026-01-22 12:14:11.004746442 +0300 @@ -0,0 +1,226 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* @@ -7009,10 +6997,10 @@ diff -Naur null/fs/aufs/debug.h linux-6.12.29/fs/aufs/debug.h + +#endif /* __KERNEL__ */ +#endif /* __AUFS_DEBUG_H__ */ -diff -Naur null/fs/aufs/dentry.c linux-6.12.29/fs/aufs/dentry.c +diff -Naur null/fs/aufs/dentry.c linux-6.12.30/fs/aufs/dentry.c --- /dev/null -+++ linux-6.12.29/fs/aufs/dentry.c 2025-12-15 21:34:57.606338338 +0300 -@@ -0,0 +1,1176 @@ ++++ linux-6.12.30/fs/aufs/dentry.c 2026-01-22 12:14:11.007746405 +0300 +@@ -0,0 +1,1178 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) 2005-2025 Junjiro R. Okajima @@ -8128,8 +8116,10 @@ diff -Naur null/fs/aufs/dentry.c linux-6.12.29/fs/aufs/dentry.c + err = -EINVAL; + if (!(flags & (LOOKUP_OPEN | LOOKUP_EMPTY)) + && inode -+ && !(inode->i_state && I_LINKABLE) -+ && (IS_DEADDIR(inode) || !vfsub_inode_nlink(inode, AU_I_AUFS))) { ++ && (IS_DEADDIR(inode) ++ || (!vfsub_inode_nlink(inode, AU_I_AUFS) ++ && !au_ii(inode)->ii_tmpfile)) ++ ) { + AuTraceErr(err); + goto out_inval; + } @@ -8189,9 +8179,9 @@ diff -Naur null/fs/aufs/dentry.c linux-6.12.29/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.12.29/fs/aufs/dentry.h +diff -Naur null/fs/aufs/dentry.h linux-6.12.30/fs/aufs/dentry.h --- /dev/null -+++ linux-6.12.29/fs/aufs/dentry.h 2025-12-15 21:34:57.606338338 +0300 ++++ linux-6.12.30/fs/aufs/dentry.h 2026-01-22 12:14:11.007746405 +0300 @@ -0,0 +1,270 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* @@ -8463,9 +8453,9 @@ diff -Naur null/fs/aufs/dentry.h linux-6.12.29/fs/aufs/dentry.h + +#endif /* __KERNEL__ */ +#endif /* __AUFS_DENTRY_H__ */ -diff -Naur null/fs/aufs/dinfo.c linux-6.12.29/fs/aufs/dinfo.c +diff -Naur null/fs/aufs/dinfo.c linux-6.12.30/fs/aufs/dinfo.c --- /dev/null -+++ linux-6.12.29/fs/aufs/dinfo.c 2025-12-15 21:34:57.606338338 +0300 ++++ linux-6.12.30/fs/aufs/dinfo.c 2026-01-22 12:14:11.007746405 +0300 @@ -0,0 +1,555 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -9022,9 +9012,9 @@ diff -Naur null/fs/aufs/dinfo.c linux-6.12.29/fs/aufs/dinfo.c + return bindex; + return -1; +} -diff -Naur null/fs/aufs/dir.c linux-6.12.29/fs/aufs/dir.c +diff -Naur null/fs/aufs/dir.c linux-6.12.30/fs/aufs/dir.c --- /dev/null -+++ linux-6.12.29/fs/aufs/dir.c 2025-12-15 21:34:57.606338338 +0300 ++++ linux-6.12.30/fs/aufs/dir.c 2026-01-22 12:14:11.007746405 +0300 @@ -0,0 +1,765 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -9791,9 +9781,9 @@ diff -Naur null/fs/aufs/dir.c linux-6.12.29/fs/aufs/dir.c + .flush = aufs_flush_dir, + .fsync = aufs_fsync_dir +}; -diff -Naur null/fs/aufs/dir.h linux-6.12.29/fs/aufs/dir.h +diff -Naur null/fs/aufs/dir.h linux-6.12.30/fs/aufs/dir.h --- /dev/null -+++ linux-6.12.29/fs/aufs/dir.h 2025-12-15 21:34:57.606338338 +0300 ++++ linux-6.12.30/fs/aufs/dir.h 2026-01-22 12:14:11.007746405 +0300 @@ -0,0 +1,134 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* @@ -9929,10 +9919,10 @@ diff -Naur null/fs/aufs/dir.h linux-6.12.29/fs/aufs/dir.h + +#endif /* __KERNEL__ */ +#endif /* __AUFS_DIR_H__ */ -diff -Naur null/fs/aufs/dirren.c linux-6.12.29/fs/aufs/dirren.c +diff -Naur null/fs/aufs/dirren.c linux-6.12.30/fs/aufs/dirren.c --- /dev/null -+++ linux-6.12.29/fs/aufs/dirren.c 2025-12-15 21:34:57.606338338 +0300 -@@ -0,0 +1,1315 @@ ++++ linux-6.12.30/fs/aufs/dirren.c 2026-01-22 12:14:11.008746392 +0300 +@@ -0,0 +1,1308 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) 2017-2025 Junjiro R. Okajima @@ -10168,7 +10158,7 @@ diff -Naur null/fs/aufs/dirren.c linux-6.12.29/fs/aufs/dirren.c + unsigned char load, suspend; + struct file *hinofile; + struct au_hinode *hdir; -+ struct inode *dir, *delegated; ++ struct inode *dir; + struct path hinopath; + struct qstr hinoname = QSTR_INIT(AUFS_WH_DR_BRHINO, + sizeof(AUFS_WH_DR_BRHINO) - 1); @@ -10210,27 +10200,28 @@ diff -Naur null/fs/aufs/dirren.c linux-6.12.29/fs/aufs/dirren.c + if (d_is_negative(hinopath.dentry)) + goto out_dput; /* success */ + } else { ++ err = vfsub_mnt_want_write(hinopath.mnt); ++ AuTraceErr(err); ++ if (unlikely(err)) ++ goto out_dput; + if (au_dr_hino_test_empty(&br->br_dirren)) { + if (d_is_positive(hinopath.dentry)) { -+ delegated = NULL; -+ err = vfsub_unlink(dir, &hinopath, &delegated, -+ /*force*/0); ++ err = vfsub_unlink(dir, &hinopath, /*force*/0); + AuTraceErr(err); + if (unlikely(err)) + pr_err("ignored err %d, %pd2\n", + err, hinopath.dentry); -+ if (unlikely(err == -EWOULDBLOCK)) -+ iput(delegated); + err = 0; + } -+ goto out_dput; ++ goto out_mnt_write; + } else if (!d_is_positive(hinopath.dentry)) { + err = vfsub_create(dir, &hinopath, 0600, + /*want_excl*/false); + AuTraceErr(err); + if (unlikely(err)) -+ goto out_dput; ++ goto out_mnt_write; + } ++ vfsub_mnt_drop_write(hinopath.mnt); + flags = O_WRONLY; + } + hinofile = vfsub_dentry_open(&hinopath, flags); @@ -10252,6 +10243,8 @@ diff -Naur null/fs/aufs/dirren.c linux-6.12.29/fs/aufs/dirren.c + fput(hinofile); + goto out; + ++out_mnt_write: ++ vfsub_mnt_drop_write(hinopath.mnt); +out_dput: + dput(hinopath.dentry); +out_unlock: @@ -10547,7 +10540,7 @@ diff -Naur null/fs/aufs/dirren.c linux-6.12.29/fs/aufs/dirren.c + struct path infopath = { + .mnt = w->h_ppath.mnt + }; -+ struct inode *h_dir, *h_inode, *delegated; ++ struct inode *h_dir, *h_inode; + struct file *infofile; + struct qstr *qname; + @@ -10594,11 +10587,8 @@ diff -Naur null/fs/aufs/dirren.c linux-6.12.29/fs/aufs/dirren.c + } + + if (elm && w->renameback) { -+ delegated = NULL; -+ err = vfsub_unlink(h_dir, &infopath, &delegated, /*force*/0); ++ err = vfsub_unlink(h_dir, &infopath, /*force*/0); + AuTraceErr(err); -+ if (unlikely(err == -EWOULDBLOCK)) -+ iput(delegated); + goto out_fput; + } + @@ -10698,7 +10688,7 @@ diff -Naur null/fs/aufs/dirren.c linux-6.12.29/fs/aufs/dirren.c + struct au_drinfo_store *w) +{ + struct au_drinfo_rev_elm *elm; -+ struct inode *h_dir, *delegated; ++ struct inode *h_dir; + int err, nelm; + struct path infopath = { + .mnt = w->h_ppath.mnt @@ -10713,13 +10703,9 @@ diff -Naur null/fs/aufs/dirren.c linux-6.12.29/fs/aufs/dirren.c + AuDebugOn(elm->created && elm->info_last); + if (elm->created) { + AuDbg("here\n"); -+ delegated = NULL; + infopath.dentry = elm->info_dentry; -+ err = vfsub_unlink(h_dir, &infopath, &delegated, -+ !w->no_sio); ++ err = vfsub_unlink(h_dir, &infopath, !w->no_sio); + AuTraceErr(err); -+ if (unlikely(err == -EWOULDBLOCK)) -+ iput(delegated); + dput(elm->info_dentry); + } else if (elm->info_last) { + AuDbg("here\n"); @@ -11007,7 +10993,7 @@ diff -Naur null/fs/aufs/dirren.c linux-6.12.29/fs/aufs/dirren.c + = AUFS_WH_DR_INFO_PFX; + struct au_drinfo *drinfo; + struct qstr oldname; -+ struct inode *h_dir, *delegated; ++ struct inode *h_dir; + struct dentry *info_dentry; + struct path infopath; + @@ -11044,14 +11030,11 @@ diff -Naur null/fs/aufs/dirren.c linux-6.12.29/fs/aufs/dirren.c + infopath.dentry = info_dentry; + infopath.mnt = w->h_ppath.mnt; + h_dir = d_inode(w->h_ppath.dentry); -+ delegated = NULL; + inode_lock_nested(h_dir, AuLsc_I_PARENT); -+ e = vfsub_unlink(h_dir, &infopath, &delegated, !w->no_sio); ++ e = vfsub_unlink(h_dir, &infopath, !w->no_sio); + inode_unlock(h_dir); + if (unlikely(e)) + AuIOErr("ignored %d, %pd2\n", e, &infopath.dentry); -+ if (unlikely(e == -EWOULDBLOCK)) -+ iput(delegated); + } + au_kfree_rcu(w->drinfo[bindex]); + w->drinfo[bindex] = drinfo; @@ -11248,9 +11231,9 @@ diff -Naur null/fs/aufs/dirren.c linux-6.12.29/fs/aufs/dirren.c +out: + return err; +} -diff -Naur null/fs/aufs/dirren.h linux-6.12.29/fs/aufs/dirren.h +diff -Naur null/fs/aufs/dirren.h linux-6.12.30/fs/aufs/dirren.h --- /dev/null -+++ linux-6.12.29/fs/aufs/dirren.h 2025-12-15 21:34:57.606338338 +0300 ++++ linux-6.12.30/fs/aufs/dirren.h 2026-01-22 12:14:11.008746392 +0300 @@ -0,0 +1,140 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* @@ -11392,9 +11375,9 @@ diff -Naur null/fs/aufs/dirren.h linux-6.12.29/fs/aufs/dirren.h + +#endif /* __KERNEL__ */ +#endif /* __AUFS_DIRREN_H__ */ -diff -Naur null/fs/aufs/dynop.c linux-6.12.29/fs/aufs/dynop.c +diff -Naur null/fs/aufs/dynop.c linux-6.12.30/fs/aufs/dynop.c --- /dev/null -+++ linux-6.12.29/fs/aufs/dynop.c 2025-12-15 21:34:57.606338338 +0300 ++++ linux-6.12.30/fs/aufs/dynop.c 2026-01-22 12:14:11.008746392 +0300 @@ -0,0 +1,365 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -11761,9 +11744,9 @@ diff -Naur null/fs/aufs/dynop.c linux-6.12.29/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.12.29/fs/aufs/dynop.h +diff -Naur null/fs/aufs/dynop.h linux-6.12.30/fs/aufs/dynop.h --- /dev/null -+++ linux-6.12.29/fs/aufs/dynop.h 2025-12-15 21:34:57.607338326 +0300 ++++ linux-6.12.30/fs/aufs/dynop.h 2026-01-22 12:14:11.008746392 +0300 @@ -0,0 +1,77 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* @@ -11842,9 +11825,9 @@ diff -Naur null/fs/aufs/dynop.h linux-6.12.29/fs/aufs/dynop.h + +#endif /* __KERNEL__ */ +#endif /* __AUFS_DYNOP_H__ */ -diff -Naur null/fs/aufs/export.c linux-6.12.29/fs/aufs/export.c +diff -Naur null/fs/aufs/export.c linux-6.12.30/fs/aufs/export.c --- /dev/null -+++ linux-6.12.29/fs/aufs/export.c 2025-12-15 21:34:57.607338326 +0300 ++++ linux-6.12.30/fs/aufs/export.c 2026-01-22 12:14:11.008746392 +0300 @@ -0,0 +1,846 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -12692,9 +12675,9 @@ diff -Naur null/fs/aufs/export.c linux-6.12.29/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.12.29/fs/aufs/fhsm.c +diff -Naur null/fs/aufs/fhsm.c linux-6.12.30/fs/aufs/fhsm.c --- /dev/null -+++ linux-6.12.29/fs/aufs/fhsm.c 2025-12-15 21:34:57.607338326 +0300 ++++ linux-6.12.30/fs/aufs/fhsm.c 2026-01-22 12:14:11.008746392 +0300 @@ -0,0 +1,426 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -13122,10 +13105,10 @@ diff -Naur null/fs/aufs/fhsm.c linux-6.12.29/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.12.29/fs/aufs/file.c +diff -Naur null/fs/aufs/file.c linux-6.12.30/fs/aufs/file.c --- /dev/null -+++ linux-6.12.29/fs/aufs/file.c 2025-12-15 21:34:57.607338326 +0300 -@@ -0,0 +1,858 @@ ++++ linux-6.12.30/fs/aufs/file.c 2026-01-22 12:14:11.008746392 +0300 +@@ -0,0 +1,851 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) 2005-2025 Junjiro R. Okajima @@ -13246,7 +13229,6 @@ diff -Naur null/fs/aufs/file.c linux-6.12.29/fs/aufs/file.c + .pin = &pin, + .flags = AuCpup_DTIME | AuCpup_HOPEN + }; -+ struct inode *delegated; + struct super_block *sb; + struct au_sbinfo *sbinfo; + struct au_fhsm *fhsm; @@ -13323,15 +13305,9 @@ diff -Naur null/fs/aufs/file.c linux-6.12.29/fs/aufs/file.c + h_path.mnt = au_br_mnt(br); + h_path.dentry = au_h_dptr(dentry, cpg.bsrc); + hdir = au_hi(d_inode(parent), cpg.bsrc); -+ delegated = NULL; -+ err = vfsub_unlink(hdir->hi_inode, &h_path, &delegated, /*force*/1); ++ err = vfsub_unlink(hdir->hi_inode, &h_path, /*force*/1); + au_unpin(&pin); + /* todo: keep h_dentry or not? */ -+ if (unlikely(err == -EWOULDBLOCK)) { -+ pr_warn("cannot retry for NFSv4 delegation" -+ " for an internal unlink\n"); -+ iput(delegated); -+ } + if (unlikely(err)) { + pr_err("unlink %pd after coo failed (%d), ignored\n", + dentry, err); @@ -13527,7 +13503,7 @@ diff -Naur null/fs/aufs/file.c linux-6.12.29/fs/aufs/file.c + + if (!err + && (vfsub_inode_nlink(inode, AU_I_AUFS) > 1 -+ || (inode->i_state & I_LINKABLE)) ++ || au_ii(inode)->ii_tmpfile) + && au_opt_test(au_mntflags(cpg.dentry->d_sb), PLINK)) + au_plink_append(inode, bcpup, au_h_dptr(cpg.dentry, bcpup)); + @@ -13984,9 +13960,9 @@ diff -Naur null/fs/aufs/file.c linux-6.12.29/fs/aufs/file.c + .swap_rw = aufs_swap_rw +#endif /* CONFIG_AUFS_DEBUG */ +}; -diff -Naur null/fs/aufs/file.h linux-6.12.29/fs/aufs/file.h +diff -Naur null/fs/aufs/file.h linux-6.12.30/fs/aufs/file.h --- /dev/null -+++ linux-6.12.29/fs/aufs/file.h 2025-12-15 21:34:57.607338326 +0300 ++++ linux-6.12.30/fs/aufs/file.h 2026-01-22 12:14:11.008746392 +0300 @@ -0,0 +1,327 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* @@ -14315,9 +14291,9 @@ diff -Naur null/fs/aufs/file.h linux-6.12.29/fs/aufs/file.h + +#endif /* __KERNEL__ */ +#endif /* __AUFS_FILE_H__ */ -diff -Naur null/fs/aufs/finfo.c linux-6.12.29/fs/aufs/finfo.c +diff -Naur null/fs/aufs/finfo.c linux-6.12.30/fs/aufs/finfo.c --- /dev/null -+++ linux-6.12.29/fs/aufs/finfo.c 2025-12-15 21:34:57.607338326 +0300 ++++ linux-6.12.30/fs/aufs/finfo.c 2026-01-22 12:14:11.009746380 +0300 @@ -0,0 +1,148 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -14467,9 +14443,9 @@ diff -Naur null/fs/aufs/finfo.c linux-6.12.29/fs/aufs/finfo.c +out: + return err; +} -diff -Naur null/fs/aufs/f_op.c linux-6.12.29/fs/aufs/f_op.c +diff -Naur null/fs/aufs/f_op.c linux-6.12.30/fs/aufs/f_op.c --- /dev/null -+++ linux-6.12.29/fs/aufs/f_op.c 2025-12-15 21:34:57.607338326 +0300 ++++ linux-6.12.30/fs/aufs/f_op.c 2026-01-22 12:14:11.008746392 +0300 @@ -0,0 +1,791 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -15262,9 +15238,9 @@ diff -Naur null/fs/aufs/f_op.c linux-6.12.29/fs/aufs/f_op.c + .fallocate = aufs_fallocate, + .copy_file_range = aufs_copy_file_range +}; -diff -Naur null/fs/aufs/fsctx.c linux-6.12.29/fs/aufs/fsctx.c +diff -Naur null/fs/aufs/fsctx.c linux-6.12.30/fs/aufs/fsctx.c --- /dev/null -+++ linux-6.12.29/fs/aufs/fsctx.c 2025-12-15 21:34:57.607338326 +0300 ++++ linux-6.12.30/fs/aufs/fsctx.c 2026-01-22 12:14:11.009746380 +0300 @@ -0,0 +1,1244 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -16510,9 +16486,9 @@ diff -Naur null/fs/aufs/fsctx.c linux-6.12.29/fs/aufs/fsctx.c + AuTraceErr(err); + return err; +} -diff -Naur null/fs/aufs/fstype.h linux-6.12.29/fs/aufs/fstype.h +diff -Naur null/fs/aufs/fstype.h linux-6.12.30/fs/aufs/fstype.h --- /dev/null -+++ linux-6.12.29/fs/aufs/fstype.h 2025-12-15 21:34:57.610338288 +0300 ++++ linux-6.12.30/fs/aufs/fstype.h 2026-01-22 12:14:11.009746380 +0300 @@ -0,0 +1,419 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* @@ -16933,9 +16909,9 @@ diff -Naur null/fs/aufs/fstype.h linux-6.12.29/fs/aufs/fstype.h + +#endif /* __KERNEL__ */ +#endif /* __AUFS_FSTYPE_H__ */ -diff -Naur null/fs/aufs/hbl.h linux-6.12.29/fs/aufs/hbl.h +diff -Naur null/fs/aufs/hbl.h linux-6.12.30/fs/aufs/hbl.h --- /dev/null -+++ linux-6.12.29/fs/aufs/hbl.h 2025-12-15 21:34:57.610338288 +0300 ++++ linux-6.12.30/fs/aufs/hbl.h 2026-01-22 12:14:11.009746380 +0300 @@ -0,0 +1,65 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* @@ -17002,9 +16978,9 @@ diff -Naur null/fs/aufs/hbl.h linux-6.12.29/fs/aufs/hbl.h + +#endif /* __KERNEL__ */ +#endif /* __AUFS_HBL_H__ */ -diff -Naur null/fs/aufs/hfsnotify.c linux-6.12.29/fs/aufs/hfsnotify.c +diff -Naur null/fs/aufs/hfsnotify.c linux-6.12.30/fs/aufs/hfsnotify.c --- /dev/null -+++ linux-6.12.29/fs/aufs/hfsnotify.c 2025-12-15 21:34:57.611338276 +0300 ++++ linux-6.12.30/fs/aufs/hfsnotify.c 2026-01-22 12:14:11.009746380 +0300 @@ -0,0 +1,290 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -17296,9 +17272,9 @@ diff -Naur null/fs/aufs/hfsnotify.c linux-6.12.29/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.12.29/fs/aufs/hfsplus.c +diff -Naur null/fs/aufs/hfsplus.c linux-6.12.30/fs/aufs/hfsplus.c --- /dev/null -+++ linux-6.12.29/fs/aufs/hfsplus.c 2025-12-15 21:34:57.611338276 +0300 ++++ linux-6.12.30/fs/aufs/hfsplus.c 2026-01-22 12:14:11.009746380 +0300 @@ -0,0 +1,60 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -17360,9 +17336,9 @@ diff -Naur null/fs/aufs/hfsplus.c linux-6.12.29/fs/aufs/hfsplus.c + au_lcnt_dec(&br->br_nfiles); + } +} -diff -Naur null/fs/aufs/hnotify.c linux-6.12.29/fs/aufs/hnotify.c +diff -Naur null/fs/aufs/hnotify.c linux-6.12.30/fs/aufs/hnotify.c --- /dev/null -+++ linux-6.12.29/fs/aufs/hnotify.c 2025-12-15 21:34:57.611338276 +0300 ++++ linux-6.12.30/fs/aufs/hnotify.c 2026-01-22 12:14:11.009746380 +0300 @@ -0,0 +1,715 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -18079,10 +18055,10 @@ diff -Naur null/fs/aufs/hnotify.c linux-6.12.29/fs/aufs/hnotify.c + if (au_cache[AuCache_HNOTIFY]) + au_hn_destroy_cache(); +} -diff -Naur null/fs/aufs/iinfo.c linux-6.12.29/fs/aufs/iinfo.c +diff -Naur null/fs/aufs/iinfo.c linux-6.12.30/fs/aufs/iinfo.c --- /dev/null -+++ linux-6.12.29/fs/aufs/iinfo.c 2025-12-15 21:34:57.612338263 +0300 -@@ -0,0 +1,287 @@ ++++ linux-6.12.30/fs/aufs/iinfo.c 2026-01-22 12:14:11.010746367 +0300 +@@ -0,0 +1,288 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) 2005-2025 Junjiro R. Okajima @@ -18233,7 +18209,7 @@ diff -Naur null/fs/aufs/iinfo.c linux-6.12.29/fs/aufs/iinfo.c + h_i = au_hinode(iinfo, bindex)->hi_inode; + if (h_i + && !vfsub_inode_nlink(h_i, AU_I_BRANCH) -+ && !(h_i->i_state & I_LINKABLE)) ++ && !iinfo->ii_tmpfile) + au_set_h_iptr(inode, bindex, NULL, 0); + } + } @@ -18299,6 +18275,7 @@ diff -Naur null/fs/aufs/iinfo.c linux-6.12.29/fs/aufs/iinfo.c + iinfo->ii_generation.ig_generation = au_sigen(sb); + iinfo->ii_btop = -1; + iinfo->ii_bbot = -1; ++ iinfo->ii_tmpfile = 0; + iinfo->ii_vdir = NULL; + return 0; + } @@ -18370,9 +18347,9 @@ diff -Naur null/fs/aufs/iinfo.c linux-6.12.29/fs/aufs/iinfo.c + au_kfree_rcu(iinfo->ii_hinode); + AuRwDestroy(&iinfo->ii_rwsem); +} -diff -Naur null/fs/aufs/inode.c linux-6.12.29/fs/aufs/inode.c +diff -Naur null/fs/aufs/inode.c linux-6.12.30/fs/aufs/inode.c --- /dev/null -+++ linux-6.12.29/fs/aufs/inode.c 2025-12-15 21:34:57.612338263 +0300 ++++ linux-6.12.30/fs/aufs/inode.c 2026-01-22 12:14:11.010746367 +0300 @@ -0,0 +1,532 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -18906,10 +18883,10 @@ diff -Naur null/fs/aufs/inode.c linux-6.12.29/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.12.29/fs/aufs/inode.h +diff -Naur null/fs/aufs/inode.h linux-6.12.30/fs/aufs/inode.h --- /dev/null -+++ linux-6.12.29/fs/aufs/inode.h 2025-12-15 21:34:57.612338263 +0300 -@@ -0,0 +1,727 @@ ++++ linux-6.12.30/fs/aufs/inode.h 2026-01-22 12:14:11.010746367 +0300 +@@ -0,0 +1,728 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Copyright (C) 2005-2025 Junjiro R. Okajima @@ -18985,6 +18962,7 @@ diff -Naur null/fs/aufs/inode.h linux-6.12.29/fs/aufs/inode.h + + struct au_rwsem ii_rwsem; + aufs_bindex_t ii_btop, ii_bbot; ++ unsigned char ii_tmpfile; /* born with nlink == 0 */ + __u32 ii_higen; + struct au_hinode *ii_hinode; + struct au_vdir *ii_vdir; @@ -19637,9 +19615,9 @@ diff -Naur null/fs/aufs/inode.h linux-6.12.29/fs/aufs/inode.h + +#endif /* __KERNEL__ */ +#endif /* __AUFS_INODE_H__ */ -diff -Naur null/fs/aufs/ioctl.c linux-6.12.29/fs/aufs/ioctl.c +diff -Naur null/fs/aufs/ioctl.c linux-6.12.30/fs/aufs/ioctl.c --- /dev/null -+++ linux-6.12.29/fs/aufs/ioctl.c 2025-12-15 21:34:57.612338263 +0300 ++++ linux-6.12.30/fs/aufs/ioctl.c 2026-01-22 12:14:11.010746367 +0300 @@ -0,0 +1,220 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -19861,10 +19839,10 @@ diff -Naur null/fs/aufs/ioctl.c linux-6.12.29/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.12.29/fs/aufs/i_op_add.c +diff -Naur null/fs/aufs/i_op_add.c linux-6.12.30/fs/aufs/i_op_add.c --- /dev/null -+++ linux-6.12.29/fs/aufs/i_op_add.c 2025-12-15 21:34:57.611338276 +0300 -@@ -0,0 +1,971 @@ ++++ linux-6.12.30/fs/aufs/i_op_add.c 2026-01-22 12:14:11.010746367 +0300 +@@ -0,0 +1,947 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) 2005-2025 Junjiro R. Okajima @@ -20199,9 +20177,7 @@ diff -Naur null/fs/aufs/i_op_add.c linux-6.12.29/fs/aufs/i_op_add.c + + /* revert */ + if (created /* && d_is_positive(a->h_path.dentry) */) { -+ /* no delegation since it is just created */ -+ rerr = vfsub_unlink(h_dir, &a->h_path, /*delegated*/NULL, -+ /*force*/0); ++ rerr = vfsub_unlink(h_dir, &a->h_path, /*force*/0); + if (rerr) { + AuIOErr("%pd revert failure(%d, %d)\n", + dentry, err, rerr); @@ -20372,6 +20348,7 @@ diff -Naur null/fs/aufs/i_op_add.c linux-6.12.29/fs/aufs/i_op_add.c + } + + vfsub_inode_nlink_init(inode, 1); ++ au_ii(inode)->ii_tmpfile = 1; + d_tmpfile(file, inode); + au_di(dentry)->di_tmpfile = 1; + get_file(h_file); @@ -20466,7 +20443,7 @@ diff -Naur null/fs/aufs/i_op_add.c linux-6.12.29/fs/aufs/i_op_add.c + unsigned char plink; + aufs_bindex_t bbot; + struct dentry *h_src_dentry; -+ struct inode *h_inode, *inode, *delegated; ++ struct inode *h_inode, *inode; + struct super_block *sb; + struct file *h_file; + @@ -20533,14 +20510,8 @@ diff -Naur null/fs/aufs/i_op_add.c linux-6.12.29/fs/aufs/i_op_add.c + + } + if (h_src_dentry) { -+ delegated = NULL; + err = vfsub_link(h_src_dentry, au_pinned_h_dir(&a->pin), -+ &a->h_path, &delegated); -+ if (unlikely(err == -EWOULDBLOCK)) { -+ pr_warn("cannot retry for NFSv4 delegation" -+ " for an internal link\n"); -+ iput(delegated); -+ } ++ &a->h_path); + dput(h_src_dentry); + } else { + AuIOErr("no dentry found for hi%lu on b%d\n", @@ -20564,7 +20535,7 @@ diff -Naur null/fs/aufs/i_op_add.c linux-6.12.29/fs/aufs/i_op_add.c + struct au_dtime dt; + struct au_link_args *a; + struct dentry *wh_dentry, *h_src_dentry; -+ struct inode *inode, *delegated; ++ struct inode *inode; + struct super_block *sb; + struct au_wr_dir_args wr_dir_args = { + /* .force_btgt = -1, */ @@ -20629,16 +20600,9 @@ diff -Naur null/fs/aufs/i_op_add.c linux-6.12.29/fs/aufs/i_op_add.c + if (a->bdst < a->bsrc + /* && h_src_dentry->d_sb != a->h_path.dentry->d_sb */) + err = au_cpup_or_link(src_dentry, dentry, a); -+ else { -+ delegated = NULL; ++ else + err = vfsub_link(h_src_dentry, au_pinned_h_dir(&a->pin), -+ &a->h_path, &delegated); -+ if (unlikely(err == -EWOULDBLOCK)) { -+ pr_warn("cannot retry for NFSv4 delegation" -+ " for an internal link\n"); -+ iput(delegated); -+ } -+ } ++ &a->h_path); + dput(h_src_dentry); + } else { + /* @@ -20662,18 +20626,10 @@ diff -Naur null/fs/aufs/i_op_add.c linux-6.12.29/fs/aufs/i_op_add.c + if (!err) { + h_src_dentry = au_h_dptr(src_dentry, a->bdst); + err = -ENOENT; -+ if (h_src_dentry && d_is_positive(h_src_dentry)) { -+ delegated = NULL; ++ if (h_src_dentry && d_is_positive(h_src_dentry)) + err = vfsub_link(h_src_dentry, + au_pinned_h_dir(&a->pin), -+ &a->h_path, &delegated); -+ if (unlikely(err == -EWOULDBLOCK)) { -+ pr_warn("cannot retry" -+ " for NFSv4 delegation" -+ " for an internal link\n"); -+ iput(delegated); -+ } -+ } ++ &a->h_path); + } + } + if (unlikely(err)) @@ -20700,9 +20656,7 @@ diff -Naur null/fs/aufs/i_op_add.c linux-6.12.29/fs/aufs/i_op_add.c + goto out_unpin; /* success */ + +out_revert: -+ /* no delegation since it is just created */ -+ rerr = vfsub_unlink(au_pinned_h_dir(&a->pin), &a->h_path, -+ /*delegated*/NULL, /*force*/0); ++ rerr = vfsub_unlink(au_pinned_h_dir(&a->pin), &a->h_path, /*force*/0); + if (unlikely(rerr)) { + AuIOErr("%pd reverting failed(%d, %d)\n", dentry, err, rerr); + err = -EIO; @@ -20836,10 +20790,10 @@ diff -Naur null/fs/aufs/i_op_add.c linux-6.12.29/fs/aufs/i_op_add.c +out: + return err; +} -diff -Naur null/fs/aufs/i_op.c linux-6.12.29/fs/aufs/i_op.c +diff -Naur null/fs/aufs/i_op.c linux-6.12.30/fs/aufs/i_op.c --- /dev/null -+++ linux-6.12.29/fs/aufs/i_op.c 2025-12-15 21:34:57.611338276 +0300 -@@ -0,0 +1,1526 @@ ++++ linux-6.12.30/fs/aufs/i_op.c 2026-01-22 12:14:11.010746367 +0300 +@@ -0,0 +1,1522 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) 2005-2025 Junjiro R. Okajima @@ -21781,7 +21735,7 @@ diff -Naur null/fs/aufs/i_op.c linux-6.12.29/fs/aufs/i_op.c + struct iattr *ia) +{ + int err; -+ struct inode *inode, *delegated; ++ struct inode *inode; + struct super_block *sb; + struct file *file; + struct au_icpup_args *a; @@ -21842,16 +21796,20 @@ diff -Naur null/fs/aufs/i_op.c linux-6.12.29/fs/aufs/i_op.c + } + + a->h_path.mnt = au_sbr_mnt(sb, a->btgt); ++ err = vfsub_mnt_want_write(a->h_path.mnt); ++ if (unlikely(err)) ++ goto out_unlock; ++ + if ((ia->ia_valid & (ATTR_MODE | ATTR_CTIME)) + == (ATTR_MODE | ATTR_CTIME)) { + err = security_path_chmod(&a->h_path, ia->ia_mode); + if (unlikely(err)) -+ goto out_unlock; ++ goto out_mnt_write; + } else if ((ia->ia_valid & (ATTR_UID | ATTR_GID)) + && (ia->ia_valid & ATTR_CTIME)) { + err = security_path_chown(&a->h_path, ia->ia_uid, ia->ia_gid); + if (unlikely(err)) -+ goto out_unlock; ++ goto out_mnt_write; + } + + if (ia->ia_valid & ATTR_SIZE) { @@ -21867,18 +21825,8 @@ diff -Naur null/fs/aufs/i_op.c linux-6.12.29/fs/aufs/i_op.c + inode_unlock(a->h_inode); + err = vfsub_trunc(&a->h_path, ia->ia_size, ia->ia_valid, f); + inode_lock_nested(a->h_inode, AuLsc_I_CHILD); -+ } else { -+ delegated = NULL; -+ while (1) { -+ err = vfsub_notify_change(&a->h_path, ia, &delegated); -+ if (delegated) { -+ err = break_deleg_wait(&delegated); -+ if (!err) -+ continue; -+ } -+ break; -+ } -+ } ++ } else ++ err = vfsub_notify_change(&a->h_path, ia); + /* + * regardless aufs 'acl' option setting. + * why don't all acl-aware fs call this func from their ->setattr()? @@ -21890,6 +21838,8 @@ diff -Naur null/fs/aufs/i_op.c linux-6.12.29/fs/aufs/i_op.c + if (!err) + au_cpup_attr_changeable(inode); + ++out_mnt_write: ++ vfsub_mnt_drop_write(a->h_path.mnt); +out_unlock: + inode_unlock(a->h_inode); + au_unpin(&a->pin); @@ -22366,10 +22316,10 @@ diff -Naur null/fs/aufs/i_op.c linux-6.12.29/fs/aufs/i_op.c + .update_time = aufs_update_time + } +}; -diff -Naur null/fs/aufs/i_op_del.c linux-6.12.29/fs/aufs/i_op_del.c +diff -Naur null/fs/aufs/i_op_del.c linux-6.12.30/fs/aufs/i_op_del.c --- /dev/null -+++ linux-6.12.29/fs/aufs/i_op_del.c 2025-12-15 21:34:57.611338276 +0300 -@@ -0,0 +1,523 @@ ++++ linux-6.12.30/fs/aufs/i_op_del.c 2026-01-22 12:14:11.010746367 +0300 +@@ -0,0 +1,517 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) 2005-2025 Junjiro R. Okajima @@ -22685,7 +22635,7 @@ diff -Naur null/fs/aufs/i_op_del.c linux-6.12.29/fs/aufs/i_op_del.c +{ + int err; + aufs_bindex_t bwh, bindex, btop; -+ struct inode *inode, *h_dir, *delegated, *h_inode; ++ struct inode *inode, *h_dir, *h_inode; + struct dentry *parent, *wh_dentry; + /* to reduce stack size */ + struct { @@ -22729,13 +22679,7 @@ diff -Naur null/fs/aufs/i_op_del.c linux-6.12.29/fs/aufs/i_op_del.c + dget(a->h_path.dentry); + if (bindex == btop) { + h_dir = au_pinned_h_dir(&a->pin); -+ delegated = NULL; -+ err = vfsub_unlink(h_dir, &a->h_path, &delegated, /*force*/0); -+ if (unlikely(err == -EWOULDBLOCK)) { -+ pr_warn("cannot retry for NFSv4 delegation" -+ " for an internal unlink\n"); -+ iput(delegated); -+ } ++ err = vfsub_unlink(h_dir, &a->h_path, /*force*/0); + } else { + /* dir inode is locked */ + h_dir = d_inode(wh_dentry->d_parent); @@ -22893,10 +22837,10 @@ diff -Naur null/fs/aufs/i_op_del.c linux-6.12.29/fs/aufs/i_op_del.c + AuTraceErr(err); + return err; +} -diff -Naur null/fs/aufs/i_op_ren.c linux-6.12.29/fs/aufs/i_op_ren.c +diff -Naur null/fs/aufs/i_op_ren.c linux-6.12.30/fs/aufs/i_op_ren.c --- /dev/null -+++ linux-6.12.29/fs/aufs/i_op_ren.c 2025-12-15 21:34:57.612338263 +0300 -@@ -0,0 +1,1264 @@ ++++ linux-6.12.30/fs/aufs/i_op_ren.c 2026-01-22 12:14:11.010746367 +0300 +@@ -0,0 +1,1242 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) 2005-2025 Junjiro R. Okajima @@ -23048,7 +22992,6 @@ diff -Naur null/fs/aufs/i_op_ren.c linux-6.12.29/fs/aufs/i_op_ren.c +static void au_ren_rev_rename(int err, struct au_ren_args *a) +{ + int rerr; -+ struct inode *delegated; + struct path h_ppath = { + .dentry = a->src_h_parent, + .mnt = a->h_path.mnt @@ -23061,15 +23004,9 @@ diff -Naur null/fs/aufs/i_op_ren.c linux-6.12.29/fs/aufs/i_op_ren.c + return; + } + -+ delegated = NULL; + rerr = vfsub_rename(a->dst_h_dir, + au_h_dptr(a->src_dentry, a->btgt), -+ a->src_h_dir, &a->h_path, &delegated, a->flags); -+ if (unlikely(rerr == -EWOULDBLOCK)) { -+ pr_warn("cannot retry for NFSv4 delegation" -+ " for an internal rename\n"); -+ iput(delegated); -+ } ++ a->src_h_dir, &a->h_path, a->flags); + d_drop(a->h_path.dentry); + dput(a->h_path.dentry); + /* au_set_h_dptr(a->src_dentry, a->btgt, NULL); */ @@ -23080,7 +23017,6 @@ diff -Naur null/fs/aufs/i_op_ren.c linux-6.12.29/fs/aufs/i_op_ren.c +static void au_ren_rev_whtmp(int err, struct au_ren_args *a) +{ + int rerr; -+ struct inode *delegated; + struct path h_ppath = { + .dentry = a->dst_h_parent, + .mnt = a->h_path.mnt @@ -23098,14 +23034,8 @@ diff -Naur null/fs/aufs/i_op_ren.c linux-6.12.29/fs/aufs/i_op_ren.c + return; + } + -+ delegated = NULL; + rerr = vfsub_rename(a->dst_h_dir, a->h_dst, a->dst_h_dir, &a->h_path, -+ &delegated, a->flags); -+ if (unlikely(rerr == -EWOULDBLOCK)) { -+ pr_warn("cannot retry for NFSv4 delegation" -+ " for an internal rename\n"); -+ iput(delegated); -+ } ++ a->flags); + d_drop(a->h_path.dentry); + dput(a->h_path.dentry); + if (!rerr) @@ -23137,21 +23067,13 @@ diff -Naur null/fs/aufs/i_op_ren.c linux-6.12.29/fs/aufs/i_op_ren.c +{ + int err; + struct dentry *d; -+ struct inode *delegated; + + d = a->src_dentry; + if (au_dbtop(d) == a->btgt) { + a->h_path.dentry = a->dst_h_dentry; + AuDebugOn(au_dbtop(d) != a->btgt); -+ delegated = NULL; + err = vfsub_rename(a->src_h_dir, au_h_dptr(d, a->btgt), -+ a->dst_h_dir, &a->h_path, &delegated, -+ a->flags); -+ if (unlikely(err == -EWOULDBLOCK)) { -+ pr_warn("cannot retry for NFSv4 delegation" -+ " for an internal rename\n"); -+ iput(delegated); -+ } ++ a->dst_h_dir, &a->h_path, a->flags); + } else + BUG(); + @@ -24161,9 +24083,9 @@ diff -Naur null/fs/aufs/i_op_ren.c linux-6.12.29/fs/aufs/i_op_ren.c + AuTraceErr(err); + return err; +} -diff -Naur null/fs/aufs/Kconfig linux-6.12.29/fs/aufs/Kconfig +diff -Naur null/fs/aufs/Kconfig linux-6.12.30/fs/aufs/Kconfig --- /dev/null -+++ linux-6.12.29/fs/aufs/Kconfig 2025-12-15 21:34:57.604338363 +0300 ++++ linux-6.12.30/fs/aufs/Kconfig 2026-01-22 12:14:11.003746455 +0300 @@ -0,0 +1,201 @@ +# SPDX-License-Identifier: GPL-2.0 +config AUFS_FS @@ -24366,9 +24288,9 @@ diff -Naur null/fs/aufs/Kconfig linux-6.12.29/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.12.29/fs/aufs/lcnt.h +diff -Naur null/fs/aufs/lcnt.h linux-6.12.30/fs/aufs/lcnt.h --- /dev/null -+++ linux-6.12.29/fs/aufs/lcnt.h 2025-12-15 21:34:57.612338263 +0300 ++++ linux-6.12.30/fs/aufs/lcnt.h 2026-01-22 12:14:11.010746367 +0300 @@ -0,0 +1,186 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* @@ -24556,9 +24478,9 @@ diff -Naur null/fs/aufs/lcnt.h linux-6.12.29/fs/aufs/lcnt.h + +#endif /* __KERNEL__ */ +#endif /* __AUFS_LCNT_H__ */ -diff -Naur null/fs/aufs/loop.c linux-6.12.29/fs/aufs/loop.c +diff -Naur null/fs/aufs/loop.c linux-6.12.30/fs/aufs/loop.c --- /dev/null -+++ linux-6.12.29/fs/aufs/loop.c 2025-12-15 21:34:57.612338263 +0300 ++++ linux-6.12.30/fs/aufs/loop.c 2026-01-22 12:14:11.011746355 +0300 @@ -0,0 +1,148 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -24708,9 +24630,9 @@ diff -Naur null/fs/aufs/loop.c linux-6.12.29/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.12.29/fs/aufs/loop.h +diff -Naur null/fs/aufs/loop.h linux-6.12.30/fs/aufs/loop.h --- /dev/null -+++ linux-6.12.29/fs/aufs/loop.h 2025-12-15 21:34:57.612338263 +0300 ++++ linux-6.12.30/fs/aufs/loop.h 2026-01-22 12:14:11.011746355 +0300 @@ -0,0 +1,55 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* @@ -24767,9 +24689,9 @@ diff -Naur null/fs/aufs/loop.h linux-6.12.29/fs/aufs/loop.h + +#endif /* __KERNEL__ */ +#endif /* __AUFS_LOOP_H__ */ -diff -Naur null/fs/aufs/magic.mk linux-6.12.29/fs/aufs/magic.mk +diff -Naur null/fs/aufs/magic.mk linux-6.12.30/fs/aufs/magic.mk --- /dev/null -+++ linux-6.12.29/fs/aufs/magic.mk 2025-12-15 21:34:57.612338263 +0300 ++++ linux-6.12.30/fs/aufs/magic.mk 2026-01-22 12:14:11.011746355 +0300 @@ -0,0 +1,31 @@ +# SPDX-License-Identifier: GPL-2.0 + @@ -24802,9 +24724,9 @@ diff -Naur null/fs/aufs/magic.mk linux-6.12.29/fs/aufs/magic.mk +ifdef CONFIG_HFSPLUS_FS +ccflags-y += -DHFSPLUS_SUPER_MAGIC=0x482b +endif -diff -Naur null/fs/aufs/Makefile linux-6.12.29/fs/aufs/Makefile +diff -Naur null/fs/aufs/Makefile linux-6.12.30/fs/aufs/Makefile --- /dev/null -+++ linux-6.12.29/fs/aufs/Makefile 2025-12-15 21:34:57.604338363 +0300 ++++ linux-6.12.30/fs/aufs/Makefile 2026-01-22 12:14:11.003746455 +0300 @@ -0,0 +1,46 @@ +# SPDX-License-Identifier: GPL-2.0 + @@ -24852,9 +24774,9 @@ diff -Naur null/fs/aufs/Makefile linux-6.12.29/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/mf.c linux-6.12.29/fs/aufs/mf.c +diff -Naur null/fs/aufs/mf.c linux-6.12.30/fs/aufs/mf.c --- /dev/null -+++ linux-6.12.29/fs/aufs/mf.c 2025-12-15 21:34:57.613338251 +0300 ++++ linux-6.12.30/fs/aufs/mf.c 2026-01-22 12:14:11.011746355 +0300 @@ -0,0 +1,119 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -24975,9 +24897,9 @@ diff -Naur null/fs/aufs/mf.c linux-6.12.29/fs/aufs/mf.c + return inode; +} +EXPORT_SYMBOL_GPL(au_do_file_user_inode); -diff -Naur null/fs/aufs/module.c linux-6.12.29/fs/aufs/module.c +diff -Naur null/fs/aufs/module.c linux-6.12.30/fs/aufs/module.c --- /dev/null -+++ linux-6.12.29/fs/aufs/module.c 2025-12-15 21:34:57.613338251 +0300 ++++ linux-6.12.30/fs/aufs/module.c 2026-01-22 12:14:11.011746355 +0300 @@ -0,0 +1,275 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -25254,9 +25176,9 @@ diff -Naur null/fs/aufs/module.c linux-6.12.29/fs/aufs/module.c + +module_init(aufs_init); +module_exit(aufs_exit); -diff -Naur null/fs/aufs/module.h linux-6.12.29/fs/aufs/module.h +diff -Naur null/fs/aufs/module.h linux-6.12.30/fs/aufs/module.h --- /dev/null -+++ linux-6.12.29/fs/aufs/module.h 2025-12-15 21:34:57.613338251 +0300 ++++ linux-6.12.30/fs/aufs/module.h 2026-01-22 12:14:11.012746342 +0300 @@ -0,0 +1,180 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* @@ -25438,10 +25360,10 @@ diff -Naur null/fs/aufs/module.h linux-6.12.29/fs/aufs/module.h + +#endif /* __KERNEL__ */ +#endif /* __AUFS_MODULE_H__ */ -diff -Naur null/fs/aufs/mvdown.c linux-6.12.29/fs/aufs/mvdown.c +diff -Naur null/fs/aufs/mvdown.c linux-6.12.30/fs/aufs/mvdown.c --- /dev/null -+++ linux-6.12.29/fs/aufs/mvdown.c 2025-12-15 21:34:57.613338251 +0300 -@@ -0,0 +1,714 @@ ++++ linux-6.12.30/fs/aufs/mvdown.c 2026-01-22 12:14:11.012746342 +0300 +@@ -0,0 +1,700 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) 2011-2025 Junjiro R. Okajima @@ -25699,7 +25621,6 @@ diff -Naur null/fs/aufs/mvdown.c linux-6.12.29/fs/aufs/mvdown.c + int err; + struct path h_path; + struct au_branch *br; -+ struct inode *delegated; + + br = au_sbr(a->sb, a->mvd_bdst); + h_path.dentry = au_wh_lkup(a->mvd_h_dst_parent, &a->dentry->d_name, br); @@ -25712,14 +25633,8 @@ diff -Naur null/fs/aufs/mvdown.c linux-6.12.29/fs/aufs/mvdown.c + err = 0; + if (d_is_positive(h_path.dentry)) { + h_path.mnt = au_br_mnt(br); -+ delegated = NULL; + err = vfsub_unlink(d_inode(a->mvd_h_dst_parent), &h_path, -+ &delegated, /*force*/0); -+ if (unlikely(err == -EWOULDBLOCK)) { -+ pr_warn("cannot retry for NFSv4 delegation" -+ " for an internal unlink\n"); -+ iput(delegated); -+ } ++ /*force*/0); + if (unlikely(err)) + AU_MVD_PR(dmsg, "wh_unlink failed\n"); + } @@ -25737,17 +25652,10 @@ diff -Naur null/fs/aufs/mvdown.c linux-6.12.29/fs/aufs/mvdown.c +{ + int err; + struct path h_path; -+ struct inode *delegated; + + h_path.mnt = au_sbr_mnt(a->sb, a->mvd_bsrc); + h_path.dentry = au_h_dptr(a->dentry, a->mvd_bsrc); -+ delegated = NULL; -+ err = vfsub_unlink(a->mvd_h_src_dir, &h_path, &delegated, /*force*/0); -+ if (unlikely(err == -EWOULDBLOCK)) { -+ pr_warn("cannot retry for NFSv4 delegation" -+ " for an internal unlink\n"); -+ iput(delegated); -+ } ++ err = vfsub_unlink(a->mvd_h_src_dir, &h_path, /*force*/0); + if (unlikely(err)) + AU_MVD_PR(dmsg, "unlink failed\n"); + @@ -26156,9 +26064,9 @@ diff -Naur null/fs/aufs/mvdown.c linux-6.12.29/fs/aufs/mvdown.c + AuTraceErr(err); + return err; +} -diff -Naur null/fs/aufs/opts.c linux-6.12.29/fs/aufs/opts.c +diff -Naur null/fs/aufs/opts.c linux-6.12.30/fs/aufs/opts.c --- /dev/null -+++ linux-6.12.29/fs/aufs/opts.c 2025-12-15 21:34:57.613338251 +0300 ++++ linux-6.12.30/fs/aufs/opts.c 2026-01-22 12:14:11.012746342 +0300 @@ -0,0 +1,1030 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -27190,9 +27098,9 @@ diff -Naur null/fs/aufs/opts.c linux-6.12.29/fs/aufs/opts.c +{ + return au_mntflags(sb) & AuOptMask_UDBA; +} -diff -Naur null/fs/aufs/opts.h linux-6.12.29/fs/aufs/opts.h +diff -Naur null/fs/aufs/opts.h linux-6.12.30/fs/aufs/opts.h --- /dev/null -+++ linux-6.12.29/fs/aufs/opts.h 2025-12-15 21:34:57.613338251 +0300 ++++ linux-6.12.30/fs/aufs/opts.h 2026-01-22 12:14:11.012746342 +0300 @@ -0,0 +1,264 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* @@ -27458,10 +27366,10 @@ diff -Naur null/fs/aufs/opts.h linux-6.12.29/fs/aufs/opts.h + +#endif /* __KERNEL__ */ +#endif /* __AUFS_OPTS_H__ */ -diff -Naur null/fs/aufs/plink.c linux-6.12.29/fs/aufs/plink.c +diff -Naur null/fs/aufs/plink.c linux-6.12.30/fs/aufs/plink.c --- /dev/null -+++ linux-6.12.29/fs/aufs/plink.c 2025-12-15 21:34:57.613338251 +0300 -@@ -0,0 +1,516 @@ ++++ linux-6.12.30/fs/aufs/plink.c 2026-01-22 12:14:11.012746342 +0300 +@@ -0,0 +1,508 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) 2005-2025 Junjiro R. Okajima @@ -27732,45 +27640,37 @@ diff -Naur null/fs/aufs/plink.c linux-6.12.29/fs/aufs/plink.c +{ + int err; + struct path h_path; -+ struct inode *h_dir, *delegated; ++ struct inode *h_dir; + + h_dir = d_inode(h_ppath->dentry); + inode_lock_nested(h_dir, AuLsc_I_CHILD2); + h_path.mnt = h_ppath->mnt; ++ err = vfsub_mnt_want_write(h_path.mnt); ++ if (unlikely(err)) ++ goto out; +again: + h_path.dentry = vfsub_lkup_one(tgt, h_ppath); + err = PTR_ERR(h_path.dentry); + if (IS_ERR(h_path.dentry)) -+ goto out; ++ goto out_mnt_write; + + err = 0; + /* wh.plink dir is not monitored */ + /* todo: is it really safe? */ + if (d_is_positive(h_path.dentry) + && d_inode(h_path.dentry) != d_inode(h_dentry)) { -+ delegated = NULL; -+ err = vfsub_unlink(h_dir, &h_path, &delegated, /*force*/0); -+ if (unlikely(err == -EWOULDBLOCK)) { -+ pr_warn("cannot retry for NFSv4 delegation" -+ " for an internal unlink\n"); -+ iput(delegated); -+ } ++ err = vfsub_unlink(h_dir, &h_path, /*force*/0); + dput(h_path.dentry); + h_path.dentry = NULL; + if (!err) + goto again; + } -+ if (!err && d_is_negative(h_path.dentry)) { -+ delegated = NULL; -+ err = vfsub_link(h_dentry, h_dir, &h_path, &delegated); -+ if (unlikely(err == -EWOULDBLOCK)) { -+ pr_warn("cannot retry for NFSv4 delegation" -+ " for an internal link\n"); -+ iput(delegated); -+ } -+ } ++ if (!err && d_is_negative(h_path.dentry)) ++ err = vfsub_link(h_dentry, h_dir, &h_path); + dput(h_path.dentry); + ++out_mnt_write: ++ vfsub_mnt_drop_write(h_path.mnt); +out: + inode_unlock(h_dir); + return err; @@ -27978,9 +27878,9 @@ diff -Naur null/fs/aufs/plink.c linux-6.12.29/fs/aufs/plink.c + } + } +} -diff -Naur null/fs/aufs/poll.c linux-6.12.29/fs/aufs/poll.c +diff -Naur null/fs/aufs/poll.c linux-6.12.30/fs/aufs/poll.c --- /dev/null -+++ linux-6.12.29/fs/aufs/poll.c 2025-12-15 21:34:57.614338238 +0300 ++++ linux-6.12.30/fs/aufs/poll.c 2026-01-22 12:14:11.012746342 +0300 @@ -0,0 +1,51 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -28033,9 +27933,9 @@ diff -Naur null/fs/aufs/poll.c linux-6.12.29/fs/aufs/poll.c + AuDbg("mask 0x%x\n", mask); + return mask; +} -diff -Naur null/fs/aufs/posix_acl.c linux-6.12.29/fs/aufs/posix_acl.c +diff -Naur null/fs/aufs/posix_acl.c linux-6.12.30/fs/aufs/posix_acl.c --- /dev/null -+++ linux-6.12.29/fs/aufs/posix_acl.c 2025-12-15 21:34:57.614338238 +0300 ++++ linux-6.12.30/fs/aufs/posix_acl.c 2026-01-22 12:14:11.012746342 +0300 @@ -0,0 +1,108 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -28145,9 +28045,9 @@ diff -Naur null/fs/aufs/posix_acl.c linux-6.12.29/fs/aufs/posix_acl.c + + return err; +} -diff -Naur null/fs/aufs/procfs.c linux-6.12.29/fs/aufs/procfs.c +diff -Naur null/fs/aufs/procfs.c linux-6.12.30/fs/aufs/procfs.c --- /dev/null -+++ linux-6.12.29/fs/aufs/procfs.c 2025-12-15 21:34:57.614338238 +0300 ++++ linux-6.12.30/fs/aufs/procfs.c 2026-01-22 12:14:11.014746317 +0300 @@ -0,0 +1,168 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -28317,9 +28217,9 @@ diff -Naur null/fs/aufs/procfs.c linux-6.12.29/fs/aufs/procfs.c +out: + return err; +} -diff -Naur null/fs/aufs/rdu.c linux-6.12.29/fs/aufs/rdu.c +diff -Naur null/fs/aufs/rdu.c linux-6.12.30/fs/aufs/rdu.c --- /dev/null -+++ linux-6.12.29/fs/aufs/rdu.c 2025-12-15 21:34:57.614338238 +0300 ++++ linux-6.12.30/fs/aufs/rdu.c 2026-01-22 12:14:11.014746317 +0300 @@ -0,0 +1,384 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -28705,9 +28605,9 @@ diff -Naur null/fs/aufs/rdu.c linux-6.12.29/fs/aufs/rdu.c + return err; +} +#endif -diff -Naur null/fs/aufs/rwsem.h linux-6.12.29/fs/aufs/rwsem.h +diff -Naur null/fs/aufs/rwsem.h linux-6.12.30/fs/aufs/rwsem.h --- /dev/null -+++ linux-6.12.29/fs/aufs/rwsem.h 2025-12-15 21:34:57.614338238 +0300 ++++ linux-6.12.30/fs/aufs/rwsem.h 2026-01-22 12:14:11.014746317 +0300 @@ -0,0 +1,89 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* @@ -28798,9 +28698,9 @@ diff -Naur null/fs/aufs/rwsem.h linux-6.12.29/fs/aufs/rwsem.h + +#endif /* __KERNEL__ */ +#endif /* __AUFS_RWSEM_H__ */ -diff -Naur null/fs/aufs/sbinfo.c linux-6.12.29/fs/aufs/sbinfo.c +diff -Naur null/fs/aufs/sbinfo.c linux-6.12.30/fs/aufs/sbinfo.c --- /dev/null -+++ linux-6.12.29/fs/aufs/sbinfo.c 2025-12-15 21:34:57.614338238 +0300 ++++ linux-6.12.30/fs/aufs/sbinfo.c 2026-01-22 12:14:11.014746317 +0300 @@ -0,0 +1,316 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -29118,9 +29018,9 @@ diff -Naur null/fs/aufs/sbinfo.c linux-6.12.29/fs/aufs/sbinfo.c + di_write_unlock2(d1, d2); + si_read_unlock(d1->d_sb); +} -diff -Naur null/fs/aufs/super.c linux-6.12.29/fs/aufs/super.c +diff -Naur null/fs/aufs/super.c linux-6.12.30/fs/aufs/super.c --- /dev/null -+++ linux-6.12.29/fs/aufs/super.c 2025-12-15 21:34:57.614338238 +0300 ++++ linux-6.12.30/fs/aufs/super.c 2026-01-22 12:14:11.014746317 +0300 @@ -0,0 +1,871 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -29993,9 +29893,9 @@ diff -Naur null/fs/aufs/super.c linux-6.12.29/fs/aufs/super.c + /* no need to __module_get() and module_put(). */ + .owner = THIS_MODULE, +}; -diff -Naur null/fs/aufs/super.h linux-6.12.29/fs/aufs/super.h +diff -Naur null/fs/aufs/super.h linux-6.12.30/fs/aufs/super.h --- /dev/null -+++ linux-6.12.29/fs/aufs/super.h 2025-12-15 21:34:57.614338238 +0300 ++++ linux-6.12.30/fs/aufs/super.h 2026-01-22 12:14:11.014746317 +0300 @@ -0,0 +1,618 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* @@ -30615,9 +30515,9 @@ diff -Naur null/fs/aufs/super.h linux-6.12.29/fs/aufs/super.h + +#endif /* __KERNEL__ */ +#endif /* __AUFS_SUPER_H__ */ -diff -Naur null/fs/aufs/sysaufs.c linux-6.12.29/fs/aufs/sysaufs.c +diff -Naur null/fs/aufs/sysaufs.c linux-6.12.30/fs/aufs/sysaufs.c --- /dev/null -+++ linux-6.12.29/fs/aufs/sysaufs.c 2025-12-15 21:34:57.614338238 +0300 ++++ linux-6.12.30/fs/aufs/sysaufs.c 2026-01-22 12:14:11.014746317 +0300 @@ -0,0 +1,94 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -30713,9 +30613,9 @@ diff -Naur null/fs/aufs/sysaufs.c linux-6.12.29/fs/aufs/sysaufs.c +out: + return err; +} -diff -Naur null/fs/aufs/sysaufs.h linux-6.12.29/fs/aufs/sysaufs.h +diff -Naur null/fs/aufs/sysaufs.h linux-6.12.30/fs/aufs/sysaufs.h --- /dev/null -+++ linux-6.12.29/fs/aufs/sysaufs.h 2025-12-15 21:34:57.614338238 +0300 ++++ linux-6.12.30/fs/aufs/sysaufs.h 2026-01-22 12:14:11.014746317 +0300 @@ -0,0 +1,102 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* @@ -30819,9 +30719,9 @@ diff -Naur null/fs/aufs/sysaufs.h linux-6.12.29/fs/aufs/sysaufs.h + +#endif /* __KERNEL__ */ +#endif /* __SYSAUFS_H__ */ -diff -Naur null/fs/aufs/sysfs.c linux-6.12.29/fs/aufs/sysfs.c +diff -Naur null/fs/aufs/sysfs.c linux-6.12.30/fs/aufs/sysfs.c --- /dev/null -+++ linux-6.12.29/fs/aufs/sysfs.c 2025-12-15 21:34:57.615338226 +0300 ++++ linux-6.12.30/fs/aufs/sysfs.c 2026-01-22 12:14:11.014746317 +0300 @@ -0,0 +1,374 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -31197,9 +31097,9 @@ diff -Naur null/fs/aufs/sysfs.c linux-6.12.29/fs/aufs/sysfs.c + } + } +} -diff -Naur null/fs/aufs/sysrq.c linux-6.12.29/fs/aufs/sysrq.c +diff -Naur null/fs/aufs/sysrq.c linux-6.12.30/fs/aufs/sysrq.c --- /dev/null -+++ linux-6.12.29/fs/aufs/sysrq.c 2025-12-15 21:34:57.615338226 +0300 ++++ linux-6.12.30/fs/aufs/sysrq.c 2026-01-22 12:14:11.015746305 +0300 @@ -0,0 +1,157 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -31358,9 +31258,9 @@ diff -Naur null/fs/aufs/sysrq.c linux-6.12.29/fs/aufs/sysrq.c + if (unlikely(err)) + pr_err("err %d (ignored)\n", err); +} -diff -Naur null/fs/aufs/vdir.c linux-6.12.29/fs/aufs/vdir.c +diff -Naur null/fs/aufs/vdir.c linux-6.12.30/fs/aufs/vdir.c --- /dev/null -+++ linux-6.12.29/fs/aufs/vdir.c 2025-12-15 21:34:57.615338226 +0300 ++++ linux-6.12.30/fs/aufs/vdir.c 2026-01-22 12:14:11.015746305 +0300 @@ -0,0 +1,896 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -32258,10 +32158,10 @@ diff -Naur null/fs/aufs/vdir.c linux-6.12.29/fs/aufs/vdir.c + /* smp_mb(); */ + return 0; +} -diff -Naur null/fs/aufs/vfsub.c linux-6.12.29/fs/aufs/vfsub.c +diff -Naur null/fs/aufs/vfsub.c linux-6.12.30/fs/aufs/vfsub.c --- /dev/null -+++ linux-6.12.29/fs/aufs/vfsub.c 2025-12-15 21:34:57.615338226 +0300 -@@ -0,0 +1,966 @@ ++++ linux-6.12.30/fs/aufs/vfsub.c 2026-01-22 12:14:11.015746305 +0300 +@@ -0,0 +1,1005 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) 2005-2025 Junjiro R. Okajima @@ -32284,6 +32184,7 @@ diff -Naur null/fs/aufs/vfsub.c linux-6.12.29/fs/aufs/vfsub.c + * sub-routines for VFS + */ + ++#include +#include +#include +#include @@ -32560,13 +32461,15 @@ diff -Naur null/fs/aufs/vfsub.c linux-6.12.29/fs/aufs/vfsub.c +{ + int err; + struct dentry *d; ++ struct inode *inode; + struct mnt_idmap *idmap; + + IMustLock(dir); + + d = path->dentry; + path->dentry = d->d_parent; -+ err = security_path_mknod(path, d, mode, 0); ++ inode = d_inode(path->dentry); ++ err = security_path_mknod(path, d, mode_strip_umask(inode, mode), 0); + path->dentry = d; + if (unlikely(err)) + goto out; @@ -32579,6 +32482,7 @@ diff -Naur null/fs/aufs/vfsub.c linux-6.12.29/fs/aufs/vfsub.c + struct path tmp = *path; + int did; + ++ security_path_post_mknod(idmap, d); + vfsub_update_h_iattr(&tmp, &did); + if (did) { + tmp.dentry = path->dentry->d_parent; @@ -32630,13 +32534,16 @@ diff -Naur null/fs/aufs/vfsub.c linux-6.12.29/fs/aufs/vfsub.c +{ + int err; + struct dentry *d; ++ struct inode *inode; + struct mnt_idmap *idmap; + + IMustLock(dir); + + d = path->dentry; + path->dentry = d->d_parent; -+ err = security_path_mknod(path, d, mode, new_encode_dev(dev)); ++ inode = d_inode(path->dentry); ++ err = security_path_mknod(path, d, mode_strip_umask(inode, mode), ++ new_encode_dev(dev)); + path->dentry = d; + if (unlikely(err)) + goto out; @@ -32671,12 +32578,12 @@ diff -Naur null/fs/aufs/vfsub.c linux-6.12.29/fs/aufs/vfsub.c + return -EMLINK; +} + -+int vfsub_link(struct dentry *src_dentry, struct inode *dir, struct path *path, -+ struct inode **delegated_inode) ++int vfsub_link(struct dentry *src_dentry, struct inode *dir, struct path *path) +{ -+ int err; ++ int err, e; + struct dentry *d; + struct mnt_idmap *idmap; ++ struct inode *deleg = NULL; + + IMustLock(dir); + @@ -32691,11 +32598,19 @@ diff -Naur null/fs/aufs/vfsub.c linux-6.12.29/fs/aufs/vfsub.c + path->dentry = d; + if (unlikely(err)) + goto out; -+ idmap = mnt_idmap(path->mnt); + -+ lockdep_off(); -+ err = vfs_link(src_dentry, idmap, dir, path->dentry, delegated_inode); -+ lockdep_on(); ++ idmap = mnt_idmap(path->mnt); ++ do { ++ lockdep_off(); ++ err = vfs_link(src_dentry, idmap, dir, path->dentry, &deleg); ++ lockdep_on(); ++ if (deleg) { ++ e = break_deleg_wait(&deleg); ++ if (!e) ++ continue; ++ } ++ break; ++ } while (1); + if (!err) { + struct path tmp = *path; + int did; @@ -32716,11 +32631,11 @@ diff -Naur null/fs/aufs/vfsub.c linux-6.12.29/fs/aufs/vfsub.c +} + +int vfsub_rename(struct inode *src_dir, struct dentry *src_dentry, -+ struct inode *dir, struct path *path, -+ struct inode **delegated_inode, unsigned int flags) ++ struct inode *dir, struct path *path, unsigned int flags) +{ -+ int err; ++ int err, e; + struct renamedata rd; ++ struct inode *deleg = NULL; + struct path tmp = { + .mnt = path->mnt + }; @@ -32743,11 +32658,19 @@ diff -Naur null/fs/aufs/vfsub.c linux-6.12.29/fs/aufs/vfsub.c + rd.new_mnt_idmap = rd.old_mnt_idmap; + rd.new_dir = dir; + rd.new_dentry = path->dentry; -+ rd.delegated_inode = delegated_inode; ++ rd.delegated_inode = &deleg; + rd.flags = flags; -+ lockdep_off(); -+ err = vfs_rename(&rd); -+ lockdep_on(); ++ do { ++ lockdep_off(); ++ err = vfs_rename(&rd); ++ lockdep_on(); ++ if (deleg) { ++ e = break_deleg_wait(&deleg); ++ if (!e) ++ continue; ++ } ++ break; ++ } while (1); + if (!err) { + int did; + @@ -32770,13 +32693,15 @@ diff -Naur null/fs/aufs/vfsub.c linux-6.12.29/fs/aufs/vfsub.c +{ + int err; + struct dentry *d; ++ struct inode *inode; + struct mnt_idmap *idmap; + + IMustLock(dir); + + d = path->dentry; + path->dentry = d->d_parent; -+ err = security_path_mkdir(path, d, mode); ++ inode = d_inode(path->dentry); ++ err = security_path_mkdir(path, d, mode_strip_umask(inode, mode)); + path->dentry = d; + if (unlikely(err)) + goto out; @@ -33026,11 +32951,9 @@ diff -Naur null/fs/aufs/vfsub.c linux-6.12.29/fs/aufs/vfsub.c + + idmap = mnt_idmap(path->mnt); + do_sio = au_test_h_perm_sio(idmap, dir, MAY_EXEC | MAY_WRITE); -+ if (!do_sio) { -+ lockdep_off(); ++ if (!do_sio) + err = vfsub_mkdir(dir, path, mode); -+ lockdep_on(); -+ } else { ++ else { + struct au_vfsub_mkdir_args args = { + .errp = &err, + .dir = dir, @@ -33088,7 +33011,6 @@ diff -Naur null/fs/aufs/vfsub.c linux-6.12.29/fs/aufs/vfsub.c + int *errp; + struct path *path; + struct iattr *ia; -+ struct inode **delegated_inode; +}; + +static void call_notify_change(void *args) @@ -33096,32 +33018,43 @@ diff -Naur null/fs/aufs/vfsub.c linux-6.12.29/fs/aufs/vfsub.c + struct notify_change_args *a = args; + struct inode *h_inode; + struct mnt_idmap *idmap; ++ struct inode *deleg = NULL; + + h_inode = d_inode(a->path->dentry); + IMustLock(h_inode); + + *a->errp = -EPERM; -+ if (!IS_IMMUTABLE(h_inode) && !IS_APPEND(h_inode)) { -+ idmap = mnt_idmap(a->path->mnt); ++ if (IS_IMMUTABLE(h_inode) || IS_APPEND(h_inode)) ++ goto out; ++ ++ idmap = mnt_idmap(a->path->mnt); ++ do { + lockdep_off(); -+ *a->errp = notify_change(idmap, a->path->dentry, a->ia, -+ a->delegated_inode); ++ *a->errp = notify_change(idmap, a->path->dentry, a->ia, &deleg); + lockdep_on(); -+ if (!*a->errp) -+ vfsub_update_h_iattr(a->path, /*did*/NULL); /*ignore*/ -+ } ++ if (deleg) { ++ int e; ++ ++ e = break_deleg_wait(&deleg); ++ if (!e) ++ continue; ++ } ++ break; ++ } while (1); ++ if (!*a->errp) ++ vfsub_update_h_iattr(a->path, /*did*/NULL); /*ignore*/ ++ ++out: + AuTraceErr(*a->errp); +} + -+int vfsub_notify_change(struct path *path, struct iattr *ia, -+ struct inode **delegated_inode) ++int vfsub_notify_change(struct path *path, struct iattr *ia) +{ + int err; + struct notify_change_args args = { -+ .errp = &err, -+ .path = path, -+ .ia = ia, -+ .delegated_inode = delegated_inode ++ .errp = &err, ++ .path = path, ++ .ia = ia + }; + + call_notify_change(&args); @@ -33129,15 +33062,13 @@ diff -Naur null/fs/aufs/vfsub.c linux-6.12.29/fs/aufs/vfsub.c + return err; +} + -+int vfsub_sio_notify_change(struct path *path, struct iattr *ia, -+ struct inode **delegated_inode) ++int vfsub_sio_notify_change(struct path *path, struct iattr *ia) +{ + int err, wkq_err; + struct notify_change_args args = { -+ .errp = &err, -+ .path = path, -+ .ia = ia, -+ .delegated_inode = delegated_inode ++ .errp = &err, ++ .path = path, ++ .ia = ia + }; + + wkq_err = au_wkq_wait(call_notify_change, &args); @@ -33153,7 +33084,6 @@ diff -Naur null/fs/aufs/vfsub.c linux-6.12.29/fs/aufs/vfsub.c + int *errp; + struct inode *dir; + struct path *path; -+ struct inode **delegated_inode; +}; + +static void call_unlink(void *args) @@ -33162,6 +33092,7 @@ diff -Naur null/fs/aufs/vfsub.c linux-6.12.29/fs/aufs/vfsub.c + struct dentry *d = a->path->dentry; + struct inode *h_inode; + struct mnt_idmap *idmap; ++ struct inode *deleg = NULL; + const int stop_sillyrename = (au_test_nfs(d->d_sb) + && au_dcount(d) == 1); + @@ -33182,9 +33113,19 @@ diff -Naur null/fs/aufs/vfsub.c linux-6.12.29/fs/aufs/vfsub.c + } + + idmap = mnt_idmap(a->path->mnt); -+ lockdep_off(); -+ *a->errp = vfs_unlink(idmap, a->dir, d, a->delegated_inode); -+ lockdep_on(); ++ do { ++ lockdep_off(); ++ *a->errp = vfs_unlink(idmap, a->dir, d, &deleg); ++ lockdep_on(); ++ if (deleg) { ++ int e; ++ ++ e = break_deleg_wait(&deleg); ++ if (!e) ++ continue; ++ } ++ break; ++ } while (1); + if (!*a->errp) { + struct path tmp = { + .dentry = d->d_parent, @@ -33205,15 +33146,13 @@ diff -Naur null/fs/aufs/vfsub.c linux-6.12.29/fs/aufs/vfsub.c + * @dir: must be locked. + * @dentry: target dentry. + */ -+int vfsub_unlink(struct inode *dir, struct path *path, -+ struct inode **delegated_inode, int force) ++int vfsub_unlink(struct inode *dir, struct path *path, int force) +{ + int err; + struct unlink_args args = { -+ .errp = &err, -+ .dir = dir, -+ .path = path, -+ .delegated_inode = delegated_inode ++ .errp = &err, ++ .dir = dir, ++ .path = path + }; + + if (!force) @@ -33228,10 +33167,10 @@ diff -Naur null/fs/aufs/vfsub.c linux-6.12.29/fs/aufs/vfsub.c + + return err; +} -diff -Naur null/fs/aufs/vfsub.h linux-6.12.29/fs/aufs/vfsub.h +diff -Naur null/fs/aufs/vfsub.h linux-6.12.30/fs/aufs/vfsub.h --- /dev/null -+++ linux-6.12.29/fs/aufs/vfsub.h 2025-12-15 21:34:57.615338226 +0300 -@@ -0,0 +1,441 @@ ++++ linux-6.12.30/fs/aufs/vfsub.h 2026-01-22 12:14:11.015746305 +0300 +@@ -0,0 +1,436 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Copyright (C) 2005-2025 Junjiro R. Okajima @@ -33448,11 +33387,9 @@ diff -Naur null/fs/aufs/vfsub.h linux-6.12.29/fs/aufs/vfsub.h +int vfsub_symlink(struct inode *dir, struct path *path, + const char *symname); +int vfsub_mknod(struct inode *dir, struct path *path, int mode, dev_t dev); -+int vfsub_link(struct dentry *src_dentry, struct inode *dir, -+ struct path *path, struct inode **delegated_inode); ++int vfsub_link(struct dentry *src_dentry, struct inode *dir, struct path *path); +int vfsub_rename(struct inode *src_hdir, struct dentry *src_dentry, -+ struct inode *hdir, struct path *path, -+ struct inode **delegated_inode, unsigned int flags); ++ struct inode *hdir, struct path *path, unsigned int flags); +int vfsub_mkdir(struct inode *dir, struct path *path, int mode); +int vfsub_rmdir(struct inode *dir, struct path *path); + @@ -33600,12 +33537,9 @@ diff -Naur null/fs/aufs/vfsub.h linux-6.12.29/fs/aufs/vfsub.h + +int vfsub_sio_mkdir(struct inode *dir, struct path *path, int mode); +int vfsub_sio_rmdir(struct inode *dir, struct path *path); -+int vfsub_sio_notify_change(struct path *path, struct iattr *ia, -+ struct inode **delegated_inode); -+int vfsub_notify_change(struct path *path, struct iattr *ia, -+ struct inode **delegated_inode); -+int vfsub_unlink(struct inode *dir, struct path *path, -+ struct inode **delegated_inode, int force); ++int vfsub_sio_notify_change(struct path *path, struct iattr *ia); ++int vfsub_notify_change(struct path *path, struct iattr *ia); ++int vfsub_unlink(struct inode *dir, struct path *path, int force); + +static inline int vfsub_getattr(const struct path *path, struct kstat *st) +{ @@ -33673,10 +33607,10 @@ diff -Naur null/fs/aufs/vfsub.h linux-6.12.29/fs/aufs/vfsub.h + +#endif /* __KERNEL__ */ +#endif /* __AUFS_VFSUB_H__ */ -diff -Naur null/fs/aufs/wbr_policy.c linux-6.12.29/fs/aufs/wbr_policy.c +diff -Naur null/fs/aufs/wbr_policy.c linux-6.12.30/fs/aufs/wbr_policy.c --- /dev/null -+++ linux-6.12.29/fs/aufs/wbr_policy.c 2025-12-15 21:34:57.615338226 +0300 -@@ -0,0 +1,830 @@ ++++ linux-6.12.30/fs/aufs/wbr_policy.c 2026-01-22 12:14:11.015746305 +0300 +@@ -0,0 +1,836 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) 2005-2025 Junjiro R. Okajima @@ -33710,6 +33644,10 @@ diff -Naur null/fs/aufs/wbr_policy.c linux-6.12.29/fs/aufs/wbr_policy.c + struct iattr ia; + struct inode *h_isrc; + ++ err = vfsub_mnt_want_write(h_path->mnt); ++ if (unlikely(err)) ++ goto out; ++ + h_isrc = d_inode(h_src); + ia.ia_valid = ATTR_FORCE | ATTR_MODE | ATTR_UID | ATTR_GID; + ia.ia_mode = h_isrc->i_mode; @@ -33717,16 +33655,18 @@ diff -Naur null/fs/aufs/wbr_policy.c linux-6.12.29/fs/aufs/wbr_policy.c + ia.ia_gid = h_isrc->i_gid; + sbits = !!(ia.ia_mode & (S_ISUID | S_ISGID)); + au_cpup_attr_flags(d_inode(h_path->dentry), h_isrc->i_flags); -+ /* no delegation since it is just created */ -+ err = vfsub_sio_notify_change(h_path, &ia, /*delegated*/NULL); ++ err = vfsub_sio_notify_change(h_path, &ia); + + /* is this nfs only? */ + if (!err && sbits && au_test_nfs(h_path->dentry->d_sb)) { + ia.ia_valid = ATTR_FORCE | ATTR_MODE; + ia.ia_mode = h_isrc->i_mode; -+ err = vfsub_sio_notify_change(h_path, &ia, /*delegated*/NULL); ++ err = vfsub_sio_notify_change(h_path, &ia); + } + ++ vfsub_mnt_drop_write(h_path->mnt); ++ ++out: + return err; +} + @@ -34507,10 +34447,10 @@ diff -Naur null/fs/aufs/wbr_policy.c linux-6.12.29/fs/aufs/wbr_policy.c + .fin = au_wbr_create_fin_mfs + } +}; -diff -Naur null/fs/aufs/whout.c linux-6.12.29/fs/aufs/whout.c +diff -Naur null/fs/aufs/whout.c linux-6.12.30/fs/aufs/whout.c --- /dev/null -+++ linux-6.12.29/fs/aufs/whout.c 2025-12-15 21:34:57.616338213 +0300 -@@ -0,0 +1,1072 @@ ++++ linux-6.12.30/fs/aufs/whout.c 2026-01-22 12:14:11.016746292 +0300 +@@ -0,0 +1,1049 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) 2005-2025 Junjiro R. Okajima @@ -34697,7 +34637,7 @@ diff -Naur null/fs/aufs/whout.c linux-6.12.29/fs/aufs/whout.c + struct path h_path = { + .mnt = au_br_mnt(br) + }; -+ struct inode *h_dir, *delegated; ++ struct inode *h_dir; + struct dentry *h_parent; + + h_parent = h_dentry->d_parent; /* dir inode is locked */ @@ -34710,15 +34650,8 @@ diff -Naur null/fs/aufs/whout.c linux-6.12.29/fs/aufs/whout.c + goto out; + + /* under the same dir, no need to lock_rename() */ -+ delegated = NULL; -+ err = vfsub_rename(h_dir, h_dentry, h_dir, &h_path, &delegated, -+ /*flags*/0); ++ err = vfsub_rename(h_dir, h_dentry, h_dir, &h_path, /*flags*/0); + AuTraceErr(err); -+ if (unlikely(err == -EWOULDBLOCK)) { -+ pr_warn("cannot retry for NFSv4 delegation" -+ " for an internal rename\n"); -+ iput(delegated); -+ } + dput(h_path.dentry); + +out: @@ -34734,7 +34667,6 @@ diff -Naur null/fs/aufs/whout.c linux-6.12.29/fs/aufs/whout.c +static int do_unlink_wh(struct inode *h_dir, struct path *h_path) +{ + int err, force; -+ struct inode *delegated; + + /* + * forces superio when the dir has a sticky bit. @@ -34742,13 +34674,7 @@ diff -Naur null/fs/aufs/whout.c linux-6.12.29/fs/aufs/whout.c + */ + force = (h_dir->i_mode & S_ISVTX) + && !uid_eq(current_fsuid(), d_inode(h_path->dentry)->i_uid); -+ delegated = NULL; -+ err = vfsub_unlink(h_dir, h_path, &delegated, force); -+ if (unlikely(err == -EWOULDBLOCK)) { -+ pr_warn("cannot retry for NFSv4 delegation" -+ " for an internal unlink\n"); -+ iput(delegated); -+ } ++ err = vfsub_unlink(h_dir, h_path, force); + return err; +} + @@ -34793,22 +34719,15 @@ diff -Naur null/fs/aufs/whout.c linux-6.12.29/fs/aufs/whout.c + const int isdir) +{ + int err; -+ struct inode *delegated; + + if (d_is_negative(whpath->dentry)) + return; + + if (isdir) + err = vfsub_rmdir(h_dir, whpath); -+ else { -+ delegated = NULL; -+ err = vfsub_unlink(h_dir, whpath, &delegated, /*force*/0); -+ if (unlikely(err == -EWOULDBLOCK)) { -+ pr_warn("cannot retry for NFSv4 delegation" -+ " for an internal unlink\n"); -+ iput(delegated); -+ } -+ } ++ else ++ err = vfsub_unlink(h_dir, whpath, /*force*/0); ++ + if (unlikely(err)) + pr_warn("failed removing %pd (%d), ignored.\n", + whpath->dentry, err); @@ -34965,7 +34884,7 @@ diff -Naur null/fs/aufs/whout.c linux-6.12.29/fs/aufs/whout.c + */ +int au_wh_init(struct au_branch *br, struct super_block *sb) +{ -+ int err, i; ++ int err, i, need_drop; + const unsigned char do_plink + = !!au_opt_test(au_mntflags(sb), PLINK); + struct inode *h_dir; @@ -35019,7 +34938,12 @@ diff -Naur null/fs/aufs/whout.c linux-6.12.29/fs/aufs/whout.c + wbr->wbr_wh[i] = NULL; + } + -+ err = 0; ++ need_drop = 0; ++ err = vfsub_mnt_want_write(path.mnt); ++ if (unlikely(err)) ++ goto out_err; ++ need_drop = 1; ++ + if (!au_br_writable(br->br_perm)) { + h_dir = d_inode(h_root); + au_wh_init_ro(h_dir, base, &path); @@ -35042,6 +34966,8 @@ diff -Naur null/fs/aufs/whout.c linux-6.12.29/fs/aufs/whout.c + pr_err("an error(%d) on the writable branch %pd(%s)\n", + err, h_root, au_sbtype(h_root->d_sb)); +out: ++ if (need_drop) ++ vfsub_mnt_drop_write(path.mnt); + for (i = 0; i < AuBrWh_Last; i++) + dput(base[i].dentry); + return err; @@ -35066,7 +34992,7 @@ diff -Naur null/fs/aufs/whout.c linux-6.12.29/fs/aufs/whout.c + struct path h_path; + struct reinit_br_wh *a = arg; + struct au_wbr *wbr; -+ struct inode *dir, *delegated; ++ struct inode *dir; + struct dentry *h_root; + struct au_hinode *hdir; + @@ -35093,13 +35019,10 @@ diff -Naur null/fs/aufs/whout.c linux-6.12.29/fs/aufs/whout.c + if (!err) { + h_path.dentry = wbr->wbr_whbase; + h_path.mnt = au_br_mnt(a->br); -+ delegated = NULL; -+ err = vfsub_unlink(hdir->hi_inode, &h_path, &delegated, -+ /*force*/0); -+ if (unlikely(err == -EWOULDBLOCK)) { -+ pr_warn("cannot retry for NFSv4 delegation" -+ " for an internal unlink\n"); -+ iput(delegated); ++ err = vfsub_mnt_want_write(h_path.mnt); ++ if (!err) { ++ err = vfsub_unlink(hdir->hi_inode, &h_path, /*force*/0); ++ vfsub_mnt_drop_write(h_path.mnt); + } + } else { + pr_warn("%pd is moved, ignored\n", wbr->wbr_whbase); @@ -35174,7 +35097,7 @@ diff -Naur null/fs/aufs/whout.c linux-6.12.29/fs/aufs/whout.c + struct au_branch *br; + struct au_wbr *wbr; + struct dentry *h_parent; -+ struct inode *h_dir, *delegated; ++ struct inode *h_dir; + + h_parent = wh->d_parent; /* dir inode is locked */ + h_dir = d_inode(h_parent); @@ -35185,13 +35108,7 @@ diff -Naur null/fs/aufs/whout.c linux-6.12.29/fs/aufs/whout.c + wbr = br->br_wbr; + wbr_wh_read_lock(wbr); + if (wbr->wbr_whbase) { -+ delegated = NULL; -+ err = vfsub_link(wbr->wbr_whbase, h_dir, &h_path, &delegated); -+ if (unlikely(err == -EWOULDBLOCK)) { -+ pr_warn("cannot retry for NFSv4 delegation" -+ " for an internal link\n"); -+ iput(delegated); -+ } ++ err = vfsub_link(wbr->wbr_whbase, h_dir, &h_path); + if (!err || err != -EMLINK) + goto out; + @@ -35583,9 +35500,9 @@ diff -Naur null/fs/aufs/whout.c linux-6.12.29/fs/aufs/whout.c + au_whtmp_rmdir_free(args); + } +} -diff -Naur null/fs/aufs/whout.h linux-6.12.29/fs/aufs/whout.h +diff -Naur null/fs/aufs/whout.h linux-6.12.30/fs/aufs/whout.h --- /dev/null -+++ linux-6.12.29/fs/aufs/whout.h 2025-12-15 21:34:57.616338213 +0300 ++++ linux-6.12.30/fs/aufs/whout.h 2026-01-22 12:14:11.016746292 +0300 @@ -0,0 +1,87 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* @@ -35674,9 +35591,9 @@ diff -Naur null/fs/aufs/whout.h linux-6.12.29/fs/aufs/whout.h + +#endif /* __KERNEL__ */ +#endif /* __AUFS_WHOUT_H__ */ -diff -Naur null/fs/aufs/wkq.c linux-6.12.29/fs/aufs/wkq.c +diff -Naur null/fs/aufs/wkq.c linux-6.12.30/fs/aufs/wkq.c --- /dev/null -+++ linux-6.12.29/fs/aufs/wkq.c 2025-12-15 21:34:57.616338213 +0300 ++++ linux-6.12.30/fs/aufs/wkq.c 2026-01-22 12:14:11.016746292 +0300 @@ -0,0 +1,370 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -36048,9 +35965,9 @@ diff -Naur null/fs/aufs/wkq.c linux-6.12.29/fs/aufs/wkq.c + + return err; +} -diff -Naur null/fs/aufs/wkq.h linux-6.12.29/fs/aufs/wkq.h +diff -Naur null/fs/aufs/wkq.h linux-6.12.30/fs/aufs/wkq.h --- /dev/null -+++ linux-6.12.29/fs/aufs/wkq.h 2025-12-15 21:34:57.616338213 +0300 ++++ linux-6.12.30/fs/aufs/wkq.h 2026-01-22 12:14:11.016746292 +0300 @@ -0,0 +1,89 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* @@ -36141,9 +36058,9 @@ diff -Naur null/fs/aufs/wkq.h linux-6.12.29/fs/aufs/wkq.h + +#endif /* __KERNEL__ */ +#endif /* __AUFS_WKQ_H__ */ -diff -Naur null/fs/aufs/xattr.c linux-6.12.29/fs/aufs/xattr.c +diff -Naur null/fs/aufs/xattr.c linux-6.12.30/fs/aufs/xattr.c --- /dev/null -+++ linux-6.12.29/fs/aufs/xattr.c 2025-12-15 21:34:57.616338213 +0300 ++++ linux-6.12.30/fs/aufs/xattr.c 2026-01-22 12:14:11.016746292 +0300 @@ -0,0 +1,360 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -36505,10 +36422,10 @@ diff -Naur null/fs/aufs/xattr.c linux-6.12.29/fs/aufs/xattr.c +{ + sb->s_xattr = au_xattr_handlers; +} -diff -Naur null/fs/aufs/xino.c linux-6.12.29/fs/aufs/xino.c +diff -Naur null/fs/aufs/xino.c linux-6.12.30/fs/aufs/xino.c --- /dev/null -+++ linux-6.12.29/fs/aufs/xino.c 2025-12-15 21:34:57.616338213 +0300 -@@ -0,0 +1,1926 @@ ++++ linux-6.12.30/fs/aufs/xino.c 2026-01-22 12:14:11.016746292 +0300 +@@ -0,0 +1,1927 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) 2005-2025 Junjiro R. Okajima @@ -36704,13 +36621,15 @@ diff -Naur null/fs/aufs/xino.c linux-6.12.29/fs/aufs/xino.c + h_parent = au_dget_parent_lock(d, AuLsc_I_PARENT); + if (!wbrtop) + mutex_unlock(&mtx); -+ /* mnt_want_write() is unnecessary here */ + h_dir = d_inode(h_parent); + inode = file_inode(file); -+ /* no delegation since it is just created */ -+ if (vfsub_inode_nlink(inode, AU_I_BRANCH)) -+ err = vfsub_unlink(h_dir, &file->f_path, /*delegated*/NULL, -+ /*force*/0); ++ if (vfsub_inode_nlink(inode, AU_I_BRANCH)) { ++ err = vfsub_mnt_want_write(file->f_path.mnt); ++ if (!err) { ++ err = vfsub_unlink(h_dir, &file->f_path, /*force*/0); ++ vfsub_mnt_drop_write(file->f_path.mnt); ++ } ++ } + inode_unlock(h_dir); + dput(h_parent); + if (unlikely(err)) { @@ -36747,7 +36666,7 @@ diff -Naur null/fs/aufs/xino.c linux-6.12.29/fs/aufs/xino.c +{ + struct file *file; + struct dentry *dentry; -+ struct inode *dir, *delegated; ++ struct inode *dir; + struct qstr *name; + struct path ppath, path; + int err, do_unlock; @@ -36769,32 +36688,29 @@ diff -Naur null/fs/aufs/xino.c linux-6.12.29/fs/aufs/xino.c + goto out; + } + -+ /* no need to mnt_want_write() since we call dentry_open() later */ ++ path.mnt = base->mnt; ++ err = vfsub_mnt_want_write(path.mnt); ++ if (unlikely(err)) ++ goto out_dput; ++ + err = vfs_create(mnt_idmap(base->mnt), dir, path.dentry, 0666, NULL); + if (unlikely(err)) { + file = ERR_PTR(err); + pr_err("%pd create err %d\n", dentry, err); -+ goto out_dput; ++ goto out_mnt_write; + } + -+ path.mnt = base->mnt; + file = vfsub_dentry_open(&path, + O_RDWR | O_CREAT | O_EXCL | O_LARGEFILE + /* | __FMODE_NONOTIFY */); + if (IS_ERR(file)) { + pr_err("%pd open err %ld\n", dentry, PTR_ERR(file)); -+ goto out_dput; ++ goto out_mnt_write; + } + -+ delegated = NULL; -+ err = vfsub_unlink(dir, &file->f_path, &delegated, /*force*/0); ++ err = vfsub_unlink(dir, &file->f_path, /*force*/0); + au_xino_unlock_dir(&ldir); + do_unlock = 0; -+ if (unlikely(err == -EWOULDBLOCK)) { -+ pr_warn("cannot retry for NFSv4 delegation" -+ " for an internal unlink\n"); -+ iput(delegated); -+ } + if (unlikely(err)) { + pr_err("%pd unlink err %d\n", dentry, err); + goto out_fput; @@ -36808,11 +36724,13 @@ diff -Naur null/fs/aufs/xino.c linux-6.12.29/fs/aufs/xino.c + goto out_fput; + } + } -+ goto out_dput; /* success */ ++ goto out_mnt_write; /* success */ + +out_fput: + fput(file); + file = ERR_PTR(err); ++out_mnt_write: ++ vfsub_mnt_drop_write(path.mnt); +out_dput: + dput(path.dentry); +out: @@ -38435,9 +38353,9 @@ diff -Naur null/fs/aufs/xino.c linux-6.12.29/fs/aufs/xino.c +out: + return err; +} -diff -Naur null/include/uapi/linux/aufs_type.h linux-6.12.29/include/uapi/linux/aufs_type.h +diff -Naur null/include/uapi/linux/aufs_type.h linux-6.12.30/include/uapi/linux/aufs_type.h --- /dev/null -+++ linux-6.12.29/include/uapi/linux/aufs_type.h 2025-12-15 21:34:57.617338201 +0300 ++++ linux-6.12.30/include/uapi/linux/aufs_type.h 2026-01-22 12:14:11.019746255 +0300 @@ -0,0 +1,452 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +/* @@ -38481,7 +38399,7 @@ diff -Naur null/include/uapi/linux/aufs_type.h linux-6.12.29/include/uapi/linux/ +#include +#endif /* __KERNEL__ */ + -+#define AUFS_VERSION "6.12-20251110" ++#define AUFS_VERSION "6.12-20260112" + +/* 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/linux/patch-6.12.67.xz b/kernel/tools/cpupowertools/files/patches/linux/patch-6.12.67.xz new file mode 100644 index 00000000..2e2ca44c Binary files /dev/null and b/kernel/tools/cpupowertools/files/patches/linux/patch-6.12.67.xz differ diff --git a/kernel/tools/cpupowertools/pspec.xml b/kernel/tools/cpupowertools/pspec.xml index 9389b2d1..49d89b07 100644 --- a/kernel/tools/cpupowertools/pspec.xml +++ b/kernel/tools/cpupowertools/pspec.xml @@ -18,10 +18,10 @@ - patches/linux/patch-6.12.63.xz + patches/linux/patch-6.12.67.xz - patches/aufs6/aufs6.12-20251110.patch + patches/aufs6/aufs6.12-20260112.patch patches/aufs6/aufs6-base.patch patches/aufs6/aufs6-kbuild.patch @@ -95,6 +95,13 @@ + + 2026-01-23 + 6.12.67 + Version bump + Mustafa Cinasal + muscnsl@gmail.com + 2025-12-19 6.12.63