From a1aca2a0c010f5ea68065608f7260c2b5603f8c2 Mon Sep 17 00:00:00 2001 From: Rmys Date: Tue, 13 Sep 2022 00:48:27 +0300 Subject: [PATCH] kernel-5.15.67 --- .../kernel/files/configs/kernel-x86_64-config | 8 +- .../patches/aufs5/aufs5.15.36-20220509.patch | 38475 ---------------- ...20530.patch => aufs5.15.41-20220620.patch} | 202 +- .../files/patches/linux/patch-5.15.67.xz | Bin 0 -> 2725440 bytes kernel/kernel/pspec.xml | 15 +- 5 files changed, 118 insertions(+), 38582 deletions(-) delete mode 100644 kernel/kernel/files/patches/aufs5/aufs5.15.36-20220509.patch rename kernel/kernel/files/patches/aufs5/{aufs5.15.41-20220530.patch => aufs5.15.41-20220620.patch} (99%) create mode 100644 kernel/kernel/files/patches/linux/patch-5.15.67.xz diff --git a/kernel/kernel/files/configs/kernel-x86_64-config b/kernel/kernel/files/configs/kernel-x86_64-config index fe240164..6bf50f96 100644 --- a/kernel/kernel/files/configs/kernel-x86_64-config +++ b/kernel/kernel/files/configs/kernel-x86_64-config @@ -1,6 +1,6 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/x86_64 5.15.61 Kernel Configuration +# Linux/x86_64 5.15.67 Kernel Configuration # CONFIG_CC_VERSION_TEXT="gcc (Pisi Linux) 10.3.0" CONFIG_CC_IS_GCC=y @@ -9484,7 +9484,7 @@ CONFIG_OCFS2_FS_USERSPACE_CLUSTER=m CONFIG_OCFS2_FS_STATS=y CONFIG_OCFS2_DEBUG_MASKLOG=y # CONFIG_OCFS2_DEBUG_FS is not set -CONFIG_BTRFS_FS=y +CONFIG_BTRFS_FS=m CONFIG_BTRFS_FS_POSIX_ACL=y # CONFIG_BTRFS_FS_CHECK_INTEGRITY is not set # CONFIG_BTRFS_FS_RUN_SANITY_TESTS is not set @@ -9923,7 +9923,7 @@ CONFIG_INIT_STACK_NONE=y # end of Kernel hardening options # end of Security options -CONFIG_XOR_BLOCKS=y +CONFIG_XOR_BLOCKS=m CONFIG_ASYNC_CORE=m CONFIG_ASYNC_MEMCPY=m CONFIG_ASYNC_XOR=m @@ -10169,7 +10169,7 @@ CONFIG_BINARY_PRINTF=y # # Library routines # -CONFIG_RAID6_PQ=y +CONFIG_RAID6_PQ=m CONFIG_RAID6_PQ_BENCHMARK=y CONFIG_LINEAR_RANGES=y CONFIG_PACKING=y diff --git a/kernel/kernel/files/patches/aufs5/aufs5.15.36-20220509.patch b/kernel/kernel/files/patches/aufs5/aufs5.15.36-20220509.patch deleted file mode 100644 index 034b926d..00000000 --- a/kernel/kernel/files/patches/aufs5/aufs5.15.36-20220509.patch +++ /dev/null @@ -1,38475 +0,0 @@ -diff -Naur null/Documentation/ABI/testing/debugfs-aufs linux-5.15.36/Documentation/ABI/testing/debugfs-aufs ---- /dev/null -+++ linux-5.15.36/Documentation/ABI/testing/debugfs-aufs 2022-05-10 16:51:39.862744220 +0300 -@@ -0,0 +1,55 @@ -+What: /debug/aufs/si_/ -+Date: March 2009 -+Contact: J. R. Okajima -+Description: -+ Under /debug/aufs, a directory named si_ is created -+ per aufs mount, where is a unique id generated -+ internally. -+ -+What: /debug/aufs/si_/plink -+Date: Apr 2013 -+Contact: J. R. Okajima -+Description: -+ It has three lines and shows the information about the -+ pseudo-link. The first line is a single number -+ representing a number of buckets. The second line is a -+ number of pseudo-links per buckets (separated by a -+ blank). The last line is a single number representing a -+ total number of psedo-links. -+ When the aufs mount option 'noplink' is specified, it -+ will show "1\n0\n0\n". -+ -+What: /debug/aufs/si_/xib -+Date: March 2009 -+Contact: J. R. Okajima -+Description: -+ It shows the consumed blocks by xib (External Inode Number -+ Bitmap), its block size and file size. -+ When the aufs mount option 'noxino' is specified, it -+ will be empty. About XINO files, see the aufs manual. -+ -+What: /debug/aufs/si_/xi -+Date: March 2009 -+Contact: J. R. Okajima -+Description: -+ It shows the consumed blocks by xino (External Inode Number -+ Translation Table), its link count, block size and file -+ size. -+ Due to the file size limit, there may exist multiple -+ xino files per branch. In this case, "-N" is added to -+ the filename and it corresponds to the index of the -+ internal xino array. "-0" is omitted. -+ When the aufs mount option 'noxino' is specified, Those -+ entries won't exist. About XINO files, see the aufs -+ manual. -+ -+What: /debug/aufs/si_/xigen -+Date: March 2009 -+Contact: J. R. Okajima -+Description: -+ It shows the consumed blocks by xigen (External Inode -+ Generation Table), its block size and file size. -+ If CONFIG_AUFS_EXPORT is disabled, this entry will not -+ 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-5.15.36/Documentation/ABI/testing/sysfs-aufs ---- /dev/null -+++ linux-5.15.36/Documentation/ABI/testing/sysfs-aufs 2022-05-10 16:51:39.863744220 +0300 -@@ -0,0 +1,31 @@ -+What: /sys/fs/aufs/si_/ -+Date: March 2009 -+Contact: J. R. Okajima -+Description: -+ Under /sys/fs/aufs, a directory named si_ is created -+ per aufs mount, where is a unique id generated -+ internally. -+ -+What: /sys/fs/aufs/si_/br -+Date: March 2009 -+Contact: J. R. Okajima -+Description: -+ It shows the abolute path of a member directory (which -+ is called branch) in aufs, and its permission. -+ -+What: /sys/fs/aufs/si_/brid -+Date: July 2013 -+Contact: J. R. Okajima -+Description: -+ It shows the id of a member directory (which is called -+ branch) in aufs. -+ -+What: /sys/fs/aufs/si_/xi_path -+Date: March 2009 -+Contact: J. R. Okajima -+Description: -+ It shows the abolute path of XINO (External Inode Number -+ Bitmap, Translation Table and Generation Table) file -+ 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-5.15.36/Documentation/filesystems/aufs/design/01intro.txt ---- /dev/null -+++ linux-5.15.36/Documentation/filesystems/aufs/design/01intro.txt 2022-05-10 16:51:39.863744220 +0300 -@@ -0,0 +1,171 @@ -+ -+# Copyright (C) 2005-2021 Junjiro R. Okajima -+# -+# This program is free software; you can redistribute it and/or modify -+# it under the terms of the GNU General Public License as published by -+# the Free Software Foundation; either version 2 of the License, or -+# (at your option) any later version. -+# -+# This program is distributed in the hope that it will be useful, -+# but WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program. If not, see . -+ -+Introduction -+---------------------------------------- -+ -+aufs [ei ju: ef es] | /ey-yoo-ef-es/ | [a u f s] -+1. abbrev. for "advanced multi-layered unification filesystem". -+2. abbrev. for "another unionfs". -+3. abbrev. for "auf das" in German which means "on the" in English. -+ Ex. "Butter aufs Brot"(G) means "butter onto bread"(E). -+ But "Filesystem aufs Filesystem" is hard to understand. -+4. abbrev. for "African Urban Fashion Show". -+ -+AUFS is a filesystem with features: -+- multi layered stackable unification filesystem, the member directory -+ is called as a branch. -+- branch permission and attribute, 'readonly', 'real-readonly', -+ 'readwrite', 'whiteout-able', 'link-able whiteout', etc. and their -+ combination. -+- internal "file copy-on-write". -+- logical deletion, whiteout. -+- dynamic branch manipulation, adding, deleting and changing permission. -+- allow bypassing aufs, user's direct branch access. -+- external inode number translation table and bitmap which maintains the -+ persistent aufs inode number. -+- seekable directory, including NFS readdir. -+- file mapping, mmap and sharing pages. -+- pseudo-link, hardlink over branches. -+- loopback mounted filesystem as a branch. -+- several policies to select one among multiple writable branches. -+- revert a single systemcall when an error occurs in aufs. -+- and more... -+ -+ -+Multi Layered Stackable Unification Filesystem -+---------------------------------------------------------------------- -+Most people already knows what it is. -+It is a filesystem which unifies several directories and provides a -+merged single directory. When users access a file, the access will be -+passed/re-directed/converted (sorry, I am not sure which English word is -+correct) to the real file on the member filesystem. The member -+filesystem is called 'lower filesystem' or 'branch' and has a mode -+'readonly' and 'readwrite.' And the deletion for a file on the lower -+readonly branch is handled by creating 'whiteout' on the upper writable -+branch. -+ -+On LKML, there have been discussions about UnionMount (Jan Blunck, -+Bharata B Rao and Valerie Aurora) and Unionfs (Erez Zadok). They took -+different approaches to implement the merged-view. -+The former tries putting it into VFS, and the latter implements as a -+separate filesystem. -+(If I misunderstand about these implementations, please let me know and -+I shall correct it. Because it is a long time ago when I read their -+source files last time). -+ -+UnionMount's approach will be able to small, but may be hard to share -+branches between several UnionMount since the whiteout in it is -+implemented in the inode on branch filesystem and always -+shared. According to Bharata's post, readdir does not seems to be -+finished yet. -+There are several missing features known in this implementations such as -+- for users, the inode number may change silently. eg. copy-up. -+- link(2) may break by copy-up. -+- read(2) may get an obsoleted filedata (fstat(2) too). -+- fcntl(F_SETLK) may be broken by copy-up. -+- unnecessary copy-up may happen, for example mmap(MAP_PRIVATE) after -+ open(O_RDWR). -+ -+In linux-3.18, "overlay" filesystem (formerly known as "overlayfs") was -+merged into mainline. This is another implementation of UnionMount as a -+separated filesystem. All the limitations and known problems which -+UnionMount are equally inherited to "overlay" filesystem. -+ -+Unionfs has a longer history. When I started implementing a stackable -+filesystem (Aug 2005), it already existed. It has virtual super_block, -+inode, dentry and file objects and they have an array pointing lower -+same kind objects. After contributing many patches for Unionfs, I -+re-started my project AUFS (Jun 2006). -+ -+In AUFS, the structure of filesystem resembles to Unionfs, but I -+implemented my own ideas, approaches and enhancements and it became -+totally different one. -+ -+Comparing DM snapshot and fs based implementation -+- the number of bytes to be copied between devices is much smaller. -+- the type of filesystem must be one and only. -+- the fs must be writable, no readonly fs, even for the lower original -+ device. so the compression fs will not be usable. but if we use -+ loopback mount, we may address this issue. -+ for instance, -+ mount /cdrom/squashfs.img /sq -+ losetup /sq/ext2.img -+ losetup /somewhere/cow -+ dmsetup "snapshot /dev/loop0 /dev/loop1 ..." -+- it will be difficult (or needs more operations) to extract the -+ difference between the original device and COW. -+- DM snapshot-merge may help a lot when users try merging. in the -+ fs-layer union, users will use rsync(1). -+ -+You may want to read my old paper "Filesystems in LiveCD" -+(http://aufs.sourceforge.net/aufs2/report/sq/sq.pdf). -+ -+ -+Several characters/aspects/persona of aufs -+---------------------------------------------------------------------- -+ -+Aufs has several characters, aspects or persona. -+1. a filesystem, callee of VFS helper -+2. sub-VFS, caller of VFS helper for branches -+3. a virtual filesystem which maintains persistent inode number -+4. reader/writer of files on branches such like an application -+ -+1. Callee of VFS Helper -+As an ordinary linux filesystem, aufs is a callee of VFS. For instance, -+unlink(2) from an application reaches sys_unlink() kernel function and -+then vfs_unlink() is called. vfs_unlink() is one of VFS helper and it -+calls filesystem specific unlink operation. Actually aufs implements the -+unlink operation but it behaves like a redirector. -+ -+2. Caller of VFS Helper for Branches -+aufs_unlink() passes the unlink request to the branch filesystem as if -+it were called from VFS. So the called unlink operation of the branch -+filesystem acts as usual. As a caller of VFS helper, aufs should handle -+every necessary pre/post operation for the branch filesystem. -+- acquire the lock for the parent dir on a branch -+- lookup in a branch -+- revalidate dentry on a branch -+- mnt_want_write() for a branch -+- vfs_unlink() for a branch -+- mnt_drop_write() for a branch -+- release the lock on a branch -+ -+3. Persistent Inode Number -+One of the most important issue for a filesystem is to maintain inode -+numbers. This is particularly important to support exporting a -+filesystem via NFS. Aufs is a virtual filesystem which doesn't have a -+backend block device for its own. But some storage is necessary to -+keep and maintain the inode numbers. It may be a large space and may not -+suit to keep in memory. Aufs rents some space from its first writable -+branch filesystem (by default) and creates file(s) on it. These files -+are created by aufs internally and removed soon (currently) keeping -+opened. -+Note: Because these files are removed, they are totally gone after -+ unmounting aufs. It means the inode numbers are not persistent -+ across unmount or reboot. I have a plan to make them really -+ persistent which will be important for aufs on NFS server. -+ -+4. Read/Write Files Internally (copy-on-write) -+Because a branch can be readonly, when you write a file on it, aufs will -+"copy-up" it to the upper writable branch internally. And then write the -+originally requested thing to the file. Generally kernel doesn't -+open/read/write file actively. In aufs, even a single write may cause a -+internal "file copy". This behaviour is very similar to cp(1) command. -+ -+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-5.15.36/Documentation/filesystems/aufs/design/02struct.txt ---- /dev/null -+++ linux-5.15.36/Documentation/filesystems/aufs/design/02struct.txt 2022-05-10 16:51:39.863744220 +0300 -@@ -0,0 +1,258 @@ -+ -+# Copyright (C) 2005-2021 Junjiro R. Okajima -+# -+# This program is free software; you can redistribute it and/or modify -+# it under the terms of the GNU General Public License as published by -+# the Free Software Foundation; either version 2 of the License, or -+# (at your option) any later version. -+# -+# This program is distributed in the hope that it will be useful, -+# but WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program. If not, see . -+ -+Basic Aufs Internal Structure -+ -+Superblock/Inode/Dentry/File Objects -+---------------------------------------------------------------------- -+As like an ordinary filesystem, aufs has its own -+superblock/inode/dentry/file objects. All these objects have a -+dynamically allocated array and store the same kind of pointers to the -+lower filesystem, branch. -+For example, when you build a union with one readwrite branch and one -+readonly, mounted /au, /rw and /ro respectively. -+- /au = /rw + /ro -+- /ro/fileA exists but /rw/fileA -+ -+Aufs lookup operation finds /ro/fileA and gets dentry for that. These -+pointers are stored in a aufs dentry. The array in aufs dentry will be, -+- [0] = NULL (because /rw/fileA doesn't exist) -+- [1] = /ro/fileA -+ -+This style of an array is essentially same to the aufs -+superblock/inode/dentry/file objects. -+ -+Because aufs supports manipulating branches, ie. add/delete/change -+branches dynamically, these objects has its own generation. When -+branches are changed, the generation in aufs superblock is -+incremented. And a generation in other object are compared when it is -+accessed. When a generation in other objects are obsoleted, aufs -+refreshes the internal array. -+ -+ -+Superblock -+---------------------------------------------------------------------- -+Additionally aufs superblock has some data for policies to select one -+among multiple writable branches, XIB files, pseudo-links and kobject. -+See below in detail. -+About the policies which supports copy-down a directory, see -+wbr_policy.txt too. -+ -+ -+Branch and XINO(External Inode Number Translation Table) -+---------------------------------------------------------------------- -+Every branch has its own xino (external inode number translation table) -+file. The xino file is created and unlinked by aufs internally. When two -+members of a union exist on the same filesystem, they share the single -+xino file. -+The struct of a xino file is simple, just a sequence of aufs inode -+numbers which is indexed by the lower inode number. -+In the above sample, assume the inode number of /ro/fileA is i111 and -+aufs assigns the inode number i999 for fileA. Then aufs writes 999 as -+4(8) bytes at 111 * 4(8) bytes offset in the xino file. -+ -+When the inode numbers are not contiguous, the xino file will be sparse -+which has a hole in it and doesn't consume as much disk space as it -+might appear. If your branch filesystem consumes disk space for such -+holes, then you should specify 'xino=' option at mounting aufs. -+ -+Aufs has a mount option to free the disk blocks for such holes in XINO -+files on tmpfs or ramdisk. But it is not so effective actually. If you -+meet a problem of disk shortage due to XINO files, then you should try -+"tmpfs-ino.patch" (and "vfs-ino.patch" too) in aufs4-standalone.git. -+The patch localizes the assignment inumbers per tmpfs-mount and avoid -+the holes in XINO files. -+ -+Also a writable branch has three kinds of "whiteout bases". All these -+are existed when the branch is joined to aufs, and their names are -+whiteout-ed doubly, so that users will never see their names in aufs -+hierarchy. -+1. a regular file which will be hardlinked to all whiteouts. -+2. a directory to store a pseudo-link. -+3. a directory to store an "orphan"-ed file temporary. -+ -+1. Whiteout Base -+ When you remove a file on a readonly branch, aufs handles it as a -+ logical deletion and creates a whiteout on the upper writable branch -+ as a hardlink of this file in order not to consume inode on the -+ writable branch. -+2. Pseudo-link Dir -+ See below, Pseudo-link. -+3. Step-Parent Dir -+ When "fileC" exists on the lower readonly branch only and it is -+ opened and removed with its parent dir, and then user writes -+ something into it, then aufs copies-up fileC to this -+ directory. Because there is no other dir to store fileC. After -+ creating a file under this dir, the file is unlinked. -+ -+Because aufs supports manipulating branches, ie. add/delete/change -+dynamically, a branch has its own id. When the branch order changes, -+aufs finds the new index by searching the branch id. -+ -+ -+Pseudo-link -+---------------------------------------------------------------------- -+Assume "fileA" exists on the lower readonly branch only and it is -+hardlinked to "fileB" on the branch. When you write something to fileA, -+aufs copies-up it to the upper writable branch. Additionally aufs -+creates a hardlink under the Pseudo-link Directory of the writable -+branch. The inode of a pseudo-link is kept in aufs super_block as a -+simple list. If fileB is read after unlinking fileA, aufs returns -+filedata from the pseudo-link instead of the lower readonly -+branch. Because the pseudo-link is based upon the inode, to keep the -+inode number by xino (see above) is essentially necessary. -+ -+All the hardlinks under the Pseudo-link Directory of the writable branch -+should be restored in a proper location later. Aufs provides a utility -+to do this. The userspace helpers executed at remounting and unmounting -+aufs by default. -+During this utility is running, it puts aufs into the pseudo-link -+maintenance mode. In this mode, only the process which began the -+maintenance mode (and its child processes) is allowed to operate in -+aufs. Some other processes which are not related to the pseudo-link will -+be allowed to run too, but the rest have to return an error or wait -+until the maintenance mode ends. If a process already acquires an inode -+mutex (in VFS), it has to return an error. -+ -+ -+XIB(external inode number bitmap) -+---------------------------------------------------------------------- -+Addition to the xino file per a branch, aufs has an external inode number -+bitmap in a superblock object. It is also an internal file such like a -+xino file. -+It is a simple bitmap to mark whether the aufs inode number is in-use or -+not. -+To reduce the file I/O, aufs prepares a single memory page to cache xib. -+ -+As well as XINO files, aufs has a feature to truncate/refresh XIB to -+reduce the number of consumed disk blocks for these files. -+ -+ -+Virtual or Vertical Dir, and Readdir in Userspace -+---------------------------------------------------------------------- -+In order to support multiple layers (branches), aufs readdir operation -+constructs a virtual dir block on memory. For readdir, aufs calls -+vfs_readdir() internally for each dir on branches, merges their entries -+with eliminating the whiteout-ed ones, and sets it to file (dir) -+object. So the file object has its entry list until it is closed. The -+entry list will be updated when the file position is zero and becomes -+obsoleted. This decision is made in aufs automatically. -+ -+The dynamically allocated memory block for the name of entries has a -+unit of 512 bytes (by default) and stores the names contiguously (no -+padding). Another block for each entry is handled by kmem_cache too. -+During building dir blocks, aufs creates hash list and judging whether -+the entry is whiteouted by its upper branch or already listed. -+The merged result is cached in the corresponding inode object and -+maintained by a customizable life-time option. -+ -+Some people may call it can be a security hole or invite DoS attack -+since the opened and once readdir-ed dir (file object) holds its entry -+list and becomes a pressure for system memory. But I'd say it is similar -+to files under /proc or /sys. The virtual files in them also holds a -+memory page (generally) while they are opened. When an idea to reduce -+memory for them is introduced, it will be applied to aufs too. -+For those who really hate this situation, I've developed readdir(3) -+library which operates this merging in userspace. You just need to set -+LD_PRELOAD environment variable, and aufs will not consume no memory in -+kernel space for readdir(3). -+ -+ -+Workqueue -+---------------------------------------------------------------------- -+Aufs sometimes requires privilege access to a branch. For instance, -+in copy-up/down operation. When a user process is going to make changes -+to a file which exists in the lower readonly branch only, and the mode -+of one of ancestor directories may not be writable by a user -+process. Here aufs copy-up the file with its ancestors and they may -+require privilege to set its owner/group/mode/etc. -+This is a typical case of a application character of aufs (see -+Introduction). -+ -+Aufs uses workqueue synchronously for this case. It creates its own -+workqueue. The workqueue is a kernel thread and has privilege. Aufs -+passes the request to call mkdir or write (for example), and wait for -+its completion. This approach solves a problem of a signal handler -+simply. -+If aufs didn't adopt the workqueue and changed the privilege of the -+process, then the process may receive the unexpected SIGXFSZ or other -+signals. -+ -+Also aufs uses the system global workqueue ("events" kernel thread) too -+for asynchronous tasks, such like handling inotify/fsnotify, re-creating a -+whiteout base and etc. This is unrelated to a privilege. -+Most of aufs operation tries acquiring a rw_semaphore for aufs -+superblock at the beginning, at the same time waits for the completion -+of all queued asynchronous tasks. -+ -+ -+Whiteout -+---------------------------------------------------------------------- -+The whiteout in aufs is very similar to Unionfs's. That is represented -+by its filename. UnionMount takes an approach of a file mode, but I am -+afraid several utilities (find(1) or something) will have to support it. -+ -+Basically the whiteout represents "logical deletion" which stops aufs to -+lookup further, but also it represents "dir is opaque" which also stop -+further lookup. -+ -+In aufs, rmdir(2) and rename(2) for dir uses whiteout alternatively. -+In order to make several functions in a single systemcall to be -+revertible, aufs adopts an approach to rename a directory to a temporary -+unique whiteouted name. -+For example, in rename(2) dir where the target dir already existed, aufs -+renames the target dir to a temporary unique whiteouted name before the -+actual rename on a branch, and then handles other actions (make it opaque, -+update the attributes, etc). If an error happens in these actions, aufs -+simply renames the whiteouted name back and returns an error. If all are -+succeeded, aufs registers a function to remove the whiteouted unique -+temporary name completely and asynchronously to the system global -+workqueue. -+ -+ -+Copy-up -+---------------------------------------------------------------------- -+It is a well-known feature or concept. -+When user modifies a file on a readonly branch, aufs operate "copy-up" -+internally and makes change to the new file on the upper writable branch. -+When the trigger systemcall does not update the timestamps of the parent -+dir, aufs reverts it after copy-up. -+ -+ -+Move-down (aufs3.9 and later) -+---------------------------------------------------------------------- -+"Copy-up" is one of the essential feature in aufs. It copies a file from -+the lower readonly branch to the upper writable branch when a user -+changes something about the file. -+"Move-down" is an opposite action of copy-up. Basically this action is -+ran manually instead of automatically and internally. -+For desgin and implementation, aufs has to consider these issues. -+- whiteout for the file may exist on the lower branch. -+- ancestor directories may not exist on the lower branch. -+- diropq for the ancestor directories may exist on the upper branch. -+- free space on the lower branch will reduce. -+- another access to the file may happen during moving-down, including -+ UDBA (see "Revalidate Dentry and UDBA"). -+- the file should not be hard-linked nor pseudo-linked. they should be -+ handled by auplink utility later. -+ -+Sometimes users want to move-down a file from the upper writable branch -+to the lower readonly or writable branch. For instance, -+- the free space of the upper writable branch is going to run out. -+- create a new intermediate branch between the upper and lower branch. -+- etc. -+ -+For this purpose, use "aumvdown" command in aufs-util.git. -diff -Naur null/Documentation/filesystems/aufs/design/03atomic_open.txt linux-5.15.36/Documentation/filesystems/aufs/design/03atomic_open.txt ---- /dev/null -+++ linux-5.15.36/Documentation/filesystems/aufs/design/03atomic_open.txt 2022-05-10 16:51:39.863744220 +0300 -@@ -0,0 +1,85 @@ -+ -+# Copyright (C) 2015-2021 Junjiro R. Okajima -+# -+# This program is free software; you can redistribute it and/or modify -+# it under the terms of the GNU General Public License as published by -+# the Free Software Foundation; either version 2 of the License, or -+# (at your option) any later version. -+# -+# This program is distributed in the hope that it will be useful, -+# but WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program. If not, see . -+ -+Support for a branch who has its ->atomic_open() -+---------------------------------------------------------------------- -+The filesystems who implement its ->atomic_open() are not majority. For -+example NFSv4 does, and aufs should call NFSv4 ->atomic_open, -+particularly for open(O_CREAT|O_EXCL, 0400) case. Other than -+->atomic_open(), NFSv4 returns an error for this open(2). While I am not -+sure whether all filesystems who have ->atomic_open() behave like this, -+but NFSv4 surely returns the error. -+ -+In order to support ->atomic_open() for aufs, there are a few -+approaches. -+ -+A. Introduce aufs_atomic_open() -+ - calls one of VFS:do_last(), lookup_open() or atomic_open() for -+ branch fs. -+B. Introduce aufs_atomic_open() calling create, open and chmod. this is -+ an aufs user Pip Cet's approach -+ - calls aufs_create(), VFS finish_open() and notify_change(). -+ - pass fake-mode to finish_open(), and then correct the mode by -+ notify_change(). -+C. Extend aufs_open() to call branch fs's ->atomic_open() -+ - no aufs_atomic_open(). -+ - aufs_lookup() registers the TID to an aufs internal object. -+ - aufs_create() does nothing when the matching TID is registered, but -+ registers the mode. -+ - aufs_open() calls branch fs's ->atomic_open() when the matching -+ TID is registered. -+D. Extend aufs_open() to re-try branch fs's ->open() with superuser's -+ credential -+ - no aufs_atomic_open(). -+ - aufs_create() registers the TID to an internal object. this info -+ represents "this process created this file just now." -+ - when aufs gets EACCES from branch fs's ->open(), then confirm the -+ registered TID and re-try open() with superuser's credential. -+ -+Pros and cons for each approach. -+ -+A. -+ - straightforward but highly depends upon VFS internal. -+ - the atomic behavaiour is kept. -+ - some of parameters such as nameidata are hard to reproduce for -+ branch fs. -+ - large overhead. -+B. -+ - easy to implement. -+ - the atomic behavaiour is lost. -+C. -+ - the atomic behavaiour is kept. -+ - dirty and tricky. -+ - VFS checks whether the file is created correctly after calling -+ ->create(), which means this approach doesn't work. -+D. -+ - easy to implement. -+ - the atomic behavaiour is lost. -+ - to open a file with superuser's credential and give it to a user -+ process is a bad idea, since the file object keeps the credential -+ in it. It may affect LSM or something. This approach doesn't work -+ either. -+ -+The approach A is ideal, but it hard to implement. So here is a -+variation of A, which is to be implemented. -+ -+A-1. Introduce aufs_atomic_open() -+ - calls branch fs ->atomic_open() if exists. otherwise calls -+ vfs_create() and finish_open(). -+ - the demerit is that the several checks after branch fs -+ ->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-5.15.36/Documentation/filesystems/aufs/design/03lookup.txt ---- /dev/null -+++ linux-5.15.36/Documentation/filesystems/aufs/design/03lookup.txt 2022-05-10 16:51:39.864744220 +0300 -@@ -0,0 +1,113 @@ -+ -+# Copyright (C) 2005-2021 Junjiro R. Okajima -+# -+# This program is free software; you can redistribute it and/or modify -+# it under the terms of the GNU General Public License as published by -+# the Free Software Foundation; either version 2 of the License, or -+# (at your option) any later version. -+# -+# This program is distributed in the hope that it will be useful, -+# but WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program. If not, see . -+ -+Lookup in a Branch -+---------------------------------------------------------------------- -+Since aufs has a character of sub-VFS (see Introduction), it operates -+lookup for branches as VFS does. It may be a heavy work. But almost all -+lookup operation in aufs is the simplest case, ie. lookup only an entry -+directly connected to its parent. Digging down the directory hierarchy -+is unnecessary. VFS has a function lookup_one_len() for that use, and -+aufs calls it. -+ -+When a branch is a remote filesystem, aufs basically relies upon its -+->d_revalidate(), also aufs forces the hardest revalidate tests for -+them. -+For d_revalidate, aufs implements three levels of revalidate tests. See -+"Revalidate Dentry and UDBA" in detail. -+ -+ -+Test Only the Highest One for the Directory Permission (dirperm1 option) -+---------------------------------------------------------------------- -+Let's try case study. -+- aufs has two branches, upper readwrite and lower readonly. -+ /au = /rw + /ro -+- "dirA" exists under /ro, but /rw. and its mode is 0700. -+- user invoked "chmod a+rx /au/dirA" -+- the internal copy-up is activated and "/rw/dirA" is created and its -+ permission bits are set to world readable. -+- then "/au/dirA" becomes world readable? -+ -+In this case, /ro/dirA is still 0700 since it exists in readonly branch, -+or it may be a natively readonly filesystem. If aufs respects the lower -+branch, it should not respond readdir request from other users. But user -+allowed it by chmod. Should really aufs rejects showing the entries -+under /ro/dirA? -+ -+To be honest, I don't have a good solution for this case. So aufs -+implements 'dirperm1' and 'nodirperm1' mount options, and leave it to -+users. -+When dirperm1 is specified, aufs checks only the highest one for the -+directory permission, and shows the entries. Otherwise, as usual, checks -+every dir existing on all branches and rejects the request. -+ -+As a side effect, dirperm1 option improves the performance of aufs -+because the number of permission check is reduced when the number of -+branch is many. -+ -+ -+Revalidate Dentry and UDBA (User's Direct Branch Access) -+---------------------------------------------------------------------- -+Generally VFS helpers re-validate a dentry as a part of lookup. -+0. digging down the directory hierarchy. -+1. lock the parent dir by its i_mutex. -+2. lookup the final (child) entry. -+3. revalidate it. -+4. call the actual operation (create, unlink, etc.) -+5. unlock the parent dir -+ -+If the filesystem implements its ->d_revalidate() (step 3), then it is -+called. Actually aufs implements it and checks the dentry on a branch is -+still valid. -+But it is not enough. Because aufs has to release the lock for the -+parent dir on a branch at the end of ->lookup() (step 2) and -+->d_revalidate() (step 3) while the i_mutex of the aufs dir is still -+held by VFS. -+If the file on a branch is changed directly, eg. bypassing aufs, after -+aufs released the lock, then the subsequent operation may cause -+something unpleasant result. -+ -+This situation is a result of VFS architecture, ->lookup() and -+->d_revalidate() is separated. But I never say it is wrong. It is a good -+design from VFS's point of view. It is just not suitable for sub-VFS -+character in aufs. -+ -+Aufs supports such case by three level of revalidation which is -+selectable by user. -+1. Simple Revalidate -+ Addition to the native flow in VFS's, confirm the child-parent -+ relationship on the branch just after locking the parent dir on the -+ branch in the "actual operation" (step 4). When this validation -+ fails, aufs returns EBUSY. ->d_revalidate() (step 3) in aufs still -+ checks the validation of the dentry on branches. -+2. Monitor Changes Internally by Inotify/Fsnotify -+ Addition to above, in the "actual operation" (step 4) aufs re-lookup -+ the dentry on the branch, and returns EBUSY if it finds different -+ dentry. -+ Additionally, aufs sets the inotify/fsnotify watch for every dir on branches -+ during it is in cache. When the event is notified, aufs registers a -+ function to kernel 'events' thread by schedule_work(). And the -+ function sets some special status to the cached aufs dentry and inode -+ private data. If they are not cached, then aufs has nothing to -+ do. When the same file is accessed through aufs (step 0-3) later, -+ aufs will detect the status and refresh all necessary data. -+ In this mode, aufs has to ignore the event which is fired by aufs -+ itself. -+3. No Extra Validation -+ This is the simplest test and doesn't add any additional revalidation -+ 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-5.15.36/Documentation/filesystems/aufs/design/04branch.txt ---- /dev/null -+++ linux-5.15.36/Documentation/filesystems/aufs/design/04branch.txt 2022-05-10 16:51:39.864744220 +0300 -@@ -0,0 +1,74 @@ -+ -+# Copyright (C) 2005-2021 Junjiro R. Okajima -+# -+# This program is free software; you can redistribute it and/or modify -+# it under the terms of the GNU General Public License as published by -+# the Free Software Foundation; either version 2 of the License, or -+# (at your option) any later version. -+# -+# This program is distributed in the hope that it will be useful, -+# but WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program. If not, see . -+ -+Branch Manipulation -+ -+Since aufs supports dynamic branch manipulation, ie. add/remove a branch -+and changing its permission/attribute, there are a lot of works to do. -+ -+ -+Add a Branch -+---------------------------------------------------------------------- -+o Confirm the adding dir exists outside of aufs, including loopback -+ mount, and its various attributes. -+o Initialize the xino file and whiteout bases if necessary. -+ See struct.txt. -+ -+o Check the owner/group/mode of the directory -+ When the owner/group/mode of the adding directory differs from the -+ existing branch, aufs issues a warning because it may impose a -+ security risk. -+ For example, when a upper writable branch has a world writable empty -+ top directory, a malicious user can create any files on the writable -+ branch directly, like copy-up and modify manually. If something like -+ /etc/{passwd,shadow} exists on the lower readonly branch but the upper -+ writable branch, and the writable branch is world-writable, then a -+ malicious guy may create /etc/passwd on the writable branch directly -+ and the infected file will be valid in aufs. -+ I am afraid it can be a security issue, but aufs can do nothing except -+ producing a warning. -+ -+ -+Delete a Branch -+---------------------------------------------------------------------- -+o Confirm the deleting branch is not busy -+ To be general, there is one merit to adopt "remount" interface to -+ manipulate branches. It is to discard caches. At deleting a branch, -+ aufs checks the still cached (and connected) dentries and inodes. If -+ there are any, then they are all in-use. An inode without its -+ corresponding dentry can be alive alone (for example, inotify/fsnotify case). -+ -+ For the cached one, aufs checks whether the same named entry exists on -+ other branches. -+ If the cached one is a directory, because aufs provides a merged view -+ to users, as long as one dir is left on any branch aufs can show the -+ dir to users. In this case, the branch can be removed from aufs. -+ Otherwise aufs rejects deleting the branch. -+ -+ If any file on the deleting branch is opened by aufs, then aufs -+ rejects deleting. -+ -+ -+Modify the Permission of a Branch -+---------------------------------------------------------------------- -+o Re-initialize or remove the xino file and whiteout bases if necessary. -+ See struct.txt. -+ -+o rw --> ro: Confirm the modifying branch is not busy -+ Aufs rejects the request if any of these conditions are true. -+ - 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-5.15.36/Documentation/filesystems/aufs/design/05wbr_policy.txt ---- /dev/null -+++ linux-5.15.36/Documentation/filesystems/aufs/design/05wbr_policy.txt 2022-05-10 16:51:39.864744220 +0300 -@@ -0,0 +1,64 @@ -+ -+# Copyright (C) 2005-2021 Junjiro R. Okajima -+# -+# This program is free software; you can redistribute it and/or modify -+# it under the terms of the GNU General Public License as published by -+# the Free Software Foundation; either version 2 of the License, or -+# (at your option) any later version. -+# -+# This program is distributed in the hope that it will be useful, -+# but WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program. If not, see . -+ -+Policies to Select One among Multiple Writable Branches -+---------------------------------------------------------------------- -+When the number of writable branch is more than one, aufs has to decide -+the target branch for file creation or copy-up. By default, the highest -+writable branch which has the parent (or ancestor) dir of the target -+file is chosen (top-down-parent policy). -+By user's request, aufs implements some other policies to select the -+writable branch, for file creation several policies, round-robin, -+most-free-space, and other policies. For copy-up, top-down-parent, -+bottom-up-parent, bottom-up and others. -+ -+As expected, the round-robin policy selects the branch in circular. When -+you have two writable branches and creates 10 new files, 5 files will be -+created for each branch. mkdir(2) systemcall is an exception. When you -+create 10 new directories, all will be created on the same branch. -+And the most-free-space policy selects the one which has most free -+space among the writable branches. The amount of free space will be -+checked by aufs internally, and users can specify its time interval. -+ -+The policies for copy-up is more simple, -+top-down-parent is equivalent to the same named on in create policy, -+bottom-up-parent selects the writable branch where the parent dir -+exists and the nearest upper one from the copyup-source, -+bottom-up selects the nearest upper writable branch from the -+copyup-source, regardless the existence of the parent dir. -+ -+There are some rules or exceptions to apply these policies. -+- If there is a readonly branch above the policy-selected branch and -+ the parent dir is marked as opaque (a variation of whiteout), or the -+ target (creating) file is whiteout-ed on the upper readonly branch, -+ then the result of the policy is ignored and the target file will be -+ created on the nearest upper writable branch than the readonly branch. -+- If there is a writable branch above the policy-selected branch and -+ the parent dir is marked as opaque or the target file is whiteouted -+ on the branch, then the result of the policy is ignored and the target -+ file will be created on the highest one among the upper writable -+ branches who has diropq or whiteout. In case of whiteout, aufs removes -+ it as usual. -+- link(2) and rename(2) systemcalls are exceptions in every policy. -+ They try selecting the branch where the source exists as possible -+ since copyup a large file will take long time. If it can't be, -+ ie. the branch where the source exists is readonly, then they will -+ follow the copyup policy. -+- There is an exception for rename(2) when the target exists. -+ If the rename target exists, aufs compares the index of the branches -+ 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-5.15.36/Documentation/filesystems/aufs/design/06dirren.dot ---- /dev/null -+++ linux-5.15.36/Documentation/filesystems/aufs/design/06dirren.dot 2022-05-10 16:51:39.864744220 +0300 -@@ -0,0 +1,31 @@ -+ -+// to view this graph, run dot(1) command in GRAPHVIZ. -+ -+digraph G { -+node [shape=box]; -+whinfo [label="detailed info file\n(lower_brid_root-hinum, h_inum, namelen, old name)"]; -+ -+node [shape=oval]; -+ -+aufs_rename -> whinfo [label="store/remove"]; -+ -+node [shape=oval]; -+inode_list [label="h_inum list in branch\ncache"]; -+ -+node [shape=box]; -+whinode [label="h_inum list file"]; -+ -+node [shape=oval]; -+brmgmt [label="br_add/del/mod/umount"]; -+ -+brmgmt -> inode_list [label="create/remove"]; -+brmgmt -> whinode [label="load/store"]; -+ -+inode_list -> whinode [style=dashed,dir=both]; -+ -+aufs_rename -> inode_list [label="add/del"]; -+ -+aufs_lookup -> inode_list [label="search"]; -+ -+aufs_lookup -> whinfo [label="load/remove"]; -+} -diff -Naur null/Documentation/filesystems/aufs/design/06dirren.txt linux-5.15.36/Documentation/filesystems/aufs/design/06dirren.txt ---- /dev/null -+++ linux-5.15.36/Documentation/filesystems/aufs/design/06dirren.txt 2022-05-10 16:51:39.864744220 +0300 -@@ -0,0 +1,102 @@ -+ -+# Copyright (C) 2017-2021 Junjiro R. Okajima -+# -+# This program is free software; you can redistribute it and/or modify -+# it under the terms of the GNU General Public License as published by -+# the Free Software Foundation; either version 2 of the License, or -+# (at your option) any later version. -+# -+# This program is distributed in the hope that it will be useful, -+# but WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program. If not, see . -+ -+Special handling for renaming a directory (DIRREN) -+---------------------------------------------------------------------- -+First, let's assume we have a simple usecase. -+ -+- /u = /rw + /ro -+- /rw/dirA exists -+- /ro/dirA and /ro/dirA/file exist too -+- there is no dirB on both branches -+- a user issues rename("dirA", "dirB") -+ -+Now, what should aufs behave against this rename(2)? -+There are a few possible cases. -+ -+A. returns EROFS. -+ since dirA exists on a readonly branch which cannot be renamed. -+B. returns EXDEV. -+ it is possible to copy-up dirA (only the dir itself), but the child -+ entries ("file" in this case) should not be. it must be a bad -+ approach to copy-up recursively. -+C. returns a success. -+ even the branch /ro is readonly, aufs tries renaming it. Obviously it -+ is a violation of aufs' policy. -+D. construct an extra information which indicates that /ro/dirA should -+ be handled as the name of dirB. -+ overlayfs has a similar feature called REDIRECT. -+ -+Until now, aufs implements the case B only which returns EXDEV, and -+expects the userspace application behaves like mv(1) which tries -+issueing rename(2) recursively. -+ -+A new aufs feature called DIRREN is introduced which implements the case -+D. There are several "extra information" added. -+ -+1. detailed info per renamed directory -+ path: /rw/dirB/$AUFS_WH_DR_INFO_PFX. -+2. the inode-number list of directories on a branch -+ path: /rw/dirB/$AUFS_WH_DR_BRHINO -+ -+The filename of "detailed info per directory" represents the lower -+branch, and its format is -+- a type of the branch id -+ one of these. -+ + uuid (not implemented yet) -+ + fsid -+ + dev -+- the inode-number of the branch root dir -+ -+And it contains these info in a single regular file. -+- magic number -+- branch's inode-number of the logically renamed dir -+- the name of the before-renamed dir -+ -+The "detailed info per directory" file is created in aufs rename(2), and -+loaded in any lookup. -+The info is considered in lookup for the matching case only. Here -+"matching" means that the root of branch (in the info filename) is same -+to the current looking-up branch. After looking-up the before-renamed -+name, the inode-number is compared. And the matched dentry is used. -+ -+The "inode-number list of directories" is a regular file which contains -+simply the inode-numbers on the branch. The file is created or updated -+in removing the branch, and loaded in adding the branch. Its lifetime is -+equal to the branch. -+The list is refered in lookup, and when the current target inode is -+found in the list, the aufs tries loading the "detailed info per -+directory" and get the changed and valid name of the dir. -+ -+Theoretically these "extra informaiton" may be able to be put into XATTR -+in the dir inode. But aufs doesn't choose this way because -+1. XATTR may not be supported by the branch (or its configuration) -+2. XATTR may have its size limit. -+3. XATTR may be less easy to convert than a regular file, when the -+ format of the info is changed in the future. -+At the same time, I agree that the regular file approach is much slower -+than XATTR approach. So, in the future, aufs may take the XATTR or other -+better approach. -+ -+This DIRREN feature is enabled by aufs configuration, and is activated -+by a new mount option. -+ -+For the more complicated case, there is a work with UDBA option, which -+is to dected the direct access to the branches (by-passing aufs) and to -+maintain the cashes in aufs. Since a single cached aufs dentry may -+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-5.15.36/Documentation/filesystems/aufs/design/06fhsm.txt ---- /dev/null -+++ linux-5.15.36/Documentation/filesystems/aufs/design/06fhsm.txt 2022-05-10 16:51:39.864744220 +0300 -@@ -0,0 +1,120 @@ -+ -+# Copyright (C) 2011-2021 Junjiro R. Okajima -+# -+# This program is free software; you can redistribute it and/or modify -+# it under the terms of the GNU General Public License as published by -+# the Free Software Foundation; either version 2 of the License, or -+# (at your option) any later version. -+# -+# This program is distributed in the hope that it will be useful, -+# but WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program; if not, write to the Free Software -+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ -+ -+File-based Hierarchical Storage Management (FHSM) -+---------------------------------------------------------------------- -+Hierarchical Storage Management (or HSM) is a well-known feature in the -+storage world. Aufs provides this feature as file-based with multiple -+writable branches, based upon the principle of "Colder, the Lower". -+Here the word "colder" means that the less used files, and "lower" means -+that the position in the order of the stacked branches vertically. -+These multiple writable branches are prioritized, ie. the topmost one -+should be the fastest drive and be used heavily. -+ -+o Characters in aufs FHSM story -+- aufs itself and a new branch attribute. -+- a new ioctl interface to move-down and to establish a connection with -+ the daemon ("move-down" is a converse of "copy-up"). -+- userspace tool and daemon. -+ -+The userspace daemon establishes a connection with aufs and waits for -+the notification. The notified information is very similar to struct -+statfs containing the number of consumed blocks and inodes. -+When the consumed blocks/inodes of a branch exceeds the user-specified -+upper watermark, the daemon activates its move-down process until the -+consumed blocks/inodes reaches the user-specified lower watermark. -+ -+The actual move-down is done by aufs based upon the request from -+user-space since we need to maintain the inode number and the internal -+pointer arrays in aufs. -+ -+Currently aufs FHSM handles the regular files only. Additionally they -+must not be hard-linked nor pseudo-linked. -+ -+ -+o Cowork of aufs and the user-space daemon -+ During the userspace daemon established the connection, aufs sends a -+ small notification to it whenever aufs writes something into the -+ writable branch. But it may cost high since aufs issues statfs(2) -+ internally. So user can specify a new option to cache the -+ info. Actually the notification is controlled by these factors. -+ + the specified cache time. -+ + classified as "force" by aufs internally. -+ Until the specified time expires, aufs doesn't send the info -+ except the forced cases. When aufs decide forcing, the info is always -+ notified to userspace. -+ For example, the number of free inodes is generally large enough and -+ the shortage of it happens rarely. So aufs doesn't force the -+ notification when creating a new file, directory and others. This is -+ the typical case which aufs doesn't force. -+ When aufs writes the actual filedata and the files consumes any of new -+ blocks, the aufs forces notifying. -+ -+ -+o Interfaces in aufs -+- New branch attribute. -+ + fhsm -+ Specifies that the branch is managed by FHSM feature. In other word, -+ participant in the FHSM. -+ When nofhsm is set to the branch, it will not be the source/target -+ branch of the move-down operation. This attribute is set -+ independently from coo and moo attributes, and if you want full -+ FHSM, you should specify them as well. -+- New mount option. -+ + fhsm_sec -+ Specifies a second to suppress many less important info to be -+ notified. -+- New ioctl. -+ + AUFS_CTL_FHSM_FD -+ create a new file descriptor which userspace can read the notification -+ (a subset of struct statfs) from aufs. -+- Module parameter 'brs' -+ It has to be set to 1. Otherwise the new mount option 'fhsm' will not -+ be set. -+- mount helpers /sbin/mount.aufs and /sbin/umount.aufs -+ When there are two or more branches with fhsm attributes, -+ /sbin/mount.aufs invokes the user-space daemon and /sbin/umount.aufs -+ terminates it. As a result of remounting and branch-manipulation, the -+ number of branches with fhsm attribute can be one. In this case, -+ /sbin/mount.aufs will terminate the user-space daemon. -+ -+ -+Finally the operation is done as these steps in kernel-space. -+- make sure that, -+ + no one else is using the file. -+ + the file is not hard-linked. -+ + the file is not pseudo-linked. -+ + the file is a regular file. -+ + the parent dir is not opaqued. -+- find the target writable branch. -+- make sure the file is not whiteout-ed by the upper (than the target) -+ branch. -+- make the parent dir on the target branch. -+- mutex lock the inode on the branch. -+- unlink the whiteout on the target branch (if exists). -+- lookup and create the whiteout-ed temporary name on the target branch. -+- copy the file as the whiteout-ed temporary name on the target branch. -+- rename the whiteout-ed temporary name to the original name. -+- unlink the file on the source branch. -+- maintain the internal pointer array and the external inode number -+ table (XINO). -+- maintain the timestamps and other attributes of the parent dir and the -+ file. -+ -+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-5.15.36/Documentation/filesystems/aufs/design/06mmap.txt ---- /dev/null -+++ linux-5.15.36/Documentation/filesystems/aufs/design/06mmap.txt 2022-05-10 16:51:39.864744220 +0300 -@@ -0,0 +1,72 @@ -+ -+# Copyright (C) 2005-2021 Junjiro R. Okajima -+# -+# This program is free software; you can redistribute it and/or modify -+# it under the terms of the GNU General Public License as published by -+# the Free Software Foundation; either version 2 of the License, or -+# (at your option) any later version. -+# -+# This program is distributed in the hope that it will be useful, -+# but WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program. If not, see . -+ -+mmap(2) -- File Memory Mapping -+---------------------------------------------------------------------- -+In aufs, the file-mapped pages are handled by a branch fs directly, no -+interaction with aufs. It means aufs_mmap() calls the branch fs's -+->mmap(). -+This approach is simple and good, but there is one problem. -+Under /proc, several entries show the mmapped files by its path (with -+device and inode number), and the printed path will be the path on the -+branch fs's instead of virtual aufs's. -+This is not a problem in most cases, but some utilities lsof(1) (and its -+user) may expect the path on aufs. -+ -+To address this issue, aufs adds a new member called vm_prfile in struct -+vm_area_struct (and struct vm_region). The original vm_file points to -+the file on the branch fs in order to handle everything correctly as -+usual. The new vm_prfile points to a virtual file in aufs, and the -+show-functions in procfs refers to vm_prfile if it is set. -+Also we need to maintain several other places where touching vm_file -+such like -+- fork()/clone() copies vma and the reference count of vm_file is -+ incremented. -+- merging vma maintains the ref count too. -+ -+This is not a good approach. It just fakes the printed path. But it -+leaves all behaviour around f_mapping unchanged. This is surely an -+advantage. -+Actually aufs had adopted another complicated approach which calls -+generic_file_mmap() and handles struct vm_operations_struct. In this -+approach, aufs met a hard problem and I could not solve it without -+switching the approach. -+ -+There may be one more another approach which is -+- bind-mount the branch-root onto the aufs-root internally -+- grab the new vfsmount (ie. struct mount) -+- lazy-umount the branch-root internally -+- in open(2) the aufs-file, open the branch-file with the hidden -+ vfsmount (instead of the original branch's vfsmount) -+- ideally this "bind-mount and lazy-umount" should be done atomically, -+ but it may be possible from userspace by the mount helper. -+ -+Adding the internal hidden vfsmount and using it in opening a file, the -+file path under /proc will be printed correctly. This approach looks -+smarter, but is not possible I am afraid. -+- aufs-root may be bind-mount later. when it happens, another hidden -+ vfsmount will be required. -+- it is hard to get the chance to bind-mount and lazy-umount -+ + in kernel-space, FS can have vfsmount in open(2) via -+ file->f_path, and aufs can know its vfsmount. But several locks are -+ already acquired, and if aufs tries to bind-mount and lazy-umount -+ here, then it may cause a deadlock. -+ + in user-space, bind-mount doesn't invoke the mount helper. -+- since /proc shows dev and ino, aufs has to give vma these info. it -+ means a new member vm_prinode will be necessary. this is essentially -+ equivalent to vm_prfile described above. -+ -+I have to give up this "looks-smater" approach. -diff -Naur null/Documentation/filesystems/aufs/design/06xattr.txt linux-5.15.36/Documentation/filesystems/aufs/design/06xattr.txt ---- /dev/null -+++ linux-5.15.36/Documentation/filesystems/aufs/design/06xattr.txt 2022-05-10 16:51:39.864744220 +0300 -@@ -0,0 +1,96 @@ -+ -+# Copyright (C) 2014-2021 Junjiro R. Okajima -+# -+# This program is free software; you can redistribute it and/or modify -+# it under the terms of the GNU General Public License as published by -+# the Free Software Foundation; either version 2 of the License, or -+# (at your option) any later version. -+# -+# This program is distributed in the hope that it will be useful, -+# but WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program; if not, write to the Free Software -+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ -+ -+Listing XATTR/EA and getting the value -+---------------------------------------------------------------------- -+For the inode standard attributes (owner, group, timestamps, etc.), aufs -+shows the values from the topmost existing file. This behaviour is good -+for the non-dir entries since the bahaviour exactly matches the shown -+information. But for the directories, aufs considers all the same named -+entries on the lower branches. Which means, if one of the lower entry -+rejects readdir call, then aufs returns an error even if the topmost -+entry allows it. This behaviour is necessary to respect the branch fs's -+security, but can make users confused since the user-visible standard -+attributes don't match the behaviour. -+To address this issue, aufs has a mount option called dirperm1 which -+checks the permission for the topmost entry only, and ignores the lower -+entry's permission. -+ -+A similar issue can happen around XATTR. -+getxattr(2) and listxattr(2) families behave as if dirperm1 option is -+always set. Otherwise these very unpleasant situation would happen. -+- listxattr(2) may return the duplicated entries. -+- users may not be able to remove or reset the XATTR forever, -+ -+ -+XATTR/EA support in the internal (copy,move)-(up,down) -+---------------------------------------------------------------------- -+Generally the extended attributes of inode are categorized as these. -+- "security" for LSM and capability. -+- "system" for posix ACL, 'acl' mount option is required for the branch -+ fs generally. -+- "trusted" for userspace, CAP_SYS_ADMIN is required. -+- "user" for userspace, 'user_xattr' mount option is required for the -+ branch fs generally. -+ -+Moreover there are some other categories. Aufs handles these rather -+unpopular categories as the ordinary ones, ie. there is no special -+condition nor exception. -+ -+In copy-up, the support for XATTR on the dst branch may differ from the -+src branch. In this case, the copy-up operation will get an error and -+the original user operation which triggered the copy-up will fail. It -+can happen that even all copy-up will fail. -+When both of src and dst branches support XATTR and if an error occurs -+during copying XATTR, then the copy-up should fail obviously. That is a -+good reason and aufs should return an error to userspace. But when only -+the src branch support that XATTR, aufs should not return an error. -+For example, the src branch supports ACL but the dst branch doesn't -+because the dst branch may natively un-support it or temporary -+un-support it due to "noacl" mount option. Of course, the dst branch fs -+may NOT return an error even if the XATTR is not supported. It is -+totally up to the branch fs. -+ -+Anyway when the aufs internal copy-up gets an error from the dst branch -+fs, then aufs tries removing the just copied entry and returns the error -+to the userspace. The worst case of this situation will be all copy-up -+will fail. -+ -+For the copy-up operation, there two basic approaches. -+- copy the specified XATTR only (by category above), and return the -+ error unconditionally if it happens. -+- copy all XATTR, and ignore the error on the specified category only. -+ -+In order to support XATTR and to implement the correct behaviour, aufs -+chooses the latter approach and introduces some new branch attributes, -+"icexsec", "icexsys", "icextr", "icexusr", and "icexoth". -+They correspond to the XATTR namespaces (see above). Additionally, to be -+convenient, "icex" is also provided which means all "icex*" attributes -+are set (here the word "icex" stands for "ignore copy-error on XATTR"). -+ -+The meaning of these attributes is to ignore the error from setting -+XATTR on that branch. -+Note that aufs tries copying all XATTR unconditionally, and ignores the -+error from the dst branch according to the specified attributes. -+ -+Some XATTR may have its default value. The default value may come from -+the parent dir or the environment. If the default value is set at the -+file creating-time, it will be overwritten by copy-up. -+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-5.15.36/Documentation/filesystems/aufs/design/07export.txt ---- /dev/null -+++ linux-5.15.36/Documentation/filesystems/aufs/design/07export.txt 2022-05-10 16:51:39.864744220 +0300 -@@ -0,0 +1,58 @@ -+ -+# Copyright (C) 2005-2021 Junjiro R. Okajima -+# -+# This program is free software; you can redistribute it and/or modify -+# it under the terms of the GNU General Public License as published by -+# the Free Software Foundation; either version 2 of the License, or -+# (at your option) any later version. -+# -+# This program is distributed in the hope that it will be useful, -+# but WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program. If not, see . -+ -+Export Aufs via NFS -+---------------------------------------------------------------------- -+Here is an approach. -+- like xino/xib, add a new file 'xigen' which stores aufs inode -+ generation. -+- iget_locked(): initialize aufs inode generation for a new inode, and -+ store it in xigen file. -+- destroy_inode(): increment aufs inode generation and store it in xigen -+ file. it is necessary even if it is not unlinked, because any data of -+ inode may be changed by UDBA. -+- encode_fh(): for a root dir, simply return FILEID_ROOT. otherwise -+ build file handle by -+ + branch id (4 bytes) -+ + superblock generation (4 bytes) -+ + inode number (4 or 8 bytes) -+ + parent dir inode number (4 or 8 bytes) -+ + inode generation (4 bytes)) -+ + return value of exportfs_encode_fh() for the parent on a branch (4 -+ bytes) -+ + file handle for a branch (by exportfs_encode_fh()) -+- fh_to_dentry(): -+ + find the index of a branch from its id in handle, and check it is -+ still exist in aufs. -+ + 1st level: get the inode number from handle and search it in cache. -+ + 2nd level: if not found in cache, get the parent inode number from -+ the handle and search it in cache. and then open the found parent -+ dir, find the matching inode number by vfs_readdir() and get its -+ name, and call lookup_one_len() for the target dentry. -+ + 3rd level: if the parent dir is not cached, call -+ exportfs_decode_fh() for a branch and get the parent on a branch, -+ build a pathname of it, convert it a pathname in aufs, call -+ path_lookup(). now aufs gets a parent dir dentry, then handle it as -+ the 2nd level. -+ + to open the dir, aufs needs struct vfsmount. aufs keeps vfsmount -+ for every branch, but not itself. to get this, (currently) aufs -+ searches in current->nsproxy->mnt_ns list. it may not be a good -+ idea, but I didn't get other approach. -+ + test the generation of the gotten inode. -+- every inode operation: they may get EBUSY due to UDBA. in this case, -+ 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-5.15.36/Documentation/filesystems/aufs/design/08shwh.txt ---- /dev/null -+++ linux-5.15.36/Documentation/filesystems/aufs/design/08shwh.txt 2022-05-10 16:51:39.864744220 +0300 -@@ -0,0 +1,52 @@ -+ -+# Copyright (C) 2005-2021 Junjiro R. Okajima -+# -+# This program is free software; you can redistribute it and/or modify -+# it under the terms of the GNU General Public License as published by -+# the Free Software Foundation; either version 2 of the License, or -+# (at your option) any later version. -+# -+# This program is distributed in the hope that it will be useful, -+# but WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program. If not, see . -+ -+Show Whiteout Mode (shwh) -+---------------------------------------------------------------------- -+Generally aufs hides the name of whiteouts. But in some cases, to show -+them is very useful for users. For instance, creating a new middle layer -+(branch) by merging existing layers. -+ -+(borrowing aufs1 HOW-TO from a user, Michael Towers) -+When you have three branches, -+- Bottom: 'system', squashfs (underlying base system), read-only -+- Middle: 'mods', squashfs, read-only -+- Top: 'overlay', ram (tmpfs), read-write -+ -+The top layer is loaded at boot time and saved at shutdown, to preserve -+the changes made to the system during the session. -+When larger changes have been made, or smaller changes have accumulated, -+the size of the saved top layer data grows. At this point, it would be -+nice to be able to merge the two overlay branches ('mods' and 'overlay') -+and rewrite the 'mods' squashfs, clearing the top layer and thus -+restoring save and load speed. -+ -+This merging is simplified by the use of another aufs mount, of just the -+two overlay branches using the 'shwh' option. -+# mount -t aufs -o ro,shwh,br:/livesys/overlay=ro+wh:/livesys/mods=rr+wh \ -+ aufs /livesys/merge_union -+ -+A merged view of these two branches is then available at -+/livesys/merge_union, and the new feature is that the whiteouts are -+visible! -+Note that in 'shwh' mode the aufs mount must be 'ro', which will disable -+writing to all branches. Also the default mode for all branches is 'ro'. -+It is now possible to save the combined contents of the two overlay -+branches to a new squashfs, e.g.: -+# mksquashfs /livesys/merge_union /path/to/newmods.squash -+ -+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-5.15.36/Documentation/filesystems/aufs/design/10dynop.txt ---- /dev/null -+++ linux-5.15.36/Documentation/filesystems/aufs/design/10dynop.txt 2022-05-10 16:51:39.864744220 +0300 -@@ -0,0 +1,47 @@ -+ -+# Copyright (C) 2010-2021 Junjiro R. Okajima -+# -+# This program is free software; you can redistribute it and/or modify -+# it under the terms of the GNU General Public License as published by -+# the Free Software Foundation; either version 2 of the License, or -+# (at your option) any later version. -+# -+# This program is distributed in the hope that it will be useful, -+# but WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program. If not, see . -+ -+Dynamically customizable FS operations -+---------------------------------------------------------------------- -+Generally FS operations (struct inode_operations, struct -+address_space_operations, struct file_operations, etc.) are defined as -+"static const", but it never means that FS have only one set of -+operation. Some FS have multiple sets of them. For instance, ext2 has -+three sets, one for XIP, for NOBH, and for normal. -+Since aufs overrides and redirects these operations, sometimes aufs has -+to change its behaviour according to the branch FS type. More importantly -+VFS acts differently if a function (member in the struct) is set or -+not. It means aufs should have several sets of operations and select one -+among them according to the branch FS definition. -+ -+In order to solve this problem and not to affect the behaviour of VFS, -+aufs defines these operations dynamically. For instance, aufs defines -+dummy direct_IO function for struct address_space_operations, but it may -+not be set to the address_space_operations actually. When the branch FS -+doesn't have it, aufs doesn't set it to its address_space_operations -+while the function definition itself is still alive. So the behaviour -+itself will not change, and it will return an error when direct_IO is -+not set. -+ -+The lifetime of these dynamically generated operation object is -+maintained by aufs branch object. When the branch is removed from aufs, -+the reference counter of the object is decremented. When it reaches -+zero, the dynamically generated operation object will be freed. -+ -+This approach is designed to support AIO (io_submit), Direct I/O and -+XIP (DAX) mainly. -+Currently this approach is applied to address_space_operations for -+regular files only. -diff -Naur null/Documentation/filesystems/aufs/README linux-5.15.36/Documentation/filesystems/aufs/README ---- /dev/null -+++ linux-5.15.36/Documentation/filesystems/aufs/README 2022-05-10 16:51:39.863744220 +0300 -@@ -0,0 +1,396 @@ -+ -+Aufs5 -- advanced multi layered unification filesystem version 5.x -+http://aufs.sf.net -+Junjiro R. Okajima -+ -+ -+0. Introduction -+---------------------------------------- -+In the early days, aufs was entirely re-designed and re-implemented -+Unionfs Version 1.x series. Adding many original ideas, approaches, -+improvements and implementations, it became totally different from -+Unionfs while keeping the basic features. -+Later, Unionfs Version 2.x series began taking some of the same -+approaches to aufs1's. -+Unionfs was being developed by Professor Erez Zadok at Stony Brook -+University and his team. -+ -+Aufs5 supports linux-v5.0 and later, If you want older kernel version -+support, -+- for linux-v4.x series, try aufs4-linux.git or aufs4-standalone.git -+- for linux-v3.x series, try aufs3-linux.git or aufs3-standalone.git -+- for linux-v2.6.16 and later, try aufs2-2.6.git, aufs2-standalone.git -+ or aufs1 from CVS on SourceForge. -+ -+Note: it becomes clear that "Aufs was rejected. Let's give it up." -+ According to Christoph Hellwig, linux rejects all union-type -+ filesystems but UnionMount. -+ -+ -+PS. Al Viro seems have a plan to merge aufs as well as overlayfs and -+ UnionMount, and he pointed out an issue around a directory mutex -+ lock and aufs addressed it. But it is still unsure whether aufs will -+ be merged (or any other union solution). -+ -+ -+ -+1. Features -+---------------------------------------- -+- unite several directories into a single virtual filesystem. The member -+ directory is called as a branch. -+- you can specify the permission flags to the branch, which are 'readonly', -+ 'readwrite' and 'whiteout-able.' -+- by upper writable branch, internal copyup and whiteout, files/dirs on -+ readonly branch are modifiable logically. -+- dynamic branch manipulation, add, del. -+- etc... -+ -+Also there are many enhancements in aufs, such as: -+- test only the highest one for the directory permission (dirperm1) -+- copyup on open (coo=) -+- 'move' policy for copy-up between two writable branches, after -+ checking free space. -+- xattr, acl -+- readdir(3) in userspace. -+- keep inode number by external inode number table -+- keep the timestamps of file/dir in internal copyup operation -+- seekable directory, supporting NFS readdir. -+- whiteout is hardlinked in order to reduce the consumption of inodes -+ on branch -+- do not copyup, nor create a whiteout when it is unnecessary -+- revert a single systemcall when an error occurs in aufs -+- remount interface instead of ioctl -+- maintain /etc/mtab by an external command, /sbin/mount.aufs. -+- loopback mounted filesystem as a branch -+- kernel thread for removing the dir who has a plenty of whiteouts -+- support copyup sparse file (a file which has a 'hole' in it) -+- default permission flags for branches -+- selectable permission flags for ro branch, whether whiteout can -+ exist or not -+- export via NFS. -+- support /fs/aufs and /aufs. -+- support multiple writable branches, some policies to select one -+ among multiple writable branches. -+- a new semantics for link(2) and rename(2) to support multiple -+ writable branches. -+- no glibc changes are required. -+- pseudo hardlink (hardlink over branches) -+- allow a direct access manually to a file on branch, e.g. bypassing aufs. -+ including NFS or remote filesystem branch. -+- userspace wrapper for pathconf(3)/fpathconf(3) with _PC_LINK_MAX. -+- and more... -+ -+Currently these features are dropped temporary from aufs5. -+See design/08plan.txt in detail. -+- nested mount, i.e. aufs as readonly no-whiteout branch of another aufs -+ (robr) -+- statistics of aufs thread (/sys/fs/aufs/stat) -+ -+Features or just an idea in the future (see also design/*.txt), -+- reorder the branch index without del/re-add. -+- permanent xino files for NFSD -+- an option for refreshing the opened files after add/del branches -+- light version, without branch manipulation. (unnecessary?) -+- copyup in userspace -+- inotify in userspace -+- readv/writev -+ -+ -+2. Download -+---------------------------------------- -+There are three GIT trees for aufs5, aufs5-linux.git, -+aufs5-standalone.git, and aufs-util.git. Note that there is no "5" in -+"aufs-util.git." -+While the aufs-util is always necessary, you need either of aufs5-linux -+or aufs5-standalone. -+ -+The aufs5-linux tree includes the whole linux mainline GIT tree, -+git://git.kernel.org/.../torvalds/linux.git. -+And you cannot select CONFIG_AUFS_FS=m for this version, eg. you cannot -+build aufs5 as an external kernel module. -+Several extra patches are not included in this tree. Only -+aufs5-standalone tree contains them. They are described in the later -+section "Configuration and Compilation." -+ -+On the other hand, the aufs5-standalone tree has only aufs source files -+and necessary patches, and you can select CONFIG_AUFS_FS=m. -+But you need to apply all aufs patches manually. -+ -+You will find GIT branches whose name is in form of "aufs5.x" where "x" -+represents the linux kernel version, "linux-5.x". For instance, -+"aufs5.0" is for linux-5.0. For latest "linux-5.x-rcN", use -+"aufs5.x-rcN" branch. -+ -+o aufs5-linux tree -+$ git clone --reference /your/linux/git/tree \ -+ git://github.com/sfjro/aufs5-linux.git aufs5-linux.git -+- if you don't have linux GIT tree, then remove "--reference ..." -+$ cd aufs5-linux.git -+$ git checkout origin/aufs5.0 -+ -+Or You may want to directly git-pull aufs into your linux GIT tree, and -+leave the patch-work to GIT. -+$ cd /your/linux/git/tree -+$ git remote add aufs5 git://github.com/sfjro/aufs5-linux.git -+$ git fetch aufs5 -+$ git checkout -b my5.0 v5.0 -+$ (add your local change...) -+$ git pull aufs5 aufs5.0 -+- now you have v5.0 + your_changes + aufs5.0 in you my5.0 branch. -+- you may need to solve some conflicts between your_changes and -+ aufs5.0. in this case, git-rerere is recommended so that you can -+ solve the similar conflicts automatically when you upgrade to 5.1 or -+ later in the future. -+ -+o aufs5-standalone tree -+$ git clone git://github.com/sfjro/aufs5-standalone.git aufs5-standalone.git -+$ cd aufs5-standalone.git -+$ git checkout origin/aufs5.0 -+ -+o aufs-util tree -+$ git clone git://git.code.sf.net/p/aufs/aufs-util aufs-util.git -+- note that the public aufs-util.git is on SourceForge instead of -+ GitHUB. -+$ cd aufs-util.git -+$ git checkout origin/aufs5.0 -+ -+Note: The 5.x-rcN branch is to be used with `rc' kernel versions ONLY. -+The minor version number, 'x' in '5.x', of aufs may not always -+follow the minor version number of the kernel. -+Because changes in the kernel that cause the use of a new -+minor version number do not always require changes to aufs-util. -+ -+Since aufs-util has its own minor version number, you may not be -+able to find a GIT branch in aufs-util for your kernel's -+exact minor version number. -+In this case, you should git-checkout the branch for the -+nearest lower number. -+ -+For (an unreleased) example: -+If you are using "linux-5.10" and the "aufs5.10" branch -+does not exist in aufs-util repository, then "aufs5.9", "aufs5.8" -+or something numerically smaller is the branch for your kernel. -+ -+Also you can view all branches by -+ $ git branch -a -+ -+ -+3. Configuration and Compilation -+---------------------------------------- -+Make sure you have git-checkout'ed the correct branch. -+ -+For aufs5-linux tree, -+- enable CONFIG_AUFS_FS. -+- set other aufs configurations if necessary. -+- for aufs5.13 and later -+ Because aufs is not only an ordinary filesystem (callee of VFS), but -+ also a caller of VFS functions for branch filesystems, subclassing of -+ the internal locks for LOCKDEP is necessary. LOCKDEP is a debugging -+ feature of linux kernel. If you enable CONFIG_LOCKDEP, then you will -+ need to customize some LOCKDEP numbers. Here are what I use on my -+ test environment. -+ CONFIG_LOCKDEP_BITS=21 -+ CONFIG_LOCKDEP_CHAINS_BITS=21 -+ CONFIG_LOCKDEP_STACK_TRACE_BITS=24 -+ -+For aufs5-standalone tree, -+There are several ways to build. -+ -+1. -+- apply ./aufs5-kbuild.patch to your kernel source files. -+- apply ./aufs5-base.patch too. -+- apply ./aufs5-mmap.patch too. -+- apply ./aufs5-standalone.patch too, if you have a plan to set -+ CONFIG_AUFS_FS=m. otherwise you don't need ./aufs5-standalone.patch. -+- copy ./{Documentation,fs,include/uapi/linux/aufs_type.h} files to your -+ kernel source tree. Never copy $PWD/include/uapi/linux/Kbuild. -+- enable CONFIG_AUFS_FS, you can select either -+ =m or =y. -+- and build your kernel as usual. -+- install the built kernel. -+- install the header files too by "make headers_install" to the -+ directory where you specify. By default, it is $PWD/usr. -+ "make help" shows a brief note for headers_install. -+- and reboot your system. -+ -+2. -+- module only (CONFIG_AUFS_FS=m). -+- apply ./aufs5-base.patch to your kernel source files. -+- apply ./aufs5-mmap.patch too. -+- apply ./aufs5-standalone.patch too. -+- build your kernel, don't forget "make headers_install", and reboot. -+- edit ./config.mk and set other aufs configurations if necessary. -+ Note: You should read $PWD/fs/aufs/Kconfig carefully which describes -+ every aufs configurations. -+- build the module by simple "make". -+- you can specify ${KDIR} make variable which points to your kernel -+ source tree. -+- install the files -+ + run "make install" to install the aufs module, or copy the built -+ $PWD/aufs.ko to /lib/modules/... and run depmod -a (or reboot simply). -+ + run "make install_headers" (instead of headers_install) to install -+ the modified aufs header file (you can specify DESTDIR which is -+ available in aufs standalone version's Makefile only), or copy -+ $PWD/usr/include/linux/aufs_type.h to /usr/include/linux or wherever -+ you like manually. By default, the target directory is $PWD/usr. -+- no need to apply aufs5-kbuild.patch, nor copying source files to your -+ kernel source tree. -+ -+Note: The header file aufs_type.h is necessary to build aufs-util -+ as well as "make headers_install" in the kernel source tree. -+ headers_install is subject to be forgotten, but it is essentially -+ necessary, not only for building aufs-util. -+ You may not meet problems without headers_install in some older -+ version though. -+ -+And then, -+- read README in aufs-util, build and install it -+- note that your distribution may contain an obsoleted version of -+ aufs_type.h in /usr/include/linux or something. When you build aufs -+ utilities, make sure that your compiler refers the correct aufs header -+ file which is built by "make headers_install." -+- if you want to use readdir(3) in userspace or pathconf(3) wrapper, -+ then run "make install_ulib" too. And refer to the aufs manual in -+ detail. -+ -+There several other patches in aufs5-standalone.git. They are all -+optional. When you meet some problems, they will help you. -+- aufs5-loopback.patch -+ Supports a nested loopback mount in a branch-fs. This patch is -+ unnecessary until aufs produces a message like "you may want to try -+ another patch for loopback file". -+- vfs-ino.patch -+ Modifies a system global kernel internal function get_next_ino() in -+ order to stop assigning 0 for an inode-number. Not directly related to -+ aufs, but recommended generally. -+- tmpfs-idr.patch -+ Keeps the tmpfs inode number as the lowest value. Effective to reduce -+ the size of aufs XINO files for tmpfs branch. Also it prevents the -+ duplication of inode number, which is important for backup tools and -+ other utilities. When you find aufs XINO files for tmpfs branch -+ growing too much, try this patch. -+ -+ -+4. Usage -+---------------------------------------- -+At first, make sure aufs-util are installed, and please read the aufs -+manual, aufs.5 in aufs-util.git tree. -+$ man -l aufs.5 -+ -+And then, -+$ mkdir /tmp/rw /tmp/aufs -+# mount -t aufs -o br=/tmp/rw:${HOME} none /tmp/aufs -+ -+Here is another example. The result is equivalent. -+# mount -t aufs -o br=/tmp/rw=rw:${HOME}=ro none /tmp/aufs -+ Or -+# mount -t aufs -o br:/tmp/rw none /tmp/aufs -+# mount -o remount,append:${HOME} /tmp/aufs -+ -+Then, you can see whole tree of your home dir through /tmp/aufs. If -+you modify a file under /tmp/aufs, the one on your home directory is -+not affected, instead the same named file will be newly created under -+/tmp/rw. And all of your modification to a file will be applied to -+the one under /tmp/rw. This is called the file based Copy on Write -+(COW) method. -+Aufs mount options are described in aufs.5. -+If you run chroot or something and make your aufs as a root directory, -+then you need to customize the shutdown script. See the aufs manual in -+detail. -+ -+Additionally, there are some sample usages of aufs which are a -+diskless system with network booting, and LiveCD over NFS. -+See sample dir in CVS tree on SourceForge. -+ -+ -+5. Contact -+---------------------------------------- -+When you have any problems or strange behaviour in aufs, please let me -+know with: -+- /proc/mounts (instead of the output of mount(8)) -+- /sys/module/aufs/* -+- /sys/fs/aufs/* (if you have them) -+- /debug/aufs/* (if you have them) -+- linux kernel version -+ if your kernel is not plain, for example modified by distributor, -+ the url where i can download its source is necessary too. -+- aufs version which was printed at loading the module or booting the -+ system, instead of the date you downloaded. -+- configuration (define/undefine CONFIG_AUFS_xxx) -+- kernel configuration or /proc/config.gz (if you have it) -+- LSM (linux security module, if you are using) -+- behaviour which you think to be incorrect -+- actual operation, reproducible one is better -+- mailto: aufs-users at lists.sourceforge.net -+ -+Usually, I don't watch the Public Areas(Bugs, Support Requests, Patches, -+and Feature Requests) on SourceForge. Please join and write to -+aufs-users ML. -+ -+ -+6. Acknowledgements -+---------------------------------------- -+Thanks to everyone who have tried and are using aufs, whoever -+have reported a bug or any feedback. -+ -+Especially donators: -+Tomas Matejicek(slax.org) made a donation (much more than once). -+ Since Apr 2010, Tomas M (the author of Slax and Linux Live -+ scripts) is making "doubling" donations. -+ Unfortunately I cannot list all of the donators, but I really -+ appreciate. -+ It ends Aug 2010, but the ordinary donation URL is still available. -+ -+Dai Itasaka made a donation (2007/8). -+Chuck Smith made a donation (2008/4, 10 and 12). -+Henk Schoneveld made a donation (2008/9). -+Chih-Wei Huang, ASUS, CTC donated Eee PC 4G (2008/10). -+Francois Dupoux made a donation (2008/11). -+Bruno Cesar Ribas and Luis Carlos Erpen de Bona, C3SL serves public -+ aufs2 GIT tree (2009/2). -+William Grant made a donation (2009/3). -+Patrick Lane made a donation (2009/4). -+The Mail Archive (mail-archive.com) made donations (2009/5). -+Nippy Networks (Ed Wildgoose) made a donation (2009/7). -+New Dream Network, LLC (www.dreamhost.com) made a donation (2009/11). -+Pavel Pronskiy made a donation (2011/2). -+Iridium and Inmarsat satellite phone retailer (www.mailasail.com), Nippy -+ Networks (Ed Wildgoose) made a donation for hardware (2011/3). -+Max Lekomcev (DOM-TV project) made a donation (2011/7, 12, 2012/3, 6 and -+11). -+Sam Liddicott made a donation (2011/9). -+Era Scarecrow made a donation (2013/4). -+Bor Ratajc made a donation (2013/4). -+Alessandro Gorreta made a donation (2013/4). -+POIRETTE Marc made a donation (2013/4). -+Alessandro Gorreta made a donation (2013/4). -+lauri kasvandik made a donation (2013/5). -+"pemasu from Finland" made a donation (2013/7). -+The Parted Magic Project made a donation (2013/9 and 11). -+Pavel Barta made a donation (2013/10). -+Nikolay Pertsev made a donation (2014/5). -+James B made a donation (2014/7, 2015/7, and 2021/12). -+Stefano Di Biase made a donation (2014/8). -+Daniel Epellei made a donation (2015/1). -+OmegaPhil made a donation (2016/1, 2018/4). -+Tomasz Szewczyk made a donation (2016/4). -+James Burry made a donation (2016/12). -+Carsten Rose made a donation (2018/9). -+Porteus Kiosk made a donation (2018/10). -+ -+Thank you very much. -+Donations are always, including future donations, very important and -+helpful for me to keep on developing aufs. -+ -+ -+7. -+---------------------------------------- -+If you are an experienced user, no explanation is needed. Aufs is -+just a linux filesystem. -+ -+ -+Enjoy! -+ -+# Local variables: ; -+# mode: text; -+# End: ; -diff -Naur null/fs/aufs/aufs.h linux-5.15.36/fs/aufs/aufs.h ---- /dev/null -+++ linux-5.15.36/fs/aufs/aufs.h 2022-05-10 16:51:39.866744220 +0300 -@@ -0,0 +1,62 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program. If not, see . -+ */ -+ -+/* -+ * all header files -+ */ -+ -+#ifndef __AUFS_H__ -+#define __AUFS_H__ -+ -+#ifdef __KERNEL__ -+ -+#define AuStub(type, name, body, ...) \ -+ static inline type name(__VA_ARGS__) { body; } -+ -+#define AuStubVoid(name, ...) \ -+ AuStub(void, name, , __VA_ARGS__) -+#define AuStubInt0(name, ...) \ -+ AuStub(int, name, return 0, __VA_ARGS__) -+ -+#include "debug.h" -+ -+#include "branch.h" -+#include "cpup.h" -+#include "dcsub.h" -+#include "dbgaufs.h" -+#include "dentry.h" -+#include "dir.h" -+#include "dirren.h" -+#include "dynop.h" -+#include "file.h" -+#include "fstype.h" -+#include "hbl.h" -+#include "inode.h" -+#include "lcnt.h" -+#include "loop.h" -+#include "module.h" -+#include "opts.h" -+#include "rwsem.h" -+#include "super.h" -+#include "sysaufs.h" -+#include "vfsub.h" -+#include "whout.h" -+#include "wkq.h" -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_H__ */ -diff -Naur null/fs/aufs/branch.c linux-5.15.36/fs/aufs/branch.c ---- /dev/null -+++ linux-5.15.36/fs/aufs/branch.c 2022-05-10 16:51:39.866744220 +0300 -@@ -0,0 +1,1427 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program. If not, see . -+ */ -+ -+/* -+ * branch management -+ */ -+ -+#include -+#include -+#include "aufs.h" -+ -+/* -+ * free a single branch -+ */ -+static void au_br_do_free(struct au_branch *br) -+{ -+ int i; -+ struct au_wbr *wbr; -+ struct au_dykey **key; -+ -+ au_hnotify_fin_br(br); -+ /* always, regardless the mount option */ -+ au_dr_hino_free(&br->br_dirren); -+ au_xino_put(br); -+ -+ AuLCntZero(au_lcnt_read(&br->br_nfiles, /*do_rev*/0)); -+ au_lcnt_fin(&br->br_nfiles, /*do_sync*/0); -+ AuLCntZero(au_lcnt_read(&br->br_count, /*do_rev*/0)); -+ au_lcnt_fin(&br->br_count, /*do_sync*/0); -+ -+ wbr = br->br_wbr; -+ if (wbr) { -+ for (i = 0; i < AuBrWh_Last; i++) -+ dput(wbr->wbr_wh[i]); -+ AuDebugOn(atomic_read(&wbr->wbr_wh_running)); -+ AuRwDestroy(&wbr->wbr_wh_rwsem); -+ } -+ -+ if (br->br_fhsm) { -+ au_br_fhsm_fin(br->br_fhsm); -+ au_kfree_try_rcu(br->br_fhsm); -+ } -+ -+ key = br->br_dykey; -+ for (i = 0; i < AuBrDynOp; i++, key++) -+ if (*key) -+ au_dy_put(*key); -+ else -+ break; -+ -+ /* recursive lock, s_umount of branch's */ -+ /* synchronize_rcu(); */ /* why? */ -+ lockdep_off(); -+ path_put(&br->br_path); -+ lockdep_on(); -+ au_kfree_rcu(wbr); -+ au_lcnt_wait_for_fin(&br->br_nfiles); -+ au_lcnt_wait_for_fin(&br->br_count); -+ /* I don't know why, but percpu_refcount requires this */ -+ /* synchronize_rcu(); */ -+ au_kfree_rcu(br); -+} -+ -+/* -+ * frees all branches -+ */ -+void au_br_free(struct au_sbinfo *sbinfo) -+{ -+ aufs_bindex_t bmax; -+ struct au_branch **br; -+ -+ AuRwMustWriteLock(&sbinfo->si_rwsem); -+ -+ bmax = sbinfo->si_bbot + 1; -+ br = sbinfo->si_branch; -+ while (bmax--) -+ au_br_do_free(*br++); -+} -+ -+/* -+ * find the index of a branch which is specified by @br_id. -+ */ -+int au_br_index(struct super_block *sb, aufs_bindex_t br_id) -+{ -+ aufs_bindex_t bindex, bbot; -+ -+ bbot = au_sbbot(sb); -+ for (bindex = 0; bindex <= bbot; bindex++) -+ if (au_sbr_id(sb, bindex) == br_id) -+ return bindex; -+ return -1; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * add a branch -+ */ -+ -+static int test_overlap(struct super_block *sb, struct dentry *h_adding, -+ struct dentry *h_root) -+{ -+ if (unlikely(h_adding == h_root -+ || au_test_loopback_overlap(sb, h_adding))) -+ return 1; -+ if (h_adding->d_sb != h_root->d_sb) -+ return 0; -+ return au_test_subdir(h_adding, h_root) -+ || au_test_subdir(h_root, h_adding); -+} -+ -+/* -+ * returns a newly allocated branch. @new_nbranch is a number of branches -+ * after adding a branch. -+ */ -+static struct au_branch *au_br_alloc(struct super_block *sb, int new_nbranch, -+ int perm) -+{ -+ struct au_branch *add_branch; -+ struct dentry *root; -+ struct inode *inode; -+ int err; -+ -+ err = -ENOMEM; -+ add_branch = kzalloc(sizeof(*add_branch), GFP_NOFS); -+ if (unlikely(!add_branch)) -+ goto out; -+ add_branch->br_xino = au_xino_alloc(/*nfile*/1); -+ if (unlikely(!add_branch->br_xino)) -+ goto out_br; -+ err = au_hnotify_init_br(add_branch, perm); -+ if (unlikely(err)) -+ goto out_xino; -+ -+ if (au_br_writable(perm)) { -+ /* may be freed separately at changing the branch permission */ -+ add_branch->br_wbr = kzalloc(sizeof(*add_branch->br_wbr), -+ GFP_NOFS); -+ if (unlikely(!add_branch->br_wbr)) -+ goto out_hnotify; -+ } -+ -+ if (au_br_fhsm(perm)) { -+ err = au_fhsm_br_alloc(add_branch); -+ if (unlikely(err)) -+ goto out_wbr; -+ } -+ -+ root = sb->s_root; -+ err = au_sbr_realloc(au_sbi(sb), new_nbranch, /*may_shrink*/0); -+ if (!err) -+ err = au_di_realloc(au_di(root), new_nbranch, /*may_shrink*/0); -+ if (!err) { -+ inode = d_inode(root); -+ err = au_hinode_realloc(au_ii(inode), new_nbranch, -+ /*may_shrink*/0); -+ } -+ if (!err) -+ return add_branch; /* success */ -+ -+out_wbr: -+ au_kfree_rcu(add_branch->br_wbr); -+out_hnotify: -+ au_hnotify_fin_br(add_branch); -+out_xino: -+ au_xino_put(add_branch); -+out_br: -+ au_kfree_rcu(add_branch); -+out: -+ return ERR_PTR(err); -+} -+ -+/* -+ * test if the branch permission is legal or not. -+ */ -+static int test_br(struct inode *inode, int brperm, char *path) -+{ -+ int err; -+ -+ err = (au_br_writable(brperm) && IS_RDONLY(inode)); -+ if (!err) -+ goto out; -+ -+ err = -EINVAL; -+ pr_err("write permission for readonly mount or inode, %s\n", path); -+ -+out: -+ return err; -+} -+ -+/* -+ * returns: -+ * 0: success, the caller will add it -+ * plus: success, it is already unified, the caller should ignore it -+ * minus: error -+ */ -+static int test_add(struct super_block *sb, struct au_opt_add *add, int remount) -+{ -+ int err; -+ aufs_bindex_t bbot, bindex; -+ struct dentry *root, *h_dentry; -+ struct inode *inode, *h_inode; -+ -+ root = sb->s_root; -+ bbot = au_sbbot(sb); -+ if (unlikely(bbot >= 0 -+ && au_find_dbindex(root, add->path.dentry) >= 0)) { -+ err = 1; -+ if (!remount) { -+ err = -EINVAL; -+ pr_err("%s duplicated\n", add->pathname); -+ } -+ goto out; -+ } -+ -+ err = -ENOSPC; /* -E2BIG; */ -+ if (unlikely(AUFS_BRANCH_MAX <= add->bindex -+ || AUFS_BRANCH_MAX - 1 <= bbot)) { -+ pr_err("number of branches exceeded %s\n", add->pathname); -+ goto out; -+ } -+ -+ err = -EDOM; -+ if (unlikely(add->bindex < 0 || bbot + 1 < add->bindex)) { -+ pr_err("bad index %d\n", add->bindex); -+ goto out; -+ } -+ -+ inode = d_inode(add->path.dentry); -+ err = -ENOENT; -+ if (unlikely(!inode->i_nlink)) { -+ pr_err("no existence %s\n", add->pathname); -+ goto out; -+ } -+ -+ err = -EINVAL; -+ if (unlikely(inode->i_sb == sb)) { -+ pr_err("%s must be outside\n", add->pathname); -+ goto out; -+ } -+ -+ if (unlikely(au_test_fs_unsuppoted(inode->i_sb))) { -+ pr_err("unsupported filesystem, %s (%s)\n", -+ add->pathname, au_sbtype(inode->i_sb)); -+ goto out; -+ } -+ -+ if (unlikely(inode->i_sb->s_stack_depth)) { -+ pr_err("already stacked, %s (%s)\n", -+ add->pathname, au_sbtype(inode->i_sb)); -+ goto out; -+ } -+ -+ err = test_br(d_inode(add->path.dentry), add->perm, add->pathname); -+ if (unlikely(err)) -+ goto out; -+ -+ if (bbot < 0) -+ return 0; /* success */ -+ -+ err = -EINVAL; -+ for (bindex = 0; bindex <= bbot; bindex++) -+ if (unlikely(test_overlap(sb, add->path.dentry, -+ au_h_dptr(root, bindex)))) { -+ pr_err("%s is overlapped\n", add->pathname); -+ goto out; -+ } -+ -+ err = 0; -+ if (au_opt_test(au_mntflags(sb), WARN_PERM)) { -+ h_dentry = au_h_dptr(root, 0); -+ h_inode = d_inode(h_dentry); -+ if ((h_inode->i_mode & S_IALLUGO) != (inode->i_mode & S_IALLUGO) -+ || !uid_eq(h_inode->i_uid, inode->i_uid) -+ || !gid_eq(h_inode->i_gid, inode->i_gid)) -+ pr_warn("uid/gid/perm %s %u/%u/0%o, %u/%u/0%o\n", -+ add->pathname, -+ i_uid_read(inode), i_gid_read(inode), -+ (inode->i_mode & S_IALLUGO), -+ i_uid_read(h_inode), i_gid_read(h_inode), -+ (h_inode->i_mode & S_IALLUGO)); -+ } -+ -+out: -+ return err; -+} -+ -+/* -+ * initialize or clean the whiteouts for an adding branch -+ */ -+static int au_br_init_wh(struct super_block *sb, struct au_branch *br, -+ int new_perm) -+{ -+ int err, old_perm; -+ aufs_bindex_t bindex; -+ struct inode *h_inode; -+ struct au_wbr *wbr; -+ struct au_hinode *hdir; -+ struct dentry *h_dentry; -+ -+ err = vfsub_mnt_want_write(au_br_mnt(br)); -+ if (unlikely(err)) -+ goto out; -+ -+ wbr = br->br_wbr; -+ old_perm = br->br_perm; -+ br->br_perm = new_perm; -+ hdir = NULL; -+ h_inode = NULL; -+ bindex = au_br_index(sb, br->br_id); -+ if (0 <= bindex) { -+ hdir = au_hi(d_inode(sb->s_root), bindex); -+ au_hn_inode_lock_nested(hdir, AuLsc_I_PARENT); -+ } else { -+ h_dentry = au_br_dentry(br); -+ h_inode = d_inode(h_dentry); -+ inode_lock_nested(h_inode, AuLsc_I_PARENT); -+ } -+ if (!wbr) -+ err = au_wh_init(br, sb); -+ else { -+ wbr_wh_write_lock(wbr); -+ err = au_wh_init(br, sb); -+ wbr_wh_write_unlock(wbr); -+ } -+ if (hdir) -+ au_hn_inode_unlock(hdir); -+ else -+ inode_unlock(h_inode); -+ vfsub_mnt_drop_write(au_br_mnt(br)); -+ br->br_perm = old_perm; -+ -+ if (!err && wbr && !au_br_writable(new_perm)) { -+ au_kfree_rcu(wbr); -+ br->br_wbr = NULL; -+ } -+ -+out: -+ return err; -+} -+ -+static int au_wbr_init(struct au_branch *br, struct super_block *sb, -+ int perm) -+{ -+ int err; -+ struct kstatfs kst; -+ struct au_wbr *wbr; -+ -+ wbr = br->br_wbr; -+ au_rw_init(&wbr->wbr_wh_rwsem); -+ atomic_set(&wbr->wbr_wh_running, 0); -+ -+ /* -+ * a limit for rmdir/rename a dir -+ * cf. AUFS_MAX_NAMELEN in include/uapi/linux/aufs_type.h -+ */ -+ err = vfs_statfs(&br->br_path, &kst); -+ if (unlikely(err)) -+ goto out; -+ err = -EINVAL; -+ if (kst.f_namelen >= NAME_MAX) -+ err = au_br_init_wh(sb, br, perm); -+ else -+ pr_err("%pd(%s), unsupported namelen %ld\n", -+ au_br_dentry(br), -+ au_sbtype(au_br_dentry(br)->d_sb), kst.f_namelen); -+ -+out: -+ return err; -+} -+ -+/* initialize a new branch */ -+static int au_br_init(struct au_branch *br, struct super_block *sb, -+ struct au_opt_add *add) -+{ -+ int err; -+ struct au_branch *brbase; -+ struct file *xf; -+ struct inode *h_inode; -+ -+ err = 0; -+ br->br_perm = add->perm; -+ br->br_path = add->path; /* set first, path_get() later */ -+ spin_lock_init(&br->br_dykey_lock); -+ au_lcnt_init(&br->br_nfiles, /*release*/NULL); -+ au_lcnt_init(&br->br_count, /*release*/NULL); -+ br->br_id = au_new_br_id(sb); -+ AuDebugOn(br->br_id < 0); -+ -+ /* always, regardless the given option */ -+ err = au_dr_br_init(sb, br, &add->path); -+ if (unlikely(err)) -+ goto out_err; -+ -+ if (au_br_writable(add->perm)) { -+ err = au_wbr_init(br, sb, add->perm); -+ if (unlikely(err)) -+ goto out_err; -+ } -+ -+ if (au_opt_test(au_mntflags(sb), XINO)) { -+ brbase = au_sbr(sb, 0); -+ xf = au_xino_file(brbase->br_xino, /*idx*/-1); -+ AuDebugOn(!xf); -+ h_inode = d_inode(add->path.dentry); -+ err = au_xino_init_br(sb, br, h_inode->i_ino, &xf->f_path); -+ if (unlikely(err)) { -+ AuDebugOn(au_xino_file(br->br_xino, /*idx*/-1)); -+ goto out_err; -+ } -+ } -+ -+ sysaufs_br_init(br); -+ path_get(&br->br_path); -+ goto out; /* success */ -+ -+out_err: -+ memset(&br->br_path, 0, sizeof(br->br_path)); -+out: -+ return err; -+} -+ -+static void au_br_do_add_brp(struct au_sbinfo *sbinfo, aufs_bindex_t bindex, -+ struct au_branch *br, aufs_bindex_t bbot, -+ aufs_bindex_t amount) -+{ -+ struct au_branch **brp; -+ -+ AuRwMustWriteLock(&sbinfo->si_rwsem); -+ -+ brp = sbinfo->si_branch + bindex; -+ memmove(brp + 1, brp, sizeof(*brp) * amount); -+ *brp = br; -+ sbinfo->si_bbot++; -+ if (unlikely(bbot < 0)) -+ sbinfo->si_bbot = 0; -+} -+ -+static void au_br_do_add_hdp(struct au_dinfo *dinfo, aufs_bindex_t bindex, -+ aufs_bindex_t bbot, aufs_bindex_t amount) -+{ -+ struct au_hdentry *hdp; -+ -+ AuRwMustWriteLock(&dinfo->di_rwsem); -+ -+ hdp = au_hdentry(dinfo, bindex); -+ memmove(hdp + 1, hdp, sizeof(*hdp) * amount); -+ au_h_dentry_init(hdp); -+ dinfo->di_bbot++; -+ if (unlikely(bbot < 0)) -+ dinfo->di_btop = 0; -+} -+ -+static void au_br_do_add_hip(struct au_iinfo *iinfo, aufs_bindex_t bindex, -+ aufs_bindex_t bbot, aufs_bindex_t amount) -+{ -+ struct au_hinode *hip; -+ -+ AuRwMustWriteLock(&iinfo->ii_rwsem); -+ -+ hip = au_hinode(iinfo, bindex); -+ memmove(hip + 1, hip, sizeof(*hip) * amount); -+ au_hinode_init(hip); -+ iinfo->ii_bbot++; -+ if (unlikely(bbot < 0)) -+ iinfo->ii_btop = 0; -+} -+ -+static void au_br_do_add(struct super_block *sb, struct au_branch *br, -+ aufs_bindex_t bindex) -+{ -+ struct dentry *root, *h_dentry; -+ struct inode *root_inode, *h_inode; -+ aufs_bindex_t bbot, amount; -+ -+ root = sb->s_root; -+ root_inode = d_inode(root); -+ bbot = au_sbbot(sb); -+ amount = bbot + 1 - bindex; -+ h_dentry = au_br_dentry(br); -+ au_sbilist_lock(); -+ au_br_do_add_brp(au_sbi(sb), bindex, br, bbot, amount); -+ au_br_do_add_hdp(au_di(root), bindex, bbot, amount); -+ au_br_do_add_hip(au_ii(root_inode), bindex, bbot, amount); -+ au_set_h_dptr(root, bindex, dget(h_dentry)); -+ h_inode = d_inode(h_dentry); -+ au_set_h_iptr(root_inode, bindex, au_igrab(h_inode), /*flags*/0); -+ au_sbilist_unlock(); -+} -+ -+int au_br_add(struct super_block *sb, struct au_opt_add *add, int remount) -+{ -+ int err; -+ aufs_bindex_t bbot, add_bindex; -+ struct dentry *root, *h_dentry; -+ struct inode *root_inode; -+ struct au_branch *add_branch; -+ -+ root = sb->s_root; -+ root_inode = d_inode(root); -+ IMustLock(root_inode); -+ IiMustWriteLock(root_inode); -+ err = test_add(sb, add, remount); -+ if (unlikely(err < 0)) -+ goto out; -+ if (err) { -+ err = 0; -+ goto out; /* success */ -+ } -+ -+ bbot = au_sbbot(sb); -+ add_branch = au_br_alloc(sb, bbot + 2, add->perm); -+ err = PTR_ERR(add_branch); -+ if (IS_ERR(add_branch)) -+ goto out; -+ -+ err = au_br_init(add_branch, sb, add); -+ if (unlikely(err)) { -+ au_br_do_free(add_branch); -+ goto out; -+ } -+ -+ add_bindex = add->bindex; -+ sysaufs_brs_del(sb, add_bindex); /* remove successors */ -+ au_br_do_add(sb, add_branch, add_bindex); -+ sysaufs_brs_add(sb, add_bindex); /* append successors */ -+ dbgaufs_brs_add(sb, add_bindex, /*topdown*/0); /* rename successors */ -+ -+ h_dentry = add->path.dentry; -+ if (!add_bindex) { -+ au_cpup_attr_all(root_inode, /*force*/1); -+ sb->s_maxbytes = h_dentry->d_sb->s_maxbytes; -+ } else -+ au_add_nlink(root_inode, d_inode(h_dentry)); -+ -+out: -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static unsigned long long au_farray_cb(struct super_block *sb, void *a, -+ unsigned long long max __maybe_unused, -+ void *arg) -+{ -+ unsigned long long n; -+ struct file **p, *f; -+ struct hlist_bl_head *files; -+ struct hlist_bl_node *pos; -+ struct au_finfo *finfo; -+ -+ n = 0; -+ p = a; -+ files = &au_sbi(sb)->si_files; -+ hlist_bl_lock(files); -+ hlist_bl_for_each_entry(finfo, pos, files, fi_hlist) { -+ f = finfo->fi_file; -+ if (file_count(f) -+ && !special_file(file_inode(f)->i_mode)) { -+ get_file(f); -+ *p++ = f; -+ n++; -+ AuDebugOn(n > max); -+ } -+ } -+ hlist_bl_unlock(files); -+ -+ return n; -+} -+ -+static struct file **au_farray_alloc(struct super_block *sb, -+ unsigned long long *max) -+{ -+ struct au_sbinfo *sbi; -+ -+ sbi = au_sbi(sb); -+ *max = au_lcnt_read(&sbi->si_nfiles, /*do_rev*/1); -+ return au_array_alloc(max, au_farray_cb, sb, /*arg*/NULL); -+} -+ -+static void au_farray_free(struct file **a, unsigned long long max) -+{ -+ unsigned long long ull; -+ -+ for (ull = 0; ull < max; ull++) -+ if (a[ull]) -+ fput(a[ull]); -+ kvfree(a); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * delete a branch -+ */ -+ -+/* to show the line number, do not make it inlined function */ -+#define AuVerbose(do_info, fmt, ...) do { \ -+ if (do_info) \ -+ pr_info(fmt, ##__VA_ARGS__); \ -+} while (0) -+ -+static int au_test_ibusy(struct inode *inode, aufs_bindex_t btop, -+ aufs_bindex_t bbot) -+{ -+ return (inode && !S_ISDIR(inode->i_mode)) || btop == bbot; -+} -+ -+static int au_test_dbusy(struct dentry *dentry, aufs_bindex_t btop, -+ aufs_bindex_t bbot) -+{ -+ return au_test_ibusy(d_inode(dentry), btop, bbot); -+} -+ -+/* -+ * test if the branch is deletable or not. -+ */ -+static int test_dentry_busy(struct dentry *root, aufs_bindex_t bindex, -+ unsigned int sigen, const unsigned int verbose) -+{ -+ int err, i, j, ndentry; -+ aufs_bindex_t btop, bbot; -+ struct au_dcsub_pages dpages; -+ struct au_dpage *dpage; -+ struct dentry *d; -+ -+ err = au_dpages_init(&dpages, GFP_NOFS); -+ if (unlikely(err)) -+ goto out; -+ err = au_dcsub_pages(&dpages, root, NULL, NULL); -+ if (unlikely(err)) -+ goto out_dpages; -+ -+ for (i = 0; !err && i < dpages.ndpage; i++) { -+ dpage = dpages.dpages + i; -+ ndentry = dpage->ndentry; -+ for (j = 0; !err && j < ndentry; j++) { -+ d = dpage->dentries[j]; -+ AuDebugOn(au_dcount(d) <= 0); -+ if (!au_digen_test(d, sigen)) { -+ di_read_lock_child(d, AuLock_IR); -+ if (unlikely(au_dbrange_test(d))) { -+ di_read_unlock(d, AuLock_IR); -+ continue; -+ } -+ } else { -+ di_write_lock_child(d); -+ if (unlikely(au_dbrange_test(d))) { -+ di_write_unlock(d); -+ continue; -+ } -+ err = au_reval_dpath(d, sigen); -+ if (!err) -+ di_downgrade_lock(d, AuLock_IR); -+ else { -+ di_write_unlock(d); -+ break; -+ } -+ } -+ -+ /* AuDbgDentry(d); */ -+ btop = au_dbtop(d); -+ bbot = au_dbbot(d); -+ if (btop <= bindex -+ && bindex <= bbot -+ && au_h_dptr(d, bindex) -+ && au_test_dbusy(d, btop, bbot)) { -+ err = -EBUSY; -+ AuVerbose(verbose, "busy %pd\n", d); -+ AuDbgDentry(d); -+ } -+ di_read_unlock(d, AuLock_IR); -+ } -+ } -+ -+out_dpages: -+ au_dpages_free(&dpages); -+out: -+ return err; -+} -+ -+static int test_inode_busy(struct super_block *sb, aufs_bindex_t bindex, -+ unsigned int sigen, const unsigned int verbose) -+{ -+ int err; -+ unsigned long long max, ull; -+ struct inode *i, **array; -+ aufs_bindex_t btop, bbot; -+ -+ array = au_iarray_alloc(sb, &max); -+ err = PTR_ERR(array); -+ if (IS_ERR(array)) -+ goto out; -+ -+ err = 0; -+ AuDbg("b%d\n", bindex); -+ for (ull = 0; !err && ull < max; ull++) { -+ i = array[ull]; -+ if (unlikely(!i)) -+ break; -+ if (i->i_ino == AUFS_ROOT_INO) -+ continue; -+ -+ /* AuDbgInode(i); */ -+ if (au_iigen(i, NULL) == sigen) -+ ii_read_lock_child(i); -+ else { -+ ii_write_lock_child(i); -+ err = au_refresh_hinode_self(i); -+ au_iigen_dec(i); -+ if (!err) -+ ii_downgrade_lock(i); -+ else { -+ ii_write_unlock(i); -+ break; -+ } -+ } -+ -+ btop = au_ibtop(i); -+ bbot = au_ibbot(i); -+ if (btop <= bindex -+ && bindex <= bbot -+ && au_h_iptr(i, bindex) -+ && au_test_ibusy(i, btop, bbot)) { -+ err = -EBUSY; -+ AuVerbose(verbose, "busy i%lu\n", i->i_ino); -+ AuDbgInode(i); -+ } -+ ii_read_unlock(i); -+ } -+ au_iarray_free(array, max); -+ -+out: -+ return err; -+} -+ -+static int test_children_busy(struct dentry *root, aufs_bindex_t bindex, -+ const unsigned int verbose) -+{ -+ int err; -+ unsigned int sigen; -+ -+ sigen = au_sigen(root->d_sb); -+ DiMustNoWaiters(root); -+ IiMustNoWaiters(d_inode(root)); -+ di_write_unlock(root); -+ err = test_dentry_busy(root, bindex, sigen, verbose); -+ if (!err) -+ err = test_inode_busy(root->d_sb, bindex, sigen, verbose); -+ di_write_lock_child(root); /* aufs_write_lock() calls ..._child() */ -+ -+ return err; -+} -+ -+static int test_dir_busy(struct file *file, aufs_bindex_t br_id, -+ struct file **to_free, int *idx) -+{ -+ int err; -+ unsigned char matched, root; -+ aufs_bindex_t bindex, bbot; -+ struct au_fidir *fidir; -+ struct au_hfile *hfile; -+ -+ err = 0; -+ root = IS_ROOT(file->f_path.dentry); -+ if (root) { -+ get_file(file); -+ to_free[*idx] = file; -+ (*idx)++; -+ goto out; -+ } -+ -+ matched = 0; -+ fidir = au_fi(file)->fi_hdir; -+ AuDebugOn(!fidir); -+ bbot = au_fbbot_dir(file); -+ for (bindex = au_fbtop(file); bindex <= bbot; bindex++) { -+ hfile = fidir->fd_hfile + bindex; -+ if (!hfile->hf_file) -+ continue; -+ -+ if (hfile->hf_br->br_id == br_id) { -+ matched = 1; -+ break; -+ } -+ } -+ if (matched) -+ err = -EBUSY; -+ -+out: -+ return err; -+} -+ -+static int test_file_busy(struct super_block *sb, aufs_bindex_t br_id, -+ struct file **to_free, int opened) -+{ -+ int err, idx; -+ unsigned long long ull, max; -+ aufs_bindex_t btop; -+ struct file *file, **array; -+ struct dentry *root; -+ struct au_hfile *hfile; -+ -+ array = au_farray_alloc(sb, &max); -+ err = PTR_ERR(array); -+ if (IS_ERR(array)) -+ goto out; -+ -+ err = 0; -+ idx = 0; -+ root = sb->s_root; -+ di_write_unlock(root); -+ for (ull = 0; ull < max; ull++) { -+ file = array[ull]; -+ if (unlikely(!file)) -+ break; -+ -+ /* AuDbg("%pD\n", file); */ -+ fi_read_lock(file); -+ btop = au_fbtop(file); -+ if (!d_is_dir(file->f_path.dentry)) { -+ hfile = &au_fi(file)->fi_htop; -+ if (hfile->hf_br->br_id == br_id) -+ err = -EBUSY; -+ } else -+ err = test_dir_busy(file, br_id, to_free, &idx); -+ fi_read_unlock(file); -+ if (unlikely(err)) -+ break; -+ } -+ di_write_lock_child(root); -+ au_farray_free(array, max); -+ AuDebugOn(idx > opened); -+ -+out: -+ return err; -+} -+ -+static void br_del_file(struct file **to_free, unsigned long long opened, -+ aufs_bindex_t br_id) -+{ -+ unsigned long long ull; -+ aufs_bindex_t bindex, btop, bbot, bfound; -+ struct file *file; -+ struct au_fidir *fidir; -+ struct au_hfile *hfile; -+ -+ for (ull = 0; ull < opened; ull++) { -+ file = to_free[ull]; -+ if (unlikely(!file)) -+ break; -+ -+ /* AuDbg("%pD\n", file); */ -+ AuDebugOn(!d_is_dir(file->f_path.dentry)); -+ bfound = -1; -+ fidir = au_fi(file)->fi_hdir; -+ AuDebugOn(!fidir); -+ fi_write_lock(file); -+ btop = au_fbtop(file); -+ bbot = au_fbbot_dir(file); -+ for (bindex = btop; bindex <= bbot; bindex++) { -+ hfile = fidir->fd_hfile + bindex; -+ if (!hfile->hf_file) -+ continue; -+ -+ if (hfile->hf_br->br_id == br_id) { -+ bfound = bindex; -+ break; -+ } -+ } -+ AuDebugOn(bfound < 0); -+ au_set_h_fptr(file, bfound, NULL); -+ if (bfound == btop) { -+ for (btop++; btop <= bbot; btop++) -+ if (au_hf_dir(file, btop)) { -+ au_set_fbtop(file, btop); -+ break; -+ } -+ } -+ fi_write_unlock(file); -+ } -+} -+ -+static void au_br_do_del_brp(struct au_sbinfo *sbinfo, -+ const aufs_bindex_t bindex, -+ const aufs_bindex_t bbot) -+{ -+ struct au_branch **brp, **p; -+ -+ AuRwMustWriteLock(&sbinfo->si_rwsem); -+ -+ brp = sbinfo->si_branch + bindex; -+ if (bindex < bbot) -+ memmove(brp, brp + 1, sizeof(*brp) * (bbot - bindex)); -+ sbinfo->si_branch[0 + bbot] = NULL; -+ sbinfo->si_bbot--; -+ -+ p = au_krealloc(sbinfo->si_branch, sizeof(*p) * bbot, AuGFP_SBILIST, -+ /*may_shrink*/1); -+ if (p) -+ sbinfo->si_branch = p; -+ /* harmless error */ -+} -+ -+static void au_br_do_del_hdp(struct au_dinfo *dinfo, const aufs_bindex_t bindex, -+ const aufs_bindex_t bbot) -+{ -+ struct au_hdentry *hdp, *p; -+ -+ AuRwMustWriteLock(&dinfo->di_rwsem); -+ -+ hdp = au_hdentry(dinfo, bindex); -+ if (bindex < bbot) -+ memmove(hdp, hdp + 1, sizeof(*hdp) * (bbot - bindex)); -+ /* au_h_dentry_init(au_hdentry(dinfo, bbot); */ -+ dinfo->di_bbot--; -+ -+ p = au_krealloc(dinfo->di_hdentry, sizeof(*p) * bbot, AuGFP_SBILIST, -+ /*may_shrink*/1); -+ if (p) -+ dinfo->di_hdentry = p; -+ /* harmless error */ -+} -+ -+static void au_br_do_del_hip(struct au_iinfo *iinfo, const aufs_bindex_t bindex, -+ const aufs_bindex_t bbot) -+{ -+ struct au_hinode *hip, *p; -+ -+ AuRwMustWriteLock(&iinfo->ii_rwsem); -+ -+ hip = au_hinode(iinfo, bindex); -+ if (bindex < bbot) -+ memmove(hip, hip + 1, sizeof(*hip) * (bbot - bindex)); -+ /* au_hinode_init(au_hinode(iinfo, bbot)); */ -+ iinfo->ii_bbot--; -+ -+ p = au_krealloc(iinfo->ii_hinode, sizeof(*p) * bbot, AuGFP_SBILIST, -+ /*may_shrink*/1); -+ if (p) -+ iinfo->ii_hinode = p; -+ /* harmless error */ -+} -+ -+static void au_br_do_del(struct super_block *sb, aufs_bindex_t bindex, -+ struct au_branch *br) -+{ -+ aufs_bindex_t bbot; -+ struct au_sbinfo *sbinfo; -+ struct dentry *root, *h_root; -+ struct inode *inode, *h_inode; -+ struct au_hinode *hinode; -+ -+ SiMustWriteLock(sb); -+ -+ root = sb->s_root; -+ inode = d_inode(root); -+ sbinfo = au_sbi(sb); -+ bbot = sbinfo->si_bbot; -+ -+ h_root = au_h_dptr(root, bindex); -+ hinode = au_hi(inode, bindex); -+ h_inode = au_igrab(hinode->hi_inode); -+ au_hiput(hinode); -+ -+ au_sbilist_lock(); -+ au_br_do_del_brp(sbinfo, bindex, bbot); -+ au_br_do_del_hdp(au_di(root), bindex, bbot); -+ au_br_do_del_hip(au_ii(inode), bindex, bbot); -+ au_sbilist_unlock(); -+ -+ /* ignore an error */ -+ au_dr_br_fin(sb, br); /* always, regardless the mount option */ -+ -+ dput(h_root); -+ iput(h_inode); -+ au_br_do_free(br); -+} -+ -+static unsigned long long empty_cb(struct super_block *sb, void *array, -+ unsigned long long max, void *arg) -+{ -+ return max; -+} -+ -+int au_br_del(struct super_block *sb, struct au_opt_del *del, int remount) -+{ -+ int err, rerr, i; -+ unsigned long long opened; -+ unsigned int mnt_flags; -+ aufs_bindex_t bindex, bbot, br_id; -+ unsigned char do_wh, verbose; -+ struct au_branch *br; -+ struct au_wbr *wbr; -+ struct dentry *root; -+ struct file **to_free; -+ -+ err = 0; -+ opened = 0; -+ to_free = NULL; -+ root = sb->s_root; -+ bindex = au_find_dbindex(root, del->h_path.dentry); -+ if (bindex < 0) { -+ if (remount) -+ goto out; /* success */ -+ err = -ENOENT; -+ pr_err("%s no such branch\n", del->pathname); -+ goto out; -+ } -+ AuDbg("bindex b%d\n", bindex); -+ -+ err = -EBUSY; -+ mnt_flags = au_mntflags(sb); -+ verbose = !!au_opt_test(mnt_flags, VERBOSE); -+ bbot = au_sbbot(sb); -+ if (unlikely(!bbot)) { -+ AuVerbose(verbose, "no more branches left\n"); -+ goto out; -+ } -+ -+ br = au_sbr(sb, bindex); -+ AuDebugOn(!path_equal(&br->br_path, &del->h_path)); -+ if (unlikely(au_lcnt_read(&br->br_count, /*do_rev*/1))) { -+ AuVerbose(verbose, "br %pd2 is busy now\n", del->h_path.dentry); -+ goto out; -+ } -+ -+ br_id = br->br_id; -+ opened = au_lcnt_read(&br->br_nfiles, /*do_rev*/1); -+ if (unlikely(opened)) { -+ to_free = au_array_alloc(&opened, empty_cb, sb, NULL); -+ err = PTR_ERR(to_free); -+ if (IS_ERR(to_free)) -+ goto out; -+ -+ err = test_file_busy(sb, br_id, to_free, opened); -+ if (unlikely(err)) { -+ AuVerbose(verbose, "%llu file(s) opened\n", opened); -+ goto out; -+ } -+ } -+ -+ wbr = br->br_wbr; -+ do_wh = wbr && (wbr->wbr_whbase || wbr->wbr_plink || wbr->wbr_orph); -+ if (do_wh) { -+ /* instead of WbrWhMustWriteLock(wbr) */ -+ SiMustWriteLock(sb); -+ for (i = 0; i < AuBrWh_Last; i++) { -+ dput(wbr->wbr_wh[i]); -+ wbr->wbr_wh[i] = NULL; -+ } -+ } -+ -+ err = test_children_busy(root, bindex, verbose); -+ if (unlikely(err)) { -+ if (do_wh) -+ goto out_wh; -+ goto out; -+ } -+ -+ err = 0; -+ if (to_free) { -+ /* -+ * now we confirmed the branch is deletable. -+ * let's free the remaining opened dirs on the branch. -+ */ -+ di_write_unlock(root); -+ br_del_file(to_free, opened, br_id); -+ di_write_lock_child(root); -+ } -+ -+ sysaufs_brs_del(sb, bindex); /* remove successors */ -+ dbgaufs_xino_del(br); /* remove one */ -+ au_br_do_del(sb, bindex, br); -+ sysaufs_brs_add(sb, bindex); /* append successors */ -+ dbgaufs_brs_add(sb, bindex, /*topdown*/1); /* rename successors */ -+ -+ if (!bindex) { -+ au_cpup_attr_all(d_inode(root), /*force*/1); -+ sb->s_maxbytes = au_sbr_sb(sb, 0)->s_maxbytes; -+ } else -+ au_sub_nlink(d_inode(root), d_inode(del->h_path.dentry)); -+ if (au_opt_test(mnt_flags, PLINK)) -+ au_plink_half_refresh(sb, br_id); -+ -+ goto out; /* success */ -+ -+out_wh: -+ /* revert */ -+ rerr = au_br_init_wh(sb, br, br->br_perm); -+ if (rerr) -+ pr_warn("failed re-creating base whiteout, %s. (%d)\n", -+ del->pathname, rerr); -+out: -+ if (to_free) -+ au_farray_free(to_free, opened); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int au_ibusy(struct super_block *sb, struct aufs_ibusy __user *arg) -+{ -+ int err; -+ aufs_bindex_t btop, bbot; -+ struct aufs_ibusy ibusy; -+ struct inode *inode, *h_inode; -+ -+ err = -EPERM; -+ if (unlikely(!capable(CAP_SYS_ADMIN))) -+ goto out; -+ -+ err = copy_from_user(&ibusy, arg, sizeof(ibusy)); -+ if (!err) -+ /* VERIFY_WRITE */ -+ err = !access_ok(&arg->h_ino, sizeof(arg->h_ino)); -+ if (unlikely(err)) { -+ err = -EFAULT; -+ AuTraceErr(err); -+ goto out; -+ } -+ -+ err = -EINVAL; -+ si_read_lock(sb, AuLock_FLUSH); -+ if (unlikely(ibusy.bindex < 0 || ibusy.bindex > au_sbbot(sb))) -+ goto out_unlock; -+ -+ err = 0; -+ ibusy.h_ino = 0; /* invalid */ -+ inode = ilookup(sb, ibusy.ino); -+ if (!inode -+ || inode->i_ino == AUFS_ROOT_INO -+ || au_is_bad_inode(inode)) -+ goto out_unlock; -+ -+ ii_read_lock_child(inode); -+ btop = au_ibtop(inode); -+ bbot = au_ibbot(inode); -+ if (btop <= ibusy.bindex && ibusy.bindex <= bbot) { -+ h_inode = au_h_iptr(inode, ibusy.bindex); -+ if (h_inode && au_test_ibusy(inode, btop, bbot)) -+ ibusy.h_ino = h_inode->i_ino; -+ } -+ ii_read_unlock(inode); -+ iput(inode); -+ -+out_unlock: -+ si_read_unlock(sb); -+ if (!err) { -+ err = __put_user(ibusy.h_ino, &arg->h_ino); -+ if (unlikely(err)) { -+ err = -EFAULT; -+ AuTraceErr(err); -+ } -+ } -+out: -+ return err; -+} -+ -+long au_ibusy_ioctl(struct file *file, unsigned long arg) -+{ -+ return au_ibusy(file->f_path.dentry->d_sb, (void __user *)arg); -+} -+ -+#ifdef CONFIG_COMPAT -+long au_ibusy_compat_ioctl(struct file *file, unsigned long arg) -+{ -+ return au_ibusy(file->f_path.dentry->d_sb, compat_ptr(arg)); -+} -+#endif -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * change a branch permission -+ */ -+ -+static void au_warn_ima(void) -+{ -+#ifdef CONFIG_IMA -+ /* since it doesn't support mark_files_ro() */ -+ AuWarn1("RW -> RO makes IMA to produce wrong message\n"); -+#endif -+} -+ -+static int do_need_sigen_inc(int a, int b) -+{ -+ return au_br_whable(a) && !au_br_whable(b); -+} -+ -+static int need_sigen_inc(int old, int new) -+{ -+ return do_need_sigen_inc(old, new) -+ || do_need_sigen_inc(new, old); -+} -+ -+static int au_br_mod_files_ro(struct super_block *sb, aufs_bindex_t bindex) -+{ -+ int err, do_warn; -+ unsigned int mnt_flags; -+ unsigned long long ull, max; -+ aufs_bindex_t br_id; -+ unsigned char verbose, writer; -+ struct file *file, *hf, **array; -+ struct au_hfile *hfile; -+ struct inode *h_inode; -+ -+ mnt_flags = au_mntflags(sb); -+ verbose = !!au_opt_test(mnt_flags, VERBOSE); -+ -+ array = au_farray_alloc(sb, &max); -+ err = PTR_ERR(array); -+ if (IS_ERR(array)) -+ goto out; -+ -+ do_warn = 0; -+ br_id = au_sbr_id(sb, bindex); -+ for (ull = 0; ull < max; ull++) { -+ file = array[ull]; -+ if (unlikely(!file)) -+ break; -+ -+ /* AuDbg("%pD\n", file); */ -+ fi_read_lock(file); -+ if (unlikely(au_test_mmapped(file))) { -+ err = -EBUSY; -+ AuVerbose(verbose, "mmapped %pD\n", file); -+ AuDbgFile(file); -+ FiMustNoWaiters(file); -+ fi_read_unlock(file); -+ goto out_array; -+ } -+ -+ hfile = &au_fi(file)->fi_htop; -+ hf = hfile->hf_file; -+ if (!d_is_reg(file->f_path.dentry) -+ || !(file->f_mode & FMODE_WRITE) -+ || hfile->hf_br->br_id != br_id -+ || !(hf->f_mode & FMODE_WRITE)) -+ array[ull] = NULL; -+ else { -+ do_warn = 1; -+ get_file(file); -+ } -+ -+ FiMustNoWaiters(file); -+ fi_read_unlock(file); -+ fput(file); -+ } -+ -+ err = 0; -+ if (do_warn) -+ au_warn_ima(); -+ -+ for (ull = 0; ull < max; ull++) { -+ file = array[ull]; -+ if (!file) -+ continue; -+ -+ /* todo: already flushed? */ -+ /* -+ * fs/super.c:mark_files_ro() is gone, but aufs keeps its -+ * approach which resets f_mode and calls mnt_drop_write() and -+ * file_release_write() for each file, because the branch -+ * attribute in aufs world is totally different from the native -+ * fs rw/ro mode. -+ */ -+ /* fi_read_lock(file); */ -+ hfile = &au_fi(file)->fi_htop; -+ hf = hfile->hf_file; -+ /* fi_read_unlock(file); */ -+ spin_lock(&hf->f_lock); -+ writer = !!(hf->f_mode & FMODE_WRITER); -+ hf->f_mode &= ~(FMODE_WRITE | FMODE_WRITER); -+ spin_unlock(&hf->f_lock); -+ if (writer) { -+ h_inode = file_inode(hf); -+ if (hf->f_mode & FMODE_READ) -+ i_readcount_inc(h_inode); -+ put_write_access(h_inode); -+ __mnt_drop_write(hf->f_path.mnt); -+ } -+ } -+ -+out_array: -+ au_farray_free(array, max); -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+int au_br_mod(struct super_block *sb, struct au_opt_mod *mod, int remount, -+ int *do_refresh) -+{ -+ int err, rerr; -+ aufs_bindex_t bindex; -+ struct dentry *root; -+ struct au_branch *br; -+ struct au_br_fhsm *bf; -+ -+ root = sb->s_root; -+ bindex = au_find_dbindex(root, mod->h_root); -+ if (bindex < 0) { -+ if (remount) -+ return 0; /* success */ -+ err = -ENOENT; -+ pr_err("%s no such branch\n", mod->path); -+ goto out; -+ } -+ AuDbg("bindex b%d\n", bindex); -+ -+ err = test_br(d_inode(mod->h_root), mod->perm, mod->path); -+ if (unlikely(err)) -+ goto out; -+ -+ br = au_sbr(sb, bindex); -+ AuDebugOn(mod->h_root != au_br_dentry(br)); -+ if (br->br_perm == mod->perm) -+ return 0; /* success */ -+ -+ /* pre-allocate for non-fhsm --> fhsm */ -+ bf = NULL; -+ if (!au_br_fhsm(br->br_perm) && au_br_fhsm(mod->perm)) { -+ err = au_fhsm_br_alloc(br); -+ if (unlikely(err)) -+ goto out; -+ bf = br->br_fhsm; -+ br->br_fhsm = NULL; -+ } -+ -+ if (au_br_writable(br->br_perm)) { -+ /* remove whiteout base */ -+ err = au_br_init_wh(sb, br, mod->perm); -+ if (unlikely(err)) -+ goto out_bf; -+ -+ if (!au_br_writable(mod->perm)) { -+ /* rw --> ro, file might be mmapped */ -+ DiMustNoWaiters(root); -+ IiMustNoWaiters(d_inode(root)); -+ di_write_unlock(root); -+ err = au_br_mod_files_ro(sb, bindex); -+ /* aufs_write_lock() calls ..._child() */ -+ di_write_lock_child(root); -+ -+ if (unlikely(err)) { -+ rerr = -ENOMEM; -+ br->br_wbr = kzalloc(sizeof(*br->br_wbr), -+ GFP_NOFS); -+ if (br->br_wbr) -+ rerr = au_wbr_init(br, sb, br->br_perm); -+ if (unlikely(rerr)) { -+ AuIOErr("nested error %d (%d)\n", -+ rerr, err); -+ br->br_perm = mod->perm; -+ } -+ } -+ } -+ } else if (au_br_writable(mod->perm)) { -+ /* ro --> rw */ -+ err = -ENOMEM; -+ br->br_wbr = kzalloc(sizeof(*br->br_wbr), GFP_NOFS); -+ if (br->br_wbr) { -+ err = au_wbr_init(br, sb, mod->perm); -+ if (unlikely(err)) { -+ au_kfree_rcu(br->br_wbr); -+ br->br_wbr = NULL; -+ } -+ } -+ } -+ if (unlikely(err)) -+ goto out_bf; -+ -+ if (au_br_fhsm(br->br_perm)) { -+ if (!au_br_fhsm(mod->perm)) { -+ /* fhsm --> non-fhsm */ -+ au_br_fhsm_fin(br->br_fhsm); -+ au_kfree_rcu(br->br_fhsm); -+ br->br_fhsm = NULL; -+ } -+ } else if (au_br_fhsm(mod->perm)) -+ /* non-fhsm --> fhsm */ -+ br->br_fhsm = bf; -+ -+ *do_refresh |= need_sigen_inc(br->br_perm, mod->perm); -+ br->br_perm = mod->perm; -+ goto out; /* success */ -+ -+out_bf: -+ au_kfree_try_rcu(bf); -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+int au_br_stfs(struct au_branch *br, struct aufs_stfs *stfs) -+{ -+ int err; -+ struct kstatfs kstfs; -+ -+ err = vfs_statfs(&br->br_path, &kstfs); -+ if (!err) { -+ stfs->f_blocks = kstfs.f_blocks; -+ stfs->f_bavail = kstfs.f_bavail; -+ stfs->f_files = kstfs.f_files; -+ stfs->f_ffree = kstfs.f_ffree; -+ } -+ -+ return err; -+} -diff -Naur null/fs/aufs/branch.h linux-5.15.36/fs/aufs/branch.h ---- /dev/null -+++ linux-5.15.36/fs/aufs/branch.h 2022-05-10 16:51:39.866744220 +0300 -@@ -0,0 +1,375 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program. If not, see . -+ */ -+ -+/* -+ * branch filesystems and xino for them -+ */ -+ -+#ifndef __AUFS_BRANCH_H__ -+#define __AUFS_BRANCH_H__ -+ -+#ifdef __KERNEL__ -+ -+#include -+#include "dirren.h" -+#include "dynop.h" -+#include "lcnt.h" -+#include "rwsem.h" -+#include "super.h" -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* a xino file */ -+struct au_xino { -+ struct file **xi_file; -+ unsigned int xi_nfile; -+ -+ struct { -+ spinlock_t spin; -+ ino_t *array; -+ int total; -+ /* reserved for future use */ -+ /* unsigned long *bitmap; */ -+ wait_queue_head_t wqh; -+ } xi_nondir; -+ -+ struct mutex xi_mtx; /* protects xi_file array */ -+ struct hlist_bl_head xi_writing; -+ -+ atomic_t xi_truncating; -+ -+ struct kref xi_kref; -+}; -+ -+/* File-based Hierarchical Storage Management */ -+struct au_br_fhsm { -+#ifdef CONFIG_AUFS_FHSM -+ struct mutex bf_lock; -+ unsigned long bf_jiffy; -+ struct aufs_stfs bf_stfs; -+ int bf_readable; -+#endif -+}; -+ -+/* members for writable branch only */ -+enum {AuBrWh_BASE, AuBrWh_PLINK, AuBrWh_ORPH, AuBrWh_Last}; -+struct au_wbr { -+ struct au_rwsem wbr_wh_rwsem; -+ struct dentry *wbr_wh[AuBrWh_Last]; -+ atomic_t wbr_wh_running; -+#define wbr_whbase wbr_wh[AuBrWh_BASE] /* whiteout base */ -+#define wbr_plink wbr_wh[AuBrWh_PLINK] /* pseudo-link dir */ -+#define wbr_orph wbr_wh[AuBrWh_ORPH] /* dir for orphans */ -+ -+ /* mfs mode */ -+ unsigned long long wbr_bytes; -+}; -+ -+/* ext2 has 3 types of operations at least, ext3 has 4 */ -+#define AuBrDynOp (AuDyLast * 4) -+ -+#ifdef CONFIG_AUFS_HFSNOTIFY -+/* support for asynchronous destruction */ -+struct au_br_hfsnotify { -+ struct fsnotify_group *hfsn_group; -+}; -+#endif -+ -+/* sysfs entries */ -+struct au_brsysfs { -+ char name[16]; -+ struct attribute attr; -+}; -+ -+enum { -+ AuBrSysfs_BR, -+ AuBrSysfs_BRID, -+ AuBrSysfs_Last -+}; -+ -+/* protected by superblock rwsem */ -+struct au_branch { -+ struct au_xino *br_xino; -+ -+ aufs_bindex_t br_id; -+ -+ int br_perm; -+ struct path br_path; -+ spinlock_t br_dykey_lock; -+ struct au_dykey *br_dykey[AuBrDynOp]; -+ au_lcnt_t br_nfiles; /* opened files */ -+ au_lcnt_t br_count; /* in-use for other */ -+ -+ struct au_wbr *br_wbr; -+ struct au_br_fhsm *br_fhsm; -+ -+#ifdef CONFIG_AUFS_HFSNOTIFY -+ struct au_br_hfsnotify *br_hfsn; -+#endif -+ -+#ifdef CONFIG_SYSFS -+ /* entries under sysfs per mount-point */ -+ struct au_brsysfs br_sysfs[AuBrSysfs_Last]; -+#endif -+ -+#ifdef CONFIG_DEBUG_FS -+ struct dentry *br_dbgaufs; /* xino */ -+#endif -+ -+ struct au_dr_br br_dirren; -+}; -+ -+/* ---------------------------------------------------------------------- */ -+ -+static inline struct vfsmount *au_br_mnt(struct au_branch *br) -+{ -+ return br->br_path.mnt; -+} -+ -+static inline struct dentry *au_br_dentry(struct au_branch *br) -+{ -+ return br->br_path.dentry; -+} -+ -+static inline struct user_namespace *au_br_userns(struct au_branch *br) -+{ -+ return mnt_user_ns(br->br_path.mnt); -+} -+ -+static inline struct super_block *au_br_sb(struct au_branch *br) -+{ -+ return au_br_mnt(br)->mnt_sb; -+} -+ -+static inline int au_br_rdonly(struct au_branch *br) -+{ -+ return (sb_rdonly(au_br_sb(br)) -+ || !au_br_writable(br->br_perm)) -+ ? -EROFS : 0; -+} -+ -+static inline int au_br_hnotifyable(int brperm __maybe_unused) -+{ -+#ifdef CONFIG_AUFS_HNOTIFY -+ return !(brperm & AuBrPerm_RR); -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_br_test_oflag(int oflag, struct au_branch *br) -+{ -+ int err, exec_flag; -+ -+ err = 0; -+ exec_flag = oflag & __FMODE_EXEC; -+ if (unlikely(exec_flag && path_noexec(&br->br_path))) -+ err = -EACCES; -+ -+ return err; -+} -+ -+static inline void au_xino_get(struct au_branch *br) -+{ -+ struct au_xino *xi; -+ -+ xi = br->br_xino; -+ if (xi) -+ kref_get(&xi->xi_kref); -+} -+ -+static inline int au_xino_count(struct au_branch *br) -+{ -+ int v; -+ struct au_xino *xi; -+ -+ v = 0; -+ xi = br->br_xino; -+ if (xi) -+ v = kref_read(&xi->xi_kref); -+ -+ return v; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* branch.c */ -+struct au_sbinfo; -+void au_br_free(struct au_sbinfo *sinfo); -+int au_br_index(struct super_block *sb, aufs_bindex_t br_id); -+struct au_opt_add; -+int au_br_add(struct super_block *sb, struct au_opt_add *add, int remount); -+struct au_opt_del; -+int au_br_del(struct super_block *sb, struct au_opt_del *del, int remount); -+long au_ibusy_ioctl(struct file *file, unsigned long arg); -+#ifdef CONFIG_COMPAT -+long au_ibusy_compat_ioctl(struct file *file, unsigned long arg); -+#endif -+struct au_opt_mod; -+int au_br_mod(struct super_block *sb, struct au_opt_mod *mod, int remount, -+ int *do_refresh); -+struct aufs_stfs; -+int au_br_stfs(struct au_branch *br, struct aufs_stfs *stfs); -+ -+/* xino.c */ -+static const loff_t au_loff_max = LLONG_MAX; -+ -+aufs_bindex_t au_xi_root(struct super_block *sb, struct dentry *dentry); -+struct file *au_xino_create(struct super_block *sb, char *fpath, int silent, -+ int wbrtop); -+struct file *au_xino_create2(struct super_block *sb, struct path *base, -+ struct file *copy_src); -+struct au_xi_new { -+ struct au_xino *xi; /* switch between xino and xigen */ -+ int idx; -+ struct path *base; -+ struct file *copy_src; -+}; -+struct file *au_xi_new(struct super_block *sb, struct au_xi_new *xinew); -+ -+int au_xino_read(struct super_block *sb, aufs_bindex_t bindex, ino_t h_ino, -+ ino_t *ino); -+int au_xino_write(struct super_block *sb, aufs_bindex_t bindex, ino_t h_ino, -+ ino_t ino); -+ssize_t xino_fread(struct file *file, void *buf, size_t size, loff_t *pos); -+ssize_t xino_fwrite(struct file *file, void *buf, size_t size, loff_t *pos); -+ -+int au_xib_trunc(struct super_block *sb); -+int au_xino_trunc(struct super_block *sb, aufs_bindex_t bindex, int idx_begin); -+ -+struct au_xino *au_xino_alloc(unsigned int nfile); -+int au_xino_put(struct au_branch *br); -+struct file *au_xino_file1(struct au_xino *xi); -+ -+struct au_opt_xino; -+void au_xino_clr(struct super_block *sb); -+int au_xino_set(struct super_block *sb, struct au_opt_xino *xiopt, int remount); -+struct file *au_xino_def(struct super_block *sb); -+int au_xino_init_br(struct super_block *sb, struct au_branch *br, ino_t hino, -+ struct path *base); -+ -+ino_t au_xino_new_ino(struct super_block *sb); -+void au_xino_delete_inode(struct inode *inode, const int unlinked); -+ -+void au_xinondir_leave(struct super_block *sb, aufs_bindex_t bindex, -+ ino_t h_ino, int idx); -+int au_xinondir_enter(struct super_block *sb, aufs_bindex_t bindex, ino_t h_ino, -+ int *idx); -+ -+int au_xino_path(struct seq_file *seq, struct file *file); -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* @idx is signed to accept -1 meaning the first file */ -+static inline struct file *au_xino_file(struct au_xino *xi, int idx) -+{ -+ struct file *file; -+ -+ file = NULL; -+ if (!xi) -+ goto out; -+ -+ if (idx >= 0) { -+ if (idx < xi->xi_nfile) -+ file = xi->xi_file[idx]; -+ } else -+ file = au_xino_file1(xi); -+ -+out: -+ return file; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* Superblock to branch */ -+static inline -+aufs_bindex_t au_sbr_id(struct super_block *sb, aufs_bindex_t bindex) -+{ -+ return au_sbr(sb, bindex)->br_id; -+} -+ -+static inline -+struct vfsmount *au_sbr_mnt(struct super_block *sb, aufs_bindex_t bindex) -+{ -+ return au_br_mnt(au_sbr(sb, bindex)); -+} -+ -+static inline -+struct user_namespace *au_sbr_userns(struct super_block *sb, aufs_bindex_t bindex) -+{ -+ return au_br_userns(au_sbr(sb, bindex)); -+} -+ -+static inline -+struct super_block *au_sbr_sb(struct super_block *sb, aufs_bindex_t bindex) -+{ -+ return au_br_sb(au_sbr(sb, bindex)); -+} -+ -+static inline int au_sbr_perm(struct super_block *sb, aufs_bindex_t bindex) -+{ -+ return au_sbr(sb, bindex)->br_perm; -+} -+ -+static inline int au_sbr_whable(struct super_block *sb, aufs_bindex_t bindex) -+{ -+ return au_br_whable(au_sbr_perm(sb, bindex)); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+#define wbr_wh_read_lock(wbr) au_rw_read_lock(&(wbr)->wbr_wh_rwsem) -+#define wbr_wh_write_lock(wbr) au_rw_write_lock(&(wbr)->wbr_wh_rwsem) -+#define wbr_wh_read_trylock(wbr) au_rw_read_trylock(&(wbr)->wbr_wh_rwsem) -+#define wbr_wh_write_trylock(wbr) au_rw_write_trylock(&(wbr)->wbr_wh_rwsem) -+/* -+#define wbr_wh_read_trylock_nested(wbr) \ -+ au_rw_read_trylock_nested(&(wbr)->wbr_wh_rwsem) -+#define wbr_wh_write_trylock_nested(wbr) \ -+ au_rw_write_trylock_nested(&(wbr)->wbr_wh_rwsem) -+*/ -+ -+#define wbr_wh_read_unlock(wbr) au_rw_read_unlock(&(wbr)->wbr_wh_rwsem) -+#define wbr_wh_write_unlock(wbr) au_rw_write_unlock(&(wbr)->wbr_wh_rwsem) -+#define wbr_wh_downgrade_lock(wbr) au_rw_dgrade_lock(&(wbr)->wbr_wh_rwsem) -+ -+#define WbrWhMustNoWaiters(wbr) AuRwMustNoWaiters(&(wbr)->wbr_wh_rwsem) -+#define WbrWhMustAnyLock(wbr) AuRwMustAnyLock(&(wbr)->wbr_wh_rwsem) -+#define WbrWhMustWriteLock(wbr) AuRwMustWriteLock(&(wbr)->wbr_wh_rwsem) -+ -+/* ---------------------------------------------------------------------- */ -+ -+#ifdef CONFIG_AUFS_FHSM -+static inline void au_br_fhsm_init(struct au_br_fhsm *brfhsm) -+{ -+ mutex_init(&brfhsm->bf_lock); -+ brfhsm->bf_jiffy = 0; -+ brfhsm->bf_readable = 0; -+} -+ -+static inline void au_br_fhsm_fin(struct au_br_fhsm *brfhsm) -+{ -+ mutex_destroy(&brfhsm->bf_lock); -+} -+#else -+AuStubVoid(au_br_fhsm_init, struct au_br_fhsm *brfhsm) -+AuStubVoid(au_br_fhsm_fin, struct au_br_fhsm *brfhsm) -+#endif -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_BRANCH_H__ */ -diff -Naur null/fs/aufs/conf.mk linux-5.15.36/fs/aufs/conf.mk ---- /dev/null -+++ linux-5.15.36/fs/aufs/conf.mk 2022-05-10 16:51:39.867744220 +0300 -@@ -0,0 +1,40 @@ -+# SPDX-License-Identifier: GPL-2.0 -+ -+AuConfStr = CONFIG_AUFS_FS=${CONFIG_AUFS_FS} -+ -+define AuConf -+ifdef ${1} -+AuConfStr += ${1}=${${1}} -+endif -+endef -+ -+AuConfAll = BRANCH_MAX_127 BRANCH_MAX_511 BRANCH_MAX_1023 BRANCH_MAX_32767 \ -+ SBILIST \ -+ HNOTIFY HFSNOTIFY \ -+ EXPORT INO_T_64 \ -+ XATTR \ -+ FHSM \ -+ RDU \ -+ DIRREN \ -+ SHWH \ -+ BR_RAMFS \ -+ BR_FUSE POLL \ -+ BR_HFSPLUS \ -+ BDEV_LOOP \ -+ DEBUG MAGIC_SYSRQ -+$(foreach i, ${AuConfAll}, \ -+ $(eval $(call AuConf,CONFIG_AUFS_${i}))) -+ -+AuConfName = ${obj}/conf.str -+${AuConfName}.tmp: FORCE -+ @echo ${AuConfStr} | tr ' ' '\n' | sed -e 's/^/"/' -e 's/$$/\\n"/' > $@ -+${AuConfName}: ${AuConfName}.tmp -+ @diff -q $< $@ > /dev/null 2>&1 || { \ -+ echo ' GEN ' $@; \ -+ cp -p $< $@; \ -+ } -+FORCE: -+clean-files += ${AuConfName} ${AuConfName}.tmp -+${obj}/sysfs.o: ${AuConfName} -+ -+-include ${srctree}/${src}/conf_priv.mk -diff -Naur null/fs/aufs/cpup.c linux-5.15.36/fs/aufs/cpup.c ---- /dev/null -+++ linux-5.15.36/fs/aufs/cpup.c 2022-05-10 16:51:39.867744220 +0300 -@@ -0,0 +1,1459 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program. If not, see . -+ */ -+ -+/* -+ * copy-up functions, see wbr_policy.c for copy-down -+ */ -+ -+#include -+#include -+#include -+#include "aufs.h" -+ -+void au_cpup_attr_flags(struct inode *dst, unsigned int iflags) -+{ -+ const unsigned int mask = S_DEAD | S_SWAPFILE | S_PRIVATE -+ | S_NOATIME | S_NOCMTIME | S_AUTOMOUNT; -+ -+ BUILD_BUG_ON(sizeof(iflags) != sizeof(dst->i_flags)); -+ -+ dst->i_flags |= iflags & ~mask; -+ if (au_test_fs_notime(dst->i_sb)) -+ dst->i_flags |= S_NOATIME | S_NOCMTIME; -+} -+ -+void au_cpup_attr_timesizes(struct inode *inode) -+{ -+ struct inode *h_inode; -+ -+ h_inode = au_h_iptr(inode, au_ibtop(inode)); -+ fsstack_copy_attr_times(inode, h_inode); -+ fsstack_copy_inode_size(inode, h_inode); -+} -+ -+void au_cpup_attr_nlink(struct inode *inode, int force) -+{ -+ struct inode *h_inode; -+ struct super_block *sb; -+ aufs_bindex_t bindex, bbot; -+ -+ sb = inode->i_sb; -+ bindex = au_ibtop(inode); -+ h_inode = au_h_iptr(inode, bindex); -+ if (!force -+ && !S_ISDIR(h_inode->i_mode) -+ && au_opt_test(au_mntflags(sb), PLINK) -+ && au_plink_test(inode)) -+ return; -+ -+ /* -+ * 0 can happen in revalidating. -+ * h_inode->i_mutex may not be held here, but it is harmless since once -+ * i_nlink reaches 0, it will never become positive except O_TMPFILE -+ * case. -+ * todo: O_TMPFILE+linkat(AT_SYMLINK_FOLLOW) bypassing aufs may cause -+ * the incorrect link count. -+ */ -+ set_nlink(inode, h_inode->i_nlink); -+ -+ /* -+ * fewer nlink makes find(1) noisy, but larger nlink doesn't. -+ * it may includes whplink directory. -+ */ -+ if (S_ISDIR(h_inode->i_mode)) { -+ bbot = au_ibbot(inode); -+ for (bindex++; bindex <= bbot; bindex++) { -+ h_inode = au_h_iptr(inode, bindex); -+ if (h_inode) -+ au_add_nlink(inode, h_inode); -+ } -+ } -+} -+ -+void au_cpup_attr_changeable(struct inode *inode) -+{ -+ struct inode *h_inode; -+ -+ h_inode = au_h_iptr(inode, au_ibtop(inode)); -+ inode->i_mode = h_inode->i_mode; -+ inode->i_uid = h_inode->i_uid; -+ inode->i_gid = h_inode->i_gid; -+ au_cpup_attr_timesizes(inode); -+ au_cpup_attr_flags(inode, h_inode->i_flags); -+} -+ -+void au_cpup_igen(struct inode *inode, struct inode *h_inode) -+{ -+ struct au_iinfo *iinfo = au_ii(inode); -+ -+ IiMustWriteLock(inode); -+ -+ iinfo->ii_higen = h_inode->i_generation; -+ iinfo->ii_hsb1 = h_inode->i_sb; -+} -+ -+void au_cpup_attr_all(struct inode *inode, int force) -+{ -+ struct inode *h_inode; -+ -+ h_inode = au_h_iptr(inode, au_ibtop(inode)); -+ au_cpup_attr_changeable(inode); -+ if (inode->i_nlink > 0) -+ au_cpup_attr_nlink(inode, force); -+ inode->i_rdev = h_inode->i_rdev; -+ inode->i_blkbits = h_inode->i_blkbits; -+ au_cpup_igen(inode, h_inode); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* Note: dt_dentry and dt_h_dentry are not dget/dput-ed */ -+ -+/* keep the timestamps of the parent dir when cpup */ -+void au_dtime_store(struct au_dtime *dt, struct dentry *dentry, -+ struct path *h_path) -+{ -+ struct inode *h_inode; -+ -+ dt->dt_dentry = dentry; -+ dt->dt_h_path = *h_path; -+ h_inode = d_inode(h_path->dentry); -+ dt->dt_atime = h_inode->i_atime; -+ dt->dt_mtime = h_inode->i_mtime; -+ /* smp_mb(); */ -+} -+ -+void au_dtime_revert(struct au_dtime *dt) -+{ -+ struct iattr attr; -+ int err; -+ -+ attr.ia_atime = dt->dt_atime; -+ attr.ia_mtime = dt->dt_mtime; -+ 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); -+ if (unlikely(err)) -+ pr_warn("restoring timestamps failed(%d). ignored\n", err); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* internal use only */ -+struct au_cpup_reg_attr { -+ int valid; -+ struct kstat st; -+ unsigned int iflags; /* inode->i_flags */ -+}; -+ -+static noinline_for_stack -+int cpup_iattr(struct dentry *dst, aufs_bindex_t bindex, struct path *h_src, -+ struct au_cpup_reg_attr *h_src_attr) -+{ -+ int err, sbits, icex; -+ unsigned int mnt_flags; -+ unsigned char verbose; -+ struct iattr ia; -+ struct path h_path; -+ struct inode *h_isrc, *h_idst; -+ struct kstat *h_st; -+ struct au_branch *br; -+ -+ br = au_sbr(dst->d_sb, bindex); -+ h_path.mnt = au_br_mnt(br); -+ h_path.dentry = au_h_dptr(dst, bindex); -+ h_idst = d_inode(h_path.dentry); -+ h_isrc = d_inode(h_src->dentry); -+ ia.ia_valid = ATTR_FORCE | ATTR_UID | ATTR_GID -+ | ATTR_ATIME | ATTR_MTIME -+ | ATTR_ATIME_SET | ATTR_MTIME_SET; -+ if (h_src_attr && h_src_attr->valid) { -+ h_st = &h_src_attr->st; -+ ia.ia_uid = h_st->uid; -+ ia.ia_gid = h_st->gid; -+ ia.ia_atime = h_st->atime; -+ ia.ia_mtime = h_st->mtime; -+ if (h_idst->i_mode != h_st->mode -+ && !S_ISLNK(h_idst->i_mode)) { -+ ia.ia_valid |= ATTR_MODE; -+ ia.ia_mode = h_st->mode; -+ } -+ sbits = !!(h_st->mode & (S_ISUID | S_ISGID)); -+ au_cpup_attr_flags(h_idst, h_src_attr->iflags); -+ } else { -+ ia.ia_uid = h_isrc->i_uid; -+ ia.ia_gid = h_isrc->i_gid; -+ ia.ia_atime = h_isrc->i_atime; -+ ia.ia_mtime = h_isrc->i_mtime; -+ if (h_idst->i_mode != h_isrc->i_mode -+ && !S_ISLNK(h_idst->i_mode)) { -+ ia.ia_valid |= ATTR_MODE; -+ ia.ia_mode = h_isrc->i_mode; -+ } -+ 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); -+ -+ /* 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); -+ } -+ -+ icex = br->br_perm & AuBrAttr_ICEX; -+ if (!err) { -+ mnt_flags = au_mntflags(dst->d_sb); -+ verbose = !!au_opt_test(mnt_flags, VERBOSE); -+ err = au_cpup_xattr(&h_path, h_src, icex, verbose); -+ } -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int au_do_copy_file(struct file *dst, struct file *src, loff_t len, -+ char *buf, unsigned long blksize) -+{ -+ int err; -+ size_t sz, rbytes, wbytes; -+ unsigned char all_zero; -+ char *p, *zp; -+ struct inode *h_inode; -+ /* reduce stack usage */ -+ struct iattr *ia; -+ -+ zp = page_address(ZERO_PAGE(0)); -+ if (unlikely(!zp)) -+ return -ENOMEM; /* possible? */ -+ -+ err = 0; -+ all_zero = 0; -+ while (len) { -+ AuDbg("len %lld\n", len); -+ sz = blksize; -+ if (len < blksize) -+ sz = len; -+ -+ rbytes = 0; -+ /* todo: signal_pending? */ -+ while (!rbytes || err == -EAGAIN || err == -EINTR) { -+ rbytes = vfsub_read_k(src, buf, sz, &src->f_pos); -+ err = rbytes; -+ } -+ if (unlikely(err < 0)) -+ break; -+ -+ all_zero = 0; -+ if (len >= rbytes && rbytes == blksize) -+ all_zero = !memcmp(buf, zp, rbytes); -+ if (!all_zero) { -+ wbytes = rbytes; -+ p = buf; -+ while (wbytes) { -+ size_t b; -+ -+ b = vfsub_write_k(dst, p, wbytes, &dst->f_pos); -+ err = b; -+ /* todo: signal_pending? */ -+ if (unlikely(err == -EAGAIN || err == -EINTR)) -+ continue; -+ if (unlikely(err < 0)) -+ break; -+ wbytes -= b; -+ p += b; -+ } -+ if (unlikely(err < 0)) -+ break; -+ } else { -+ loff_t res; -+ -+ AuLabel(hole); -+ res = vfsub_llseek(dst, rbytes, SEEK_CUR); -+ err = res; -+ if (unlikely(res < 0)) -+ break; -+ } -+ len -= rbytes; -+ err = 0; -+ } -+ -+ /* the last block may be a hole */ -+ if (!err && all_zero) { -+ AuLabel(last hole); -+ -+ err = 1; -+ if (au_test_nfs(dst->f_path.dentry->d_sb)) { -+ /* nfs requires this step to make last hole */ -+ /* is this only nfs? */ -+ do { -+ /* todo: signal_pending? */ -+ err = vfsub_write_k(dst, "\0", 1, &dst->f_pos); -+ } while (err == -EAGAIN || err == -EINTR); -+ if (err == 1) -+ dst->f_pos--; -+ } -+ -+ if (err == 1) { -+ ia = (void *)buf; -+ ia->ia_size = dst->f_pos; -+ ia->ia_valid = ATTR_SIZE | ATTR_FILE; -+ 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); -+ inode_unlock(h_inode); -+ } -+ } -+ -+ return err; -+} -+ -+int au_copy_file(struct file *dst, struct file *src, loff_t len) -+{ -+ int err; -+ unsigned long blksize; -+ unsigned char do_kfree; -+ char *buf; -+ struct super_block *h_sb; -+ -+ err = -ENOMEM; -+ h_sb = file_inode(dst)->i_sb; -+ blksize = h_sb->s_blocksize; -+ if (!blksize || PAGE_SIZE < blksize) -+ blksize = PAGE_SIZE; -+ AuDbg("blksize %lu\n", blksize); -+ do_kfree = (blksize != PAGE_SIZE && blksize >= sizeof(struct iattr *)); -+ if (do_kfree) -+ buf = kmalloc(blksize, GFP_NOFS); -+ else -+ buf = (void *)__get_free_page(GFP_NOFS); -+ if (unlikely(!buf)) -+ goto out; -+ -+ if (len > (1 << 22)) -+ AuDbg("copying a large file %lld\n", (long long)len); -+ -+ src->f_pos = 0; -+ dst->f_pos = 0; -+ err = au_do_copy_file(dst, src, len, buf, blksize); -+ if (do_kfree) { -+ AuDebugOn(!au_kfree_do_sz_test(blksize)); -+ au_kfree_do_rcu(buf); -+ } else -+ free_page((unsigned long)buf); -+ -+out: -+ return err; -+} -+ -+static int au_do_copy(struct file *dst, struct file *src, loff_t len) -+{ -+ int err; -+ struct super_block *h_src_sb; -+ struct inode *h_src_inode; -+ -+ h_src_inode = file_inode(src); -+ h_src_sb = h_src_inode->i_sb; -+ -+ /* XFS acquires inode_lock */ -+ if (!au_test_xfs(h_src_sb)) -+ err = au_copy_file(dst, src, len); -+ else { -+ inode_unlock_shared(h_src_inode); -+ err = au_copy_file(dst, src, len); -+ inode_lock_shared_nested(h_src_inode, AuLsc_I_CHILD); -+ } -+ -+ return err; -+} -+ -+static int au_clone_or_copy(struct file *dst, struct file *src, loff_t len) -+{ -+ int err; -+ loff_t lo; -+ struct super_block *h_src_sb; -+ struct inode *h_src_inode; -+ -+ h_src_inode = file_inode(src); -+ h_src_sb = h_src_inode->i_sb; -+ if (h_src_sb != file_inode(dst)->i_sb -+ || !dst->f_op->remap_file_range) { -+ err = au_do_copy(dst, src, len); -+ goto out; -+ } -+ -+ if (!au_test_nfs(h_src_sb)) { -+ inode_unlock_shared(h_src_inode); -+ lo = vfsub_clone_file_range(src, dst, len); -+ inode_lock_shared_nested(h_src_inode, AuLsc_I_CHILD); -+ } else -+ lo = vfsub_clone_file_range(src, dst, len); -+ if (lo == len) { -+ err = 0; -+ goto out; /* success */ -+ } else if (lo >= 0) -+ /* todo: possible? */ -+ /* paritially succeeded */ -+ AuDbg("lo %lld, len %lld. Retrying.\n", lo, len); -+ else if (lo != -EOPNOTSUPP) { -+ /* older XFS has a condition in cloning */ -+ err = lo; -+ goto out; -+ } -+ -+ /* the backend fs on NFS may not support cloning */ -+ err = au_do_copy(dst, src, len); -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+/* -+ * to support a sparse file which is opened with O_APPEND, -+ * we need to close the file. -+ */ -+static int au_cp_regular(struct au_cp_generic *cpg) -+{ -+ int err, i; -+ enum { SRC, DST }; -+ struct { -+ aufs_bindex_t bindex; -+ unsigned int flags; -+ struct dentry *dentry; -+ int force_wr; -+ struct file *file; -+ } *f, file[] = { -+ { -+ .bindex = cpg->bsrc, -+ .flags = O_RDONLY | O_NOATIME | O_LARGEFILE, -+ }, -+ { -+ .bindex = cpg->bdst, -+ .flags = O_WRONLY | O_NOATIME | O_LARGEFILE, -+ .force_wr = !!au_ftest_cpup(cpg->flags, RWDST), -+ } -+ }; -+ struct au_branch *br; -+ struct super_block *sb, *h_src_sb; -+ struct inode *h_src_inode; -+ struct task_struct *tsk = current; -+ -+ /* bsrc branch can be ro/rw. */ -+ sb = cpg->dentry->d_sb; -+ f = file; -+ for (i = 0; i < 2; i++, f++) { -+ f->dentry = au_h_dptr(cpg->dentry, f->bindex); -+ f->file = au_h_open(cpg->dentry, f->bindex, f->flags, -+ /*file*/NULL, f->force_wr); -+ if (IS_ERR(f->file)) { -+ err = PTR_ERR(f->file); -+ if (i == SRC) -+ goto out; -+ else -+ goto out_src; -+ } -+ } -+ -+ /* try stopping to update while we copyup */ -+ h_src_inode = d_inode(file[SRC].dentry); -+ h_src_sb = h_src_inode->i_sb; -+ if (!au_test_nfs(h_src_sb)) -+ IMustLock(h_src_inode); -+ err = au_clone_or_copy(file[DST].file, file[SRC].file, cpg->len); -+ -+ /* i wonder if we had O_NO_DELAY_FPUT flag */ -+ if (tsk->flags & PF_KTHREAD) -+ __fput_sync(file[DST].file); -+ else { -+ /* it happened actually */ -+ fput(file[DST].file); -+ /* -+ * too bad. -+ * we have to call both since we don't know which place the file -+ * was added to. -+ */ -+ task_work_run(); -+ flush_delayed_fput(); -+ } -+ br = au_sbr(sb, file[DST].bindex); -+ au_lcnt_dec(&br->br_nfiles); -+ -+out_src: -+ fput(file[SRC].file); -+ br = au_sbr(sb, file[SRC].bindex); -+ au_lcnt_dec(&br->br_nfiles); -+out: -+ return err; -+} -+ -+static int au_do_cpup_regular(struct au_cp_generic *cpg, -+ struct au_cpup_reg_attr *h_src_attr) -+{ -+ int err, rerr; -+ loff_t l; -+ struct path h_path; -+ struct inode *h_src_inode, *h_dst_inode; -+ -+ err = 0; -+ h_src_inode = au_h_iptr(d_inode(cpg->dentry), cpg->bsrc); -+ l = i_size_read(h_src_inode); -+ if (cpg->len == -1 || l < cpg->len) -+ cpg->len = l; -+ if (cpg->len) { -+ /* try stopping to update while we are referencing */ -+ inode_lock_shared_nested(h_src_inode, AuLsc_I_CHILD); -+ au_pin_hdir_unlock(cpg->pin); -+ -+ h_path.dentry = au_h_dptr(cpg->dentry, cpg->bsrc); -+ h_path.mnt = au_sbr_mnt(cpg->dentry->d_sb, cpg->bsrc); -+ h_src_attr->iflags = h_src_inode->i_flags; -+ if (!au_test_nfs(h_src_inode->i_sb)) -+ err = vfsub_getattr(&h_path, &h_src_attr->st); -+ else { -+ inode_unlock_shared(h_src_inode); -+ err = vfsub_getattr(&h_path, &h_src_attr->st); -+ inode_lock_shared_nested(h_src_inode, AuLsc_I_CHILD); -+ } -+ if (unlikely(err)) { -+ inode_unlock_shared(h_src_inode); -+ goto out; -+ } -+ h_src_attr->valid = 1; -+ if (!au_test_nfs(h_src_inode->i_sb)) { -+ err = au_cp_regular(cpg); -+ inode_unlock_shared(h_src_inode); -+ } else { -+ inode_unlock_shared(h_src_inode); -+ err = au_cp_regular(cpg); -+ } -+ rerr = au_pin_hdir_relock(cpg->pin); -+ 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; -+} -+ -+static int au_do_cpup_symlink(struct path *h_path, struct dentry *h_src, -+ struct inode *h_dir) -+{ -+ int err; -+ DEFINE_DELAYED_CALL(done); -+ const char *sym; -+ -+ sym = vfs_get_link(h_src, &done); -+ err = PTR_ERR(sym); -+ if (IS_ERR(sym)) -+ goto out; -+ -+ err = vfsub_symlink(h_dir, h_path, sym); -+ -+out: -+ do_delayed_call(&done); -+ return err; -+} -+ -+/* -+ * regardless 'acl' option, reset all ACL. -+ * All ACL will be copied up later from the original entry on the lower branch. -+ */ -+static int au_reset_acl(struct inode *h_dir, struct path *h_path, umode_t mode) -+{ -+ int err; -+ struct dentry *h_dentry; -+ struct inode *h_inode; -+ struct user_namespace *h_userns; -+ -+ h_userns = mnt_user_ns(h_path->mnt); -+ h_dentry = h_path->dentry; -+ h_inode = d_inode(h_dentry); -+ /* forget_all_cached_acls(h_inode)); */ -+ err = vfsub_removexattr(h_userns, h_dentry, XATTR_NAME_POSIX_ACL_ACCESS); -+ AuTraceErr(err); -+ if (err == -EOPNOTSUPP) -+ err = 0; -+ if (!err) -+ err = vfsub_acl_chmod(h_userns, h_inode, mode); -+ -+ AuTraceErr(err); -+ return err; -+} -+ -+static int au_do_cpup_dir(struct au_cp_generic *cpg, struct dentry *dst_parent, -+ struct inode *h_dir, struct path *h_path) -+{ -+ int err; -+ struct inode *dir, *inode; -+ struct user_namespace *h_userns; -+ -+ h_userns = mnt_user_ns(h_path->mnt); -+ err = vfsub_removexattr(h_userns, h_path->dentry, -+ XATTR_NAME_POSIX_ACL_DEFAULT); -+ AuTraceErr(err); -+ if (err == -EOPNOTSUPP) -+ err = 0; -+ if (unlikely(err)) -+ goto out; -+ -+ /* -+ * strange behaviour from the users view, -+ * particularly setattr case -+ */ -+ dir = d_inode(dst_parent); -+ if (au_ibtop(dir) == cpg->bdst) -+ au_cpup_attr_nlink(dir, /*force*/1); -+ inode = d_inode(cpg->dentry); -+ au_cpup_attr_nlink(inode, /*force*/1); -+ -+out: -+ return err; -+} -+ -+static noinline_for_stack -+int cpup_entry(struct au_cp_generic *cpg, struct dentry *dst_parent, -+ struct au_cpup_reg_attr *h_src_attr) -+{ -+ int err; -+ umode_t mode; -+ unsigned int mnt_flags; -+ unsigned char isdir, isreg, force; -+ const unsigned char do_dt = !!au_ftest_cpup(cpg->flags, DTIME); -+ struct au_dtime dt; -+ struct path h_path; -+ struct dentry *h_src, *h_dst, *h_parent; -+ struct inode *h_inode, *h_dir; -+ struct super_block *sb; -+ -+ /* bsrc branch can be ro/rw. */ -+ h_src = au_h_dptr(cpg->dentry, cpg->bsrc); -+ h_inode = d_inode(h_src); -+ AuDebugOn(h_inode != au_h_iptr(d_inode(cpg->dentry), cpg->bsrc)); -+ -+ /* try stopping to be referenced while we are creating */ -+ h_dst = au_h_dptr(cpg->dentry, cpg->bdst); -+ if (au_ftest_cpup(cpg->flags, RENAME)) -+ AuDebugOn(strncmp(h_dst->d_name.name, AUFS_WH_PFX, -+ AUFS_WH_PFX_LEN)); -+ h_parent = h_dst->d_parent; /* dir inode is locked */ -+ h_dir = d_inode(h_parent); -+ IMustLock(h_dir); -+ AuDebugOn(h_parent != h_dst->d_parent); -+ -+ sb = cpg->dentry->d_sb; -+ h_path.mnt = au_sbr_mnt(sb, cpg->bdst); -+ if (do_dt) { -+ h_path.dentry = h_parent; -+ au_dtime_store(&dt, dst_parent, &h_path); -+ } -+ h_path.dentry = h_dst; -+ -+ isreg = 0; -+ isdir = 0; -+ mode = h_inode->i_mode; -+ switch (mode & S_IFMT) { -+ case S_IFREG: -+ isreg = 1; -+ err = vfsub_create(h_dir, &h_path, 0600, /*want_excl*/true); -+ if (!err) -+ err = au_do_cpup_regular(cpg, h_src_attr); -+ break; -+ case S_IFDIR: -+ isdir = 1; -+ err = vfsub_mkdir(h_dir, &h_path, mode); -+ if (!err) -+ err = au_do_cpup_dir(cpg, dst_parent, h_dir, &h_path); -+ break; -+ case S_IFLNK: -+ err = au_do_cpup_symlink(&h_path, h_src, h_dir); -+ break; -+ case S_IFCHR: -+ case S_IFBLK: -+ AuDebugOn(!capable(CAP_MKNOD)); -+ fallthrough; -+ case S_IFIFO: -+ case S_IFSOCK: -+ err = vfsub_mknod(h_dir, &h_path, mode, h_inode->i_rdev); -+ break; -+ default: -+ AuIOErr("Unknown inode type 0%o\n", mode); -+ err = -EIO; -+ } -+ if (!err) -+ err = au_reset_acl(h_dir, &h_path, mode); -+ -+ mnt_flags = au_mntflags(sb); -+ if (!au_opt_test(mnt_flags, UDBA_NONE) -+ && !isdir -+ && au_opt_test(mnt_flags, XINO) -+ && (h_inode->i_nlink == 1 -+ || (h_inode->i_state & I_LINKABLE)) -+ /* todo: unnecessary? */ -+ /* && d_inode(cpg->dentry)->i_nlink == 1 */ -+ && cpg->bdst < cpg->bsrc -+ && !au_ftest_cpup(cpg->flags, KEEPLINO)) -+ au_xino_write(sb, cpg->bsrc, h_inode->i_ino, /*ino*/0); -+ /* ignore this error */ -+ -+ if (!err) { -+ force = 0; -+ if (isreg) { -+ force = !!cpg->len; -+ if (cpg->len == -1) -+ force = !!i_size_read(h_inode); -+ } -+ au_fhsm_wrote(sb, cpg->bdst, force); -+ } -+ -+ if (do_dt) -+ au_dtime_revert(&dt); -+ return err; -+} -+ -+static int au_do_ren_after_cpup(struct au_cp_generic *cpg, struct path *h_path) -+{ -+ int err; -+ struct dentry *dentry, *h_dentry, *h_parent, *parent; -+ struct path h_ppath; -+ struct inode *h_dir; -+ aufs_bindex_t bdst; -+ -+ dentry = cpg->dentry; -+ bdst = cpg->bdst; -+ h_ppath.mnt = au_sbr_mnt(dentry->d_sb, bdst); -+ h_dentry = au_h_dptr(dentry, bdst); -+ if (!au_ftest_cpup(cpg->flags, OVERWRITE)) { -+ dget(h_dentry); -+ au_set_h_dptr(dentry, bdst, NULL); -+ err = au_lkup_neg(dentry, bdst, /*wh*/0); -+ if (!err) -+ h_path->dentry = dget(au_h_dptr(dentry, bdst)); -+ au_set_h_dptr(dentry, bdst, h_dentry); -+ } else { -+ err = 0; -+ parent = dget_parent(dentry); -+ h_ppath.dentry = au_h_dptr(parent, bdst); -+ dput(parent); -+ h_path->dentry = vfsub_lkup_one(&dentry->d_name, &h_ppath); -+ if (IS_ERR(h_path->dentry)) -+ err = PTR_ERR(h_path->dentry); -+ } -+ if (unlikely(err)) -+ goto out; -+ -+ h_parent = h_dentry->d_parent; /* dir inode is locked */ -+ 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); -+ dput(h_path->dentry); -+ -+out: -+ return err; -+} -+ -+/* -+ * copyup the @dentry from @bsrc to @bdst. -+ * the caller must set the both of lower dentries. -+ * @len is for truncating when it is -1 copyup the entire file. -+ * in link/rename cases, @dst_parent may be different from the real one. -+ * basic->bsrc can be larger than basic->bdst. -+ * aufs doesn't touch the credential so -+ * security_inode_copy_up{,_xattr}() are unnecessary. -+ */ -+static int au_cpup_single(struct au_cp_generic *cpg, struct dentry *dst_parent) -+{ -+ int err, rerr; -+ 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 super_block *sb; -+ struct au_branch *br; -+ struct path h_src_path; -+ /* to reduce stack size */ -+ struct { -+ struct au_dtime dt; -+ struct path h_path; -+ struct au_cpup_reg_attr h_src_attr; -+ } *a; -+ -+ err = -ENOMEM; -+ a = kmalloc(sizeof(*a), GFP_NOFS); -+ if (unlikely(!a)) -+ goto out; -+ a->h_src_attr.valid = 0; -+ -+ sb = cpg->dentry->d_sb; -+ br = au_sbr(sb, cpg->bdst); -+ a->h_path.mnt = au_br_mnt(br); -+ h_dst = au_h_dptr(cpg->dentry, cpg->bdst); -+ h_parent = h_dst->d_parent; /* dir inode is locked */ -+ h_dir = d_inode(h_parent); -+ IMustLock(h_dir); -+ -+ h_src = au_h_dptr(cpg->dentry, cpg->bsrc); -+ inode = d_inode(cpg->dentry); -+ -+ if (!dst_parent) -+ dst_parent = dget_parent(cpg->dentry); -+ else -+ dget(dst_parent); -+ -+ plink = !!au_opt_test(au_mntflags(sb), PLINK); -+ dst_inode = au_h_iptr(inode, cpg->bdst); -+ if (dst_inode) { -+ if (unlikely(!plink)) { -+ err = -EIO; -+ 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; -+ } -+ -+ if (dst_inode->i_nlink) { -+ const int do_dt = au_ftest_cpup(cpg->flags, DTIME); -+ -+ h_src = au_plink_lkup(inode, cpg->bdst); -+ err = PTR_ERR(h_src); -+ if (IS_ERR(h_src)) -+ goto out_parent; -+ 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; -+ } -+ -+ if (do_dt) { -+ a->h_path.dentry = h_parent; -+ au_dtime_store(&a->dt, dst_parent, &a->h_path); -+ } -+ -+ a->h_path.dentry = h_dst; -+ delegated = NULL; -+ err = vfsub_link(h_src, h_dir, &a->h_path, &delegated); -+ 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; -+ } else -+ /* todo: cpup_wh_file? */ -+ /* udba work */ -+ au_update_ibrange(inode, /*do_put_zero*/1); -+ } -+ -+ isdir = S_ISDIR(inode->i_mode); -+ old_ibtop = au_ibtop(inode); -+ err = cpup_entry(cpg, dst_parent, &a->h_src_attr); -+ if (unlikely(err)) -+ goto out_rev; -+ dst_inode = d_inode(h_dst); -+ inode_lock_nested(dst_inode, AuLsc_I_CHILD2); -+ /* todo: necessary? */ -+ /* au_pin_hdir_unlock(cpg->pin); */ -+ -+ h_src_path.dentry = h_src; -+ h_src_path.mnt = au_sbr_mnt(sb, cpg->bsrc); -+ err = cpup_iattr(cpg->dentry, cpg->bdst, &h_src_path, &a->h_src_attr); -+ if (unlikely(err)) { -+ /* todo: necessary? */ -+ /* au_pin_hdir_relock(cpg->pin); */ /* ignore an error */ -+ inode_unlock(dst_inode); -+ goto out_rev; -+ } -+ -+ if (cpg->bdst < old_ibtop) { -+ if (S_ISREG(inode->i_mode)) { -+ err = au_dy_iaop(inode, cpg->bdst, dst_inode); -+ if (unlikely(err)) { -+ /* ignore an error */ -+ /* au_pin_hdir_relock(cpg->pin); */ -+ inode_unlock(dst_inode); -+ goto out_rev; -+ } -+ } -+ au_set_ibtop(inode, cpg->bdst); -+ } else -+ au_set_ibbot(inode, cpg->bdst); -+ au_set_h_iptr(inode, cpg->bdst, au_igrab(dst_inode), -+ au_hi_flags(inode, isdir)); -+ -+ /* todo: necessary? */ -+ /* err = au_pin_hdir_relock(cpg->pin); */ -+ inode_unlock(dst_inode); -+ if (unlikely(err)) -+ goto out_rev; -+ -+ src_inode = d_inode(h_src); -+ if (!isdir -+ && (src_inode->i_nlink > 1 -+ || src_inode->i_state & I_LINKABLE) -+ && plink) -+ au_plink_append(inode, cpg->bdst, h_dst); -+ -+ if (au_ftest_cpup(cpg->flags, RENAME)) { -+ a->h_path.dentry = h_dst; -+ err = au_do_ren_after_cpup(cpg, &a->h_path); -+ } -+ if (!err) -+ goto out_parent; /* success */ -+ -+ /* revert */ -+out_rev: -+ a->h_path.dentry = h_parent; -+ au_dtime_store(&a->dt, dst_parent, &a->h_path); -+ a->h_path.dentry = h_dst; -+ 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); -+ } else -+ rerr = vfsub_rmdir(h_dir, &a->h_path); -+ } -+ au_dtime_revert(&a->dt); -+ if (rerr) { -+ AuIOErr("failed removing broken entry(%d, %d)\n", err, rerr); -+ err = -EIO; -+ } -+out_parent: -+ dput(dst_parent); -+ au_kfree_rcu(a); -+out: -+ return err; -+} -+ -+#if 0 /* reserved */ -+struct au_cpup_single_args { -+ int *errp; -+ struct au_cp_generic *cpg; -+ struct dentry *dst_parent; -+}; -+ -+static void au_call_cpup_single(void *args) -+{ -+ struct au_cpup_single_args *a = args; -+ -+ au_pin_hdir_acquire_nest(a->cpg->pin); -+ *a->errp = au_cpup_single(a->cpg, a->dst_parent); -+ au_pin_hdir_release(a->cpg->pin); -+} -+#endif -+ -+/* -+ * prevent SIGXFSZ in copy-up. -+ * testing CAP_MKNOD is for generic fs, -+ * but CAP_FSETID is for xfs only, currently. -+ */ -+static int au_cpup_sio_test(struct au_pin *pin, umode_t mode) -+{ -+ int do_sio; -+ struct super_block *sb; -+ struct inode *h_dir; -+ -+ do_sio = 0; -+ sb = au_pinned_parent(pin)->d_sb; -+ if (!au_wkq_test() -+ && (!au_sbi(sb)->si_plink_maint_pid -+ || au_plink_maint(sb, AuLock_NOPLM))) { -+ switch (mode & S_IFMT) { -+ case S_IFREG: -+ /* no condition about RLIMIT_FSIZE and the file size */ -+ do_sio = 1; -+ break; -+ case S_IFCHR: -+ case S_IFBLK: -+ do_sio = !capable(CAP_MKNOD); -+ break; -+ } -+ if (!do_sio) -+ do_sio = ((mode & (S_ISUID | S_ISGID)) -+ && !capable(CAP_FSETID)); -+ /* this workaround may be removed in the future */ -+ if (!do_sio) { -+ h_dir = au_pinned_h_dir(pin); -+ do_sio = h_dir->i_mode & S_ISVTX; -+ } -+ } -+ -+ return do_sio; -+} -+ -+#if 0 /* reserved */ -+int au_sio_cpup_single(struct au_cp_generic *cpg, struct dentry *dst_parent) -+{ -+ int err, wkq_err; -+ struct dentry *h_dentry; -+ -+ h_dentry = au_h_dptr(cpg->dentry, cpg->bsrc); -+ if (!au_cpup_sio_test(pin, d_inode(h_dentry)->i_mode)) -+ err = au_cpup_single(cpg, dst_parent); -+ else { -+ struct au_cpup_single_args args = { -+ .errp = &err, -+ .cpg = cpg, -+ .dst_parent = dst_parent -+ }; -+ wkq_err = au_wkq_wait(au_call_cpup_single, &args); -+ if (unlikely(wkq_err)) -+ err = wkq_err; -+ } -+ -+ return err; -+} -+#endif -+ -+/* -+ * copyup the @dentry from the first active lower branch to @bdst, -+ * using au_cpup_single(). -+ */ -+static int au_cpup_simple(struct au_cp_generic *cpg) -+{ -+ int err; -+ unsigned int flags_orig; -+ struct dentry *dentry; -+ -+ AuDebugOn(cpg->bsrc < 0); -+ -+ dentry = cpg->dentry; -+ DiMustWriteLock(dentry); -+ -+ err = au_lkup_neg(dentry, cpg->bdst, /*wh*/1); -+ if (!err) { -+ flags_orig = cpg->flags; -+ au_fset_cpup(cpg->flags, RENAME); -+ err = au_cpup_single(cpg, NULL); -+ cpg->flags = flags_orig; -+ if (!err) -+ return 0; /* success */ -+ -+ /* revert */ -+ au_set_h_dptr(dentry, cpg->bdst, NULL); -+ au_set_dbtop(dentry, cpg->bsrc); -+ } -+ -+ return err; -+} -+ -+struct au_cpup_simple_args { -+ int *errp; -+ struct au_cp_generic *cpg; -+}; -+ -+static void au_call_cpup_simple(void *args) -+{ -+ struct au_cpup_simple_args *a = args; -+ -+ au_pin_hdir_acquire_nest(a->cpg->pin); -+ *a->errp = au_cpup_simple(a->cpg); -+ au_pin_hdir_release(a->cpg->pin); -+} -+ -+static int au_do_sio_cpup_simple(struct au_cp_generic *cpg) -+{ -+ int err, wkq_err; -+ struct dentry *dentry, *parent; -+ struct file *h_file; -+ struct inode *h_dir; -+ struct user_namespace *h_userns; -+ -+ dentry = cpg->dentry; -+ h_file = NULL; -+ if (au_ftest_cpup(cpg->flags, HOPEN)) { -+ AuDebugOn(cpg->bsrc < 0); -+ h_file = au_h_open_pre(dentry, cpg->bsrc, /*force_wr*/0); -+ err = PTR_ERR(h_file); -+ if (IS_ERR(h_file)) -+ goto out; -+ } -+ -+ parent = dget_parent(dentry); -+ h_dir = au_h_iptr(d_inode(parent), cpg->bdst); -+ h_userns = au_sbr_userns(dentry->d_sb, cpg->bdst); -+ if (!au_test_h_perm_sio(h_userns, h_dir, MAY_EXEC | MAY_WRITE) -+ && !au_cpup_sio_test(cpg->pin, d_inode(dentry)->i_mode)) -+ err = au_cpup_simple(cpg); -+ else { -+ struct au_cpup_simple_args args = { -+ .errp = &err, -+ .cpg = cpg -+ }; -+ wkq_err = au_wkq_wait(au_call_cpup_simple, &args); -+ if (unlikely(wkq_err)) -+ err = wkq_err; -+ } -+ -+ dput(parent); -+ if (h_file) -+ au_h_open_post(dentry, cpg->bsrc, h_file); -+ -+out: -+ return err; -+} -+ -+int au_sio_cpup_simple(struct au_cp_generic *cpg) -+{ -+ aufs_bindex_t bsrc, bbot; -+ struct dentry *dentry, *h_dentry; -+ -+ if (cpg->bsrc < 0) { -+ dentry = cpg->dentry; -+ bbot = au_dbbot(dentry); -+ for (bsrc = cpg->bdst + 1; bsrc <= bbot; bsrc++) { -+ h_dentry = au_h_dptr(dentry, bsrc); -+ if (h_dentry) { -+ AuDebugOn(d_is_negative(h_dentry)); -+ break; -+ } -+ } -+ AuDebugOn(bsrc > bbot); -+ cpg->bsrc = bsrc; -+ } -+ AuDebugOn(cpg->bsrc <= cpg->bdst); -+ return au_do_sio_cpup_simple(cpg); -+} -+ -+int au_sio_cpdown_simple(struct au_cp_generic *cpg) -+{ -+ AuDebugOn(cpg->bdst <= cpg->bsrc); -+ return au_do_sio_cpup_simple(cpg); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * copyup the deleted file for writing. -+ */ -+static int au_do_cpup_wh(struct au_cp_generic *cpg, struct dentry *wh_dentry, -+ struct file *file) -+{ -+ int err; -+ unsigned int flags_orig; -+ aufs_bindex_t bsrc_orig; -+ struct au_dinfo *dinfo; -+ struct { -+ struct au_hdentry *hd; -+ struct dentry *h_dentry; -+ } hdst, hsrc; -+ -+ dinfo = au_di(cpg->dentry); -+ AuRwMustWriteLock(&dinfo->di_rwsem); -+ -+ bsrc_orig = cpg->bsrc; -+ cpg->bsrc = dinfo->di_btop; -+ hdst.hd = au_hdentry(dinfo, cpg->bdst); -+ hdst.h_dentry = hdst.hd->hd_dentry; -+ hdst.hd->hd_dentry = wh_dentry; -+ dinfo->di_btop = cpg->bdst; -+ -+ hsrc.h_dentry = NULL; -+ if (file) { -+ hsrc.hd = au_hdentry(dinfo, cpg->bsrc); -+ hsrc.h_dentry = hsrc.hd->hd_dentry; -+ hsrc.hd->hd_dentry = au_hf_top(file)->f_path.dentry; -+ } -+ flags_orig = cpg->flags; -+ cpg->flags = !AuCpup_DTIME; -+ err = au_cpup_single(cpg, /*h_parent*/NULL); -+ cpg->flags = flags_orig; -+ if (file) { -+ if (!err) -+ err = au_reopen_nondir(file); -+ hsrc.hd->hd_dentry = hsrc.h_dentry; -+ } -+ hdst.hd->hd_dentry = hdst.h_dentry; -+ dinfo->di_btop = cpg->bsrc; -+ cpg->bsrc = bsrc_orig; -+ -+ return err; -+} -+ -+static int au_cpup_wh(struct au_cp_generic *cpg, struct file *file) -+{ -+ int err; -+ aufs_bindex_t bdst; -+ struct au_dtime dt; -+ struct dentry *dentry, *parent, *h_parent, *wh_dentry; -+ struct au_branch *br; -+ struct path h_path; -+ -+ dentry = cpg->dentry; -+ bdst = cpg->bdst; -+ br = au_sbr(dentry->d_sb, bdst); -+ parent = dget_parent(dentry); -+ h_parent = au_h_dptr(parent, bdst); -+ wh_dentry = au_whtmp_lkup(h_parent, br, &dentry->d_name); -+ err = PTR_ERR(wh_dentry); -+ if (IS_ERR(wh_dentry)) -+ goto out; -+ -+ h_path.dentry = h_parent; -+ h_path.mnt = au_br_mnt(br); -+ au_dtime_store(&dt, parent, &h_path); -+ err = au_do_cpup_wh(cpg, wh_dentry, file); -+ 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); -+ } else -+ err = vfsub_rmdir(d_inode(h_parent), &h_path); -+ if (unlikely(err)) { -+ AuIOErr("failed remove copied-up tmp file %pd(%d)\n", -+ wh_dentry, err); -+ err = -EIO; -+ } -+ au_dtime_revert(&dt); -+ au_set_hi_wh(d_inode(dentry), bdst, wh_dentry); -+ -+out_wh: -+ dput(wh_dentry); -+out: -+ dput(parent); -+ return err; -+} -+ -+struct au_cpup_wh_args { -+ int *errp; -+ struct au_cp_generic *cpg; -+ struct file *file; -+}; -+ -+static void au_call_cpup_wh(void *args) -+{ -+ struct au_cpup_wh_args *a = args; -+ -+ au_pin_hdir_acquire_nest(a->cpg->pin); -+ *a->errp = au_cpup_wh(a->cpg, a->file); -+ au_pin_hdir_release(a->cpg->pin); -+} -+ -+int au_sio_cpup_wh(struct au_cp_generic *cpg, struct file *file) -+{ -+ int err, wkq_err; -+ aufs_bindex_t bdst; -+ struct dentry *dentry, *parent, *h_orph, *h_parent; -+ struct inode *dir, *h_dir, *h_tmpdir; -+ struct au_wbr *wbr; -+ struct au_pin wh_pin, *pin_orig; -+ struct user_namespace *h_userns; -+ -+ dentry = cpg->dentry; -+ bdst = cpg->bdst; -+ parent = dget_parent(dentry); -+ dir = d_inode(parent); -+ h_orph = NULL; -+ h_parent = NULL; -+ h_dir = au_igrab(au_h_iptr(dir, bdst)); -+ h_tmpdir = h_dir; -+ pin_orig = NULL; -+ if (!h_dir->i_nlink) { -+ wbr = au_sbr(dentry->d_sb, bdst)->br_wbr; -+ h_orph = wbr->wbr_orph; -+ -+ h_parent = dget(au_h_dptr(parent, bdst)); -+ au_set_h_dptr(parent, bdst, dget(h_orph)); -+ h_tmpdir = d_inode(h_orph); -+ au_set_h_iptr(dir, bdst, au_igrab(h_tmpdir), /*flags*/0); -+ -+ inode_lock_nested(h_tmpdir, AuLsc_I_PARENT3); -+ /* todo: au_h_open_pre()? */ -+ -+ pin_orig = cpg->pin; -+ au_pin_init(&wh_pin, dentry, bdst, AuLsc_DI_PARENT, -+ AuLsc_I_PARENT3, cpg->pin->udba, AuPin_DI_LOCKED); -+ cpg->pin = &wh_pin; -+ } -+ -+ h_userns = au_sbr_userns(dentry->d_sb, bdst); -+ if (!au_test_h_perm_sio(h_userns, h_tmpdir, MAY_EXEC | MAY_WRITE) -+ && !au_cpup_sio_test(cpg->pin, d_inode(dentry)->i_mode)) -+ err = au_cpup_wh(cpg, file); -+ else { -+ struct au_cpup_wh_args args = { -+ .errp = &err, -+ .cpg = cpg, -+ .file = file -+ }; -+ wkq_err = au_wkq_wait(au_call_cpup_wh, &args); -+ if (unlikely(wkq_err)) -+ err = wkq_err; -+ } -+ -+ if (h_orph) { -+ inode_unlock(h_tmpdir); -+ /* todo: au_h_open_post()? */ -+ au_set_h_iptr(dir, bdst, au_igrab(h_dir), /*flags*/0); -+ au_set_h_dptr(parent, bdst, h_parent); -+ AuDebugOn(!pin_orig); -+ cpg->pin = pin_orig; -+ } -+ iput(h_dir); -+ dput(parent); -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * generic routine for both of copy-up and copy-down. -+ */ -+/* cf. revalidate function in file.c */ -+int au_cp_dirs(struct dentry *dentry, aufs_bindex_t bdst, -+ int (*cp)(struct dentry *dentry, aufs_bindex_t bdst, -+ struct au_pin *pin, -+ struct dentry *h_parent, void *arg), -+ void *arg) -+{ -+ int err; -+ struct au_pin pin; -+ struct dentry *d, *parent, *h_parent, *real_parent, *h_dentry; -+ -+ err = 0; -+ parent = dget_parent(dentry); -+ if (IS_ROOT(parent)) -+ goto out; -+ -+ au_pin_init(&pin, dentry, bdst, AuLsc_DI_PARENT2, AuLsc_I_PARENT2, -+ au_opt_udba(dentry->d_sb), AuPin_MNT_WRITE); -+ -+ /* do not use au_dpage */ -+ real_parent = parent; -+ while (1) { -+ dput(parent); -+ parent = dget_parent(dentry); -+ h_parent = au_h_dptr(parent, bdst); -+ if (h_parent) -+ goto out; /* success */ -+ -+ /* find top dir which is necessary to cpup */ -+ do { -+ d = parent; -+ dput(parent); -+ parent = dget_parent(d); -+ di_read_lock_parent3(parent, !AuLock_IR); -+ h_parent = au_h_dptr(parent, bdst); -+ di_read_unlock(parent, !AuLock_IR); -+ } while (!h_parent); -+ -+ if (d != real_parent) -+ di_write_lock_child3(d); -+ -+ /* somebody else might create while we were sleeping */ -+ h_dentry = au_h_dptr(d, bdst); -+ if (!h_dentry || d_is_negative(h_dentry)) { -+ if (h_dentry) -+ au_update_dbtop(d); -+ -+ au_pin_set_dentry(&pin, d); -+ err = au_do_pin(&pin); -+ if (!err) { -+ err = cp(d, bdst, &pin, h_parent, arg); -+ au_unpin(&pin); -+ } -+ } -+ -+ if (d != real_parent) -+ di_write_unlock(d); -+ if (unlikely(err)) -+ break; -+ } -+ -+out: -+ dput(parent); -+ return err; -+} -+ -+static int au_cpup_dir(struct dentry *dentry, aufs_bindex_t bdst, -+ struct au_pin *pin, -+ struct dentry *h_parent __maybe_unused, -+ void *arg __maybe_unused) -+{ -+ struct au_cp_generic cpg = { -+ .dentry = dentry, -+ .bdst = bdst, -+ .bsrc = -1, -+ .len = 0, -+ .pin = pin, -+ .flags = AuCpup_DTIME -+ }; -+ return au_sio_cpup_simple(&cpg); -+} -+ -+int au_cpup_dirs(struct dentry *dentry, aufs_bindex_t bdst) -+{ -+ return au_cp_dirs(dentry, bdst, au_cpup_dir, NULL); -+} -+ -+int au_test_and_cpup_dirs(struct dentry *dentry, aufs_bindex_t bdst) -+{ -+ int err; -+ struct dentry *parent; -+ struct inode *dir; -+ -+ parent = dget_parent(dentry); -+ dir = d_inode(parent); -+ err = 0; -+ if (au_h_iptr(dir, bdst)) -+ goto out; -+ -+ di_read_unlock(parent, AuLock_IR); -+ di_write_lock_parent(parent); -+ /* someone else might change our inode while we were sleeping */ -+ if (!au_h_iptr(dir, bdst)) -+ err = au_cpup_dirs(dentry, bdst); -+ di_downgrade_lock(parent, AuLock_IR); -+ -+out: -+ dput(parent); -+ return err; -+} -diff -Naur null/fs/aufs/cpup.h linux-5.15.36/fs/aufs/cpup.h ---- /dev/null -+++ linux-5.15.36/fs/aufs/cpup.h 2022-05-10 16:51:39.867744220 +0300 -@@ -0,0 +1,100 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program. If not, see . -+ */ -+ -+/* -+ * copy-up/down functions -+ */ -+ -+#ifndef __AUFS_CPUP_H__ -+#define __AUFS_CPUP_H__ -+ -+#ifdef __KERNEL__ -+ -+#include -+ -+struct inode; -+struct file; -+struct au_pin; -+ -+void au_cpup_attr_flags(struct inode *dst, unsigned int iflags); -+void au_cpup_attr_timesizes(struct inode *inode); -+void au_cpup_attr_nlink(struct inode *inode, int force); -+void au_cpup_attr_changeable(struct inode *inode); -+void au_cpup_igen(struct inode *inode, struct inode *h_inode); -+void au_cpup_attr_all(struct inode *inode, int force); -+ -+/* ---------------------------------------------------------------------- */ -+ -+struct au_cp_generic { -+ struct dentry *dentry; -+ aufs_bindex_t bdst, bsrc; -+ loff_t len; -+ struct au_pin *pin; -+ unsigned int flags; -+}; -+ -+/* cpup flags */ -+#define AuCpup_DTIME 1 /* do dtime_store/revert */ -+#define AuCpup_KEEPLINO (1 << 1) /* do not clear the lower xino, -+ for link(2) */ -+#define AuCpup_RENAME (1 << 2) /* rename after cpup */ -+#define AuCpup_HOPEN (1 << 3) /* call h_open_pre/post() in -+ cpup */ -+#define AuCpup_OVERWRITE (1 << 4) /* allow overwriting the -+ existing entry */ -+#define AuCpup_RWDST (1 << 5) /* force write target even if -+ the branch is marked as RO */ -+ -+#ifndef CONFIG_AUFS_BR_HFSPLUS -+#undef AuCpup_HOPEN -+#define AuCpup_HOPEN 0 -+#endif -+ -+#define au_ftest_cpup(flags, name) ((flags) & AuCpup_##name) -+#define au_fset_cpup(flags, name) \ -+ do { (flags) |= AuCpup_##name; } while (0) -+#define au_fclr_cpup(flags, name) \ -+ do { (flags) &= ~AuCpup_##name; } while (0) -+ -+int au_copy_file(struct file *dst, struct file *src, loff_t len); -+int au_sio_cpup_simple(struct au_cp_generic *cpg); -+int au_sio_cpdown_simple(struct au_cp_generic *cpg); -+int au_sio_cpup_wh(struct au_cp_generic *cpg, struct file *file); -+ -+int au_cp_dirs(struct dentry *dentry, aufs_bindex_t bdst, -+ int (*cp)(struct dentry *dentry, aufs_bindex_t bdst, -+ struct au_pin *pin, -+ struct dentry *h_parent, void *arg), -+ void *arg); -+int au_cpup_dirs(struct dentry *dentry, aufs_bindex_t bdst); -+int au_test_and_cpup_dirs(struct dentry *dentry, aufs_bindex_t bdst); -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* keep timestamps when copyup */ -+struct au_dtime { -+ struct dentry *dt_dentry; -+ struct path dt_h_path; -+ struct timespec64 dt_atime, dt_mtime; -+}; -+void au_dtime_store(struct au_dtime *dt, struct dentry *dentry, -+ struct path *h_path); -+void au_dtime_revert(struct au_dtime *dt); -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_CPUP_H__ */ -diff -Naur null/fs/aufs/dbgaufs.c linux-5.15.36/fs/aufs/dbgaufs.c ---- /dev/null -+++ linux-5.15.36/fs/aufs/dbgaufs.c 2022-05-10 16:51:39.867744220 +0300 -@@ -0,0 +1,526 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program. If not, see . -+ */ -+ -+/* -+ * debugfs interface -+ */ -+ -+#include -+#include "aufs.h" -+ -+#ifndef CONFIG_SYSFS -+#error DEBUG_FS depends upon SYSFS -+#endif -+ -+static struct dentry *dbgaufs; -+static const mode_t dbgaufs_mode = 0444; -+ -+/* 20 is max digits length of ulong 64 */ -+struct dbgaufs_arg { -+ int n; -+ char a[20 * 4]; -+}; -+ -+/* -+ * common function for all XINO files -+ */ -+static int dbgaufs_xi_release(struct inode *inode __maybe_unused, -+ struct file *file) -+{ -+ void *p; -+ -+ p = file->private_data; -+ if (p) { -+ /* this is struct dbgaufs_arg */ -+ AuDebugOn(!au_kfree_sz_test(p)); -+ au_kfree_do_rcu(p); -+ } -+ return 0; -+} -+ -+static int dbgaufs_xi_open(struct file *xf, struct file *file, int do_fcnt, -+ int cnt) -+{ -+ int err; -+ struct kstat st; -+ struct dbgaufs_arg *p; -+ -+ err = -ENOMEM; -+ p = kmalloc(sizeof(*p), GFP_NOFS); -+ if (unlikely(!p)) -+ goto out; -+ -+ err = 0; -+ p->n = 0; -+ file->private_data = p; -+ if (!xf) -+ goto out; -+ -+ err = vfsub_getattr(&xf->f_path, &st); -+ if (!err) { -+ if (do_fcnt) -+ p->n = snprintf -+ (p->a, sizeof(p->a), "%d, %llux%u %lld\n", -+ cnt, st.blocks, st.blksize, -+ (long long)st.size); -+ else -+ p->n = snprintf(p->a, sizeof(p->a), "%llux%u %lld\n", -+ st.blocks, st.blksize, -+ (long long)st.size); -+ AuDebugOn(p->n >= sizeof(p->a)); -+ } else { -+ p->n = snprintf(p->a, sizeof(p->a), "err %d\n", err); -+ err = 0; -+ } -+ -+out: -+ return err; -+} -+ -+static ssize_t dbgaufs_xi_read(struct file *file, char __user *buf, -+ size_t count, loff_t *ppos) -+{ -+ struct dbgaufs_arg *p; -+ -+ p = file->private_data; -+ return simple_read_from_buffer(buf, count, ppos, p->a, p->n); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+struct dbgaufs_plink_arg { -+ int n; -+ char a[]; -+}; -+ -+static int dbgaufs_plink_release(struct inode *inode __maybe_unused, -+ struct file *file) -+{ -+ free_page((unsigned long)file->private_data); -+ return 0; -+} -+ -+static int dbgaufs_plink_open(struct inode *inode, struct file *file) -+{ -+ int err, i, limit; -+ unsigned long n, sum; -+ struct dbgaufs_plink_arg *p; -+ struct au_sbinfo *sbinfo; -+ struct super_block *sb; -+ struct hlist_bl_head *hbl; -+ -+ err = -ENOMEM; -+ p = (void *)get_zeroed_page(GFP_NOFS); -+ if (unlikely(!p)) -+ goto out; -+ -+ err = -EFBIG; -+ sbinfo = inode->i_private; -+ sb = sbinfo->si_sb; -+ si_noflush_read_lock(sb); -+ if (au_opt_test(au_mntflags(sb), PLINK)) { -+ limit = PAGE_SIZE - sizeof(p->n); -+ -+ /* the number of buckets */ -+ n = snprintf(p->a + p->n, limit, "%d\n", AuPlink_NHASH); -+ p->n += n; -+ limit -= n; -+ -+ sum = 0; -+ for (i = 0, hbl = sbinfo->si_plink; i < AuPlink_NHASH; -+ i++, hbl++) { -+ n = au_hbl_count(hbl); -+ sum += n; -+ -+ n = snprintf(p->a + p->n, limit, "%lu ", n); -+ p->n += n; -+ limit -= n; -+ if (unlikely(limit <= 0)) -+ goto out_free; -+ } -+ p->a[p->n - 1] = '\n'; -+ -+ /* the sum of plinks */ -+ n = snprintf(p->a + p->n, limit, "%lu\n", sum); -+ p->n += n; -+ limit -= n; -+ if (unlikely(limit <= 0)) -+ goto out_free; -+ } else { -+#define str "1\n0\n0\n" -+ p->n = sizeof(str) - 1; -+ strcpy(p->a, str); -+#undef str -+ } -+ si_read_unlock(sb); -+ -+ err = 0; -+ file->private_data = p; -+ goto out; /* success */ -+ -+out_free: -+ free_page((unsigned long)p); -+out: -+ return err; -+} -+ -+static ssize_t dbgaufs_plink_read(struct file *file, char __user *buf, -+ size_t count, loff_t *ppos) -+{ -+ struct dbgaufs_plink_arg *p; -+ -+ p = file->private_data; -+ return simple_read_from_buffer(buf, count, ppos, p->a, p->n); -+} -+ -+static const struct file_operations dbgaufs_plink_fop = { -+ .owner = THIS_MODULE, -+ .open = dbgaufs_plink_open, -+ .release = dbgaufs_plink_release, -+ .read = dbgaufs_plink_read -+}; -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int dbgaufs_xib_open(struct inode *inode, struct file *file) -+{ -+ int err; -+ struct au_sbinfo *sbinfo; -+ struct super_block *sb; -+ -+ sbinfo = inode->i_private; -+ sb = sbinfo->si_sb; -+ si_noflush_read_lock(sb); -+ err = dbgaufs_xi_open(sbinfo->si_xib, file, /*do_fcnt*/0, /*cnt*/0); -+ si_read_unlock(sb); -+ return err; -+} -+ -+static const struct file_operations dbgaufs_xib_fop = { -+ .owner = THIS_MODULE, -+ .open = dbgaufs_xib_open, -+ .release = dbgaufs_xi_release, -+ .read = dbgaufs_xi_read -+}; -+ -+/* ---------------------------------------------------------------------- */ -+ -+#define DbgaufsXi_PREFIX "xi" -+ -+static int dbgaufs_xino_open(struct inode *inode, struct file *file) -+{ -+ int err, idx; -+ long l; -+ aufs_bindex_t bindex; -+ char *p, a[sizeof(DbgaufsXi_PREFIX) + 8]; -+ struct au_sbinfo *sbinfo; -+ struct super_block *sb; -+ struct au_xino *xi; -+ struct file *xf; -+ struct qstr *name; -+ struct au_branch *br; -+ -+ err = -ENOENT; -+ name = &file->f_path.dentry->d_name; -+ if (unlikely(name->len < sizeof(DbgaufsXi_PREFIX) -+ || memcmp(name->name, DbgaufsXi_PREFIX, -+ sizeof(DbgaufsXi_PREFIX) - 1))) -+ goto out; -+ -+ AuDebugOn(name->len >= sizeof(a)); -+ memcpy(a, name->name, name->len); -+ a[name->len] = '\0'; -+ p = strchr(a, '-'); -+ if (p) -+ *p = '\0'; -+ err = kstrtol(a + sizeof(DbgaufsXi_PREFIX) - 1, 10, &l); -+ if (unlikely(err)) -+ goto out; -+ bindex = l; -+ idx = 0; -+ if (p) { -+ err = kstrtol(p + 1, 10, &l); -+ if (unlikely(err)) -+ goto out; -+ idx = l; -+ } -+ -+ err = -ENOENT; -+ sbinfo = inode->i_private; -+ sb = sbinfo->si_sb; -+ si_noflush_read_lock(sb); -+ if (unlikely(bindex < 0 || bindex > au_sbbot(sb))) -+ goto out_si; -+ br = au_sbr(sb, bindex); -+ xi = br->br_xino; -+ if (unlikely(idx >= xi->xi_nfile)) -+ goto out_si; -+ xf = au_xino_file(xi, idx); -+ if (xf) -+ err = dbgaufs_xi_open(xf, file, /*do_fcnt*/1, -+ au_xino_count(br)); -+ -+out_si: -+ si_read_unlock(sb); -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+static const struct file_operations dbgaufs_xino_fop = { -+ .owner = THIS_MODULE, -+ .open = dbgaufs_xino_open, -+ .release = dbgaufs_xi_release, -+ .read = dbgaufs_xi_read -+}; -+ -+void dbgaufs_xino_del(struct au_branch *br) -+{ -+ struct dentry *dbgaufs; -+ -+ dbgaufs = br->br_dbgaufs; -+ if (!dbgaufs) -+ return; -+ -+ br->br_dbgaufs = NULL; -+ /* debugfs acquires the parent i_mutex */ -+ lockdep_off(); -+ debugfs_remove(dbgaufs); -+ lockdep_on(); -+} -+ -+void dbgaufs_brs_del(struct super_block *sb, aufs_bindex_t bindex) -+{ -+ aufs_bindex_t bbot; -+ struct au_branch *br; -+ -+ if (!au_sbi(sb)->si_dbgaufs) -+ return; -+ -+ bbot = au_sbbot(sb); -+ for (; bindex <= bbot; bindex++) { -+ br = au_sbr(sb, bindex); -+ dbgaufs_xino_del(br); -+ } -+} -+ -+static void dbgaufs_br_do_add(struct super_block *sb, aufs_bindex_t bindex, -+ unsigned int idx, struct dentry *parent, -+ struct au_sbinfo *sbinfo) -+{ -+ struct au_branch *br; -+ struct dentry *d; -+ /* "xi" bindex(5) "-" idx(2) NULL */ -+ char name[sizeof(DbgaufsXi_PREFIX) + 8]; -+ -+ if (!idx) -+ snprintf(name, sizeof(name), DbgaufsXi_PREFIX "%d", bindex); -+ else -+ snprintf(name, sizeof(name), DbgaufsXi_PREFIX "%d-%u", -+ bindex, idx); -+ br = au_sbr(sb, bindex); -+ if (br->br_dbgaufs) { -+ struct qstr qstr = QSTR_INIT(name, strlen(name)); -+ -+ if (!au_qstreq(&br->br_dbgaufs->d_name, &qstr)) { -+ /* debugfs acquires the parent i_mutex */ -+ lockdep_off(); -+ d = debugfs_rename(parent, br->br_dbgaufs, parent, -+ name); -+ lockdep_on(); -+ if (unlikely(!d)) -+ pr_warn("failed renaming %pd/%s, ignored.\n", -+ parent, name); -+ } -+ } else { -+ lockdep_off(); -+ br->br_dbgaufs = debugfs_create_file(name, dbgaufs_mode, parent, -+ sbinfo, &dbgaufs_xino_fop); -+ lockdep_on(); -+ if (unlikely(!br->br_dbgaufs)) -+ pr_warn("failed creating %pd/%s, ignored.\n", -+ parent, name); -+ } -+} -+ -+static void dbgaufs_br_add(struct super_block *sb, aufs_bindex_t bindex, -+ struct dentry *parent, struct au_sbinfo *sbinfo) -+{ -+ struct au_branch *br; -+ struct au_xino *xi; -+ unsigned int u; -+ -+ br = au_sbr(sb, bindex); -+ xi = br->br_xino; -+ for (u = 0; u < xi->xi_nfile; u++) -+ dbgaufs_br_do_add(sb, bindex, u, parent, sbinfo); -+} -+ -+void dbgaufs_brs_add(struct super_block *sb, aufs_bindex_t bindex, int topdown) -+{ -+ struct au_sbinfo *sbinfo; -+ struct dentry *parent; -+ aufs_bindex_t bbot; -+ -+ if (!au_opt_test(au_mntflags(sb), XINO)) -+ return; -+ -+ sbinfo = au_sbi(sb); -+ parent = sbinfo->si_dbgaufs; -+ if (!parent) -+ return; -+ -+ bbot = au_sbbot(sb); -+ if (topdown) -+ for (; bindex <= bbot; bindex++) -+ dbgaufs_br_add(sb, bindex, parent, sbinfo); -+ else -+ for (; bbot >= bindex; bbot--) -+ dbgaufs_br_add(sb, bbot, parent, sbinfo); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+#ifdef CONFIG_AUFS_EXPORT -+static int dbgaufs_xigen_open(struct inode *inode, struct file *file) -+{ -+ int err; -+ struct au_sbinfo *sbinfo; -+ struct super_block *sb; -+ -+ sbinfo = inode->i_private; -+ sb = sbinfo->si_sb; -+ si_noflush_read_lock(sb); -+ err = dbgaufs_xi_open(sbinfo->si_xigen, file, /*do_fcnt*/0, /*cnt*/0); -+ si_read_unlock(sb); -+ return err; -+} -+ -+static const struct file_operations dbgaufs_xigen_fop = { -+ .owner = THIS_MODULE, -+ .open = dbgaufs_xigen_open, -+ .release = dbgaufs_xi_release, -+ .read = dbgaufs_xi_read -+}; -+ -+static int dbgaufs_xigen_init(struct au_sbinfo *sbinfo) -+{ -+ int err; -+ -+ /* -+ * This function is a dynamic '__init' function actually, -+ * so the tiny check for si_rwsem is unnecessary. -+ */ -+ /* AuRwMustWriteLock(&sbinfo->si_rwsem); */ -+ -+ err = -EIO; -+ sbinfo->si_dbgaufs_xigen = debugfs_create_file -+ ("xigen", dbgaufs_mode, sbinfo->si_dbgaufs, sbinfo, -+ &dbgaufs_xigen_fop); -+ if (sbinfo->si_dbgaufs_xigen) -+ err = 0; -+ -+ return err; -+} -+#else -+static int dbgaufs_xigen_init(struct au_sbinfo *sbinfo) -+{ -+ return 0; -+} -+#endif /* CONFIG_AUFS_EXPORT */ -+ -+/* ---------------------------------------------------------------------- */ -+ -+void dbgaufs_si_fin(struct au_sbinfo *sbinfo) -+{ -+ /* -+ * This function is a dynamic '__fin' function actually, -+ * so the tiny check for si_rwsem is unnecessary. -+ */ -+ /* AuRwMustWriteLock(&sbinfo->si_rwsem); */ -+ -+ debugfs_remove_recursive(sbinfo->si_dbgaufs); -+ sbinfo->si_dbgaufs = NULL; -+} -+ -+int dbgaufs_si_init(struct au_sbinfo *sbinfo) -+{ -+ int err; -+ char name[SysaufsSiNameLen]; -+ -+ /* -+ * This function is a dynamic '__init' function actually, -+ * so the tiny check for si_rwsem is unnecessary. -+ */ -+ /* AuRwMustWriteLock(&sbinfo->si_rwsem); */ -+ -+ err = -ENOENT; -+ if (!dbgaufs) { -+ AuErr1("/debug/aufs is uninitialized\n"); -+ goto out; -+ } -+ -+ err = -EIO; -+ sysaufs_name(sbinfo, name); -+ sbinfo->si_dbgaufs = debugfs_create_dir(name, dbgaufs); -+ if (unlikely(!sbinfo->si_dbgaufs)) -+ goto out; -+ -+ /* regardless plink/noplink option */ -+ sbinfo->si_dbgaufs_plink = debugfs_create_file -+ ("plink", dbgaufs_mode, sbinfo->si_dbgaufs, sbinfo, -+ &dbgaufs_plink_fop); -+ if (unlikely(!sbinfo->si_dbgaufs_plink)) -+ goto out_dir; -+ -+ /* regardless xino/noxino option */ -+ sbinfo->si_dbgaufs_xib = debugfs_create_file -+ ("xib", dbgaufs_mode, sbinfo->si_dbgaufs, sbinfo, -+ &dbgaufs_xib_fop); -+ if (unlikely(!sbinfo->si_dbgaufs_xib)) -+ goto out_dir; -+ -+ err = dbgaufs_xigen_init(sbinfo); -+ if (!err) -+ goto out; /* success */ -+ -+out_dir: -+ dbgaufs_si_fin(sbinfo); -+out: -+ if (unlikely(err)) -+ pr_err("debugfs/aufs failed\n"); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+void dbgaufs_fin(void) -+{ -+ debugfs_remove(dbgaufs); -+} -+ -+int __init dbgaufs_init(void) -+{ -+ int err; -+ -+ err = -EIO; -+ dbgaufs = debugfs_create_dir(AUFS_NAME, NULL); -+ if (dbgaufs) -+ err = 0; -+ return err; -+} -diff -Naur null/fs/aufs/dbgaufs.h linux-5.15.36/fs/aufs/dbgaufs.h ---- /dev/null -+++ linux-5.15.36/fs/aufs/dbgaufs.h 2022-05-10 16:51:39.867744220 +0300 -@@ -0,0 +1,53 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program. If not, see . -+ */ -+ -+/* -+ * debugfs interface -+ */ -+ -+#ifndef __DBGAUFS_H__ -+#define __DBGAUFS_H__ -+ -+#ifdef __KERNEL__ -+ -+struct super_block; -+struct au_sbinfo; -+struct au_branch; -+ -+#ifdef CONFIG_DEBUG_FS -+/* dbgaufs.c */ -+void dbgaufs_xino_del(struct au_branch *br); -+void dbgaufs_brs_del(struct super_block *sb, aufs_bindex_t bindex); -+void dbgaufs_brs_add(struct super_block *sb, aufs_bindex_t bindex, int topdown); -+void dbgaufs_si_fin(struct au_sbinfo *sbinfo); -+int dbgaufs_si_init(struct au_sbinfo *sbinfo); -+void dbgaufs_fin(void); -+int __init dbgaufs_init(void); -+#else -+AuStubVoid(dbgaufs_xino_del, struct au_branch *br) -+AuStubVoid(dbgaufs_brs_del, struct super_block *sb, aufs_bindex_t bindex) -+AuStubVoid(dbgaufs_brs_add, struct super_block *sb, aufs_bindex_t bindex, -+ int topdown) -+AuStubVoid(dbgaufs_si_fin, struct au_sbinfo *sbinfo) -+AuStubInt0(dbgaufs_si_init, struct au_sbinfo *sbinfo) -+AuStubVoid(dbgaufs_fin, void) -+AuStubInt0(__init dbgaufs_init, void) -+#endif /* CONFIG_DEBUG_FS */ -+ -+#endif /* __KERNEL__ */ -+#endif /* __DBGAUFS_H__ */ -diff -Naur null/fs/aufs/dcsub.c linux-5.15.36/fs/aufs/dcsub.c ---- /dev/null -+++ linux-5.15.36/fs/aufs/dcsub.c 2022-05-10 16:51:39.867744220 +0300 -@@ -0,0 +1,225 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program. If not, see . -+ */ -+ -+/* -+ * sub-routines for dentry cache -+ */ -+ -+#include "aufs.h" -+ -+static void au_dpage_free(struct au_dpage *dpage) -+{ -+ int i; -+ struct dentry **p; -+ -+ p = dpage->dentries; -+ for (i = 0; i < dpage->ndentry; i++) -+ dput(*p++); -+ free_page((unsigned long)dpage->dentries); -+} -+ -+int au_dpages_init(struct au_dcsub_pages *dpages, gfp_t gfp) -+{ -+ int err; -+ void *p; -+ -+ err = -ENOMEM; -+ dpages->dpages = kmalloc(sizeof(*dpages->dpages), gfp); -+ if (unlikely(!dpages->dpages)) -+ goto out; -+ -+ p = (void *)__get_free_page(gfp); -+ if (unlikely(!p)) -+ goto out_dpages; -+ -+ dpages->dpages[0].ndentry = 0; -+ dpages->dpages[0].dentries = p; -+ dpages->ndpage = 1; -+ return 0; /* success */ -+ -+out_dpages: -+ au_kfree_try_rcu(dpages->dpages); -+out: -+ return err; -+} -+ -+void au_dpages_free(struct au_dcsub_pages *dpages) -+{ -+ int i; -+ struct au_dpage *p; -+ -+ p = dpages->dpages; -+ for (i = 0; i < dpages->ndpage; i++) -+ au_dpage_free(p++); -+ au_kfree_try_rcu(dpages->dpages); -+} -+ -+static int au_dpages_append(struct au_dcsub_pages *dpages, -+ struct dentry *dentry, gfp_t gfp) -+{ -+ int err, sz; -+ struct au_dpage *dpage; -+ void *p; -+ -+ dpage = dpages->dpages + dpages->ndpage - 1; -+ sz = PAGE_SIZE / sizeof(dentry); -+ if (unlikely(dpage->ndentry >= sz)) { -+ AuLabel(new dpage); -+ err = -ENOMEM; -+ sz = dpages->ndpage * sizeof(*dpages->dpages); -+ p = au_kzrealloc(dpages->dpages, sz, -+ sz + sizeof(*dpages->dpages), gfp, -+ /*may_shrink*/0); -+ if (unlikely(!p)) -+ goto out; -+ -+ dpages->dpages = p; -+ dpage = dpages->dpages + dpages->ndpage; -+ p = (void *)__get_free_page(gfp); -+ if (unlikely(!p)) -+ goto out; -+ -+ dpage->ndentry = 0; -+ dpage->dentries = p; -+ dpages->ndpage++; -+ } -+ -+ AuDebugOn(au_dcount(dentry) <= 0); -+ dpage->dentries[dpage->ndentry++] = dget_dlock(dentry); -+ return 0; /* success */ -+ -+out: -+ return err; -+} -+ -+/* todo: BAD approach */ -+/* copied from linux/fs/dcache.c */ -+enum d_walk_ret { -+ D_WALK_CONTINUE, -+ D_WALK_QUIT, -+ D_WALK_NORETRY, -+ D_WALK_SKIP, -+}; -+ -+extern void d_walk(struct dentry *parent, void *data, -+ enum d_walk_ret (*enter)(void *, struct dentry *)); -+ -+struct ac_dpages_arg { -+ int err; -+ struct au_dcsub_pages *dpages; -+ struct super_block *sb; -+ au_dpages_test test; -+ void *arg; -+}; -+ -+static enum d_walk_ret au_call_dpages_append(void *_arg, struct dentry *dentry) -+{ -+ enum d_walk_ret ret; -+ struct ac_dpages_arg *arg = _arg; -+ -+ ret = D_WALK_CONTINUE; -+ if (dentry->d_sb == arg->sb -+ && !IS_ROOT(dentry) -+ && au_dcount(dentry) > 0 -+ && au_di(dentry) -+ && (!arg->test || arg->test(dentry, arg->arg))) { -+ arg->err = au_dpages_append(arg->dpages, dentry, GFP_ATOMIC); -+ if (unlikely(arg->err)) -+ ret = D_WALK_QUIT; -+ } -+ -+ return ret; -+} -+ -+int au_dcsub_pages(struct au_dcsub_pages *dpages, struct dentry *root, -+ au_dpages_test test, void *arg) -+{ -+ struct ac_dpages_arg args = { -+ .err = 0, -+ .dpages = dpages, -+ .sb = root->d_sb, -+ .test = test, -+ .arg = arg -+ }; -+ -+ d_walk(root, &args, au_call_dpages_append); -+ -+ return args.err; -+} -+ -+int au_dcsub_pages_rev(struct au_dcsub_pages *dpages, struct dentry *dentry, -+ int do_include, au_dpages_test test, void *arg) -+{ -+ int err; -+ -+ err = 0; -+ write_seqlock(&rename_lock); -+ spin_lock(&dentry->d_lock); -+ if (do_include -+ && au_dcount(dentry) > 0 -+ && (!test || test(dentry, arg))) -+ err = au_dpages_append(dpages, dentry, GFP_ATOMIC); -+ spin_unlock(&dentry->d_lock); -+ if (unlikely(err)) -+ goto out; -+ -+ /* -+ * RCU for vfsmount is unnecessary since this is a traverse in a single -+ * mount -+ */ -+ while (!IS_ROOT(dentry)) { -+ dentry = dentry->d_parent; /* rename_lock is locked */ -+ spin_lock(&dentry->d_lock); -+ if (au_dcount(dentry) > 0 -+ && (!test || test(dentry, arg))) -+ err = au_dpages_append(dpages, dentry, GFP_ATOMIC); -+ spin_unlock(&dentry->d_lock); -+ if (unlikely(err)) -+ break; -+ } -+ -+out: -+ write_sequnlock(&rename_lock); -+ return err; -+} -+ -+static inline int au_dcsub_dpages_aufs(struct dentry *dentry, void *arg) -+{ -+ return au_di(dentry) && dentry->d_sb == arg; -+} -+ -+int au_dcsub_pages_rev_aufs(struct au_dcsub_pages *dpages, -+ struct dentry *dentry, int do_include) -+{ -+ return au_dcsub_pages_rev(dpages, dentry, do_include, -+ au_dcsub_dpages_aufs, dentry->d_sb); -+} -+ -+int au_test_subdir(struct dentry *d1, struct dentry *d2) -+{ -+ struct path path[2] = { -+ { -+ .dentry = d1 -+ }, -+ { -+ .dentry = d2 -+ } -+ }; -+ -+ return path_is_under(path + 0, path + 1); -+} -diff -Naur null/fs/aufs/dcsub.h linux-5.15.36/fs/aufs/dcsub.h ---- /dev/null -+++ linux-5.15.36/fs/aufs/dcsub.h 2022-05-10 16:51:39.867744220 +0300 -@@ -0,0 +1,137 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program. If not, see . -+ */ -+ -+/* -+ * sub-routines for dentry cache -+ */ -+ -+#ifndef __AUFS_DCSUB_H__ -+#define __AUFS_DCSUB_H__ -+ -+#ifdef __KERNEL__ -+ -+#include -+#include -+ -+struct au_dpage { -+ int ndentry; -+ struct dentry **dentries; -+}; -+ -+struct au_dcsub_pages { -+ int ndpage; -+ struct au_dpage *dpages; -+}; -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* dcsub.c */ -+int au_dpages_init(struct au_dcsub_pages *dpages, gfp_t gfp); -+void au_dpages_free(struct au_dcsub_pages *dpages); -+typedef int (*au_dpages_test)(struct dentry *dentry, void *arg); -+int au_dcsub_pages(struct au_dcsub_pages *dpages, struct dentry *root, -+ au_dpages_test test, void *arg); -+int au_dcsub_pages_rev(struct au_dcsub_pages *dpages, struct dentry *dentry, -+ int do_include, au_dpages_test test, void *arg); -+int au_dcsub_pages_rev_aufs(struct au_dcsub_pages *dpages, -+ struct dentry *dentry, int do_include); -+int au_test_subdir(struct dentry *d1, struct dentry *d2); -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * todo: in linux-3.13, several similar (but faster) helpers are added to -+ * include/linux/dcache.h. Try them (in the future). -+ */ -+ -+static inline int au_d_hashed_positive(struct dentry *d) -+{ -+ int err; -+ struct inode *inode = d_inode(d); -+ -+ err = 0; -+ if (unlikely(d_unhashed(d) -+ || d_is_negative(d) -+ || !inode->i_nlink)) -+ err = -ENOENT; -+ return err; -+} -+ -+static inline int au_d_linkable(struct dentry *d) -+{ -+ int err; -+ struct inode *inode = d_inode(d); -+ -+ err = au_d_hashed_positive(d); -+ if (err -+ && d_is_positive(d) -+ && (inode->i_state & I_LINKABLE)) -+ err = 0; -+ return err; -+} -+ -+static inline int au_d_alive(struct dentry *d) -+{ -+ int err; -+ struct inode *inode; -+ -+ err = 0; -+ if (!IS_ROOT(d)) -+ err = au_d_hashed_positive(d); -+ else { -+ inode = d_inode(d); -+ if (unlikely(d_unlinked(d) -+ || d_is_negative(d) -+ || !inode->i_nlink)) -+ err = -ENOENT; -+ } -+ return err; -+} -+ -+static inline int au_alive_dir(struct dentry *d) -+{ -+ int err; -+ -+ err = au_d_alive(d); -+ if (unlikely(err || IS_DEADDIR(d_inode(d)))) -+ err = -ENOENT; -+ return err; -+} -+ -+static inline int au_qstreq(struct qstr *a, struct qstr *b) -+{ -+ return a->len == b->len -+ && !memcmp(a->name, b->name, a->len); -+} -+ -+/* -+ * by the commit -+ * 360f547 2015-01-25 dcache: let the dentry count go down to zero without -+ * taking d_lock -+ * the type of d_lockref.count became int, but the inlined function d_count() -+ * still returns unsigned int. -+ * I don't know why. Maybe it is for every d_count() users? -+ * Anyway au_dcount() lives on. -+ */ -+static inline int au_dcount(struct dentry *d) -+{ -+ return (int)d_count(d); -+} -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_DCSUB_H__ */ -diff -Naur null/fs/aufs/debug.c linux-5.15.36/fs/aufs/debug.c ---- /dev/null -+++ linux-5.15.36/fs/aufs/debug.c 2022-05-10 16:51:39.868744219 +0300 -@@ -0,0 +1,444 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program. If not, see . -+ */ -+ -+/* -+ * debug print functions -+ */ -+ -+#include -+#include "aufs.h" -+ -+/* Returns 0, or -errno. arg is in kp->arg. */ -+static int param_atomic_t_set(const char *val, const struct kernel_param *kp) -+{ -+ int err, n; -+ -+ err = kstrtoint(val, 0, &n); -+ if (!err) { -+ if (n > 0) -+ au_debug_on(); -+ else -+ au_debug_off(); -+ } -+ return err; -+} -+ -+/* Returns length written or -errno. Buffer is 4k (ie. be short!) */ -+static int param_atomic_t_get(char *buffer, const struct kernel_param *kp) -+{ -+ atomic_t *a; -+ -+ a = kp->arg; -+ return sprintf(buffer, "%d", atomic_read(a)); -+} -+ -+static struct kernel_param_ops param_ops_atomic_t = { -+ .set = param_atomic_t_set, -+ .get = param_atomic_t_get -+ /* void (*free)(void *arg) */ -+}; -+ -+atomic_t aufs_debug = ATOMIC_INIT(0); -+MODULE_PARM_DESC(debug, "debug print"); -+module_param_named(debug, aufs_debug, atomic_t, 0664); -+ -+DEFINE_MUTEX(au_dbg_mtx); /* just to serialize the dbg msgs */ -+char *au_plevel = KERN_DEBUG; -+#define dpri(fmt, ...) do { \ -+ if ((au_plevel \ -+ && strcmp(au_plevel, KERN_DEBUG)) \ -+ || au_debug_test()) \ -+ printk("%s" fmt, au_plevel, ##__VA_ARGS__); \ -+} while (0) -+ -+/* ---------------------------------------------------------------------- */ -+ -+void au_dpri_whlist(struct au_nhash *whlist) -+{ -+ unsigned long ul, n; -+ struct hlist_head *head; -+ struct au_vdir_wh *pos; -+ -+ n = whlist->nh_num; -+ head = whlist->nh_head; -+ for (ul = 0; ul < n; ul++) { -+ hlist_for_each_entry(pos, head, wh_hash) -+ dpri("b%d, %.*s, %d\n", -+ pos->wh_bindex, -+ pos->wh_str.len, pos->wh_str.name, -+ pos->wh_str.len); -+ head++; -+ } -+} -+ -+void au_dpri_vdir(struct au_vdir *vdir) -+{ -+ unsigned long ul; -+ union au_vdir_deblk_p p; -+ unsigned char *o; -+ -+ if (!vdir || IS_ERR(vdir)) { -+ dpri("err %ld\n", PTR_ERR(vdir)); -+ return; -+ } -+ -+ dpri("deblk %u, nblk %lu, deblk %p, last{%lu, %p}, ver %llu\n", -+ vdir->vd_deblk_sz, vdir->vd_nblk, vdir->vd_deblk, -+ vdir->vd_last.ul, vdir->vd_last.p.deblk, vdir->vd_version); -+ for (ul = 0; ul < vdir->vd_nblk; ul++) { -+ p.deblk = vdir->vd_deblk[ul]; -+ o = p.deblk; -+ dpri("[%lu]: %p\n", ul, o); -+ } -+} -+ -+static int do_pri_inode(aufs_bindex_t bindex, struct inode *inode, int hn, -+ struct dentry *wh) -+{ -+ char *n = NULL; -+ int l = 0; -+ -+ if (!inode || IS_ERR(inode)) { -+ dpri("i%d: err %ld\n", bindex, PTR_ERR(inode)); -+ return -1; -+ } -+ -+ /* the type of i_blocks depends upon CONFIG_LBDAF */ -+ BUILD_BUG_ON(sizeof(inode->i_blocks) != sizeof(unsigned long) -+ && sizeof(inode->i_blocks) != sizeof(u64)); -+ if (wh) { -+ n = (void *)wh->d_name.name; -+ l = wh->d_name.len; -+ } -+ -+ dpri("i%d: %p, i%lu, %s, cnt %d, nl %u, 0%o, sz %llu, blk %llu," -+ " hn %d, ct %lld, np %lu, st 0x%lx, f 0x%x, v %llu, g %x%s%.*s\n", -+ bindex, inode, -+ inode->i_ino, inode->i_sb ? au_sbtype(inode->i_sb) : "??", -+ atomic_read(&inode->i_count), inode->i_nlink, inode->i_mode, -+ i_size_read(inode), (unsigned long long)inode->i_blocks, -+ hn, (long long)timespec64_to_ns(&inode->i_ctime) & 0x0ffff, -+ inode->i_mapping ? inode->i_mapping->nrpages : 0, -+ inode->i_state, inode->i_flags, inode_peek_iversion(inode), -+ inode->i_generation, -+ l ? ", wh " : "", l, n); -+ return 0; -+} -+ -+void au_dpri_inode(struct inode *inode) -+{ -+ struct au_iinfo *iinfo; -+ struct au_hinode *hi; -+ aufs_bindex_t bindex; -+ int err, hn; -+ -+ err = do_pri_inode(-1, inode, -1, NULL); -+ if (err || !au_test_aufs(inode->i_sb) || au_is_bad_inode(inode)) -+ return; -+ -+ iinfo = au_ii(inode); -+ dpri("i-1: btop %d, bbot %d, gen %d\n", -+ iinfo->ii_btop, iinfo->ii_bbot, au_iigen(inode, NULL)); -+ if (iinfo->ii_btop < 0) -+ return; -+ hn = 0; -+ for (bindex = iinfo->ii_btop; bindex <= iinfo->ii_bbot; bindex++) { -+ hi = au_hinode(iinfo, bindex); -+ hn = !!au_hn(hi); -+ do_pri_inode(bindex, hi->hi_inode, hn, hi->hi_whdentry); -+ } -+} -+ -+void au_dpri_dalias(struct inode *inode) -+{ -+ struct dentry *d; -+ -+ spin_lock(&inode->i_lock); -+ hlist_for_each_entry(d, &inode->i_dentry, d_u.d_alias) -+ au_dpri_dentry(d); -+ spin_unlock(&inode->i_lock); -+} -+ -+static int do_pri_dentry(aufs_bindex_t bindex, struct dentry *dentry) -+{ -+ struct dentry *wh = NULL; -+ int hn; -+ struct inode *inode; -+ struct au_iinfo *iinfo; -+ struct au_hinode *hi; -+ -+ if (!dentry || IS_ERR(dentry)) { -+ dpri("d%d: err %ld\n", bindex, PTR_ERR(dentry)); -+ return -1; -+ } -+ /* do not call dget_parent() here */ -+ /* note: access d_xxx without d_lock */ -+ dpri("d%d: %p, %pd2?, %s, cnt %d, flags 0x%x, %shashed\n", -+ bindex, dentry, dentry, -+ dentry->d_sb ? au_sbtype(dentry->d_sb) : "??", -+ au_dcount(dentry), dentry->d_flags, -+ d_unhashed(dentry) ? "un" : ""); -+ hn = -1; -+ inode = NULL; -+ if (d_is_positive(dentry)) -+ inode = d_inode(dentry); -+ if (inode -+ && au_test_aufs(dentry->d_sb) -+ && bindex >= 0 -+ && !au_is_bad_inode(inode)) { -+ iinfo = au_ii(inode); -+ hi = au_hinode(iinfo, bindex); -+ hn = !!au_hn(hi); -+ wh = hi->hi_whdentry; -+ } -+ do_pri_inode(bindex, inode, hn, wh); -+ return 0; -+} -+ -+void au_dpri_dentry(struct dentry *dentry) -+{ -+ struct au_dinfo *dinfo; -+ aufs_bindex_t bindex; -+ int err; -+ -+ err = do_pri_dentry(-1, dentry); -+ if (err || !au_test_aufs(dentry->d_sb)) -+ return; -+ -+ dinfo = au_di(dentry); -+ if (!dinfo) -+ return; -+ dpri("d-1: btop %d, bbot %d, bwh %d, bdiropq %d, gen %d, tmp %d\n", -+ dinfo->di_btop, dinfo->di_bbot, -+ dinfo->di_bwh, dinfo->di_bdiropq, au_digen(dentry), -+ dinfo->di_tmpfile); -+ if (dinfo->di_btop < 0) -+ return; -+ for (bindex = dinfo->di_btop; bindex <= dinfo->di_bbot; bindex++) -+ do_pri_dentry(bindex, au_hdentry(dinfo, bindex)->hd_dentry); -+} -+ -+static int do_pri_file(aufs_bindex_t bindex, struct file *file) -+{ -+ char a[32]; -+ -+ if (!file || IS_ERR(file)) { -+ dpri("f%d: err %ld\n", bindex, PTR_ERR(file)); -+ return -1; -+ } -+ a[0] = 0; -+ if (bindex < 0 -+ && !IS_ERR_OR_NULL(file->f_path.dentry) -+ && au_test_aufs(file->f_path.dentry->d_sb) -+ && au_fi(file)) -+ snprintf(a, sizeof(a), ", gen %d, mmapped %d", -+ au_figen(file), atomic_read(&au_fi(file)->fi_mmapped)); -+ dpri("f%d: mode 0x%x, flags 0%o, cnt %ld, v %llu, pos %llu%s\n", -+ bindex, file->f_mode, file->f_flags, (long)file_count(file), -+ file->f_version, file->f_pos, a); -+ if (!IS_ERR_OR_NULL(file->f_path.dentry)) -+ do_pri_dentry(bindex, file->f_path.dentry); -+ return 0; -+} -+ -+void au_dpri_file(struct file *file) -+{ -+ struct au_finfo *finfo; -+ struct au_fidir *fidir; -+ struct au_hfile *hfile; -+ aufs_bindex_t bindex; -+ int err; -+ -+ err = do_pri_file(-1, file); -+ if (err -+ || IS_ERR_OR_NULL(file->f_path.dentry) -+ || !au_test_aufs(file->f_path.dentry->d_sb)) -+ return; -+ -+ finfo = au_fi(file); -+ if (!finfo) -+ return; -+ if (finfo->fi_btop < 0) -+ return; -+ fidir = finfo->fi_hdir; -+ if (!fidir) -+ do_pri_file(finfo->fi_btop, finfo->fi_htop.hf_file); -+ else -+ for (bindex = finfo->fi_btop; -+ bindex >= 0 && bindex <= fidir->fd_bbot; -+ bindex++) { -+ hfile = fidir->fd_hfile + bindex; -+ do_pri_file(bindex, hfile ? hfile->hf_file : NULL); -+ } -+} -+ -+static int do_pri_br(aufs_bindex_t bindex, struct au_branch *br) -+{ -+ struct vfsmount *mnt; -+ struct super_block *sb; -+ -+ if (!br || IS_ERR(br)) -+ goto out; -+ mnt = au_br_mnt(br); -+ if (!mnt || IS_ERR(mnt)) -+ goto out; -+ sb = mnt->mnt_sb; -+ if (!sb || IS_ERR(sb)) -+ goto out; -+ -+ dpri("s%d: {perm 0x%x, id %d, wbr %p}, " -+ "%s, dev 0x%02x%02x, flags 0x%lx, cnt %d, active %d, " -+ "xino %d\n", -+ bindex, br->br_perm, br->br_id, br->br_wbr, -+ au_sbtype(sb), MAJOR(sb->s_dev), MINOR(sb->s_dev), -+ sb->s_flags, sb->s_count, -+ atomic_read(&sb->s_active), -+ !!au_xino_file(br->br_xino, /*idx*/-1)); -+ return 0; -+ -+out: -+ dpri("s%d: err %ld\n", bindex, PTR_ERR(br)); -+ return -1; -+} -+ -+void au_dpri_sb(struct super_block *sb) -+{ -+ struct au_sbinfo *sbinfo; -+ aufs_bindex_t bindex; -+ int err; -+ /* to reduce stack size */ -+ struct { -+ struct vfsmount mnt; -+ struct au_branch fake; -+ } *a; -+ -+ /* this function can be called from magic sysrq */ -+ a = kzalloc(sizeof(*a), GFP_ATOMIC); -+ if (unlikely(!a)) { -+ dpri("no memory\n"); -+ return; -+ } -+ -+ a->mnt.mnt_sb = sb; -+ a->fake.br_path.mnt = &a->mnt; -+ err = do_pri_br(-1, &a->fake); -+ au_kfree_rcu(a); -+ dpri("dev 0x%x\n", sb->s_dev); -+ if (err || !au_test_aufs(sb)) -+ return; -+ -+ sbinfo = au_sbi(sb); -+ if (!sbinfo) -+ return; -+ dpri("nw %d, gen %u, kobj %d\n", -+ atomic_read(&sbinfo->si_nowait.nw_len), sbinfo->si_generation, -+ kref_read(&sbinfo->si_kobj.kref)); -+ for (bindex = 0; bindex <= sbinfo->si_bbot; bindex++) -+ do_pri_br(bindex, sbinfo->si_branch[0 + bindex]); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+void __au_dbg_verify_dinode(struct dentry *dentry, const char *func, int line) -+{ -+ struct inode *h_inode, *inode = d_inode(dentry); -+ struct dentry *h_dentry; -+ aufs_bindex_t bindex, bbot, bi; -+ -+ if (!inode /* || au_di(dentry)->di_lsc == AuLsc_DI_TMP */) -+ return; -+ -+ bbot = au_dbbot(dentry); -+ bi = au_ibbot(inode); -+ if (bi < bbot) -+ bbot = bi; -+ bindex = au_dbtop(dentry); -+ bi = au_ibtop(inode); -+ if (bi > bindex) -+ bindex = bi; -+ -+ for (; bindex <= bbot; bindex++) { -+ h_dentry = au_h_dptr(dentry, bindex); -+ if (!h_dentry) -+ continue; -+ h_inode = au_h_iptr(inode, bindex); -+ if (unlikely(h_inode != d_inode(h_dentry))) { -+ au_debug_on(); -+ AuDbg("b%d, %s:%d\n", bindex, func, line); -+ AuDbgDentry(dentry); -+ AuDbgInode(inode); -+ au_debug_off(); -+ if (au_test_fuse(h_inode->i_sb)) -+ WARN_ON_ONCE(1); -+ else -+ BUG(); -+ } -+ } -+} -+ -+void au_dbg_verify_gen(struct dentry *parent, unsigned int sigen) -+{ -+ int err, i, j; -+ struct au_dcsub_pages dpages; -+ struct au_dpage *dpage; -+ struct dentry **dentries; -+ -+ err = au_dpages_init(&dpages, GFP_NOFS); -+ AuDebugOn(err); -+ err = au_dcsub_pages_rev_aufs(&dpages, parent, /*do_include*/1); -+ AuDebugOn(err); -+ for (i = dpages.ndpage - 1; !err && i >= 0; i--) { -+ dpage = dpages.dpages + i; -+ dentries = dpage->dentries; -+ for (j = dpage->ndentry - 1; !err && j >= 0; j--) -+ AuDebugOn(au_digen_test(dentries[j], sigen)); -+ } -+ au_dpages_free(&dpages); -+} -+ -+void au_dbg_verify_kthread(void) -+{ -+ if (au_wkq_test()) { -+ au_dbg_blocked(); -+ /* -+ * It may be recursive, but udba=notify between two aufs mounts, -+ * where a single ro branch is shared, is not a problem. -+ */ -+ /* WARN_ON(1); */ -+ } -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+int __init au_debug_init(void) -+{ -+ aufs_bindex_t bindex; -+ struct au_vdir_destr destr; -+ -+ bindex = -1; -+ AuDebugOn(bindex >= 0); -+ -+ destr.len = -1; -+ AuDebugOn(destr.len < NAME_MAX); -+ -+#ifdef CONFIG_4KSTACKS -+ pr_warn("CONFIG_4KSTACKS is defined.\n"); -+#endif -+ -+ return 0; -+} -diff -Naur null/fs/aufs/debug.h linux-5.15.36/fs/aufs/debug.h ---- /dev/null -+++ linux-5.15.36/fs/aufs/debug.h 2022-05-10 16:51:39.868744219 +0300 -@@ -0,0 +1,226 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program. If not, see . -+ */ -+ -+/* -+ * debug print functions -+ */ -+ -+#ifndef __AUFS_DEBUG_H__ -+#define __AUFS_DEBUG_H__ -+ -+#ifdef __KERNEL__ -+ -+#include -+#include -+#include -+#include -+ -+#ifdef CONFIG_AUFS_DEBUG -+#define AuDebugOn(a) BUG_ON(a) -+ -+/* module parameter */ -+extern atomic_t aufs_debug; -+static inline void au_debug_on(void) -+{ -+ atomic_inc(&aufs_debug); -+} -+static inline void au_debug_off(void) -+{ -+ atomic_dec_if_positive(&aufs_debug); -+} -+ -+static inline int au_debug_test(void) -+{ -+ return atomic_read(&aufs_debug) > 0; -+} -+#else -+#define AuDebugOn(a) do {} while (0) -+AuStubVoid(au_debug_on, void) -+AuStubVoid(au_debug_off, void) -+AuStubInt0(au_debug_test, void) -+#endif /* CONFIG_AUFS_DEBUG */ -+ -+#define param_check_atomic_t(name, p) __param_check(name, p, atomic_t) -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* debug print */ -+ -+#define AuDbg(fmt, ...) do { \ -+ if (au_debug_test()) \ -+ pr_debug("DEBUG: " fmt, ##__VA_ARGS__); \ -+} while (0) -+#define AuLabel(l) AuDbg(#l "\n") -+#define AuIOErr(fmt, ...) pr_err("I/O Error, " fmt, ##__VA_ARGS__) -+#define AuWarn1(fmt, ...) do { \ -+ static unsigned char _c; \ -+ if (!_c++) \ -+ pr_warn(fmt, ##__VA_ARGS__); \ -+} while (0) -+ -+#define AuErr1(fmt, ...) do { \ -+ static unsigned char _c; \ -+ if (!_c++) \ -+ pr_err(fmt, ##__VA_ARGS__); \ -+} while (0) -+ -+#define AuIOErr1(fmt, ...) do { \ -+ static unsigned char _c; \ -+ if (!_c++) \ -+ AuIOErr(fmt, ##__VA_ARGS__); \ -+} while (0) -+ -+#define AuUnsupportMsg "This operation is not supported." \ -+ " Please report this application to aufs-users ML." -+#define AuUnsupport(fmt, ...) do { \ -+ pr_err(AuUnsupportMsg "\n" fmt, ##__VA_ARGS__); \ -+ dump_stack(); \ -+} while (0) -+ -+#define AuTraceErr(e) do { \ -+ if (unlikely((e) < 0)) \ -+ AuDbg("err %d\n", (int)(e)); \ -+} while (0) -+ -+#define AuTraceErrPtr(p) do { \ -+ if (IS_ERR(p)) \ -+ AuDbg("err %ld\n", PTR_ERR(p)); \ -+} while (0) -+ -+/* dirty macros for debug print, use with "%.*s" and caution */ -+#define AuLNPair(qstr) (qstr)->len, (qstr)->name -+ -+/* ---------------------------------------------------------------------- */ -+ -+struct dentry; -+#ifdef CONFIG_AUFS_DEBUG -+extern struct mutex au_dbg_mtx; -+extern char *au_plevel; -+struct au_nhash; -+void au_dpri_whlist(struct au_nhash *whlist); -+struct au_vdir; -+void au_dpri_vdir(struct au_vdir *vdir); -+struct inode; -+void au_dpri_inode(struct inode *inode); -+void au_dpri_dalias(struct inode *inode); -+void au_dpri_dentry(struct dentry *dentry); -+struct file; -+void au_dpri_file(struct file *filp); -+struct super_block; -+void au_dpri_sb(struct super_block *sb); -+ -+#define au_dbg_verify_dinode(d) __au_dbg_verify_dinode(d, __func__, __LINE__) -+void __au_dbg_verify_dinode(struct dentry *dentry, const char *func, int line); -+void au_dbg_verify_gen(struct dentry *parent, unsigned int sigen); -+void au_dbg_verify_kthread(void); -+ -+int __init au_debug_init(void); -+ -+#define AuDbgWhlist(w) do { \ -+ mutex_lock(&au_dbg_mtx); \ -+ AuDbg(#w "\n"); \ -+ au_dpri_whlist(w); \ -+ mutex_unlock(&au_dbg_mtx); \ -+} while (0) -+ -+#define AuDbgVdir(v) do { \ -+ mutex_lock(&au_dbg_mtx); \ -+ AuDbg(#v "\n"); \ -+ au_dpri_vdir(v); \ -+ mutex_unlock(&au_dbg_mtx); \ -+} while (0) -+ -+#define AuDbgInode(i) do { \ -+ mutex_lock(&au_dbg_mtx); \ -+ AuDbg(#i "\n"); \ -+ au_dpri_inode(i); \ -+ mutex_unlock(&au_dbg_mtx); \ -+} while (0) -+ -+#define AuDbgDAlias(i) do { \ -+ mutex_lock(&au_dbg_mtx); \ -+ AuDbg(#i "\n"); \ -+ au_dpri_dalias(i); \ -+ mutex_unlock(&au_dbg_mtx); \ -+} while (0) -+ -+#define AuDbgDentry(d) do { \ -+ mutex_lock(&au_dbg_mtx); \ -+ AuDbg(#d "\n"); \ -+ au_dpri_dentry(d); \ -+ mutex_unlock(&au_dbg_mtx); \ -+} while (0) -+ -+#define AuDbgFile(f) do { \ -+ mutex_lock(&au_dbg_mtx); \ -+ AuDbg(#f "\n"); \ -+ au_dpri_file(f); \ -+ mutex_unlock(&au_dbg_mtx); \ -+} while (0) -+ -+#define AuDbgSb(sb) do { \ -+ mutex_lock(&au_dbg_mtx); \ -+ AuDbg(#sb "\n"); \ -+ au_dpri_sb(sb); \ -+ mutex_unlock(&au_dbg_mtx); \ -+} while (0) -+ -+#define AuDbgSym(addr) do { \ -+ char sym[KSYM_SYMBOL_LEN]; \ -+ sprint_symbol(sym, (unsigned long)addr); \ -+ AuDbg("%s\n", sym); \ -+} while (0) -+#else -+AuStubVoid(au_dbg_verify_dinode, struct dentry *dentry) -+AuStubVoid(au_dbg_verify_gen, struct dentry *parent, unsigned int sigen) -+AuStubVoid(au_dbg_verify_kthread, void) -+AuStubInt0(__init au_debug_init, void) -+ -+#define AuDbgWhlist(w) do {} while (0) -+#define AuDbgVdir(v) do {} while (0) -+#define AuDbgInode(i) do {} while (0) -+#define AuDbgDAlias(i) do {} while (0) -+#define AuDbgDentry(d) do {} while (0) -+#define AuDbgFile(f) do {} while (0) -+#define AuDbgSb(sb) do {} while (0) -+#define AuDbgSym(addr) do {} while (0) -+#endif /* CONFIG_AUFS_DEBUG */ -+ -+/* ---------------------------------------------------------------------- */ -+ -+#ifdef CONFIG_AUFS_MAGIC_SYSRQ -+int __init au_sysrq_init(void); -+void au_sysrq_fin(void); -+ -+#ifdef CONFIG_HW_CONSOLE -+#define au_dbg_blocked() do { \ -+ WARN_ON(1); \ -+ handle_sysrq('w'); \ -+} while (0) -+#else -+AuStubVoid(au_dbg_blocked, void) -+#endif -+ -+#else -+AuStubInt0(__init au_sysrq_init, void) -+AuStubVoid(au_sysrq_fin, void) -+AuStubVoid(au_dbg_blocked, void) -+#endif /* CONFIG_AUFS_MAGIC_SYSRQ */ -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_DEBUG_H__ */ -diff -Naur null/fs/aufs/dentry.c linux-5.15.36/fs/aufs/dentry.c ---- /dev/null -+++ linux-5.15.36/fs/aufs/dentry.c 2022-05-10 16:51:39.868744219 +0300 -@@ -0,0 +1,1168 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program. If not, see . -+ */ -+ -+/* -+ * lookup and dentry operations -+ */ -+ -+#include -+#include "aufs.h" -+ -+/* -+ * returns positive/negative dentry, NULL or an error. -+ * NULL means whiteout-ed or not-found. -+ */ -+static struct dentry* -+au_do_lookup(struct dentry *h_parent, struct dentry *dentry, -+ aufs_bindex_t bindex, struct au_do_lookup_args *args) -+{ -+ struct dentry *h_dentry; -+ struct inode *h_inode; -+ struct au_branch *br; -+ struct user_namespace *h_userns; -+ struct path h_path; -+ int wh_found, opq; -+ unsigned char wh_able; -+ const unsigned char allow_neg = !!au_ftest_lkup(args->flags, ALLOW_NEG); -+ const unsigned char ignore_perm = !!au_ftest_lkup(args->flags, -+ IGNORE_PERM); -+ -+ wh_found = 0; -+ br = au_sbr(dentry->d_sb, bindex); -+ h_path.dentry = h_parent; -+ h_path.mnt = au_br_mnt(br); -+ h_userns = au_br_userns(br); -+ wh_able = !!au_br_whable(br->br_perm); -+ if (wh_able) -+ wh_found = au_wh_test(h_userns, &h_path, &args->whname, -+ ignore_perm); -+ h_dentry = ERR_PTR(wh_found); -+ if (!wh_found) -+ goto real_lookup; -+ if (unlikely(wh_found < 0)) -+ goto out; -+ -+ /* We found a whiteout */ -+ /* au_set_dbbot(dentry, bindex); */ -+ au_set_dbwh(dentry, bindex); -+ if (!allow_neg) -+ return NULL; /* success */ -+ -+real_lookup: -+ if (!ignore_perm) -+ h_dentry = vfsub_lkup_one(args->name, &h_path); -+ else -+ h_dentry = au_sio_lkup_one(h_userns, args->name, &h_path); -+ if (IS_ERR(h_dentry)) { -+ if (PTR_ERR(h_dentry) == -ENAMETOOLONG -+ && !allow_neg) -+ h_dentry = NULL; -+ goto out; -+ } -+ -+ h_inode = d_inode(h_dentry); -+ if (d_is_negative(h_dentry)) { -+ if (!allow_neg) -+ goto out_neg; -+ } else if (wh_found -+ || (args->type && args->type != (h_inode->i_mode & S_IFMT))) -+ goto out_neg; -+ else if (au_ftest_lkup(args->flags, DIRREN) -+ /* && h_inode */ -+ && !au_dr_lkup_h_ino(args, bindex, h_inode->i_ino)) { -+ AuDbg("b%d %pd ignored hi%llu\n", bindex, h_dentry, -+ (unsigned long long)h_inode->i_ino); -+ goto out_neg; -+ } -+ -+ if (au_dbbot(dentry) <= bindex) -+ au_set_dbbot(dentry, bindex); -+ if (au_dbtop(dentry) < 0 || bindex < au_dbtop(dentry)) -+ au_set_dbtop(dentry, bindex); -+ au_set_h_dptr(dentry, bindex, h_dentry); -+ -+ if (!d_is_dir(h_dentry) -+ || !wh_able -+ || (d_really_is_positive(dentry) && !d_is_dir(dentry))) -+ goto out; /* success */ -+ -+ h_path.dentry = h_dentry; -+ inode_lock_shared_nested(h_inode, AuLsc_I_CHILD); -+ opq = au_diropq_test(h_userns, &h_path); -+ inode_unlock_shared(h_inode); -+ if (opq > 0) -+ au_set_dbdiropq(dentry, bindex); -+ else if (unlikely(opq < 0)) { -+ au_set_h_dptr(dentry, bindex, NULL); -+ h_dentry = ERR_PTR(opq); -+ } -+ goto out; -+ -+out_neg: -+ dput(h_dentry); -+ h_dentry = NULL; -+out: -+ return h_dentry; -+} -+ -+static int au_test_shwh(struct super_block *sb, const struct qstr *name) -+{ -+ if (unlikely(!au_opt_test(au_mntflags(sb), SHWH) -+ && !strncmp(name->name, AUFS_WH_PFX, AUFS_WH_PFX_LEN))) -+ return -EPERM; -+ return 0; -+} -+ -+/* -+ * returns the number of lower positive dentries, -+ * otherwise an error. -+ * can be called at unlinking with @type is zero. -+ */ -+int au_lkup_dentry(struct dentry *dentry, aufs_bindex_t btop, -+ unsigned int flags) -+{ -+ int npositive, err; -+ aufs_bindex_t bindex, btail, bdiropq; -+ unsigned char isdir, dirperm1, dirren; -+ struct au_do_lookup_args args = { -+ .flags = flags, -+ .name = &dentry->d_name -+ }; -+ struct dentry *parent; -+ struct super_block *sb; -+ -+ sb = dentry->d_sb; -+ err = au_test_shwh(sb, args.name); -+ if (unlikely(err)) -+ goto out; -+ -+ err = au_wh_name_alloc(&args.whname, args.name); -+ if (unlikely(err)) -+ goto out; -+ -+ isdir = !!d_is_dir(dentry); -+ dirperm1 = !!au_opt_test(au_mntflags(sb), DIRPERM1); -+ dirren = !!au_opt_test(au_mntflags(sb), DIRREN); -+ if (dirren) -+ au_fset_lkup(args.flags, DIRREN); -+ -+ npositive = 0; -+ parent = dget_parent(dentry); -+ btail = au_dbtaildir(parent); -+ for (bindex = btop; bindex <= btail; bindex++) { -+ struct dentry *h_parent, *h_dentry; -+ struct inode *h_inode, *h_dir; -+ struct au_branch *br; -+ -+ h_dentry = au_h_dptr(dentry, bindex); -+ if (h_dentry) { -+ if (d_is_positive(h_dentry)) -+ npositive++; -+ break; -+ } -+ h_parent = au_h_dptr(parent, bindex); -+ if (!h_parent || !d_is_dir(h_parent)) -+ continue; -+ -+ if (dirren) { -+ /* if the inum matches, then use the prepared name */ -+ err = au_dr_lkup_name(&args, bindex); -+ if (unlikely(err)) -+ goto out_parent; -+ } -+ -+ h_dir = d_inode(h_parent); -+ inode_lock_shared_nested(h_dir, AuLsc_I_PARENT); -+ h_dentry = au_do_lookup(h_parent, dentry, bindex, &args); -+ inode_unlock_shared(h_dir); -+ err = PTR_ERR(h_dentry); -+ if (IS_ERR(h_dentry)) -+ goto out_parent; -+ if (h_dentry) -+ au_fclr_lkup(args.flags, ALLOW_NEG); -+ if (dirperm1) -+ au_fset_lkup(args.flags, IGNORE_PERM); -+ -+ if (au_dbwh(dentry) == bindex) -+ break; -+ if (!h_dentry) -+ continue; -+ if (d_is_negative(h_dentry)) -+ continue; -+ h_inode = d_inode(h_dentry); -+ npositive++; -+ if (!args.type) -+ args.type = h_inode->i_mode & S_IFMT; -+ if (args.type != S_IFDIR) -+ break; -+ else if (isdir) { -+ /* the type of lower may be different */ -+ bdiropq = au_dbdiropq(dentry); -+ if (bdiropq >= 0 && bdiropq <= bindex) -+ break; -+ } -+ br = au_sbr(sb, bindex); -+ if (dirren -+ && au_dr_hino_test_add(&br->br_dirren, h_inode->i_ino, -+ /*add_ent*/NULL)) { -+ /* prepare next name to lookup */ -+ err = au_dr_lkup(&args, dentry, bindex); -+ if (unlikely(err)) -+ goto out_parent; -+ } -+ } -+ -+ if (npositive) { -+ AuLabel(positive); -+ au_update_dbtop(dentry); -+ } -+ err = npositive; -+ if (unlikely(!au_opt_test(au_mntflags(sb), UDBA_NONE) -+ && au_dbtop(dentry) < 0)) { -+ err = -EIO; -+ AuIOErr("both of real entry and whiteout found, %pd, err %d\n", -+ dentry, err); -+ } -+ -+out_parent: -+ dput(parent); -+ au_kfree_try_rcu(args.whname.name); -+ if (dirren) -+ au_dr_lkup_fin(&args); -+out: -+ return err; -+} -+ -+struct dentry *au_sio_lkup_one(struct user_namespace *userns, struct qstr *name, -+ struct path *ppath) -+{ -+ struct dentry *dentry; -+ int wkq_err; -+ -+ if (!au_test_h_perm_sio(userns, d_inode(ppath->dentry), MAY_EXEC)) -+ dentry = vfsub_lkup_one(name, ppath); -+ else { -+ struct vfsub_lkup_one_args args = { -+ .errp = &dentry, -+ .name = name, -+ .ppath = ppath -+ }; -+ -+ wkq_err = au_wkq_wait(vfsub_call_lkup_one, &args); -+ if (unlikely(wkq_err)) -+ dentry = ERR_PTR(wkq_err); -+ } -+ -+ return dentry; -+} -+ -+/* -+ * lookup @dentry on @bindex which should be negative. -+ */ -+int au_lkup_neg(struct dentry *dentry, aufs_bindex_t bindex, int wh) -+{ -+ int err; -+ struct dentry *parent, *h_dentry; -+ struct au_branch *br; -+ struct user_namespace *h_userns; -+ struct path h_ppath; -+ -+ parent = dget_parent(dentry); -+ br = au_sbr(dentry->d_sb, bindex); -+ h_ppath.dentry = au_h_dptr(parent, bindex); -+ h_ppath.mnt = au_br_mnt(br); -+ h_userns = au_br_userns(br); -+ if (wh) -+ h_dentry = au_whtmp_lkup(h_ppath.dentry, br, &dentry->d_name); -+ else -+ h_dentry = au_sio_lkup_one(h_userns, &dentry->d_name, &h_ppath); -+ err = PTR_ERR(h_dentry); -+ if (IS_ERR(h_dentry)) -+ goto out; -+ if (unlikely(d_is_positive(h_dentry))) { -+ err = -EIO; -+ AuIOErr("%pd should be negative on b%d.\n", h_dentry, bindex); -+ dput(h_dentry); -+ goto out; -+ } -+ -+ err = 0; -+ if (bindex < au_dbtop(dentry)) -+ au_set_dbtop(dentry, bindex); -+ if (au_dbbot(dentry) < bindex) -+ au_set_dbbot(dentry, bindex); -+ au_set_h_dptr(dentry, bindex, h_dentry); -+ -+out: -+ dput(parent); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* subset of struct inode */ -+struct au_iattr { -+ unsigned long i_ino; -+ /* unsigned int i_nlink; */ -+ kuid_t i_uid; -+ kgid_t i_gid; -+ u64 i_version; -+/* -+ loff_t i_size; -+ blkcnt_t i_blocks; -+*/ -+ umode_t i_mode; -+}; -+ -+static void au_iattr_save(struct au_iattr *ia, struct inode *h_inode) -+{ -+ ia->i_ino = h_inode->i_ino; -+ /* ia->i_nlink = h_inode->i_nlink; */ -+ ia->i_uid = h_inode->i_uid; -+ ia->i_gid = h_inode->i_gid; -+ ia->i_version = inode_query_iversion(h_inode); -+/* -+ ia->i_size = h_inode->i_size; -+ ia->i_blocks = h_inode->i_blocks; -+*/ -+ ia->i_mode = (h_inode->i_mode & S_IFMT); -+} -+ -+static int au_iattr_test(struct au_iattr *ia, struct inode *h_inode) -+{ -+ return ia->i_ino != h_inode->i_ino -+ /* || ia->i_nlink != h_inode->i_nlink */ -+ || !uid_eq(ia->i_uid, h_inode->i_uid) -+ || !gid_eq(ia->i_gid, h_inode->i_gid) -+ || !inode_eq_iversion(h_inode, ia->i_version) -+/* -+ || ia->i_size != h_inode->i_size -+ || ia->i_blocks != h_inode->i_blocks -+*/ -+ || ia->i_mode != (h_inode->i_mode & S_IFMT); -+} -+ -+static int au_h_verify_dentry(struct dentry *h_dentry, struct dentry *h_parent, -+ struct au_branch *br) -+{ -+ int err; -+ struct au_iattr ia; -+ struct inode *h_inode; -+ struct dentry *h_d; -+ struct super_block *h_sb; -+ struct path h_ppath; -+ -+ err = 0; -+ memset(&ia, -1, sizeof(ia)); -+ h_sb = h_dentry->d_sb; -+ h_inode = NULL; -+ if (d_is_positive(h_dentry)) { -+ h_inode = d_inode(h_dentry); -+ au_iattr_save(&ia, h_inode); -+ } else if (au_test_nfs(h_sb) || au_test_fuse(h_sb)) -+ /* nfs d_revalidate may return 0 for negative dentry */ -+ /* fuse d_revalidate always return 0 for negative dentry */ -+ goto out; -+ -+ /* main purpose is namei.c:cached_lookup() and d_revalidate */ -+ h_ppath.dentry = h_parent; -+ h_ppath.mnt = au_br_mnt(br); -+ h_d = vfsub_lkup_one(&h_dentry->d_name, &h_ppath); -+ err = PTR_ERR(h_d); -+ if (IS_ERR(h_d)) -+ goto out; -+ -+ err = 0; -+ if (unlikely(h_d != h_dentry -+ || d_inode(h_d) != h_inode -+ || (h_inode && au_iattr_test(&ia, h_inode)))) -+ err = au_busy_or_stale(); -+ dput(h_d); -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+int au_h_verify(struct dentry *h_dentry, unsigned int udba, struct inode *h_dir, -+ struct dentry *h_parent, struct au_branch *br) -+{ -+ int err; -+ -+ err = 0; -+ if (udba == AuOpt_UDBA_REVAL -+ && !au_test_fs_remote(h_dentry->d_sb)) { -+ IMustLock(h_dir); -+ err = (d_inode(h_dentry->d_parent) != h_dir); -+ } else if (udba != AuOpt_UDBA_NONE) -+ err = au_h_verify_dentry(h_dentry, h_parent, br); -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int au_do_refresh_hdentry(struct dentry *dentry, struct dentry *parent) -+{ -+ int err; -+ aufs_bindex_t new_bindex, bindex, bbot, bwh, bdiropq; -+ struct au_hdentry tmp, *p, *q; -+ struct au_dinfo *dinfo; -+ struct super_block *sb; -+ -+ DiMustWriteLock(dentry); -+ -+ sb = dentry->d_sb; -+ dinfo = au_di(dentry); -+ bbot = dinfo->di_bbot; -+ bwh = dinfo->di_bwh; -+ bdiropq = dinfo->di_bdiropq; -+ bindex = dinfo->di_btop; -+ p = au_hdentry(dinfo, bindex); -+ for (; bindex <= bbot; bindex++, p++) { -+ if (!p->hd_dentry) -+ continue; -+ -+ new_bindex = au_br_index(sb, p->hd_id); -+ if (new_bindex == bindex) -+ continue; -+ -+ if (dinfo->di_bwh == bindex) -+ bwh = new_bindex; -+ if (dinfo->di_bdiropq == bindex) -+ bdiropq = new_bindex; -+ if (new_bindex < 0) { -+ au_hdput(p); -+ p->hd_dentry = NULL; -+ continue; -+ } -+ -+ /* swap two lower dentries, and loop again */ -+ q = au_hdentry(dinfo, new_bindex); -+ tmp = *q; -+ *q = *p; -+ *p = tmp; -+ if (tmp.hd_dentry) { -+ bindex--; -+ p--; -+ } -+ } -+ -+ dinfo->di_bwh = -1; -+ if (bwh >= 0 && bwh <= au_sbbot(sb) && au_sbr_whable(sb, bwh)) -+ dinfo->di_bwh = bwh; -+ -+ dinfo->di_bdiropq = -1; -+ if (bdiropq >= 0 -+ && bdiropq <= au_sbbot(sb) -+ && au_sbr_whable(sb, bdiropq)) -+ dinfo->di_bdiropq = bdiropq; -+ -+ err = -EIO; -+ dinfo->di_btop = -1; -+ dinfo->di_bbot = -1; -+ bbot = au_dbbot(parent); -+ bindex = 0; -+ p = au_hdentry(dinfo, bindex); -+ for (; bindex <= bbot; bindex++, p++) -+ if (p->hd_dentry) { -+ dinfo->di_btop = bindex; -+ break; -+ } -+ -+ if (dinfo->di_btop >= 0) { -+ bindex = bbot; -+ p = au_hdentry(dinfo, bindex); -+ for (; bindex >= 0; bindex--, p--) -+ if (p->hd_dentry) { -+ dinfo->di_bbot = bindex; -+ err = 0; -+ break; -+ } -+ } -+ -+ return err; -+} -+ -+static void au_do_hide(struct dentry *dentry) -+{ -+ struct inode *inode; -+ -+ if (d_really_is_positive(dentry)) { -+ inode = d_inode(dentry); -+ if (!d_is_dir(dentry)) { -+ if (inode->i_nlink && !d_unhashed(dentry)) -+ drop_nlink(inode); -+ } else { -+ clear_nlink(inode); -+ /* stop next lookup */ -+ inode->i_flags |= S_DEAD; -+ } -+ smp_mb(); /* necessary? */ -+ } -+ d_drop(dentry); -+} -+ -+static int au_hide_children(struct dentry *parent) -+{ -+ int err, i, j, ndentry; -+ struct au_dcsub_pages dpages; -+ struct au_dpage *dpage; -+ struct dentry *dentry; -+ -+ err = au_dpages_init(&dpages, GFP_NOFS); -+ if (unlikely(err)) -+ goto out; -+ err = au_dcsub_pages(&dpages, parent, NULL, NULL); -+ if (unlikely(err)) -+ goto out_dpages; -+ -+ /* in reverse order */ -+ for (i = dpages.ndpage - 1; i >= 0; i--) { -+ dpage = dpages.dpages + i; -+ ndentry = dpage->ndentry; -+ for (j = ndentry - 1; j >= 0; j--) { -+ dentry = dpage->dentries[j]; -+ if (dentry != parent) -+ au_do_hide(dentry); -+ } -+ } -+ -+out_dpages: -+ au_dpages_free(&dpages); -+out: -+ return err; -+} -+ -+static void au_hide(struct dentry *dentry) -+{ -+ int err; -+ -+ AuDbgDentry(dentry); -+ if (d_is_dir(dentry)) { -+ /* shrink_dcache_parent(dentry); */ -+ err = au_hide_children(dentry); -+ if (unlikely(err)) -+ AuIOErr("%pd, failed hiding children, ignored %d\n", -+ dentry, err); -+ } -+ au_do_hide(dentry); -+} -+ -+/* -+ * By adding a dirty branch, a cached dentry may be affected in various ways. -+ * -+ * a dirty branch is added -+ * - on the top of layers -+ * - in the middle of layers -+ * - to the bottom of layers -+ * -+ * on the added branch there exists -+ * - a whiteout -+ * - a diropq -+ * - a same named entry -+ * + exist -+ * * negative --> positive -+ * * positive --> positive -+ * - type is unchanged -+ * - type is changed -+ * + doesn't exist -+ * * negative --> negative -+ * * positive --> negative (rejected by au_br_del() for non-dir case) -+ * - none -+ */ -+static int au_refresh_by_dinfo(struct dentry *dentry, struct au_dinfo *dinfo, -+ struct au_dinfo *tmp) -+{ -+ int err; -+ aufs_bindex_t bindex, bbot; -+ struct { -+ struct dentry *dentry; -+ struct inode *inode; -+ mode_t mode; -+ } orig_h, tmp_h = { -+ .dentry = NULL -+ }; -+ struct au_hdentry *hd; -+ struct inode *inode, *h_inode; -+ struct dentry *h_dentry; -+ -+ err = 0; -+ AuDebugOn(dinfo->di_btop < 0); -+ orig_h.mode = 0; -+ orig_h.dentry = au_hdentry(dinfo, dinfo->di_btop)->hd_dentry; -+ orig_h.inode = NULL; -+ if (d_is_positive(orig_h.dentry)) { -+ orig_h.inode = d_inode(orig_h.dentry); -+ orig_h.mode = orig_h.inode->i_mode & S_IFMT; -+ } -+ if (tmp->di_btop >= 0) { -+ tmp_h.dentry = au_hdentry(tmp, tmp->di_btop)->hd_dentry; -+ if (d_is_positive(tmp_h.dentry)) { -+ tmp_h.inode = d_inode(tmp_h.dentry); -+ tmp_h.mode = tmp_h.inode->i_mode & S_IFMT; -+ } -+ } -+ -+ inode = NULL; -+ if (d_really_is_positive(dentry)) -+ inode = d_inode(dentry); -+ if (!orig_h.inode) { -+ AuDbg("negative originally\n"); -+ if (inode) { -+ au_hide(dentry); -+ goto out; -+ } -+ AuDebugOn(inode); -+ AuDebugOn(dinfo->di_btop != dinfo->di_bbot); -+ AuDebugOn(dinfo->di_bdiropq != -1); -+ -+ if (!tmp_h.inode) { -+ AuDbg("negative --> negative\n"); -+ /* should have only one negative lower */ -+ if (tmp->di_btop >= 0 -+ && tmp->di_btop < dinfo->di_btop) { -+ AuDebugOn(tmp->di_btop != tmp->di_bbot); -+ AuDebugOn(dinfo->di_btop != dinfo->di_bbot); -+ au_set_h_dptr(dentry, dinfo->di_btop, NULL); -+ au_di_cp(dinfo, tmp); -+ hd = au_hdentry(tmp, tmp->di_btop); -+ au_set_h_dptr(dentry, tmp->di_btop, -+ dget(hd->hd_dentry)); -+ } -+ au_dbg_verify_dinode(dentry); -+ } else { -+ AuDbg("negative --> positive\n"); -+ /* -+ * similar to the behaviour of creating with bypassing -+ * aufs. -+ * unhash it in order to force an error in the -+ * succeeding create operation. -+ * we should not set S_DEAD here. -+ */ -+ d_drop(dentry); -+ /* au_di_swap(tmp, dinfo); */ -+ au_dbg_verify_dinode(dentry); -+ } -+ } else { -+ AuDbg("positive originally\n"); -+ /* inode may be NULL */ -+ AuDebugOn(inode && (inode->i_mode & S_IFMT) != orig_h.mode); -+ if (!tmp_h.inode) { -+ AuDbg("positive --> negative\n"); -+ /* or bypassing aufs */ -+ au_hide(dentry); -+ if (tmp->di_bwh >= 0 && tmp->di_bwh <= dinfo->di_btop) -+ dinfo->di_bwh = tmp->di_bwh; -+ if (inode) -+ err = au_refresh_hinode_self(inode); -+ au_dbg_verify_dinode(dentry); -+ } else if (orig_h.mode == tmp_h.mode) { -+ AuDbg("positive --> positive, same type\n"); -+ if (!S_ISDIR(orig_h.mode) -+ && dinfo->di_btop > tmp->di_btop) { -+ /* -+ * similar to the behaviour of removing and -+ * creating. -+ */ -+ au_hide(dentry); -+ if (inode) -+ err = au_refresh_hinode_self(inode); -+ au_dbg_verify_dinode(dentry); -+ } else { -+ /* fill empty slots */ -+ if (dinfo->di_btop > tmp->di_btop) -+ dinfo->di_btop = tmp->di_btop; -+ if (dinfo->di_bbot < tmp->di_bbot) -+ dinfo->di_bbot = tmp->di_bbot; -+ dinfo->di_bwh = tmp->di_bwh; -+ dinfo->di_bdiropq = tmp->di_bdiropq; -+ bbot = dinfo->di_bbot; -+ bindex = tmp->di_btop; -+ hd = au_hdentry(tmp, bindex); -+ for (; bindex <= bbot; bindex++, hd++) { -+ if (au_h_dptr(dentry, bindex)) -+ continue; -+ h_dentry = hd->hd_dentry; -+ if (!h_dentry) -+ continue; -+ AuDebugOn(d_is_negative(h_dentry)); -+ h_inode = d_inode(h_dentry); -+ AuDebugOn(orig_h.mode -+ != (h_inode->i_mode -+ & S_IFMT)); -+ au_set_h_dptr(dentry, bindex, -+ dget(h_dentry)); -+ } -+ if (inode) -+ err = au_refresh_hinode(inode, dentry); -+ au_dbg_verify_dinode(dentry); -+ } -+ } else { -+ AuDbg("positive --> positive, different type\n"); -+ /* similar to the behaviour of removing and creating */ -+ au_hide(dentry); -+ if (inode) -+ err = au_refresh_hinode_self(inode); -+ au_dbg_verify_dinode(dentry); -+ } -+ } -+ -+out: -+ return err; -+} -+ -+void au_refresh_dop(struct dentry *dentry, int force_reval) -+{ -+ const struct dentry_operations *dop -+ = force_reval ? &aufs_dop : dentry->d_sb->s_d_op; -+ static const unsigned int mask -+ = DCACHE_OP_REVALIDATE | DCACHE_OP_WEAK_REVALIDATE; -+ -+ BUILD_BUG_ON(sizeof(mask) != sizeof(dentry->d_flags)); -+ -+ if (dentry->d_op == dop) -+ return; -+ -+ AuDbg("%pd\n", dentry); -+ spin_lock(&dentry->d_lock); -+ if (dop == &aufs_dop) -+ dentry->d_flags |= mask; -+ else -+ dentry->d_flags &= ~mask; -+ dentry->d_op = dop; -+ spin_unlock(&dentry->d_lock); -+} -+ -+int au_refresh_dentry(struct dentry *dentry, struct dentry *parent) -+{ -+ int err, ebrange, nbr; -+ unsigned int sigen; -+ struct au_dinfo *dinfo, *tmp; -+ struct super_block *sb; -+ struct inode *inode; -+ -+ DiMustWriteLock(dentry); -+ AuDebugOn(IS_ROOT(dentry)); -+ AuDebugOn(d_really_is_negative(parent)); -+ -+ sb = dentry->d_sb; -+ sigen = au_sigen(sb); -+ err = au_digen_test(parent, sigen); -+ if (unlikely(err)) -+ goto out; -+ -+ nbr = au_sbbot(sb) + 1; -+ dinfo = au_di(dentry); -+ err = au_di_realloc(dinfo, nbr, /*may_shrink*/0); -+ if (unlikely(err)) -+ goto out; -+ ebrange = au_dbrange_test(dentry); -+ if (!ebrange) -+ ebrange = au_do_refresh_hdentry(dentry, parent); -+ -+ if (d_unhashed(dentry) || ebrange /* || dinfo->di_tmpfile */) { -+ AuDebugOn(au_dbtop(dentry) < 0 && au_dbbot(dentry) >= 0); -+ if (d_really_is_positive(dentry)) { -+ inode = d_inode(dentry); -+ err = au_refresh_hinode_self(inode); -+ } -+ au_dbg_verify_dinode(dentry); -+ if (!err) -+ goto out_dgen; /* success */ -+ goto out; -+ } -+ -+ /* temporary dinfo */ -+ AuDbgDentry(dentry); -+ err = -ENOMEM; -+ tmp = au_di_alloc(sb, AuLsc_DI_TMP); -+ if (unlikely(!tmp)) -+ goto out; -+ au_di_swap(tmp, dinfo); -+ /* returns the number of positive dentries */ -+ /* -+ * if current working dir is removed, it returns an error. -+ * but the dentry is legal. -+ */ -+ err = au_lkup_dentry(dentry, /*btop*/0, AuLkup_ALLOW_NEG); -+ AuDbgDentry(dentry); -+ au_di_swap(tmp, dinfo); -+ if (err == -ENOENT) -+ err = 0; -+ if (err >= 0) { -+ /* compare/refresh by dinfo */ -+ AuDbgDentry(dentry); -+ err = au_refresh_by_dinfo(dentry, dinfo, tmp); -+ au_dbg_verify_dinode(dentry); -+ AuTraceErr(err); -+ } -+ au_di_realloc(dinfo, nbr, /*may_shrink*/1); /* harmless if err */ -+ au_rw_write_unlock(&tmp->di_rwsem); -+ au_di_free(tmp); -+ if (unlikely(err)) -+ goto out; -+ -+out_dgen: -+ au_update_digen(dentry); -+out: -+ if (unlikely(err && !(dentry->d_flags & DCACHE_NFSFS_RENAMED))) { -+ AuIOErr("failed refreshing %pd, %d\n", dentry, err); -+ AuDbgDentry(dentry); -+ } -+ AuTraceErr(err); -+ return err; -+} -+ -+static int au_do_h_d_reval(struct dentry *h_dentry, unsigned int flags, -+ struct dentry *dentry, aufs_bindex_t bindex) -+{ -+ int err, valid; -+ -+ err = 0; -+ if (!(h_dentry->d_flags & DCACHE_OP_REVALIDATE)) -+ goto out; -+ -+ AuDbg("b%d\n", bindex); -+ /* -+ * gave up supporting LOOKUP_CREATE/OPEN for lower fs, -+ * due to whiteout and branch permission. -+ */ -+ flags &= ~(/*LOOKUP_PARENT |*/ LOOKUP_OPEN | LOOKUP_CREATE -+ | LOOKUP_FOLLOW | LOOKUP_EXCL); -+ /* it may return tri-state */ -+ valid = h_dentry->d_op->d_revalidate(h_dentry, flags); -+ -+ if (unlikely(valid < 0)) -+ err = valid; -+ else if (!valid) -+ err = -EINVAL; -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+/* todo: remove this */ -+static int h_d_revalidate(struct dentry *dentry, struct inode *inode, -+ unsigned int flags, int do_udba, int dirren) -+{ -+ int err; -+ umode_t mode, h_mode; -+ aufs_bindex_t bindex, btail, btop, ibs, ibe; -+ unsigned char plus, unhashed, is_root, h_plus, h_nfs, tmpfile; -+ struct inode *h_inode, *h_cached_inode; -+ struct dentry *h_dentry; -+ struct qstr *name, *h_name; -+ -+ err = 0; -+ plus = 0; -+ mode = 0; -+ ibs = -1; -+ ibe = -1; -+ unhashed = !!d_unhashed(dentry); -+ is_root = !!IS_ROOT(dentry); -+ name = &dentry->d_name; -+ tmpfile = au_di(dentry)->di_tmpfile; -+ -+ /* -+ * Theoretically, REVAL test should be unnecessary in case of -+ * {FS,I}NOTIFY. -+ * But {fs,i}notify doesn't fire some necessary events, -+ * IN_ATTRIB for atime/nlink/pageio -+ * Let's do REVAL test too. -+ */ -+ if (do_udba && inode) { -+ mode = (inode->i_mode & S_IFMT); -+ plus = (inode->i_nlink > 0); -+ ibs = au_ibtop(inode); -+ ibe = au_ibbot(inode); -+ } -+ -+ btop = au_dbtop(dentry); -+ btail = btop; -+ if (inode && S_ISDIR(inode->i_mode)) -+ btail = au_dbtaildir(dentry); -+ for (bindex = btop; bindex <= btail; bindex++) { -+ h_dentry = au_h_dptr(dentry, bindex); -+ if (!h_dentry) -+ continue; -+ -+ AuDbg("b%d, %pd\n", bindex, h_dentry); -+ h_nfs = !!au_test_nfs(h_dentry->d_sb); -+ spin_lock(&h_dentry->d_lock); -+ h_name = &h_dentry->d_name; -+ if (unlikely(do_udba -+ && !is_root -+ && ((!h_nfs -+ && (unhashed != !!d_unhashed(h_dentry) -+ || (!tmpfile && !dirren -+ && !au_qstreq(name, h_name)) -+ )) -+ || (h_nfs -+ && !(flags & LOOKUP_OPEN) -+ && (h_dentry->d_flags -+ & DCACHE_NFSFS_RENAMED))) -+ )) { -+ int h_unhashed; -+ -+ h_unhashed = d_unhashed(h_dentry); -+ spin_unlock(&h_dentry->d_lock); -+ AuDbg("unhash 0x%x 0x%x, %pd %pd\n", -+ unhashed, h_unhashed, dentry, h_dentry); -+ goto err; -+ } -+ spin_unlock(&h_dentry->d_lock); -+ -+ err = au_do_h_d_reval(h_dentry, flags, dentry, bindex); -+ if (unlikely(err)) -+ /* do not goto err, to keep the errno */ -+ break; -+ -+ /* todo: plink too? */ -+ if (!do_udba) -+ continue; -+ -+ /* UDBA tests */ -+ if (unlikely(!!inode != d_is_positive(h_dentry))) -+ goto err; -+ -+ h_inode = NULL; -+ if (d_is_positive(h_dentry)) -+ h_inode = d_inode(h_dentry); -+ h_plus = plus; -+ h_mode = mode; -+ h_cached_inode = h_inode; -+ if (h_inode) { -+ h_mode = (h_inode->i_mode & S_IFMT); -+ h_plus = (h_inode->i_nlink > 0); -+ } -+ if (inode && ibs <= bindex && bindex <= ibe) -+ h_cached_inode = au_h_iptr(inode, bindex); -+ -+ if (!h_nfs) { -+ if (unlikely(plus != h_plus && !tmpfile)) -+ goto err; -+ } else { -+ if (unlikely(!(h_dentry->d_flags & DCACHE_NFSFS_RENAMED) -+ && !is_root -+ && !IS_ROOT(h_dentry) -+ && unhashed != d_unhashed(h_dentry))) -+ goto err; -+ } -+ if (unlikely(mode != h_mode -+ || h_cached_inode != h_inode)) -+ goto err; -+ continue; -+ -+err: -+ err = -EINVAL; -+ break; -+ } -+ -+ AuTraceErr(err); -+ return err; -+} -+ -+/* todo: consolidate with do_refresh() and au_reval_for_attr() */ -+static int simple_reval_dpath(struct dentry *dentry, unsigned int sigen) -+{ -+ int err; -+ struct dentry *parent; -+ -+ if (!au_digen_test(dentry, sigen)) -+ return 0; -+ -+ parent = dget_parent(dentry); -+ di_read_lock_parent(parent, AuLock_IR); -+ AuDebugOn(au_digen_test(parent, sigen)); -+ au_dbg_verify_gen(parent, sigen); -+ err = au_refresh_dentry(dentry, parent); -+ di_read_unlock(parent, AuLock_IR); -+ dput(parent); -+ AuTraceErr(err); -+ return err; -+} -+ -+int au_reval_dpath(struct dentry *dentry, unsigned int sigen) -+{ -+ int err; -+ struct dentry *d, *parent; -+ -+ if (!au_ftest_si(au_sbi(dentry->d_sb), FAILED_REFRESH_DIR)) -+ return simple_reval_dpath(dentry, sigen); -+ -+ /* slow loop, keep it simple and stupid */ -+ /* cf: au_cpup_dirs() */ -+ err = 0; -+ parent = NULL; -+ while (au_digen_test(dentry, sigen)) { -+ d = dentry; -+ while (1) { -+ dput(parent); -+ parent = dget_parent(d); -+ if (!au_digen_test(parent, sigen)) -+ break; -+ d = parent; -+ } -+ -+ if (d != dentry) -+ di_write_lock_child2(d); -+ -+ /* someone might update our dentry while we were sleeping */ -+ if (au_digen_test(d, sigen)) { -+ /* -+ * todo: consolidate with simple_reval_dpath(), -+ * do_refresh() and au_reval_for_attr(). -+ */ -+ di_read_lock_parent(parent, AuLock_IR); -+ err = au_refresh_dentry(d, parent); -+ di_read_unlock(parent, AuLock_IR); -+ } -+ -+ if (d != dentry) -+ di_write_unlock(d); -+ dput(parent); -+ if (unlikely(err)) -+ break; -+ } -+ -+ return err; -+} -+ -+/* -+ * if valid returns 1, otherwise 0. -+ */ -+static int aufs_d_revalidate(struct dentry *dentry, unsigned int flags) -+{ -+ int valid, err; -+ unsigned int sigen; -+ unsigned char do_udba, dirren; -+ struct super_block *sb; -+ struct inode *inode; -+ -+ /* todo: support rcu-walk? */ -+ if (flags & LOOKUP_RCU) -+ return -ECHILD; -+ -+ valid = 0; -+ if (unlikely(!au_di(dentry))) -+ goto out; -+ -+ valid = 1; -+ sb = dentry->d_sb; -+ /* -+ * todo: very ugly -+ * i_mutex of parent dir may be held, -+ * but we should not return 'invalid' due to busy. -+ */ -+ err = aufs_read_lock(dentry, AuLock_FLUSH | AuLock_DW | AuLock_NOPLM); -+ if (unlikely(err)) { -+ valid = err; -+ AuTraceErr(err); -+ goto out; -+ } -+ inode = NULL; -+ if (d_really_is_positive(dentry)) -+ inode = d_inode(dentry); -+ if (unlikely(inode && au_is_bad_inode(inode))) { -+ err = -EINVAL; -+ AuTraceErr(err); -+ goto out_dgrade; -+ } -+ if (unlikely(au_dbrange_test(dentry))) { -+ err = -EINVAL; -+ AuTraceErr(err); -+ goto out_dgrade; -+ } -+ -+ sigen = au_sigen(sb); -+ if (au_digen_test(dentry, sigen)) { -+ AuDebugOn(IS_ROOT(dentry)); -+ err = au_reval_dpath(dentry, sigen); -+ if (unlikely(err)) { -+ AuTraceErr(err); -+ goto out_dgrade; -+ } -+ } -+ di_downgrade_lock(dentry, AuLock_IR); -+ -+ err = -EINVAL; -+ if (!(flags & (LOOKUP_OPEN | LOOKUP_EMPTY)) -+ && inode -+ && !(inode->i_state && I_LINKABLE) -+ && (IS_DEADDIR(inode) || !inode->i_nlink)) { -+ AuTraceErr(err); -+ goto out_inval; -+ } -+ -+ do_udba = !au_opt_test(au_mntflags(sb), UDBA_NONE); -+ if (do_udba && inode) { -+ aufs_bindex_t btop = au_ibtop(inode); -+ struct inode *h_inode; -+ -+ if (btop >= 0) { -+ h_inode = au_h_iptr(inode, btop); -+ if (h_inode && au_test_higen(inode, h_inode)) { -+ AuTraceErr(err); -+ goto out_inval; -+ } -+ } -+ } -+ -+ dirren = !!au_opt_test(au_mntflags(sb), DIRREN); -+ err = h_d_revalidate(dentry, inode, flags, do_udba, dirren); -+ if (unlikely(!err && do_udba && au_dbtop(dentry) < 0)) { -+ err = -EIO; -+ AuDbg("both of real entry and whiteout found, %p, err %d\n", -+ dentry, err); -+ } -+ goto out_inval; -+ -+out_dgrade: -+ di_downgrade_lock(dentry, AuLock_IR); -+out_inval: -+ aufs_read_unlock(dentry, AuLock_IR); -+ AuTraceErr(err); -+ valid = !err; -+out: -+ if (!valid) { -+ AuDbg("%pd invalid, %d\n", dentry, valid); -+ d_drop(dentry); -+ } -+ return valid; -+} -+ -+static void aufs_d_release(struct dentry *dentry) -+{ -+ if (au_di(dentry)) { -+ au_di_fin(dentry); -+ au_hn_di_reinit(dentry); -+ } -+} -+ -+const struct dentry_operations aufs_dop = { -+ .d_revalidate = aufs_d_revalidate, -+ .d_weak_revalidate = aufs_d_revalidate, -+ .d_release = aufs_d_release -+}; -+ -+/* aufs_dop without d_revalidate */ -+const struct dentry_operations aufs_dop_noreval = { -+ .d_release = aufs_d_release -+}; -diff -Naur null/fs/aufs/dentry.h linux-5.15.36/fs/aufs/dentry.h ---- /dev/null -+++ linux-5.15.36/fs/aufs/dentry.h 2022-05-10 16:51:39.868744219 +0300 -@@ -0,0 +1,269 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program. If not, see . -+ */ -+ -+/* -+ * lookup and dentry operations -+ */ -+ -+#ifndef __AUFS_DENTRY_H__ -+#define __AUFS_DENTRY_H__ -+ -+#ifdef __KERNEL__ -+ -+#include -+#include "dirren.h" -+#include "rwsem.h" -+ -+struct au_hdentry { -+ struct dentry *hd_dentry; -+ aufs_bindex_t hd_id; -+}; -+ -+struct au_dinfo { -+ atomic_t di_generation; -+ -+ struct au_rwsem di_rwsem; -+ aufs_bindex_t di_btop, di_bbot, di_bwh, di_bdiropq; -+ unsigned char di_tmpfile; /* to allow the different name */ -+ struct au_hdentry *di_hdentry; -+ struct rcu_head rcu; -+} ____cacheline_aligned_in_smp; -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* flags for au_lkup_dentry() */ -+#define AuLkup_ALLOW_NEG 1 -+#define AuLkup_IGNORE_PERM (1 << 1) -+#define AuLkup_DIRREN (1 << 2) -+#define au_ftest_lkup(flags, name) ((flags) & AuLkup_##name) -+#define au_fset_lkup(flags, name) \ -+ do { (flags) |= AuLkup_##name; } while (0) -+#define au_fclr_lkup(flags, name) \ -+ do { (flags) &= ~AuLkup_##name; } while (0) -+ -+#ifndef CONFIG_AUFS_DIRREN -+#undef AuLkup_DIRREN -+#define AuLkup_DIRREN 0 -+#endif -+ -+struct au_do_lookup_args { -+ unsigned int flags; -+ mode_t type; -+ struct qstr whname, *name; -+ struct au_dr_lookup dirren; -+}; -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* dentry.c */ -+extern const struct dentry_operations aufs_dop, aufs_dop_noreval; -+struct au_branch; -+struct dentry *au_sio_lkup_one(struct user_namespace *userns, struct qstr *name, -+ struct path *ppath); -+int au_h_verify(struct dentry *h_dentry, unsigned int udba, struct inode *h_dir, -+ struct dentry *h_parent, struct au_branch *br); -+ -+int au_lkup_dentry(struct dentry *dentry, aufs_bindex_t btop, -+ unsigned int flags); -+int au_lkup_neg(struct dentry *dentry, aufs_bindex_t bindex, int wh); -+int au_refresh_dentry(struct dentry *dentry, struct dentry *parent); -+int au_reval_dpath(struct dentry *dentry, unsigned int sigen); -+void au_refresh_dop(struct dentry *dentry, int force_reval); -+ -+/* dinfo.c */ -+void au_di_init_once(void *_di); -+struct au_dinfo *au_di_alloc(struct super_block *sb, unsigned int lsc); -+void au_di_free(struct au_dinfo *dinfo); -+void au_di_swap(struct au_dinfo *a, struct au_dinfo *b); -+void au_di_cp(struct au_dinfo *dst, struct au_dinfo *src); -+int au_di_init(struct dentry *dentry); -+void au_di_fin(struct dentry *dentry); -+int au_di_realloc(struct au_dinfo *dinfo, int nbr, int may_shrink); -+ -+void di_read_lock(struct dentry *d, int flags, unsigned int lsc); -+void di_read_unlock(struct dentry *d, int flags); -+void di_downgrade_lock(struct dentry *d, int flags); -+void di_write_lock(struct dentry *d, unsigned int lsc); -+void di_write_unlock(struct dentry *d); -+void di_write_lock2_child(struct dentry *d1, struct dentry *d2, int isdir); -+void di_write_lock2_parent(struct dentry *d1, struct dentry *d2, int isdir); -+void di_write_unlock2(struct dentry *d1, struct dentry *d2); -+ -+struct dentry *au_h_dptr(struct dentry *dentry, aufs_bindex_t bindex); -+struct dentry *au_h_d_alias(struct dentry *dentry, aufs_bindex_t bindex); -+aufs_bindex_t au_dbtail(struct dentry *dentry); -+aufs_bindex_t au_dbtaildir(struct dentry *dentry); -+ -+void au_set_h_dptr(struct dentry *dentry, aufs_bindex_t bindex, -+ struct dentry *h_dentry); -+int au_digen_test(struct dentry *dentry, unsigned int sigen); -+int au_dbrange_test(struct dentry *dentry); -+void au_update_digen(struct dentry *dentry); -+void au_update_dbrange(struct dentry *dentry, int do_put_zero); -+void au_update_dbtop(struct dentry *dentry); -+void au_update_dbbot(struct dentry *dentry); -+int au_find_dbindex(struct dentry *dentry, struct dentry *h_dentry); -+ -+/* ---------------------------------------------------------------------- */ -+ -+static inline struct au_dinfo *au_di(struct dentry *dentry) -+{ -+ return dentry->d_fsdata; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* lock subclass for dinfo */ -+enum { -+ AuLsc_DI_CHILD, /* child first */ -+ AuLsc_DI_CHILD2, /* rename(2), link(2), and cpup at hnotify */ -+ AuLsc_DI_CHILD3, /* copyup dirs */ -+ AuLsc_DI_PARENT, -+ AuLsc_DI_PARENT2, -+ AuLsc_DI_PARENT3, -+ AuLsc_DI_TMP /* temp for replacing dinfo */ -+}; -+ -+/* -+ * di_read_lock_child, di_write_lock_child, -+ * di_read_lock_child2, di_write_lock_child2, -+ * di_read_lock_child3, di_write_lock_child3, -+ * di_read_lock_parent, di_write_lock_parent, -+ * di_read_lock_parent2, di_write_lock_parent2, -+ * di_read_lock_parent3, di_write_lock_parent3, -+ */ -+#define AuReadLockFunc(name, lsc) \ -+static inline void di_read_lock_##name(struct dentry *d, int flags) \ -+{ di_read_lock(d, flags, AuLsc_DI_##lsc); } -+ -+#define AuWriteLockFunc(name, lsc) \ -+static inline void di_write_lock_##name(struct dentry *d) \ -+{ di_write_lock(d, AuLsc_DI_##lsc); } -+ -+#define AuRWLockFuncs(name, lsc) \ -+ AuReadLockFunc(name, lsc) \ -+ AuWriteLockFunc(name, lsc) -+ -+AuRWLockFuncs(child, CHILD); -+AuRWLockFuncs(child2, CHILD2); -+AuRWLockFuncs(child3, CHILD3); -+AuRWLockFuncs(parent, PARENT); -+AuRWLockFuncs(parent2, PARENT2); -+AuRWLockFuncs(parent3, PARENT3); -+ -+#undef AuReadLockFunc -+#undef AuWriteLockFunc -+#undef AuRWLockFuncs -+ -+#define DiMustNoWaiters(d) AuRwMustNoWaiters(&au_di(d)->di_rwsem) -+#define DiMustAnyLock(d) AuRwMustAnyLock(&au_di(d)->di_rwsem) -+#define DiMustWriteLock(d) AuRwMustWriteLock(&au_di(d)->di_rwsem) -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* todo: memory barrier? */ -+static inline unsigned int au_digen(struct dentry *d) -+{ -+ return atomic_read(&au_di(d)->di_generation); -+} -+ -+static inline void au_h_dentry_init(struct au_hdentry *hdentry) -+{ -+ hdentry->hd_dentry = NULL; -+} -+ -+static inline struct au_hdentry *au_hdentry(struct au_dinfo *di, -+ aufs_bindex_t bindex) -+{ -+ return di->di_hdentry + bindex; -+} -+ -+static inline void au_hdput(struct au_hdentry *hd) -+{ -+ if (hd) -+ dput(hd->hd_dentry); -+} -+ -+static inline aufs_bindex_t au_dbtop(struct dentry *dentry) -+{ -+ DiMustAnyLock(dentry); -+ return au_di(dentry)->di_btop; -+} -+ -+static inline aufs_bindex_t au_dbbot(struct dentry *dentry) -+{ -+ DiMustAnyLock(dentry); -+ return au_di(dentry)->di_bbot; -+} -+ -+static inline aufs_bindex_t au_dbwh(struct dentry *dentry) -+{ -+ DiMustAnyLock(dentry); -+ return au_di(dentry)->di_bwh; -+} -+ -+static inline aufs_bindex_t au_dbdiropq(struct dentry *dentry) -+{ -+ DiMustAnyLock(dentry); -+ return au_di(dentry)->di_bdiropq; -+} -+ -+/* todo: hard/soft set? */ -+static inline void au_set_dbtop(struct dentry *dentry, aufs_bindex_t bindex) -+{ -+ DiMustWriteLock(dentry); -+ au_di(dentry)->di_btop = bindex; -+} -+ -+static inline void au_set_dbbot(struct dentry *dentry, aufs_bindex_t bindex) -+{ -+ DiMustWriteLock(dentry); -+ au_di(dentry)->di_bbot = bindex; -+} -+ -+static inline void au_set_dbwh(struct dentry *dentry, aufs_bindex_t bindex) -+{ -+ DiMustWriteLock(dentry); -+ /* dbwh can be outside of btop - bbot range */ -+ au_di(dentry)->di_bwh = bindex; -+} -+ -+static inline void au_set_dbdiropq(struct dentry *dentry, aufs_bindex_t bindex) -+{ -+ DiMustWriteLock(dentry); -+ au_di(dentry)->di_bdiropq = bindex; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+#ifdef CONFIG_AUFS_HNOTIFY -+static inline void au_digen_dec(struct dentry *d) -+{ -+ atomic_dec(&au_di(d)->di_generation); -+} -+ -+static inline void au_hn_di_reinit(struct dentry *dentry) -+{ -+ dentry->d_fsdata = NULL; -+} -+#else -+AuStubVoid(au_hn_di_reinit, struct dentry *dentry __maybe_unused) -+#endif /* CONFIG_AUFS_HNOTIFY */ -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_DENTRY_H__ */ -diff -Naur null/fs/aufs/dinfo.c linux-5.15.36/fs/aufs/dinfo.c ---- /dev/null -+++ linux-5.15.36/fs/aufs/dinfo.c 2022-05-10 16:51:39.869744219 +0300 -@@ -0,0 +1,554 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program. If not, see . -+ */ -+ -+/* -+ * dentry private data -+ */ -+ -+#include "aufs.h" -+ -+void au_di_init_once(void *_dinfo) -+{ -+ struct au_dinfo *dinfo = _dinfo; -+ -+ au_rw_init(&dinfo->di_rwsem); -+} -+ -+struct au_dinfo *au_di_alloc(struct super_block *sb, unsigned int lsc) -+{ -+ struct au_dinfo *dinfo; -+ int nbr, i; -+ -+ dinfo = au_cache_alloc_dinfo(); -+ if (unlikely(!dinfo)) -+ goto out; -+ -+ nbr = au_sbbot(sb) + 1; -+ if (nbr <= 0) -+ nbr = 1; -+ dinfo->di_hdentry = kcalloc(nbr, sizeof(*dinfo->di_hdentry), GFP_NOFS); -+ if (dinfo->di_hdentry) { -+ au_rw_write_lock_nested(&dinfo->di_rwsem, lsc); -+ dinfo->di_btop = -1; -+ dinfo->di_bbot = -1; -+ dinfo->di_bwh = -1; -+ dinfo->di_bdiropq = -1; -+ dinfo->di_tmpfile = 0; -+ for (i = 0; i < nbr; i++) -+ dinfo->di_hdentry[i].hd_id = -1; -+ goto out; -+ } -+ -+ au_cache_free_dinfo(dinfo); -+ dinfo = NULL; -+ -+out: -+ return dinfo; -+} -+ -+void au_di_free(struct au_dinfo *dinfo) -+{ -+ struct au_hdentry *p; -+ aufs_bindex_t bbot, bindex; -+ -+ /* dentry may not be revalidated */ -+ bindex = dinfo->di_btop; -+ if (bindex >= 0) { -+ bbot = dinfo->di_bbot; -+ p = au_hdentry(dinfo, bindex); -+ while (bindex++ <= bbot) -+ au_hdput(p++); -+ } -+ au_kfree_try_rcu(dinfo->di_hdentry); -+ au_cache_free_dinfo(dinfo); -+} -+ -+void au_di_swap(struct au_dinfo *a, struct au_dinfo *b) -+{ -+ struct au_hdentry *p; -+ aufs_bindex_t bi; -+ -+ AuRwMustWriteLock(&a->di_rwsem); -+ AuRwMustWriteLock(&b->di_rwsem); -+ -+#define DiSwap(v, name) \ -+ do { \ -+ v = a->di_##name; \ -+ a->di_##name = b->di_##name; \ -+ b->di_##name = v; \ -+ } while (0) -+ -+ DiSwap(p, hdentry); -+ DiSwap(bi, btop); -+ DiSwap(bi, bbot); -+ DiSwap(bi, bwh); -+ DiSwap(bi, bdiropq); -+ /* smp_mb(); */ -+ -+#undef DiSwap -+} -+ -+void au_di_cp(struct au_dinfo *dst, struct au_dinfo *src) -+{ -+ AuRwMustWriteLock(&dst->di_rwsem); -+ AuRwMustWriteLock(&src->di_rwsem); -+ -+ dst->di_btop = src->di_btop; -+ dst->di_bbot = src->di_bbot; -+ dst->di_bwh = src->di_bwh; -+ dst->di_bdiropq = src->di_bdiropq; -+ /* smp_mb(); */ -+} -+ -+int au_di_init(struct dentry *dentry) -+{ -+ int err; -+ struct super_block *sb; -+ struct au_dinfo *dinfo; -+ -+ err = 0; -+ sb = dentry->d_sb; -+ dinfo = au_di_alloc(sb, AuLsc_DI_CHILD); -+ if (dinfo) { -+ atomic_set(&dinfo->di_generation, au_sigen(sb)); -+ /* smp_mb(); */ /* atomic_set */ -+ dentry->d_fsdata = dinfo; -+ } else -+ err = -ENOMEM; -+ -+ return err; -+} -+ -+void au_di_fin(struct dentry *dentry) -+{ -+ struct au_dinfo *dinfo; -+ -+ dinfo = au_di(dentry); -+ AuRwDestroy(&dinfo->di_rwsem); -+ au_di_free(dinfo); -+} -+ -+int au_di_realloc(struct au_dinfo *dinfo, int nbr, int may_shrink) -+{ -+ int err, sz; -+ struct au_hdentry *hdp; -+ -+ AuRwMustWriteLock(&dinfo->di_rwsem); -+ -+ err = -ENOMEM; -+ sz = sizeof(*hdp) * (dinfo->di_bbot + 1); -+ if (!sz) -+ sz = sizeof(*hdp); -+ hdp = au_kzrealloc(dinfo->di_hdentry, sz, sizeof(*hdp) * nbr, GFP_NOFS, -+ may_shrink); -+ if (hdp) { -+ dinfo->di_hdentry = hdp; -+ err = 0; -+ } -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static void do_ii_write_lock(struct inode *inode, unsigned int lsc) -+{ -+ switch (lsc) { -+ case AuLsc_DI_CHILD: -+ ii_write_lock_child(inode); -+ break; -+ case AuLsc_DI_CHILD2: -+ ii_write_lock_child2(inode); -+ break; -+ case AuLsc_DI_CHILD3: -+ ii_write_lock_child3(inode); -+ break; -+ case AuLsc_DI_PARENT: -+ ii_write_lock_parent(inode); -+ break; -+ case AuLsc_DI_PARENT2: -+ ii_write_lock_parent2(inode); -+ break; -+ case AuLsc_DI_PARENT3: -+ ii_write_lock_parent3(inode); -+ break; -+ default: -+ BUG(); -+ } -+} -+ -+static void do_ii_read_lock(struct inode *inode, unsigned int lsc) -+{ -+ switch (lsc) { -+ case AuLsc_DI_CHILD: -+ ii_read_lock_child(inode); -+ break; -+ case AuLsc_DI_CHILD2: -+ ii_read_lock_child2(inode); -+ break; -+ case AuLsc_DI_CHILD3: -+ ii_read_lock_child3(inode); -+ break; -+ case AuLsc_DI_PARENT: -+ ii_read_lock_parent(inode); -+ break; -+ case AuLsc_DI_PARENT2: -+ ii_read_lock_parent2(inode); -+ break; -+ case AuLsc_DI_PARENT3: -+ ii_read_lock_parent3(inode); -+ break; -+ default: -+ BUG(); -+ } -+} -+ -+void di_read_lock(struct dentry *d, int flags, unsigned int lsc) -+{ -+ struct inode *inode; -+ -+ au_rw_read_lock_nested(&au_di(d)->di_rwsem, lsc); -+ if (d_really_is_positive(d)) { -+ inode = d_inode(d); -+ if (au_ftest_lock(flags, IW)) -+ do_ii_write_lock(inode, lsc); -+ else if (au_ftest_lock(flags, IR)) -+ do_ii_read_lock(inode, lsc); -+ } -+} -+ -+void di_read_unlock(struct dentry *d, int flags) -+{ -+ struct inode *inode; -+ -+ if (d_really_is_positive(d)) { -+ inode = d_inode(d); -+ if (au_ftest_lock(flags, IW)) { -+ au_dbg_verify_dinode(d); -+ ii_write_unlock(inode); -+ } else if (au_ftest_lock(flags, IR)) { -+ au_dbg_verify_dinode(d); -+ ii_read_unlock(inode); -+ } -+ } -+ au_rw_read_unlock(&au_di(d)->di_rwsem); -+} -+ -+void di_downgrade_lock(struct dentry *d, int flags) -+{ -+ if (d_really_is_positive(d) && au_ftest_lock(flags, IR)) -+ ii_downgrade_lock(d_inode(d)); -+ au_rw_dgrade_lock(&au_di(d)->di_rwsem); -+} -+ -+void di_write_lock(struct dentry *d, unsigned int lsc) -+{ -+ au_rw_write_lock_nested(&au_di(d)->di_rwsem, lsc); -+ if (d_really_is_positive(d)) -+ do_ii_write_lock(d_inode(d), lsc); -+} -+ -+void di_write_unlock(struct dentry *d) -+{ -+ au_dbg_verify_dinode(d); -+ if (d_really_is_positive(d)) -+ ii_write_unlock(d_inode(d)); -+ au_rw_write_unlock(&au_di(d)->di_rwsem); -+} -+ -+void di_write_lock2_child(struct dentry *d1, struct dentry *d2, int isdir) -+{ -+ AuDebugOn(d1 == d2 -+ || d_inode(d1) == d_inode(d2) -+ || d1->d_sb != d2->d_sb); -+ -+ if ((isdir && au_test_subdir(d1, d2)) -+ || d1 < d2) { -+ di_write_lock_child(d1); -+ di_write_lock_child2(d2); -+ } else { -+ di_write_lock_child(d2); -+ di_write_lock_child2(d1); -+ } -+} -+ -+void di_write_lock2_parent(struct dentry *d1, struct dentry *d2, int isdir) -+{ -+ AuDebugOn(d1 == d2 -+ || d_inode(d1) == d_inode(d2) -+ || d1->d_sb != d2->d_sb); -+ -+ if ((isdir && au_test_subdir(d1, d2)) -+ || d1 < d2) { -+ di_write_lock_parent(d1); -+ di_write_lock_parent2(d2); -+ } else { -+ di_write_lock_parent(d2); -+ di_write_lock_parent2(d1); -+ } -+} -+ -+void di_write_unlock2(struct dentry *d1, struct dentry *d2) -+{ -+ di_write_unlock(d1); -+ if (d_inode(d1) == d_inode(d2)) -+ au_rw_write_unlock(&au_di(d2)->di_rwsem); -+ else -+ di_write_unlock(d2); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+struct dentry *au_h_dptr(struct dentry *dentry, aufs_bindex_t bindex) -+{ -+ struct dentry *d; -+ -+ DiMustAnyLock(dentry); -+ -+ if (au_dbtop(dentry) < 0 || bindex < au_dbtop(dentry)) -+ return NULL; -+ AuDebugOn(bindex < 0); -+ d = au_hdentry(au_di(dentry), bindex)->hd_dentry; -+ AuDebugOn(d && au_dcount(d) <= 0); -+ return d; -+} -+ -+/* -+ * extended version of au_h_dptr(). -+ * returns a hashed and positive (or linkable) h_dentry in bindex, NULL, or -+ * error. -+ */ -+struct dentry *au_h_d_alias(struct dentry *dentry, aufs_bindex_t bindex) -+{ -+ struct dentry *h_dentry; -+ struct inode *inode, *h_inode; -+ -+ AuDebugOn(d_really_is_negative(dentry)); -+ -+ h_dentry = NULL; -+ if (au_dbtop(dentry) <= bindex -+ && bindex <= au_dbbot(dentry)) -+ h_dentry = au_h_dptr(dentry, bindex); -+ if (h_dentry && !au_d_linkable(h_dentry)) { -+ dget(h_dentry); -+ goto out; /* success */ -+ } -+ -+ inode = d_inode(dentry); -+ AuDebugOn(bindex < au_ibtop(inode)); -+ AuDebugOn(au_ibbot(inode) < bindex); -+ h_inode = au_h_iptr(inode, bindex); -+ h_dentry = d_find_alias(h_inode); -+ if (h_dentry) { -+ if (!IS_ERR(h_dentry)) { -+ if (!au_d_linkable(h_dentry)) -+ goto out; /* success */ -+ dput(h_dentry); -+ } else -+ goto out; -+ } -+ -+ if (au_opt_test(au_mntflags(dentry->d_sb), PLINK)) { -+ h_dentry = au_plink_lkup(inode, bindex); -+ AuDebugOn(!h_dentry); -+ if (!IS_ERR(h_dentry)) { -+ if (!au_d_hashed_positive(h_dentry)) -+ goto out; /* success */ -+ dput(h_dentry); -+ h_dentry = NULL; -+ } -+ } -+ -+out: -+ AuDbgDentry(h_dentry); -+ return h_dentry; -+} -+ -+aufs_bindex_t au_dbtail(struct dentry *dentry) -+{ -+ aufs_bindex_t bbot, bwh; -+ -+ bbot = au_dbbot(dentry); -+ if (0 <= bbot) { -+ bwh = au_dbwh(dentry); -+ if (!bwh) -+ return bwh; -+ if (0 < bwh && bwh < bbot) -+ return bwh - 1; -+ } -+ return bbot; -+} -+ -+aufs_bindex_t au_dbtaildir(struct dentry *dentry) -+{ -+ aufs_bindex_t bbot, bopq; -+ -+ bbot = au_dbtail(dentry); -+ if (0 <= bbot) { -+ bopq = au_dbdiropq(dentry); -+ if (0 <= bopq && bopq < bbot) -+ bbot = bopq; -+ } -+ return bbot; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+void au_set_h_dptr(struct dentry *dentry, aufs_bindex_t bindex, -+ struct dentry *h_dentry) -+{ -+ struct au_dinfo *dinfo; -+ struct au_hdentry *hd; -+ struct au_branch *br; -+ -+ DiMustWriteLock(dentry); -+ -+ dinfo = au_di(dentry); -+ hd = au_hdentry(dinfo, bindex); -+ au_hdput(hd); -+ hd->hd_dentry = h_dentry; -+ if (h_dentry) { -+ br = au_sbr(dentry->d_sb, bindex); -+ hd->hd_id = br->br_id; -+ } -+} -+ -+int au_dbrange_test(struct dentry *dentry) -+{ -+ int err; -+ aufs_bindex_t btop, bbot; -+ -+ err = 0; -+ btop = au_dbtop(dentry); -+ bbot = au_dbbot(dentry); -+ if (btop >= 0) -+ AuDebugOn(bbot < 0 && btop > bbot); -+ else { -+ err = -EIO; -+ AuDebugOn(bbot >= 0); -+ } -+ -+ return err; -+} -+ -+int au_digen_test(struct dentry *dentry, unsigned int sigen) -+{ -+ int err; -+ -+ err = 0; -+ if (unlikely(au_digen(dentry) != sigen -+ || au_iigen_test(d_inode(dentry), sigen))) -+ err = -EIO; -+ -+ return err; -+} -+ -+void au_update_digen(struct dentry *dentry) -+{ -+ atomic_set(&au_di(dentry)->di_generation, au_sigen(dentry->d_sb)); -+ /* smp_mb(); */ /* atomic_set */ -+} -+ -+void au_update_dbrange(struct dentry *dentry, int do_put_zero) -+{ -+ struct au_dinfo *dinfo; -+ struct dentry *h_d; -+ struct au_hdentry *hdp; -+ aufs_bindex_t bindex, bbot; -+ -+ DiMustWriteLock(dentry); -+ -+ dinfo = au_di(dentry); -+ if (!dinfo || dinfo->di_btop < 0) -+ return; -+ -+ if (do_put_zero) { -+ bbot = dinfo->di_bbot; -+ bindex = dinfo->di_btop; -+ hdp = au_hdentry(dinfo, bindex); -+ for (; bindex <= bbot; bindex++, hdp++) { -+ h_d = hdp->hd_dentry; -+ if (h_d && d_is_negative(h_d)) -+ au_set_h_dptr(dentry, bindex, NULL); -+ } -+ } -+ -+ dinfo->di_btop = 0; -+ hdp = au_hdentry(dinfo, dinfo->di_btop); -+ for (; dinfo->di_btop <= dinfo->di_bbot; dinfo->di_btop++, hdp++) -+ if (hdp->hd_dentry) -+ break; -+ if (dinfo->di_btop > dinfo->di_bbot) { -+ dinfo->di_btop = -1; -+ dinfo->di_bbot = -1; -+ return; -+ } -+ -+ hdp = au_hdentry(dinfo, dinfo->di_bbot); -+ for (; dinfo->di_bbot >= 0; dinfo->di_bbot--, hdp--) -+ if (hdp->hd_dentry) -+ break; -+ AuDebugOn(dinfo->di_btop > dinfo->di_bbot || dinfo->di_bbot < 0); -+} -+ -+void au_update_dbtop(struct dentry *dentry) -+{ -+ aufs_bindex_t bindex, bbot; -+ struct dentry *h_dentry; -+ -+ bbot = au_dbbot(dentry); -+ for (bindex = au_dbtop(dentry); bindex <= bbot; bindex++) { -+ h_dentry = au_h_dptr(dentry, bindex); -+ if (!h_dentry) -+ continue; -+ if (d_is_positive(h_dentry)) { -+ au_set_dbtop(dentry, bindex); -+ return; -+ } -+ au_set_h_dptr(dentry, bindex, NULL); -+ } -+} -+ -+void au_update_dbbot(struct dentry *dentry) -+{ -+ aufs_bindex_t bindex, btop; -+ struct dentry *h_dentry; -+ -+ btop = au_dbtop(dentry); -+ for (bindex = au_dbbot(dentry); bindex >= btop; bindex--) { -+ h_dentry = au_h_dptr(dentry, bindex); -+ if (!h_dentry) -+ continue; -+ if (d_is_positive(h_dentry)) { -+ au_set_dbbot(dentry, bindex); -+ return; -+ } -+ au_set_h_dptr(dentry, bindex, NULL); -+ } -+} -+ -+int au_find_dbindex(struct dentry *dentry, struct dentry *h_dentry) -+{ -+ aufs_bindex_t bindex, bbot; -+ -+ bbot = au_dbbot(dentry); -+ for (bindex = au_dbtop(dentry); bindex <= bbot; bindex++) -+ if (au_h_dptr(dentry, bindex) == h_dentry) -+ return bindex; -+ return -1; -+} -diff -Naur null/fs/aufs/dir.c linux-5.15.36/fs/aufs/dir.c ---- /dev/null -+++ linux-5.15.36/fs/aufs/dir.c 2022-05-10 16:51:39.869744219 +0300 -@@ -0,0 +1,765 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program. If not, see . -+ */ -+ -+/* -+ * directory operations -+ */ -+ -+#include -+#include -+#include "aufs.h" -+ -+void au_add_nlink(struct inode *dir, struct inode *h_dir) -+{ -+ unsigned int nlink; -+ -+ AuDebugOn(!S_ISDIR(dir->i_mode) || !S_ISDIR(h_dir->i_mode)); -+ -+ nlink = dir->i_nlink; -+ nlink += h_dir->i_nlink - 2; -+ if (h_dir->i_nlink < 2) -+ nlink += 2; -+ smp_mb(); /* for i_nlink */ -+ /* 0 can happen in revaliding */ -+ set_nlink(dir, nlink); -+} -+ -+void au_sub_nlink(struct inode *dir, struct inode *h_dir) -+{ -+ unsigned int nlink; -+ -+ AuDebugOn(!S_ISDIR(dir->i_mode) || !S_ISDIR(h_dir->i_mode)); -+ -+ nlink = dir->i_nlink; -+ nlink -= h_dir->i_nlink - 2; -+ if (h_dir->i_nlink < 2) -+ nlink -= 2; -+ smp_mb(); /* for i_nlink */ -+ /* nlink == 0 means the branch-fs is broken */ -+ set_nlink(dir, nlink); -+} -+ -+loff_t au_dir_size(struct file *file, struct dentry *dentry) -+{ -+ loff_t sz; -+ aufs_bindex_t bindex, bbot; -+ struct file *h_file; -+ struct dentry *h_dentry; -+ -+ sz = 0; -+ if (file) { -+ AuDebugOn(!d_is_dir(file->f_path.dentry)); -+ -+ bbot = au_fbbot_dir(file); -+ for (bindex = au_fbtop(file); -+ bindex <= bbot && sz < KMALLOC_MAX_SIZE; -+ bindex++) { -+ h_file = au_hf_dir(file, bindex); -+ if (h_file && file_inode(h_file)) -+ sz += vfsub_f_size_read(h_file); -+ } -+ } else { -+ AuDebugOn(!dentry); -+ AuDebugOn(!d_is_dir(dentry)); -+ -+ bbot = au_dbtaildir(dentry); -+ for (bindex = au_dbtop(dentry); -+ bindex <= bbot && sz < KMALLOC_MAX_SIZE; -+ bindex++) { -+ h_dentry = au_h_dptr(dentry, bindex); -+ if (h_dentry && d_is_positive(h_dentry)) -+ sz += i_size_read(d_inode(h_dentry)); -+ } -+ } -+ if (sz < KMALLOC_MAX_SIZE) -+ sz = roundup_pow_of_two(sz); -+ if (sz > KMALLOC_MAX_SIZE) -+ sz = KMALLOC_MAX_SIZE; -+ else if (sz < NAME_MAX) { -+ BUILD_BUG_ON(AUFS_RDBLK_DEF < NAME_MAX); -+ sz = AUFS_RDBLK_DEF; -+ } -+ return sz; -+} -+ -+struct au_dir_ts_arg { -+ struct dentry *dentry; -+ aufs_bindex_t brid; -+}; -+ -+static void au_do_dir_ts(void *arg) -+{ -+ struct au_dir_ts_arg *a = arg; -+ struct au_dtime dt; -+ struct path h_path; -+ struct inode *dir, *h_dir; -+ struct super_block *sb; -+ struct au_branch *br; -+ struct au_hinode *hdir; -+ int err; -+ aufs_bindex_t btop, bindex; -+ -+ sb = a->dentry->d_sb; -+ if (d_really_is_negative(a->dentry)) -+ goto out; -+ /* no dir->i_mutex lock */ -+ aufs_read_lock(a->dentry, AuLock_DW); /* noflush */ -+ -+ dir = d_inode(a->dentry); -+ btop = au_ibtop(dir); -+ bindex = au_br_index(sb, a->brid); -+ if (bindex < btop) -+ goto out_unlock; -+ -+ br = au_sbr(sb, bindex); -+ h_path.dentry = au_h_dptr(a->dentry, bindex); -+ if (!h_path.dentry) -+ goto out_unlock; -+ h_path.mnt = au_br_mnt(br); -+ au_dtime_store(&dt, a->dentry, &h_path); -+ -+ br = au_sbr(sb, btop); -+ if (!au_br_writable(br->br_perm)) -+ goto out_unlock; -+ h_path.dentry = au_h_dptr(a->dentry, btop); -+ h_path.mnt = au_br_mnt(br); -+ err = vfsub_mnt_want_write(h_path.mnt); -+ if (err) -+ goto out_unlock; -+ hdir = au_hi(dir, btop); -+ au_hn_inode_lock_nested(hdir, AuLsc_I_PARENT); -+ h_dir = au_h_iptr(dir, btop); -+ if (h_dir->i_nlink -+ && timespec64_compare(&h_dir->i_mtime, &dt.dt_mtime) < 0) { -+ dt.dt_h_path = h_path; -+ au_dtime_revert(&dt); -+ } -+ au_hn_inode_unlock(hdir); -+ vfsub_mnt_drop_write(h_path.mnt); -+ au_cpup_attr_timesizes(dir); -+ -+out_unlock: -+ aufs_read_unlock(a->dentry, AuLock_DW); -+out: -+ dput(a->dentry); -+ au_nwt_done(&au_sbi(sb)->si_nowait); -+ au_kfree_try_rcu(arg); -+} -+ -+void au_dir_ts(struct inode *dir, aufs_bindex_t bindex) -+{ -+ int perm, wkq_err; -+ aufs_bindex_t btop; -+ struct au_dir_ts_arg *arg; -+ struct dentry *dentry; -+ struct super_block *sb; -+ -+ IMustLock(dir); -+ -+ dentry = d_find_any_alias(dir); -+ AuDebugOn(!dentry); -+ sb = dentry->d_sb; -+ btop = au_ibtop(dir); -+ if (btop == bindex) { -+ au_cpup_attr_timesizes(dir); -+ goto out; -+ } -+ -+ perm = au_sbr_perm(sb, btop); -+ if (!au_br_writable(perm)) -+ goto out; -+ -+ arg = kmalloc(sizeof(*arg), GFP_NOFS); -+ if (!arg) -+ goto out; -+ -+ arg->dentry = dget(dentry); /* will be dput-ted by au_do_dir_ts() */ -+ arg->brid = au_sbr_id(sb, bindex); -+ wkq_err = au_wkq_nowait(au_do_dir_ts, arg, sb, /*flags*/0); -+ if (unlikely(wkq_err)) { -+ pr_err("wkq %d\n", wkq_err); -+ dput(dentry); -+ au_kfree_try_rcu(arg); -+ } -+ -+out: -+ dput(dentry); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int reopen_dir(struct file *file) -+{ -+ int err; -+ unsigned int flags; -+ aufs_bindex_t bindex, btail, btop; -+ struct dentry *dentry, *h_dentry; -+ struct file *h_file; -+ -+ /* open all lower dirs */ -+ dentry = file->f_path.dentry; -+ btop = au_dbtop(dentry); -+ for (bindex = au_fbtop(file); bindex < btop; bindex++) -+ au_set_h_fptr(file, bindex, NULL); -+ au_set_fbtop(file, btop); -+ -+ btail = au_dbtaildir(dentry); -+ for (bindex = au_fbbot_dir(file); btail < bindex; bindex--) -+ au_set_h_fptr(file, bindex, NULL); -+ au_set_fbbot_dir(file, btail); -+ -+ flags = vfsub_file_flags(file); -+ for (bindex = btop; bindex <= btail; bindex++) { -+ h_dentry = au_h_dptr(dentry, bindex); -+ if (!h_dentry) -+ continue; -+ h_file = au_hf_dir(file, bindex); -+ if (h_file) -+ continue; -+ -+ h_file = au_h_open(dentry, bindex, flags, file, /*force_wr*/0); -+ err = PTR_ERR(h_file); -+ if (IS_ERR(h_file)) -+ goto out; /* close all? */ -+ au_set_h_fptr(file, bindex, h_file); -+ } -+ au_update_figen(file); -+ /* todo: necessary? */ -+ /* file->f_ra = h_file->f_ra; */ -+ err = 0; -+ -+out: -+ return err; -+} -+ -+static int do_open_dir(struct file *file, int flags, struct file *h_file) -+{ -+ int err; -+ aufs_bindex_t bindex, btail; -+ struct dentry *dentry, *h_dentry; -+ struct vfsmount *mnt; -+ -+ FiMustWriteLock(file); -+ AuDebugOn(h_file); -+ -+ err = 0; -+ mnt = file->f_path.mnt; -+ dentry = file->f_path.dentry; -+ file->f_version = inode_query_iversion(d_inode(dentry)); -+ bindex = au_dbtop(dentry); -+ au_set_fbtop(file, bindex); -+ btail = au_dbtaildir(dentry); -+ au_set_fbbot_dir(file, btail); -+ for (; !err && bindex <= btail; bindex++) { -+ h_dentry = au_h_dptr(dentry, bindex); -+ if (!h_dentry) -+ continue; -+ -+ err = vfsub_test_mntns(mnt, h_dentry->d_sb); -+ if (unlikely(err)) -+ break; -+ h_file = au_h_open(dentry, bindex, flags, file, /*force_wr*/0); -+ if (IS_ERR(h_file)) { -+ err = PTR_ERR(h_file); -+ break; -+ } -+ au_set_h_fptr(file, bindex, h_file); -+ } -+ au_update_figen(file); -+ /* todo: necessary? */ -+ /* file->f_ra = h_file->f_ra; */ -+ if (!err) -+ return 0; /* success */ -+ -+ /* close all */ -+ for (bindex = au_fbtop(file); bindex <= btail; bindex++) -+ au_set_h_fptr(file, bindex, NULL); -+ au_set_fbtop(file, -1); -+ au_set_fbbot_dir(file, -1); -+ -+ return err; -+} -+ -+static int aufs_open_dir(struct inode *inode __maybe_unused, -+ struct file *file) -+{ -+ int err; -+ struct super_block *sb; -+ struct au_fidir *fidir; -+ -+ err = -ENOMEM; -+ sb = file->f_path.dentry->d_sb; -+ si_read_lock(sb, AuLock_FLUSH); -+ fidir = au_fidir_alloc(sb); -+ if (fidir) { -+ struct au_do_open_args args = { -+ .open = do_open_dir, -+ .fidir = fidir -+ }; -+ err = au_do_open(file, &args); -+ if (unlikely(err)) -+ au_kfree_rcu(fidir); -+ } -+ si_read_unlock(sb); -+ return err; -+} -+ -+static int aufs_release_dir(struct inode *inode __maybe_unused, -+ struct file *file) -+{ -+ struct au_vdir *vdir_cache; -+ struct au_finfo *finfo; -+ struct au_fidir *fidir; -+ struct au_hfile *hf; -+ aufs_bindex_t bindex, bbot; -+ -+ finfo = au_fi(file); -+ fidir = finfo->fi_hdir; -+ if (fidir) { -+ au_hbl_del(&finfo->fi_hlist, -+ &au_sbi(file->f_path.dentry->d_sb)->si_files); -+ vdir_cache = fidir->fd_vdir_cache; /* lock-free */ -+ if (vdir_cache) -+ au_vdir_free(vdir_cache); -+ -+ bindex = finfo->fi_btop; -+ if (bindex >= 0) { -+ hf = fidir->fd_hfile + bindex; -+ /* -+ * calls fput() instead of filp_close(), -+ * since no dnotify or lock for the lower file. -+ */ -+ bbot = fidir->fd_bbot; -+ for (; bindex <= bbot; bindex++, hf++) -+ if (hf->hf_file) -+ au_hfput(hf, /*execed*/0); -+ } -+ au_kfree_rcu(fidir); -+ finfo->fi_hdir = NULL; -+ } -+ au_finfo_fin(file); -+ return 0; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int au_do_flush_dir(struct file *file, fl_owner_t id) -+{ -+ int err; -+ aufs_bindex_t bindex, bbot; -+ struct file *h_file; -+ -+ err = 0; -+ bbot = au_fbbot_dir(file); -+ for (bindex = au_fbtop(file); !err && bindex <= bbot; bindex++) { -+ h_file = au_hf_dir(file, bindex); -+ if (h_file) -+ err = vfsub_flush(h_file, id); -+ } -+ return err; -+} -+ -+static int aufs_flush_dir(struct file *file, fl_owner_t id) -+{ -+ return au_do_flush(file, id, au_do_flush_dir); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int au_do_fsync_dir_no_file(struct dentry *dentry, int datasync) -+{ -+ int err; -+ aufs_bindex_t bbot, bindex; -+ struct inode *inode; -+ struct super_block *sb; -+ -+ err = 0; -+ sb = dentry->d_sb; -+ inode = d_inode(dentry); -+ IMustLock(inode); -+ bbot = au_dbbot(dentry); -+ for (bindex = au_dbtop(dentry); !err && bindex <= bbot; bindex++) { -+ struct path h_path; -+ -+ if (au_test_ro(sb, bindex, inode)) -+ continue; -+ h_path.dentry = au_h_dptr(dentry, bindex); -+ if (!h_path.dentry) -+ continue; -+ -+ h_path.mnt = au_sbr_mnt(sb, bindex); -+ err = vfsub_fsync(NULL, &h_path, datasync); -+ } -+ -+ return err; -+} -+ -+static int au_do_fsync_dir(struct file *file, int datasync) -+{ -+ int err; -+ aufs_bindex_t bbot, bindex; -+ struct file *h_file; -+ struct super_block *sb; -+ struct inode *inode; -+ -+ err = au_reval_and_lock_fdi(file, reopen_dir, /*wlock*/1, /*fi_lsc*/0); -+ if (unlikely(err)) -+ goto out; -+ -+ inode = file_inode(file); -+ sb = inode->i_sb; -+ bbot = au_fbbot_dir(file); -+ for (bindex = au_fbtop(file); !err && bindex <= bbot; bindex++) { -+ h_file = au_hf_dir(file, bindex); -+ if (!h_file || au_test_ro(sb, bindex, inode)) -+ continue; -+ -+ err = vfsub_fsync(h_file, &h_file->f_path, datasync); -+ } -+ -+out: -+ return err; -+} -+ -+/* -+ * @file may be NULL -+ */ -+static int aufs_fsync_dir(struct file *file, loff_t start, loff_t end, -+ int datasync) -+{ -+ int err; -+ struct dentry *dentry; -+ struct inode *inode; -+ struct super_block *sb; -+ -+ err = 0; -+ dentry = file->f_path.dentry; -+ inode = d_inode(dentry); -+ inode_lock(inode); -+ sb = dentry->d_sb; -+ si_noflush_read_lock(sb); -+ if (file) -+ err = au_do_fsync_dir(file, datasync); -+ else { -+ di_write_lock_child(dentry); -+ err = au_do_fsync_dir_no_file(dentry, datasync); -+ } -+ au_cpup_attr_timesizes(inode); -+ di_write_unlock(dentry); -+ if (file) -+ fi_write_unlock(file); -+ -+ si_read_unlock(sb); -+ inode_unlock(inode); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int aufs_iterate_shared(struct file *file, struct dir_context *ctx) -+{ -+ int err; -+ struct dentry *dentry; -+ struct inode *inode, *h_inode; -+ struct super_block *sb; -+ -+ AuDbg("%pD, ctx{%ps, %llu}\n", file, ctx->actor, ctx->pos); -+ -+ dentry = file->f_path.dentry; -+ inode = d_inode(dentry); -+ IMustLock(inode); -+ -+ sb = dentry->d_sb; -+ si_read_lock(sb, AuLock_FLUSH); -+ err = au_reval_and_lock_fdi(file, reopen_dir, /*wlock*/1, /*fi_lsc*/0); -+ if (unlikely(err)) -+ goto out; -+ err = au_alive_dir(dentry); -+ if (!err) -+ err = au_vdir_init(file); -+ di_downgrade_lock(dentry, AuLock_IR); -+ if (unlikely(err)) -+ goto out_unlock; -+ -+ h_inode = au_h_iptr(inode, au_ibtop(inode)); -+ if (!au_test_nfsd()) { -+ err = au_vdir_fill_de(file, ctx); -+ fsstack_copy_attr_atime(inode, h_inode); -+ } else { -+ /* -+ * nfsd filldir may call lookup_one_len(), vfs_getattr(), -+ * encode_fh() and others. -+ */ -+ atomic_inc(&h_inode->i_count); -+ di_read_unlock(dentry, AuLock_IR); -+ si_read_unlock(sb); -+ err = au_vdir_fill_de(file, ctx); -+ fsstack_copy_attr_atime(inode, h_inode); -+ fi_write_unlock(file); -+ iput(h_inode); -+ -+ AuTraceErr(err); -+ return err; -+ } -+ -+out_unlock: -+ di_read_unlock(dentry, AuLock_IR); -+ fi_write_unlock(file); -+out: -+ si_read_unlock(sb); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+#define AuTestEmpty_WHONLY 1 -+#define AuTestEmpty_CALLED (1 << 1) -+#define AuTestEmpty_SHWH (1 << 2) -+#define au_ftest_testempty(flags, name) ((flags) & AuTestEmpty_##name) -+#define au_fset_testempty(flags, name) \ -+ do { (flags) |= AuTestEmpty_##name; } while (0) -+#define au_fclr_testempty(flags, name) \ -+ do { (flags) &= ~AuTestEmpty_##name; } while (0) -+ -+#ifndef CONFIG_AUFS_SHWH -+#undef AuTestEmpty_SHWH -+#define AuTestEmpty_SHWH 0 -+#endif -+ -+struct test_empty_arg { -+ struct dir_context ctx; -+ struct au_nhash *whlist; -+ unsigned int flags; -+ int err; -+ aufs_bindex_t bindex; -+}; -+ -+static int test_empty_cb(struct dir_context *ctx, const char *__name, -+ int namelen, loff_t offset __maybe_unused, u64 ino, -+ unsigned int d_type) -+{ -+ struct test_empty_arg *arg = container_of(ctx, struct test_empty_arg, -+ ctx); -+ char *name = (void *)__name; -+ -+ arg->err = 0; -+ au_fset_testempty(arg->flags, CALLED); -+ /* smp_mb(); */ -+ if (name[0] == '.' -+ && (namelen == 1 || (name[1] == '.' && namelen == 2))) -+ goto out; /* success */ -+ -+ if (namelen <= AUFS_WH_PFX_LEN -+ || memcmp(name, AUFS_WH_PFX, AUFS_WH_PFX_LEN)) { -+ if (au_ftest_testempty(arg->flags, WHONLY) -+ && !au_nhash_test_known_wh(arg->whlist, name, namelen)) -+ arg->err = -ENOTEMPTY; -+ goto out; -+ } -+ -+ name += AUFS_WH_PFX_LEN; -+ namelen -= AUFS_WH_PFX_LEN; -+ if (!au_nhash_test_known_wh(arg->whlist, name, namelen)) -+ arg->err = au_nhash_append_wh -+ (arg->whlist, name, namelen, ino, d_type, arg->bindex, -+ au_ftest_testempty(arg->flags, SHWH)); -+ -+out: -+ /* smp_mb(); */ -+ AuTraceErr(arg->err); -+ return arg->err; -+} -+ -+static int do_test_empty(struct dentry *dentry, struct test_empty_arg *arg) -+{ -+ int err; -+ struct file *h_file; -+ struct au_branch *br; -+ -+ h_file = au_h_open(dentry, arg->bindex, -+ O_RDONLY | O_NONBLOCK | O_DIRECTORY | O_LARGEFILE, -+ /*file*/NULL, /*force_wr*/0); -+ err = PTR_ERR(h_file); -+ if (IS_ERR(h_file)) -+ goto out; -+ -+ err = 0; -+ if (!au_opt_test(au_mntflags(dentry->d_sb), UDBA_NONE) -+ && !file_inode(h_file)->i_nlink) -+ goto out_put; -+ -+ do { -+ arg->err = 0; -+ au_fclr_testempty(arg->flags, CALLED); -+ /* smp_mb(); */ -+ err = vfsub_iterate_dir(h_file, &arg->ctx); -+ if (err >= 0) -+ err = arg->err; -+ } while (!err && au_ftest_testempty(arg->flags, CALLED)); -+ -+out_put: -+ fput(h_file); -+ br = au_sbr(dentry->d_sb, arg->bindex); -+ au_lcnt_dec(&br->br_nfiles); -+out: -+ return err; -+} -+ -+struct do_test_empty_args { -+ int *errp; -+ struct dentry *dentry; -+ struct test_empty_arg *arg; -+}; -+ -+static void call_do_test_empty(void *args) -+{ -+ struct do_test_empty_args *a = args; -+ *a->errp = do_test_empty(a->dentry, a->arg); -+} -+ -+static int sio_test_empty(struct dentry *dentry, struct test_empty_arg *arg) -+{ -+ int err, wkq_err; -+ struct dentry *h_dentry; -+ struct inode *h_inode; -+ struct user_namespace *h_userns; -+ -+ h_userns = au_sbr_userns(dentry->d_sb, arg->bindex); -+ h_dentry = au_h_dptr(dentry, arg->bindex); -+ h_inode = d_inode(h_dentry); -+ /* todo: i_mode changes anytime? */ -+ inode_lock_shared_nested(h_inode, AuLsc_I_CHILD); -+ err = au_test_h_perm_sio(h_userns, h_inode, MAY_EXEC | MAY_READ); -+ inode_unlock_shared(h_inode); -+ if (!err) -+ err = do_test_empty(dentry, arg); -+ else { -+ struct do_test_empty_args args = { -+ .errp = &err, -+ .dentry = dentry, -+ .arg = arg -+ }; -+ unsigned int flags = arg->flags; -+ -+ wkq_err = au_wkq_wait(call_do_test_empty, &args); -+ if (unlikely(wkq_err)) -+ err = wkq_err; -+ arg->flags = flags; -+ } -+ -+ return err; -+} -+ -+int au_test_empty_lower(struct dentry *dentry) -+{ -+ int err; -+ unsigned int rdhash; -+ aufs_bindex_t bindex, btop, btail; -+ struct au_nhash whlist; -+ struct test_empty_arg arg = { -+ .ctx = { -+ .actor = test_empty_cb -+ } -+ }; -+ int (*test_empty)(struct dentry *dentry, struct test_empty_arg *arg); -+ -+ SiMustAnyLock(dentry->d_sb); -+ -+ rdhash = au_sbi(dentry->d_sb)->si_rdhash; -+ if (!rdhash) -+ rdhash = au_rdhash_est(au_dir_size(/*file*/NULL, dentry)); -+ err = au_nhash_alloc(&whlist, rdhash, GFP_NOFS); -+ if (unlikely(err)) -+ goto out; -+ -+ arg.flags = 0; -+ arg.whlist = &whlist; -+ btop = au_dbtop(dentry); -+ if (au_opt_test(au_mntflags(dentry->d_sb), SHWH)) -+ au_fset_testempty(arg.flags, SHWH); -+ test_empty = do_test_empty; -+ if (au_opt_test(au_mntflags(dentry->d_sb), DIRPERM1)) -+ test_empty = sio_test_empty; -+ arg.bindex = btop; -+ err = test_empty(dentry, &arg); -+ if (unlikely(err)) -+ goto out_whlist; -+ -+ au_fset_testempty(arg.flags, WHONLY); -+ btail = au_dbtaildir(dentry); -+ for (bindex = btop + 1; !err && bindex <= btail; bindex++) { -+ struct dentry *h_dentry; -+ -+ h_dentry = au_h_dptr(dentry, bindex); -+ if (h_dentry && d_is_positive(h_dentry)) { -+ arg.bindex = bindex; -+ err = test_empty(dentry, &arg); -+ } -+ } -+ -+out_whlist: -+ au_nhash_wh_free(&whlist); -+out: -+ return err; -+} -+ -+int au_test_empty(struct dentry *dentry, struct au_nhash *whlist) -+{ -+ int err; -+ struct test_empty_arg arg = { -+ .ctx = { -+ .actor = test_empty_cb -+ } -+ }; -+ aufs_bindex_t bindex, btail; -+ -+ err = 0; -+ arg.whlist = whlist; -+ arg.flags = AuTestEmpty_WHONLY; -+ if (au_opt_test(au_mntflags(dentry->d_sb), SHWH)) -+ au_fset_testempty(arg.flags, SHWH); -+ btail = au_dbtaildir(dentry); -+ for (bindex = au_dbtop(dentry); !err && bindex <= btail; bindex++) { -+ struct dentry *h_dentry; -+ -+ h_dentry = au_h_dptr(dentry, bindex); -+ if (h_dentry && d_is_positive(h_dentry)) { -+ arg.bindex = bindex; -+ err = sio_test_empty(dentry, &arg); -+ } -+ } -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+const struct file_operations aufs_dir_fop = { -+ .owner = THIS_MODULE, -+ .llseek = default_llseek, -+ .read = generic_read_dir, -+ .iterate_shared = aufs_iterate_shared, -+ .unlocked_ioctl = aufs_ioctl_dir, -+#ifdef CONFIG_COMPAT -+ .compat_ioctl = aufs_compat_ioctl_dir, -+#endif -+ .open = aufs_open_dir, -+ .release = aufs_release_dir, -+ .flush = aufs_flush_dir, -+ .fsync = aufs_fsync_dir -+}; -diff -Naur null/fs/aufs/dir.h linux-5.15.36/fs/aufs/dir.h ---- /dev/null -+++ linux-5.15.36/fs/aufs/dir.h 2022-05-10 16:51:39.869744219 +0300 -@@ -0,0 +1,134 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program. If not, see . -+ */ -+ -+/* -+ * directory operations -+ */ -+ -+#ifndef __AUFS_DIR_H__ -+#define __AUFS_DIR_H__ -+ -+#ifdef __KERNEL__ -+ -+#include -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* need to be faster and smaller */ -+ -+struct au_nhash { -+ unsigned int nh_num; -+ struct hlist_head *nh_head; -+}; -+ -+struct au_vdir_destr { -+ unsigned char len; -+ unsigned char name[]; -+} __packed; -+ -+struct au_vdir_dehstr { -+ struct hlist_node hash; -+ struct au_vdir_destr *str; -+ struct rcu_head rcu; -+} ____cacheline_aligned_in_smp; -+ -+struct au_vdir_de { -+ ino_t de_ino; -+ unsigned char de_type; -+ /* caution: packed */ -+ struct au_vdir_destr de_str; -+} __packed; -+ -+struct au_vdir_wh { -+ struct hlist_node wh_hash; -+#ifdef CONFIG_AUFS_SHWH -+ ino_t wh_ino; -+ aufs_bindex_t wh_bindex; -+ unsigned char wh_type; -+#else -+ aufs_bindex_t wh_bindex; -+#endif -+ /* caution: packed */ -+ struct au_vdir_destr wh_str; -+} __packed; -+ -+union au_vdir_deblk_p { -+ unsigned char *deblk; -+ struct au_vdir_de *de; -+}; -+ -+struct au_vdir { -+ unsigned char **vd_deblk; -+ unsigned long vd_nblk; -+ struct { -+ unsigned long ul; -+ union au_vdir_deblk_p p; -+ } vd_last; -+ -+ u64 vd_version; -+ unsigned int vd_deblk_sz; -+ unsigned long vd_jiffy; -+ struct rcu_head rcu; -+} ____cacheline_aligned_in_smp; -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* dir.c */ -+extern const struct file_operations aufs_dir_fop; -+void au_add_nlink(struct inode *dir, struct inode *h_dir); -+void au_sub_nlink(struct inode *dir, struct inode *h_dir); -+loff_t au_dir_size(struct file *file, struct dentry *dentry); -+void au_dir_ts(struct inode *dir, aufs_bindex_t bsrc); -+int au_test_empty_lower(struct dentry *dentry); -+int au_test_empty(struct dentry *dentry, struct au_nhash *whlist); -+ -+/* vdir.c */ -+unsigned int au_rdhash_est(loff_t sz); -+int au_nhash_alloc(struct au_nhash *nhash, unsigned int num_hash, gfp_t gfp); -+void au_nhash_wh_free(struct au_nhash *whlist); -+int au_nhash_test_longer_wh(struct au_nhash *whlist, aufs_bindex_t btgt, -+ int limit); -+int au_nhash_test_known_wh(struct au_nhash *whlist, char *name, int nlen); -+int au_nhash_append_wh(struct au_nhash *whlist, char *name, int nlen, ino_t ino, -+ unsigned int d_type, aufs_bindex_t bindex, -+ unsigned char shwh); -+void au_vdir_free(struct au_vdir *vdir); -+int au_vdir_init(struct file *file); -+int au_vdir_fill_de(struct file *file, struct dir_context *ctx); -+ -+/* ioctl.c */ -+long aufs_ioctl_dir(struct file *file, unsigned int cmd, unsigned long arg); -+ -+#ifdef CONFIG_AUFS_RDU -+/* rdu.c */ -+long au_rdu_ioctl(struct file *file, unsigned int cmd, unsigned long arg); -+#ifdef CONFIG_COMPAT -+long au_rdu_compat_ioctl(struct file *file, unsigned int cmd, -+ unsigned long arg); -+#endif -+#else -+AuStub(long, au_rdu_ioctl, return -EINVAL, struct file *file, -+ unsigned int cmd, unsigned long arg) -+#ifdef CONFIG_COMPAT -+AuStub(long, au_rdu_compat_ioctl, return -EINVAL, struct file *file, -+ unsigned int cmd, unsigned long arg) -+#endif -+#endif -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_DIR_H__ */ -diff -Naur null/fs/aufs/dirren.c linux-5.15.36/fs/aufs/dirren.c ---- /dev/null -+++ linux-5.15.36/fs/aufs/dirren.c 2022-05-10 16:51:39.869744219 +0300 -@@ -0,0 +1,1315 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2017-2021 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program. If not, see . -+ */ -+ -+/* -+ * special handling in renaming a directory -+ * in order to support looking-up the before-renamed name on the lower readonly -+ * branches -+ */ -+ -+#include -+#include "aufs.h" -+ -+static void au_dr_hino_del(struct au_dr_br *dr, struct au_dr_hino *ent) -+{ -+ int idx; -+ -+ idx = au_dr_ihash(ent->dr_h_ino); -+ au_hbl_del(&ent->dr_hnode, dr->dr_h_ino + idx); -+} -+ -+static int au_dr_hino_test_empty(struct au_dr_br *dr) -+{ -+ int ret, i; -+ struct hlist_bl_head *hbl; -+ -+ ret = 1; -+ for (i = 0; ret && i < AuDirren_NHASH; i++) { -+ hbl = dr->dr_h_ino + i; -+ hlist_bl_lock(hbl); -+ ret &= hlist_bl_empty(hbl); -+ hlist_bl_unlock(hbl); -+ } -+ -+ return ret; -+} -+ -+static struct au_dr_hino *au_dr_hino_find(struct au_dr_br *dr, ino_t ino) -+{ -+ struct au_dr_hino *found, *ent; -+ struct hlist_bl_head *hbl; -+ struct hlist_bl_node *pos; -+ int idx; -+ -+ found = NULL; -+ idx = au_dr_ihash(ino); -+ hbl = dr->dr_h_ino + idx; -+ hlist_bl_lock(hbl); -+ hlist_bl_for_each_entry(ent, pos, hbl, dr_hnode) -+ if (ent->dr_h_ino == ino) { -+ found = ent; -+ break; -+ } -+ hlist_bl_unlock(hbl); -+ -+ return found; -+} -+ -+int au_dr_hino_test_add(struct au_dr_br *dr, ino_t ino, -+ struct au_dr_hino *add_ent) -+{ -+ int found, idx; -+ struct hlist_bl_head *hbl; -+ struct hlist_bl_node *pos; -+ struct au_dr_hino *ent; -+ -+ found = 0; -+ idx = au_dr_ihash(ino); -+ hbl = dr->dr_h_ino + idx; -+#if 0 /* debug print */ -+ { -+ struct hlist_bl_node *tmp; -+ -+ hlist_bl_for_each_entry_safe(ent, pos, tmp, hbl, dr_hnode) -+ AuDbg("hi%llu\n", (unsigned long long)ent->dr_h_ino); -+ } -+#endif -+ hlist_bl_lock(hbl); -+ hlist_bl_for_each_entry(ent, pos, hbl, dr_hnode) -+ if (ent->dr_h_ino == ino) { -+ found = 1; -+ break; -+ } -+ if (!found && add_ent) -+ hlist_bl_add_head(&add_ent->dr_hnode, hbl); -+ hlist_bl_unlock(hbl); -+ -+ if (!found && add_ent) -+ AuDbg("i%llu added\n", (unsigned long long)add_ent->dr_h_ino); -+ -+ return found; -+} -+ -+void au_dr_hino_free(struct au_dr_br *dr) -+{ -+ int i; -+ struct hlist_bl_head *hbl; -+ struct hlist_bl_node *pos, *tmp; -+ struct au_dr_hino *ent; -+ -+ /* SiMustWriteLock(sb); */ -+ -+ for (i = 0; i < AuDirren_NHASH; i++) { -+ hbl = dr->dr_h_ino + i; -+ /* no spinlock since sbinfo must be write-locked */ -+ hlist_bl_for_each_entry_safe(ent, pos, tmp, hbl, dr_hnode) -+ au_kfree_rcu(ent); -+ INIT_HLIST_BL_HEAD(hbl); -+ } -+} -+ -+/* returns the number of inodes or an error */ -+static int au_dr_hino_store(struct super_block *sb, struct au_branch *br, -+ struct file *hinofile) -+{ -+ int err, i; -+ ssize_t ssz; -+ loff_t pos, oldsize; -+ __be64 u64; -+ struct inode *hinoinode; -+ struct hlist_bl_head *hbl; -+ struct hlist_bl_node *n1, *n2; -+ struct au_dr_hino *ent; -+ -+ SiMustWriteLock(sb); -+ AuDebugOn(!au_br_writable(br->br_perm)); -+ -+ hinoinode = file_inode(hinofile); -+ oldsize = i_size_read(hinoinode); -+ -+ err = 0; -+ pos = 0; -+ hbl = br->br_dirren.dr_h_ino; -+ for (i = 0; !err && i < AuDirren_NHASH; i++, hbl++) { -+ /* no bit-lock since sbinfo must be write-locked */ -+ hlist_bl_for_each_entry_safe(ent, n1, n2, hbl, dr_hnode) { -+ AuDbg("hi%llu, %pD2\n", -+ (unsigned long long)ent->dr_h_ino, hinofile); -+ u64 = cpu_to_be64(ent->dr_h_ino); -+ ssz = vfsub_write_k(hinofile, &u64, sizeof(u64), &pos); -+ if (ssz == sizeof(u64)) -+ continue; -+ -+ /* write error */ -+ pr_err("ssz %zd, %pD2\n", ssz, hinofile); -+ err = -ENOSPC; -+ if (ssz < 0) -+ err = ssz; -+ break; -+ } -+ } -+ /* regardless the error */ -+ if (pos < oldsize) { -+ err = vfsub_trunc(&hinofile->f_path, pos, /*attr*/0, hinofile); -+ AuTraceErr(err); -+ } -+ -+ AuTraceErr(err); -+ return err; -+} -+ -+static int au_dr_hino_load(struct au_dr_br *dr, struct file *hinofile) -+{ -+ int err, hidx; -+ ssize_t ssz; -+ size_t sz, n; -+ loff_t pos; -+ uint64_t u64; -+ struct au_dr_hino *ent; -+ struct inode *hinoinode; -+ struct hlist_bl_head *hbl; -+ -+ err = 0; -+ pos = 0; -+ hbl = dr->dr_h_ino; -+ hinoinode = file_inode(hinofile); -+ sz = i_size_read(hinoinode); -+ AuDebugOn(sz % sizeof(u64)); -+ n = sz / sizeof(u64); -+ while (n--) { -+ ssz = vfsub_read_k(hinofile, &u64, sizeof(u64), &pos); -+ if (unlikely(ssz != sizeof(u64))) { -+ pr_err("ssz %zd, %pD2\n", ssz, hinofile); -+ err = -EINVAL; -+ if (ssz < 0) -+ err = ssz; -+ goto out_free; -+ } -+ -+ ent = kmalloc(sizeof(*ent), GFP_NOFS); -+ if (!ent) { -+ err = -ENOMEM; -+ AuTraceErr(err); -+ goto out_free; -+ } -+ ent->dr_h_ino = be64_to_cpu((__force __be64)u64); -+ AuDbg("hi%llu, %pD2\n", -+ (unsigned long long)ent->dr_h_ino, hinofile); -+ hidx = au_dr_ihash(ent->dr_h_ino); -+ au_hbl_add(&ent->dr_hnode, hbl + hidx); -+ } -+ goto out; /* success */ -+ -+out_free: -+ au_dr_hino_free(dr); -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+/* -+ * @bindex/@br is a switch to distinguish whether suspending hnotify or not. -+ * @path is a switch to distinguish load and store. -+ */ -+static int au_dr_hino(struct super_block *sb, aufs_bindex_t bindex, -+ struct au_branch *br, const struct path *path) -+{ -+ int err, flags; -+ unsigned char load, suspend; -+ struct file *hinofile; -+ struct au_hinode *hdir; -+ struct inode *dir, *delegated; -+ struct path hinopath; -+ struct qstr hinoname = QSTR_INIT(AUFS_WH_DR_BRHINO, -+ sizeof(AUFS_WH_DR_BRHINO) - 1); -+ -+ AuDebugOn(bindex < 0 && !br); -+ AuDebugOn(bindex >= 0 && br); -+ -+ err = -EINVAL; -+ suspend = !br; -+ if (suspend) -+ br = au_sbr(sb, bindex); -+ load = !!path; -+ if (!load) { -+ path = &br->br_path; -+ AuDebugOn(!au_br_writable(br->br_perm)); -+ if (unlikely(!au_br_writable(br->br_perm))) -+ goto out; -+ } -+ -+ hdir = NULL; -+ if (suspend) { -+ dir = d_inode(sb->s_root); -+ hdir = au_hinode(au_ii(dir), bindex); -+ dir = hdir->hi_inode; -+ au_hn_inode_lock_nested(hdir, AuLsc_I_CHILD); -+ } else { -+ dir = d_inode(path->dentry); -+ inode_lock_nested(dir, AuLsc_I_CHILD); -+ } -+ hinopath.mnt = path->mnt; -+ hinopath.dentry = vfsub_lkup_one(&hinoname, (struct path *)path); -+ err = PTR_ERR(hinopath.dentry); -+ if (IS_ERR(hinopath.dentry)) -+ goto out_unlock; -+ -+ err = 0; -+ flags = O_RDONLY; -+ if (load) { -+ if (d_is_negative(hinopath.dentry)) -+ goto out_dput; /* success */ -+ } else { -+ 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); -+ 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; -+ } else if (!d_is_positive(hinopath.dentry)) { -+ err = vfsub_create(dir, &hinopath, 0600, -+ /*want_excl*/false); -+ AuTraceErr(err); -+ if (unlikely(err)) -+ goto out_dput; -+ } -+ flags = O_WRONLY; -+ } -+ hinofile = vfsub_dentry_open(&hinopath, flags); -+ if (suspend) -+ au_hn_inode_unlock(hdir); -+ else -+ inode_unlock(dir); -+ dput(hinopath.dentry); -+ AuTraceErrPtr(hinofile); -+ if (IS_ERR(hinofile)) { -+ err = PTR_ERR(hinofile); -+ goto out; -+ } -+ -+ if (load) -+ err = au_dr_hino_load(&br->br_dirren, hinofile); -+ else -+ err = au_dr_hino_store(sb, br, hinofile); -+ fput(hinofile); -+ goto out; -+ -+out_dput: -+ dput(hinopath.dentry); -+out_unlock: -+ if (suspend) -+ au_hn_inode_unlock(hdir); -+ else -+ inode_unlock(dir); -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int au_dr_brid_init(struct au_dr_brid *brid, const struct path *path) -+{ -+ int err; -+ struct kstatfs kstfs; -+ dev_t dev; -+ struct dentry *dentry; -+ struct super_block *sb; -+ -+ err = vfs_statfs((void *)path, &kstfs); -+ AuTraceErr(err); -+ if (unlikely(err)) -+ goto out; -+ -+ /* todo: support for UUID */ -+ -+ if (kstfs.f_fsid.val[0] || kstfs.f_fsid.val[1]) { -+ brid->type = AuBrid_FSID; -+ brid->fsid = kstfs.f_fsid; -+ } else { -+ dentry = path->dentry; -+ sb = dentry->d_sb; -+ dev = sb->s_dev; -+ if (dev) { -+ brid->type = AuBrid_DEV; -+ brid->dev = dev; -+ } -+ } -+ -+out: -+ return err; -+} -+ -+int au_dr_br_init(struct super_block *sb, struct au_branch *br, -+ const struct path *path) -+{ -+ int err, i; -+ struct au_dr_br *dr; -+ struct hlist_bl_head *hbl; -+ -+ dr = &br->br_dirren; -+ hbl = dr->dr_h_ino; -+ for (i = 0; i < AuDirren_NHASH; i++, hbl++) -+ INIT_HLIST_BL_HEAD(hbl); -+ -+ err = au_dr_brid_init(&dr->dr_brid, path); -+ if (unlikely(err)) -+ goto out; -+ -+ if (au_opt_test(au_mntflags(sb), DIRREN)) -+ err = au_dr_hino(sb, /*bindex*/-1, br, path); -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+int au_dr_br_fin(struct super_block *sb, struct au_branch *br) -+{ -+ int err; -+ -+ err = 0; -+ if (au_br_writable(br->br_perm)) -+ err = au_dr_hino(sb, /*bindex*/-1, br, /*path*/NULL); -+ if (!err) -+ au_dr_hino_free(&br->br_dirren); -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int au_brid_str(struct au_dr_brid *brid, struct inode *h_inode, -+ char *buf, size_t sz) -+{ -+ int err; -+ unsigned int major, minor; -+ char *p; -+ -+ p = buf; -+ err = snprintf(p, sz, "%d_", brid->type); -+ AuDebugOn(err > sz); -+ p += err; -+ sz -= err; -+ switch (brid->type) { -+ case AuBrid_Unset: -+ return -EINVAL; -+ case AuBrid_UUID: -+ err = snprintf(p, sz, "%pU", brid->uuid.b); -+ break; -+ case AuBrid_FSID: -+ err = snprintf(p, sz, "%08x-%08x", -+ brid->fsid.val[0], brid->fsid.val[1]); -+ break; -+ case AuBrid_DEV: -+ major = MAJOR(brid->dev); -+ minor = MINOR(brid->dev); -+ if (major <= 0xff && minor <= 0xff) -+ err = snprintf(p, sz, "%02x%02x", major, minor); -+ else -+ err = snprintf(p, sz, "%03x:%05x", major, minor); -+ break; -+ } -+ AuDebugOn(err > sz); -+ p += err; -+ sz -= err; -+ err = snprintf(p, sz, "_%llu", (unsigned long long)h_inode->i_ino); -+ AuDebugOn(err > sz); -+ p += err; -+ sz -= err; -+ -+ return p - buf; -+} -+ -+static int au_drinfo_name(struct au_branch *br, char *name, int len) -+{ -+ int rlen; -+ struct dentry *br_dentry; -+ struct inode *br_inode; -+ -+ br_dentry = au_br_dentry(br); -+ br_inode = d_inode(br_dentry); -+ rlen = au_brid_str(&br->br_dirren.dr_brid, br_inode, name, len); -+ AuDebugOn(rlen >= AUFS_DIRREN_ENV_VAL_SZ); -+ AuDebugOn(rlen > len); -+ -+ return rlen; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * from the given @h_dentry, construct drinfo at @*fdata. -+ * when the size of @*fdata is not enough, reallocate and return new @fdata and -+ * @allocated. -+ */ -+static int au_drinfo_construct(struct au_drinfo_fdata **fdata, -+ struct dentry *h_dentry, -+ unsigned char *allocated) -+{ -+ int err, v; -+ struct au_drinfo_fdata *f, *p; -+ struct au_drinfo *drinfo; -+ struct inode *h_inode; -+ struct qstr *qname; -+ -+ err = 0; -+ f = *fdata; -+ h_inode = d_inode(h_dentry); -+ qname = &h_dentry->d_name; -+ drinfo = &f->drinfo; -+ drinfo->ino = (__force uint64_t)cpu_to_be64(h_inode->i_ino); -+ drinfo->oldnamelen = qname->len; -+ if (*allocated < sizeof(*f) + qname->len) { -+ v = roundup_pow_of_two(*allocated + qname->len); -+ p = au_krealloc(f, v, GFP_NOFS, /*may_shrink*/0); -+ if (unlikely(!p)) { -+ err = -ENOMEM; -+ AuTraceErr(err); -+ goto out; -+ } -+ f = p; -+ *fdata = f; -+ *allocated = v; -+ drinfo = &f->drinfo; -+ } -+ memcpy(drinfo->oldname, qname->name, qname->len); -+ AuDbg("i%llu, %.*s\n", -+ be64_to_cpu((__force __be64)drinfo->ino), drinfo->oldnamelen, -+ drinfo->oldname); -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+/* callers have to free the return value */ -+static struct au_drinfo *au_drinfo_read_k(struct file *file, ino_t h_ino) -+{ -+ struct au_drinfo *ret, *drinfo; -+ struct au_drinfo_fdata fdata; -+ int len; -+ loff_t pos; -+ ssize_t ssz; -+ -+ ret = ERR_PTR(-EIO); -+ pos = 0; -+ ssz = vfsub_read_k(file, &fdata, sizeof(fdata), &pos); -+ if (unlikely(ssz != sizeof(fdata))) { -+ AuIOErr("ssz %zd, %u, %pD2\n", -+ ssz, (unsigned int)sizeof(fdata), file); -+ goto out; -+ } -+ -+ fdata.magic = ntohl((__force __be32)fdata.magic); -+ switch (fdata.magic) { -+ case AUFS_DRINFO_MAGIC_V1: -+ break; -+ default: -+ AuIOErr("magic-num 0x%x, 0x%x, %pD2\n", -+ fdata.magic, AUFS_DRINFO_MAGIC_V1, file); -+ goto out; -+ } -+ -+ drinfo = &fdata.drinfo; -+ len = drinfo->oldnamelen; -+ if (!len) { -+ AuIOErr("broken drinfo %pD2\n", file); -+ goto out; -+ } -+ -+ ret = NULL; -+ drinfo->ino = be64_to_cpu((__force __be64)drinfo->ino); -+ if (unlikely(h_ino && drinfo->ino != h_ino)) { -+ AuDbg("ignored i%llu, i%llu, %pD2\n", -+ (unsigned long long)drinfo->ino, -+ (unsigned long long)h_ino, file); -+ goto out; /* success */ -+ } -+ -+ ret = kmalloc(sizeof(*ret) + len, GFP_NOFS); -+ if (unlikely(!ret)) { -+ ret = ERR_PTR(-ENOMEM); -+ AuTraceErrPtr(ret); -+ goto out; -+ } -+ -+ *ret = *drinfo; -+ ssz = vfsub_read_k(file, (void *)ret->oldname, len, &pos); -+ if (unlikely(ssz != len)) { -+ au_kfree_rcu(ret); -+ ret = ERR_PTR(-EIO); -+ AuIOErr("ssz %zd, %u, %pD2\n", ssz, len, file); -+ goto out; -+ } -+ -+ AuDbg("oldname %.*s\n", ret->oldnamelen, ret->oldname); -+ -+out: -+ return ret; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* in order to be revertible */ -+struct au_drinfo_rev_elm { -+ int created; -+ struct dentry *info_dentry; -+ struct au_drinfo *info_last; -+}; -+ -+struct au_drinfo_rev { -+ unsigned char already; -+ aufs_bindex_t nelm; -+ struct au_drinfo_rev_elm elm[]; -+}; -+ -+/* todo: isn't it too large? */ -+struct au_drinfo_store { -+ struct path h_ppath; -+ struct dentry *h_dentry; -+ struct au_drinfo_fdata *fdata; -+ char *infoname; /* inside of whname, just after PFX */ -+ char whname[sizeof(AUFS_WH_DR_INFO_PFX) + AUFS_DIRREN_ENV_VAL_SZ]; -+ aufs_bindex_t btgt, btail; -+ unsigned char no_sio, -+ allocated, /* current size of *fdata */ -+ infonamelen, /* room size for p */ -+ whnamelen, /* length of the generated name */ -+ renameback; /* renamed back */ -+}; -+ -+/* on rename(2) error, the caller should revert it using @elm */ -+static int au_drinfo_do_store(struct au_drinfo_store *w, -+ struct au_drinfo_rev_elm *elm) -+{ -+ int err, len; -+ ssize_t ssz; -+ loff_t pos; -+ struct path infopath = { -+ .mnt = w->h_ppath.mnt -+ }; -+ struct inode *h_dir, *h_inode, *delegated; -+ struct file *infofile; -+ struct qstr *qname; -+ -+ AuDebugOn(elm -+ && memcmp(elm, page_address(ZERO_PAGE(0)), sizeof(*elm))); -+ -+ infopath.dentry = vfsub_lookup_one_len(w->whname, &w->h_ppath, -+ w->whnamelen); -+ AuTraceErrPtr(infopath.dentry); -+ if (IS_ERR(infopath.dentry)) { -+ err = PTR_ERR(infopath.dentry); -+ goto out; -+ } -+ -+ err = 0; -+ h_dir = d_inode(w->h_ppath.dentry); -+ if (elm && d_is_negative(infopath.dentry)) { -+ err = vfsub_create(h_dir, &infopath, 0600, /*want_excl*/true); -+ AuTraceErr(err); -+ if (unlikely(err)) -+ goto out_dput; -+ elm->created = 1; -+ elm->info_dentry = dget(infopath.dentry); -+ } -+ -+ infofile = vfsub_dentry_open(&infopath, O_RDWR); -+ AuTraceErrPtr(infofile); -+ if (IS_ERR(infofile)) { -+ err = PTR_ERR(infofile); -+ goto out_dput; -+ } -+ -+ h_inode = d_inode(infopath.dentry); -+ if (elm && i_size_read(h_inode)) { -+ h_inode = d_inode(w->h_dentry); -+ elm->info_last = au_drinfo_read_k(infofile, h_inode->i_ino); -+ AuTraceErrPtr(elm->info_last); -+ if (IS_ERR(elm->info_last)) { -+ err = PTR_ERR(elm->info_last); -+ elm->info_last = NULL; -+ AuDebugOn(elm->info_dentry); -+ goto out_fput; -+ } -+ } -+ -+ if (elm && w->renameback) { -+ delegated = NULL; -+ err = vfsub_unlink(h_dir, &infopath, &delegated, /*force*/0); -+ AuTraceErr(err); -+ if (unlikely(err == -EWOULDBLOCK)) -+ iput(delegated); -+ goto out_fput; -+ } -+ -+ pos = 0; -+ qname = &w->h_dentry->d_name; -+ len = sizeof(*w->fdata) + qname->len; -+ if (!elm) -+ len = sizeof(*w->fdata) + w->fdata->drinfo.oldnamelen; -+ ssz = vfsub_write_k(infofile, w->fdata, len, &pos); -+ if (ssz == len) { -+ AuDbg("hi%llu, %.*s\n", w->fdata->drinfo.ino, -+ w->fdata->drinfo.oldnamelen, w->fdata->drinfo.oldname); -+ goto out_fput; /* success */ -+ } else { -+ err = -EIO; -+ if (ssz < 0) -+ err = ssz; -+ /* the caller should revert it using @elm */ -+ } -+ -+out_fput: -+ fput(infofile); -+out_dput: -+ dput(infopath.dentry); -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+struct au_call_drinfo_do_store_args { -+ int *errp; -+ struct au_drinfo_store *w; -+ struct au_drinfo_rev_elm *elm; -+}; -+ -+static void au_call_drinfo_do_store(void *args) -+{ -+ struct au_call_drinfo_do_store_args *a = args; -+ -+ *a->errp = au_drinfo_do_store(a->w, a->elm); -+} -+ -+static int au_drinfo_store_sio(struct au_drinfo_store *w, -+ struct au_drinfo_rev_elm *elm) -+{ -+ int err, wkq_err; -+ -+ if (w->no_sio) -+ err = au_drinfo_do_store(w, elm); -+ else { -+ struct au_call_drinfo_do_store_args a = { -+ .errp = &err, -+ .w = w, -+ .elm = elm -+ }; -+ wkq_err = au_wkq_wait(au_call_drinfo_do_store, &a); -+ if (unlikely(wkq_err)) -+ err = wkq_err; -+ } -+ AuTraceErr(err); -+ -+ return err; -+} -+ -+static int au_drinfo_store_work_init(struct au_drinfo_store *w, -+ aufs_bindex_t btgt) -+{ -+ int err; -+ -+ memset(w, 0, sizeof(*w)); -+ w->allocated = roundup_pow_of_two(sizeof(*w->fdata) + 40); -+ strcpy(w->whname, AUFS_WH_DR_INFO_PFX); -+ w->infoname = w->whname + sizeof(AUFS_WH_DR_INFO_PFX) - 1; -+ w->infonamelen = sizeof(w->whname) - sizeof(AUFS_WH_DR_INFO_PFX); -+ w->btgt = btgt; -+ w->no_sio = !!uid_eq(current_fsuid(), GLOBAL_ROOT_UID); -+ -+ err = -ENOMEM; -+ w->fdata = kcalloc(1, w->allocated, GFP_NOFS); -+ if (unlikely(!w->fdata)) { -+ AuTraceErr(err); -+ goto out; -+ } -+ w->fdata->magic = (__force uint32_t)htonl(AUFS_DRINFO_MAGIC_V1); -+ err = 0; -+ -+out: -+ return err; -+} -+ -+static void au_drinfo_store_work_fin(struct au_drinfo_store *w) -+{ -+ au_kfree_rcu(w->fdata); -+} -+ -+static void au_drinfo_store_rev(struct au_drinfo_rev *rev, -+ struct au_drinfo_store *w) -+{ -+ struct au_drinfo_rev_elm *elm; -+ struct inode *h_dir, *delegated; -+ int err, nelm; -+ struct path infopath = { -+ .mnt = w->h_ppath.mnt -+ }; -+ -+ h_dir = d_inode(w->h_ppath.dentry); -+ IMustLock(h_dir); -+ -+ err = 0; -+ elm = rev->elm; -+ for (nelm = rev->nelm; nelm > 0; nelm--, elm++) { -+ 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); -+ AuTraceErr(err); -+ if (unlikely(err == -EWOULDBLOCK)) -+ iput(delegated); -+ dput(elm->info_dentry); -+ } else if (elm->info_last) { -+ AuDbg("here\n"); -+ w->fdata->drinfo = *elm->info_last; -+ memcpy(w->fdata->drinfo.oldname, -+ elm->info_last->oldname, -+ elm->info_last->oldnamelen); -+ err = au_drinfo_store_sio(w, /*elm*/NULL); -+ au_kfree_rcu(elm->info_last); -+ } -+ if (unlikely(err)) -+ AuIOErr("%d, %s\n", err, w->whname); -+ /* go on even if err */ -+ } -+} -+ -+/* caller has to call au_dr_rename_fin() later */ -+static int au_drinfo_store(struct dentry *dentry, aufs_bindex_t btgt, -+ struct qstr *dst_name, void *_rev) -+{ -+ int err, sz, nelm; -+ aufs_bindex_t bindex, btail; -+ struct au_drinfo_store work; -+ struct au_drinfo_rev *rev, **p; -+ struct au_drinfo_rev_elm *elm; -+ struct super_block *sb; -+ struct au_branch *br; -+ struct au_hinode *hdir; -+ -+ err = au_drinfo_store_work_init(&work, btgt); -+ AuTraceErr(err); -+ if (unlikely(err)) -+ goto out; -+ -+ err = -ENOMEM; -+ btail = au_dbtaildir(dentry); -+ nelm = btail - btgt; -+ sz = sizeof(*rev) + sizeof(*elm) * nelm; -+ rev = kcalloc(1, sz, GFP_NOFS); -+ if (unlikely(!rev)) { -+ AuTraceErr(err); -+ goto out_args; -+ } -+ rev->nelm = nelm; -+ elm = rev->elm; -+ p = _rev; -+ *p = rev; -+ -+ err = 0; -+ sb = dentry->d_sb; -+ work.h_ppath.dentry = au_h_dptr(dentry, btgt); -+ work.h_ppath.mnt = au_sbr_mnt(sb, btgt); -+ hdir = au_hi(d_inode(dentry), btgt); -+ au_hn_inode_lock_nested(hdir, AuLsc_I_CHILD); -+ for (bindex = btgt + 1; bindex <= btail; bindex++, elm++) { -+ work.h_dentry = au_h_dptr(dentry, bindex); -+ if (!work.h_dentry) -+ continue; -+ -+ err = au_drinfo_construct(&work.fdata, work.h_dentry, -+ &work.allocated); -+ AuTraceErr(err); -+ if (unlikely(err)) -+ break; -+ -+ work.renameback = au_qstreq(&work.h_dentry->d_name, dst_name); -+ br = au_sbr(sb, bindex); -+ work.whnamelen = sizeof(AUFS_WH_DR_INFO_PFX) - 1; -+ work.whnamelen += au_drinfo_name(br, work.infoname, -+ work.infonamelen); -+ AuDbg("whname %.*s, i%llu, %.*s\n", -+ work.whnamelen, work.whname, -+ be64_to_cpu((__force __be64)work.fdata->drinfo.ino), -+ work.fdata->drinfo.oldnamelen, -+ work.fdata->drinfo.oldname); -+ -+ err = au_drinfo_store_sio(&work, elm); -+ AuTraceErr(err); -+ if (unlikely(err)) -+ break; -+ } -+ if (unlikely(err)) { -+ /* revert all drinfo */ -+ au_drinfo_store_rev(rev, &work); -+ au_kfree_try_rcu(rev); -+ *p = NULL; -+ } -+ au_hn_inode_unlock(hdir); -+ -+out_args: -+ au_drinfo_store_work_fin(&work); -+out: -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+int au_dr_rename(struct dentry *src, aufs_bindex_t bindex, -+ struct qstr *dst_name, void *_rev) -+{ -+ int err, already; -+ ino_t ino; -+ struct super_block *sb; -+ struct au_branch *br; -+ struct au_dr_br *dr; -+ struct dentry *h_dentry; -+ struct inode *h_inode; -+ struct au_dr_hino *ent; -+ struct au_drinfo_rev *rev, **p; -+ -+ AuDbg("bindex %d\n", bindex); -+ -+ err = -ENOMEM; -+ ent = kmalloc(sizeof(*ent), GFP_NOFS); -+ if (unlikely(!ent)) -+ goto out; -+ -+ sb = src->d_sb; -+ br = au_sbr(sb, bindex); -+ dr = &br->br_dirren; -+ h_dentry = au_h_dptr(src, bindex); -+ h_inode = d_inode(h_dentry); -+ ino = h_inode->i_ino; -+ ent->dr_h_ino = ino; -+ already = au_dr_hino_test_add(dr, ino, ent); -+ AuDbg("b%d, hi%llu, already %d\n", -+ bindex, (unsigned long long)ino, already); -+ -+ err = au_drinfo_store(src, bindex, dst_name, _rev); -+ AuTraceErr(err); -+ if (!err) { -+ p = _rev; -+ rev = *p; -+ rev->already = already; -+ goto out; /* success */ -+ } -+ -+ /* revert */ -+ if (!already) -+ au_dr_hino_del(dr, ent); -+ au_kfree_rcu(ent); -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+void au_dr_rename_fin(struct dentry *src, aufs_bindex_t btgt, void *_rev) -+{ -+ struct au_drinfo_rev *rev; -+ struct au_drinfo_rev_elm *elm; -+ int nelm; -+ -+ rev = _rev; -+ elm = rev->elm; -+ for (nelm = rev->nelm; nelm > 0; nelm--, elm++) { -+ dput(elm->info_dentry); -+ au_kfree_rcu(elm->info_last); -+ } -+ au_kfree_try_rcu(rev); -+} -+ -+void au_dr_rename_rev(struct dentry *src, aufs_bindex_t btgt, void *_rev) -+{ -+ int err; -+ struct au_drinfo_store work; -+ struct au_drinfo_rev *rev = _rev; -+ struct super_block *sb; -+ struct au_branch *br; -+ struct inode *h_inode; -+ struct au_dr_br *dr; -+ struct au_dr_hino *ent; -+ -+ err = au_drinfo_store_work_init(&work, btgt); -+ if (unlikely(err)) -+ goto out; -+ -+ sb = src->d_sb; -+ br = au_sbr(sb, btgt); -+ work.h_ppath.dentry = au_h_dptr(src, btgt); -+ work.h_ppath.mnt = au_br_mnt(br); -+ au_drinfo_store_rev(rev, &work); -+ au_drinfo_store_work_fin(&work); -+ if (rev->already) -+ goto out; -+ -+ dr = &br->br_dirren; -+ h_inode = d_inode(work.h_ppath.dentry); -+ ent = au_dr_hino_find(dr, h_inode->i_ino); -+ BUG_ON(!ent); -+ au_dr_hino_del(dr, ent); -+ au_kfree_rcu(ent); -+ -+out: -+ au_kfree_try_rcu(rev); -+ if (unlikely(err)) -+ pr_err("failed to remove dirren info\n"); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static struct au_drinfo *au_drinfo_do_load(struct path *h_ppath, -+ char *whname, int whnamelen, -+ struct dentry **info_dentry) -+{ -+ struct au_drinfo *drinfo; -+ struct file *f; -+ struct inode *h_dir; -+ struct path infopath; -+ int unlocked; -+ -+ AuDbg("%pd/%.*s\n", h_ppath->dentry, whnamelen, whname); -+ -+ *info_dentry = NULL; -+ drinfo = NULL; -+ unlocked = 0; -+ h_dir = d_inode(h_ppath->dentry); -+ inode_lock_shared_nested(h_dir, AuLsc_I_PARENT); -+ infopath.dentry = vfsub_lookup_one_len(whname, h_ppath, whnamelen); -+ if (IS_ERR(infopath.dentry)) { -+ drinfo = (void *)infopath.dentry; -+ goto out; -+ } -+ -+ if (d_is_negative(infopath.dentry)) -+ goto out_dput; /* success */ -+ -+ infopath.mnt = h_ppath->mnt; -+ f = vfsub_dentry_open(&infopath, O_RDONLY); -+ inode_unlock_shared(h_dir); -+ unlocked = 1; -+ if (IS_ERR(f)) { -+ drinfo = (void *)f; -+ goto out_dput; -+ } -+ -+ drinfo = au_drinfo_read_k(f, /*h_ino*/0); -+ if (IS_ERR_OR_NULL(drinfo)) -+ goto out_fput; -+ -+ AuDbg("oldname %.*s\n", drinfo->oldnamelen, drinfo->oldname); -+ *info_dentry = dget(infopath.dentry); /* keep it alive */ -+ -+out_fput: -+ fput(f); -+out_dput: -+ dput(infopath.dentry); -+out: -+ if (!unlocked) -+ inode_unlock_shared(h_dir); -+ AuTraceErrPtr(drinfo); -+ return drinfo; -+} -+ -+struct au_drinfo_do_load_args { -+ struct au_drinfo **drinfop; -+ struct path *h_ppath; -+ char *whname; -+ int whnamelen; -+ struct dentry **info_dentry; -+}; -+ -+static void au_call_drinfo_do_load(void *args) -+{ -+ struct au_drinfo_do_load_args *a = args; -+ -+ *a->drinfop = au_drinfo_do_load(a->h_ppath, a->whname, a->whnamelen, -+ a->info_dentry); -+} -+ -+struct au_drinfo_load { -+ struct path h_ppath; -+ struct qstr *qname; -+ unsigned char no_sio; -+ -+ aufs_bindex_t ninfo; -+ struct au_drinfo **drinfo; -+}; -+ -+static int au_drinfo_load(struct au_drinfo_load *w, aufs_bindex_t bindex, -+ struct au_branch *br) -+{ -+ int err, wkq_err, whnamelen, e; -+ char whname[sizeof(AUFS_WH_DR_INFO_PFX) + AUFS_DIRREN_ENV_VAL_SZ] -+ = AUFS_WH_DR_INFO_PFX; -+ struct au_drinfo *drinfo; -+ struct qstr oldname; -+ struct inode *h_dir, *delegated; -+ struct dentry *info_dentry; -+ struct path infopath; -+ -+ whnamelen = sizeof(AUFS_WH_DR_INFO_PFX) - 1; -+ whnamelen += au_drinfo_name(br, whname + whnamelen, -+ sizeof(whname) - whnamelen); -+ if (w->no_sio) -+ drinfo = au_drinfo_do_load(&w->h_ppath, whname, whnamelen, -+ &info_dentry); -+ else { -+ struct au_drinfo_do_load_args args = { -+ .drinfop = &drinfo, -+ .h_ppath = &w->h_ppath, -+ .whname = whname, -+ .whnamelen = whnamelen, -+ .info_dentry = &info_dentry -+ }; -+ wkq_err = au_wkq_wait(au_call_drinfo_do_load, &args); -+ if (unlikely(wkq_err)) -+ drinfo = ERR_PTR(wkq_err); -+ } -+ err = PTR_ERR(drinfo); -+ if (IS_ERR_OR_NULL(drinfo)) -+ goto out; -+ -+ err = 0; -+ oldname.len = drinfo->oldnamelen; -+ oldname.name = drinfo->oldname; -+ if (au_qstreq(w->qname, &oldname)) { -+ /* the name is renamed back */ -+ au_kfree_rcu(drinfo); -+ drinfo = NULL; -+ -+ 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); -+ 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; -+ dput(info_dentry); -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static void au_dr_lkup_free(struct au_drinfo **drinfo, int n) -+{ -+ struct au_drinfo **p = drinfo; -+ -+ while (n-- > 0) -+ au_kfree_rcu(*drinfo++); -+ au_kfree_try_rcu(p); -+} -+ -+int au_dr_lkup(struct au_do_lookup_args *lkup, struct dentry *dentry, -+ aufs_bindex_t btgt) -+{ -+ int err, ninfo; -+ struct au_drinfo_load w; -+ aufs_bindex_t bindex, bbot; -+ struct au_branch *br; -+ struct inode *h_dir; -+ struct au_dr_hino *ent; -+ struct super_block *sb; -+ -+ AuDbg("%.*s, name %.*s, whname %.*s, b%d\n", -+ AuLNPair(&dentry->d_name), AuLNPair(&lkup->dirren.dr_name), -+ AuLNPair(&lkup->whname), btgt); -+ -+ sb = dentry->d_sb; -+ bbot = au_sbbot(sb); -+ w.ninfo = bbot + 1; -+ if (!lkup->dirren.drinfo) { -+ lkup->dirren.drinfo = kcalloc(w.ninfo, -+ sizeof(*lkup->dirren.drinfo), -+ GFP_NOFS); -+ if (unlikely(!lkup->dirren.drinfo)) { -+ err = -ENOMEM; -+ goto out; -+ } -+ lkup->dirren.ninfo = w.ninfo; -+ } -+ w.drinfo = lkup->dirren.drinfo; -+ w.no_sio = !!uid_eq(current_fsuid(), GLOBAL_ROOT_UID); -+ w.h_ppath.dentry = au_h_dptr(dentry, btgt); -+ AuDebugOn(!w.h_ppath.dentry); -+ w.h_ppath.mnt = au_sbr_mnt(sb, btgt); -+ w.qname = &dentry->d_name; -+ -+ ninfo = 0; -+ for (bindex = btgt + 1; bindex <= bbot; bindex++) { -+ br = au_sbr(sb, bindex); -+ err = au_drinfo_load(&w, bindex, br); -+ if (unlikely(err)) -+ goto out_free; -+ if (w.drinfo[bindex]) -+ ninfo++; -+ } -+ if (!ninfo) { -+ br = au_sbr(sb, btgt); -+ h_dir = d_inode(w.h_ppath.dentry); -+ ent = au_dr_hino_find(&br->br_dirren, h_dir->i_ino); -+ AuDebugOn(!ent); -+ au_dr_hino_del(&br->br_dirren, ent); -+ au_kfree_rcu(ent); -+ } -+ goto out; /* success */ -+ -+out_free: -+ au_dr_lkup_free(lkup->dirren.drinfo, lkup->dirren.ninfo); -+ lkup->dirren.ninfo = 0; -+ lkup->dirren.drinfo = NULL; -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+void au_dr_lkup_fin(struct au_do_lookup_args *lkup) -+{ -+ au_dr_lkup_free(lkup->dirren.drinfo, lkup->dirren.ninfo); -+} -+ -+int au_dr_lkup_name(struct au_do_lookup_args *lkup, aufs_bindex_t btgt) -+{ -+ int err; -+ struct au_drinfo *drinfo; -+ -+ err = 0; -+ if (!lkup->dirren.drinfo) -+ goto out; -+ AuDebugOn(lkup->dirren.ninfo <= btgt); -+ drinfo = lkup->dirren.drinfo[btgt]; -+ if (!drinfo) -+ goto out; -+ -+ au_kfree_try_rcu(lkup->whname.name); -+ lkup->whname.name = NULL; -+ lkup->dirren.dr_name.len = drinfo->oldnamelen; -+ lkup->dirren.dr_name.name = drinfo->oldname; -+ lkup->name = &lkup->dirren.dr_name; -+ err = au_wh_name_alloc(&lkup->whname, lkup->name); -+ if (!err) -+ AuDbg("name %.*s, whname %.*s, b%d\n", -+ AuLNPair(lkup->name), AuLNPair(&lkup->whname), -+ btgt); -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+int au_dr_lkup_h_ino(struct au_do_lookup_args *lkup, aufs_bindex_t bindex, -+ ino_t h_ino) -+{ -+ int match; -+ struct au_drinfo *drinfo; -+ -+ match = 1; -+ if (!lkup->dirren.drinfo) -+ goto out; -+ AuDebugOn(lkup->dirren.ninfo <= bindex); -+ drinfo = lkup->dirren.drinfo[bindex]; -+ if (!drinfo) -+ goto out; -+ -+ match = (drinfo->ino == h_ino); -+ AuDbg("match %d\n", match); -+ -+out: -+ return match; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+int au_dr_opt_set(struct super_block *sb) -+{ -+ int err; -+ aufs_bindex_t bindex, bbot; -+ struct au_branch *br; -+ -+ err = 0; -+ bbot = au_sbbot(sb); -+ for (bindex = 0; !err && bindex <= bbot; bindex++) { -+ br = au_sbr(sb, bindex); -+ err = au_dr_hino(sb, bindex, /*br*/NULL, &br->br_path); -+ } -+ -+ return err; -+} -+ -+int au_dr_opt_flush(struct super_block *sb) -+{ -+ int err; -+ aufs_bindex_t bindex, bbot; -+ struct au_branch *br; -+ -+ err = 0; -+ bbot = au_sbbot(sb); -+ for (bindex = 0; !err && bindex <= bbot; bindex++) { -+ br = au_sbr(sb, bindex); -+ if (au_br_writable(br->br_perm)) -+ err = au_dr_hino(sb, bindex, /*br*/NULL, /*path*/NULL); -+ } -+ -+ return err; -+} -+ -+int au_dr_opt_clr(struct super_block *sb, int no_flush) -+{ -+ int err; -+ aufs_bindex_t bindex, bbot; -+ struct au_branch *br; -+ -+ err = 0; -+ if (!no_flush) { -+ err = au_dr_opt_flush(sb); -+ if (unlikely(err)) -+ goto out; -+ } -+ -+ bbot = au_sbbot(sb); -+ for (bindex = 0; bindex <= bbot; bindex++) { -+ br = au_sbr(sb, bindex); -+ au_dr_hino_free(&br->br_dirren); -+ } -+ -+out: -+ return err; -+} -diff -Naur null/fs/aufs/dirren.h linux-5.15.36/fs/aufs/dirren.h ---- /dev/null -+++ linux-5.15.36/fs/aufs/dirren.h 2022-05-10 16:51:39.869744219 +0300 -@@ -0,0 +1,140 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * Copyright (C) 2017-2021 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program. If not, see . -+ */ -+ -+/* -+ * renamed dir info -+ */ -+ -+#ifndef __AUFS_DIRREN_H__ -+#define __AUFS_DIRREN_H__ -+ -+#ifdef __KERNEL__ -+ -+#include -+#include -+#include -+#include "hbl.h" -+ -+#define AuDirren_NHASH 100 -+ -+#ifdef CONFIG_AUFS_DIRREN -+enum au_brid_type { -+ AuBrid_Unset, -+ AuBrid_UUID, -+ AuBrid_FSID, -+ AuBrid_DEV -+}; -+ -+struct au_dr_brid { -+ enum au_brid_type type; -+ union { -+ uuid_t uuid; /* unimplemented yet */ -+ fsid_t fsid; -+ dev_t dev; -+ }; -+}; -+ -+/* 20 is the max digits length of ulong 64 */ -+/* brid-type "_" uuid "_" inum */ -+#define AUFS_DIRREN_FNAME_SZ (1 + 1 + UUID_STRING_LEN + 20) -+#define AUFS_DIRREN_ENV_VAL_SZ (AUFS_DIRREN_FNAME_SZ + 1 + 20) -+ -+struct au_dr_hino { -+ struct hlist_bl_node dr_hnode; -+ ino_t dr_h_ino; -+}; -+ -+struct au_dr_br { -+ struct hlist_bl_head dr_h_ino[AuDirren_NHASH]; -+ struct au_dr_brid dr_brid; -+}; -+ -+struct au_dr_lookup { -+ /* dr_name is pointed by struct au_do_lookup_args.name */ -+ struct qstr dr_name; /* subset of dr_info */ -+ aufs_bindex_t ninfo; -+ struct au_drinfo **drinfo; -+}; -+#else -+struct au_dr_hino; -+/* empty */ -+struct au_dr_br { }; -+struct au_dr_lookup { }; -+#endif -+ -+/* ---------------------------------------------------------------------- */ -+ -+struct au_branch; -+struct au_do_lookup_args; -+struct au_hinode; -+#ifdef CONFIG_AUFS_DIRREN -+int au_dr_hino_test_add(struct au_dr_br *dr, ino_t h_ino, -+ struct au_dr_hino *add_ent); -+void au_dr_hino_free(struct au_dr_br *dr); -+int au_dr_br_init(struct super_block *sb, struct au_branch *br, -+ const struct path *path); -+int au_dr_br_fin(struct super_block *sb, struct au_branch *br); -+int au_dr_rename(struct dentry *src, aufs_bindex_t bindex, -+ struct qstr *dst_name, void *_rev); -+void au_dr_rename_fin(struct dentry *src, aufs_bindex_t btgt, void *rev); -+void au_dr_rename_rev(struct dentry *src, aufs_bindex_t bindex, void *rev); -+int au_dr_lkup(struct au_do_lookup_args *lkup, struct dentry *dentry, -+ aufs_bindex_t bindex); -+int au_dr_lkup_name(struct au_do_lookup_args *lkup, aufs_bindex_t btgt); -+int au_dr_lkup_h_ino(struct au_do_lookup_args *lkup, aufs_bindex_t bindex, -+ ino_t h_ino); -+void au_dr_lkup_fin(struct au_do_lookup_args *lkup); -+int au_dr_opt_set(struct super_block *sb); -+int au_dr_opt_flush(struct super_block *sb); -+int au_dr_opt_clr(struct super_block *sb, int no_flush); -+#else -+AuStubInt0(au_dr_hino_test_add, struct au_dr_br *dr, ino_t h_ino, -+ struct au_dr_hino *add_ent); -+AuStubVoid(au_dr_hino_free, struct au_dr_br *dr); -+AuStubInt0(au_dr_br_init, struct super_block *sb, struct au_branch *br, -+ const struct path *path); -+AuStubInt0(au_dr_br_fin, struct super_block *sb, struct au_branch *br); -+AuStubInt0(au_dr_rename, struct dentry *src, aufs_bindex_t bindex, -+ struct qstr *dst_name, void *_rev); -+AuStubVoid(au_dr_rename_fin, struct dentry *src, aufs_bindex_t btgt, void *rev); -+AuStubVoid(au_dr_rename_rev, struct dentry *src, aufs_bindex_t bindex, -+ void *rev); -+AuStubInt0(au_dr_lkup, struct au_do_lookup_args *lkup, struct dentry *dentry, -+ aufs_bindex_t bindex); -+AuStubInt0(au_dr_lkup_name, struct au_do_lookup_args *lkup, aufs_bindex_t btgt); -+AuStubInt0(au_dr_lkup_h_ino, struct au_do_lookup_args *lkup, -+ aufs_bindex_t bindex, ino_t h_ino); -+AuStubVoid(au_dr_lkup_fin, struct au_do_lookup_args *lkup); -+AuStubInt0(au_dr_opt_set, struct super_block *sb); -+AuStubInt0(au_dr_opt_flush, struct super_block *sb); -+AuStubInt0(au_dr_opt_clr, struct super_block *sb, int no_flush); -+#endif -+ -+/* ---------------------------------------------------------------------- */ -+ -+#ifdef CONFIG_AUFS_DIRREN -+static inline int au_dr_ihash(ino_t h_ino) -+{ -+ return h_ino % AuDirren_NHASH; -+} -+#else -+AuStubInt0(au_dr_ihash, ino_t h_ino); -+#endif -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_DIRREN_H__ */ -diff -Naur null/fs/aufs/dynop.c linux-5.15.36/fs/aufs/dynop.c ---- /dev/null -+++ linux-5.15.36/fs/aufs/dynop.c 2022-05-10 16:51:39.869744219 +0300 -@@ -0,0 +1,368 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2010-2021 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program. If not, see . -+ */ -+ -+/* -+ * dynamically customizable operations for regular files -+ */ -+ -+#include "aufs.h" -+ -+#define DyPrSym(key) AuDbgSym(key->dk_op.dy_hop) -+ -+/* -+ * How large will these lists be? -+ * Usually just a few elements, 20-30 at most for each, I guess. -+ */ -+static struct hlist_bl_head dynop[AuDyLast]; -+ -+static struct au_dykey *dy_gfind_get(struct hlist_bl_head *hbl, -+ const void *h_op) -+{ -+ struct au_dykey *key, *tmp; -+ struct hlist_bl_node *pos; -+ -+ key = NULL; -+ hlist_bl_lock(hbl); -+ hlist_bl_for_each_entry(tmp, pos, hbl, dk_hnode) -+ if (tmp->dk_op.dy_hop == h_op) { -+ if (kref_get_unless_zero(&tmp->dk_kref)) -+ key = tmp; -+ break; -+ } -+ hlist_bl_unlock(hbl); -+ -+ return key; -+} -+ -+static struct au_dykey *dy_bradd(struct au_branch *br, struct au_dykey *key) -+{ -+ struct au_dykey **k, *found; -+ const void *h_op = key->dk_op.dy_hop; -+ int i; -+ -+ found = NULL; -+ k = br->br_dykey; -+ for (i = 0; i < AuBrDynOp; i++) -+ if (k[i]) { -+ if (k[i]->dk_op.dy_hop == h_op) { -+ found = k[i]; -+ break; -+ } -+ } else -+ break; -+ if (!found) { -+ spin_lock(&br->br_dykey_lock); -+ for (; i < AuBrDynOp; i++) -+ if (k[i]) { -+ if (k[i]->dk_op.dy_hop == h_op) { -+ found = k[i]; -+ break; -+ } -+ } else { -+ k[i] = key; -+ break; -+ } -+ spin_unlock(&br->br_dykey_lock); -+ BUG_ON(i == AuBrDynOp); /* expand the array */ -+ } -+ -+ return found; -+} -+ -+/* kref_get() if @key is already added */ -+static struct au_dykey *dy_gadd(struct hlist_bl_head *hbl, struct au_dykey *key) -+{ -+ struct au_dykey *tmp, *found; -+ struct hlist_bl_node *pos; -+ const void *h_op = key->dk_op.dy_hop; -+ -+ found = NULL; -+ hlist_bl_lock(hbl); -+ hlist_bl_for_each_entry(tmp, pos, hbl, dk_hnode) -+ if (tmp->dk_op.dy_hop == h_op) { -+ if (kref_get_unless_zero(&tmp->dk_kref)) -+ found = tmp; -+ break; -+ } -+ if (!found) -+ hlist_bl_add_head(&key->dk_hnode, hbl); -+ hlist_bl_unlock(hbl); -+ -+ if (!found) -+ DyPrSym(key); -+ return found; -+} -+ -+static void dy_free_rcu(struct rcu_head *rcu) -+{ -+ struct au_dykey *key; -+ -+ key = container_of(rcu, struct au_dykey, dk_rcu); -+ DyPrSym(key); -+ kfree(key); -+} -+ -+static void dy_free(struct kref *kref) -+{ -+ struct au_dykey *key; -+ struct hlist_bl_head *hbl; -+ -+ key = container_of(kref, struct au_dykey, dk_kref); -+ hbl = dynop + key->dk_op.dy_type; -+ au_hbl_del(&key->dk_hnode, hbl); -+ call_rcu(&key->dk_rcu, dy_free_rcu); -+} -+ -+void au_dy_put(struct au_dykey *key) -+{ -+ kref_put(&key->dk_kref, dy_free); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+#define DyDbgSize(cnt, op) AuDebugOn(cnt != sizeof(op)/sizeof(void *)) -+ -+#ifdef CONFIG_AUFS_DEBUG -+#define DyDbgDeclare(cnt) unsigned int cnt = 0 -+#define DyDbgInc(cnt) do { cnt++; } while (0) -+#else -+#define DyDbgDeclare(cnt) do {} while (0) -+#define DyDbgInc(cnt) do {} while (0) -+#endif -+ -+#define DySet(func, dst, src, h_op, h_sb) do { \ -+ DyDbgInc(cnt); \ -+ if (h_op->func) { \ -+ if (src.func) \ -+ dst.func = src.func; \ -+ else \ -+ AuDbg("%s %s\n", au_sbtype(h_sb), #func); \ -+ } \ -+} while (0) -+ -+#define DySetForce(func, dst, src) do { \ -+ AuDebugOn(!src.func); \ -+ DyDbgInc(cnt); \ -+ dst.func = src.func; \ -+} while (0) -+ -+#define DySetAop(func) \ -+ DySet(func, dyaop->da_op, aufs_aop, h_aop, h_sb) -+#define DySetAopForce(func) \ -+ DySetForce(func, dyaop->da_op, aufs_aop) -+ -+static void dy_aop(struct au_dykey *key, const void *h_op, -+ struct super_block *h_sb __maybe_unused) -+{ -+ struct au_dyaop *dyaop = (void *)key; -+ const struct address_space_operations *h_aop = h_op; -+ DyDbgDeclare(cnt); -+ -+ AuDbg("%s\n", au_sbtype(h_sb)); -+ -+ DySetAop(writepage); -+ DySetAopForce(readpage); /* force */ -+ DySetAop(writepages); -+ DySetAop(set_page_dirty); -+ DySetAop(readpages); -+ DySetAop(readahead); -+ DySetAop(write_begin); -+ DySetAop(write_end); -+ DySetAop(bmap); -+ DySetAop(invalidatepage); -+ DySetAop(releasepage); -+ DySetAop(freepage); -+ /* this one will be changed according to an aufs mount option */ -+ DySetAop(direct_IO); -+ DySetAop(migratepage); -+ DySetAop(isolate_page); -+ DySetAop(putback_page); -+ DySetAop(launder_page); -+ DySetAop(is_partially_uptodate); -+ DySetAop(is_dirty_writeback); -+ DySetAop(error_remove_page); -+ DySetAop(swap_activate); -+ DySetAop(swap_deactivate); -+ -+ DyDbgSize(cnt, *h_aop); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static void dy_bug(struct kref *kref) -+{ -+ BUG(); -+} -+ -+static struct au_dykey *dy_get(struct au_dynop *op, struct au_branch *br) -+{ -+ struct au_dykey *key, *old; -+ struct hlist_bl_head *hbl; -+ struct op { -+ unsigned int sz; -+ void (*set)(struct au_dykey *key, const void *h_op, -+ struct super_block *h_sb __maybe_unused); -+ }; -+ static const struct op a[] = { -+ [AuDy_AOP] = { -+ .sz = sizeof(struct au_dyaop), -+ .set = dy_aop -+ } -+ }; -+ const struct op *p; -+ -+ hbl = dynop + op->dy_type; -+ key = dy_gfind_get(hbl, op->dy_hop); -+ if (key) -+ goto out_add; /* success */ -+ -+ p = a + op->dy_type; -+ key = kzalloc(p->sz, GFP_NOFS); -+ if (unlikely(!key)) { -+ key = ERR_PTR(-ENOMEM); -+ goto out; -+ } -+ -+ key->dk_op.dy_hop = op->dy_hop; -+ kref_init(&key->dk_kref); -+ p->set(key, op->dy_hop, au_br_sb(br)); -+ old = dy_gadd(hbl, key); -+ if (old) { -+ au_kfree_rcu(key); -+ key = old; -+ } -+ -+out_add: -+ old = dy_bradd(br, key); -+ if (old) -+ /* its ref-count should never be zero here */ -+ kref_put(&key->dk_kref, dy_bug); -+out: -+ return key; -+} -+ -+/* ---------------------------------------------------------------------- */ -+/* -+ * Aufs prohibits O_DIRECT by default even if the branch supports it. -+ * This behaviour is necessary to return an error from open(O_DIRECT) instead -+ * of the succeeding I/O. The dio mount option enables O_DIRECT and makes -+ * open(O_DIRECT) always succeed, but the succeeding I/O may return an error. -+ * See the aufs manual in detail. -+ */ -+static void dy_adx(struct au_dyaop *dyaop, int do_dx) -+{ -+ if (!do_dx) -+ dyaop->da_op.direct_IO = NULL; -+ else -+ dyaop->da_op.direct_IO = aufs_aop.direct_IO; -+} -+ -+static struct au_dyaop *dy_aget(struct au_branch *br, -+ const struct address_space_operations *h_aop, -+ int do_dx) -+{ -+ struct au_dyaop *dyaop; -+ struct au_dynop op; -+ -+ op.dy_type = AuDy_AOP; -+ op.dy_haop = h_aop; -+ dyaop = (void *)dy_get(&op, br); -+ if (IS_ERR(dyaop)) -+ goto out; -+ dy_adx(dyaop, do_dx); -+ -+out: -+ return dyaop; -+} -+ -+int au_dy_iaop(struct inode *inode, aufs_bindex_t bindex, -+ struct inode *h_inode) -+{ -+ int err, do_dx; -+ struct super_block *sb; -+ struct au_branch *br; -+ struct au_dyaop *dyaop; -+ -+ AuDebugOn(!S_ISREG(h_inode->i_mode)); -+ IiMustWriteLock(inode); -+ -+ sb = inode->i_sb; -+ br = au_sbr(sb, bindex); -+ do_dx = !!au_opt_test(au_mntflags(sb), DIO); -+ dyaop = dy_aget(br, h_inode->i_mapping->a_ops, do_dx); -+ err = PTR_ERR(dyaop); -+ if (IS_ERR(dyaop)) -+ /* unnecessary to call dy_fput() */ -+ goto out; -+ -+ err = 0; -+ inode->i_mapping->a_ops = &dyaop->da_op; -+ -+out: -+ return err; -+} -+ -+/* -+ * Is it safe to replace a_ops during the inode/file is in operation? -+ * Yes, I hope so. -+ */ -+int au_dy_irefresh(struct inode *inode) -+{ -+ int err; -+ aufs_bindex_t btop; -+ struct inode *h_inode; -+ -+ err = 0; -+ if (S_ISREG(inode->i_mode)) { -+ btop = au_ibtop(inode); -+ h_inode = au_h_iptr(inode, btop); -+ err = au_dy_iaop(inode, btop, h_inode); -+ } -+ return err; -+} -+ -+void au_dy_arefresh(int do_dx) -+{ -+ struct hlist_bl_head *hbl; -+ struct hlist_bl_node *pos; -+ struct au_dykey *key; -+ -+ hbl = dynop + AuDy_AOP; -+ hlist_bl_lock(hbl); -+ hlist_bl_for_each_entry(key, pos, hbl, dk_hnode) -+ dy_adx((void *)key, do_dx); -+ hlist_bl_unlock(hbl); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+void __init au_dy_init(void) -+{ -+ int i; -+ -+ for (i = 0; i < AuDyLast; i++) -+ INIT_HLIST_BL_HEAD(dynop + i); -+} -+ -+void au_dy_fin(void) -+{ -+ int i; -+ -+ for (i = 0; i < AuDyLast; i++) -+ WARN_ON(!hlist_bl_empty(dynop + i)); -+} -diff -Naur null/fs/aufs/dynop.h linux-5.15.36/fs/aufs/dynop.h ---- /dev/null -+++ linux-5.15.36/fs/aufs/dynop.h 2022-05-10 16:51:39.870744219 +0300 -@@ -0,0 +1,77 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * Copyright (C) 2010-2021 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program. If not, see . -+ */ -+ -+/* -+ * dynamically customizable operations (for regular files only) -+ */ -+ -+#ifndef __AUFS_DYNOP_H__ -+#define __AUFS_DYNOP_H__ -+ -+#ifdef __KERNEL__ -+ -+#include -+#include -+ -+enum {AuDy_AOP, AuDyLast}; -+ -+struct au_dynop { -+ int dy_type; -+ union { -+ const void *dy_hop; -+ const struct address_space_operations *dy_haop; -+ }; -+}; -+ -+struct au_dykey { -+ union { -+ struct hlist_bl_node dk_hnode; -+ struct rcu_head dk_rcu; -+ }; -+ struct au_dynop dk_op; -+ -+ /* -+ * during I am in the branch local array, kref is gotten. when the -+ * branch is removed, kref is put. -+ */ -+ struct kref dk_kref; -+}; -+ -+/* stop unioning since their sizes are very different from each other */ -+struct au_dyaop { -+ struct au_dykey da_key; -+ struct address_space_operations da_op; /* not const */ -+}; -+/* make sure that 'struct au_dykey *' can be any type */ -+static_assert(!offsetof(struct au_dyaop, da_key)); -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* dynop.c */ -+struct au_branch; -+void au_dy_put(struct au_dykey *key); -+int au_dy_iaop(struct inode *inode, aufs_bindex_t bindex, -+ struct inode *h_inode); -+int au_dy_irefresh(struct inode *inode); -+void au_dy_arefresh(int do_dio); -+ -+void __init au_dy_init(void); -+void au_dy_fin(void); -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_DYNOP_H__ */ -diff -Naur null/fs/aufs/export.c linux-5.15.36/fs/aufs/export.c ---- /dev/null -+++ linux-5.15.36/fs/aufs/export.c 2022-05-10 16:51:39.870744219 +0300 -@@ -0,0 +1,830 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program. If not, see . -+ */ -+ -+/* -+ * export via nfs -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include "aufs.h" -+ -+union conv { -+#ifdef CONFIG_AUFS_INO_T_64 -+ __u32 a[2]; -+#else -+ __u32 a[1]; -+#endif -+ ino_t ino; -+}; -+ -+static ino_t decode_ino(__u32 *a) -+{ -+ union conv u; -+ -+ BUILD_BUG_ON(sizeof(u.ino) != sizeof(u.a)); -+ u.a[0] = a[0]; -+#ifdef CONFIG_AUFS_INO_T_64 -+ u.a[1] = a[1]; -+#endif -+ return u.ino; -+} -+ -+static void encode_ino(__u32 *a, ino_t ino) -+{ -+ union conv u; -+ -+ u.ino = ino; -+ a[0] = u.a[0]; -+#ifdef CONFIG_AUFS_INO_T_64 -+ a[1] = u.a[1]; -+#endif -+} -+ -+/* NFS file handle */ -+enum { -+ Fh_br_id, -+ Fh_sigen, -+#ifdef CONFIG_AUFS_INO_T_64 -+ /* support 64bit inode number */ -+ Fh_ino1, -+ Fh_ino2, -+ Fh_dir_ino1, -+ Fh_dir_ino2, -+#else -+ Fh_ino1, -+ Fh_dir_ino1, -+#endif -+ Fh_igen, -+ Fh_h_type, -+ Fh_tail, -+ -+ Fh_ino = Fh_ino1, -+ Fh_dir_ino = Fh_dir_ino1 -+}; -+ -+static int au_test_anon(struct dentry *dentry) -+{ -+ /* note: read d_flags without d_lock */ -+ return !!(dentry->d_flags & DCACHE_DISCONNECTED); -+} -+ -+int au_test_nfsd(void) -+{ -+ int ret; -+ struct task_struct *tsk = current; -+ char comm[sizeof(tsk->comm)]; -+ -+ ret = 0; -+ if (tsk->flags & PF_KTHREAD) { -+ get_task_comm(comm, tsk); -+ ret = !strcmp(comm, "nfsd"); -+ } -+ -+ return ret; -+} -+ -+/* ---------------------------------------------------------------------- */ -+/* inode generation external table */ -+ -+void au_xigen_inc(struct inode *inode) -+{ -+ loff_t pos; -+ ssize_t sz; -+ __u32 igen; -+ struct super_block *sb; -+ struct au_sbinfo *sbinfo; -+ -+ sb = inode->i_sb; -+ AuDebugOn(!au_opt_test(au_mntflags(sb), XINO)); -+ -+ sbinfo = au_sbi(sb); -+ pos = inode->i_ino; -+ pos *= sizeof(igen); -+ igen = inode->i_generation + 1; -+ sz = xino_fwrite(sbinfo->si_xigen, &igen, sizeof(igen), &pos); -+ if (sz == sizeof(igen)) -+ return; /* success */ -+ -+ if (unlikely(sz >= 0)) -+ AuIOErr("xigen error (%zd)\n", sz); -+} -+ -+int au_xigen_new(struct inode *inode) -+{ -+ int err; -+ loff_t pos; -+ ssize_t sz; -+ struct super_block *sb; -+ struct au_sbinfo *sbinfo; -+ struct file *file; -+ -+ err = 0; -+ /* todo: dirty, at mount time */ -+ if (inode->i_ino == AUFS_ROOT_INO) -+ goto out; -+ sb = inode->i_sb; -+ SiMustAnyLock(sb); -+ if (unlikely(!au_opt_test(au_mntflags(sb), XINO))) -+ goto out; -+ -+ err = -EFBIG; -+ pos = inode->i_ino; -+ if (unlikely(au_loff_max / sizeof(inode->i_generation) - 1 < pos)) { -+ AuIOErr1("too large i%lld\n", pos); -+ goto out; -+ } -+ pos *= sizeof(inode->i_generation); -+ -+ err = 0; -+ sbinfo = au_sbi(sb); -+ file = sbinfo->si_xigen; -+ BUG_ON(!file); -+ -+ if (vfsub_f_size_read(file) -+ < pos + sizeof(inode->i_generation)) { -+ inode->i_generation = atomic_inc_return(&sbinfo->si_xigen_next); -+ sz = xino_fwrite(file, &inode->i_generation, -+ sizeof(inode->i_generation), &pos); -+ } else -+ sz = xino_fread(file, &inode->i_generation, -+ sizeof(inode->i_generation), &pos); -+ if (sz == sizeof(inode->i_generation)) -+ goto out; /* success */ -+ -+ err = sz; -+ if (unlikely(sz >= 0)) { -+ err = -EIO; -+ AuIOErr("xigen error (%zd)\n", sz); -+ } -+ -+out: -+ return err; -+} -+ -+int au_xigen_set(struct super_block *sb, struct path *path) -+{ -+ int err; -+ struct au_sbinfo *sbinfo; -+ struct file *file; -+ -+ SiMustWriteLock(sb); -+ -+ sbinfo = au_sbi(sb); -+ file = au_xino_create2(sb, path, sbinfo->si_xigen); -+ err = PTR_ERR(file); -+ if (IS_ERR(file)) -+ goto out; -+ err = 0; -+ if (sbinfo->si_xigen) -+ fput(sbinfo->si_xigen); -+ sbinfo->si_xigen = file; -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+void au_xigen_clr(struct super_block *sb) -+{ -+ struct au_sbinfo *sbinfo; -+ -+ SiMustWriteLock(sb); -+ -+ sbinfo = au_sbi(sb); -+ if (sbinfo->si_xigen) { -+ fput(sbinfo->si_xigen); -+ sbinfo->si_xigen = NULL; -+ } -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static struct dentry *decode_by_ino(struct super_block *sb, ino_t ino, -+ ino_t dir_ino) -+{ -+ struct dentry *dentry, *d; -+ struct inode *inode; -+ unsigned int sigen; -+ -+ dentry = NULL; -+ inode = ilookup(sb, ino); -+ if (!inode) -+ goto out; -+ -+ dentry = ERR_PTR(-ESTALE); -+ sigen = au_sigen(sb); -+ if (unlikely(au_is_bad_inode(inode) -+ || IS_DEADDIR(inode) -+ || sigen != au_iigen(inode, NULL))) -+ goto out_iput; -+ -+ dentry = NULL; -+ if (!dir_ino || S_ISDIR(inode->i_mode)) -+ dentry = d_find_alias(inode); -+ else { -+ spin_lock(&inode->i_lock); -+ hlist_for_each_entry(d, &inode->i_dentry, d_u.d_alias) { -+ spin_lock(&d->d_lock); -+ if (!au_test_anon(d) -+ && d_inode(d->d_parent)->i_ino == dir_ino) { -+ dentry = dget_dlock(d); -+ spin_unlock(&d->d_lock); -+ break; -+ } -+ spin_unlock(&d->d_lock); -+ } -+ spin_unlock(&inode->i_lock); -+ } -+ if (unlikely(dentry && au_digen_test(dentry, sigen))) { -+ /* need to refresh */ -+ dput(dentry); -+ dentry = NULL; -+ } -+ -+out_iput: -+ iput(inode); -+out: -+ AuTraceErrPtr(dentry); -+ return dentry; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* todo: dirty? */ -+/* if exportfs_decode_fh() passed vfsmount*, we could be happy */ -+ -+struct au_compare_mnt_args { -+ /* input */ -+ struct super_block *sb; -+ -+ /* output */ -+ struct vfsmount *mnt; -+}; -+ -+static int au_compare_mnt(struct vfsmount *mnt, void *arg) -+{ -+ struct au_compare_mnt_args *a = arg; -+ -+ if (mnt->mnt_sb != a->sb) -+ return 0; -+ a->mnt = mntget(mnt); -+ return 1; -+} -+ -+static struct vfsmount *au_mnt_get(struct super_block *sb) -+{ -+ int err; -+ struct path root; -+ struct au_compare_mnt_args args = { -+ .sb = sb -+ }; -+ -+ get_fs_root(current->fs, &root); -+ rcu_read_lock(); -+ err = iterate_mounts(au_compare_mnt, &args, root.mnt); -+ rcu_read_unlock(); -+ path_put(&root); -+ AuDebugOn(!err); -+ AuDebugOn(!args.mnt); -+ return args.mnt; -+} -+ -+struct au_nfsd_si_lock { -+ unsigned int sigen; -+ aufs_bindex_t bindex, br_id; -+ unsigned char force_lock; -+}; -+ -+static int si_nfsd_read_lock(struct super_block *sb, -+ struct au_nfsd_si_lock *nsi_lock) -+{ -+ int err; -+ aufs_bindex_t bindex; -+ -+ si_read_lock(sb, AuLock_FLUSH); -+ -+ /* branch id may be wrapped around */ -+ err = 0; -+ bindex = au_br_index(sb, nsi_lock->br_id); -+ if (bindex >= 0 && nsi_lock->sigen + AUFS_BRANCH_MAX > au_sigen(sb)) -+ goto out; /* success */ -+ -+ err = -ESTALE; -+ bindex = -1; -+ if (!nsi_lock->force_lock) -+ si_read_unlock(sb); -+ -+out: -+ nsi_lock->bindex = bindex; -+ return err; -+} -+ -+struct find_name_by_ino { -+ struct dir_context ctx; -+ int called, found; -+ ino_t ino; -+ char *name; -+ int namelen; -+}; -+ -+static int -+find_name_by_ino(struct dir_context *ctx, const char *name, int namelen, -+ loff_t offset, u64 ino, unsigned int d_type) -+{ -+ struct find_name_by_ino *a = container_of(ctx, struct find_name_by_ino, -+ ctx); -+ -+ a->called++; -+ if (a->ino != ino) -+ return 0; -+ -+ memcpy(a->name, name, namelen); -+ a->namelen = namelen; -+ a->found = 1; -+ return 1; -+} -+ -+static struct dentry *au_lkup_by_ino(struct path *path, ino_t ino, -+ struct au_nfsd_si_lock *nsi_lock) -+{ -+ struct dentry *dentry, *parent; -+ struct file *file; -+ struct inode *dir; -+ struct find_name_by_ino arg = { -+ .ctx = { -+ .actor = find_name_by_ino -+ } -+ }; -+ int err; -+ -+ parent = path->dentry; -+ if (nsi_lock) -+ si_read_unlock(parent->d_sb); -+ file = vfsub_dentry_open(path, au_dir_roflags); -+ dentry = (void *)file; -+ if (IS_ERR(file)) -+ goto out; -+ -+ dentry = ERR_PTR(-ENOMEM); -+ arg.name = (void *)__get_free_page(GFP_NOFS); -+ if (unlikely(!arg.name)) -+ goto out_file; -+ arg.ino = ino; -+ arg.found = 0; -+ do { -+ arg.called = 0; -+ /* smp_mb(); */ -+ err = vfsub_iterate_dir(file, &arg.ctx); -+ } while (!err && !arg.found && arg.called); -+ dentry = ERR_PTR(err); -+ if (unlikely(err)) -+ goto out_name; -+ /* instead of ENOENT */ -+ dentry = ERR_PTR(-ESTALE); -+ if (!arg.found) -+ goto out_name; -+ -+ /* do not call vfsub_lkup_one() */ -+ dir = d_inode(parent); -+ dentry = vfsub_lookup_one_len_unlocked(arg.name, path, arg.namelen); -+ AuTraceErrPtr(dentry); -+ if (IS_ERR(dentry)) -+ goto out_name; -+ AuDebugOn(au_test_anon(dentry)); -+ if (unlikely(d_really_is_negative(dentry))) { -+ dput(dentry); -+ dentry = ERR_PTR(-ENOENT); -+ } -+ -+out_name: -+ free_page((unsigned long)arg.name); -+out_file: -+ fput(file); -+out: -+ if (unlikely(nsi_lock -+ && si_nfsd_read_lock(parent->d_sb, nsi_lock) < 0)) -+ if (!IS_ERR(dentry)) { -+ dput(dentry); -+ dentry = ERR_PTR(-ESTALE); -+ } -+ AuTraceErrPtr(dentry); -+ return dentry; -+} -+ -+static struct dentry *decode_by_dir_ino(struct super_block *sb, ino_t ino, -+ ino_t dir_ino, -+ struct au_nfsd_si_lock *nsi_lock) -+{ -+ struct dentry *dentry; -+ struct path path; -+ -+ if (dir_ino != AUFS_ROOT_INO) { -+ path.dentry = decode_by_ino(sb, dir_ino, 0); -+ dentry = path.dentry; -+ if (!path.dentry || IS_ERR(path.dentry)) -+ goto out; -+ AuDebugOn(au_test_anon(path.dentry)); -+ } else -+ path.dentry = dget(sb->s_root); -+ -+ path.mnt = au_mnt_get(sb); -+ dentry = au_lkup_by_ino(&path, ino, nsi_lock); -+ path_put(&path); -+ -+out: -+ AuTraceErrPtr(dentry); -+ return dentry; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int h_acceptable(void *expv, struct dentry *dentry) -+{ -+ return 1; -+} -+ -+static char *au_build_path(struct dentry *h_parent, struct path *h_rootpath, -+ char *buf, int len, struct super_block *sb) -+{ -+ char *p; -+ int n; -+ struct path path; -+ -+ p = d_path(h_rootpath, buf, len); -+ if (IS_ERR(p)) -+ goto out; -+ n = strlen(p); -+ -+ path.mnt = h_rootpath->mnt; -+ path.dentry = h_parent; -+ p = d_path(&path, buf, len); -+ if (IS_ERR(p)) -+ goto out; -+ if (n != 1) -+ p += n; -+ -+ path.mnt = au_mnt_get(sb); -+ path.dentry = sb->s_root; -+ p = d_path(&path, buf, len - strlen(p)); -+ mntput(path.mnt); -+ if (IS_ERR(p)) -+ goto out; -+ if (n != 1) -+ p[strlen(p)] = '/'; -+ -+out: -+ AuTraceErrPtr(p); -+ return p; -+} -+ -+static -+struct dentry *decode_by_path(struct super_block *sb, ino_t ino, __u32 *fh, -+ int fh_len, struct au_nfsd_si_lock *nsi_lock) -+{ -+ struct dentry *dentry, *h_parent, *root; -+ struct super_block *h_sb; -+ char *pathname, *p; -+ struct vfsmount *h_mnt; -+ struct au_branch *br; -+ int err; -+ struct path path; -+ -+ br = au_sbr(sb, nsi_lock->bindex); -+ h_mnt = au_br_mnt(br); -+ h_sb = h_mnt->mnt_sb; -+ /* todo: call lower fh_to_dentry()? fh_to_parent()? */ -+ lockdep_off(); -+ h_parent = exportfs_decode_fh(h_mnt, (void *)(fh + Fh_tail), -+ fh_len - Fh_tail, fh[Fh_h_type], -+ h_acceptable, /*context*/NULL); -+ lockdep_on(); -+ dentry = h_parent; -+ if (unlikely(!h_parent || IS_ERR(h_parent))) { -+ AuWarn1("%s decode_fh failed, %ld\n", -+ au_sbtype(h_sb), PTR_ERR(h_parent)); -+ goto out; -+ } -+ dentry = NULL; -+ if (unlikely(au_test_anon(h_parent))) { -+ AuWarn1("%s decode_fh returned a disconnected dentry\n", -+ au_sbtype(h_sb)); -+ goto out_h_parent; -+ } -+ -+ dentry = ERR_PTR(-ENOMEM); -+ pathname = (void *)__get_free_page(GFP_NOFS); -+ if (unlikely(!pathname)) -+ goto out_h_parent; -+ -+ root = sb->s_root; -+ path.mnt = h_mnt; -+ di_read_lock_parent(root, !AuLock_IR); -+ path.dentry = au_h_dptr(root, nsi_lock->bindex); -+ di_read_unlock(root, !AuLock_IR); -+ p = au_build_path(h_parent, &path, pathname, PAGE_SIZE, sb); -+ dentry = (void *)p; -+ if (IS_ERR(p)) -+ goto out_pathname; -+ -+ si_read_unlock(sb); -+ err = vfsub_kern_path(p, LOOKUP_FOLLOW | LOOKUP_DIRECTORY, &path); -+ dentry = ERR_PTR(err); -+ if (unlikely(err)) -+ goto out_relock; -+ -+ dentry = ERR_PTR(-ENOENT); -+ AuDebugOn(au_test_anon(path.dentry)); -+ if (unlikely(d_really_is_negative(path.dentry))) -+ goto out_path; -+ -+ if (ino != d_inode(path.dentry)->i_ino) -+ dentry = au_lkup_by_ino(&path, ino, /*nsi_lock*/NULL); -+ else -+ dentry = dget(path.dentry); -+ -+out_path: -+ path_put(&path); -+out_relock: -+ if (unlikely(si_nfsd_read_lock(sb, nsi_lock) < 0)) -+ if (!IS_ERR(dentry)) { -+ dput(dentry); -+ dentry = ERR_PTR(-ESTALE); -+ } -+out_pathname: -+ free_page((unsigned long)pathname); -+out_h_parent: -+ dput(h_parent); -+out: -+ AuTraceErrPtr(dentry); -+ return dentry; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static struct dentry * -+aufs_fh_to_dentry(struct super_block *sb, struct fid *fid, int fh_len, -+ int fh_type) -+{ -+ struct dentry *dentry; -+ __u32 *fh = fid->raw; -+ struct au_branch *br; -+ ino_t ino, dir_ino; -+ struct au_nfsd_si_lock nsi_lock = { -+ .force_lock = 0 -+ }; -+ -+ dentry = ERR_PTR(-ESTALE); -+ /* it should never happen, but the file handle is unreliable */ -+ if (unlikely(fh_len < Fh_tail)) -+ goto out; -+ nsi_lock.sigen = fh[Fh_sigen]; -+ nsi_lock.br_id = fh[Fh_br_id]; -+ -+ /* branch id may be wrapped around */ -+ br = NULL; -+ if (unlikely(si_nfsd_read_lock(sb, &nsi_lock))) -+ goto out; -+ nsi_lock.force_lock = 1; -+ -+ /* is this inode still cached? */ -+ ino = decode_ino(fh + Fh_ino); -+ /* it should never happen */ -+ if (unlikely(ino == AUFS_ROOT_INO)) -+ goto out_unlock; -+ -+ dir_ino = decode_ino(fh + Fh_dir_ino); -+ dentry = decode_by_ino(sb, ino, dir_ino); -+ if (IS_ERR(dentry)) -+ goto out_unlock; -+ if (dentry) -+ goto accept; -+ -+ /* is the parent dir cached? */ -+ br = au_sbr(sb, nsi_lock.bindex); -+ au_lcnt_inc(&br->br_nfiles); -+ dentry = decode_by_dir_ino(sb, ino, dir_ino, &nsi_lock); -+ if (IS_ERR(dentry)) -+ goto out_unlock; -+ if (dentry) -+ goto accept; -+ -+ /* lookup path */ -+ dentry = decode_by_path(sb, ino, fh, fh_len, &nsi_lock); -+ if (IS_ERR(dentry)) -+ goto out_unlock; -+ if (unlikely(!dentry)) -+ /* todo?: make it ESTALE */ -+ goto out_unlock; -+ -+accept: -+ if (!au_digen_test(dentry, au_sigen(sb)) -+ && d_inode(dentry)->i_generation == fh[Fh_igen]) -+ goto out_unlock; /* success */ -+ -+ dput(dentry); -+ dentry = ERR_PTR(-ESTALE); -+out_unlock: -+ if (br) -+ au_lcnt_dec(&br->br_nfiles); -+ si_read_unlock(sb); -+out: -+ AuTraceErrPtr(dentry); -+ return dentry; -+} -+ -+#if 0 /* reserved for future use */ -+/* support subtreecheck option */ -+static struct dentry *aufs_fh_to_parent(struct super_block *sb, struct fid *fid, -+ int fh_len, int fh_type) -+{ -+ struct dentry *parent; -+ __u32 *fh = fid->raw; -+ ino_t dir_ino; -+ -+ dir_ino = decode_ino(fh + Fh_dir_ino); -+ parent = decode_by_ino(sb, dir_ino, 0); -+ if (IS_ERR(parent)) -+ goto out; -+ if (!parent) -+ parent = decode_by_path(sb, au_br_index(sb, fh[Fh_br_id]), -+ dir_ino, fh, fh_len); -+ -+out: -+ AuTraceErrPtr(parent); -+ return parent; -+} -+#endif -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int aufs_encode_fh(struct inode *inode, __u32 *fh, int *max_len, -+ struct inode *dir) -+{ -+ int err; -+ aufs_bindex_t bindex; -+ struct super_block *sb, *h_sb; -+ struct dentry *dentry, *parent, *h_parent; -+ struct inode *h_dir; -+ struct au_branch *br; -+ -+ err = -ENOSPC; -+ if (unlikely(*max_len <= Fh_tail)) { -+ AuWarn1("NFSv2 client (max_len %d)?\n", *max_len); -+ goto out; -+ } -+ -+ err = FILEID_ROOT; -+ if (inode->i_ino == AUFS_ROOT_INO) { -+ AuDebugOn(inode->i_ino != AUFS_ROOT_INO); -+ goto out; -+ } -+ -+ h_parent = NULL; -+ sb = inode->i_sb; -+ err = si_read_lock(sb, AuLock_FLUSH); -+ if (unlikely(err)) -+ goto out; -+ -+#ifdef CONFIG_AUFS_DEBUG -+ if (unlikely(!au_opt_test(au_mntflags(sb), XINO))) -+ AuWarn1("NFS-exporting requires xino\n"); -+#endif -+ err = -EIO; -+ parent = NULL; -+ ii_read_lock_child(inode); -+ bindex = au_ibtop(inode); -+ if (!dir) { -+ dentry = d_find_any_alias(inode); -+ if (unlikely(!dentry)) -+ goto out_unlock; -+ AuDebugOn(au_test_anon(dentry)); -+ parent = dget_parent(dentry); -+ dput(dentry); -+ if (unlikely(!parent)) -+ goto out_unlock; -+ if (d_really_is_positive(parent)) -+ dir = d_inode(parent); -+ } -+ -+ ii_read_lock_parent(dir); -+ h_dir = au_h_iptr(dir, bindex); -+ ii_read_unlock(dir); -+ if (unlikely(!h_dir)) -+ goto out_parent; -+ h_parent = d_find_any_alias(h_dir); -+ if (unlikely(!h_parent)) -+ goto out_hparent; -+ -+ err = -EPERM; -+ br = au_sbr(sb, bindex); -+ h_sb = au_br_sb(br); -+ if (unlikely(!h_sb->s_export_op)) { -+ AuErr1("%s branch is not exportable\n", au_sbtype(h_sb)); -+ goto out_hparent; -+ } -+ -+ fh[Fh_br_id] = br->br_id; -+ fh[Fh_sigen] = au_sigen(sb); -+ encode_ino(fh + Fh_ino, inode->i_ino); -+ encode_ino(fh + Fh_dir_ino, dir->i_ino); -+ fh[Fh_igen] = inode->i_generation; -+ -+ *max_len -= Fh_tail; -+ fh[Fh_h_type] = exportfs_encode_fh(h_parent, (void *)(fh + Fh_tail), -+ max_len, -+ /*connectable or subtreecheck*/0); -+ err = fh[Fh_h_type]; -+ *max_len += Fh_tail; -+ /* todo: macros? */ -+ if (err != FILEID_INVALID) -+ err = 99; -+ else -+ AuWarn1("%s encode_fh failed\n", au_sbtype(h_sb)); -+ -+out_hparent: -+ dput(h_parent); -+out_parent: -+ dput(parent); -+out_unlock: -+ ii_read_unlock(inode); -+ si_read_unlock(sb); -+out: -+ if (unlikely(err < 0)) -+ err = FILEID_INVALID; -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int aufs_commit_metadata(struct inode *inode) -+{ -+ int err; -+ aufs_bindex_t bindex; -+ struct super_block *sb; -+ struct inode *h_inode; -+ int (*f)(struct inode *inode); -+ -+ sb = inode->i_sb; -+ si_read_lock(sb, AuLock_FLUSH | AuLock_NOPLMW); -+ ii_write_lock_child(inode); -+ bindex = au_ibtop(inode); -+ AuDebugOn(bindex < 0); -+ h_inode = au_h_iptr(inode, bindex); -+ -+ f = h_inode->i_sb->s_export_op->commit_metadata; -+ if (f) -+ err = f(h_inode); -+ else -+ err = sync_inode_metadata(h_inode, /*wait*/1); -+ -+ au_cpup_attr_timesizes(inode); -+ ii_write_unlock(inode); -+ si_read_unlock(sb); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static struct export_operations aufs_export_op = { -+ .fh_to_dentry = aufs_fh_to_dentry, -+ /* .fh_to_parent = aufs_fh_to_parent, */ -+ .encode_fh = aufs_encode_fh, -+ .commit_metadata = aufs_commit_metadata -+}; -+ -+void au_export_init(struct super_block *sb) -+{ -+ struct au_sbinfo *sbinfo; -+ __u32 u; -+ -+ BUILD_BUG_ON_MSG(IS_BUILTIN(CONFIG_AUFS_FS) -+ && IS_MODULE(CONFIG_EXPORTFS), -+ AUFS_NAME ": unsupported configuration " -+ "CONFIG_EXPORTFS=m and CONFIG_AUFS_FS=y"); -+ -+ sb->s_export_op = &aufs_export_op; -+ sbinfo = au_sbi(sb); -+ sbinfo->si_xigen = NULL; -+ get_random_bytes(&u, sizeof(u)); -+ BUILD_BUG_ON(sizeof(u) != sizeof(int)); -+ atomic_set(&sbinfo->si_xigen_next, u); -+} -diff -Naur null/fs/aufs/fhsm.c linux-5.15.36/fs/aufs/fhsm.c ---- /dev/null -+++ linux-5.15.36/fs/aufs/fhsm.c 2022-05-10 16:51:39.870744219 +0300 -@@ -0,0 +1,427 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2011-2021 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+/* -+ * File-based Hierarchy Storage Management -+ */ -+ -+#include -+#include -+#include -+#include -+#include "aufs.h" -+ -+static aufs_bindex_t au_fhsm_bottom(struct super_block *sb) -+{ -+ struct au_sbinfo *sbinfo; -+ struct au_fhsm *fhsm; -+ -+ SiMustAnyLock(sb); -+ -+ sbinfo = au_sbi(sb); -+ fhsm = &sbinfo->si_fhsm; -+ AuDebugOn(!fhsm); -+ return fhsm->fhsm_bottom; -+} -+ -+void au_fhsm_set_bottom(struct super_block *sb, aufs_bindex_t bindex) -+{ -+ struct au_sbinfo *sbinfo; -+ struct au_fhsm *fhsm; -+ -+ SiMustWriteLock(sb); -+ -+ sbinfo = au_sbi(sb); -+ fhsm = &sbinfo->si_fhsm; -+ AuDebugOn(!fhsm); -+ fhsm->fhsm_bottom = bindex; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int au_fhsm_test_jiffy(struct au_sbinfo *sbinfo, struct au_branch *br) -+{ -+ struct au_br_fhsm *bf; -+ -+ bf = br->br_fhsm; -+ MtxMustLock(&bf->bf_lock); -+ -+ return !bf->bf_readable -+ || time_after(jiffies, -+ bf->bf_jiffy + sbinfo->si_fhsm.fhsm_expire); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static void au_fhsm_notify(struct super_block *sb, int val) -+{ -+ struct au_sbinfo *sbinfo; -+ struct au_fhsm *fhsm; -+ -+ SiMustAnyLock(sb); -+ -+ sbinfo = au_sbi(sb); -+ fhsm = &sbinfo->si_fhsm; -+ if (au_fhsm_pid(fhsm) -+ && atomic_read(&fhsm->fhsm_readable) != -1) { -+ atomic_set(&fhsm->fhsm_readable, val); -+ if (val) -+ wake_up(&fhsm->fhsm_wqh); -+ } -+} -+ -+static int au_fhsm_stfs(struct super_block *sb, aufs_bindex_t bindex, -+ struct aufs_stfs *rstfs, int do_lock, int do_notify) -+{ -+ int err; -+ struct au_branch *br; -+ struct au_br_fhsm *bf; -+ -+ br = au_sbr(sb, bindex); -+ AuDebugOn(au_br_rdonly(br)); -+ bf = br->br_fhsm; -+ AuDebugOn(!bf); -+ -+ if (do_lock) -+ mutex_lock(&bf->bf_lock); -+ else -+ MtxMustLock(&bf->bf_lock); -+ -+ /* sb->s_root for NFS is unreliable */ -+ err = au_br_stfs(br, &bf->bf_stfs); -+ if (unlikely(err)) { -+ AuErr1("FHSM failed (%d), b%d, ignored.\n", bindex, err); -+ goto out; -+ } -+ -+ bf->bf_jiffy = jiffies; -+ bf->bf_readable = 1; -+ if (do_notify) -+ au_fhsm_notify(sb, /*val*/1); -+ if (rstfs) -+ *rstfs = bf->bf_stfs; -+ -+out: -+ if (do_lock) -+ mutex_unlock(&bf->bf_lock); -+ au_fhsm_notify(sb, /*val*/1); -+ -+ return err; -+} -+ -+void au_fhsm_wrote(struct super_block *sb, aufs_bindex_t bindex, int force) -+{ -+ int err; -+ struct au_sbinfo *sbinfo; -+ struct au_fhsm *fhsm; -+ struct au_branch *br; -+ struct au_br_fhsm *bf; -+ -+ AuDbg("b%d, force %d\n", bindex, force); -+ SiMustAnyLock(sb); -+ -+ sbinfo = au_sbi(sb); -+ fhsm = &sbinfo->si_fhsm; -+ if (!au_ftest_si(sbinfo, FHSM) -+ || fhsm->fhsm_bottom == bindex) -+ return; -+ -+ br = au_sbr(sb, bindex); -+ bf = br->br_fhsm; -+ AuDebugOn(!bf); -+ mutex_lock(&bf->bf_lock); -+ if (force -+ || au_fhsm_pid(fhsm) -+ || au_fhsm_test_jiffy(sbinfo, br)) -+ err = au_fhsm_stfs(sb, bindex, /*rstfs*/NULL, /*do_lock*/0, -+ /*do_notify*/1); -+ mutex_unlock(&bf->bf_lock); -+} -+ -+void au_fhsm_wrote_all(struct super_block *sb, int force) -+{ -+ aufs_bindex_t bindex, bbot; -+ struct au_branch *br; -+ -+ /* exclude the bottom */ -+ bbot = au_fhsm_bottom(sb); -+ for (bindex = 0; bindex < bbot; bindex++) { -+ br = au_sbr(sb, bindex); -+ if (au_br_fhsm(br->br_perm)) -+ au_fhsm_wrote(sb, bindex, force); -+ } -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static __poll_t au_fhsm_poll(struct file *file, struct poll_table_struct *wait) -+{ -+ __poll_t mask; -+ struct au_sbinfo *sbinfo; -+ struct au_fhsm *fhsm; -+ -+ mask = 0; -+ sbinfo = file->private_data; -+ fhsm = &sbinfo->si_fhsm; -+ poll_wait(file, &fhsm->fhsm_wqh, wait); -+ if (atomic_read(&fhsm->fhsm_readable)) -+ mask = EPOLLIN /* | EPOLLRDNORM */; -+ -+ if (!mask) -+ AuDbg("mask 0x%x\n", mask); -+ return mask; -+} -+ -+static int au_fhsm_do_read_one(struct aufs_stbr __user *stbr, -+ struct aufs_stfs *stfs, __s16 brid) -+{ -+ int err; -+ -+ err = copy_to_user(&stbr->stfs, stfs, sizeof(*stfs)); -+ if (!err) -+ err = __put_user(brid, &stbr->brid); -+ if (unlikely(err)) -+ err = -EFAULT; -+ -+ return err; -+} -+ -+static ssize_t au_fhsm_do_read(struct super_block *sb, -+ struct aufs_stbr __user *stbr, size_t count) -+{ -+ ssize_t err; -+ int nstbr; -+ aufs_bindex_t bindex, bbot; -+ struct au_branch *br; -+ struct au_br_fhsm *bf; -+ -+ /* except the bottom branch */ -+ err = 0; -+ nstbr = 0; -+ bbot = au_fhsm_bottom(sb); -+ for (bindex = 0; !err && bindex < bbot; bindex++) { -+ br = au_sbr(sb, bindex); -+ if (!au_br_fhsm(br->br_perm)) -+ continue; -+ -+ bf = br->br_fhsm; -+ mutex_lock(&bf->bf_lock); -+ if (bf->bf_readable) { -+ err = -EFAULT; -+ if (count >= sizeof(*stbr)) -+ err = au_fhsm_do_read_one(stbr++, &bf->bf_stfs, -+ br->br_id); -+ if (!err) { -+ bf->bf_readable = 0; -+ count -= sizeof(*stbr); -+ nstbr++; -+ } -+ } -+ mutex_unlock(&bf->bf_lock); -+ } -+ if (!err) -+ err = sizeof(*stbr) * nstbr; -+ -+ return err; -+} -+ -+static ssize_t au_fhsm_read(struct file *file, char __user *buf, size_t count, -+ loff_t *pos) -+{ -+ ssize_t err; -+ int readable; -+ aufs_bindex_t nfhsm, bindex, bbot; -+ struct au_sbinfo *sbinfo; -+ struct au_fhsm *fhsm; -+ struct au_branch *br; -+ struct super_block *sb; -+ -+ err = 0; -+ sbinfo = file->private_data; -+ fhsm = &sbinfo->si_fhsm; -+need_data: -+ spin_lock_irq(&fhsm->fhsm_wqh.lock); -+ if (!atomic_read(&fhsm->fhsm_readable)) { -+ if (vfsub_file_flags(file) & O_NONBLOCK) -+ err = -EAGAIN; -+ else -+ err = wait_event_interruptible_locked_irq -+ (fhsm->fhsm_wqh, -+ atomic_read(&fhsm->fhsm_readable)); -+ } -+ spin_unlock_irq(&fhsm->fhsm_wqh.lock); -+ if (unlikely(err)) -+ goto out; -+ -+ /* sb may already be dead */ -+ au_rw_read_lock(&sbinfo->si_rwsem); -+ readable = atomic_read(&fhsm->fhsm_readable); -+ if (readable > 0) { -+ sb = sbinfo->si_sb; -+ AuDebugOn(!sb); -+ /* exclude the bottom branch */ -+ nfhsm = 0; -+ bbot = au_fhsm_bottom(sb); -+ for (bindex = 0; bindex < bbot; bindex++) { -+ br = au_sbr(sb, bindex); -+ if (au_br_fhsm(br->br_perm)) -+ nfhsm++; -+ } -+ err = -EMSGSIZE; -+ if (nfhsm * sizeof(struct aufs_stbr) <= count) { -+ atomic_set(&fhsm->fhsm_readable, 0); -+ err = au_fhsm_do_read(sbinfo->si_sb, (void __user *)buf, -+ count); -+ } -+ } -+ au_rw_read_unlock(&sbinfo->si_rwsem); -+ if (!readable) -+ goto need_data; -+ -+out: -+ return err; -+} -+ -+static int au_fhsm_release(struct inode *inode, struct file *file) -+{ -+ struct au_sbinfo *sbinfo; -+ struct au_fhsm *fhsm; -+ -+ /* sb may already be dead */ -+ sbinfo = file->private_data; -+ fhsm = &sbinfo->si_fhsm; -+ spin_lock(&fhsm->fhsm_spin); -+ fhsm->fhsm_pid = 0; -+ spin_unlock(&fhsm->fhsm_spin); -+ kobject_put(&sbinfo->si_kobj); -+ -+ return 0; -+} -+ -+static const struct file_operations au_fhsm_fops = { -+ .owner = THIS_MODULE, -+ .llseek = noop_llseek, -+ .read = au_fhsm_read, -+ .poll = au_fhsm_poll, -+ .release = au_fhsm_release -+}; -+ -+int au_fhsm_fd(struct super_block *sb, int oflags) -+{ -+ int err, fd; -+ struct au_sbinfo *sbinfo; -+ struct au_fhsm *fhsm; -+ -+ err = -EPERM; -+ if (unlikely(!capable(CAP_SYS_ADMIN))) -+ goto out; -+ -+ err = -EINVAL; -+ if (unlikely(oflags & ~(O_CLOEXEC | O_NONBLOCK))) -+ goto out; -+ -+ err = 0; -+ sbinfo = au_sbi(sb); -+ fhsm = &sbinfo->si_fhsm; -+ spin_lock(&fhsm->fhsm_spin); -+ if (!fhsm->fhsm_pid) -+ fhsm->fhsm_pid = current->pid; -+ else -+ err = -EBUSY; -+ spin_unlock(&fhsm->fhsm_spin); -+ if (unlikely(err)) -+ goto out; -+ -+ oflags |= O_RDONLY; -+ /* oflags |= FMODE_NONOTIFY; */ -+ fd = anon_inode_getfd("[aufs_fhsm]", &au_fhsm_fops, sbinfo, oflags); -+ err = fd; -+ if (unlikely(fd < 0)) -+ goto out_pid; -+ -+ /* succeed regardless 'fhsm' status */ -+ kobject_get(&sbinfo->si_kobj); -+ si_noflush_read_lock(sb); -+ if (au_ftest_si(sbinfo, FHSM)) -+ au_fhsm_wrote_all(sb, /*force*/0); -+ si_read_unlock(sb); -+ goto out; /* success */ -+ -+out_pid: -+ spin_lock(&fhsm->fhsm_spin); -+ fhsm->fhsm_pid = 0; -+ spin_unlock(&fhsm->fhsm_spin); -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+int au_fhsm_br_alloc(struct au_branch *br) -+{ -+ int err; -+ -+ err = 0; -+ br->br_fhsm = kmalloc(sizeof(*br->br_fhsm), GFP_NOFS); -+ if (br->br_fhsm) -+ au_br_fhsm_init(br->br_fhsm); -+ else -+ err = -ENOMEM; -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+void au_fhsm_fin(struct super_block *sb) -+{ -+ au_fhsm_notify(sb, /*val*/-1); -+} -+ -+void au_fhsm_init(struct au_sbinfo *sbinfo) -+{ -+ struct au_fhsm *fhsm; -+ -+ fhsm = &sbinfo->si_fhsm; -+ spin_lock_init(&fhsm->fhsm_spin); -+ init_waitqueue_head(&fhsm->fhsm_wqh); -+ atomic_set(&fhsm->fhsm_readable, 0); -+ fhsm->fhsm_expire -+ = msecs_to_jiffies(AUFS_FHSM_CACHE_DEF_SEC * MSEC_PER_SEC); -+ fhsm->fhsm_bottom = -1; -+} -+ -+void au_fhsm_set(struct au_sbinfo *sbinfo, unsigned int sec) -+{ -+ sbinfo->si_fhsm.fhsm_expire -+ = msecs_to_jiffies(sec * MSEC_PER_SEC); -+} -+ -+void au_fhsm_show(struct seq_file *seq, struct au_sbinfo *sbinfo) -+{ -+ unsigned int u; -+ -+ if (!au_ftest_si(sbinfo, FHSM)) -+ return; -+ -+ u = jiffies_to_msecs(sbinfo->si_fhsm.fhsm_expire) / MSEC_PER_SEC; -+ if (u != AUFS_FHSM_CACHE_DEF_SEC) -+ seq_printf(seq, ",fhsm_sec=%u", u); -+} -diff -Naur null/fs/aufs/file.c linux-5.15.36/fs/aufs/file.c ---- /dev/null -+++ linux-5.15.36/fs/aufs/file.c 2022-05-10 16:51:39.870744219 +0300 -@@ -0,0 +1,863 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program. If not, see . -+ */ -+ -+/* -+ * handling file/dir, and address_space operation -+ */ -+ -+#ifdef CONFIG_AUFS_DEBUG -+#include -+#endif -+#include -+#include "aufs.h" -+ -+/* drop flags for writing */ -+unsigned int au_file_roflags(unsigned int flags) -+{ -+ flags &= ~(O_WRONLY | O_RDWR | O_APPEND | O_CREAT | O_TRUNC); -+ flags |= O_RDONLY | O_NOATIME; -+ return flags; -+} -+ -+/* common functions to regular file and dir */ -+struct file *au_h_open(struct dentry *dentry, aufs_bindex_t bindex, int flags, -+ struct file *file, int force_wr) -+{ -+ struct file *h_file; -+ struct dentry *h_dentry; -+ struct inode *h_inode; -+ struct super_block *sb; -+ struct au_branch *br; -+ struct path h_path; -+ int err; -+ -+ /* a race condition can happen between open and unlink/rmdir */ -+ h_file = ERR_PTR(-ENOENT); -+ h_dentry = au_h_dptr(dentry, bindex); -+ if (au_test_nfsd() && (!h_dentry || d_is_negative(h_dentry))) -+ goto out; -+ h_inode = d_inode(h_dentry); -+ spin_lock(&h_dentry->d_lock); -+ err = (!d_unhashed(dentry) && d_unlinked(h_dentry)) -+ /* || !d_inode(dentry)->i_nlink */ -+ ; -+ spin_unlock(&h_dentry->d_lock); -+ if (unlikely(err)) -+ goto out; -+ -+ sb = dentry->d_sb; -+ br = au_sbr(sb, bindex); -+ err = au_br_test_oflag(flags, br); -+ h_file = ERR_PTR(err); -+ if (unlikely(err)) -+ goto out; -+ -+ /* drop flags for writing */ -+ if (au_test_ro(sb, bindex, d_inode(dentry))) { -+ if (force_wr && !(flags & O_WRONLY)) -+ force_wr = 0; -+ flags = au_file_roflags(flags); -+ if (force_wr) { -+ h_file = ERR_PTR(-EROFS); -+ flags = au_file_roflags(flags); -+ if (unlikely(vfsub_native_ro(h_inode) -+ || IS_APPEND(h_inode))) -+ goto out; -+ flags &= ~O_ACCMODE; -+ flags |= O_WRONLY; -+ } -+ } -+ flags &= ~O_CREAT; -+ au_lcnt_inc(&br->br_nfiles); -+ h_path.dentry = h_dentry; -+ h_path.mnt = au_br_mnt(br); -+ h_file = vfsub_dentry_open(&h_path, flags); -+ if (IS_ERR(h_file)) -+ goto out_br; -+ -+ if (flags & __FMODE_EXEC) { -+ err = deny_write_access(h_file); -+ if (unlikely(err)) { -+ fput(h_file); -+ h_file = ERR_PTR(err); -+ goto out_br; -+ } -+ } -+ fsnotify_open(h_file); -+ goto out; /* success */ -+ -+out_br: -+ au_lcnt_dec(&br->br_nfiles); -+out: -+ return h_file; -+} -+ -+static int au_cmoo(struct dentry *dentry) -+{ -+ int err, cmoo, matched; -+ unsigned int udba; -+ struct path h_path; -+ struct au_pin pin; -+ struct au_cp_generic cpg = { -+ .dentry = dentry, -+ .bdst = -1, -+ .bsrc = -1, -+ .len = -1, -+ .pin = &pin, -+ .flags = AuCpup_DTIME | AuCpup_HOPEN -+ }; -+ struct inode *delegated; -+ struct super_block *sb; -+ struct au_sbinfo *sbinfo; -+ struct au_fhsm *fhsm; -+ pid_t pid; -+ struct au_branch *br; -+ struct dentry *parent; -+ struct au_hinode *hdir; -+ -+ DiMustWriteLock(dentry); -+ IiMustWriteLock(d_inode(dentry)); -+ -+ err = 0; -+ if (IS_ROOT(dentry)) -+ goto out; -+ cpg.bsrc = au_dbtop(dentry); -+ if (!cpg.bsrc) -+ goto out; -+ -+ sb = dentry->d_sb; -+ sbinfo = au_sbi(sb); -+ fhsm = &sbinfo->si_fhsm; -+ pid = au_fhsm_pid(fhsm); -+ rcu_read_lock(); -+ matched = (pid -+ && (current->pid == pid -+ || rcu_dereference(current->real_parent)->pid == pid)); -+ rcu_read_unlock(); -+ if (matched) -+ goto out; -+ -+ br = au_sbr(sb, cpg.bsrc); -+ cmoo = au_br_cmoo(br->br_perm); -+ if (!cmoo) -+ goto out; -+ if (!d_is_reg(dentry)) -+ cmoo &= AuBrAttr_COO_ALL; -+ if (!cmoo) -+ goto out; -+ -+ parent = dget_parent(dentry); -+ di_write_lock_parent(parent); -+ err = au_wbr_do_copyup_bu(dentry, cpg.bsrc - 1); -+ cpg.bdst = err; -+ if (unlikely(err < 0)) { -+ err = 0; /* there is no upper writable branch */ -+ goto out_dgrade; -+ } -+ AuDbg("bsrc %d, bdst %d\n", cpg.bsrc, cpg.bdst); -+ -+ /* do not respect the coo attrib for the target branch */ -+ err = au_cpup_dirs(dentry, cpg.bdst); -+ if (unlikely(err)) -+ goto out_dgrade; -+ -+ di_downgrade_lock(parent, AuLock_IR); -+ udba = au_opt_udba(sb); -+ err = au_pin(&pin, dentry, cpg.bdst, udba, -+ AuPin_DI_LOCKED | AuPin_MNT_WRITE); -+ if (unlikely(err)) -+ goto out_parent; -+ -+ err = au_sio_cpup_simple(&cpg); -+ au_unpin(&pin); -+ if (unlikely(err)) -+ goto out_parent; -+ if (!(cmoo & AuBrWAttr_MOO)) -+ goto out_parent; /* success */ -+ -+ err = au_pin(&pin, dentry, cpg.bsrc, udba, -+ AuPin_DI_LOCKED | AuPin_MNT_WRITE); -+ if (unlikely(err)) -+ goto out_parent; -+ -+ 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); -+ 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); -+ err = 0; -+ } -+ goto out_parent; /* success */ -+ -+out_dgrade: -+ di_downgrade_lock(parent, AuLock_IR); -+out_parent: -+ di_read_unlock(parent, AuLock_IR); -+ dput(parent); -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+int au_do_open(struct file *file, struct au_do_open_args *args) -+{ -+ int err, aopen = args->aopen; -+ struct dentry *dentry; -+ struct au_finfo *finfo; -+ -+ if (!aopen) -+ err = au_finfo_init(file, args->fidir); -+ else { -+ lockdep_off(); -+ err = au_finfo_init(file, args->fidir); -+ lockdep_on(); -+ } -+ if (unlikely(err)) -+ goto out; -+ -+ dentry = file->f_path.dentry; -+ AuDebugOn(IS_ERR_OR_NULL(dentry)); -+ di_write_lock_child(dentry); -+ err = au_cmoo(dentry); -+ di_downgrade_lock(dentry, AuLock_IR); -+ if (!err) { -+ if (!aopen) -+ err = args->open(file, vfsub_file_flags(file), NULL); -+ else { -+ lockdep_off(); -+ err = args->open(file, vfsub_file_flags(file), -+ args->h_file); -+ lockdep_on(); -+ } -+ } -+ di_read_unlock(dentry, AuLock_IR); -+ -+ finfo = au_fi(file); -+ if (!err) { -+ finfo->fi_file = file; -+ au_hbl_add(&finfo->fi_hlist, -+ &au_sbi(file->f_path.dentry->d_sb)->si_files); -+ } -+ if (!aopen) -+ fi_write_unlock(file); -+ else { -+ lockdep_off(); -+ fi_write_unlock(file); -+ lockdep_on(); -+ } -+ if (unlikely(err)) { -+ finfo->fi_hdir = NULL; -+ au_finfo_fin(file); -+ } -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+int au_reopen_nondir(struct file *file) -+{ -+ int err; -+ aufs_bindex_t btop; -+ struct dentry *dentry; -+ struct au_branch *br; -+ struct file *h_file, *h_file_tmp; -+ -+ dentry = file->f_path.dentry; -+ btop = au_dbtop(dentry); -+ br = au_sbr(dentry->d_sb, btop); -+ h_file_tmp = NULL; -+ if (au_fbtop(file) == btop) { -+ h_file = au_hf_top(file); -+ if (file->f_mode == h_file->f_mode) -+ return 0; /* success */ -+ h_file_tmp = h_file; -+ get_file(h_file_tmp); -+ au_lcnt_inc(&br->br_nfiles); -+ au_set_h_fptr(file, btop, NULL); -+ } -+ AuDebugOn(au_fi(file)->fi_hdir); -+ /* -+ * it can happen -+ * file exists on both of rw and ro -+ * open --> dbtop and fbtop are both 0 -+ * prepend a branch as rw, "rw" become ro -+ * remove rw/file -+ * delete the top branch, "rw" becomes rw again -+ * --> dbtop is 1, fbtop is still 0 -+ * write --> fbtop is 0 but dbtop is 1 -+ */ -+ /* AuDebugOn(au_fbtop(file) < btop); */ -+ -+ h_file = au_h_open(dentry, btop, vfsub_file_flags(file) & ~O_TRUNC, -+ file, /*force_wr*/0); -+ err = PTR_ERR(h_file); -+ if (IS_ERR(h_file)) { -+ if (h_file_tmp) { -+ /* revert */ -+ au_set_h_fptr(file, btop, h_file_tmp); -+ h_file_tmp = NULL; -+ } -+ goto out; /* todo: close all? */ -+ } -+ -+ err = 0; -+ au_set_fbtop(file, btop); -+ au_set_h_fptr(file, btop, h_file); -+ au_update_figen(file); -+ /* todo: necessary? */ -+ /* file->f_ra = h_file->f_ra; */ -+ -+out: -+ if (h_file_tmp) { -+ fput(h_file_tmp); -+ au_lcnt_dec(&br->br_nfiles); -+ } -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int au_reopen_wh(struct file *file, aufs_bindex_t btgt, -+ struct dentry *hi_wh) -+{ -+ int err; -+ aufs_bindex_t btop; -+ struct au_dinfo *dinfo; -+ struct dentry *h_dentry; -+ struct au_hdentry *hdp; -+ -+ dinfo = au_di(file->f_path.dentry); -+ AuRwMustWriteLock(&dinfo->di_rwsem); -+ -+ btop = dinfo->di_btop; -+ dinfo->di_btop = btgt; -+ hdp = au_hdentry(dinfo, btgt); -+ h_dentry = hdp->hd_dentry; -+ hdp->hd_dentry = hi_wh; -+ err = au_reopen_nondir(file); -+ hdp->hd_dentry = h_dentry; -+ dinfo->di_btop = btop; -+ -+ return err; -+} -+ -+static int au_ready_to_write_wh(struct file *file, loff_t len, -+ aufs_bindex_t bcpup, struct au_pin *pin) -+{ -+ int err; -+ struct inode *inode, *h_inode; -+ struct dentry *h_dentry, *hi_wh; -+ struct au_cp_generic cpg = { -+ .dentry = file->f_path.dentry, -+ .bdst = bcpup, -+ .bsrc = -1, -+ .len = len, -+ .pin = pin -+ }; -+ -+ au_update_dbtop(cpg.dentry); -+ inode = d_inode(cpg.dentry); -+ h_inode = NULL; -+ if (au_dbtop(cpg.dentry) <= bcpup -+ && au_dbbot(cpg.dentry) >= bcpup) { -+ h_dentry = au_h_dptr(cpg.dentry, bcpup); -+ if (h_dentry && d_is_positive(h_dentry)) -+ h_inode = d_inode(h_dentry); -+ } -+ hi_wh = au_hi_wh(inode, bcpup); -+ if (!hi_wh && !h_inode) -+ err = au_sio_cpup_wh(&cpg, file); -+ else -+ /* already copied-up after unlink */ -+ err = au_reopen_wh(file, bcpup, hi_wh); -+ -+ if (!err -+ && (inode->i_nlink > 1 -+ || (inode->i_state & I_LINKABLE)) -+ && au_opt_test(au_mntflags(cpg.dentry->d_sb), PLINK)) -+ au_plink_append(inode, bcpup, au_h_dptr(cpg.dentry, bcpup)); -+ -+ return err; -+} -+ -+/* -+ * prepare the @file for writing. -+ */ -+int au_ready_to_write(struct file *file, loff_t len, struct au_pin *pin) -+{ -+ int err; -+ aufs_bindex_t dbtop; -+ struct dentry *parent; -+ struct inode *inode; -+ struct super_block *sb; -+ struct file *h_file; -+ struct au_cp_generic cpg = { -+ .dentry = file->f_path.dentry, -+ .bdst = -1, -+ .bsrc = -1, -+ .len = len, -+ .pin = pin, -+ .flags = AuCpup_DTIME -+ }; -+ -+ sb = cpg.dentry->d_sb; -+ inode = d_inode(cpg.dentry); -+ cpg.bsrc = au_fbtop(file); -+ err = au_test_ro(sb, cpg.bsrc, inode); -+ if (!err && (au_hf_top(file)->f_mode & FMODE_WRITE)) { -+ err = au_pin(pin, cpg.dentry, cpg.bsrc, AuOpt_UDBA_NONE, -+ /*flags*/0); -+ goto out; -+ } -+ -+ /* need to cpup or reopen */ -+ parent = dget_parent(cpg.dentry); -+ di_write_lock_parent(parent); -+ err = AuWbrCopyup(au_sbi(sb), cpg.dentry); -+ cpg.bdst = err; -+ if (unlikely(err < 0)) -+ goto out_dgrade; -+ err = 0; -+ -+ if (!d_unhashed(cpg.dentry) && !au_h_dptr(parent, cpg.bdst)) { -+ err = au_cpup_dirs(cpg.dentry, cpg.bdst); -+ if (unlikely(err)) -+ goto out_dgrade; -+ } -+ -+ err = au_pin(pin, cpg.dentry, cpg.bdst, AuOpt_UDBA_NONE, -+ AuPin_DI_LOCKED | AuPin_MNT_WRITE); -+ if (unlikely(err)) -+ goto out_dgrade; -+ -+ dbtop = au_dbtop(cpg.dentry); -+ if (dbtop <= cpg.bdst) -+ cpg.bsrc = cpg.bdst; -+ -+ if (dbtop <= cpg.bdst /* just reopen */ -+ || !d_unhashed(cpg.dentry) /* copyup and reopen */ -+ ) { -+ h_file = au_h_open_pre(cpg.dentry, cpg.bsrc, /*force_wr*/0); -+ if (IS_ERR(h_file)) -+ err = PTR_ERR(h_file); -+ else { -+ di_downgrade_lock(parent, AuLock_IR); -+ if (dbtop > cpg.bdst) -+ err = au_sio_cpup_simple(&cpg); -+ if (!err) -+ err = au_reopen_nondir(file); -+ au_h_open_post(cpg.dentry, cpg.bsrc, h_file); -+ } -+ } else { /* copyup as wh and reopen */ -+ /* -+ * since writable hfsplus branch is not supported, -+ * h_open_pre/post() are unnecessary. -+ */ -+ err = au_ready_to_write_wh(file, len, cpg.bdst, pin); -+ di_downgrade_lock(parent, AuLock_IR); -+ } -+ -+ if (!err) { -+ au_pin_set_parent_lflag(pin, /*lflag*/0); -+ goto out_dput; /* success */ -+ } -+ au_unpin(pin); -+ goto out_unlock; -+ -+out_dgrade: -+ di_downgrade_lock(parent, AuLock_IR); -+out_unlock: -+ di_read_unlock(parent, AuLock_IR); -+out_dput: -+ dput(parent); -+out: -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+int au_do_flush(struct file *file, fl_owner_t id, -+ int (*flush)(struct file *file, fl_owner_t id)) -+{ -+ int err; -+ struct super_block *sb; -+ struct inode *inode; -+ -+ inode = file_inode(file); -+ sb = inode->i_sb; -+ si_noflush_read_lock(sb); -+ fi_read_lock(file); -+ ii_read_lock_child(inode); -+ -+ err = flush(file, id); -+ au_cpup_attr_timesizes(inode); -+ -+ ii_read_unlock(inode); -+ fi_read_unlock(file); -+ si_read_unlock(sb); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int au_file_refresh_by_inode(struct file *file, int *need_reopen) -+{ -+ int err; -+ struct au_pin pin; -+ struct au_finfo *finfo; -+ struct dentry *parent, *hi_wh; -+ struct inode *inode; -+ struct super_block *sb; -+ struct au_cp_generic cpg = { -+ .dentry = file->f_path.dentry, -+ .bdst = -1, -+ .bsrc = -1, -+ .len = -1, -+ .pin = &pin, -+ .flags = AuCpup_DTIME -+ }; -+ -+ FiMustWriteLock(file); -+ -+ err = 0; -+ finfo = au_fi(file); -+ sb = cpg.dentry->d_sb; -+ inode = d_inode(cpg.dentry); -+ cpg.bdst = au_ibtop(inode); -+ if (cpg.bdst == finfo->fi_btop || IS_ROOT(cpg.dentry)) -+ goto out; -+ -+ parent = dget_parent(cpg.dentry); -+ if (au_test_ro(sb, cpg.bdst, inode)) { -+ di_read_lock_parent(parent, !AuLock_IR); -+ err = AuWbrCopyup(au_sbi(sb), cpg.dentry); -+ cpg.bdst = err; -+ di_read_unlock(parent, !AuLock_IR); -+ if (unlikely(err < 0)) -+ goto out_parent; -+ err = 0; -+ } -+ -+ di_read_lock_parent(parent, AuLock_IR); -+ hi_wh = au_hi_wh(inode, cpg.bdst); -+ if (!S_ISDIR(inode->i_mode) -+ && au_opt_test(au_mntflags(sb), PLINK) -+ && au_plink_test(inode) -+ && !d_unhashed(cpg.dentry) -+ && cpg.bdst < au_dbtop(cpg.dentry)) { -+ err = au_test_and_cpup_dirs(cpg.dentry, cpg.bdst); -+ if (unlikely(err)) -+ goto out_unlock; -+ -+ /* always superio. */ -+ err = au_pin(&pin, cpg.dentry, cpg.bdst, AuOpt_UDBA_NONE, -+ AuPin_DI_LOCKED | AuPin_MNT_WRITE); -+ if (!err) { -+ err = au_sio_cpup_simple(&cpg); -+ au_unpin(&pin); -+ } -+ } else if (hi_wh) { -+ /* already copied-up after unlink */ -+ err = au_reopen_wh(file, cpg.bdst, hi_wh); -+ *need_reopen = 0; -+ } -+ -+out_unlock: -+ di_read_unlock(parent, AuLock_IR); -+out_parent: -+ dput(parent); -+out: -+ return err; -+} -+ -+static void au_do_refresh_dir(struct file *file) -+{ -+ aufs_bindex_t bindex, bbot, new_bindex, brid; -+ struct au_hfile *p, tmp, *q; -+ struct au_finfo *finfo; -+ struct super_block *sb; -+ struct au_fidir *fidir; -+ -+ FiMustWriteLock(file); -+ -+ sb = file->f_path.dentry->d_sb; -+ finfo = au_fi(file); -+ fidir = finfo->fi_hdir; -+ AuDebugOn(!fidir); -+ p = fidir->fd_hfile + finfo->fi_btop; -+ brid = p->hf_br->br_id; -+ bbot = fidir->fd_bbot; -+ for (bindex = finfo->fi_btop; bindex <= bbot; bindex++, p++) { -+ if (!p->hf_file) -+ continue; -+ -+ new_bindex = au_br_index(sb, p->hf_br->br_id); -+ if (new_bindex == bindex) -+ continue; -+ if (new_bindex < 0) { -+ au_set_h_fptr(file, bindex, NULL); -+ continue; -+ } -+ -+ /* swap two lower inode, and loop again */ -+ q = fidir->fd_hfile + new_bindex; -+ tmp = *q; -+ *q = *p; -+ *p = tmp; -+ if (tmp.hf_file) { -+ bindex--; -+ p--; -+ } -+ } -+ -+ p = fidir->fd_hfile; -+ if (!au_test_mmapped(file) && !d_unlinked(file->f_path.dentry)) { -+ bbot = au_sbbot(sb); -+ for (finfo->fi_btop = 0; finfo->fi_btop <= bbot; -+ finfo->fi_btop++, p++) -+ if (p->hf_file) { -+ if (file_inode(p->hf_file)) -+ break; -+ au_hfput(p, /*execed*/0); -+ } -+ } else { -+ bbot = au_br_index(sb, brid); -+ for (finfo->fi_btop = 0; finfo->fi_btop < bbot; -+ finfo->fi_btop++, p++) -+ if (p->hf_file) -+ au_hfput(p, /*execed*/0); -+ bbot = au_sbbot(sb); -+ } -+ -+ p = fidir->fd_hfile + bbot; -+ for (fidir->fd_bbot = bbot; fidir->fd_bbot >= finfo->fi_btop; -+ fidir->fd_bbot--, p--) -+ if (p->hf_file) { -+ if (file_inode(p->hf_file)) -+ break; -+ au_hfput(p, /*execed*/0); -+ } -+ AuDebugOn(fidir->fd_bbot < finfo->fi_btop); -+} -+ -+/* -+ * after branch manipulating, refresh the file. -+ */ -+static int refresh_file(struct file *file, int (*reopen)(struct file *file)) -+{ -+ int err, need_reopen, nbr; -+ aufs_bindex_t bbot, bindex; -+ struct dentry *dentry; -+ struct super_block *sb; -+ struct au_finfo *finfo; -+ struct au_hfile *hfile; -+ -+ dentry = file->f_path.dentry; -+ sb = dentry->d_sb; -+ nbr = au_sbbot(sb) + 1; -+ finfo = au_fi(file); -+ if (!finfo->fi_hdir) { -+ hfile = &finfo->fi_htop; -+ AuDebugOn(!hfile->hf_file); -+ bindex = au_br_index(sb, hfile->hf_br->br_id); -+ AuDebugOn(bindex < 0); -+ if (bindex != finfo->fi_btop) -+ au_set_fbtop(file, bindex); -+ } else { -+ err = au_fidir_realloc(finfo, nbr, /*may_shrink*/0); -+ if (unlikely(err)) -+ goto out; -+ au_do_refresh_dir(file); -+ } -+ -+ err = 0; -+ need_reopen = 1; -+ if (!au_test_mmapped(file)) -+ err = au_file_refresh_by_inode(file, &need_reopen); -+ if (finfo->fi_hdir) -+ /* harmless if err */ -+ au_fidir_realloc(finfo, nbr, /*may_shrink*/1); -+ if (!err && need_reopen && !d_unlinked(dentry)) -+ err = reopen(file); -+ if (!err) { -+ au_update_figen(file); -+ goto out; /* success */ -+ } -+ -+ /* error, close all lower files */ -+ if (finfo->fi_hdir) { -+ bbot = au_fbbot_dir(file); -+ for (bindex = au_fbtop(file); bindex <= bbot; bindex++) -+ au_set_h_fptr(file, bindex, NULL); -+ } -+ -+out: -+ return err; -+} -+ -+/* common function to regular file and dir */ -+int au_reval_and_lock_fdi(struct file *file, int (*reopen)(struct file *file), -+ int wlock, unsigned int fi_lsc) -+{ -+ int err; -+ unsigned int sigen, figen; -+ aufs_bindex_t btop; -+ unsigned char pseudo_link; -+ struct dentry *dentry; -+ struct inode *inode; -+ -+ err = 0; -+ dentry = file->f_path.dentry; -+ inode = d_inode(dentry); -+ sigen = au_sigen(dentry->d_sb); -+ fi_write_lock_nested(file, fi_lsc); -+ figen = au_figen(file); -+ if (!fi_lsc) -+ di_write_lock_child(dentry); -+ else -+ di_write_lock_child2(dentry); -+ btop = au_dbtop(dentry); -+ pseudo_link = (btop != au_ibtop(inode)); -+ if (sigen == figen && !pseudo_link && au_fbtop(file) == btop) { -+ if (!wlock) { -+ di_downgrade_lock(dentry, AuLock_IR); -+ fi_downgrade_lock(file); -+ } -+ goto out; /* success */ -+ } -+ -+ AuDbg("sigen %d, figen %d\n", sigen, figen); -+ if (au_digen_test(dentry, sigen)) { -+ err = au_reval_dpath(dentry, sigen); -+ AuDebugOn(!err && au_digen_test(dentry, sigen)); -+ } -+ -+ if (!err) -+ err = refresh_file(file, reopen); -+ if (!err) { -+ if (!wlock) { -+ di_downgrade_lock(dentry, AuLock_IR); -+ fi_downgrade_lock(file); -+ } -+ } else { -+ di_write_unlock(dentry); -+ fi_write_unlock(file); -+ } -+ -+out: -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* cf. aufs_nopage() */ -+/* for madvise(2) */ -+static int aufs_readpage(struct file *file __maybe_unused, struct page *page) -+{ -+ unlock_page(page); -+ return 0; -+} -+ -+/* it will never be called, but necessary to support O_DIRECT */ -+static ssize_t aufs_direct_IO(struct kiocb *iocb, struct iov_iter *iter) -+{ BUG(); return 0; } -+ -+/* they will never be called. */ -+#ifdef CONFIG_AUFS_DEBUG -+static int aufs_write_begin(struct file *file, struct address_space *mapping, -+ loff_t pos, unsigned len, unsigned flags, -+ struct page **pagep, void **fsdata) -+{ AuUnsupport(); return 0; } -+static int aufs_write_end(struct file *file, struct address_space *mapping, -+ loff_t pos, unsigned len, unsigned copied, -+ struct page *page, void *fsdata) -+{ AuUnsupport(); return 0; } -+static int aufs_writepage(struct page *page, struct writeback_control *wbc) -+{ AuUnsupport(); return 0; } -+ -+static int aufs_set_page_dirty(struct page *page) -+{ AuUnsupport(); return 0; } -+static void aufs_invalidatepage(struct page *page, unsigned int offset, -+ unsigned int length) -+{ AuUnsupport(); } -+static int aufs_releasepage(struct page *page, gfp_t gfp) -+{ AuUnsupport(); return 0; } -+#if 0 /* called by memory compaction regardless file */ -+static int aufs_migratepage(struct address_space *mapping, struct page *newpage, -+ struct page *page, enum migrate_mode mode) -+{ AuUnsupport(); return 0; } -+#endif -+static bool aufs_isolate_page(struct page *page, isolate_mode_t mode) -+{ AuUnsupport(); return true; } -+static void aufs_putback_page(struct page *page) -+{ AuUnsupport(); } -+static int aufs_launder_page(struct page *page) -+{ AuUnsupport(); return 0; } -+static int aufs_is_partially_uptodate(struct page *page, -+ unsigned long from, -+ unsigned long count) -+{ AuUnsupport(); return 0; } -+static void aufs_is_dirty_writeback(struct page *page, bool *dirty, -+ bool *writeback) -+{ AuUnsupport(); } -+static int aufs_error_remove_page(struct address_space *mapping, -+ struct page *page) -+{ AuUnsupport(); return 0; } -+static int aufs_swap_activate(struct swap_info_struct *sis, struct file *file, -+ sector_t *span) -+{ AuUnsupport(); return 0; } -+static void aufs_swap_deactivate(struct file *file) -+{ AuUnsupport(); } -+#endif /* CONFIG_AUFS_DEBUG */ -+ -+const struct address_space_operations aufs_aop = { -+ .readpage = aufs_readpage, -+ .direct_IO = aufs_direct_IO, -+#ifdef CONFIG_AUFS_DEBUG -+ .writepage = aufs_writepage, -+ /* no writepages, because of writepage */ -+ .set_page_dirty = aufs_set_page_dirty, -+ /* no readpages, because of readpage */ -+ .write_begin = aufs_write_begin, -+ .write_end = aufs_write_end, -+ /* no bmap, no block device */ -+ .invalidatepage = aufs_invalidatepage, -+ .releasepage = aufs_releasepage, -+ /* is fallback_migrate_page ok? */ -+ /* .migratepage = aufs_migratepage, */ -+ .isolate_page = aufs_isolate_page, -+ .putback_page = aufs_putback_page, -+ .launder_page = aufs_launder_page, -+ .is_partially_uptodate = aufs_is_partially_uptodate, -+ .is_dirty_writeback = aufs_is_dirty_writeback, -+ .error_remove_page = aufs_error_remove_page, -+ .swap_activate = aufs_swap_activate, -+ .swap_deactivate = aufs_swap_deactivate -+#endif /* CONFIG_AUFS_DEBUG */ -+}; -diff -Naur null/fs/aufs/file.h linux-5.15.36/fs/aufs/file.h ---- /dev/null -+++ linux-5.15.36/fs/aufs/file.h 2022-05-10 16:51:39.871744219 +0300 -@@ -0,0 +1,342 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program. If not, see . -+ */ -+ -+/* -+ * file operations -+ */ -+ -+#ifndef __AUFS_FILE_H__ -+#define __AUFS_FILE_H__ -+ -+#ifdef __KERNEL__ -+ -+#include -+#include -+#include -+#include -+#include "rwsem.h" -+ -+struct au_branch; -+struct au_hfile { -+ struct file *hf_file; -+ struct au_branch *hf_br; -+}; -+ -+struct au_vdir; -+struct au_fidir { -+ aufs_bindex_t fd_bbot; -+ aufs_bindex_t fd_nent; -+ struct au_vdir *fd_vdir_cache; -+ struct au_hfile fd_hfile[]; -+}; -+ -+static inline int au_fidir_sz(int nent) -+{ -+ AuDebugOn(nent < 0); -+ return sizeof(struct au_fidir) + sizeof(struct au_hfile) * nent; -+} -+ -+struct au_finfo { -+ atomic_t fi_generation; -+ -+ struct au_rwsem fi_rwsem; -+ aufs_bindex_t fi_btop; -+ -+ /* do not union them */ -+ struct { /* for non-dir */ -+ struct au_hfile fi_htop; -+ atomic_t fi_mmapped; -+ }; -+ struct au_fidir *fi_hdir; /* for dir only */ -+ -+ struct hlist_bl_node fi_hlist; -+ struct file *fi_file; /* very ugly */ -+ struct rcu_head rcu; -+} ____cacheline_aligned_in_smp; -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* file.c */ -+extern const struct address_space_operations aufs_aop; -+unsigned int au_file_roflags(unsigned int flags); -+struct file *au_h_open(struct dentry *dentry, aufs_bindex_t bindex, int flags, -+ struct file *file, int force_wr); -+struct au_do_open_args { -+ int aopen; -+ int (*open)(struct file *file, int flags, -+ struct file *h_file); -+ struct au_fidir *fidir; -+ struct file *h_file; -+}; -+int au_do_open(struct file *file, struct au_do_open_args *args); -+int au_reopen_nondir(struct file *file); -+struct au_pin; -+int au_ready_to_write(struct file *file, loff_t len, struct au_pin *pin); -+int au_reval_and_lock_fdi(struct file *file, int (*reopen)(struct file *file), -+ int wlock, unsigned int fi_lsc); -+int au_do_flush(struct file *file, fl_owner_t id, -+ int (*flush)(struct file *file, fl_owner_t id)); -+ -+/* poll.c */ -+#ifdef CONFIG_AUFS_POLL -+__poll_t aufs_poll(struct file *file, struct poll_table_struct *pt); -+#endif -+ -+#ifdef CONFIG_AUFS_BR_HFSPLUS -+/* hfsplus.c */ -+struct file *au_h_open_pre(struct dentry *dentry, aufs_bindex_t bindex, -+ int force_wr); -+void au_h_open_post(struct dentry *dentry, aufs_bindex_t bindex, -+ struct file *h_file); -+#else -+AuStub(struct file *, au_h_open_pre, return NULL, struct dentry *dentry, -+ aufs_bindex_t bindex, int force_wr) -+AuStubVoid(au_h_open_post, struct dentry *dentry, aufs_bindex_t bindex, -+ struct file *h_file); -+#endif -+ -+/* f_op.c */ -+extern const struct file_operations aufs_file_fop; -+int au_do_open_nondir(struct file *file, int flags, struct file *h_file); -+int aufs_release_nondir(struct inode *inode __maybe_unused, struct file *file); -+struct file *au_read_pre(struct file *file, int keep_fi, unsigned int lsc); -+ -+/* finfo.c */ -+void au_hfput(struct au_hfile *hf, int execed); -+void au_set_h_fptr(struct file *file, aufs_bindex_t bindex, -+ struct file *h_file); -+ -+void au_update_figen(struct file *file); -+struct au_fidir *au_fidir_alloc(struct super_block *sb); -+int au_fidir_realloc(struct au_finfo *finfo, int nbr, int may_shrink); -+ -+void au_fi_init_once(void *_fi); -+void au_finfo_fin(struct file *file); -+int au_finfo_init(struct file *file, struct au_fidir *fidir); -+ -+/* ioctl.c */ -+long aufs_ioctl_nondir(struct file *file, unsigned int cmd, unsigned long arg); -+#ifdef CONFIG_COMPAT -+long aufs_compat_ioctl_dir(struct file *file, unsigned int cmd, -+ unsigned long arg); -+long aufs_compat_ioctl_nondir(struct file *file, unsigned int cmd, -+ unsigned long arg); -+#endif -+ -+/* ---------------------------------------------------------------------- */ -+ -+static inline struct au_finfo *au_fi(struct file *file) -+{ -+ return file->private_data; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+#define fi_read_lock(f) au_rw_read_lock(&au_fi(f)->fi_rwsem) -+#define fi_write_lock(f) au_rw_write_lock(&au_fi(f)->fi_rwsem) -+#define fi_read_trylock(f) au_rw_read_trylock(&au_fi(f)->fi_rwsem) -+#define fi_write_trylock(f) au_rw_write_trylock(&au_fi(f)->fi_rwsem) -+/* -+#define fi_read_trylock_nested(f) \ -+ au_rw_read_trylock_nested(&au_fi(f)->fi_rwsem) -+#define fi_write_trylock_nested(f) \ -+ au_rw_write_trylock_nested(&au_fi(f)->fi_rwsem) -+*/ -+ -+#define fi_read_unlock(f) au_rw_read_unlock(&au_fi(f)->fi_rwsem) -+#define fi_write_unlock(f) au_rw_write_unlock(&au_fi(f)->fi_rwsem) -+#define fi_downgrade_lock(f) au_rw_dgrade_lock(&au_fi(f)->fi_rwsem) -+ -+/* lock subclass for finfo */ -+enum { -+ AuLsc_FI_1, -+ AuLsc_FI_2 -+}; -+ -+static inline void fi_read_lock_nested(struct file *f, unsigned int lsc) -+{ -+ au_rw_read_lock_nested(&au_fi(f)->fi_rwsem, lsc); -+} -+ -+static inline void fi_write_lock_nested(struct file *f, unsigned int lsc) -+{ -+ au_rw_write_lock_nested(&au_fi(f)->fi_rwsem, lsc); -+} -+ -+/* -+ * fi_read_lock_1, fi_write_lock_1, -+ * fi_read_lock_2, fi_write_lock_2 -+ */ -+#define AuReadLockFunc(name) \ -+static inline void fi_read_lock_##name(struct file *f) \ -+{ fi_read_lock_nested(f, AuLsc_FI_##name); } -+ -+#define AuWriteLockFunc(name) \ -+static inline void fi_write_lock_##name(struct file *f) \ -+{ fi_write_lock_nested(f, AuLsc_FI_##name); } -+ -+#define AuRWLockFuncs(name) \ -+ AuReadLockFunc(name) \ -+ AuWriteLockFunc(name) -+ -+AuRWLockFuncs(1); -+AuRWLockFuncs(2); -+ -+#undef AuReadLockFunc -+#undef AuWriteLockFunc -+#undef AuRWLockFuncs -+ -+#define FiMustNoWaiters(f) AuRwMustNoWaiters(&au_fi(f)->fi_rwsem) -+#define FiMustAnyLock(f) AuRwMustAnyLock(&au_fi(f)->fi_rwsem) -+#define FiMustWriteLock(f) AuRwMustWriteLock(&au_fi(f)->fi_rwsem) -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* todo: hard/soft set? */ -+static inline aufs_bindex_t au_fbtop(struct file *file) -+{ -+ FiMustAnyLock(file); -+ return au_fi(file)->fi_btop; -+} -+ -+static inline aufs_bindex_t au_fbbot_dir(struct file *file) -+{ -+ FiMustAnyLock(file); -+ AuDebugOn(!au_fi(file)->fi_hdir); -+ return au_fi(file)->fi_hdir->fd_bbot; -+} -+ -+static inline struct au_vdir *au_fvdir_cache(struct file *file) -+{ -+ FiMustAnyLock(file); -+ AuDebugOn(!au_fi(file)->fi_hdir); -+ return au_fi(file)->fi_hdir->fd_vdir_cache; -+} -+ -+static inline void au_set_fbtop(struct file *file, aufs_bindex_t bindex) -+{ -+ FiMustWriteLock(file); -+ au_fi(file)->fi_btop = bindex; -+} -+ -+static inline void au_set_fbbot_dir(struct file *file, aufs_bindex_t bindex) -+{ -+ FiMustWriteLock(file); -+ AuDebugOn(!au_fi(file)->fi_hdir); -+ au_fi(file)->fi_hdir->fd_bbot = bindex; -+} -+ -+static inline void au_set_fvdir_cache(struct file *file, -+ struct au_vdir *vdir_cache) -+{ -+ FiMustWriteLock(file); -+ AuDebugOn(!au_fi(file)->fi_hdir); -+ au_fi(file)->fi_hdir->fd_vdir_cache = vdir_cache; -+} -+ -+static inline struct file *au_hf_top(struct file *file) -+{ -+ FiMustAnyLock(file); -+ AuDebugOn(au_fi(file)->fi_hdir); -+ return au_fi(file)->fi_htop.hf_file; -+} -+ -+static inline struct file *au_hf_dir(struct file *file, aufs_bindex_t bindex) -+{ -+ FiMustAnyLock(file); -+ AuDebugOn(!au_fi(file)->fi_hdir); -+ return au_fi(file)->fi_hdir->fd_hfile[0 + bindex].hf_file; -+} -+ -+/* todo: memory barrier? */ -+static inline unsigned int au_figen(struct file *f) -+{ -+ return atomic_read(&au_fi(f)->fi_generation); -+} -+ -+static inline void au_set_mmapped(struct file *f) -+{ -+ if (atomic_inc_return(&au_fi(f)->fi_mmapped)) -+ return; -+ pr_warn("fi_mmapped wrapped around\n"); -+ while (!atomic_inc_return(&au_fi(f)->fi_mmapped)) -+ ; -+} -+ -+static inline void au_unset_mmapped(struct file *f) -+{ -+ atomic_dec(&au_fi(f)->fi_mmapped); -+} -+ -+static inline int au_test_mmapped(struct file *f) -+{ -+ return atomic_read(&au_fi(f)->fi_mmapped); -+} -+ -+/* customize vma->vm_file */ -+ -+static inline void au_do_vm_file_reset(struct vm_area_struct *vma, -+ struct file *file) -+{ -+ struct file *f; -+ -+ f = vma->vm_file; -+ get_file(file); -+ vma->vm_file = file; -+ fput(f); -+} -+ -+#ifdef CONFIG_MMU -+#define AuDbgVmRegion(file, vma) do {} while (0) -+ -+static inline void au_vm_file_reset(struct vm_area_struct *vma, -+ struct file *file) -+{ -+ au_do_vm_file_reset(vma, file); -+} -+#else -+#define AuDbgVmRegion(file, vma) \ -+ AuDebugOn((vma)->vm_region && (vma)->vm_region->vm_file != (file)) -+ -+static inline void au_vm_file_reset(struct vm_area_struct *vma, -+ struct file *file) -+{ -+ struct file *f; -+ -+ au_do_vm_file_reset(vma, file); -+ f = vma->vm_region->vm_file; -+ get_file(file); -+ vma->vm_region->vm_file = file; -+ fput(f); -+} -+#endif /* CONFIG_MMU */ -+ -+/* handle vma->vm_prfile */ -+static inline void au_vm_prfile_set(struct vm_area_struct *vma, -+ struct file *file) -+{ -+ get_file(file); -+ vma->vm_prfile = file; -+#ifndef CONFIG_MMU -+ get_file(file); -+ vma->vm_region->vm_prfile = file; -+#endif -+} -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_FILE_H__ */ -diff -Naur null/fs/aufs/finfo.c linux-5.15.36/fs/aufs/finfo.c ---- /dev/null -+++ linux-5.15.36/fs/aufs/finfo.c 2022-05-10 16:51:39.871744219 +0300 -@@ -0,0 +1,149 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program. If not, see . -+ */ -+ -+/* -+ * file private data -+ */ -+ -+#include "aufs.h" -+ -+void au_hfput(struct au_hfile *hf, int execed) -+{ -+ if (execed) -+ allow_write_access(hf->hf_file); -+ fput(hf->hf_file); -+ hf->hf_file = NULL; -+ au_lcnt_dec(&hf->hf_br->br_nfiles); -+ hf->hf_br = NULL; -+} -+ -+void au_set_h_fptr(struct file *file, aufs_bindex_t bindex, struct file *val) -+{ -+ struct au_finfo *finfo = au_fi(file); -+ struct au_hfile *hf; -+ struct au_fidir *fidir; -+ -+ fidir = finfo->fi_hdir; -+ if (!fidir) { -+ AuDebugOn(finfo->fi_btop != bindex); -+ hf = &finfo->fi_htop; -+ } else -+ hf = fidir->fd_hfile + bindex; -+ -+ if (hf && hf->hf_file) -+ au_hfput(hf, vfsub_file_execed(file)); -+ if (val) { -+ FiMustWriteLock(file); -+ AuDebugOn(IS_ERR_OR_NULL(file->f_path.dentry)); -+ hf->hf_file = val; -+ hf->hf_br = au_sbr(file->f_path.dentry->d_sb, bindex); -+ } -+} -+ -+void au_update_figen(struct file *file) -+{ -+ atomic_set(&au_fi(file)->fi_generation, au_digen(file->f_path.dentry)); -+ /* smp_mb(); */ /* atomic_set */ -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+struct au_fidir *au_fidir_alloc(struct super_block *sb) -+{ -+ struct au_fidir *fidir; -+ int nbr; -+ -+ nbr = au_sbbot(sb) + 1; -+ if (nbr < 2) -+ nbr = 2; /* initial allocate for 2 branches */ -+ fidir = kzalloc(au_fidir_sz(nbr), GFP_NOFS); -+ if (fidir) { -+ fidir->fd_bbot = -1; -+ fidir->fd_nent = nbr; -+ } -+ -+ return fidir; -+} -+ -+int au_fidir_realloc(struct au_finfo *finfo, int nbr, int may_shrink) -+{ -+ int err; -+ struct au_fidir *fidir, *p; -+ -+ AuRwMustWriteLock(&finfo->fi_rwsem); -+ fidir = finfo->fi_hdir; -+ AuDebugOn(!fidir); -+ -+ err = -ENOMEM; -+ p = au_kzrealloc(fidir, au_fidir_sz(fidir->fd_nent), au_fidir_sz(nbr), -+ GFP_NOFS, may_shrink); -+ if (p) { -+ p->fd_nent = nbr; -+ finfo->fi_hdir = p; -+ err = 0; -+ } -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+void au_finfo_fin(struct file *file) -+{ -+ struct au_finfo *finfo; -+ -+ au_lcnt_dec(&au_sbi(file->f_path.dentry->d_sb)->si_nfiles); -+ -+ finfo = au_fi(file); -+ AuDebugOn(finfo->fi_hdir); -+ AuRwDestroy(&finfo->fi_rwsem); -+ au_cache_free_finfo(finfo); -+} -+ -+void au_fi_init_once(void *_finfo) -+{ -+ struct au_finfo *finfo = _finfo; -+ -+ au_rw_init(&finfo->fi_rwsem); -+} -+ -+int au_finfo_init(struct file *file, struct au_fidir *fidir) -+{ -+ int err; -+ struct au_finfo *finfo; -+ struct dentry *dentry; -+ -+ err = -ENOMEM; -+ dentry = file->f_path.dentry; -+ finfo = au_cache_alloc_finfo(); -+ if (unlikely(!finfo)) -+ goto out; -+ -+ err = 0; -+ au_lcnt_inc(&au_sbi(dentry->d_sb)->si_nfiles); -+ au_rw_write_lock(&finfo->fi_rwsem); -+ finfo->fi_btop = -1; -+ finfo->fi_hdir = fidir; -+ atomic_set(&finfo->fi_generation, au_digen(dentry)); -+ /* smp_mb(); */ /* atomic_set */ -+ -+ file->private_data = finfo; -+ -+out: -+ return err; -+} -diff -Naur null/fs/aufs/f_op.c linux-5.15.36/fs/aufs/f_op.c ---- /dev/null -+++ linux-5.15.36/fs/aufs/f_op.c 2022-05-10 16:51:39.870744219 +0300 -@@ -0,0 +1,771 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program. If not, see . -+ */ -+ -+/* -+ * file and vm operations -+ */ -+ -+#include -+#include -+#include -+#include -+#include "aufs.h" -+ -+int au_do_open_nondir(struct file *file, int flags, struct file *h_file) -+{ -+ int err; -+ aufs_bindex_t bindex; -+ struct dentry *dentry, *h_dentry; -+ struct au_finfo *finfo; -+ struct inode *h_inode; -+ -+ FiMustWriteLock(file); -+ -+ err = 0; -+ dentry = file->f_path.dentry; -+ AuDebugOn(IS_ERR_OR_NULL(dentry)); -+ finfo = au_fi(file); -+ memset(&finfo->fi_htop, 0, sizeof(finfo->fi_htop)); -+ atomic_set(&finfo->fi_mmapped, 0); -+ bindex = au_dbtop(dentry); -+ if (!h_file) { -+ h_dentry = au_h_dptr(dentry, bindex); -+ err = vfsub_test_mntns(file->f_path.mnt, h_dentry->d_sb); -+ if (unlikely(err)) -+ goto out; -+ h_file = au_h_open(dentry, bindex, flags, file, /*force_wr*/0); -+ if (IS_ERR(h_file)) { -+ err = PTR_ERR(h_file); -+ goto out; -+ } -+ } else { -+ h_dentry = h_file->f_path.dentry; -+ err = vfsub_test_mntns(file->f_path.mnt, h_dentry->d_sb); -+ if (unlikely(err)) -+ goto out; -+ /* br ref is already inc-ed */ -+ } -+ -+ if ((flags & __O_TMPFILE) -+ && !(flags & O_EXCL)) { -+ h_inode = file_inode(h_file); -+ spin_lock(&h_inode->i_lock); -+ h_inode->i_state |= I_LINKABLE; -+ spin_unlock(&h_inode->i_lock); -+ } -+ au_set_fbtop(file, bindex); -+ au_set_h_fptr(file, bindex, h_file); -+ au_update_figen(file); -+ /* todo: necessary? */ -+ /* file->f_ra = h_file->f_ra; */ -+ -+out: -+ return err; -+} -+ -+static int aufs_open_nondir(struct inode *inode __maybe_unused, -+ struct file *file) -+{ -+ int err; -+ struct super_block *sb; -+ struct au_do_open_args args = { -+ .open = au_do_open_nondir -+ }; -+ -+ AuDbg("%pD, f_flags 0x%x, f_mode 0x%x\n", -+ file, vfsub_file_flags(file), file->f_mode); -+ -+ sb = file->f_path.dentry->d_sb; -+ si_read_lock(sb, AuLock_FLUSH); -+ err = au_do_open(file, &args); -+ si_read_unlock(sb); -+ return err; -+} -+ -+int aufs_release_nondir(struct inode *inode __maybe_unused, struct file *file) -+{ -+ struct au_finfo *finfo; -+ aufs_bindex_t bindex; -+ -+ finfo = au_fi(file); -+ au_hbl_del(&finfo->fi_hlist, -+ &au_sbi(file->f_path.dentry->d_sb)->si_files); -+ bindex = finfo->fi_btop; -+ if (bindex >= 0) -+ au_set_h_fptr(file, bindex, NULL); -+ -+ au_finfo_fin(file); -+ return 0; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int au_do_flush_nondir(struct file *file, fl_owner_t id) -+{ -+ int err; -+ struct file *h_file; -+ -+ err = 0; -+ h_file = au_hf_top(file); -+ if (h_file) -+ err = vfsub_flush(h_file, id); -+ return err; -+} -+ -+static int aufs_flush_nondir(struct file *file, fl_owner_t id) -+{ -+ return au_do_flush(file, id, au_do_flush_nondir); -+} -+ -+/* ---------------------------------------------------------------------- */ -+/* -+ * read and write functions acquire [fdi]_rwsem once, but release before -+ * mmap_sem. This is because to stop a race condition between mmap(2). -+ * Releasing these aufs-rwsem should be safe, no branch-management (by keeping -+ * si_rwsem), no harmful copy-up should happen. Actually copy-up may happen in -+ * read functions after [fdi]_rwsem are released, but it should be harmless. -+ */ -+ -+/* Callers should call au_read_post() or fput() in the end */ -+struct file *au_read_pre(struct file *file, int keep_fi, unsigned int lsc) -+{ -+ struct file *h_file; -+ int err; -+ -+ err = au_reval_and_lock_fdi(file, au_reopen_nondir, /*wlock*/0, lsc); -+ if (!err) { -+ di_read_unlock(file->f_path.dentry, AuLock_IR); -+ h_file = au_hf_top(file); -+ get_file(h_file); -+ if (!keep_fi) -+ fi_read_unlock(file); -+ } else -+ h_file = ERR_PTR(err); -+ -+ return h_file; -+} -+ -+static void au_read_post(struct inode *inode, struct file *h_file) -+{ -+ /* update without lock, I don't think it a problem */ -+ fsstack_copy_attr_atime(inode, file_inode(h_file)); -+ fput(h_file); -+} -+ -+struct au_write_pre { -+ /* input */ -+ unsigned int lsc; -+ -+ /* output */ -+ blkcnt_t blks; -+ aufs_bindex_t btop; -+}; -+ -+/* -+ * return with iinfo is write-locked -+ * callers should call au_write_post() or iinfo_write_unlock() + fput() in the -+ * end -+ */ -+static struct file *au_write_pre(struct file *file, int do_ready, -+ struct au_write_pre *wpre) -+{ -+ struct file *h_file; -+ struct dentry *dentry; -+ int err; -+ unsigned int lsc; -+ struct au_pin pin; -+ -+ lsc = 0; -+ if (wpre) -+ lsc = wpre->lsc; -+ err = au_reval_and_lock_fdi(file, au_reopen_nondir, /*wlock*/1, lsc); -+ h_file = ERR_PTR(err); -+ if (unlikely(err)) -+ goto out; -+ -+ dentry = file->f_path.dentry; -+ if (do_ready) { -+ err = au_ready_to_write(file, -1, &pin); -+ if (unlikely(err)) { -+ h_file = ERR_PTR(err); -+ di_write_unlock(dentry); -+ goto out_fi; -+ } -+ } -+ -+ di_downgrade_lock(dentry, /*flags*/0); -+ if (wpre) -+ wpre->btop = au_fbtop(file); -+ h_file = au_hf_top(file); -+ get_file(h_file); -+ if (wpre) -+ wpre->blks = file_inode(h_file)->i_blocks; -+ if (do_ready) -+ au_unpin(&pin); -+ di_read_unlock(dentry, /*flags*/0); -+ -+out_fi: -+ fi_write_unlock(file); -+out: -+ return h_file; -+} -+ -+static void au_write_post(struct inode *inode, struct file *h_file, -+ struct au_write_pre *wpre, ssize_t written) -+{ -+ struct inode *h_inode; -+ -+ au_cpup_attr_timesizes(inode); -+ AuDebugOn(au_ibtop(inode) != wpre->btop); -+ h_inode = file_inode(h_file); -+ inode->i_mode = h_inode->i_mode; -+ ii_write_unlock(inode); -+ /* AuDbg("blks %llu, %llu\n", (u64)blks, (u64)h_inode->i_blocks); */ -+ if (written > 0) -+ au_fhsm_wrote(inode->i_sb, wpre->btop, -+ /*force*/h_inode->i_blocks > wpre->blks); -+ fput(h_file); -+} -+ -+/* -+ * todo: very ugly -+ * it locks both of i_mutex and si_rwsem for read in safe. -+ * if the plink maintenance mode continues forever (that is the problem), -+ * may loop forever. -+ */ -+static void au_mtx_and_read_lock(struct inode *inode) -+{ -+ int err; -+ struct super_block *sb = inode->i_sb; -+ -+ while (1) { -+ inode_lock(inode); -+ err = si_read_lock(sb, AuLock_FLUSH | AuLock_NOPLM); -+ if (!err) -+ break; -+ inode_unlock(inode); -+ si_read_lock(sb, AuLock_NOPLMW); -+ si_read_unlock(sb); -+ } -+} -+ -+static ssize_t au_do_iter(struct file *h_file, int rw, struct kiocb *kio, -+ struct iov_iter *iov_iter) -+{ -+ ssize_t err; -+ struct file *file; -+ ssize_t (*iter)(struct kiocb *, struct iov_iter *); -+ -+ err = security_file_permission(h_file, rw); -+ if (unlikely(err)) -+ goto out; -+ -+ err = -ENOSYS; /* the branch doesn't have its ->(read|write)_iter() */ -+ iter = NULL; -+ if (rw == MAY_READ) -+ iter = h_file->f_op->read_iter; -+ else if (rw == MAY_WRITE) -+ iter = h_file->f_op->write_iter; -+ -+ file = kio->ki_filp; -+ kio->ki_filp = h_file; -+ if (iter) { -+ lockdep_off(); -+ err = iter(kio, iov_iter); -+ lockdep_on(); -+ } else -+ /* currently there is no such fs */ -+ WARN_ON_ONCE(1); -+ kio->ki_filp = file; -+ -+out: -+ return err; -+} -+ -+static ssize_t aufs_read_iter(struct kiocb *kio, struct iov_iter *iov_iter) -+{ -+ ssize_t err; -+ struct file *file, *h_file; -+ struct inode *inode; -+ struct super_block *sb; -+ -+ file = kio->ki_filp; -+ inode = file_inode(file); -+ sb = inode->i_sb; -+ si_read_lock(sb, AuLock_FLUSH | AuLock_NOPLMW); -+ -+ h_file = au_read_pre(file, /*keep_fi*/1, /*lsc*/0); -+ err = PTR_ERR(h_file); -+ if (IS_ERR(h_file)) -+ goto out; -+ -+ if (au_test_loopback_kthread()) { -+ au_warn_loopback(h_file->f_path.dentry->d_sb); -+ if (file->f_mapping != h_file->f_mapping) { -+ file->f_mapping = h_file->f_mapping; -+ smp_mb(); /* unnecessary? */ -+ } -+ } -+ fi_read_unlock(file); -+ -+ err = au_do_iter(h_file, MAY_READ, kio, iov_iter); -+ /* todo: necessary? */ -+ /* file->f_ra = h_file->f_ra; */ -+ au_read_post(inode, h_file); -+ -+out: -+ si_read_unlock(sb); -+ return err; -+} -+ -+static ssize_t aufs_write_iter(struct kiocb *kio, struct iov_iter *iov_iter) -+{ -+ ssize_t err; -+ struct au_write_pre wpre; -+ struct inode *inode; -+ struct file *file, *h_file; -+ -+ file = kio->ki_filp; -+ inode = file_inode(file); -+ au_mtx_and_read_lock(inode); -+ -+ wpre.lsc = 0; -+ h_file = au_write_pre(file, /*do_ready*/1, &wpre); -+ err = PTR_ERR(h_file); -+ if (IS_ERR(h_file)) -+ goto out; -+ -+ err = au_do_iter(h_file, MAY_WRITE, kio, iov_iter); -+ au_write_post(inode, h_file, &wpre, err); -+ -+out: -+ si_read_unlock(inode->i_sb); -+ inode_unlock(inode); -+ return err; -+} -+ -+/* -+ * We may be able to remove aufs_splice_{read,write}() since almost all FSes -+ * don't have their own .splice_{read,write} implimentations, and they use -+ * generic_file_splice_read() and iter_file_splice_write() who can act like the -+ * simple converters to f_op->iter_read() and ->iter_write(). -+ * But we keep our own implementations because some non-mainlined FSes may have -+ * their own .splice_{read,write} implimentations and aufs doesn't want to take -+ * away an opportunity to co-work with aufs from them. -+ */ -+static ssize_t aufs_splice_read(struct file *file, loff_t *ppos, -+ struct pipe_inode_info *pipe, size_t len, -+ unsigned int flags) -+{ -+ ssize_t err; -+ struct file *h_file; -+ struct inode *inode; -+ struct super_block *sb; -+ -+ inode = file_inode(file); -+ sb = inode->i_sb; -+ si_read_lock(sb, AuLock_FLUSH | AuLock_NOPLMW); -+ -+ h_file = au_read_pre(file, /*keep_fi*/0, /*lsc*/0); -+ err = PTR_ERR(h_file); -+ if (IS_ERR(h_file)) -+ goto out; -+ -+ err = vfsub_splice_to(h_file, ppos, pipe, len, flags); -+ /* todo: necessary? */ -+ /* file->f_ra = h_file->f_ra; */ -+ au_read_post(inode, h_file); -+ -+out: -+ si_read_unlock(sb); -+ return err; -+} -+ -+static ssize_t -+aufs_splice_write(struct pipe_inode_info *pipe, struct file *file, loff_t *ppos, -+ size_t len, unsigned int flags) -+{ -+ ssize_t err; -+ struct au_write_pre wpre; -+ struct inode *inode; -+ struct file *h_file; -+ -+ inode = file_inode(file); -+ au_mtx_and_read_lock(inode); -+ -+ wpre.lsc = 0; -+ h_file = au_write_pre(file, /*do_ready*/1, &wpre); -+ err = PTR_ERR(h_file); -+ if (IS_ERR(h_file)) -+ goto out; -+ -+ err = vfsub_splice_from(pipe, h_file, ppos, len, flags); -+ au_write_post(inode, h_file, &wpre, err); -+ -+out: -+ si_read_unlock(inode->i_sb); -+ inode_unlock(inode); -+ return err; -+} -+ -+static long aufs_fallocate(struct file *file, int mode, loff_t offset, -+ loff_t len) -+{ -+ long err; -+ struct au_write_pre wpre; -+ struct inode *inode; -+ struct file *h_file; -+ -+ inode = file_inode(file); -+ au_mtx_and_read_lock(inode); -+ -+ wpre.lsc = 0; -+ h_file = au_write_pre(file, /*do_ready*/1, &wpre); -+ err = PTR_ERR(h_file); -+ if (IS_ERR(h_file)) -+ goto out; -+ -+ lockdep_off(); -+ err = vfs_fallocate(h_file, mode, offset, len); -+ lockdep_on(); -+ au_write_post(inode, h_file, &wpre, /*written*/1); -+ -+out: -+ si_read_unlock(inode->i_sb); -+ inode_unlock(inode); -+ return err; -+} -+ -+static ssize_t aufs_copy_file_range(struct file *src, loff_t src_pos, -+ struct file *dst, loff_t dst_pos, -+ size_t len, unsigned int flags) -+{ -+ ssize_t err; -+ struct au_write_pre wpre; -+ enum { SRC, DST }; -+ struct { -+ struct inode *inode; -+ struct file *h_file; -+ struct super_block *h_sb; -+ } a[2]; -+#define a_src a[SRC] -+#define a_dst a[DST] -+ -+ err = -EINVAL; -+ a_src.inode = file_inode(src); -+ if (unlikely(!S_ISREG(a_src.inode->i_mode))) -+ goto out; -+ a_dst.inode = file_inode(dst); -+ if (unlikely(!S_ISREG(a_dst.inode->i_mode))) -+ goto out; -+ -+ au_mtx_and_read_lock(a_dst.inode); -+ /* -+ * in order to match the order in di_write_lock2_{child,parent}(), -+ * use f_path.dentry for this comparison. -+ */ -+ if (src->f_path.dentry < dst->f_path.dentry) { -+ a_src.h_file = au_read_pre(src, /*keep_fi*/1, AuLsc_FI_1); -+ err = PTR_ERR(a_src.h_file); -+ if (IS_ERR(a_src.h_file)) -+ goto out_si; -+ -+ wpre.lsc = AuLsc_FI_2; -+ a_dst.h_file = au_write_pre(dst, /*do_ready*/1, &wpre); -+ err = PTR_ERR(a_dst.h_file); -+ if (IS_ERR(a_dst.h_file)) { -+ au_read_post(a_src.inode, a_src.h_file); -+ goto out_si; -+ } -+ } else { -+ wpre.lsc = AuLsc_FI_1; -+ a_dst.h_file = au_write_pre(dst, /*do_ready*/1, &wpre); -+ err = PTR_ERR(a_dst.h_file); -+ if (IS_ERR(a_dst.h_file)) -+ goto out_si; -+ -+ a_src.h_file = au_read_pre(src, /*keep_fi*/1, AuLsc_FI_2); -+ err = PTR_ERR(a_src.h_file); -+ if (IS_ERR(a_src.h_file)) { -+ au_write_post(a_dst.inode, a_dst.h_file, &wpre, -+ /*written*/0); -+ goto out_si; -+ } -+ } -+ -+ err = -EXDEV; -+ a_src.h_sb = file_inode(a_src.h_file)->i_sb; -+ a_dst.h_sb = file_inode(a_dst.h_file)->i_sb; -+ if (unlikely(a_src.h_sb != a_dst.h_sb)) { -+ AuDbgFile(src); -+ AuDbgFile(dst); -+ goto out_file; -+ } -+ -+ err = vfsub_copy_file_range(a_src.h_file, src_pos, a_dst.h_file, -+ dst_pos, len, flags); -+ -+out_file: -+ au_write_post(a_dst.inode, a_dst.h_file, &wpre, err); -+ fi_read_unlock(src); -+ au_read_post(a_src.inode, a_src.h_file); -+out_si: -+ si_read_unlock(a_dst.inode->i_sb); -+ inode_unlock(a_dst.inode); -+out: -+ return err; -+#undef a_src -+#undef a_dst -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * The locking order around current->mmap_sem. -+ * - in most and regular cases -+ * file I/O syscall -- aufs_read() or something -+ * -- si_rwsem for read -- mmap_sem -+ * (Note that [fdi]i_rwsem are released before mmap_sem). -+ * - in mmap case -+ * mmap(2) -- mmap_sem -- aufs_mmap() -- si_rwsem for read -- [fdi]i_rwsem -+ * This AB-BA order is definitely bad, but is not a problem since "si_rwsem for -+ * read" allows multiple processes to acquire it and [fdi]i_rwsem are not held -+ * in file I/O. Aufs needs to stop lockdep in aufs_mmap() though. -+ * It means that when aufs acquires si_rwsem for write, the process should never -+ * acquire mmap_sem. -+ * -+ * Actually aufs_iterate() holds [fdi]i_rwsem before mmap_sem, but this is not a -+ * problem either since any directory is not able to be mmap-ed. -+ * The similar scenario is applied to aufs_readlink() too. -+ */ -+ -+#if 0 /* stop calling security_file_mmap() */ -+/* cf. linux/include/linux/mman.h: calc_vm_prot_bits() */ -+#define AuConv_VM_PROT(f, b) _calc_vm_trans(f, VM_##b, PROT_##b) -+ -+static unsigned long au_arch_prot_conv(unsigned long flags) -+{ -+ /* currently ppc64 only */ -+#ifdef CONFIG_PPC64 -+ /* cf. linux/arch/powerpc/include/asm/mman.h */ -+ AuDebugOn(arch_calc_vm_prot_bits(-1) != VM_SAO); -+ return AuConv_VM_PROT(flags, SAO); -+#else -+ AuDebugOn(arch_calc_vm_prot_bits(-1)); -+ return 0; -+#endif -+} -+ -+static unsigned long au_prot_conv(unsigned long flags) -+{ -+ return AuConv_VM_PROT(flags, READ) -+ | AuConv_VM_PROT(flags, WRITE) -+ | AuConv_VM_PROT(flags, EXEC) -+ | au_arch_prot_conv(flags); -+} -+ -+/* cf. linux/include/linux/mman.h: calc_vm_flag_bits() */ -+#define AuConv_VM_MAP(f, b) _calc_vm_trans(f, VM_##b, MAP_##b) -+ -+static unsigned long au_flag_conv(unsigned long flags) -+{ -+ return AuConv_VM_MAP(flags, GROWSDOWN) -+ | AuConv_VM_MAP(flags, DENYWRITE) -+ | AuConv_VM_MAP(flags, LOCKED); -+} -+#endif -+ -+static int aufs_mmap(struct file *file, struct vm_area_struct *vma) -+{ -+ int err; -+ const unsigned char wlock -+ = (file->f_mode & FMODE_WRITE) && (vma->vm_flags & VM_SHARED); -+ struct super_block *sb; -+ struct file *h_file; -+ struct inode *inode; -+ -+ AuDbgVmRegion(file, vma); -+ -+ inode = file_inode(file); -+ sb = inode->i_sb; -+ lockdep_off(); -+ si_read_lock(sb, AuLock_NOPLMW); -+ -+ h_file = au_write_pre(file, wlock, /*wpre*/NULL); -+ lockdep_on(); -+ err = PTR_ERR(h_file); -+ if (IS_ERR(h_file)) -+ goto out; -+ -+ err = 0; -+ au_set_mmapped(file); -+ au_vm_file_reset(vma, h_file); -+ /* -+ * we cannot call security_mmap_file() here since it may acquire -+ * mmap_sem or i_mutex. -+ * -+ * err = security_mmap_file(h_file, au_prot_conv(vma->vm_flags), -+ * au_flag_conv(vma->vm_flags)); -+ */ -+ if (!err) -+ err = call_mmap(h_file, vma); -+ if (!err) { -+ au_vm_prfile_set(vma, file); -+ fsstack_copy_attr_atime(inode, file_inode(h_file)); -+ goto out_fput; /* success */ -+ } -+ au_unset_mmapped(file); -+ au_vm_file_reset(vma, file); -+ -+out_fput: -+ lockdep_off(); -+ ii_write_unlock(inode); -+ lockdep_on(); -+ fput(h_file); -+out: -+ lockdep_off(); -+ si_read_unlock(sb); -+ lockdep_on(); -+ AuTraceErr(err); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int aufs_fsync_nondir(struct file *file, loff_t start, loff_t end, -+ int datasync) -+{ -+ int err; -+ struct au_write_pre wpre; -+ struct inode *inode; -+ struct file *h_file; -+ -+ err = 0; /* -EBADF; */ /* posix? */ -+ if (unlikely(!(file->f_mode & FMODE_WRITE))) -+ goto out; -+ -+ inode = file_inode(file); -+ au_mtx_and_read_lock(inode); -+ -+ wpre.lsc = 0; -+ h_file = au_write_pre(file, /*do_ready*/1, &wpre); -+ err = PTR_ERR(h_file); -+ if (IS_ERR(h_file)) -+ goto out_unlock; -+ -+ err = vfsub_fsync(h_file, &h_file->f_path, datasync); -+ au_write_post(inode, h_file, &wpre, /*written*/0); -+ -+out_unlock: -+ si_read_unlock(inode->i_sb); -+ inode_unlock(inode); -+out: -+ return err; -+} -+ -+static int aufs_fasync(int fd, struct file *file, int flag) -+{ -+ int err; -+ struct file *h_file; -+ struct super_block *sb; -+ -+ sb = file->f_path.dentry->d_sb; -+ si_read_lock(sb, AuLock_FLUSH | AuLock_NOPLMW); -+ -+ h_file = au_read_pre(file, /*keep_fi*/0, /*lsc*/0); -+ err = PTR_ERR(h_file); -+ if (IS_ERR(h_file)) -+ goto out; -+ -+ if (h_file->f_op->fasync) -+ err = h_file->f_op->fasync(fd, h_file, flag); -+ fput(h_file); /* instead of au_read_post() */ -+ -+out: -+ si_read_unlock(sb); -+ return err; -+} -+ -+static int aufs_setfl(struct file *file, unsigned long arg) -+{ -+ int err; -+ struct file *h_file; -+ struct super_block *sb; -+ -+ sb = file->f_path.dentry->d_sb; -+ si_read_lock(sb, AuLock_FLUSH | AuLock_NOPLMW); -+ -+ h_file = au_read_pre(file, /*keep_fi*/0, /*lsc*/0); -+ err = PTR_ERR(h_file); -+ if (IS_ERR(h_file)) -+ goto out; -+ -+ /* stop calling h_file->fasync */ -+ arg |= vfsub_file_flags(file) & FASYNC; -+ err = setfl(/*unused fd*/-1, h_file, arg); -+ fput(h_file); /* instead of au_read_post() */ -+ -+out: -+ si_read_unlock(sb); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* no one supports this operation, currently */ -+#if 0 /* reserved for future use */ -+static ssize_t aufs_sendpage(struct file *file, struct page *page, int offset, -+ size_t len, loff_t *pos, int more) -+{ -+} -+#endif -+ -+/* ---------------------------------------------------------------------- */ -+ -+const struct file_operations aufs_file_fop = { -+ .owner = THIS_MODULE, -+ -+ .llseek = default_llseek, -+ -+ .read_iter = aufs_read_iter, -+ .write_iter = aufs_write_iter, -+ -+#ifdef CONFIG_AUFS_POLL -+ .poll = aufs_poll, -+#endif -+ .unlocked_ioctl = aufs_ioctl_nondir, -+#ifdef CONFIG_COMPAT -+ .compat_ioctl = aufs_compat_ioctl_nondir, -+#endif -+ .mmap = aufs_mmap, -+ .open = aufs_open_nondir, -+ .flush = aufs_flush_nondir, -+ .release = aufs_release_nondir, -+ .fsync = aufs_fsync_nondir, -+ .fasync = aufs_fasync, -+ /* .sendpage = aufs_sendpage, */ -+ .setfl = aufs_setfl, -+ .splice_write = aufs_splice_write, -+ .splice_read = aufs_splice_read, -+#if 0 /* reserved for future use */ -+ .aio_splice_write = aufs_aio_splice_write, -+ .aio_splice_read = aufs_aio_splice_read, -+#endif -+ .fallocate = aufs_fallocate, -+ .copy_file_range = aufs_copy_file_range -+}; -diff -Naur null/fs/aufs/fsctx.c linux-5.15.36/fs/aufs/fsctx.c ---- /dev/null -+++ linux-5.15.36/fs/aufs/fsctx.c 2022-05-10 16:51:39.871744219 +0300 -@@ -0,0 +1,1242 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2022 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program. If not, see . -+ */ -+ -+/* -+ * fs context, aka new mount api -+ */ -+ -+#include -+#include "aufs.h" -+ -+struct au_fsctx_opts { -+ aufs_bindex_t bindex; -+ unsigned char skipped; -+ struct au_opt *opt, *opt_tail; -+ struct super_block *sb; -+ struct au_sbinfo *sbinfo; -+ struct au_opts opts; -+}; -+ -+/* stop extra interpretation of errno in mount(8), and strange error messages */ -+static int cvt_err(int err) -+{ -+ AuTraceErr(err); -+ -+ switch (err) { -+ case -ENOENT: -+ case -ENOTDIR: -+ case -EEXIST: -+ case -EIO: -+ err = -EINVAL; -+ } -+ return err; -+} -+ -+static int au_fsctx_reconfigure(struct fs_context *fc) -+{ -+ int err, do_dx; -+ unsigned int mntflags; -+ struct dentry *root; -+ struct super_block *sb; -+ struct inode *inode; -+ struct au_fsctx_opts *a = fc->fs_private; -+ -+ AuDbg("fc %p\n", fc); -+ -+ root = fc->root; -+ sb = root->d_sb; -+ err = si_write_lock(sb, AuLock_FLUSH | AuLock_NOPLM); -+ if (!err) { -+ di_write_lock_child(root); -+ err = au_opts_verify(sb, fc->sb_flags, /*pending*/0); -+ aufs_write_unlock(root); -+ } -+ -+ inode = d_inode(root); -+ inode_lock(inode); -+ err = si_write_lock(sb, AuLock_FLUSH | AuLock_NOPLM); -+ if (unlikely(err)) -+ goto out; -+ di_write_lock_child(root); -+ -+ /* au_opts_remount() may return an error */ -+ err = au_opts_remount(sb, &a->opts); -+ -+ if (au_ftest_opts(a->opts.flags, REFRESH)) -+ au_remount_refresh(sb, au_ftest_opts(a->opts.flags, -+ REFRESH_IDOP)); -+ -+ if (au_ftest_opts(a->opts.flags, REFRESH_DYAOP)) { -+ mntflags = au_mntflags(sb); -+ do_dx = !!au_opt_test(mntflags, DIO); -+ au_dy_arefresh(do_dx); -+ } -+ -+ au_fhsm_wrote_all(sb, /*force*/1); /* ?? */ -+ aufs_write_unlock(root); -+ -+out: -+ inode_unlock(inode); -+ err = cvt_err(err); -+ AuTraceErr(err); -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int au_fsctx_fill_super(struct super_block *sb, struct fs_context *fc) -+{ -+ int err; -+ struct au_fsctx_opts *a = fc->fs_private; -+ struct au_sbinfo *sbinfo = a->sbinfo; -+ struct dentry *root; -+ struct inode *inode; -+ -+ sbinfo->si_sb = sb; -+ sb->s_fs_info = sbinfo; -+ kobject_get(&sbinfo->si_kobj); -+ -+ __si_write_lock(sb); -+ si_pid_set(sb); -+ au_sbilist_add(sb); -+ -+ /* all timestamps always follow the ones on the branch */ -+ sb->s_flags |= SB_NOATIME | SB_NODIRATIME; -+ sb->s_flags |= SB_I_VERSION; /* do we really need this? */ -+ sb->s_op = &aufs_sop; -+ sb->s_d_op = &aufs_dop; -+ sb->s_magic = AUFS_SUPER_MAGIC; -+ sb->s_maxbytes = 0; -+ sb->s_stack_depth = 1; -+ au_export_init(sb); -+ au_xattr_init(sb); -+ -+ err = au_alloc_root(sb); -+ if (unlikely(err)) { -+ si_write_unlock(sb); -+ goto out; -+ } -+ root = sb->s_root; -+ inode = d_inode(root); -+ ii_write_lock_parent(inode); -+ aufs_write_unlock(root); -+ -+ /* lock vfs_inode first, then aufs. */ -+ inode_lock(inode); -+ aufs_write_lock(root); -+ err = au_opts_mount(sb, &a->opts); -+ AuTraceErr(err); -+ if (!err && au_ftest_si(sbinfo, NO_DREVAL)) { -+ sb->s_d_op = &aufs_dop_noreval; -+ /* infofc(fc, "%ps", sb->s_d_op); */ -+ pr_info("%ps\n", sb->s_d_op); -+ au_refresh_dop(root, /*force_reval*/0); -+ sbinfo->si_iop_array = aufs_iop_nogetattr; -+ au_refresh_iop(inode, /*force_getattr*/0); -+ } -+ aufs_write_unlock(root); -+ inode_unlock(inode); -+ if (!err) -+ goto out; /* success */ -+ -+ dput(root); -+ sb->s_root = NULL; -+ -+out: -+ if (unlikely(err)) -+ kobject_put(&sbinfo->si_kobj); -+ AuTraceErr(err); -+ err = cvt_err(err); -+ AuTraceErr(err); -+ return err; -+} -+ -+static int au_fsctx_get_tree(struct fs_context *fc) -+{ -+ int err; -+ -+ AuDbg("fc %p\n", fc); -+ err = get_tree_nodev(fc, au_fsctx_fill_super); -+ -+ AuTraceErr(err); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static void au_fsctx_dump(struct au_opts *opts) -+{ -+#ifdef CONFIG_AUFS_DEBUG -+ /* reduce stack space */ -+ union { -+ struct au_opt_add *add; -+ struct au_opt_del *del; -+ struct au_opt_mod *mod; -+ struct au_opt_xino *xino; -+ struct au_opt_xino_itrunc *xino_itrunc; -+ struct au_opt_wbr_create *create; -+ } u; -+ struct au_opt *opt; -+ -+ opt = opts->opt; -+ while (opt->type != Opt_tail) { -+ switch (opt->type) { -+ case Opt_add: -+ u.add = &opt->add; -+ AuDbg("add {b%d, %s, 0x%x, %p}\n", -+ u.add->bindex, u.add->pathname, u.add->perm, -+ u.add->path.dentry); -+ break; -+ case Opt_del: -+ fallthrough; -+ case Opt_idel: -+ u.del = &opt->del; -+ AuDbg("del {%s, %p}\n", -+ u.del->pathname, u.del->h_path.dentry); -+ break; -+ case Opt_mod: -+ fallthrough; -+ case Opt_imod: -+ u.mod = &opt->mod; -+ AuDbg("mod {%s, 0x%x, %p}\n", -+ u.mod->path, u.mod->perm, u.mod->h_root); -+ break; -+ case Opt_append: -+ u.add = &opt->add; -+ AuDbg("append {b%d, %s, 0x%x, %p}\n", -+ u.add->bindex, u.add->pathname, u.add->perm, -+ u.add->path.dentry); -+ break; -+ case Opt_prepend: -+ u.add = &opt->add; -+ AuDbg("prepend {b%d, %s, 0x%x, %p}\n", -+ u.add->bindex, u.add->pathname, u.add->perm, -+ u.add->path.dentry); -+ break; -+ -+ case Opt_dirwh: -+ AuDbg("dirwh %d\n", opt->dirwh); -+ break; -+ case Opt_rdcache: -+ AuDbg("rdcache %d\n", opt->rdcache); -+ break; -+ case Opt_rdblk: -+ AuDbg("rdblk %d\n", opt->rdblk); -+ break; -+ case Opt_rdhash: -+ AuDbg("rdhash %u\n", opt->rdhash); -+ break; -+ -+ case Opt_xino: -+ u.xino = &opt->xino; -+ AuDbg("xino {%s %pD}\n", u.xino->path, u.xino->file); -+ break; -+ -+#define au_fsctx_TF(name) \ -+ case Opt_##name: \ -+ if (opt->tf) \ -+ AuLabel(name); \ -+ else \ -+ AuLabel(no##name); \ -+ break; -+ -+ /* simple true/false flag */ -+ au_fsctx_TF(trunc_xino); -+ au_fsctx_TF(trunc_xib); -+ au_fsctx_TF(dirperm1); -+ au_fsctx_TF(plink); -+ au_fsctx_TF(shwh); -+ au_fsctx_TF(dio); -+ au_fsctx_TF(warn_perm); -+ au_fsctx_TF(verbose); -+ au_fsctx_TF(sum); -+ au_fsctx_TF(dirren); -+ au_fsctx_TF(acl); -+#undef au_fsctx_TF -+ -+ case Opt_trunc_xino_path: -+ fallthrough; -+ case Opt_itrunc_xino: -+ u.xino_itrunc = &opt->xino_itrunc; -+ AuDbg("trunc_xino %d\n", u.xino_itrunc->bindex); -+ break; -+ case Opt_noxino: -+ AuLabel(noxino); -+ break; -+ -+ case Opt_list_plink: -+ AuLabel(list_plink); -+ break; -+ case Opt_udba: -+ AuDbg("udba %d, %s\n", -+ opt->udba, au_optstr_udba(opt->udba)); -+ break; -+ case Opt_diropq_a: -+ AuLabel(diropq_a); -+ break; -+ case Opt_diropq_w: -+ AuLabel(diropq_w); -+ break; -+ case Opt_wsum: -+ AuLabel(wsum); -+ break; -+ case Opt_wbr_create: -+ u.create = &opt->wbr_create; -+ AuDbg("create %d, %s\n", u.create->wbr_create, -+ au_optstr_wbr_create(u.create->wbr_create)); -+ switch (u.create->wbr_create) { -+ case AuWbrCreate_MFSV: -+ fallthrough; -+ case AuWbrCreate_PMFSV: -+ AuDbg("%d sec\n", u.create->mfs_second); -+ break; -+ case AuWbrCreate_MFSRR: -+ fallthrough; -+ case AuWbrCreate_TDMFS: -+ AuDbg("%llu watermark\n", -+ u.create->mfsrr_watermark); -+ break; -+ case AuWbrCreate_MFSRRV: -+ fallthrough; -+ case AuWbrCreate_TDMFSV: -+ fallthrough; -+ case AuWbrCreate_PMFSRRV: -+ AuDbg("%llu watermark, %d sec\n", -+ u.create->mfsrr_watermark, -+ u.create->mfs_second); -+ break; -+ } -+ break; -+ case Opt_wbr_copyup: -+ AuDbg("copyup %d, %s\n", opt->wbr_copyup, -+ au_optstr_wbr_copyup(opt->wbr_copyup)); -+ break; -+ case Opt_fhsm_sec: -+ AuDbg("fhsm_sec %u\n", opt->fhsm_second); -+ break; -+ -+ default: -+ AuDbg("type %d\n", opt->type); -+ BUG(); -+ } -+ opt++; -+ } -+#endif -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * For conditionally compiled mount options. -+ * Instead of fsparam_flag_no(), use this macro to distinguish ignore_silent. -+ */ -+#define au_ignore_flag(name, action) \ -+ fsparam_flag(name, action), \ -+ fsparam_flag("no" name, Opt_ignore_silent) -+ -+const struct fs_parameter_spec aufs_fsctx_paramspec[] = { -+ fsparam_string("br", Opt_br), -+ -+ /* "add=%d:%s" or "ins=%d:%s" */ -+ fsparam_string("add", Opt_add), -+ fsparam_string("ins", Opt_add), -+ fsparam_path("append", Opt_append), -+ fsparam_path("prepend", Opt_prepend), -+ -+ fsparam_path("del", Opt_del), -+ /* fsparam_s32("idel", Opt_idel), */ -+ fsparam_path("mod", Opt_mod), -+ /* fsparam_string("imod", Opt_imod), */ -+ -+ fsparam_s32("dirwh", Opt_dirwh), -+ -+ fsparam_path("xino", Opt_xino), -+ fsparam_flag("noxino", Opt_noxino), -+ fsparam_flag_no("trunc_xino", Opt_trunc_xino), -+ /* "trunc_xino_v=%d:%d" */ -+ /* fsparam_string("trunc_xino_v", Opt_trunc_xino_v), */ -+ fsparam_path("trunc_xino", Opt_trunc_xino_path), -+ fsparam_s32("itrunc_xino", Opt_itrunc_xino), -+ /* fsparam_path("zxino", Opt_zxino), */ -+ fsparam_flag_no("trunc_xib", Opt_trunc_xib), -+ -+#ifdef CONFIG_PROC_FS -+ fsparam_flag_no("plink", Opt_plink), -+#else -+ au_ignore_flag("plink", Opt_ignore), -+#endif -+ -+#ifdef CONFIG_AUFS_DEBUG -+ fsparam_flag("list_plink", Opt_list_plink), -+#endif -+ -+ fsparam_string("udba", Opt_udba), -+ -+ fsparam_flag_no("dio", Opt_dio), -+ -+#ifdef CONFIG_AUFS_DIRREN -+ fsparam_flag_no("dirren", Opt_dirren), -+#else -+ au_ignore_flag("dirren", Opt_ignore), -+#endif -+ -+#ifdef CONFIG_AUFS_FHSM -+ fsparam_s32("fhsm_sec", Opt_fhsm_sec), -+#else -+ fsparam_s32("fhsm_sec", Opt_ignore), -+#endif -+ -+ /* always | a | whiteouted | w */ -+ fsparam_string("diropq", Opt_diropq), -+ -+ fsparam_flag_no("warn_perm", Opt_warn_perm), -+ -+#ifdef CONFIG_AUFS_SHWH -+ fsparam_flag_no("shwh", Opt_shwh), -+#else -+ au_ignore_flag("shwh", Opt_err), -+#endif -+ -+ fsparam_flag_no("dirperm1", Opt_dirperm1), -+ -+ fsparam_flag_no("verbose", Opt_verbose), -+ fsparam_flag("v", Opt_verbose), -+ fsparam_flag("quiet", Opt_noverbose), -+ fsparam_flag("q", Opt_noverbose), -+ /* user-space may handle this */ -+ fsparam_flag("silent", Opt_noverbose), -+ -+ fsparam_flag_no("sum", Opt_sum), -+ fsparam_flag("wsum", Opt_wsum), -+ -+ fsparam_s32("rdcache", Opt_rdcache), -+ /* "def" or s32 */ -+ fsparam_string("rdblk", Opt_rdblk), -+ /* "def" or s32 */ -+ fsparam_string("rdhash", Opt_rdhash), -+ -+ fsparam_string("create", Opt_wbr_create), -+ fsparam_string("create_policy", Opt_wbr_create), -+ fsparam_string("cpup", Opt_wbr_copyup), -+ fsparam_string("copyup", Opt_wbr_copyup), -+ fsparam_string("copyup_policy", Opt_wbr_copyup), -+ -+ /* generic VFS flag */ -+#ifdef CONFIG_FS_POSIX_ACL -+ fsparam_flag_no("acl", Opt_acl), -+#else -+ au_ignore_flag("acl"), -+#endif -+ -+ /* internal use for the scripts */ -+ fsparam_string("si", Opt_ignore_silent), -+ -+ /* obsoleted, keep them temporary */ -+ fsparam_flag("nodlgt", Opt_ignore_silent), -+ fsparam_flag("clean_plink", Opt_ignore), -+ fsparam_string("dirs", Opt_br), -+ fsparam_u32("debug", Opt_ignore), -+ /* "whiteout" or "all" */ -+ fsparam_string("delete", Opt_ignore), -+ fsparam_string("imap", Opt_ignore), -+ -+ /* temporary workaround, due to old mount(8)? */ -+ fsparam_flag("relatime", Opt_ignore_silent), -+ -+ {} -+}; -+ -+static int au_fsctx_parse_do_add(struct fs_context *fc, struct au_opt *opt, -+ char *brspec, size_t speclen, -+ aufs_bindex_t bindex) -+{ -+ int err; -+ char *p; -+ -+ AuDbg("brspec %s\n", brspec); -+ -+ err = -ENOMEM; -+ if (!speclen) -+ speclen = strlen(brspec); -+ /* will be freed by au_fsctx_free() */ -+ p = kmemdup_nul(brspec, speclen, GFP_NOFS); -+ if (unlikely(!p)) { -+ errorfc(fc, "failed in %s", brspec); -+ goto out; -+ } -+ err = au_opt_add(opt, p, fc->sb_flags, bindex); -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+static int au_fsctx_parse_br(struct fs_context *fc, char *brspec) -+{ -+ int err; -+ char *p; -+ struct au_fsctx_opts *a = fc->fs_private; -+ struct au_opt *opt = a->opt; -+ aufs_bindex_t bindex = a->bindex; -+ -+ AuDbg("brspec %s\n", brspec); -+ -+ err = -EINVAL; -+ while ((p = strsep(&brspec, ":")) && *p) { -+ err = au_fsctx_parse_do_add(fc, opt, p, /*len*/0, bindex); -+ AuTraceErr(err); -+ if (unlikely(err)) -+ break; -+ bindex++; -+ opt++; -+ if (unlikely(opt > a->opt_tail)) { -+ err = -E2BIG; -+ bindex--; -+ opt--; -+ break; -+ } -+ opt->type = Opt_tail; -+ a->skipped = 1; -+ } -+ a->bindex = bindex; -+ a->opt = opt; -+ -+ AuTraceErr(err); -+ return err; -+} -+ -+static int au_fsctx_parse_add(struct fs_context *fc, char *addspec) -+{ -+ int err, n; -+ char *p; -+ struct au_fsctx_opts *a = fc->fs_private; -+ struct au_opt *opt = a->opt; -+ -+ err = -EINVAL; -+ p = strchr(addspec, ':'); -+ if (unlikely(!p)) { -+ errorfc(fc, "bad arg in %s", addspec); -+ goto out; -+ } -+ *p++ = '\0'; -+ err = kstrtoint(addspec, 0, &n); -+ if (unlikely(err)) { -+ errorfc(fc, "bad integer in %s", addspec); -+ goto out; -+ } -+ AuDbg("n %d\n", n); -+ err = au_fsctx_parse_do_add(fc, opt, p, /*len*/0, n); -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+static int au_fsctx_parse_del(struct fs_context *fc, struct au_opt_del *del, -+ struct fs_parameter *param) -+{ -+ int err; -+ -+ err = -ENOMEM; -+ /* will be freed by au_fsctx_free() */ -+ del->pathname = kmemdup_nul(param->string, param->size, GFP_NOFS); -+ if (unlikely(!del->pathname)) -+ goto out; -+ AuDbg("del %s\n", del->pathname); -+ err = vfsub_kern_path(del->pathname, AuOpt_LkupDirFlags, &del->h_path); -+ if (unlikely(err)) -+ errorfc(fc, "lookup failed %s (%d)", del->pathname, err); -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+#if 0 /* reserved for future use */ -+static int au_fsctx_parse_idel(struct fs_context *fc, struct au_opt_del *del, -+ aufs_bindex_t bindex) -+{ -+ int err; -+ struct super_block *sb; -+ struct dentry *root; -+ struct au_fsctx_opts *a = fc->fs_private; -+ -+ sb = a->sb; -+ AuDebugOn(!sb); -+ -+ err = -EINVAL; -+ root = sb->s_root; -+ aufs_read_lock(root, AuLock_FLUSH); -+ if (bindex < 0 || au_sbbot(sb) < bindex) { -+ errorfc(fc, "out of bounds, %d", bindex); -+ goto out; -+ } -+ -+ err = 0; -+ del->h_path.dentry = dget(au_h_dptr(root, bindex)); -+ del->h_path.mnt = mntget(au_sbr_mnt(sb, bindex)); -+ -+out: -+ aufs_read_unlock(root, !AuLock_IR); -+ AuTraceErr(err); -+ return err; -+} -+#endif -+ -+static int au_fsctx_parse_mod(struct fs_context *fc, struct au_opt_mod *mod, -+ struct fs_parameter *param) -+{ -+ int err; -+ struct path path; -+ char *p; -+ -+ err = -ENOMEM; -+ /* will be freed by au_fsctx_free() */ -+ mod->path = kmemdup_nul(param->string, param->size, GFP_NOFS); -+ if (unlikely(!mod->path)) -+ goto out; -+ -+ err = -EINVAL; -+ p = strchr(mod->path, '='); -+ if (unlikely(!p)) { -+ errorfc(fc, "no permission %s", mod->path); -+ goto out; -+ } -+ -+ *p++ = 0; -+ err = vfsub_kern_path(mod->path, AuOpt_LkupDirFlags, &path); -+ if (unlikely(err)) { -+ errorfc(fc, "lookup failed %s (%d)", mod->path, err); -+ goto out; -+ } -+ -+ mod->perm = au_br_perm_val(p); -+ AuDbg("mod path %s, perm 0x%x, %s", mod->path, mod->perm, p); -+ mod->h_root = dget(path.dentry); -+ path_put(&path); -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+#if 0 /* reserved for future use */ -+static int au_fsctx_parse_imod(struct fs_context *fc, struct au_opt_mod *mod, -+ char *ibrspec) -+{ -+ int err, n; -+ char *p; -+ struct super_block *sb; -+ struct dentry *root; -+ struct au_fsctx_opts *a = fc->fs_private; -+ -+ sb = a->sb; -+ AuDebugOn(!sb); -+ -+ err = -EINVAL; -+ p = strchr(ibrspec, ':'); -+ if (unlikely(!p)) { -+ errorfc(fc, "no index, %s", ibrspec); -+ goto out; -+ } -+ *p++ = '\0'; -+ err = kstrtoint(ibrspec, 0, &n); -+ if (unlikely(err)) { -+ errorfc(fc, "bad integer in %s", ibrspec); -+ goto out; -+ } -+ AuDbg("n %d\n", n); -+ -+ root = sb->s_root; -+ aufs_read_lock(root, AuLock_FLUSH); -+ if (n < 0 || au_sbbot(sb) < n) { -+ errorfc(fc, "out of bounds, %d", bindex); -+ goto out_root; -+ } -+ -+ err = 0; -+ mod->perm = au_br_perm_val(p); -+ AuDbg("mod path %s, perm 0x%x, %s\n", -+ mod->path, mod->perm, p); -+ mod->h_root = dget(au_h_dptr(root, bindex)); -+ -+out_root: -+ aufs_read_unlock(root, !AuLock_IR); -+out: -+ AuTraceErr(err); -+ return err; -+} -+#endif -+ -+static int au_fsctx_parse_xino(struct fs_context *fc, -+ struct au_opt_xino *xino, -+ struct fs_parameter *param) -+{ -+ int err; -+ struct au_fsctx_opts *a = fc->fs_private; -+ -+ err = -ENOMEM; -+ /* will be freed by au_opts_free() */ -+ xino->path = kmemdup_nul(param->string, param->size, GFP_NOFS); -+ if (unlikely(!xino->path)) -+ goto out; -+ AuDbg("path %s\n", xino->path); -+ -+ xino->file = au_xino_create(a->sb, xino->path, /*silent*/0, -+ /*wbrtop*/0); -+ err = PTR_ERR(xino->file); -+ if (IS_ERR(xino->file)) { -+ xino->file = NULL; -+ goto out; -+ } -+ -+ err = 0; -+ if (unlikely(a->sb && xino->file->f_path.dentry->d_sb == a->sb)) { -+ err = -EINVAL; -+ errorfc(fc, "%s must be outside", xino->path); -+ } -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+static -+int au_fsctx_parse_xino_itrunc_path(struct fs_context *fc, -+ struct au_opt_xino_itrunc *xino_itrunc, -+ char *pathname) -+{ -+ int err; -+ aufs_bindex_t bbot, bindex; -+ struct path path; -+ struct dentry *root; -+ struct au_fsctx_opts *a = fc->fs_private; -+ -+ AuDebugOn(!a->sb); -+ -+ err = vfsub_kern_path(pathname, AuOpt_LkupDirFlags, &path); -+ if (unlikely(err)) { -+ errorfc(fc, "lookup failed %s (%d)", pathname, err); -+ goto out; -+ } -+ -+ xino_itrunc->bindex = -1; -+ root = a->sb->s_root; -+ aufs_read_lock(root, AuLock_FLUSH); -+ bbot = au_sbbot(a->sb); -+ for (bindex = 0; bindex <= bbot; bindex++) { -+ if (au_h_dptr(root, bindex) == path.dentry) { -+ xino_itrunc->bindex = bindex; -+ break; -+ } -+ } -+ aufs_read_unlock(root, !AuLock_IR); -+ path_put(&path); -+ -+ if (unlikely(xino_itrunc->bindex < 0)) { -+ err = -EINVAL; -+ errorfc(fc, "no such branch %s", pathname); -+ } -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+static int au_fsctx_parse_xino_itrunc(struct fs_context *fc, -+ struct au_opt_xino_itrunc *xino_itrunc, -+ unsigned int bindex) -+{ -+ int err; -+ aufs_bindex_t bbot; -+ struct super_block *sb; -+ struct au_fsctx_opts *a = fc->fs_private; -+ -+ sb = a->sb; -+ AuDebugOn(!sb); -+ -+ err = 0; -+ si_noflush_read_lock(sb); -+ bbot = au_sbbot(sb); -+ si_read_unlock(sb); -+ if (bindex <= bbot) -+ xino_itrunc->bindex = bindex; -+ else { -+ err = -EINVAL; -+ errorfc(fc, "out of bounds, %u", bindex); -+ } -+ -+ AuTraceErr(err); -+ return err; -+} -+ -+static int au_fsctx_parse_param(struct fs_context *fc, struct fs_parameter *param) -+{ -+ int err, token; -+ struct fs_parse_result result; -+ struct au_fsctx_opts *a = fc->fs_private; -+ struct au_opt *opt = a->opt; -+ -+ AuDbg("fc %p, param {key %s, string %s}\n", -+ fc, param->key, param->string); -+ err = fs_parse(fc, aufs_fsctx_paramspec, param, &result); -+ if (unlikely(err < 0)) -+ goto out; -+ token = err; -+ AuDbg("token %d, res{negated %d, uint64 %llu}\n", -+ token, result.negated, result.uint_64); -+ -+ err = -EINVAL; -+ a->skipped = 0; -+ switch (token) { -+ case Opt_br: -+ err = au_fsctx_parse_br(fc, param->string); -+ break; -+ case Opt_add: -+ err = au_fsctx_parse_add(fc, param->string); -+ break; -+ case Opt_append: -+ err = au_fsctx_parse_do_add(fc, opt, param->string, param->size, -+ /*dummy bindex*/1); -+ break; -+ case Opt_prepend: -+ err = au_fsctx_parse_do_add(fc, opt, param->string, param->size, -+ /*bindex*/0); -+ break; -+ -+ case Opt_del: -+ err = au_fsctx_parse_del(fc, &opt->del, param); -+ break; -+#if 0 /* reserved for future use */ -+ case Opt_idel: -+ if (!a->sb) { -+ err = 0; -+ a->skipped = 1; -+ break; -+ } -+ del->pathname = "(indexed)"; -+ err = au_opts_parse_idel(fc, &opt->del, result.uint_32); -+ break; -+#endif -+ -+ case Opt_mod: -+ err = au_fsctx_parse_mod(fc, &opt->mod, param); -+ break; -+#ifdef IMOD /* reserved for future use */ -+ case Opt_imod: -+ if (!a->sb) { -+ err = 0; -+ a->skipped = 1; -+ break; -+ } -+ u.mod->path = "(indexed)"; -+ err = au_opts_parse_imod(fc, &opt->mod, param->string); -+ break; -+#endif -+ -+ case Opt_xino: -+ err = au_fsctx_parse_xino(fc, &opt->xino, param); -+ break; -+ case Opt_trunc_xino_path: -+ if (!a->sb) { -+ errorfc(fc, "no such branch %s", param->string); -+ break; -+ } -+ err = au_fsctx_parse_xino_itrunc_path(fc, &opt->xino_itrunc, -+ param->string); -+ break; -+#if 0 -+ case Opt_trunc_xino_v: -+ if (!a->sb) { -+ err = 0; -+ a->skipped = 1; -+ break; -+ } -+ err = au_fsctx_parse_xino_itrunc_path(fc, &opt->xino_itrunc, -+ param->string); -+ break; -+#endif -+ case Opt_itrunc_xino: -+ if (!a->sb) { -+ errorfc(fc, "out of bounds %s", param->string); -+ break; -+ } -+ err = au_fsctx_parse_xino_itrunc(fc, &opt->xino_itrunc, -+ result.int_32); -+ break; -+ -+ case Opt_dirwh: -+ err = 0; -+ opt->dirwh = result.int_32; -+ break; -+ -+ case Opt_rdcache: -+ if (unlikely(result.int_32 > AUFS_RDCACHE_MAX)) { -+ errorfc(fc, "rdcache must be smaller than %d", -+ AUFS_RDCACHE_MAX); -+ break; -+ } -+ err = 0; -+ opt->rdcache = result.int_32; -+ break; -+ -+ case Opt_rdblk: -+ err = 0; -+ opt->rdblk = AUFS_RDBLK_DEF; -+ if (!strcmp(param->string, "def")) -+ break; -+ -+ err = kstrtoint(param->string, 0, &result.int_32); -+ if (unlikely(err)) { -+ errorfc(fc, "bad value in %s", param->key); -+ break; -+ } -+ err = -EINVAL; -+ if (unlikely(result.int_32 < 0 -+ || result.int_32 > KMALLOC_MAX_SIZE)) { -+ errorfc(fc, "bad value in %s", param->key); -+ break; -+ } -+ if (unlikely(result.int_32 && result.int_32 < NAME_MAX)) { -+ errorfc(fc, "rdblk must be larger than %d", NAME_MAX); -+ break; -+ } -+ err = 0; -+ opt->rdblk = result.int_32; -+ break; -+ -+ case Opt_rdhash: -+ err = 0; -+ opt->rdhash = AUFS_RDHASH_DEF; -+ if (!strcmp(param->string, "def")) -+ break; -+ -+ err = kstrtoint(param->string, 0, &result.int_32); -+ if (unlikely(err)) { -+ errorfc(fc, "bad value in %s", param->key); -+ break; -+ } -+ /* how about zero? */ -+ if (result.int_32 < 0 -+ || result.int_32 * sizeof(struct hlist_head) -+ > KMALLOC_MAX_SIZE) { -+ err = -EINVAL; -+ errorfc(fc, "bad integer in %s", param->key); -+ break; -+ } -+ opt->rdhash = result.int_32; -+ break; -+ -+ case Opt_diropq: -+ /* -+ * As other options, fs/aufs/opts.c can handle these strings by -+ * match_token(). But "diropq=" is deprecated now and will -+ * never have other value. So simple strcmp() is enough here. -+ */ -+ if (!strcmp(param->string, "a") || -+ !strcmp(param->string, "always")) { -+ err = 0; -+ opt->type = Opt_diropq_a; -+ } else if (!strcmp(param->string, "w") || -+ !strcmp(param->string, "whiteouted")) { -+ err = 0; -+ opt->type = Opt_diropq_w; -+ } else -+ errorfc(fc, "unknown value %s", param->string); -+ break; -+ -+ case Opt_udba: -+ opt->udba = au_udba_val(param->string); -+ if (opt->udba >= 0) -+ err = 0; -+ else -+ errorf(fc, "wrong value, %s", param->string); -+ break; -+ -+ case Opt_wbr_create: -+ opt->wbr_create.wbr_create -+ = au_wbr_create_val(param->string, &opt->wbr_create); -+ if (opt->wbr_create.wbr_create >= 0) -+ err = 0; -+ else -+ errorf(fc, "wrong value, %s", param->key); -+ break; -+ -+ case Opt_wbr_copyup: -+ opt->wbr_copyup = au_wbr_copyup_val(param->string); -+ if (opt->wbr_copyup >= 0) -+ err = 0; -+ else -+ errorfc(fc, "wrong value, %s", param->key); -+ break; -+ -+ case Opt_fhsm_sec: -+ if (unlikely(result.int_32 < 0)) { -+ errorfc(fc, "bad integer in %s\n", param->key); -+ break; -+ } -+ err = 0; -+ if (sysaufs_brs) -+ opt->fhsm_second = result.int_32; -+ else -+ warnfc(fc, "ignored %s %s", param->key, param->string); -+ break; -+ -+ /* simple true/false flag */ -+#define au_fsctx_TF(name) \ -+ case Opt_##name: \ -+ err = 0; \ -+ opt->tf = !result.negated; \ -+ break; -+ au_fsctx_TF(trunc_xino); -+ au_fsctx_TF(trunc_xib); -+ au_fsctx_TF(dirperm1); -+ au_fsctx_TF(plink); -+ au_fsctx_TF(shwh); -+ au_fsctx_TF(dio); -+ au_fsctx_TF(warn_perm); -+ au_fsctx_TF(verbose); -+ au_fsctx_TF(sum); -+ au_fsctx_TF(dirren); -+ au_fsctx_TF(acl); -+#undef au_fsctx_TF -+ -+ case Opt_noverbose: -+ err = 0; -+ opt->type = Opt_verbose; -+ opt->tf = false; -+ break; -+ -+ case Opt_noxino: -+ fallthrough; -+ case Opt_list_plink: -+ fallthrough; -+ case Opt_wsum: -+ err = 0; -+ break; -+ -+ case Opt_ignore: -+ warnfc(fc, "ignored %s", param->key); -+ fallthrough; -+ case Opt_ignore_silent: -+ a->skipped = 1; -+ err = 0; -+ break; -+ default: -+ a->skipped = 1; -+ err = -ENOPARAM; -+ break; -+ } -+ if (unlikely(err)) -+ goto out; -+ if (a->skipped) -+ goto out; -+ -+ switch (token) { -+ case Opt_br: -+ fallthrough; -+ case Opt_noverbose: -+ fallthrough; -+ case Opt_diropq: -+ break; -+ default: -+ opt->type = token; -+ break; -+ } -+ opt++; -+ if (unlikely(opt > a->opt_tail)) { -+ err = -E2BIG; -+ opt--; -+ } -+ opt->type = Opt_tail; -+ a->opt = opt; -+ -+out: -+ return err; -+} -+ -+/* -+ * these options accept both 'name=val' and 'name:val' form. -+ * some accept optional '=' in its value. -+ * eg. br:/br1=rw:/br2=ro and br=/br1=rw:/br2=ro -+ */ -+static inline unsigned int is_colonopt(char *str) -+{ -+#define do_test(name) \ -+ if (!strncmp(str, name ":", sizeof(name))) \ -+ return sizeof(name) - 1; -+ do_test("br"); -+ do_test("add"); -+ do_test("ins"); -+ do_test("append"); -+ do_test("prepend"); -+ do_test("del"); -+ /* do_test("idel"); */ -+ do_test("mod"); -+ /* do_test("imod"); */ -+#undef do_test -+ -+ return 0; -+} -+ -+static int au_fsctx_parse_monolithic(struct fs_context *fc, void *data) -+{ -+ int err; -+ unsigned int u; -+ char *str; -+ struct au_fsctx_opts *a = fc->fs_private; -+ -+ str = data; -+ AuDbg("str %s\n", str); -+ while (str) { -+ u = is_colonopt(str); -+ if (u) -+ str[u] = '='; -+ str = strchr(str, ','); -+ if (!str) -+ break; -+ str++; -+ } -+ str = data; -+ AuDbg("str %s\n", str); -+ -+ err = generic_parse_monolithic(fc, str); -+ AuTraceErr(err); -+ au_fsctx_dump(&a->opts); -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static void au_fsctx_opts_free(struct au_opts *opts) -+{ -+ struct au_opt *opt; -+ -+ opt = opts->opt; -+ while (opt->type != Opt_tail) { -+ switch (opt->type) { -+ case Opt_add: -+ fallthrough; -+ case Opt_append: -+ fallthrough; -+ case Opt_prepend: -+ kfree(opt->add.pathname); -+ path_put(&opt->add.path); -+ break; -+ case Opt_del: -+ kfree(opt->del.pathname); -+ fallthrough; -+ case Opt_idel: -+ path_put(&opt->del.h_path); -+ break; -+ case Opt_mod: -+ kfree(opt->mod.path); -+ fallthrough; -+ case Opt_imod: -+ dput(opt->mod.h_root); -+ break; -+ case Opt_xino: -+ kfree(opt->xino.path); -+ fput(opt->xino.file); -+ break; -+ } -+ opt++; -+ } -+} -+ -+static void au_fsctx_free(struct fs_context *fc) -+{ -+ struct au_fsctx_opts *a = fc->fs_private; -+ -+ /* fs_type=%p, root=%pD */ -+ AuDbg("fc %p{sb_flags 0x%x, sb_flags_mask 0x%x, purpose %u\n", -+ fc, fc->sb_flags, fc->sb_flags_mask, fc->purpose); -+ -+ kobject_put(&a->sbinfo->si_kobj); -+ au_fsctx_opts_free(&a->opts); -+ free_page((unsigned long)a->opts.opt); -+ au_kfree_rcu(a); -+} -+ -+static const struct fs_context_operations au_fsctx_ops = { -+ .free = au_fsctx_free, -+ .parse_param = au_fsctx_parse_param, -+ .parse_monolithic = au_fsctx_parse_monolithic, -+ .get_tree = au_fsctx_get_tree, -+ .reconfigure = au_fsctx_reconfigure -+ /* -+ * nfs4 requires ->dup()? No. -+ * I don't know what is this ->dup() for. -+ */ -+}; -+ -+int aufs_fsctx_init(struct fs_context *fc) -+{ -+ int err; -+ struct au_fsctx_opts *a; -+ -+ /* fs_type=%p, root=%pD */ -+ AuDbg("fc %p{sb_flags 0x%x, sb_flags_mask 0x%x, purpose %u\n", -+ fc, fc->sb_flags, fc->sb_flags_mask, fc->purpose); -+ -+ /* they will be freed by au_fsctx_free() */ -+ err = -ENOMEM; -+ a = kzalloc(sizeof(*a), GFP_NOFS); -+ if (unlikely(!a)) -+ goto out; -+ a->bindex = 0; -+ a->opts.opt = (void *)__get_free_page(GFP_NOFS); -+ if (unlikely(!a->opts.opt)) -+ goto out_a; -+ a->opt = a->opts.opt; -+ a->opt->type = Opt_tail; -+ a->opts.max_opt = PAGE_SIZE / sizeof(*a->opts.opt); -+ a->opt_tail = a->opt + a->opts.max_opt - 1; -+ a->opts.sb_flags = fc->sb_flags; -+ -+ a->sb = NULL; -+ if (fc->root) { -+ AuDebugOn(fc->purpose != FS_CONTEXT_FOR_RECONFIGURE); -+ a->opts.flags = AuOpts_REMOUNT; -+ a->sb = fc->root->d_sb; -+ a->sbinfo = au_sbi(a->sb); -+ kobject_get(&a->sbinfo->si_kobj); -+ } else { -+ a->sbinfo = au_si_alloc(a->sb); -+ AuDebugOn(!a->sbinfo); -+ err = PTR_ERR(a->sbinfo); -+ if (IS_ERR(a->sbinfo)) -+ goto out_opt; -+ au_rw_write_unlock(&a->sbinfo->si_rwsem); -+ } -+ -+ err = 0; -+ fc->fs_private = a; -+ fc->ops = &au_fsctx_ops; -+ goto out; /* success */ -+ -+out_opt: -+ free_page((unsigned long)a->opts.opt); -+out_a: -+ au_kfree_rcu(a); -+out: -+ AuTraceErr(err); -+ return err; -+} -diff -Naur null/fs/aufs/fstype.h linux-5.15.36/fs/aufs/fstype.h ---- /dev/null -+++ linux-5.15.36/fs/aufs/fstype.h 2022-05-10 16:51:39.871744219 +0300 -@@ -0,0 +1,401 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program. If not, see . -+ */ -+ -+/* -+ * judging filesystem type -+ */ -+ -+#ifndef __AUFS_FSTYPE_H__ -+#define __AUFS_FSTYPE_H__ -+ -+#ifdef __KERNEL__ -+ -+#include -+#include -+#include -+#include -+ -+static inline int au_test_aufs(struct super_block *sb) -+{ -+ return sb->s_magic == AUFS_SUPER_MAGIC; -+} -+ -+static inline const char *au_sbtype(struct super_block *sb) -+{ -+ return sb->s_type->name; -+} -+ -+static inline int au_test_iso9660(struct super_block *sb __maybe_unused) -+{ -+#if IS_ENABLED(CONFIG_ISO9660_FS) -+ return sb->s_magic == ISOFS_SUPER_MAGIC; -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_romfs(struct super_block *sb __maybe_unused) -+{ -+#if IS_ENABLED(CONFIG_ROMFS_FS) -+ return sb->s_magic == ROMFS_MAGIC; -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_cramfs(struct super_block *sb __maybe_unused) -+{ -+#if IS_ENABLED(CONFIG_CRAMFS) -+ return sb->s_magic == CRAMFS_MAGIC; -+#endif -+ return 0; -+} -+ -+static inline int au_test_nfs(struct super_block *sb __maybe_unused) -+{ -+#if IS_ENABLED(CONFIG_NFS_FS) -+ return sb->s_magic == NFS_SUPER_MAGIC; -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_fuse(struct super_block *sb __maybe_unused) -+{ -+#if IS_ENABLED(CONFIG_FUSE_FS) -+ return sb->s_magic == FUSE_SUPER_MAGIC; -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_xfs(struct super_block *sb __maybe_unused) -+{ -+#if IS_ENABLED(CONFIG_XFS_FS) -+ return sb->s_magic == XFS_SB_MAGIC; -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_tmpfs(struct super_block *sb __maybe_unused) -+{ -+#ifdef CONFIG_TMPFS -+ return sb->s_magic == TMPFS_MAGIC; -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_ecryptfs(struct super_block *sb __maybe_unused) -+{ -+#if IS_ENABLED(CONFIG_ECRYPT_FS) -+ return !strcmp(au_sbtype(sb), "ecryptfs"); -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_ramfs(struct super_block *sb) -+{ -+ return sb->s_magic == RAMFS_MAGIC; -+} -+ -+static inline int au_test_ubifs(struct super_block *sb __maybe_unused) -+{ -+#if IS_ENABLED(CONFIG_UBIFS_FS) -+ return sb->s_magic == UBIFS_SUPER_MAGIC; -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_procfs(struct super_block *sb __maybe_unused) -+{ -+#ifdef CONFIG_PROC_FS -+ return sb->s_magic == PROC_SUPER_MAGIC; -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_sysfs(struct super_block *sb __maybe_unused) -+{ -+#ifdef CONFIG_SYSFS -+ return sb->s_magic == SYSFS_MAGIC; -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_configfs(struct super_block *sb __maybe_unused) -+{ -+#if IS_ENABLED(CONFIG_CONFIGFS_FS) -+ return sb->s_magic == CONFIGFS_MAGIC; -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_minix(struct super_block *sb __maybe_unused) -+{ -+#if IS_ENABLED(CONFIG_MINIX_FS) -+ return sb->s_magic == MINIX3_SUPER_MAGIC -+ || sb->s_magic == MINIX2_SUPER_MAGIC -+ || sb->s_magic == MINIX2_SUPER_MAGIC2 -+ || sb->s_magic == MINIX_SUPER_MAGIC -+ || sb->s_magic == MINIX_SUPER_MAGIC2; -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_fat(struct super_block *sb __maybe_unused) -+{ -+#if IS_ENABLED(CONFIG_FAT_FS) -+ return sb->s_magic == MSDOS_SUPER_MAGIC; -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_msdos(struct super_block *sb) -+{ -+ return au_test_fat(sb); -+} -+ -+static inline int au_test_vfat(struct super_block *sb) -+{ -+ return au_test_fat(sb); -+} -+ -+static inline int au_test_securityfs(struct super_block *sb __maybe_unused) -+{ -+#ifdef CONFIG_SECURITYFS -+ return sb->s_magic == SECURITYFS_MAGIC; -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_squashfs(struct super_block *sb __maybe_unused) -+{ -+#if IS_ENABLED(CONFIG_SQUASHFS) -+ return sb->s_magic == SQUASHFS_MAGIC; -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_btrfs(struct super_block *sb __maybe_unused) -+{ -+#if IS_ENABLED(CONFIG_BTRFS_FS) -+ return sb->s_magic == BTRFS_SUPER_MAGIC; -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_xenfs(struct super_block *sb __maybe_unused) -+{ -+#if IS_ENABLED(CONFIG_XENFS) -+ return sb->s_magic == XENFS_SUPER_MAGIC; -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_debugfs(struct super_block *sb __maybe_unused) -+{ -+#ifdef CONFIG_DEBUG_FS -+ return sb->s_magic == DEBUGFS_MAGIC; -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_nilfs(struct super_block *sb __maybe_unused) -+{ -+#if IS_ENABLED(CONFIG_NILFS) -+ return sb->s_magic == NILFS_SUPER_MAGIC; -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_hfsplus(struct super_block *sb __maybe_unused) -+{ -+#if IS_ENABLED(CONFIG_HFSPLUS_FS) -+ return sb->s_magic == HFSPLUS_SUPER_MAGIC; -+#else -+ return 0; -+#endif -+} -+ -+/* ---------------------------------------------------------------------- */ -+/* -+ * they can't be an aufs branch. -+ */ -+static inline int au_test_fs_unsuppoted(struct super_block *sb) -+{ -+ return -+#ifndef CONFIG_AUFS_BR_RAMFS -+ au_test_ramfs(sb) || -+#endif -+ au_test_procfs(sb) -+ || au_test_sysfs(sb) -+ || au_test_configfs(sb) -+ || au_test_debugfs(sb) -+ || au_test_securityfs(sb) -+ || au_test_xenfs(sb) -+ || au_test_ecryptfs(sb) -+ /* || !strcmp(au_sbtype(sb), "unionfs") */ -+ || au_test_aufs(sb); /* will be supported in next version */ -+} -+ -+static inline int au_test_fs_remote(struct super_block *sb) -+{ -+ return !au_test_tmpfs(sb) -+#ifdef CONFIG_AUFS_BR_RAMFS -+ && !au_test_ramfs(sb) -+#endif -+ && !(sb->s_type->fs_flags & FS_REQUIRES_DEV); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * Note: these functions (below) are created after reading ->getattr() in all -+ * filesystems under linux/fs. it means we have to do so in every update... -+ */ -+ -+/* -+ * some filesystems require getattr to refresh the inode attributes before -+ * referencing. -+ * in most cases, we can rely on the inode attribute in NFS (or every remote fs) -+ * and leave the work for d_revalidate() -+ */ -+static inline int au_test_fs_refresh_iattr(struct super_block *sb) -+{ -+ return au_test_nfs(sb) -+ || au_test_fuse(sb) -+ /* || au_test_btrfs(sb) */ /* untested */ -+ ; -+} -+ -+/* -+ * filesystems which don't maintain i_size or i_blocks. -+ */ -+static inline int au_test_fs_bad_iattr_size(struct super_block *sb) -+{ -+ return au_test_xfs(sb) -+ || au_test_btrfs(sb) -+ || au_test_ubifs(sb) -+ || au_test_hfsplus(sb) /* maintained, but incorrect */ -+ /* || au_test_minix(sb) */ /* untested */ -+ ; -+} -+ -+/* -+ * filesystems which don't store the correct value in some of their inode -+ * attributes. -+ */ -+static inline int au_test_fs_bad_iattr(struct super_block *sb) -+{ -+ return au_test_fs_bad_iattr_size(sb) -+ || au_test_fat(sb) -+ || au_test_msdos(sb) -+ || au_test_vfat(sb); -+} -+ -+/* they don't check i_nlink in link(2) */ -+static inline int au_test_fs_no_limit_nlink(struct super_block *sb) -+{ -+ return au_test_tmpfs(sb) -+#ifdef CONFIG_AUFS_BR_RAMFS -+ || au_test_ramfs(sb) -+#endif -+ || au_test_ubifs(sb) -+ || au_test_hfsplus(sb); -+} -+ -+/* -+ * filesystems which sets S_NOATIME and S_NOCMTIME. -+ */ -+static inline int au_test_fs_notime(struct super_block *sb) -+{ -+ return au_test_nfs(sb) -+ || au_test_fuse(sb) -+ || au_test_ubifs(sb) -+ ; -+} -+ -+/* temporary support for i#1 in cramfs */ -+static inline int au_test_fs_unique_ino(struct inode *inode) -+{ -+ if (au_test_cramfs(inode->i_sb)) -+ return inode->i_ino != 1; -+ return 1; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * the filesystem where the xino files placed must support i/o after unlink and -+ * maintain i_size and i_blocks. -+ */ -+static inline int au_test_fs_bad_xino(struct super_block *sb) -+{ -+ return au_test_fs_remote(sb) -+ || au_test_fs_bad_iattr_size(sb) -+ /* don't want unnecessary work for xino */ -+ || au_test_aufs(sb) -+ || au_test_ecryptfs(sb) -+ || au_test_nilfs(sb); -+} -+ -+static inline int au_test_fs_trunc_xino(struct super_block *sb) -+{ -+ return au_test_tmpfs(sb) -+ || au_test_ramfs(sb); -+} -+ -+/* -+ * test if the @sb is real-readonly. -+ */ -+static inline int au_test_fs_rr(struct super_block *sb) -+{ -+ return au_test_squashfs(sb) -+ || au_test_iso9660(sb) -+ || au_test_cramfs(sb) -+ || au_test_romfs(sb); -+} -+ -+/* -+ * test if the @inode is nfs with 'noacl' option -+ * NFS always sets SB_POSIXACL regardless its mount option 'noacl.' -+ */ -+static inline int au_test_nfs_noacl(struct inode *inode) -+{ -+ return au_test_nfs(inode->i_sb) -+ /* && IS_POSIXACL(inode) */ -+ && !nfs_server_capable(inode, NFS_CAP_ACLS); -+} -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_FSTYPE_H__ */ -diff -Naur null/fs/aufs/hbl.h linux-5.15.36/fs/aufs/hbl.h ---- /dev/null -+++ linux-5.15.36/fs/aufs/hbl.h 2022-05-10 16:51:39.871744219 +0300 -@@ -0,0 +1,65 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * Copyright (C) 2017-2021 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program. If not, see . -+ */ -+ -+/* -+ * helpers for hlist_bl.h -+ */ -+ -+#ifndef __AUFS_HBL_H__ -+#define __AUFS_HBL_H__ -+ -+#ifdef __KERNEL__ -+ -+#include -+ -+static inline void au_hbl_add(struct hlist_bl_node *node, -+ struct hlist_bl_head *hbl) -+{ -+ hlist_bl_lock(hbl); -+ hlist_bl_add_head(node, hbl); -+ hlist_bl_unlock(hbl); -+} -+ -+static inline void au_hbl_del(struct hlist_bl_node *node, -+ struct hlist_bl_head *hbl) -+{ -+ hlist_bl_lock(hbl); -+ hlist_bl_del(node); -+ hlist_bl_unlock(hbl); -+} -+ -+#define au_hbl_for_each(pos, head) \ -+ for (pos = hlist_bl_first(head); \ -+ pos; \ -+ pos = pos->next) -+ -+static inline unsigned long au_hbl_count(struct hlist_bl_head *hbl) -+{ -+ unsigned long cnt; -+ struct hlist_bl_node *pos; -+ -+ cnt = 0; -+ hlist_bl_lock(hbl); -+ au_hbl_for_each(pos, hbl) -+ cnt++; -+ hlist_bl_unlock(hbl); -+ return cnt; -+} -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_HBL_H__ */ -diff -Naur null/fs/aufs/hfsnotify.c linux-5.15.36/fs/aufs/hfsnotify.c ---- /dev/null -+++ linux-5.15.36/fs/aufs/hfsnotify.c 2022-05-10 16:51:39.871744219 +0300 -@@ -0,0 +1,288 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program. If not, see . -+ */ -+ -+/* -+ * fsnotify for the lower directories -+ */ -+ -+#include "aufs.h" -+ -+/* FS_IN_IGNORED is unnecessary */ -+static const __u32 AuHfsnMask = (FS_MOVED_TO | FS_MOVED_FROM | FS_DELETE -+ | FS_CREATE | FS_EVENT_ON_CHILD); -+static DECLARE_WAIT_QUEUE_HEAD(au_hfsn_wq); -+static __cacheline_aligned_in_smp atomic64_t au_hfsn_ifree = ATOMIC64_INIT(0); -+ -+static void au_hfsn_free_mark(struct fsnotify_mark *mark) -+{ -+ struct au_hnotify *hn = container_of(mark, struct au_hnotify, -+ hn_mark); -+ /* AuDbg("here\n"); */ -+ au_cache_free_hnotify(hn); -+ smp_mb__before_atomic(); /* for atomic64_dec */ -+ if (atomic64_dec_and_test(&au_hfsn_ifree)) -+ wake_up(&au_hfsn_wq); -+} -+ -+static int au_hfsn_alloc(struct au_hinode *hinode) -+{ -+ int err; -+ struct au_hnotify *hn; -+ struct super_block *sb; -+ struct au_branch *br; -+ struct fsnotify_mark *mark; -+ aufs_bindex_t bindex; -+ -+ hn = hinode->hi_notify; -+ sb = hn->hn_aufs_inode->i_sb; -+ bindex = au_br_index(sb, hinode->hi_id); -+ br = au_sbr(sb, bindex); -+ AuDebugOn(!br->br_hfsn); -+ -+ mark = &hn->hn_mark; -+ fsnotify_init_mark(mark, br->br_hfsn->hfsn_group); -+ mark->mask = AuHfsnMask; -+ /* -+ * by udba rename or rmdir, aufs assign a new inode to the known -+ * h_inode, so specify 1 to allow dups. -+ */ -+ lockdep_off(); -+ err = fsnotify_add_inode_mark(mark, hinode->hi_inode, /*allow_dups*/1); -+ lockdep_on(); -+ -+ return err; -+} -+ -+static int au_hfsn_free(struct au_hinode *hinode, struct au_hnotify *hn) -+{ -+ struct fsnotify_mark *mark; -+ unsigned long long ull; -+ struct fsnotify_group *group; -+ -+ ull = atomic64_inc_return(&au_hfsn_ifree); -+ BUG_ON(!ull); -+ -+ mark = &hn->hn_mark; -+ spin_lock(&mark->lock); -+ group = mark->group; -+ fsnotify_get_group(group); -+ spin_unlock(&mark->lock); -+ lockdep_off(); -+ fsnotify_destroy_mark(mark, group); -+ fsnotify_put_mark(mark); -+ fsnotify_put_group(group); -+ lockdep_on(); -+ -+ /* free hn by myself */ -+ return 0; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static void au_hfsn_ctl(struct au_hinode *hinode, int do_set) -+{ -+ struct fsnotify_mark *mark; -+ -+ mark = &hinode->hi_notify->hn_mark; -+ spin_lock(&mark->lock); -+ if (do_set) { -+ AuDebugOn(mark->mask & AuHfsnMask); -+ mark->mask |= AuHfsnMask; -+ } else { -+ AuDebugOn(!(mark->mask & AuHfsnMask)); -+ mark->mask &= ~AuHfsnMask; -+ } -+ spin_unlock(&mark->lock); -+ /* fsnotify_recalc_inode_mask(hinode->hi_inode); */ -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* #define AuDbgHnotify */ -+#ifdef AuDbgHnotify -+static char *au_hfsn_name(u32 mask) -+{ -+#ifdef CONFIG_AUFS_DEBUG -+#define test_ret(flag) \ -+ do { \ -+ if (mask & flag) \ -+ return #flag; \ -+ } while (0) -+ test_ret(FS_ACCESS); -+ test_ret(FS_MODIFY); -+ test_ret(FS_ATTRIB); -+ test_ret(FS_CLOSE_WRITE); -+ test_ret(FS_CLOSE_NOWRITE); -+ test_ret(FS_OPEN); -+ test_ret(FS_MOVED_FROM); -+ test_ret(FS_MOVED_TO); -+ test_ret(FS_CREATE); -+ test_ret(FS_DELETE); -+ test_ret(FS_DELETE_SELF); -+ test_ret(FS_MOVE_SELF); -+ test_ret(FS_UNMOUNT); -+ test_ret(FS_Q_OVERFLOW); -+ test_ret(FS_IN_IGNORED); -+ test_ret(FS_ISDIR); -+ test_ret(FS_IN_ONESHOT); -+ test_ret(FS_EVENT_ON_CHILD); -+ return ""; -+#undef test_ret -+#else -+ return "??"; -+#endif -+} -+#endif -+ -+/* ---------------------------------------------------------------------- */ -+ -+static void au_hfsn_free_group(struct fsnotify_group *group) -+{ -+ struct au_br_hfsnotify *hfsn = group->private; -+ -+ /* AuDbg("here\n"); */ -+ au_kfree_try_rcu(hfsn); -+} -+ -+static int au_hfsn_handle_event(struct fsnotify_group *group, -+ u32 mask, const void *data, int data_type, -+ struct inode *dir, -+ const struct qstr *file_name, u32 cookie, -+ struct fsnotify_iter_info *iter_info) -+{ -+ int err; -+ struct au_hnotify *hnotify; -+ struct inode *h_dir, *h_inode; -+ struct fsnotify_mark *inode_mark; -+ -+ AuDebugOn(data_type != FSNOTIFY_EVENT_INODE); -+ -+ err = 0; -+ /* if FS_UNMOUNT happens, there must be another bug */ -+ AuDebugOn(mask & FS_UNMOUNT); -+ if (mask & (FS_IN_IGNORED | FS_UNMOUNT)) -+ goto out; -+ -+ h_dir = dir; -+ h_inode = NULL; -+#ifdef AuDbgHnotify -+ au_debug_on(); -+ if (1 || h_child_qstr.len != sizeof(AUFS_XINO_FNAME) - 1 -+ || strncmp(h_child_qstr.name, AUFS_XINO_FNAME, h_child_qstr.len)) { -+ AuDbg("i%lu, mask 0x%x %s, hcname %.*s, hi%lu\n", -+ h_dir->i_ino, mask, au_hfsn_name(mask), -+ AuLNPair(&h_child_qstr), h_inode ? h_inode->i_ino : 0); -+ /* WARN_ON(1); */ -+ } -+ au_debug_off(); -+#endif -+ -+ inode_mark = fsnotify_iter_inode_mark(iter_info); -+ AuDebugOn(!inode_mark); -+ hnotify = container_of(inode_mark, struct au_hnotify, hn_mark); -+ err = au_hnotify(h_dir, hnotify, mask, file_name, h_inode); -+ -+out: -+ return err; -+} -+ -+static struct fsnotify_ops au_hfsn_ops = { -+ .handle_event = au_hfsn_handle_event, -+ .free_group_priv = au_hfsn_free_group, -+ .free_mark = au_hfsn_free_mark -+}; -+ -+/* ---------------------------------------------------------------------- */ -+ -+static void au_hfsn_fin_br(struct au_branch *br) -+{ -+ struct au_br_hfsnotify *hfsn; -+ -+ hfsn = br->br_hfsn; -+ if (hfsn) { -+ lockdep_off(); -+ fsnotify_put_group(hfsn->hfsn_group); -+ lockdep_on(); -+ } -+} -+ -+static int au_hfsn_init_br(struct au_branch *br, int perm) -+{ -+ int err; -+ struct fsnotify_group *group; -+ struct au_br_hfsnotify *hfsn; -+ -+ err = 0; -+ br->br_hfsn = NULL; -+ if (!au_br_hnotifyable(perm)) -+ goto out; -+ -+ err = -ENOMEM; -+ hfsn = kmalloc(sizeof(*hfsn), GFP_NOFS); -+ if (unlikely(!hfsn)) -+ goto out; -+ -+ err = 0; -+ group = fsnotify_alloc_group(&au_hfsn_ops); -+ if (IS_ERR(group)) { -+ err = PTR_ERR(group); -+ pr_err("fsnotify_alloc_group() failed, %d\n", err); -+ goto out_hfsn; -+ } -+ -+ group->private = hfsn; -+ hfsn->hfsn_group = group; -+ br->br_hfsn = hfsn; -+ goto out; /* success */ -+ -+out_hfsn: -+ au_kfree_try_rcu(hfsn); -+out: -+ return err; -+} -+ -+static int au_hfsn_reset_br(unsigned int udba, struct au_branch *br, int perm) -+{ -+ int err; -+ -+ err = 0; -+ if (!br->br_hfsn) -+ err = au_hfsn_init_br(br, perm); -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static void au_hfsn_fin(void) -+{ -+ AuDbg("au_hfsn_ifree %lld\n", (long long)atomic64_read(&au_hfsn_ifree)); -+ wait_event(au_hfsn_wq, !atomic64_read(&au_hfsn_ifree)); -+} -+ -+const struct au_hnotify_op au_hnotify_op = { -+ .ctl = au_hfsn_ctl, -+ .alloc = au_hfsn_alloc, -+ .free = au_hfsn_free, -+ -+ .fin = au_hfsn_fin, -+ -+ .reset_br = au_hfsn_reset_br, -+ .fin_br = au_hfsn_fin_br, -+ .init_br = au_hfsn_init_br -+}; -diff -Naur null/fs/aufs/hfsplus.c linux-5.15.36/fs/aufs/hfsplus.c ---- /dev/null -+++ linux-5.15.36/fs/aufs/hfsplus.c 2022-05-10 16:51:39.872744219 +0300 -@@ -0,0 +1,60 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2010-2021 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program. If not, see . -+ */ -+ -+/* -+ * special support for filesystems which acquires an inode mutex -+ * at final closing a file, eg, hfsplus. -+ * -+ * This trick is very simple and stupid, just to open the file before really -+ * necessary open to tell hfsplus that this is not the final closing. -+ * The caller should call au_h_open_pre() after acquiring the inode mutex, -+ * and au_h_open_post() after releasing it. -+ */ -+ -+#include "aufs.h" -+ -+struct file *au_h_open_pre(struct dentry *dentry, aufs_bindex_t bindex, -+ int force_wr) -+{ -+ struct file *h_file; -+ struct dentry *h_dentry; -+ -+ h_dentry = au_h_dptr(dentry, bindex); -+ AuDebugOn(!h_dentry); -+ AuDebugOn(d_is_negative(h_dentry)); -+ -+ h_file = NULL; -+ if (au_test_hfsplus(h_dentry->d_sb) -+ && d_is_reg(h_dentry)) -+ h_file = au_h_open(dentry, bindex, -+ O_RDONLY | O_NOATIME | O_LARGEFILE, -+ /*file*/NULL, force_wr); -+ return h_file; -+} -+ -+void au_h_open_post(struct dentry *dentry, aufs_bindex_t bindex, -+ struct file *h_file) -+{ -+ struct au_branch *br; -+ -+ if (h_file) { -+ fput(h_file); -+ br = au_sbr(dentry->d_sb, bindex); -+ au_lcnt_dec(&br->br_nfiles); -+ } -+} -diff -Naur null/fs/aufs/hnotify.c linux-5.15.36/fs/aufs/hnotify.c ---- /dev/null -+++ linux-5.15.36/fs/aufs/hnotify.c 2022-05-10 16:51:39.872744219 +0300 -@@ -0,0 +1,715 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program. If not, see . -+ */ -+ -+/* -+ * abstraction to notify the direct changes on lower directories -+ */ -+ -+/* #include */ -+#include "aufs.h" -+ -+int au_hn_alloc(struct au_hinode *hinode, struct inode *inode) -+{ -+ int err; -+ struct au_hnotify *hn; -+ -+ err = -ENOMEM; -+ hn = au_cache_alloc_hnotify(); -+ if (hn) { -+ hn->hn_aufs_inode = inode; -+ hinode->hi_notify = hn; -+ err = au_hnotify_op.alloc(hinode); -+ AuTraceErr(err); -+ if (unlikely(err)) { -+ hinode->hi_notify = NULL; -+ au_cache_free_hnotify(hn); -+ /* -+ * The upper dir was removed by udba, but the same named -+ * dir left. In this case, aufs assigns a new inode -+ * number and set the monitor again. -+ * For the lower dir, the old monitor is still left. -+ */ -+ if (err == -EEXIST) -+ err = 0; -+ } -+ } -+ -+ AuTraceErr(err); -+ return err; -+} -+ -+void au_hn_free(struct au_hinode *hinode) -+{ -+ struct au_hnotify *hn; -+ -+ hn = hinode->hi_notify; -+ if (hn) { -+ hinode->hi_notify = NULL; -+ if (au_hnotify_op.free(hinode, hn)) -+ au_cache_free_hnotify(hn); -+ } -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+void au_hn_ctl(struct au_hinode *hinode, int do_set) -+{ -+ if (hinode->hi_notify) -+ au_hnotify_op.ctl(hinode, do_set); -+} -+ -+void au_hn_reset(struct inode *inode, unsigned int flags) -+{ -+ aufs_bindex_t bindex, bbot; -+ struct inode *hi; -+ struct dentry *iwhdentry; -+ -+ bbot = au_ibbot(inode); -+ for (bindex = au_ibtop(inode); bindex <= bbot; bindex++) { -+ hi = au_h_iptr(inode, bindex); -+ if (!hi) -+ continue; -+ -+ /* inode_lock_nested(hi, AuLsc_I_CHILD); */ -+ iwhdentry = au_hi_wh(inode, bindex); -+ if (iwhdentry) -+ dget(iwhdentry); -+ au_igrab(hi); -+ au_set_h_iptr(inode, bindex, NULL, 0); -+ au_set_h_iptr(inode, bindex, au_igrab(hi), -+ flags & ~AuHi_XINO); -+ iput(hi); -+ dput(iwhdentry); -+ /* inode_unlock(hi); */ -+ } -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int hn_xino(struct inode *inode, struct inode *h_inode) -+{ -+ int err; -+ aufs_bindex_t bindex, bbot, bfound, btop; -+ struct inode *h_i; -+ -+ err = 0; -+ if (unlikely(inode->i_ino == AUFS_ROOT_INO)) { -+ pr_warn("branch root dir was changed\n"); -+ goto out; -+ } -+ -+ bfound = -1; -+ bbot = au_ibbot(inode); -+ btop = au_ibtop(inode); -+#if 0 /* reserved for future use */ -+ if (bindex == bbot) { -+ /* keep this ino in rename case */ -+ goto out; -+ } -+#endif -+ for (bindex = btop; bindex <= bbot; bindex++) -+ if (au_h_iptr(inode, bindex) == h_inode) { -+ bfound = bindex; -+ break; -+ } -+ if (bfound < 0) -+ goto out; -+ -+ for (bindex = btop; bindex <= bbot; bindex++) { -+ h_i = au_h_iptr(inode, bindex); -+ if (!h_i) -+ continue; -+ -+ err = au_xino_write(inode->i_sb, bindex, h_i->i_ino, /*ino*/0); -+ /* ignore this error */ -+ /* bad action? */ -+ } -+ -+ /* children inode number will be broken */ -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+static int hn_gen_tree(struct dentry *dentry) -+{ -+ int err, i, j, ndentry; -+ struct au_dcsub_pages dpages; -+ struct au_dpage *dpage; -+ struct dentry **dentries; -+ -+ err = au_dpages_init(&dpages, GFP_NOFS); -+ if (unlikely(err)) -+ goto out; -+ err = au_dcsub_pages(&dpages, dentry, NULL, NULL); -+ if (unlikely(err)) -+ goto out_dpages; -+ -+ for (i = 0; i < dpages.ndpage; i++) { -+ dpage = dpages.dpages + i; -+ dentries = dpage->dentries; -+ ndentry = dpage->ndentry; -+ for (j = 0; j < ndentry; j++) { -+ struct dentry *d; -+ -+ d = dentries[j]; -+ if (IS_ROOT(d)) -+ continue; -+ -+ au_digen_dec(d); -+ if (d_really_is_positive(d)) -+ /* todo: reset children xino? -+ cached children only? */ -+ au_iigen_dec(d_inode(d)); -+ } -+ } -+ -+out_dpages: -+ au_dpages_free(&dpages); -+out: -+ return err; -+} -+ -+/* -+ * return 0 if processed. -+ */ -+static int hn_gen_by_inode(char *name, unsigned int nlen, struct inode *inode, -+ const unsigned int isdir) -+{ -+ int err; -+ struct dentry *d; -+ struct qstr *dname; -+ -+ err = 1; -+ if (unlikely(inode->i_ino == AUFS_ROOT_INO)) { -+ pr_warn("branch root dir was changed\n"); -+ err = 0; -+ goto out; -+ } -+ -+ if (!isdir) { -+ AuDebugOn(!name); -+ au_iigen_dec(inode); -+ spin_lock(&inode->i_lock); -+ hlist_for_each_entry(d, &inode->i_dentry, d_u.d_alias) { -+ spin_lock(&d->d_lock); -+ dname = &d->d_name; -+ if (dname->len != nlen -+ && memcmp(dname->name, name, nlen)) { -+ spin_unlock(&d->d_lock); -+ continue; -+ } -+ err = 0; -+ au_digen_dec(d); -+ spin_unlock(&d->d_lock); -+ break; -+ } -+ spin_unlock(&inode->i_lock); -+ } else { -+ au_fset_si(au_sbi(inode->i_sb), FAILED_REFRESH_DIR); -+ d = d_find_any_alias(inode); -+ if (!d) { -+ au_iigen_dec(inode); -+ goto out; -+ } -+ -+ spin_lock(&d->d_lock); -+ dname = &d->d_name; -+ if (dname->len == nlen && !memcmp(dname->name, name, nlen)) { -+ spin_unlock(&d->d_lock); -+ err = hn_gen_tree(d); -+ spin_lock(&d->d_lock); -+ } -+ spin_unlock(&d->d_lock); -+ dput(d); -+ } -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+static int hn_gen_by_name(struct dentry *dentry, const unsigned int isdir) -+{ -+ int err; -+ -+ if (IS_ROOT(dentry)) { -+ pr_warn("branch root dir was changed\n"); -+ return 0; -+ } -+ -+ err = 0; -+ if (!isdir) { -+ au_digen_dec(dentry); -+ if (d_really_is_positive(dentry)) -+ au_iigen_dec(d_inode(dentry)); -+ } else { -+ au_fset_si(au_sbi(dentry->d_sb), FAILED_REFRESH_DIR); -+ if (d_really_is_positive(dentry)) -+ err = hn_gen_tree(dentry); -+ } -+ -+ AuTraceErr(err); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* hnotify job flags */ -+#define AuHnJob_XINO0 1 -+#define AuHnJob_GEN (1 << 1) -+#define AuHnJob_DIRENT (1 << 2) -+#define AuHnJob_ISDIR (1 << 3) -+#define AuHnJob_TRYXINO0 (1 << 4) -+#define AuHnJob_MNTPNT (1 << 5) -+#define au_ftest_hnjob(flags, name) ((flags) & AuHnJob_##name) -+#define au_fset_hnjob(flags, name) \ -+ do { (flags) |= AuHnJob_##name; } while (0) -+#define au_fclr_hnjob(flags, name) \ -+ do { (flags) &= ~AuHnJob_##name; } while (0) -+ -+enum { -+ AuHn_CHILD, -+ AuHn_PARENT, -+ AuHnLast -+}; -+ -+struct au_hnotify_args { -+ struct inode *h_dir, *dir, *h_child_inode; -+ u32 mask; -+ unsigned int flags[AuHnLast]; -+ unsigned int h_child_nlen; -+ char h_child_name[]; -+}; -+ -+struct hn_job_args { -+ unsigned int flags; -+ struct inode *inode, *h_inode, *dir, *h_dir; -+ struct dentry *dentry; -+ char *h_name; -+ int h_nlen; -+}; -+ -+static int hn_job(struct hn_job_args *a) -+{ -+ const unsigned int isdir = au_ftest_hnjob(a->flags, ISDIR); -+ int e; -+ -+ /* reset xino */ -+ if (au_ftest_hnjob(a->flags, XINO0) && a->inode) -+ hn_xino(a->inode, a->h_inode); /* ignore this error */ -+ -+ if (au_ftest_hnjob(a->flags, TRYXINO0) -+ && a->inode -+ && a->h_inode) { -+ inode_lock_shared_nested(a->h_inode, AuLsc_I_CHILD); -+ if (!a->h_inode->i_nlink -+ && !(a->h_inode->i_state & I_LINKABLE)) -+ hn_xino(a->inode, a->h_inode); /* ignore this error */ -+ inode_unlock_shared(a->h_inode); -+ } -+ -+ /* make the generation obsolete */ -+ if (au_ftest_hnjob(a->flags, GEN)) { -+ e = -1; -+ if (a->inode) -+ e = hn_gen_by_inode(a->h_name, a->h_nlen, a->inode, -+ isdir); -+ if (e && a->dentry) -+ hn_gen_by_name(a->dentry, isdir); -+ /* ignore this error */ -+ } -+ -+ /* make dir entries obsolete */ -+ if (au_ftest_hnjob(a->flags, DIRENT) && a->inode) { -+ struct au_vdir *vdir; -+ -+ vdir = au_ivdir(a->inode); -+ if (vdir) -+ vdir->vd_jiffy = 0; -+ /* IMustLock(a->inode); */ -+ /* inode_inc_iversion(a->inode); */ -+ } -+ -+ /* can do nothing but warn */ -+ if (au_ftest_hnjob(a->flags, MNTPNT) -+ && a->dentry -+ && d_mountpoint(a->dentry)) -+ pr_warn("mount-point %pd is removed or renamed\n", a->dentry); -+ -+ return 0; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static struct dentry *lookup_wlock_by_name(char *name, unsigned int nlen, -+ struct inode *dir) -+{ -+ struct dentry *dentry, *d, *parent; -+ struct qstr *dname; -+ -+ parent = d_find_any_alias(dir); -+ if (!parent) -+ return NULL; -+ -+ dentry = NULL; -+ spin_lock(&parent->d_lock); -+ list_for_each_entry(d, &parent->d_subdirs, d_child) { -+ /* AuDbg("%pd\n", d); */ -+ spin_lock_nested(&d->d_lock, DENTRY_D_LOCK_NESTED); -+ dname = &d->d_name; -+ if (dname->len != nlen || memcmp(dname->name, name, nlen)) -+ goto cont_unlock; -+ if (au_di(d)) -+ au_digen_dec(d); -+ else -+ goto cont_unlock; -+ if (au_dcount(d) > 0) { -+ dentry = dget_dlock(d); -+ spin_unlock(&d->d_lock); -+ break; -+ } -+ -+cont_unlock: -+ spin_unlock(&d->d_lock); -+ } -+ spin_unlock(&parent->d_lock); -+ dput(parent); -+ -+ if (dentry) -+ di_write_lock_child(dentry); -+ -+ return dentry; -+} -+ -+static struct inode *lookup_wlock_by_ino(struct super_block *sb, -+ aufs_bindex_t bindex, ino_t h_ino) -+{ -+ struct inode *inode; -+ ino_t ino; -+ int err; -+ -+ inode = NULL; -+ err = au_xino_read(sb, bindex, h_ino, &ino); -+ if (!err && ino) -+ inode = ilookup(sb, ino); -+ if (!inode) -+ goto out; -+ -+ if (unlikely(inode->i_ino == AUFS_ROOT_INO)) { -+ pr_warn("wrong root branch\n"); -+ iput(inode); -+ inode = NULL; -+ goto out; -+ } -+ -+ ii_write_lock_child(inode); -+ -+out: -+ return inode; -+} -+ -+static void au_hn_bh(void *_args) -+{ -+ struct au_hnotify_args *a = _args; -+ struct super_block *sb; -+ aufs_bindex_t bindex, bbot, bfound; -+ unsigned char xino, try_iput; -+ int err; -+ struct inode *inode; -+ ino_t h_ino; -+ struct hn_job_args args; -+ struct dentry *dentry; -+ struct au_sbinfo *sbinfo; -+ -+ AuDebugOn(!_args); -+ AuDebugOn(!a->h_dir); -+ AuDebugOn(!a->dir); -+ AuDebugOn(!a->mask); -+ AuDbg("mask 0x%x, i%lu, hi%lu, hci%lu\n", -+ a->mask, a->dir->i_ino, a->h_dir->i_ino, -+ a->h_child_inode ? a->h_child_inode->i_ino : 0); -+ -+ inode = NULL; -+ dentry = NULL; -+ /* -+ * do not lock a->dir->i_mutex here -+ * because of d_revalidate() may cause a deadlock. -+ */ -+ sb = a->dir->i_sb; -+ AuDebugOn(!sb); -+ sbinfo = au_sbi(sb); -+ AuDebugOn(!sbinfo); -+ si_write_lock(sb, AuLock_NOPLMW); -+ -+ if (au_opt_test(sbinfo->si_mntflags, DIRREN)) -+ switch (a->mask & FS_EVENTS_POSS_ON_CHILD) { -+ case FS_MOVED_FROM: -+ case FS_MOVED_TO: -+ AuWarn1("DIRREN with UDBA may not work correctly " -+ "for the direct rename(2)\n"); -+ } -+ -+ ii_read_lock_parent(a->dir); -+ bfound = -1; -+ bbot = au_ibbot(a->dir); -+ for (bindex = au_ibtop(a->dir); bindex <= bbot; bindex++) -+ if (au_h_iptr(a->dir, bindex) == a->h_dir) { -+ bfound = bindex; -+ break; -+ } -+ ii_read_unlock(a->dir); -+ if (unlikely(bfound < 0)) -+ goto out; -+ -+ xino = !!au_opt_test(au_mntflags(sb), XINO); -+ h_ino = 0; -+ if (a->h_child_inode) -+ h_ino = a->h_child_inode->i_ino; -+ -+ if (a->h_child_nlen -+ && (au_ftest_hnjob(a->flags[AuHn_CHILD], GEN) -+ || au_ftest_hnjob(a->flags[AuHn_CHILD], MNTPNT))) -+ dentry = lookup_wlock_by_name(a->h_child_name, a->h_child_nlen, -+ a->dir); -+ try_iput = 0; -+ if (dentry && d_really_is_positive(dentry)) -+ inode = d_inode(dentry); -+ if (xino && !inode && h_ino -+ && (au_ftest_hnjob(a->flags[AuHn_CHILD], XINO0) -+ || au_ftest_hnjob(a->flags[AuHn_CHILD], TRYXINO0) -+ || au_ftest_hnjob(a->flags[AuHn_CHILD], GEN))) { -+ inode = lookup_wlock_by_ino(sb, bfound, h_ino); -+ try_iput = 1; -+ } -+ -+ args.flags = a->flags[AuHn_CHILD]; -+ args.dentry = dentry; -+ args.inode = inode; -+ args.h_inode = a->h_child_inode; -+ args.dir = a->dir; -+ args.h_dir = a->h_dir; -+ args.h_name = a->h_child_name; -+ args.h_nlen = a->h_child_nlen; -+ err = hn_job(&args); -+ if (dentry) { -+ if (au_di(dentry)) -+ di_write_unlock(dentry); -+ dput(dentry); -+ } -+ if (inode && try_iput) { -+ ii_write_unlock(inode); -+ iput(inode); -+ } -+ -+ ii_write_lock_parent(a->dir); -+ args.flags = a->flags[AuHn_PARENT]; -+ args.dentry = NULL; -+ args.inode = a->dir; -+ args.h_inode = a->h_dir; -+ args.dir = NULL; -+ args.h_dir = NULL; -+ args.h_name = NULL; -+ args.h_nlen = 0; -+ err = hn_job(&args); -+ ii_write_unlock(a->dir); -+ -+out: -+ iput(a->h_child_inode); -+ iput(a->h_dir); -+ iput(a->dir); -+ si_write_unlock(sb); -+ au_nwt_done(&sbinfo->si_nowait); -+ au_kfree_rcu(a); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+int au_hnotify(struct inode *h_dir, struct au_hnotify *hnotify, u32 mask, -+ const struct qstr *h_child_qstr, struct inode *h_child_inode) -+{ -+ int err, len; -+ unsigned int flags[AuHnLast], f; -+ unsigned char isdir, isroot, wh; -+ struct inode *dir; -+ struct au_hnotify_args *args; -+ char *p, *h_child_name; -+ -+ err = 0; -+ AuDebugOn(!hnotify || !hnotify->hn_aufs_inode); -+ dir = igrab(hnotify->hn_aufs_inode); -+ if (!dir) -+ goto out; -+ -+ isroot = (dir->i_ino == AUFS_ROOT_INO); -+ wh = 0; -+ h_child_name = (void *)h_child_qstr->name; -+ len = h_child_qstr->len; -+ if (h_child_name) { -+ if (len > AUFS_WH_PFX_LEN -+ && !memcmp(h_child_name, AUFS_WH_PFX, AUFS_WH_PFX_LEN)) { -+ h_child_name += AUFS_WH_PFX_LEN; -+ len -= AUFS_WH_PFX_LEN; -+ wh = 1; -+ } -+ } -+ -+ isdir = 0; -+ if (h_child_inode) -+ isdir = !!S_ISDIR(h_child_inode->i_mode); -+ flags[AuHn_PARENT] = AuHnJob_ISDIR; -+ flags[AuHn_CHILD] = 0; -+ if (isdir) -+ flags[AuHn_CHILD] = AuHnJob_ISDIR; -+ au_fset_hnjob(flags[AuHn_PARENT], DIRENT); -+ au_fset_hnjob(flags[AuHn_CHILD], GEN); -+ switch (mask & ALL_FSNOTIFY_DIRENT_EVENTS) { -+ case FS_MOVED_FROM: -+ case FS_MOVED_TO: -+ au_fset_hnjob(flags[AuHn_CHILD], XINO0); -+ au_fset_hnjob(flags[AuHn_CHILD], MNTPNT); -+ fallthrough; -+ case FS_CREATE: -+ AuDebugOn(!h_child_name); -+ break; -+ -+ case FS_DELETE: -+ /* -+ * aufs never be able to get this child inode. -+ * revalidation should be in d_revalidate() -+ * by checking i_nlink, i_generation or d_unhashed(). -+ */ -+ AuDebugOn(!h_child_name); -+ au_fset_hnjob(flags[AuHn_CHILD], TRYXINO0); -+ au_fset_hnjob(flags[AuHn_CHILD], MNTPNT); -+ break; -+ -+ default: -+ AuDebugOn(1); -+ } -+ -+ if (wh) -+ h_child_inode = NULL; -+ -+ err = -ENOMEM; -+ /* iput() and kfree() will be called in au_hnotify() */ -+ args = kmalloc(sizeof(*args) + len + 1, GFP_NOFS); -+ if (unlikely(!args)) { -+ AuErr1("no memory\n"); -+ iput(dir); -+ goto out; -+ } -+ args->flags[AuHn_PARENT] = flags[AuHn_PARENT]; -+ args->flags[AuHn_CHILD] = flags[AuHn_CHILD]; -+ args->mask = mask; -+ args->dir = dir; -+ args->h_dir = igrab(h_dir); -+ if (h_child_inode) -+ h_child_inode = igrab(h_child_inode); /* can be NULL */ -+ args->h_child_inode = h_child_inode; -+ args->h_child_nlen = len; -+ if (len) { -+ p = (void *)args; -+ p += sizeof(*args); -+ memcpy(p, h_child_name, len); -+ p[len] = 0; -+ } -+ -+ /* NFS fires the event for silly-renamed one from kworker */ -+ f = 0; -+ if (!dir->i_nlink -+ || (au_test_nfs(h_dir->i_sb) && (mask & FS_DELETE))) -+ f = AuWkq_NEST; -+ err = au_wkq_nowait(au_hn_bh, args, dir->i_sb, f); -+ if (unlikely(err)) { -+ pr_err("wkq %d\n", err); -+ iput(args->h_child_inode); -+ iput(args->h_dir); -+ iput(args->dir); -+ au_kfree_rcu(args); -+ } -+ -+out: -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+int au_hnotify_reset_br(unsigned int udba, struct au_branch *br, int perm) -+{ -+ int err; -+ -+ AuDebugOn(!(udba & AuOptMask_UDBA)); -+ -+ err = 0; -+ if (au_hnotify_op.reset_br) -+ err = au_hnotify_op.reset_br(udba, br, perm); -+ -+ return err; -+} -+ -+int au_hnotify_init_br(struct au_branch *br, int perm) -+{ -+ int err; -+ -+ err = 0; -+ if (au_hnotify_op.init_br) -+ err = au_hnotify_op.init_br(br, perm); -+ -+ return err; -+} -+ -+void au_hnotify_fin_br(struct au_branch *br) -+{ -+ if (au_hnotify_op.fin_br) -+ au_hnotify_op.fin_br(br); -+} -+ -+static void au_hn_destroy_cache(void) -+{ -+ kmem_cache_destroy(au_cache[AuCache_HNOTIFY]); -+ au_cache[AuCache_HNOTIFY] = NULL; -+} -+ -+int __init au_hnotify_init(void) -+{ -+ int err; -+ -+ err = -ENOMEM; -+ au_cache[AuCache_HNOTIFY] = AuCache(au_hnotify); -+ if (au_cache[AuCache_HNOTIFY]) { -+ err = 0; -+ if (au_hnotify_op.init) -+ err = au_hnotify_op.init(); -+ if (unlikely(err)) -+ au_hn_destroy_cache(); -+ } -+ AuTraceErr(err); -+ return err; -+} -+ -+void au_hnotify_fin(void) -+{ -+ if (au_hnotify_op.fin) -+ au_hnotify_op.fin(); -+ -+ /* cf. au_cache_fin() */ -+ if (au_cache[AuCache_HNOTIFY]) -+ au_hn_destroy_cache(); -+} -diff -Naur null/fs/aufs/iinfo.c linux-5.15.36/fs/aufs/iinfo.c ---- /dev/null -+++ linux-5.15.36/fs/aufs/iinfo.c 2022-05-10 16:51:39.873744219 +0300 -@@ -0,0 +1,286 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program. If not, see . -+ */ -+ -+/* -+ * inode private data -+ */ -+ -+#include "aufs.h" -+ -+struct inode *au_h_iptr(struct inode *inode, aufs_bindex_t bindex) -+{ -+ struct inode *h_inode; -+ struct au_hinode *hinode; -+ -+ IiMustAnyLock(inode); -+ -+ hinode = au_hinode(au_ii(inode), bindex); -+ h_inode = hinode->hi_inode; -+ AuDebugOn(h_inode && atomic_read(&h_inode->i_count) <= 0); -+ return h_inode; -+} -+ -+/* todo: hard/soft set? */ -+void au_hiput(struct au_hinode *hinode) -+{ -+ au_hn_free(hinode); -+ dput(hinode->hi_whdentry); -+ iput(hinode->hi_inode); -+} -+ -+unsigned int au_hi_flags(struct inode *inode, int isdir) -+{ -+ unsigned int flags; -+ const unsigned int mnt_flags = au_mntflags(inode->i_sb); -+ -+ flags = 0; -+ if (au_opt_test(mnt_flags, XINO)) -+ au_fset_hi(flags, XINO); -+ if (isdir && au_opt_test(mnt_flags, UDBA_HNOTIFY)) -+ au_fset_hi(flags, HNOTIFY); -+ return flags; -+} -+ -+void au_set_h_iptr(struct inode *inode, aufs_bindex_t bindex, -+ struct inode *h_inode, unsigned int flags) -+{ -+ struct au_hinode *hinode; -+ struct inode *hi; -+ struct au_iinfo *iinfo = au_ii(inode); -+ -+ IiMustWriteLock(inode); -+ -+ hinode = au_hinode(iinfo, bindex); -+ hi = hinode->hi_inode; -+ AuDebugOn(h_inode && atomic_read(&h_inode->i_count) <= 0); -+ -+ if (hi) -+ au_hiput(hinode); -+ hinode->hi_inode = h_inode; -+ if (h_inode) { -+ int err; -+ struct super_block *sb = inode->i_sb; -+ struct au_branch *br; -+ -+ AuDebugOn(inode->i_mode -+ && (h_inode->i_mode & S_IFMT) -+ != (inode->i_mode & S_IFMT)); -+ if (bindex == iinfo->ii_btop) -+ au_cpup_igen(inode, h_inode); -+ br = au_sbr(sb, bindex); -+ hinode->hi_id = br->br_id; -+ if (au_ftest_hi(flags, XINO)) { -+ err = au_xino_write(sb, bindex, h_inode->i_ino, -+ inode->i_ino); -+ if (unlikely(err)) -+ AuIOErr1("failed au_xino_write() %d\n", err); -+ } -+ -+ if (au_ftest_hi(flags, HNOTIFY) -+ && au_br_hnotifyable(br->br_perm)) { -+ err = au_hn_alloc(hinode, inode); -+ if (unlikely(err)) -+ AuIOErr1("au_hn_alloc() %d\n", err); -+ } -+ } -+} -+ -+void au_set_hi_wh(struct inode *inode, aufs_bindex_t bindex, -+ struct dentry *h_wh) -+{ -+ struct au_hinode *hinode; -+ -+ IiMustWriteLock(inode); -+ -+ hinode = au_hinode(au_ii(inode), bindex); -+ AuDebugOn(hinode->hi_whdentry); -+ hinode->hi_whdentry = h_wh; -+} -+ -+void au_update_iigen(struct inode *inode, int half) -+{ -+ struct au_iinfo *iinfo; -+ struct au_iigen *iigen; -+ unsigned int sigen; -+ -+ sigen = au_sigen(inode->i_sb); -+ iinfo = au_ii(inode); -+ iigen = &iinfo->ii_generation; -+ spin_lock(&iigen->ig_spin); -+ iigen->ig_generation = sigen; -+ if (half) -+ au_ig_fset(iigen->ig_flags, HALF_REFRESHED); -+ else -+ au_ig_fclr(iigen->ig_flags, HALF_REFRESHED); -+ spin_unlock(&iigen->ig_spin); -+} -+ -+/* it may be called at remount time, too */ -+void au_update_ibrange(struct inode *inode, int do_put_zero) -+{ -+ struct au_iinfo *iinfo; -+ aufs_bindex_t bindex, bbot; -+ -+ AuDebugOn(au_is_bad_inode(inode)); -+ IiMustWriteLock(inode); -+ -+ iinfo = au_ii(inode); -+ if (do_put_zero && iinfo->ii_btop >= 0) { -+ for (bindex = iinfo->ii_btop; bindex <= iinfo->ii_bbot; -+ bindex++) { -+ struct inode *h_i; -+ -+ h_i = au_hinode(iinfo, bindex)->hi_inode; -+ if (h_i -+ && !h_i->i_nlink -+ && !(h_i->i_state & I_LINKABLE)) -+ au_set_h_iptr(inode, bindex, NULL, 0); -+ } -+ } -+ -+ iinfo->ii_btop = -1; -+ iinfo->ii_bbot = -1; -+ bbot = au_sbbot(inode->i_sb); -+ for (bindex = 0; bindex <= bbot; bindex++) -+ if (au_hinode(iinfo, bindex)->hi_inode) { -+ iinfo->ii_btop = bindex; -+ break; -+ } -+ if (iinfo->ii_btop >= 0) -+ for (bindex = bbot; bindex >= iinfo->ii_btop; bindex--) -+ if (au_hinode(iinfo, bindex)->hi_inode) { -+ iinfo->ii_bbot = bindex; -+ break; -+ } -+ AuDebugOn(iinfo->ii_btop > iinfo->ii_bbot); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+void au_icntnr_init_once(void *_c) -+{ -+ struct au_icntnr *c = _c; -+ struct au_iinfo *iinfo = &c->iinfo; -+ -+ spin_lock_init(&iinfo->ii_generation.ig_spin); -+ au_rw_init(&iinfo->ii_rwsem); -+ inode_init_once(&c->vfs_inode); -+} -+ -+void au_hinode_init(struct au_hinode *hinode) -+{ -+ hinode->hi_inode = NULL; -+ hinode->hi_id = -1; -+ au_hn_init(hinode); -+ hinode->hi_whdentry = NULL; -+} -+ -+int au_iinfo_init(struct inode *inode) -+{ -+ struct au_iinfo *iinfo; -+ struct super_block *sb; -+ struct au_hinode *hi; -+ int nbr, i; -+ -+ sb = inode->i_sb; -+ iinfo = &(container_of(inode, struct au_icntnr, vfs_inode)->iinfo); -+ nbr = au_sbbot(sb) + 1; -+ if (unlikely(nbr <= 0)) -+ nbr = 1; -+ hi = kmalloc_array(nbr, sizeof(*iinfo->ii_hinode), GFP_NOFS); -+ if (hi) { -+ au_lcnt_inc(&au_sbi(sb)->si_ninodes); -+ -+ iinfo->ii_hinode = hi; -+ for (i = 0; i < nbr; i++, hi++) -+ au_hinode_init(hi); -+ -+ iinfo->ii_generation.ig_generation = au_sigen(sb); -+ iinfo->ii_btop = -1; -+ iinfo->ii_bbot = -1; -+ iinfo->ii_vdir = NULL; -+ return 0; -+ } -+ return -ENOMEM; -+} -+ -+int au_hinode_realloc(struct au_iinfo *iinfo, int nbr, int may_shrink) -+{ -+ int err, i; -+ struct au_hinode *hip; -+ -+ AuRwMustWriteLock(&iinfo->ii_rwsem); -+ -+ err = -ENOMEM; -+ hip = au_krealloc(iinfo->ii_hinode, sizeof(*hip) * nbr, GFP_NOFS, -+ may_shrink); -+ if (hip) { -+ iinfo->ii_hinode = hip; -+ i = iinfo->ii_bbot + 1; -+ hip += i; -+ for (; i < nbr; i++, hip++) -+ au_hinode_init(hip); -+ err = 0; -+ } -+ -+ return err; -+} -+ -+void au_iinfo_fin(struct inode *inode) -+{ -+ struct au_iinfo *iinfo; -+ struct au_hinode *hi; -+ struct super_block *sb; -+ aufs_bindex_t bindex, bbot; -+ const unsigned char unlinked = !inode->i_nlink; -+ -+ AuDebugOn(au_is_bad_inode(inode)); -+ -+ sb = inode->i_sb; -+ au_lcnt_dec(&au_sbi(sb)->si_ninodes); -+ if (si_pid_test(sb)) -+ au_xino_delete_inode(inode, unlinked); -+ else { -+ /* -+ * it is safe to hide the dependency between sbinfo and -+ * sb->s_umount. -+ */ -+ lockdep_off(); -+ si_noflush_read_lock(sb); -+ au_xino_delete_inode(inode, unlinked); -+ si_read_unlock(sb); -+ lockdep_on(); -+ } -+ -+ iinfo = au_ii(inode); -+ if (iinfo->ii_vdir) -+ au_vdir_free(iinfo->ii_vdir); -+ -+ bindex = iinfo->ii_btop; -+ if (bindex >= 0) { -+ hi = au_hinode(iinfo, bindex); -+ bbot = iinfo->ii_bbot; -+ while (bindex++ <= bbot) { -+ if (hi->hi_inode) -+ au_hiput(hi); -+ hi++; -+ } -+ } -+ au_kfree_rcu(iinfo->ii_hinode); -+ AuRwDestroy(&iinfo->ii_rwsem); -+} -diff -Naur null/fs/aufs/inode.c linux-5.15.36/fs/aufs/inode.c ---- /dev/null -+++ linux-5.15.36/fs/aufs/inode.c 2022-05-10 16:51:39.873744219 +0300 -@@ -0,0 +1,531 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program. If not, see . -+ */ -+ -+/* -+ * inode functions -+ */ -+ -+#include -+#include "aufs.h" -+ -+struct inode *au_igrab(struct inode *inode) -+{ -+ if (inode) { -+ AuDebugOn(!atomic_read(&inode->i_count)); -+ ihold(inode); -+ } -+ return inode; -+} -+ -+static void au_refresh_hinode_attr(struct inode *inode, int do_version) -+{ -+ au_cpup_attr_all(inode, /*force*/0); -+ au_update_iigen(inode, /*half*/1); -+ if (do_version) -+ inode_inc_iversion(inode); -+} -+ -+static int au_ii_refresh(struct inode *inode, int *update) -+{ -+ int err, e, nbr; -+ umode_t type; -+ aufs_bindex_t bindex, new_bindex; -+ struct super_block *sb; -+ struct au_iinfo *iinfo; -+ struct au_hinode *p, *q, tmp; -+ -+ AuDebugOn(au_is_bad_inode(inode)); -+ IiMustWriteLock(inode); -+ -+ *update = 0; -+ sb = inode->i_sb; -+ nbr = au_sbbot(sb) + 1; -+ type = inode->i_mode & S_IFMT; -+ iinfo = au_ii(inode); -+ err = au_hinode_realloc(iinfo, nbr, /*may_shrink*/0); -+ if (unlikely(err)) -+ goto out; -+ -+ AuDebugOn(iinfo->ii_btop < 0); -+ p = au_hinode(iinfo, iinfo->ii_btop); -+ for (bindex = iinfo->ii_btop; bindex <= iinfo->ii_bbot; -+ bindex++, p++) { -+ if (!p->hi_inode) -+ continue; -+ -+ AuDebugOn(type != (p->hi_inode->i_mode & S_IFMT)); -+ new_bindex = au_br_index(sb, p->hi_id); -+ if (new_bindex == bindex) -+ continue; -+ -+ if (new_bindex < 0) { -+ *update = 1; -+ au_hiput(p); -+ p->hi_inode = NULL; -+ continue; -+ } -+ -+ if (new_bindex < iinfo->ii_btop) -+ iinfo->ii_btop = new_bindex; -+ if (iinfo->ii_bbot < new_bindex) -+ iinfo->ii_bbot = new_bindex; -+ /* swap two lower inode, and loop again */ -+ q = au_hinode(iinfo, new_bindex); -+ tmp = *q; -+ *q = *p; -+ *p = tmp; -+ if (tmp.hi_inode) { -+ bindex--; -+ p--; -+ } -+ } -+ au_update_ibrange(inode, /*do_put_zero*/0); -+ au_hinode_realloc(iinfo, nbr, /*may_shrink*/1); /* harmless if err */ -+ e = au_dy_irefresh(inode); -+ if (unlikely(e && !err)) -+ err = e; -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+void au_refresh_iop(struct inode *inode, int force_getattr) -+{ -+ int type; -+ struct au_sbinfo *sbi = au_sbi(inode->i_sb); -+ const struct inode_operations *iop -+ = force_getattr ? aufs_iop : sbi->si_iop_array; -+ -+ if (inode->i_op == iop) -+ return; -+ -+ switch (inode->i_mode & S_IFMT) { -+ case S_IFDIR: -+ type = AuIop_DIR; -+ break; -+ case S_IFLNK: -+ type = AuIop_SYMLINK; -+ break; -+ default: -+ type = AuIop_OTHER; -+ break; -+ } -+ -+ inode->i_op = iop + type; -+ /* unnecessary smp_wmb() */ -+} -+ -+int au_refresh_hinode_self(struct inode *inode) -+{ -+ int err, update; -+ -+ err = au_ii_refresh(inode, &update); -+ if (!err) -+ au_refresh_hinode_attr(inode, update && S_ISDIR(inode->i_mode)); -+ -+ AuTraceErr(err); -+ return err; -+} -+ -+int au_refresh_hinode(struct inode *inode, struct dentry *dentry) -+{ -+ int err, e, update; -+ unsigned int flags; -+ umode_t mode; -+ aufs_bindex_t bindex, bbot; -+ unsigned char isdir; -+ struct au_hinode *p; -+ struct au_iinfo *iinfo; -+ -+ err = au_ii_refresh(inode, &update); -+ if (unlikely(err)) -+ goto out; -+ -+ update = 0; -+ iinfo = au_ii(inode); -+ p = au_hinode(iinfo, iinfo->ii_btop); -+ mode = (inode->i_mode & S_IFMT); -+ isdir = S_ISDIR(mode); -+ flags = au_hi_flags(inode, isdir); -+ bbot = au_dbbot(dentry); -+ for (bindex = au_dbtop(dentry); bindex <= bbot; bindex++) { -+ struct inode *h_i, *h_inode; -+ struct dentry *h_d; -+ -+ h_d = au_h_dptr(dentry, bindex); -+ if (!h_d || d_is_negative(h_d)) -+ continue; -+ -+ h_inode = d_inode(h_d); -+ AuDebugOn(mode != (h_inode->i_mode & S_IFMT)); -+ if (iinfo->ii_btop <= bindex && bindex <= iinfo->ii_bbot) { -+ h_i = au_h_iptr(inode, bindex); -+ if (h_i) { -+ if (h_i == h_inode) -+ continue; -+ err = -EIO; -+ break; -+ } -+ } -+ if (bindex < iinfo->ii_btop) -+ iinfo->ii_btop = bindex; -+ if (iinfo->ii_bbot < bindex) -+ iinfo->ii_bbot = bindex; -+ au_set_h_iptr(inode, bindex, au_igrab(h_inode), flags); -+ update = 1; -+ } -+ au_update_ibrange(inode, /*do_put_zero*/0); -+ e = au_dy_irefresh(inode); -+ if (unlikely(e && !err)) -+ err = e; -+ if (!err) -+ au_refresh_hinode_attr(inode, update && isdir); -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+static int set_inode(struct inode *inode, struct dentry *dentry) -+{ -+ int err; -+ unsigned int flags; -+ umode_t mode; -+ aufs_bindex_t bindex, btop, btail; -+ unsigned char isdir; -+ struct dentry *h_dentry; -+ struct inode *h_inode; -+ struct au_iinfo *iinfo; -+ const struct inode_operations *iop; -+ -+ IiMustWriteLock(inode); -+ -+ err = 0; -+ isdir = 0; -+ iop = au_sbi(inode->i_sb)->si_iop_array; -+ btop = au_dbtop(dentry); -+ h_dentry = au_h_dptr(dentry, btop); -+ h_inode = d_inode(h_dentry); -+ mode = h_inode->i_mode; -+ switch (mode & S_IFMT) { -+ case S_IFREG: -+ btail = au_dbtail(dentry); -+ inode->i_op = iop + AuIop_OTHER; -+ inode->i_fop = &aufs_file_fop; -+ err = au_dy_iaop(inode, btop, h_inode); -+ if (unlikely(err)) -+ goto out; -+ break; -+ case S_IFDIR: -+ isdir = 1; -+ btail = au_dbtaildir(dentry); -+ inode->i_op = iop + AuIop_DIR; -+ inode->i_fop = &aufs_dir_fop; -+ break; -+ case S_IFLNK: -+ btail = au_dbtail(dentry); -+ inode->i_op = iop + AuIop_SYMLINK; -+ break; -+ case S_IFBLK: -+ case S_IFCHR: -+ case S_IFIFO: -+ case S_IFSOCK: -+ btail = au_dbtail(dentry); -+ inode->i_op = iop + AuIop_OTHER; -+ init_special_inode(inode, mode, h_inode->i_rdev); -+ break; -+ default: -+ AuIOErr("Unknown file type 0%o\n", mode); -+ err = -EIO; -+ goto out; -+ } -+ -+ /* do not set hnotify for whiteouted dirs (SHWH mode) */ -+ flags = au_hi_flags(inode, isdir); -+ if (au_opt_test(au_mntflags(dentry->d_sb), SHWH) -+ && au_ftest_hi(flags, HNOTIFY) -+ && dentry->d_name.len > AUFS_WH_PFX_LEN -+ && !memcmp(dentry->d_name.name, AUFS_WH_PFX, AUFS_WH_PFX_LEN)) -+ au_fclr_hi(flags, HNOTIFY); -+ iinfo = au_ii(inode); -+ iinfo->ii_btop = btop; -+ iinfo->ii_bbot = btail; -+ for (bindex = btop; bindex <= btail; bindex++) { -+ h_dentry = au_h_dptr(dentry, bindex); -+ if (h_dentry) -+ au_set_h_iptr(inode, bindex, -+ au_igrab(d_inode(h_dentry)), flags); -+ } -+ au_cpup_attr_all(inode, /*force*/1); -+ /* -+ * to force calling aufs_get_acl() every time, -+ * do not call cache_no_acl() for aufs inode. -+ */ -+ -+out: -+ return err; -+} -+ -+/* -+ * successful returns with iinfo write_locked -+ * minus: errno -+ * zero: success, matched -+ * plus: no error, but unmatched -+ */ -+static int reval_inode(struct inode *inode, struct dentry *dentry) -+{ -+ int err; -+ unsigned int gen, igflags; -+ aufs_bindex_t bindex, bbot; -+ struct inode *h_inode, *h_dinode; -+ struct dentry *h_dentry; -+ -+ /* -+ * before this function, if aufs got any iinfo lock, it must be only -+ * one, the parent dir. -+ * it can happen by UDBA and the obsoleted inode number. -+ */ -+ err = -EIO; -+ if (unlikely(inode->i_ino == parent_ino(dentry))) -+ goto out; -+ -+ err = 1; -+ ii_write_lock_new_child(inode); -+ h_dentry = au_h_dptr(dentry, au_dbtop(dentry)); -+ h_dinode = d_inode(h_dentry); -+ bbot = au_ibbot(inode); -+ for (bindex = au_ibtop(inode); bindex <= bbot; bindex++) { -+ h_inode = au_h_iptr(inode, bindex); -+ if (!h_inode || h_inode != h_dinode) -+ continue; -+ -+ err = 0; -+ gen = au_iigen(inode, &igflags); -+ if (gen == au_digen(dentry) -+ && !au_ig_ftest(igflags, HALF_REFRESHED)) -+ break; -+ -+ /* fully refresh inode using dentry */ -+ err = au_refresh_hinode(inode, dentry); -+ if (!err) -+ au_update_iigen(inode, /*half*/0); -+ break; -+ } -+ -+ if (unlikely(err)) -+ ii_write_unlock(inode); -+out: -+ return err; -+} -+ -+int au_ino(struct super_block *sb, aufs_bindex_t bindex, ino_t h_ino, -+ unsigned int d_type, ino_t *ino) -+{ -+ int err, idx; -+ const int isnondir = d_type != DT_DIR; -+ -+ /* prevent hardlinked inode number from race condition */ -+ if (isnondir) { -+ err = au_xinondir_enter(sb, bindex, h_ino, &idx); -+ if (unlikely(err)) -+ goto out; -+ } -+ -+ err = au_xino_read(sb, bindex, h_ino, ino); -+ if (unlikely(err)) -+ goto out_xinondir; -+ -+ if (!*ino) { -+ err = -EIO; -+ *ino = au_xino_new_ino(sb); -+ if (unlikely(!*ino)) -+ goto out_xinondir; -+ err = au_xino_write(sb, bindex, h_ino, *ino); -+ if (unlikely(err)) -+ goto out_xinondir; -+ } -+ -+out_xinondir: -+ if (isnondir && idx >= 0) -+ au_xinondir_leave(sb, bindex, h_ino, idx); -+out: -+ return err; -+} -+ -+/* successful returns with iinfo write_locked */ -+/* todo: return with unlocked? */ -+struct inode *au_new_inode(struct dentry *dentry, int must_new) -+{ -+ struct inode *inode, *h_inode; -+ struct dentry *h_dentry; -+ struct super_block *sb; -+ ino_t h_ino, ino; -+ int err, idx, hlinked; -+ aufs_bindex_t btop; -+ -+ sb = dentry->d_sb; -+ btop = au_dbtop(dentry); -+ h_dentry = au_h_dptr(dentry, btop); -+ h_inode = d_inode(h_dentry); -+ h_ino = h_inode->i_ino; -+ hlinked = !d_is_dir(h_dentry) && h_inode->i_nlink > 1; -+ -+new_ino: -+ /* -+ * stop 'race'-ing between hardlinks under different -+ * parents. -+ */ -+ if (hlinked) { -+ err = au_xinondir_enter(sb, btop, h_ino, &idx); -+ inode = ERR_PTR(err); -+ if (unlikely(err)) -+ goto out; -+ } -+ -+ err = au_xino_read(sb, btop, h_ino, &ino); -+ inode = ERR_PTR(err); -+ if (unlikely(err)) -+ goto out_xinondir; -+ -+ if (!ino) { -+ ino = au_xino_new_ino(sb); -+ if (unlikely(!ino)) { -+ inode = ERR_PTR(-EIO); -+ goto out_xinondir; -+ } -+ } -+ -+ AuDbg("i%lu\n", (unsigned long)ino); -+ inode = au_iget_locked(sb, ino); -+ err = PTR_ERR(inode); -+ if (IS_ERR(inode)) -+ goto out_xinondir; -+ -+ AuDbg("%lx, new %d\n", inode->i_state, !!(inode->i_state & I_NEW)); -+ if (inode->i_state & I_NEW) { -+ ii_write_lock_new_child(inode); -+ err = set_inode(inode, dentry); -+ if (!err) { -+ unlock_new_inode(inode); -+ goto out_xinondir; /* success */ -+ } -+ -+ /* -+ * iget_failed() calls iput(), but we need to call -+ * ii_write_unlock() after iget_failed(). so dirty hack for -+ * i_count. -+ */ -+ atomic_inc(&inode->i_count); -+ iget_failed(inode); -+ ii_write_unlock(inode); -+ au_xino_write(sb, btop, h_ino, /*ino*/0); -+ /* ignore this error */ -+ goto out_iput; -+ } else if (!must_new && !IS_DEADDIR(inode) && inode->i_nlink) { -+ /* -+ * horrible race condition between lookup, readdir and copyup -+ * (or something). -+ */ -+ if (hlinked && idx >= 0) -+ au_xinondir_leave(sb, btop, h_ino, idx); -+ err = reval_inode(inode, dentry); -+ if (unlikely(err < 0)) { -+ hlinked = 0; -+ goto out_iput; -+ } -+ if (!err) -+ goto out; /* success */ -+ else if (hlinked && idx >= 0) { -+ err = au_xinondir_enter(sb, btop, h_ino, &idx); -+ if (unlikely(err)) { -+ iput(inode); -+ inode = ERR_PTR(err); -+ goto out; -+ } -+ } -+ } -+ -+ if (unlikely(au_test_fs_unique_ino(h_inode))) -+ AuWarn1("Warning: Un-notified UDBA or repeatedly renamed dir," -+ " b%d, %s, %pd, hi%lu, i%lu.\n", -+ btop, au_sbtype(h_dentry->d_sb), dentry, -+ (unsigned long)h_ino, (unsigned long)ino); -+ ino = 0; -+ err = au_xino_write(sb, btop, h_ino, /*ino*/0); -+ if (!err) { -+ iput(inode); -+ if (hlinked && idx >= 0) -+ au_xinondir_leave(sb, btop, h_ino, idx); -+ goto new_ino; -+ } -+ -+out_iput: -+ iput(inode); -+ inode = ERR_PTR(err); -+out_xinondir: -+ if (hlinked && idx >= 0) -+ au_xinondir_leave(sb, btop, h_ino, idx); -+out: -+ return inode; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+int au_test_ro(struct super_block *sb, aufs_bindex_t bindex, -+ struct inode *inode) -+{ -+ int err; -+ struct inode *hi; -+ -+ err = au_br_rdonly(au_sbr(sb, bindex)); -+ -+ /* pseudo-link after flushed may happen out of bounds */ -+ if (!err -+ && inode -+ && au_ibtop(inode) <= bindex -+ && bindex <= au_ibbot(inode)) { -+ /* -+ * permission check is unnecessary since vfsub routine -+ * will be called later -+ */ -+ hi = au_h_iptr(inode, bindex); -+ if (hi) -+ err = IS_IMMUTABLE(hi) ? -EROFS : 0; -+ } -+ -+ return err; -+} -+ -+int au_test_h_perm(struct user_namespace *h_userns, struct inode *h_inode, -+ int mask) -+{ -+ if (uid_eq(current_fsuid(), GLOBAL_ROOT_UID)) -+ return 0; -+ return inode_permission(h_userns, h_inode, mask); -+} -+ -+int au_test_h_perm_sio(struct user_namespace *h_userns, struct inode *h_inode, -+ int mask) -+{ -+ if (au_test_nfs(h_inode->i_sb) -+ && (mask & MAY_WRITE) -+ && S_ISDIR(h_inode->i_mode)) -+ mask |= MAY_READ; /* force permission check */ -+ return au_test_h_perm(h_userns, h_inode, mask); -+} -diff -Naur null/fs/aufs/inode.h linux-5.15.36/fs/aufs/inode.h ---- /dev/null -+++ linux-5.15.36/fs/aufs/inode.h 2022-05-10 16:51:39.873744219 +0300 -@@ -0,0 +1,705 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program. If not, see . -+ */ -+ -+/* -+ * inode operations -+ */ -+ -+#ifndef __AUFS_INODE_H__ -+#define __AUFS_INODE_H__ -+ -+#ifdef __KERNEL__ -+ -+#include -+#include "rwsem.h" -+ -+struct vfsmount; -+ -+struct au_hnotify { -+#ifdef CONFIG_AUFS_HNOTIFY -+#ifdef CONFIG_AUFS_HFSNOTIFY -+ /* never use fsnotify_add_vfsmount_mark() */ -+ struct fsnotify_mark hn_mark; -+#endif -+ struct inode *hn_aufs_inode; /* no get/put */ -+ struct rcu_head rcu; -+#endif -+} ____cacheline_aligned_in_smp; -+ -+struct au_hinode { -+ struct inode *hi_inode; -+ aufs_bindex_t hi_id; -+#ifdef CONFIG_AUFS_HNOTIFY -+ struct au_hnotify *hi_notify; -+#endif -+ -+ /* reference to the copied-up whiteout with get/put */ -+ struct dentry *hi_whdentry; -+}; -+ -+/* ig_flags */ -+#define AuIG_HALF_REFRESHED 1 -+#define au_ig_ftest(flags, name) ((flags) & AuIG_##name) -+#define au_ig_fset(flags, name) \ -+ do { (flags) |= AuIG_##name; } while (0) -+#define au_ig_fclr(flags, name) \ -+ do { (flags) &= ~AuIG_##name; } while (0) -+ -+struct au_iigen { -+ spinlock_t ig_spin; -+ __u32 ig_generation, ig_flags; -+}; -+ -+struct au_vdir; -+struct au_iinfo { -+ struct au_iigen ii_generation; -+ struct super_block *ii_hsb1; /* no get/put */ -+ -+ struct au_rwsem ii_rwsem; -+ aufs_bindex_t ii_btop, ii_bbot; -+ __u32 ii_higen; -+ struct au_hinode *ii_hinode; -+ struct au_vdir *ii_vdir; -+}; -+ -+struct au_icntnr { -+ struct au_iinfo iinfo; -+ struct inode vfs_inode; -+ struct hlist_bl_node plink; -+ struct rcu_head rcu; -+} ____cacheline_aligned_in_smp; -+ -+/* au_pin flags */ -+#define AuPin_DI_LOCKED 1 -+#define AuPin_MNT_WRITE (1 << 1) -+#define au_ftest_pin(flags, name) ((flags) & AuPin_##name) -+#define au_fset_pin(flags, name) \ -+ do { (flags) |= AuPin_##name; } while (0) -+#define au_fclr_pin(flags, name) \ -+ do { (flags) &= ~AuPin_##name; } while (0) -+ -+struct au_pin { -+ /* input */ -+ struct dentry *dentry; -+ unsigned int udba; -+ unsigned char lsc_di, lsc_hi, flags; -+ aufs_bindex_t bindex; -+ -+ /* output */ -+ struct dentry *parent; -+ struct au_hinode *hdir; -+ struct vfsmount *h_mnt; -+ -+ /* temporary unlock/relock for copyup */ -+ struct dentry *h_dentry, *h_parent; -+ struct au_branch *br; -+ struct task_struct *task; -+}; -+ -+void au_pin_hdir_unlock(struct au_pin *p); -+int au_pin_hdir_lock(struct au_pin *p); -+int au_pin_hdir_relock(struct au_pin *p); -+void au_pin_hdir_acquire_nest(struct au_pin *p); -+void au_pin_hdir_release(struct au_pin *p); -+ -+/* ---------------------------------------------------------------------- */ -+ -+static inline struct au_iinfo *au_ii(struct inode *inode) -+{ -+ BUG_ON(is_bad_inode(inode)); -+ return &(container_of(inode, struct au_icntnr, vfs_inode)->iinfo); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* inode.c */ -+struct inode *au_igrab(struct inode *inode); -+void au_refresh_iop(struct inode *inode, int force_getattr); -+int au_refresh_hinode_self(struct inode *inode); -+int au_refresh_hinode(struct inode *inode, struct dentry *dentry); -+int au_ino(struct super_block *sb, aufs_bindex_t bindex, ino_t h_ino, -+ unsigned int d_type, ino_t *ino); -+struct inode *au_new_inode(struct dentry *dentry, int must_new); -+int au_test_ro(struct super_block *sb, aufs_bindex_t bindex, -+ struct inode *inode); -+int au_test_h_perm(struct user_namespace *h_userns, struct inode *h_inode, -+ int mask); -+int au_test_h_perm_sio(struct user_namespace *h_userns, struct inode *h_inode, -+ int mask); -+ -+static inline int au_wh_ino(struct super_block *sb, aufs_bindex_t bindex, -+ ino_t h_ino, unsigned int d_type, ino_t *ino) -+{ -+#ifdef CONFIG_AUFS_SHWH -+ return au_ino(sb, bindex, h_ino, d_type, ino); -+#else -+ return 0; -+#endif -+} -+ -+/* i_op.c */ -+enum { -+ AuIop_SYMLINK, -+ AuIop_DIR, -+ AuIop_OTHER, -+ AuIop_Last -+}; -+extern struct inode_operations aufs_iop[AuIop_Last], /* not const */ -+ aufs_iop_nogetattr[AuIop_Last]; -+ -+/* au_wr_dir flags */ -+#define AuWrDir_ADD_ENTRY 1 -+#define AuWrDir_ISDIR (1 << 1) -+#define AuWrDir_TMPFILE (1 << 2) -+#define au_ftest_wrdir(flags, name) ((flags) & AuWrDir_##name) -+#define au_fset_wrdir(flags, name) \ -+ do { (flags) |= AuWrDir_##name; } while (0) -+#define au_fclr_wrdir(flags, name) \ -+ do { (flags) &= ~AuWrDir_##name; } while (0) -+ -+struct au_wr_dir_args { -+ aufs_bindex_t force_btgt; -+ unsigned char flags; -+}; -+int au_wr_dir(struct dentry *dentry, struct dentry *src_dentry, -+ struct au_wr_dir_args *args); -+ -+struct dentry *au_pinned_h_parent(struct au_pin *pin); -+void au_pin_init(struct au_pin *pin, struct dentry *dentry, -+ aufs_bindex_t bindex, int lsc_di, int lsc_hi, -+ unsigned int udba, unsigned char flags); -+int au_pin(struct au_pin *pin, struct dentry *dentry, aufs_bindex_t bindex, -+ unsigned int udba, unsigned char flags) __must_check; -+int au_do_pin(struct au_pin *pin) __must_check; -+void au_unpin(struct au_pin *pin); -+int au_reval_for_attr(struct dentry *dentry, unsigned int sigen); -+ -+#define AuIcpup_DID_CPUP 1 -+#define au_ftest_icpup(flags, name) ((flags) & AuIcpup_##name) -+#define au_fset_icpup(flags, name) \ -+ do { (flags) |= AuIcpup_##name; } while (0) -+#define au_fclr_icpup(flags, name) \ -+ do { (flags) &= ~AuIcpup_##name; } while (0) -+ -+struct au_icpup_args { -+ unsigned char flags; -+ unsigned char pin_flags; -+ aufs_bindex_t btgt; -+ unsigned int udba; -+ struct au_pin pin; -+ struct path h_path; -+ struct inode *h_inode; -+}; -+ -+int au_pin_and_icpup(struct dentry *dentry, struct iattr *ia, -+ struct au_icpup_args *a); -+ -+int au_h_path_getattr(struct dentry *dentry, struct inode *inode, int force, -+ struct path *h_path, int locked); -+ -+/* i_op_add.c */ -+int au_may_add(struct dentry *dentry, aufs_bindex_t bindex, -+ struct dentry *h_parent, int isdir); -+int aufs_mknod(struct user_namespace *userns, struct inode *dir, -+ struct dentry *dentry, umode_t mode, dev_t dev); -+int aufs_symlink(struct user_namespace *userns, struct inode *dir, -+ struct dentry *dentry, const char *symname); -+int aufs_create(struct user_namespace *userns, struct inode *dir, -+ struct dentry *dentry, umode_t mode, bool want_excl); -+struct vfsub_aopen_args; -+int au_aopen_or_create(struct inode *dir, struct dentry *dentry, -+ struct vfsub_aopen_args *args); -+int aufs_tmpfile(struct user_namespace *userns, struct inode *dir, -+ struct dentry *dentry, umode_t mode); -+int aufs_link(struct dentry *src_dentry, struct inode *dir, -+ struct dentry *dentry); -+int aufs_mkdir(struct user_namespace *userns, struct inode *dir, -+ struct dentry *dentry, umode_t mode); -+ -+/* i_op_del.c */ -+int au_wr_dir_need_wh(struct dentry *dentry, int isdir, aufs_bindex_t *bcpup); -+int au_may_del(struct dentry *dentry, aufs_bindex_t bindex, -+ struct dentry *h_parent, int isdir); -+int aufs_unlink(struct inode *dir, struct dentry *dentry); -+int aufs_rmdir(struct inode *dir, struct dentry *dentry); -+ -+/* i_op_ren.c */ -+int au_wbr(struct dentry *dentry, aufs_bindex_t btgt); -+int aufs_rename(struct user_namespace *userns, -+ struct inode *_src_dir, struct dentry *_src_dentry, -+ struct inode *_dst_dir, struct dentry *_dst_dentry, -+ unsigned int _flags); -+ -+/* iinfo.c */ -+struct inode *au_h_iptr(struct inode *inode, aufs_bindex_t bindex); -+void au_hiput(struct au_hinode *hinode); -+void au_set_hi_wh(struct inode *inode, aufs_bindex_t bindex, -+ struct dentry *h_wh); -+unsigned int au_hi_flags(struct inode *inode, int isdir); -+ -+/* hinode flags */ -+#define AuHi_XINO 1 -+#define AuHi_HNOTIFY (1 << 1) -+#define au_ftest_hi(flags, name) ((flags) & AuHi_##name) -+#define au_fset_hi(flags, name) \ -+ do { (flags) |= AuHi_##name; } while (0) -+#define au_fclr_hi(flags, name) \ -+ do { (flags) &= ~AuHi_##name; } while (0) -+ -+#ifndef CONFIG_AUFS_HNOTIFY -+#undef AuHi_HNOTIFY -+#define AuHi_HNOTIFY 0 -+#endif -+ -+void au_set_h_iptr(struct inode *inode, aufs_bindex_t bindex, -+ struct inode *h_inode, unsigned int flags); -+ -+void au_update_iigen(struct inode *inode, int half); -+void au_update_ibrange(struct inode *inode, int do_put_zero); -+ -+void au_icntnr_init_once(void *_c); -+void au_hinode_init(struct au_hinode *hinode); -+int au_iinfo_init(struct inode *inode); -+void au_iinfo_fin(struct inode *inode); -+int au_hinode_realloc(struct au_iinfo *iinfo, int nbr, int may_shrink); -+ -+#ifdef CONFIG_PROC_FS -+/* plink.c */ -+int au_plink_maint(struct super_block *sb, int flags); -+struct au_sbinfo; -+void au_plink_maint_leave(struct au_sbinfo *sbinfo); -+int au_plink_maint_enter(struct super_block *sb); -+#ifdef CONFIG_AUFS_DEBUG -+void au_plink_list(struct super_block *sb); -+#else -+AuStubVoid(au_plink_list, struct super_block *sb) -+#endif -+int au_plink_test(struct inode *inode); -+struct dentry *au_plink_lkup(struct inode *inode, aufs_bindex_t bindex); -+void au_plink_append(struct inode *inode, aufs_bindex_t bindex, -+ struct dentry *h_dentry); -+void au_plink_put(struct super_block *sb, int verbose); -+void au_plink_clean(struct super_block *sb, int verbose); -+void au_plink_half_refresh(struct super_block *sb, aufs_bindex_t br_id); -+#else -+AuStubInt0(au_plink_maint, struct super_block *sb, int flags); -+AuStubVoid(au_plink_maint_leave, struct au_sbinfo *sbinfo); -+AuStubInt0(au_plink_maint_enter, struct super_block *sb); -+AuStubVoid(au_plink_list, struct super_block *sb); -+AuStubInt0(au_plink_test, struct inode *inode); -+AuStub(struct dentry *, au_plink_lkup, return NULL, -+ struct inode *inode, aufs_bindex_t bindex); -+AuStubVoid(au_plink_append, struct inode *inode, aufs_bindex_t bindex, -+ struct dentry *h_dentry); -+AuStubVoid(au_plink_put, struct super_block *sb, int verbose); -+AuStubVoid(au_plink_clean, struct super_block *sb, int verbose); -+AuStubVoid(au_plink_half_refresh, struct super_block *sb, aufs_bindex_t br_id); -+#endif /* CONFIG_PROC_FS */ -+ -+#ifdef CONFIG_AUFS_XATTR -+/* xattr.c */ -+int au_cpup_xattr(struct path *h_dst, struct path *h_src, int ignore_flags, -+ unsigned int verbose); -+ssize_t aufs_listxattr(struct dentry *dentry, char *list, size_t size); -+void au_xattr_init(struct super_block *sb); -+#else -+AuStubInt0(au_cpup_xattr, struct path *h_dst, struct path *h_src, -+ int ignore_flags, unsigned int verbose); -+AuStubVoid(au_xattr_init, struct super_block *sb); -+#endif -+ -+#ifdef CONFIG_FS_POSIX_ACL -+struct posix_acl *aufs_get_acl(struct inode *inode, int type, bool rcu); -+int aufs_set_acl(struct user_namespace *userns, struct inode *inode, -+ struct posix_acl *acl, int type); -+#endif -+ -+#if IS_ENABLED(CONFIG_AUFS_XATTR) || IS_ENABLED(CONFIG_FS_POSIX_ACL) -+enum { -+ AU_XATTR_SET, -+ AU_ACL_SET -+}; -+ -+struct au_sxattr { -+ int type; -+ union { -+ struct { -+ const char *name; -+ const void *value; -+ size_t size; -+ int flags; -+ } set; -+ struct { -+ struct posix_acl *acl; -+ int type; -+ } acl_set; -+ } u; -+}; -+ssize_t au_sxattr(struct dentry *dentry, struct inode *inode, -+ struct au_sxattr *arg); -+#endif -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* lock subclass for iinfo */ -+enum { -+ AuLsc_II_CHILD, /* child first */ -+ AuLsc_II_CHILD2, /* rename(2), link(2), and cpup at hnotify */ -+ AuLsc_II_CHILD3, /* copyup dirs */ -+ AuLsc_II_PARENT, /* see AuLsc_I_PARENT in vfsub.h */ -+ AuLsc_II_PARENT2, -+ AuLsc_II_PARENT3, /* copyup dirs */ -+ AuLsc_II_NEW_CHILD -+}; -+ -+/* -+ * ii_read_lock_child, ii_write_lock_child, -+ * ii_read_lock_child2, ii_write_lock_child2, -+ * ii_read_lock_child3, ii_write_lock_child3, -+ * ii_read_lock_parent, ii_write_lock_parent, -+ * ii_read_lock_parent2, ii_write_lock_parent2, -+ * ii_read_lock_parent3, ii_write_lock_parent3, -+ * ii_read_lock_new_child, ii_write_lock_new_child, -+ */ -+#define AuReadLockFunc(name, lsc) \ -+static inline void ii_read_lock_##name(struct inode *i) \ -+{ \ -+ au_rw_read_lock_nested(&au_ii(i)->ii_rwsem, AuLsc_II_##lsc); \ -+} -+ -+#define AuWriteLockFunc(name, lsc) \ -+static inline void ii_write_lock_##name(struct inode *i) \ -+{ \ -+ au_rw_write_lock_nested(&au_ii(i)->ii_rwsem, AuLsc_II_##lsc); \ -+} -+ -+#define AuRWLockFuncs(name, lsc) \ -+ AuReadLockFunc(name, lsc) \ -+ AuWriteLockFunc(name, lsc) -+ -+AuRWLockFuncs(child, CHILD); -+AuRWLockFuncs(child2, CHILD2); -+AuRWLockFuncs(child3, CHILD3); -+AuRWLockFuncs(parent, PARENT); -+AuRWLockFuncs(parent2, PARENT2); -+AuRWLockFuncs(parent3, PARENT3); -+AuRWLockFuncs(new_child, NEW_CHILD); -+ -+#undef AuReadLockFunc -+#undef AuWriteLockFunc -+#undef AuRWLockFuncs -+ -+#define ii_read_unlock(i) au_rw_read_unlock(&au_ii(i)->ii_rwsem) -+#define ii_write_unlock(i) au_rw_write_unlock(&au_ii(i)->ii_rwsem) -+#define ii_downgrade_lock(i) au_rw_dgrade_lock(&au_ii(i)->ii_rwsem) -+ -+#define IiMustNoWaiters(i) AuRwMustNoWaiters(&au_ii(i)->ii_rwsem) -+#define IiMustAnyLock(i) AuRwMustAnyLock(&au_ii(i)->ii_rwsem) -+#define IiMustWriteLock(i) AuRwMustWriteLock(&au_ii(i)->ii_rwsem) -+ -+/* ---------------------------------------------------------------------- */ -+ -+static inline void au_icntnr_init(struct au_icntnr *c) -+{ -+#ifdef CONFIG_AUFS_DEBUG -+ c->vfs_inode.i_mode = 0; -+#endif -+} -+ -+static inline unsigned int au_iigen(struct inode *inode, unsigned int *igflags) -+{ -+ unsigned int gen; -+ struct au_iinfo *iinfo; -+ struct au_iigen *iigen; -+ -+ iinfo = au_ii(inode); -+ iigen = &iinfo->ii_generation; -+ spin_lock(&iigen->ig_spin); -+ if (igflags) -+ *igflags = iigen->ig_flags; -+ gen = iigen->ig_generation; -+ spin_unlock(&iigen->ig_spin); -+ -+ return gen; -+} -+ -+/* tiny test for inode number */ -+/* tmpfs generation is too rough */ -+static inline int au_test_higen(struct inode *inode, struct inode *h_inode) -+{ -+ struct au_iinfo *iinfo; -+ -+ iinfo = au_ii(inode); -+ AuRwMustAnyLock(&iinfo->ii_rwsem); -+ return !(iinfo->ii_hsb1 == h_inode->i_sb -+ && iinfo->ii_higen == h_inode->i_generation); -+} -+ -+static inline void au_iigen_dec(struct inode *inode) -+{ -+ struct au_iinfo *iinfo; -+ struct au_iigen *iigen; -+ -+ iinfo = au_ii(inode); -+ iigen = &iinfo->ii_generation; -+ spin_lock(&iigen->ig_spin); -+ iigen->ig_generation--; -+ spin_unlock(&iigen->ig_spin); -+} -+ -+static inline int au_iigen_test(struct inode *inode, unsigned int sigen) -+{ -+ int err; -+ -+ err = 0; -+ if (unlikely(inode && au_iigen(inode, NULL) != sigen)) -+ err = -EIO; -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static inline struct au_hinode *au_hinode(struct au_iinfo *iinfo, -+ aufs_bindex_t bindex) -+{ -+ return iinfo->ii_hinode + bindex; -+} -+ -+static inline int au_is_bad_inode(struct inode *inode) -+{ -+ return !!(is_bad_inode(inode) || !au_hinode(au_ii(inode), 0)); -+} -+ -+static inline aufs_bindex_t au_ii_br_id(struct inode *inode, -+ aufs_bindex_t bindex) -+{ -+ IiMustAnyLock(inode); -+ return au_hinode(au_ii(inode), bindex)->hi_id; -+} -+ -+static inline aufs_bindex_t au_ibtop(struct inode *inode) -+{ -+ IiMustAnyLock(inode); -+ return au_ii(inode)->ii_btop; -+} -+ -+static inline aufs_bindex_t au_ibbot(struct inode *inode) -+{ -+ IiMustAnyLock(inode); -+ return au_ii(inode)->ii_bbot; -+} -+ -+static inline struct au_vdir *au_ivdir(struct inode *inode) -+{ -+ IiMustAnyLock(inode); -+ return au_ii(inode)->ii_vdir; -+} -+ -+static inline struct dentry *au_hi_wh(struct inode *inode, aufs_bindex_t bindex) -+{ -+ IiMustAnyLock(inode); -+ return au_hinode(au_ii(inode), bindex)->hi_whdentry; -+} -+ -+static inline void au_set_ibtop(struct inode *inode, aufs_bindex_t bindex) -+{ -+ IiMustWriteLock(inode); -+ au_ii(inode)->ii_btop = bindex; -+} -+ -+static inline void au_set_ibbot(struct inode *inode, aufs_bindex_t bindex) -+{ -+ IiMustWriteLock(inode); -+ au_ii(inode)->ii_bbot = bindex; -+} -+ -+static inline void au_set_ivdir(struct inode *inode, struct au_vdir *vdir) -+{ -+ IiMustWriteLock(inode); -+ au_ii(inode)->ii_vdir = vdir; -+} -+ -+static inline struct au_hinode *au_hi(struct inode *inode, aufs_bindex_t bindex) -+{ -+ IiMustAnyLock(inode); -+ return au_hinode(au_ii(inode), bindex); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static inline struct dentry *au_pinned_parent(struct au_pin *pin) -+{ -+ if (pin) -+ return pin->parent; -+ return NULL; -+} -+ -+static inline struct inode *au_pinned_h_dir(struct au_pin *pin) -+{ -+ if (pin && pin->hdir) -+ return pin->hdir->hi_inode; -+ return NULL; -+} -+ -+static inline struct au_hinode *au_pinned_hdir(struct au_pin *pin) -+{ -+ if (pin) -+ return pin->hdir; -+ return NULL; -+} -+ -+static inline void au_pin_set_dentry(struct au_pin *pin, struct dentry *dentry) -+{ -+ if (pin) -+ pin->dentry = dentry; -+} -+ -+static inline void au_pin_set_parent_lflag(struct au_pin *pin, -+ unsigned char lflag) -+{ -+ if (pin) { -+ if (lflag) -+ au_fset_pin(pin->flags, DI_LOCKED); -+ else -+ au_fclr_pin(pin->flags, DI_LOCKED); -+ } -+} -+ -+#if 0 /* reserved */ -+static inline void au_pin_set_parent(struct au_pin *pin, struct dentry *parent) -+{ -+ if (pin) { -+ dput(pin->parent); -+ pin->parent = dget(parent); -+ } -+} -+#endif -+ -+/* ---------------------------------------------------------------------- */ -+ -+struct au_branch; -+#ifdef CONFIG_AUFS_HNOTIFY -+struct au_hnotify_op { -+ void (*ctl)(struct au_hinode *hinode, int do_set); -+ int (*alloc)(struct au_hinode *hinode); -+ -+ /* -+ * if it returns true, the caller should free hinode->hi_notify, -+ * otherwise ->free() frees it. -+ */ -+ int (*free)(struct au_hinode *hinode, -+ struct au_hnotify *hn) __must_check; -+ -+ void (*fin)(void); -+ int (*init)(void); -+ -+ int (*reset_br)(unsigned int udba, struct au_branch *br, int perm); -+ void (*fin_br)(struct au_branch *br); -+ int (*init_br)(struct au_branch *br, int perm); -+}; -+ -+/* hnotify.c */ -+int au_hn_alloc(struct au_hinode *hinode, struct inode *inode); -+void au_hn_free(struct au_hinode *hinode); -+void au_hn_ctl(struct au_hinode *hinode, int do_set); -+void au_hn_reset(struct inode *inode, unsigned int flags); -+int au_hnotify(struct inode *h_dir, struct au_hnotify *hnotify, u32 mask, -+ const struct qstr *h_child_qstr, struct inode *h_child_inode); -+int au_hnotify_reset_br(unsigned int udba, struct au_branch *br, int perm); -+int au_hnotify_init_br(struct au_branch *br, int perm); -+void au_hnotify_fin_br(struct au_branch *br); -+int __init au_hnotify_init(void); -+void au_hnotify_fin(void); -+ -+/* hfsnotify.c */ -+extern const struct au_hnotify_op au_hnotify_op; -+ -+static inline -+void au_hn_init(struct au_hinode *hinode) -+{ -+ hinode->hi_notify = NULL; -+} -+ -+static inline struct au_hnotify *au_hn(struct au_hinode *hinode) -+{ -+ return hinode->hi_notify; -+} -+ -+#else -+AuStub(int, au_hn_alloc, return -EOPNOTSUPP, -+ struct au_hinode *hinode __maybe_unused, -+ struct inode *inode __maybe_unused) -+AuStub(struct au_hnotify *, au_hn, return NULL, struct au_hinode *hinode) -+AuStubVoid(au_hn_free, struct au_hinode *hinode __maybe_unused) -+AuStubVoid(au_hn_ctl, struct au_hinode *hinode __maybe_unused, -+ int do_set __maybe_unused) -+AuStubVoid(au_hn_reset, struct inode *inode __maybe_unused, -+ unsigned int flags __maybe_unused) -+AuStubInt0(au_hnotify_reset_br, unsigned int udba __maybe_unused, -+ struct au_branch *br __maybe_unused, -+ int perm __maybe_unused) -+AuStubInt0(au_hnotify_init_br, struct au_branch *br __maybe_unused, -+ int perm __maybe_unused) -+AuStubVoid(au_hnotify_fin_br, struct au_branch *br __maybe_unused) -+AuStubInt0(__init au_hnotify_init, void) -+AuStubVoid(au_hnotify_fin, void) -+AuStubVoid(au_hn_init, struct au_hinode *hinode __maybe_unused) -+#endif /* CONFIG_AUFS_HNOTIFY */ -+ -+static inline void au_hn_suspend(struct au_hinode *hdir) -+{ -+ au_hn_ctl(hdir, /*do_set*/0); -+} -+ -+static inline void au_hn_resume(struct au_hinode *hdir) -+{ -+ au_hn_ctl(hdir, /*do_set*/1); -+} -+ -+static inline void au_hn_inode_lock(struct au_hinode *hdir) -+{ -+ inode_lock(hdir->hi_inode); -+ au_hn_suspend(hdir); -+} -+ -+static inline void au_hn_inode_lock_nested(struct au_hinode *hdir, -+ unsigned int sc __maybe_unused) -+{ -+ inode_lock_nested(hdir->hi_inode, sc); -+ au_hn_suspend(hdir); -+} -+ -+#if 0 /* unused */ -+#include "vfsub.h" -+static inline void au_hn_inode_lock_shared_nested(struct au_hinode *hdir, -+ unsigned int sc) -+{ -+ inode_lock_shared_nested(hdir->hi_inode, sc); -+ au_hn_suspend(hdir); -+} -+#endif -+ -+static inline void au_hn_inode_unlock(struct au_hinode *hdir) -+{ -+ au_hn_resume(hdir); -+ inode_unlock(hdir->hi_inode); -+} -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_INODE_H__ */ -diff -Naur null/fs/aufs/ioctl.c linux-5.15.36/fs/aufs/ioctl.c ---- /dev/null -+++ linux-5.15.36/fs/aufs/ioctl.c 2022-05-10 16:51:39.874744219 +0300 -@@ -0,0 +1,220 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program. If not, see . -+ */ -+ -+/* -+ * ioctl -+ * plink-management and readdir in userspace. -+ * assist the pathconf(3) wrapper library. -+ * move-down -+ * File-based Hierarchical Storage Management. -+ */ -+ -+#include -+#include -+#include "aufs.h" -+ -+static int au_wbr_fd(struct path *path, struct aufs_wbr_fd __user *arg) -+{ -+ int err, fd; -+ aufs_bindex_t wbi, bindex, bbot; -+ struct file *h_file; -+ struct super_block *sb; -+ struct dentry *root; -+ struct au_branch *br; -+ struct aufs_wbr_fd wbrfd = { -+ .oflags = au_dir_roflags, -+ .brid = -1 -+ }; -+ const int valid = O_RDONLY | O_NONBLOCK | O_LARGEFILE | O_DIRECTORY -+ | O_NOATIME | O_CLOEXEC; -+ -+ AuDebugOn(wbrfd.oflags & ~valid); -+ -+ if (arg) { -+ err = copy_from_user(&wbrfd, arg, sizeof(wbrfd)); -+ if (unlikely(err)) { -+ err = -EFAULT; -+ goto out; -+ } -+ -+ err = -EINVAL; -+ AuDbg("wbrfd{0%o, %d}\n", wbrfd.oflags, wbrfd.brid); -+ wbrfd.oflags |= au_dir_roflags; -+ AuDbg("0%o\n", wbrfd.oflags); -+ if (unlikely(wbrfd.oflags & ~valid)) -+ goto out; -+ } -+ -+ fd = get_unused_fd_flags(0); -+ err = fd; -+ if (unlikely(fd < 0)) -+ goto out; -+ -+ h_file = ERR_PTR(-EINVAL); -+ wbi = 0; -+ br = NULL; -+ sb = path->dentry->d_sb; -+ root = sb->s_root; -+ aufs_read_lock(root, AuLock_IR); -+ bbot = au_sbbot(sb); -+ if (wbrfd.brid >= 0) { -+ wbi = au_br_index(sb, wbrfd.brid); -+ if (unlikely(wbi < 0 || wbi > bbot)) -+ goto out_unlock; -+ } -+ -+ h_file = ERR_PTR(-ENOENT); -+ br = au_sbr(sb, wbi); -+ if (!au_br_writable(br->br_perm)) { -+ if (arg) -+ goto out_unlock; -+ -+ bindex = wbi + 1; -+ wbi = -1; -+ for (; bindex <= bbot; bindex++) { -+ br = au_sbr(sb, bindex); -+ if (au_br_writable(br->br_perm)) { -+ wbi = bindex; -+ br = au_sbr(sb, wbi); -+ break; -+ } -+ } -+ } -+ AuDbg("wbi %d\n", wbi); -+ if (wbi >= 0) -+ h_file = au_h_open(root, wbi, wbrfd.oflags, NULL, -+ /*force_wr*/0); -+ -+out_unlock: -+ aufs_read_unlock(root, AuLock_IR); -+ err = PTR_ERR(h_file); -+ if (IS_ERR(h_file)) -+ goto out_fd; -+ -+ au_lcnt_dec(&br->br_nfiles); /* cf. au_h_open() */ -+ fd_install(fd, h_file); -+ err = fd; -+ goto out; /* success */ -+ -+out_fd: -+ put_unused_fd(fd); -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+long aufs_ioctl_dir(struct file *file, unsigned int cmd, unsigned long arg) -+{ -+ long err; -+ struct dentry *dentry; -+ -+ switch (cmd) { -+ case AUFS_CTL_RDU: -+ case AUFS_CTL_RDU_INO: -+ err = au_rdu_ioctl(file, cmd, arg); -+ break; -+ -+ case AUFS_CTL_WBR_FD: -+ err = au_wbr_fd(&file->f_path, (void __user *)arg); -+ break; -+ -+ case AUFS_CTL_IBUSY: -+ err = au_ibusy_ioctl(file, arg); -+ break; -+ -+ case AUFS_CTL_BRINFO: -+ err = au_brinfo_ioctl(file, arg); -+ break; -+ -+ case AUFS_CTL_FHSM_FD: -+ dentry = file->f_path.dentry; -+ if (IS_ROOT(dentry)) -+ err = au_fhsm_fd(dentry->d_sb, arg); -+ else -+ err = -ENOTTY; -+ break; -+ -+ default: -+ /* do not call the lower */ -+ AuDbg("0x%x\n", cmd); -+ err = -ENOTTY; -+ } -+ -+ AuTraceErr(err); -+ return err; -+} -+ -+long aufs_ioctl_nondir(struct file *file, unsigned int cmd, unsigned long arg) -+{ -+ long err; -+ -+ switch (cmd) { -+ case AUFS_CTL_MVDOWN: -+ err = au_mvdown(file->f_path.dentry, (void __user *)arg); -+ break; -+ -+ case AUFS_CTL_WBR_FD: -+ err = au_wbr_fd(&file->f_path, (void __user *)arg); -+ break; -+ -+ default: -+ /* do not call the lower */ -+ AuDbg("0x%x\n", cmd); -+ err = -ENOTTY; -+ } -+ -+ AuTraceErr(err); -+ return err; -+} -+ -+#ifdef CONFIG_COMPAT -+long aufs_compat_ioctl_dir(struct file *file, unsigned int cmd, -+ unsigned long arg) -+{ -+ long err; -+ -+ switch (cmd) { -+ case AUFS_CTL_RDU: -+ case AUFS_CTL_RDU_INO: -+ err = au_rdu_compat_ioctl(file, cmd, arg); -+ break; -+ -+ case AUFS_CTL_IBUSY: -+ err = au_ibusy_compat_ioctl(file, arg); -+ break; -+ -+ case AUFS_CTL_BRINFO: -+ err = au_brinfo_compat_ioctl(file, arg); -+ break; -+ -+ default: -+ err = aufs_ioctl_dir(file, cmd, arg); -+ } -+ -+ AuTraceErr(err); -+ return err; -+} -+ -+long aufs_compat_ioctl_nondir(struct file *file, unsigned int cmd, -+ unsigned long arg) -+{ -+ return aufs_ioctl_nondir(file, cmd, (unsigned long)compat_ptr(arg)); -+} -+#endif -diff -Naur null/fs/aufs/i_op_add.c linux-5.15.36/fs/aufs/i_op_add.c ---- /dev/null -+++ linux-5.15.36/fs/aufs/i_op_add.c 2022-05-10 16:51:39.872744219 +0300 -@@ -0,0 +1,941 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program. If not, see . -+ */ -+ -+/* -+ * inode operations (add entry) -+ */ -+ -+#include -+#include "aufs.h" -+ -+/* -+ * final procedure of adding a new entry, except link(2). -+ * remove whiteout, instantiate, copyup the parent dir's times and size -+ * and update version. -+ * if it failed, re-create the removed whiteout. -+ */ -+static int epilog(struct inode *dir, aufs_bindex_t bindex, -+ struct dentry *wh_dentry, struct dentry *dentry) -+{ -+ int err, rerr; -+ aufs_bindex_t bwh; -+ struct path h_path; -+ struct super_block *sb; -+ struct inode *inode, *h_dir; -+ struct dentry *wh; -+ -+ bwh = -1; -+ sb = dir->i_sb; -+ if (wh_dentry) { -+ h_dir = d_inode(wh_dentry->d_parent); /* dir inode is locked */ -+ IMustLock(h_dir); -+ AuDebugOn(au_h_iptr(dir, bindex) != h_dir); -+ bwh = au_dbwh(dentry); -+ h_path.dentry = wh_dentry; -+ h_path.mnt = au_sbr_mnt(sb, bindex); -+ err = au_wh_unlink_dentry(au_h_iptr(dir, bindex), &h_path, -+ dentry); -+ if (unlikely(err)) -+ goto out; -+ } -+ -+ inode = au_new_inode(dentry, /*must_new*/1); -+ if (!IS_ERR(inode)) { -+ d_instantiate(dentry, inode); -+ dir = d_inode(dentry->d_parent); /* dir inode is locked */ -+ IMustLock(dir); -+ au_dir_ts(dir, bindex); -+ inode_inc_iversion(dir); -+ au_fhsm_wrote(sb, bindex, /*force*/0); -+ return 0; /* success */ -+ } -+ -+ err = PTR_ERR(inode); -+ if (!wh_dentry) -+ goto out; -+ -+ /* revert */ -+ /* dir inode is locked */ -+ wh = au_wh_create(dentry, bwh, wh_dentry->d_parent); -+ rerr = PTR_ERR(wh); -+ if (IS_ERR(wh)) { -+ AuIOErr("%pd reverting whiteout failed(%d, %d)\n", -+ dentry, err, rerr); -+ err = -EIO; -+ } else -+ dput(wh); -+ -+out: -+ return err; -+} -+ -+static int au_d_may_add(struct dentry *dentry) -+{ -+ int err; -+ -+ err = 0; -+ if (unlikely(d_unhashed(dentry))) -+ err = -ENOENT; -+ if (unlikely(d_really_is_positive(dentry))) -+ err = -EEXIST; -+ return err; -+} -+ -+/* -+ * simple tests for the adding inode operations. -+ * following the checks in vfs, plus the parent-child relationship. -+ */ -+int au_may_add(struct dentry *dentry, aufs_bindex_t bindex, -+ struct dentry *h_parent, int isdir) -+{ -+ int err; -+ umode_t h_mode; -+ struct dentry *h_dentry; -+ struct inode *h_inode; -+ -+ err = -ENAMETOOLONG; -+ if (unlikely(dentry->d_name.len > AUFS_MAX_NAMELEN)) -+ goto out; -+ -+ h_dentry = au_h_dptr(dentry, bindex); -+ if (d_really_is_negative(dentry)) { -+ err = -EEXIST; -+ if (unlikely(d_is_positive(h_dentry))) -+ goto out; -+ } else { -+ /* rename(2) case */ -+ err = -EIO; -+ if (unlikely(d_is_negative(h_dentry))) -+ goto out; -+ h_inode = d_inode(h_dentry); -+ if (unlikely(!h_inode->i_nlink)) -+ goto out; -+ -+ h_mode = h_inode->i_mode; -+ if (!isdir) { -+ err = -EISDIR; -+ if (unlikely(S_ISDIR(h_mode))) -+ goto out; -+ } else if (unlikely(!S_ISDIR(h_mode))) { -+ err = -ENOTDIR; -+ goto out; -+ } -+ } -+ -+ err = 0; -+ /* expected parent dir is locked */ -+ if (unlikely(h_parent != h_dentry->d_parent)) -+ err = -EIO; -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+/* -+ * initial procedure of adding a new entry. -+ * prepare writable branch and the parent dir, lock it, -+ * and lookup whiteout for the new entry. -+ */ -+static struct dentry* -+lock_hdir_lkup_wh(struct dentry *dentry, struct au_dtime *dt, -+ struct dentry *src_dentry, struct au_pin *pin, -+ struct au_wr_dir_args *wr_dir_args) -+{ -+ struct dentry *wh_dentry, *h_parent; -+ struct super_block *sb; -+ struct au_branch *br; -+ int err; -+ unsigned int udba; -+ aufs_bindex_t bcpup; -+ -+ AuDbg("%pd\n", dentry); -+ -+ err = au_wr_dir(dentry, src_dentry, wr_dir_args); -+ bcpup = err; -+ wh_dentry = ERR_PTR(err); -+ if (unlikely(err < 0)) -+ goto out; -+ -+ sb = dentry->d_sb; -+ udba = au_opt_udba(sb); -+ err = au_pin(pin, dentry, bcpup, udba, -+ AuPin_DI_LOCKED | AuPin_MNT_WRITE); -+ wh_dentry = ERR_PTR(err); -+ if (unlikely(err)) -+ goto out; -+ -+ h_parent = au_pinned_h_parent(pin); -+ if (udba != AuOpt_UDBA_NONE -+ && au_dbtop(dentry) == bcpup) -+ err = au_may_add(dentry, bcpup, h_parent, -+ au_ftest_wrdir(wr_dir_args->flags, ISDIR)); -+ else if (unlikely(dentry->d_name.len > AUFS_MAX_NAMELEN)) -+ err = -ENAMETOOLONG; -+ wh_dentry = ERR_PTR(err); -+ if (unlikely(err)) -+ goto out_unpin; -+ -+ br = au_sbr(sb, bcpup); -+ if (dt) { -+ struct path tmp = { -+ .dentry = h_parent, -+ .mnt = au_br_mnt(br) -+ }; -+ au_dtime_store(dt, au_pinned_parent(pin), &tmp); -+ } -+ -+ wh_dentry = NULL; -+ if (bcpup != au_dbwh(dentry)) -+ goto out; /* success */ -+ -+ /* -+ * ENAMETOOLONG here means that if we allowed create such name, then it -+ * would not be able to removed in the future. So we don't allow such -+ * name here and we don't handle ENAMETOOLONG differently here. -+ */ -+ wh_dentry = au_wh_lkup(h_parent, &dentry->d_name, br); -+ -+out_unpin: -+ if (IS_ERR(wh_dentry)) -+ au_unpin(pin); -+out: -+ return wh_dentry; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+enum { Mknod, Symlink, Creat }; -+struct simple_arg { -+ int type; -+ union { -+ struct { -+ umode_t mode; -+ bool want_excl; -+ bool try_aopen; -+ struct vfsub_aopen_args *aopen; -+ } c; -+ struct { -+ const char *symname; -+ } s; -+ struct { -+ umode_t mode; -+ dev_t dev; -+ } m; -+ } u; -+}; -+ -+static int add_simple(struct inode *dir, struct dentry *dentry, -+ struct simple_arg *arg) -+{ -+ int err, rerr; -+ aufs_bindex_t btop; -+ unsigned char created; -+ const unsigned char try_aopen -+ = (arg->type == Creat && arg->u.c.try_aopen); -+ struct vfsub_aopen_args *aopen = arg->u.c.aopen; -+ struct dentry *wh_dentry, *parent; -+ struct inode *h_dir; -+ struct super_block *sb; -+ struct au_branch *br; -+ /* to reduce stack size */ -+ struct { -+ struct au_dtime dt; -+ struct au_pin pin; -+ struct path h_path; -+ struct au_wr_dir_args wr_dir_args; -+ } *a; -+ -+ AuDbg("%pd\n", dentry); -+ IMustLock(dir); -+ -+ err = -ENOMEM; -+ a = kmalloc(sizeof(*a), GFP_NOFS); -+ if (unlikely(!a)) -+ goto out; -+ a->wr_dir_args.force_btgt = -1; -+ a->wr_dir_args.flags = AuWrDir_ADD_ENTRY; -+ -+ parent = dentry->d_parent; /* dir inode is locked */ -+ if (!try_aopen) { -+ err = aufs_read_lock(dentry, AuLock_DW | AuLock_GEN); -+ if (unlikely(err)) -+ goto out_free; -+ } -+ err = au_d_may_add(dentry); -+ if (unlikely(err)) -+ goto out_unlock; -+ if (!try_aopen) -+ di_write_lock_parent(parent); -+ wh_dentry = lock_hdir_lkup_wh(dentry, &a->dt, /*src_dentry*/NULL, -+ &a->pin, &a->wr_dir_args); -+ err = PTR_ERR(wh_dentry); -+ if (IS_ERR(wh_dentry)) -+ goto out_parent; -+ -+ btop = au_dbtop(dentry); -+ sb = dentry->d_sb; -+ br = au_sbr(sb, btop); -+ a->h_path.dentry = au_h_dptr(dentry, btop); -+ a->h_path.mnt = au_br_mnt(br); -+ h_dir = au_pinned_h_dir(&a->pin); -+ switch (arg->type) { -+ case Creat: -+ if (!try_aopen || !h_dir->i_op->atomic_open) { -+ err = vfsub_create(h_dir, &a->h_path, arg->u.c.mode, -+ arg->u.c.want_excl); -+ created = !err; -+ if (!err && try_aopen) -+ aopen->file->f_mode |= FMODE_CREATED; -+ } else { -+ aopen->br = br; -+ err = vfsub_atomic_open(h_dir, a->h_path.dentry, aopen); -+ AuDbg("err %d\n", err); -+ AuDbgFile(aopen->file); -+ created = err >= 0 -+ && !!(aopen->file->f_mode & FMODE_CREATED); -+ } -+ break; -+ case Symlink: -+ err = vfsub_symlink(h_dir, &a->h_path, arg->u.s.symname); -+ created = !err; -+ break; -+ case Mknod: -+ err = vfsub_mknod(h_dir, &a->h_path, arg->u.m.mode, -+ arg->u.m.dev); -+ created = !err; -+ break; -+ default: -+ BUG(); -+ } -+ if (unlikely(err < 0)) -+ goto out_unpin; -+ -+ err = epilog(dir, btop, wh_dentry, dentry); -+ if (!err) -+ goto out_unpin; /* success */ -+ -+ /* 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); -+ if (rerr) { -+ AuIOErr("%pd revert failure(%d, %d)\n", -+ dentry, err, rerr); -+ err = -EIO; -+ } -+ au_dtime_revert(&a->dt); -+ } -+ if (try_aopen && h_dir->i_op->atomic_open -+ && (aopen->file->f_mode & FMODE_OPENED)) -+ /* aopen->file is still opened */ -+ au_lcnt_dec(&aopen->br->br_nfiles); -+ -+out_unpin: -+ au_unpin(&a->pin); -+ dput(wh_dentry); -+out_parent: -+ if (!try_aopen) -+ di_write_unlock(parent); -+out_unlock: -+ if (unlikely(err)) { -+ au_update_dbtop(dentry); -+ d_drop(dentry); -+ } -+ if (!try_aopen) -+ aufs_read_unlock(dentry, AuLock_DW); -+out_free: -+ au_kfree_rcu(a); -+out: -+ return err; -+} -+ -+int aufs_mknod(struct user_namespace *userns, struct inode *dir, -+ struct dentry *dentry, umode_t mode, dev_t dev) -+{ -+ struct simple_arg arg = { -+ .type = Mknod, -+ .u.m = { -+ .mode = mode, -+ .dev = dev -+ } -+ }; -+ return add_simple(dir, dentry, &arg); -+} -+ -+int aufs_symlink(struct user_namespace *userns, struct inode *dir, -+ struct dentry *dentry, const char *symname) -+{ -+ struct simple_arg arg = { -+ .type = Symlink, -+ .u.s.symname = symname -+ }; -+ return add_simple(dir, dentry, &arg); -+} -+ -+int aufs_create(struct user_namespace *userns, struct inode *dir, -+ struct dentry *dentry, umode_t mode, bool want_excl) -+{ -+ struct simple_arg arg = { -+ .type = Creat, -+ .u.c = { -+ .mode = mode, -+ .want_excl = want_excl -+ } -+ }; -+ return add_simple(dir, dentry, &arg); -+} -+ -+int au_aopen_or_create(struct inode *dir, struct dentry *dentry, -+ struct vfsub_aopen_args *aopen_args) -+{ -+ struct simple_arg arg = { -+ .type = Creat, -+ .u.c = { -+ .mode = aopen_args->create_mode, -+ .want_excl = aopen_args->open_flag & O_EXCL, -+ .try_aopen = true, -+ .aopen = aopen_args -+ } -+ }; -+ return add_simple(dir, dentry, &arg); -+} -+ -+int aufs_tmpfile(struct user_namespace *userns, struct inode *dir, -+ struct dentry *dentry, umode_t mode) -+{ -+ int err; -+ aufs_bindex_t bindex; -+ struct super_block *sb; -+ struct dentry *parent, *h_parent, *h_dentry; -+ struct inode *h_dir, *inode; -+ struct vfsmount *h_mnt; -+ struct user_namespace *h_userns; -+ struct au_wr_dir_args wr_dir_args = { -+ .force_btgt = -1, -+ .flags = AuWrDir_TMPFILE -+ }; -+ -+ /* copy-up may happen */ -+ inode_lock(dir); -+ -+ sb = dir->i_sb; -+ err = si_read_lock(sb, AuLock_FLUSH | AuLock_NOPLM); -+ if (unlikely(err)) -+ goto out; -+ -+ err = au_di_init(dentry); -+ if (unlikely(err)) -+ goto out_si; -+ -+ err = -EBUSY; -+ parent = d_find_any_alias(dir); -+ AuDebugOn(!parent); -+ di_write_lock_parent(parent); -+ if (unlikely(d_inode(parent) != dir)) -+ goto out_parent; -+ -+ err = au_digen_test(parent, au_sigen(sb)); -+ if (unlikely(err)) -+ goto out_parent; -+ -+ bindex = au_dbtop(parent); -+ au_set_dbtop(dentry, bindex); -+ au_set_dbbot(dentry, bindex); -+ err = au_wr_dir(dentry, /*src_dentry*/NULL, &wr_dir_args); -+ bindex = err; -+ if (unlikely(err < 0)) -+ goto out_parent; -+ -+ err = -EOPNOTSUPP; -+ h_dir = au_h_iptr(dir, bindex); -+ if (unlikely(!h_dir->i_op->tmpfile)) -+ goto out_parent; -+ -+ h_mnt = au_sbr_mnt(sb, bindex); -+ err = vfsub_mnt_want_write(h_mnt); -+ if (unlikely(err)) -+ goto out_parent; -+ -+ h_userns = mnt_user_ns(h_mnt); -+ h_parent = au_h_dptr(parent, bindex); -+ h_dentry = vfs_tmpfile(h_userns, h_parent, mode, /*open_flag*/0); -+ if (IS_ERR(h_dentry)) { -+ err = PTR_ERR(h_dentry); -+ goto out_mnt; -+ } -+ -+ au_set_dbtop(dentry, bindex); -+ au_set_dbbot(dentry, bindex); -+ au_set_h_dptr(dentry, bindex, dget(h_dentry)); -+ inode = au_new_inode(dentry, /*must_new*/1); -+ if (IS_ERR(inode)) { -+ err = PTR_ERR(inode); -+ au_set_h_dptr(dentry, bindex, NULL); -+ au_set_dbtop(dentry, -1); -+ au_set_dbbot(dentry, -1); -+ } else { -+ if (!inode->i_nlink) -+ set_nlink(inode, 1); -+ d_tmpfile(dentry, inode); -+ au_di(dentry)->di_tmpfile = 1; -+ -+ /* update without i_mutex */ -+ if (au_ibtop(dir) == au_dbtop(dentry)) -+ au_cpup_attr_timesizes(dir); -+ } -+ dput(h_dentry); -+ -+out_mnt: -+ vfsub_mnt_drop_write(h_mnt); -+out_parent: -+ di_write_unlock(parent); -+ dput(parent); -+ di_write_unlock(dentry); -+ if (unlikely(err)) { -+ au_di_fin(dentry); -+ dentry->d_fsdata = NULL; -+ } -+out_si: -+ si_read_unlock(sb); -+out: -+ inode_unlock(dir); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+struct au_link_args { -+ aufs_bindex_t bdst, bsrc; -+ struct au_pin pin; -+ struct path h_path; -+ struct dentry *src_parent, *parent; -+}; -+ -+static int au_cpup_before_link(struct dentry *src_dentry, -+ struct au_link_args *a) -+{ -+ int err; -+ struct dentry *h_src_dentry; -+ struct au_cp_generic cpg = { -+ .dentry = src_dentry, -+ .bdst = a->bdst, -+ .bsrc = a->bsrc, -+ .len = -1, -+ .pin = &a->pin, -+ .flags = AuCpup_DTIME | AuCpup_HOPEN /* | AuCpup_KEEPLINO */ -+ }; -+ -+ di_read_lock_parent(a->src_parent, AuLock_IR); -+ err = au_test_and_cpup_dirs(src_dentry, a->bdst); -+ if (unlikely(err)) -+ goto out; -+ -+ h_src_dentry = au_h_dptr(src_dentry, a->bsrc); -+ err = au_pin(&a->pin, src_dentry, a->bdst, -+ au_opt_udba(src_dentry->d_sb), -+ AuPin_DI_LOCKED | AuPin_MNT_WRITE); -+ if (unlikely(err)) -+ goto out; -+ -+ err = au_sio_cpup_simple(&cpg); -+ au_unpin(&a->pin); -+ -+out: -+ di_read_unlock(a->src_parent, AuLock_IR); -+ return err; -+} -+ -+static int au_cpup_or_link(struct dentry *src_dentry, struct dentry *dentry, -+ struct au_link_args *a) -+{ -+ int err; -+ unsigned char plink; -+ aufs_bindex_t bbot; -+ struct dentry *h_src_dentry; -+ struct inode *h_inode, *inode, *delegated; -+ struct super_block *sb; -+ struct file *h_file; -+ -+ plink = 0; -+ h_inode = NULL; -+ sb = src_dentry->d_sb; -+ inode = d_inode(src_dentry); -+ if (au_ibtop(inode) <= a->bdst) -+ h_inode = au_h_iptr(inode, a->bdst); -+ if (!h_inode || !h_inode->i_nlink) { -+ /* copyup src_dentry as the name of dentry. */ -+ bbot = au_dbbot(dentry); -+ if (bbot < a->bsrc) -+ au_set_dbbot(dentry, a->bsrc); -+ au_set_h_dptr(dentry, a->bsrc, -+ dget(au_h_dptr(src_dentry, a->bsrc))); -+ dget(a->h_path.dentry); -+ au_set_h_dptr(dentry, a->bdst, NULL); -+ AuDbg("temporary d_inode...\n"); -+ spin_lock(&dentry->d_lock); -+ dentry->d_inode = d_inode(src_dentry); /* tmp */ -+ spin_unlock(&dentry->d_lock); -+ h_file = au_h_open_pre(dentry, a->bsrc, /*force_wr*/0); -+ if (IS_ERR(h_file)) -+ err = PTR_ERR(h_file); -+ else { -+ struct au_cp_generic cpg = { -+ .dentry = dentry, -+ .bdst = a->bdst, -+ .bsrc = -1, -+ .len = -1, -+ .pin = &a->pin, -+ .flags = AuCpup_KEEPLINO -+ }; -+ err = au_sio_cpup_simple(&cpg); -+ au_h_open_post(dentry, a->bsrc, h_file); -+ if (!err) { -+ dput(a->h_path.dentry); -+ a->h_path.dentry = au_h_dptr(dentry, a->bdst); -+ } else -+ au_set_h_dptr(dentry, a->bdst, -+ a->h_path.dentry); -+ } -+ spin_lock(&dentry->d_lock); -+ dentry->d_inode = NULL; /* restore */ -+ spin_unlock(&dentry->d_lock); -+ AuDbg("temporary d_inode...done\n"); -+ au_set_h_dptr(dentry, a->bsrc, NULL); -+ au_set_dbbot(dentry, bbot); -+ } else { -+ /* the inode of src_dentry already exists on a.bdst branch */ -+ h_src_dentry = d_find_alias(h_inode); -+ if (!h_src_dentry && au_plink_test(inode)) { -+ plink = 1; -+ h_src_dentry = au_plink_lkup(inode, a->bdst); -+ err = PTR_ERR(h_src_dentry); -+ if (IS_ERR(h_src_dentry)) -+ goto out; -+ -+ if (unlikely(d_is_negative(h_src_dentry))) { -+ dput(h_src_dentry); -+ h_src_dentry = NULL; -+ } -+ -+ } -+ 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); -+ } -+ dput(h_src_dentry); -+ } else { -+ AuIOErr("no dentry found for hi%lu on b%d\n", -+ h_inode->i_ino, a->bdst); -+ err = -EIO; -+ } -+ } -+ -+ if (!err && !plink) -+ au_plink_append(inode, a->bdst, a->h_path.dentry); -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+int aufs_link(struct dentry *src_dentry, struct inode *dir, -+ struct dentry *dentry) -+{ -+ int err, rerr; -+ struct au_dtime dt; -+ struct au_link_args *a; -+ struct dentry *wh_dentry, *h_src_dentry; -+ struct inode *inode, *delegated; -+ struct super_block *sb; -+ struct au_wr_dir_args wr_dir_args = { -+ /* .force_btgt = -1, */ -+ .flags = AuWrDir_ADD_ENTRY -+ }; -+ -+ IMustLock(dir); -+ inode = d_inode(src_dentry); -+ IMustLock(inode); -+ -+ err = -ENOMEM; -+ a = kzalloc(sizeof(*a), GFP_NOFS); -+ if (unlikely(!a)) -+ goto out; -+ -+ a->parent = dentry->d_parent; /* dir inode is locked */ -+ err = aufs_read_and_write_lock2(dentry, src_dentry, -+ AuLock_NOPLM | AuLock_GEN); -+ if (unlikely(err)) -+ goto out_kfree; -+ err = au_d_linkable(src_dentry); -+ if (unlikely(err)) -+ goto out_unlock; -+ err = au_d_may_add(dentry); -+ if (unlikely(err)) -+ goto out_unlock; -+ -+ a->src_parent = dget_parent(src_dentry); -+ wr_dir_args.force_btgt = au_ibtop(inode); -+ -+ di_write_lock_parent(a->parent); -+ wr_dir_args.force_btgt = au_wbr(dentry, wr_dir_args.force_btgt); -+ wh_dentry = lock_hdir_lkup_wh(dentry, &dt, src_dentry, &a->pin, -+ &wr_dir_args); -+ err = PTR_ERR(wh_dentry); -+ if (IS_ERR(wh_dentry)) -+ goto out_parent; -+ -+ err = 0; -+ sb = dentry->d_sb; -+ a->bdst = au_dbtop(dentry); -+ a->h_path.dentry = au_h_dptr(dentry, a->bdst); -+ a->h_path.mnt = au_sbr_mnt(sb, a->bdst); -+ a->bsrc = au_ibtop(inode); -+ h_src_dentry = au_h_d_alias(src_dentry, a->bsrc); -+ if (!h_src_dentry && au_di(src_dentry)->di_tmpfile) -+ h_src_dentry = dget(au_hi_wh(inode, a->bsrc)); -+ if (!h_src_dentry) { -+ a->bsrc = au_dbtop(src_dentry); -+ h_src_dentry = au_h_d_alias(src_dentry, a->bsrc); -+ AuDebugOn(!h_src_dentry); -+ } else if (IS_ERR(h_src_dentry)) { -+ err = PTR_ERR(h_src_dentry); -+ goto out_parent; -+ } -+ -+ /* -+ * aufs doesn't touch the credential so -+ * security_dentry_create_files_as() is unnecessary. -+ */ -+ if (au_opt_test(au_mntflags(sb), PLINK)) { -+ 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; -+ 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); -+ } -+ } -+ dput(h_src_dentry); -+ } else { -+ /* -+ * copyup src_dentry to the branch we process, -+ * and then link(2) to it. -+ */ -+ dput(h_src_dentry); -+ if (a->bdst < a->bsrc -+ /* && h_src_dentry->d_sb != a->h_path.dentry->d_sb */) { -+ au_unpin(&a->pin); -+ di_write_unlock(a->parent); -+ err = au_cpup_before_link(src_dentry, a); -+ di_write_lock_parent(a->parent); -+ if (!err) -+ err = au_pin(&a->pin, dentry, a->bdst, -+ au_opt_udba(sb), -+ AuPin_DI_LOCKED | AuPin_MNT_WRITE); -+ if (unlikely(err)) -+ goto out_wh; -+ } -+ 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; -+ 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); -+ } -+ } -+ } -+ } -+ if (unlikely(err)) -+ goto out_unpin; -+ -+ if (wh_dentry) { -+ a->h_path.dentry = wh_dentry; -+ err = au_wh_unlink_dentry(au_pinned_h_dir(&a->pin), &a->h_path, -+ dentry); -+ if (unlikely(err)) -+ goto out_revert; -+ } -+ -+ au_dir_ts(dir, a->bdst); -+ inode_inc_iversion(dir); -+ inc_nlink(inode); -+ inode->i_ctime = dir->i_ctime; -+ d_instantiate(dentry, au_igrab(inode)); -+ if (d_unhashed(a->h_path.dentry)) -+ /* some filesystem calls d_drop() */ -+ d_drop(dentry); -+ /* some filesystems consume an inode even hardlink */ -+ au_fhsm_wrote(sb, a->bdst, /*force*/0); -+ 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); -+ if (unlikely(rerr)) { -+ AuIOErr("%pd reverting failed(%d, %d)\n", dentry, err, rerr); -+ err = -EIO; -+ } -+ au_dtime_revert(&dt); -+out_unpin: -+ au_unpin(&a->pin); -+out_wh: -+ dput(wh_dentry); -+out_parent: -+ di_write_unlock(a->parent); -+ dput(a->src_parent); -+out_unlock: -+ if (unlikely(err)) { -+ au_update_dbtop(dentry); -+ d_drop(dentry); -+ } -+ aufs_read_and_write_unlock2(dentry, src_dentry); -+out_kfree: -+ au_kfree_rcu(a); -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+int aufs_mkdir(struct user_namespace *userns, struct inode *dir, -+ struct dentry *dentry, umode_t mode) -+{ -+ int err, rerr; -+ aufs_bindex_t bindex; -+ unsigned char diropq; -+ struct path h_path; -+ struct dentry *wh_dentry, *parent, *opq_dentry; -+ struct inode *h_inode; -+ struct super_block *sb; -+ struct { -+ struct au_pin pin; -+ struct au_dtime dt; -+ } *a; /* reduce the stack usage */ -+ struct au_wr_dir_args wr_dir_args = { -+ .force_btgt = -1, -+ .flags = AuWrDir_ADD_ENTRY | AuWrDir_ISDIR -+ }; -+ -+ IMustLock(dir); -+ -+ err = -ENOMEM; -+ a = kmalloc(sizeof(*a), GFP_NOFS); -+ if (unlikely(!a)) -+ goto out; -+ -+ err = aufs_read_lock(dentry, AuLock_DW | AuLock_GEN); -+ if (unlikely(err)) -+ goto out_free; -+ err = au_d_may_add(dentry); -+ if (unlikely(err)) -+ goto out_unlock; -+ -+ parent = dentry->d_parent; /* dir inode is locked */ -+ di_write_lock_parent(parent); -+ wh_dentry = lock_hdir_lkup_wh(dentry, &a->dt, /*src_dentry*/NULL, -+ &a->pin, &wr_dir_args); -+ err = PTR_ERR(wh_dentry); -+ if (IS_ERR(wh_dentry)) -+ goto out_parent; -+ -+ sb = dentry->d_sb; -+ bindex = au_dbtop(dentry); -+ h_path.dentry = au_h_dptr(dentry, bindex); -+ h_path.mnt = au_sbr_mnt(sb, bindex); -+ err = vfsub_mkdir(au_pinned_h_dir(&a->pin), &h_path, mode); -+ if (unlikely(err)) -+ goto out_unpin; -+ -+ /* make the dir opaque */ -+ diropq = 0; -+ h_inode = d_inode(h_path.dentry); -+ if (wh_dentry -+ || au_opt_test(au_mntflags(sb), ALWAYS_DIROPQ)) { -+ inode_lock_nested(h_inode, AuLsc_I_CHILD); -+ opq_dentry = au_diropq_create(dentry, bindex); -+ inode_unlock(h_inode); -+ err = PTR_ERR(opq_dentry); -+ if (IS_ERR(opq_dentry)) -+ goto out_dir; -+ dput(opq_dentry); -+ diropq = 1; -+ } -+ -+ err = epilog(dir, bindex, wh_dentry, dentry); -+ if (!err) { -+ inc_nlink(dir); -+ goto out_unpin; /* success */ -+ } -+ -+ /* revert */ -+ if (diropq) { -+ AuLabel(revert opq); -+ inode_lock_nested(h_inode, AuLsc_I_CHILD); -+ rerr = au_diropq_remove(dentry, bindex); -+ inode_unlock(h_inode); -+ if (rerr) { -+ AuIOErr("%pd reverting diropq failed(%d, %d)\n", -+ dentry, err, rerr); -+ err = -EIO; -+ } -+ } -+ -+out_dir: -+ AuLabel(revert dir); -+ rerr = vfsub_rmdir(au_pinned_h_dir(&a->pin), &h_path); -+ if (rerr) { -+ AuIOErr("%pd reverting dir failed(%d, %d)\n", -+ dentry, err, rerr); -+ err = -EIO; -+ } -+ au_dtime_revert(&a->dt); -+out_unpin: -+ au_unpin(&a->pin); -+ dput(wh_dentry); -+out_parent: -+ di_write_unlock(parent); -+out_unlock: -+ if (unlikely(err)) { -+ au_update_dbtop(dentry); -+ d_drop(dentry); -+ } -+ aufs_read_unlock(dentry, AuLock_DW); -+out_free: -+ au_kfree_rcu(a); -+out: -+ return err; -+} -diff -Naur null/fs/aufs/i_op.c linux-5.15.36/fs/aufs/i_op.c ---- /dev/null -+++ linux-5.15.36/fs/aufs/i_op.c 2022-05-10 16:51:39.872744219 +0300 -@@ -0,0 +1,1512 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program. If not, see . -+ */ -+ -+/* -+ * inode operations (except add/del/rename) -+ */ -+ -+#include -+#include -+#include -+#include -+#include "aufs.h" -+ -+static int h_permission(struct inode *h_inode, int mask, -+ struct path *h_path, int brperm) -+{ -+ int err; -+ const unsigned char write_mask = !!(mask & (MAY_WRITE | MAY_APPEND)); -+ struct user_namespace *h_userns; -+ -+ err = -EPERM; -+ if (write_mask && IS_IMMUTABLE(h_inode)) -+ goto out; -+ -+ err = -EACCES; -+ if (((mask & MAY_EXEC) -+ && S_ISREG(h_inode->i_mode) -+ && (path_noexec(h_path) -+ || !(h_inode->i_mode & 0111)))) -+ goto out; -+ -+ /* -+ * - skip the lower fs test in the case of write to ro branch. -+ * - nfs dir permission write check is optimized, but a policy for -+ * link/rename requires a real check. -+ * - nfs always sets SB_POSIXACL regardless its mount option 'noacl.' -+ * in this case, generic_permission() returns -EOPNOTSUPP. -+ */ -+ h_userns = mnt_user_ns(h_path->mnt); -+ if ((write_mask && !au_br_writable(brperm)) -+ || (au_test_nfs(h_inode->i_sb) && S_ISDIR(h_inode->i_mode) -+ && write_mask && !(mask & MAY_READ)) -+ || !h_inode->i_op->permission) { -+ /* AuLabel(generic_permission); */ -+ /* AuDbg("get_acl %ps\n", h_inode->i_op->get_acl); */ -+ err = generic_permission(h_userns, h_inode, mask); -+ if (err == -EOPNOTSUPP && au_test_nfs_noacl(h_inode)) -+ err = h_inode->i_op->permission(h_userns, h_inode, -+ mask); -+ AuTraceErr(err); -+ } else { -+ /* AuLabel(h_inode->permission); */ -+ err = h_inode->i_op->permission(h_userns, h_inode, mask); -+ AuTraceErr(err); -+ } -+ -+ if (!err) -+ err = devcgroup_inode_permission(h_inode, mask); -+ if (!err) -+ err = security_inode_permission(h_inode, mask); -+ -+out: -+ return err; -+} -+ -+static int aufs_permission(struct user_namespace *userns, struct inode *inode, -+ int mask) -+{ -+ int err; -+ aufs_bindex_t bindex, bbot; -+ const unsigned char isdir = !!S_ISDIR(inode->i_mode), -+ write_mask = !!(mask & (MAY_WRITE | MAY_APPEND)); -+ struct inode *h_inode; -+ struct super_block *sb; -+ struct au_branch *br; -+ -+ /* todo: support rcu-walk? */ -+ if (mask & MAY_NOT_BLOCK) -+ return -ECHILD; -+ -+ sb = inode->i_sb; -+ si_read_lock(sb, AuLock_FLUSH); -+ ii_read_lock_child(inode); -+#if 0 /* reserved for future use */ -+ /* -+ * This test may be rather 'too much' since the test is essentially done -+ * in the aufs_lookup(). Theoretically it is possible that the inode -+ * generation doesn't match to the superblock's here. But it isn't a -+ * big deal I suppose. -+ */ -+ err = au_iigen_test(inode, au_sigen(sb)); -+ if (unlikely(err)) -+ goto out; -+#endif -+ -+ if (!isdir -+ || write_mask -+ || au_opt_test(au_mntflags(sb), DIRPERM1)) { -+ err = au_busy_or_stale(); -+ h_inode = au_h_iptr(inode, au_ibtop(inode)); -+ if (unlikely(!h_inode -+ || (h_inode->i_mode & S_IFMT) -+ != (inode->i_mode & S_IFMT))) -+ goto out; -+ -+ err = 0; -+ bindex = au_ibtop(inode); -+ br = au_sbr(sb, bindex); -+ err = h_permission(h_inode, mask, &br->br_path, br->br_perm); -+ if (write_mask -+ && !err -+ && !special_file(h_inode->i_mode)) { -+ /* test whether the upper writable branch exists */ -+ err = -EROFS; -+ for (; bindex >= 0; bindex--) -+ if (!au_br_rdonly(au_sbr(sb, bindex))) { -+ err = 0; -+ break; -+ } -+ } -+ goto out; -+ } -+ -+ /* non-write to dir */ -+ err = 0; -+ bbot = au_ibbot(inode); -+ for (bindex = au_ibtop(inode); !err && bindex <= bbot; bindex++) { -+ h_inode = au_h_iptr(inode, bindex); -+ if (h_inode) { -+ err = au_busy_or_stale(); -+ if (unlikely(!S_ISDIR(h_inode->i_mode))) -+ break; -+ -+ br = au_sbr(sb, bindex); -+ err = h_permission(h_inode, mask, &br->br_path, -+ br->br_perm); -+ } -+ } -+ -+out: -+ ii_read_unlock(inode); -+ si_read_unlock(sb); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static struct dentry *aufs_lookup(struct inode *dir, struct dentry *dentry, -+ unsigned int flags) -+{ -+ struct dentry *ret, *parent; -+ struct inode *inode; -+ struct super_block *sb; -+ int err, npositive; -+ -+ IMustLock(dir); -+ -+ /* todo: support rcu-walk? */ -+ ret = ERR_PTR(-ECHILD); -+ if (flags & LOOKUP_RCU) -+ goto out; -+ -+ ret = ERR_PTR(-ENAMETOOLONG); -+ if (unlikely(dentry->d_name.len > AUFS_MAX_NAMELEN)) -+ goto out; -+ -+ sb = dir->i_sb; -+ err = si_read_lock(sb, AuLock_FLUSH | AuLock_NOPLM); -+ ret = ERR_PTR(err); -+ if (unlikely(err)) -+ goto out; -+ -+ err = au_di_init(dentry); -+ ret = ERR_PTR(err); -+ if (unlikely(err)) -+ goto out_si; -+ -+ inode = NULL; -+ npositive = 0; /* suppress a warning */ -+ parent = dentry->d_parent; /* dir inode is locked */ -+ di_read_lock_parent(parent, AuLock_IR); -+ err = au_alive_dir(parent); -+ if (!err) -+ err = au_digen_test(parent, au_sigen(sb)); -+ if (!err) { -+ /* regardless LOOKUP_CREATE, always ALLOW_NEG */ -+ npositive = au_lkup_dentry(dentry, au_dbtop(parent), -+ AuLkup_ALLOW_NEG); -+ err = npositive; -+ } -+ di_read_unlock(parent, AuLock_IR); -+ ret = ERR_PTR(err); -+ if (unlikely(err < 0)) -+ goto out_unlock; -+ -+ if (npositive) { -+ inode = au_new_inode(dentry, /*must_new*/0); -+ if (IS_ERR(inode)) { -+ ret = (void *)inode; -+ inode = NULL; -+ goto out_unlock; -+ } -+ } -+ -+ if (inode) -+ atomic_inc(&inode->i_count); -+ ret = d_splice_alias(inode, dentry); -+#if 0 /* reserved for future use */ -+ if (unlikely(d_need_lookup(dentry))) { -+ spin_lock(&dentry->d_lock); -+ dentry->d_flags &= ~DCACHE_NEED_LOOKUP; -+ spin_unlock(&dentry->d_lock); -+ } else -+#endif -+ if (inode) { -+ if (!IS_ERR(ret)) { -+ iput(inode); -+ if (ret && ret != dentry) -+ ii_write_unlock(inode); -+ } else { -+ ii_write_unlock(inode); -+ iput(inode); -+ inode = NULL; -+ } -+ } -+ -+out_unlock: -+ di_write_unlock(dentry); -+out_si: -+ si_read_unlock(sb); -+out: -+ return ret; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * very dirty and complicated aufs ->atomic_open(). -+ * aufs_atomic_open() -+ * + au_aopen_or_create() -+ * + add_simple() -+ * + vfsub_atomic_open() -+ * + branch fs ->atomic_open() -+ * may call the actual 'open' for h_file -+ * + inc br_nfiles only if opened -+ * + au_aopen_no_open() or au_aopen_do_open() -+ * -+ * au_aopen_do_open() -+ * + finish_open() -+ * + au_do_aopen() -+ * + au_do_open() the body of all 'open' -+ * + au_do_open_nondir() -+ * set the passed h_file -+ * -+ * au_aopen_no_open() -+ * + finish_no_open() -+ */ -+ -+struct aopen_node { -+ struct hlist_bl_node hblist; -+ struct file *file, *h_file; -+}; -+ -+static int au_do_aopen(struct inode *inode, struct file *file) -+{ -+ struct hlist_bl_head *aopen; -+ struct hlist_bl_node *pos; -+ struct aopen_node *node; -+ struct au_do_open_args args = { -+ .aopen = 1, -+ .open = au_do_open_nondir -+ }; -+ -+ aopen = &au_sbi(inode->i_sb)->si_aopen; -+ hlist_bl_lock(aopen); -+ hlist_bl_for_each_entry(node, pos, aopen, hblist) -+ if (node->file == file) { -+ args.h_file = node->h_file; -+ break; -+ } -+ hlist_bl_unlock(aopen); -+ /* AuDebugOn(!args.h_file); */ -+ -+ return au_do_open(file, &args); -+} -+ -+static int au_aopen_do_open(struct file *file, struct dentry *dentry, -+ struct aopen_node *aopen_node) -+{ -+ int err; -+ struct hlist_bl_head *aopen; -+ -+ AuLabel(here); -+ aopen = &au_sbi(dentry->d_sb)->si_aopen; -+ au_hbl_add(&aopen_node->hblist, aopen); -+ err = finish_open(file, dentry, au_do_aopen); -+ au_hbl_del(&aopen_node->hblist, aopen); -+ /* AuDbgFile(file); */ -+ AuDbg("%pd%s%s\n", dentry, -+ (file->f_mode & FMODE_CREATED) ? " created" : "", -+ (file->f_mode & FMODE_OPENED) ? " opened" : ""); -+ -+ AuTraceErr(err); -+ return err; -+} -+ -+static int au_aopen_no_open(struct file *file, struct dentry *dentry) -+{ -+ int err; -+ -+ AuLabel(here); -+ dget(dentry); -+ err = finish_no_open(file, dentry); -+ -+ AuTraceErr(err); -+ return err; -+} -+ -+static int aufs_atomic_open(struct inode *dir, struct dentry *dentry, -+ struct file *file, unsigned int open_flag, -+ umode_t create_mode) -+{ -+ int err, did_open; -+ unsigned int lkup_flags; -+ aufs_bindex_t bindex; -+ struct super_block *sb; -+ struct dentry *parent, *d; -+ struct vfsub_aopen_args args = { -+ .open_flag = open_flag, -+ .create_mode = create_mode -+ }; -+ struct aopen_node aopen_node = { -+ .file = file -+ }; -+ -+ IMustLock(dir); -+ AuDbg("open_flag 0%o\n", open_flag); -+ AuDbgDentry(dentry); -+ -+ err = 0; -+ if (!au_di(dentry)) { -+ lkup_flags = LOOKUP_OPEN; -+ if (open_flag & O_CREAT) -+ lkup_flags |= LOOKUP_CREATE; -+ d = aufs_lookup(dir, dentry, lkup_flags); -+ if (IS_ERR(d)) { -+ err = PTR_ERR(d); -+ AuTraceErr(err); -+ goto out; -+ } else if (d) { -+ /* -+ * obsoleted dentry found. -+ * another error will be returned later. -+ */ -+ d_drop(d); -+ AuDbgDentry(d); -+ dput(d); -+ } -+ AuDbgDentry(dentry); -+ } -+ -+ if (d_is_positive(dentry) -+ || d_unhashed(dentry) -+ || d_unlinked(dentry) -+ || !(open_flag & O_CREAT)) { -+ err = au_aopen_no_open(file, dentry); -+ goto out; /* success */ -+ } -+ -+ err = aufs_read_lock(dentry, AuLock_DW | AuLock_FLUSH | AuLock_GEN); -+ if (unlikely(err)) -+ goto out; -+ -+ sb = dentry->d_sb; -+ parent = dentry->d_parent; /* dir is locked */ -+ di_write_lock_parent(parent); -+ err = au_lkup_dentry(dentry, /*btop*/0, AuLkup_ALLOW_NEG); -+ if (unlikely(err < 0)) -+ goto out_parent; -+ -+ AuDbgDentry(dentry); -+ if (d_is_positive(dentry)) { -+ err = au_aopen_no_open(file, dentry); -+ goto out_parent; /* success */ -+ } -+ -+ args.file = alloc_empty_file(file->f_flags, current_cred()); -+ err = PTR_ERR(args.file); -+ if (IS_ERR(args.file)) -+ goto out_parent; -+ -+ bindex = au_dbtop(dentry); -+ err = au_aopen_or_create(dir, dentry, &args); -+ AuTraceErr(err); -+ AuDbgFile(args.file); -+ file->f_mode = args.file->f_mode & ~FMODE_OPENED; -+ did_open = !!(args.file->f_mode & FMODE_OPENED); -+ if (!did_open) { -+ fput(args.file); -+ args.file = NULL; -+ } -+ di_write_unlock(parent); -+ di_write_unlock(dentry); -+ if (unlikely(err < 0)) { -+ if (args.file) -+ fput(args.file); -+ goto out_sb; -+ } -+ -+ if (!did_open) -+ err = au_aopen_no_open(file, dentry); -+ else { -+ aopen_node.h_file = args.file; -+ err = au_aopen_do_open(file, dentry, &aopen_node); -+ } -+ if (unlikely(err < 0)) { -+ if (args.file) -+ fput(args.file); -+ if (did_open) -+ au_lcnt_dec(&args.br->br_nfiles); -+ } -+ goto out_sb; /* success */ -+ -+out_parent: -+ di_write_unlock(parent); -+ di_write_unlock(dentry); -+out_sb: -+ si_read_unlock(sb); -+out: -+ AuTraceErr(err); -+ AuDbgFile(file); -+ return err; -+} -+ -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int au_wr_dir_cpup(struct dentry *dentry, struct dentry *parent, -+ const unsigned char add_entry, aufs_bindex_t bcpup, -+ aufs_bindex_t btop) -+{ -+ int err; -+ struct dentry *h_parent; -+ struct inode *h_dir; -+ -+ if (add_entry) -+ IMustLock(d_inode(parent)); -+ else -+ di_write_lock_parent(parent); -+ -+ err = 0; -+ if (!au_h_dptr(parent, bcpup)) { -+ if (btop > bcpup) -+ err = au_cpup_dirs(dentry, bcpup); -+ else if (btop < bcpup) -+ err = au_cpdown_dirs(dentry, bcpup); -+ else -+ BUG(); -+ } -+ if (!err && add_entry && !au_ftest_wrdir(add_entry, TMPFILE)) { -+ h_parent = au_h_dptr(parent, bcpup); -+ h_dir = d_inode(h_parent); -+ inode_lock_shared_nested(h_dir, AuLsc_I_PARENT); -+ err = au_lkup_neg(dentry, bcpup, /*wh*/0); -+ /* todo: no unlock here */ -+ inode_unlock_shared(h_dir); -+ -+ AuDbg("bcpup %d\n", bcpup); -+ if (!err) { -+ if (d_really_is_negative(dentry)) -+ au_set_h_dptr(dentry, btop, NULL); -+ au_update_dbrange(dentry, /*do_put_zero*/0); -+ } -+ } -+ -+ if (!add_entry) -+ di_write_unlock(parent); -+ if (!err) -+ err = bcpup; /* success */ -+ -+ AuTraceErr(err); -+ return err; -+} -+ -+/* -+ * decide the branch and the parent dir where we will create a new entry. -+ * returns new bindex or an error. -+ * copyup the parent dir if needed. -+ */ -+int au_wr_dir(struct dentry *dentry, struct dentry *src_dentry, -+ struct au_wr_dir_args *args) -+{ -+ int err; -+ unsigned int flags; -+ aufs_bindex_t bcpup, btop, src_btop; -+ const unsigned char add_entry -+ = au_ftest_wrdir(args->flags, ADD_ENTRY) -+ | au_ftest_wrdir(args->flags, TMPFILE); -+ struct super_block *sb; -+ struct dentry *parent; -+ struct au_sbinfo *sbinfo; -+ -+ sb = dentry->d_sb; -+ sbinfo = au_sbi(sb); -+ parent = dget_parent(dentry); -+ btop = au_dbtop(dentry); -+ bcpup = btop; -+ if (args->force_btgt < 0) { -+ if (src_dentry) { -+ src_btop = au_dbtop(src_dentry); -+ if (src_btop < btop) -+ bcpup = src_btop; -+ } else if (add_entry) { -+ flags = 0; -+ if (au_ftest_wrdir(args->flags, ISDIR)) -+ au_fset_wbr(flags, DIR); -+ err = AuWbrCreate(sbinfo, dentry, flags); -+ bcpup = err; -+ } -+ -+ if (bcpup < 0 || au_test_ro(sb, bcpup, d_inode(dentry))) { -+ if (add_entry) -+ err = AuWbrCopyup(sbinfo, dentry); -+ else { -+ if (!IS_ROOT(dentry)) { -+ di_read_lock_parent(parent, !AuLock_IR); -+ err = AuWbrCopyup(sbinfo, dentry); -+ di_read_unlock(parent, !AuLock_IR); -+ } else -+ err = AuWbrCopyup(sbinfo, dentry); -+ } -+ bcpup = err; -+ if (unlikely(err < 0)) -+ goto out; -+ } -+ } else { -+ bcpup = args->force_btgt; -+ AuDebugOn(au_test_ro(sb, bcpup, d_inode(dentry))); -+ } -+ -+ AuDbg("btop %d, bcpup %d\n", btop, bcpup); -+ err = bcpup; -+ if (bcpup == btop) -+ goto out; /* success */ -+ -+ /* copyup the new parent into the branch we process */ -+ err = au_wr_dir_cpup(dentry, parent, add_entry, bcpup, btop); -+ if (err >= 0) { -+ if (d_really_is_negative(dentry)) { -+ au_set_h_dptr(dentry, btop, NULL); -+ au_set_dbtop(dentry, bcpup); -+ au_set_dbbot(dentry, bcpup); -+ } -+ AuDebugOn(add_entry -+ && !au_ftest_wrdir(args->flags, TMPFILE) -+ && !au_h_dptr(dentry, bcpup)); -+ } -+ -+out: -+ dput(parent); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+void au_pin_hdir_unlock(struct au_pin *p) -+{ -+ if (p->hdir) -+ au_hn_inode_unlock(p->hdir); -+} -+ -+int au_pin_hdir_lock(struct au_pin *p) -+{ -+ int err; -+ -+ err = 0; -+ if (!p->hdir) -+ goto out; -+ -+ /* even if an error happens later, keep this lock */ -+ au_hn_inode_lock_nested(p->hdir, p->lsc_hi); -+ -+ err = -EBUSY; -+ if (unlikely(p->hdir->hi_inode != d_inode(p->h_parent))) -+ goto out; -+ -+ err = 0; -+ if (p->h_dentry) -+ err = au_h_verify(p->h_dentry, p->udba, p->hdir->hi_inode, -+ p->h_parent, p->br); -+ -+out: -+ return err; -+} -+ -+int au_pin_hdir_relock(struct au_pin *p) -+{ -+ int err, i; -+ struct inode *h_i; -+ struct dentry *h_d[] = { -+ p->h_dentry, -+ p->h_parent -+ }; -+ -+ err = au_pin_hdir_lock(p); -+ if (unlikely(err)) -+ goto out; -+ -+ for (i = 0; !err && i < sizeof(h_d)/sizeof(*h_d); i++) { -+ if (!h_d[i]) -+ continue; -+ if (d_is_positive(h_d[i])) { -+ h_i = d_inode(h_d[i]); -+ err = !h_i->i_nlink; -+ } -+ } -+ -+out: -+ return err; -+} -+ -+static void au_pin_hdir_set_owner(struct au_pin *p, struct task_struct *task) -+{ -+ atomic_long_set(&p->hdir->hi_inode->i_rwsem.owner, (long)task); -+} -+ -+void au_pin_hdir_acquire_nest(struct au_pin *p) -+{ -+ if (p->hdir) { -+ rwsem_acquire_nest(&p->hdir->hi_inode->i_rwsem.dep_map, -+ p->lsc_hi, 0, NULL, _RET_IP_); -+ au_pin_hdir_set_owner(p, current); -+ } -+} -+ -+void au_pin_hdir_release(struct au_pin *p) -+{ -+ if (p->hdir) { -+ au_pin_hdir_set_owner(p, p->task); -+ rwsem_release(&p->hdir->hi_inode->i_rwsem.dep_map, _RET_IP_); -+ } -+} -+ -+struct dentry *au_pinned_h_parent(struct au_pin *pin) -+{ -+ if (pin && pin->parent) -+ return au_h_dptr(pin->parent, pin->bindex); -+ return NULL; -+} -+ -+void au_unpin(struct au_pin *p) -+{ -+ if (p->hdir) -+ au_pin_hdir_unlock(p); -+ if (p->h_mnt && au_ftest_pin(p->flags, MNT_WRITE)) -+ vfsub_mnt_drop_write(p->h_mnt); -+ if (!p->hdir) -+ return; -+ -+ if (!au_ftest_pin(p->flags, DI_LOCKED)) -+ di_read_unlock(p->parent, AuLock_IR); -+ iput(p->hdir->hi_inode); -+ dput(p->parent); -+ p->parent = NULL; -+ p->hdir = NULL; -+ p->h_mnt = NULL; -+ /* do not clear p->task */ -+} -+ -+int au_do_pin(struct au_pin *p) -+{ -+ int err; -+ struct super_block *sb; -+ struct inode *h_dir; -+ -+ err = 0; -+ sb = p->dentry->d_sb; -+ p->br = au_sbr(sb, p->bindex); -+ if (IS_ROOT(p->dentry)) { -+ if (au_ftest_pin(p->flags, MNT_WRITE)) { -+ p->h_mnt = au_br_mnt(p->br); -+ err = vfsub_mnt_want_write(p->h_mnt); -+ if (unlikely(err)) { -+ au_fclr_pin(p->flags, MNT_WRITE); -+ goto out_err; -+ } -+ } -+ goto out; -+ } -+ -+ p->h_dentry = NULL; -+ if (p->bindex <= au_dbbot(p->dentry)) -+ p->h_dentry = au_h_dptr(p->dentry, p->bindex); -+ -+ p->parent = dget_parent(p->dentry); -+ if (!au_ftest_pin(p->flags, DI_LOCKED)) -+ di_read_lock(p->parent, AuLock_IR, p->lsc_di); -+ -+ h_dir = NULL; -+ p->h_parent = au_h_dptr(p->parent, p->bindex); -+ p->hdir = au_hi(d_inode(p->parent), p->bindex); -+ if (p->hdir) -+ h_dir = p->hdir->hi_inode; -+ -+ /* -+ * udba case, or -+ * if DI_LOCKED is not set, then p->parent may be different -+ * and h_parent can be NULL. -+ */ -+ if (unlikely(!p->hdir || !h_dir || !p->h_parent)) { -+ err = -EBUSY; -+ if (!au_ftest_pin(p->flags, DI_LOCKED)) -+ di_read_unlock(p->parent, AuLock_IR); -+ dput(p->parent); -+ p->parent = NULL; -+ goto out_err; -+ } -+ -+ if (au_ftest_pin(p->flags, MNT_WRITE)) { -+ p->h_mnt = au_br_mnt(p->br); -+ err = vfsub_mnt_want_write(p->h_mnt); -+ if (unlikely(err)) { -+ au_fclr_pin(p->flags, MNT_WRITE); -+ if (!au_ftest_pin(p->flags, DI_LOCKED)) -+ di_read_unlock(p->parent, AuLock_IR); -+ dput(p->parent); -+ p->parent = NULL; -+ goto out_err; -+ } -+ } -+ -+ au_igrab(h_dir); -+ err = au_pin_hdir_lock(p); -+ if (!err) -+ goto out; /* success */ -+ -+ au_unpin(p); -+ -+out_err: -+ pr_err("err %d\n", err); -+ err = au_busy_or_stale(); -+out: -+ return err; -+} -+ -+void au_pin_init(struct au_pin *p, struct dentry *dentry, -+ aufs_bindex_t bindex, int lsc_di, int lsc_hi, -+ unsigned int udba, unsigned char flags) -+{ -+ p->dentry = dentry; -+ p->udba = udba; -+ p->lsc_di = lsc_di; -+ p->lsc_hi = lsc_hi; -+ p->flags = flags; -+ p->bindex = bindex; -+ -+ p->parent = NULL; -+ p->hdir = NULL; -+ p->h_mnt = NULL; -+ -+ p->h_dentry = NULL; -+ p->h_parent = NULL; -+ p->br = NULL; -+ p->task = current; -+} -+ -+int au_pin(struct au_pin *pin, struct dentry *dentry, aufs_bindex_t bindex, -+ unsigned int udba, unsigned char flags) -+{ -+ au_pin_init(pin, dentry, bindex, AuLsc_DI_PARENT, AuLsc_I_PARENT2, -+ udba, flags); -+ return au_do_pin(pin); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * ->setattr() and ->getattr() are called in various cases. -+ * chmod, stat: dentry is revalidated. -+ * fchmod, fstat: file and dentry are not revalidated, additionally they may be -+ * unhashed. -+ * for ->setattr(), ia->ia_file is passed from ftruncate only. -+ */ -+/* todo: consolidate with do_refresh() and simple_reval_dpath() */ -+int au_reval_for_attr(struct dentry *dentry, unsigned int sigen) -+{ -+ int err; -+ struct dentry *parent; -+ -+ err = 0; -+ if (au_digen_test(dentry, sigen)) { -+ parent = dget_parent(dentry); -+ di_read_lock_parent(parent, AuLock_IR); -+ err = au_refresh_dentry(dentry, parent); -+ di_read_unlock(parent, AuLock_IR); -+ dput(parent); -+ } -+ -+ AuTraceErr(err); -+ return err; -+} -+ -+int au_pin_and_icpup(struct dentry *dentry, struct iattr *ia, -+ struct au_icpup_args *a) -+{ -+ int err; -+ loff_t sz; -+ aufs_bindex_t btop, ibtop; -+ struct dentry *hi_wh, *parent; -+ struct inode *inode; -+ struct au_wr_dir_args wr_dir_args = { -+ .force_btgt = -1, -+ .flags = 0 -+ }; -+ -+ if (d_is_dir(dentry)) -+ au_fset_wrdir(wr_dir_args.flags, ISDIR); -+ /* plink or hi_wh() case */ -+ btop = au_dbtop(dentry); -+ inode = d_inode(dentry); -+ ibtop = au_ibtop(inode); -+ if (btop != ibtop && !au_test_ro(inode->i_sb, ibtop, inode)) -+ wr_dir_args.force_btgt = ibtop; -+ err = au_wr_dir(dentry, /*src_dentry*/NULL, &wr_dir_args); -+ if (unlikely(err < 0)) -+ goto out; -+ a->btgt = err; -+ if (err != btop) -+ au_fset_icpup(a->flags, DID_CPUP); -+ -+ err = 0; -+ a->pin_flags = AuPin_MNT_WRITE; -+ parent = NULL; -+ if (!IS_ROOT(dentry)) { -+ au_fset_pin(a->pin_flags, DI_LOCKED); -+ parent = dget_parent(dentry); -+ di_write_lock_parent(parent); -+ } -+ -+ err = au_pin(&a->pin, dentry, a->btgt, a->udba, a->pin_flags); -+ if (unlikely(err)) -+ goto out_parent; -+ -+ sz = -1; -+ a->h_path.dentry = au_h_dptr(dentry, btop); -+ a->h_inode = d_inode(a->h_path.dentry); -+ if (ia && (ia->ia_valid & ATTR_SIZE)) { -+ inode_lock_shared_nested(a->h_inode, AuLsc_I_CHILD); -+ if (ia->ia_size < i_size_read(a->h_inode)) -+ sz = ia->ia_size; -+ inode_unlock_shared(a->h_inode); -+ } -+ -+ hi_wh = NULL; -+ if (au_ftest_icpup(a->flags, DID_CPUP) && d_unlinked(dentry)) { -+ hi_wh = au_hi_wh(inode, a->btgt); -+ if (!hi_wh) { -+ struct au_cp_generic cpg = { -+ .dentry = dentry, -+ .bdst = a->btgt, -+ .bsrc = -1, -+ .len = sz, -+ .pin = &a->pin -+ }; -+ err = au_sio_cpup_wh(&cpg, /*file*/NULL); -+ if (unlikely(err)) -+ goto out_unlock; -+ hi_wh = au_hi_wh(inode, a->btgt); -+ /* todo: revalidate hi_wh? */ -+ } -+ } -+ -+ if (parent) { -+ au_pin_set_parent_lflag(&a->pin, /*lflag*/0); -+ di_downgrade_lock(parent, AuLock_IR); -+ dput(parent); -+ parent = NULL; -+ } -+ if (!au_ftest_icpup(a->flags, DID_CPUP)) -+ goto out; /* success */ -+ -+ if (!d_unhashed(dentry)) { -+ struct au_cp_generic cpg = { -+ .dentry = dentry, -+ .bdst = a->btgt, -+ .bsrc = btop, -+ .len = sz, -+ .pin = &a->pin, -+ .flags = AuCpup_DTIME | AuCpup_HOPEN -+ }; -+ err = au_sio_cpup_simple(&cpg); -+ if (!err) -+ a->h_path.dentry = au_h_dptr(dentry, a->btgt); -+ } else if (!hi_wh) -+ a->h_path.dentry = au_h_dptr(dentry, a->btgt); -+ else -+ a->h_path.dentry = hi_wh; /* do not dget here */ -+ -+out_unlock: -+ a->h_inode = d_inode(a->h_path.dentry); -+ if (!err) -+ goto out; /* success */ -+ au_unpin(&a->pin); -+out_parent: -+ if (parent) { -+ di_write_unlock(parent); -+ dput(parent); -+ } -+out: -+ if (!err) -+ inode_lock_nested(a->h_inode, AuLsc_I_CHILD); -+ return err; -+} -+ -+static int aufs_setattr(struct user_namespace *userns, struct dentry *dentry, -+ struct iattr *ia) -+{ -+ int err; -+ struct inode *inode, *delegated; -+ struct super_block *sb; -+ struct file *file; -+ struct au_icpup_args *a; -+ struct user_namespace *h_userns; -+ -+ inode = d_inode(dentry); -+ IMustLock(inode); -+ -+ err = setattr_prepare(userns, dentry, ia); -+ if (unlikely(err)) -+ goto out; -+ -+ err = -ENOMEM; -+ a = kzalloc(sizeof(*a), GFP_NOFS); -+ if (unlikely(!a)) -+ goto out; -+ -+ if (ia->ia_valid & (ATTR_KILL_SUID | ATTR_KILL_SGID)) -+ ia->ia_valid &= ~ATTR_MODE; -+ -+ file = NULL; -+ sb = dentry->d_sb; -+ err = si_read_lock(sb, AuLock_FLUSH | AuLock_NOPLM); -+ if (unlikely(err)) -+ goto out_kfree; -+ -+ if (ia->ia_valid & ATTR_FILE) { -+ /* currently ftruncate(2) only */ -+ AuDebugOn(!d_is_reg(dentry)); -+ file = ia->ia_file; -+ err = au_reval_and_lock_fdi(file, au_reopen_nondir, /*wlock*/1, -+ /*fi_lsc*/0); -+ if (unlikely(err)) -+ goto out_si; -+ ia->ia_file = au_hf_top(file); -+ a->udba = AuOpt_UDBA_NONE; -+ } else { -+ /* fchmod() doesn't pass ia_file */ -+ a->udba = au_opt_udba(sb); -+ di_write_lock_child(dentry); -+ /* no d_unlinked(), to set UDBA_NONE for root */ -+ if (d_unhashed(dentry)) -+ a->udba = AuOpt_UDBA_NONE; -+ if (a->udba != AuOpt_UDBA_NONE) { -+ AuDebugOn(IS_ROOT(dentry)); -+ err = au_reval_for_attr(dentry, au_sigen(sb)); -+ if (unlikely(err)) -+ goto out_dentry; -+ } -+ } -+ -+ err = au_pin_and_icpup(dentry, ia, a); -+ if (unlikely(err < 0)) -+ goto out_dentry; -+ if (au_ftest_icpup(a->flags, DID_CPUP)) { -+ ia->ia_file = NULL; -+ ia->ia_valid &= ~ATTR_FILE; -+ } -+ -+ a->h_path.mnt = au_sbr_mnt(sb, a->btgt); -+ 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; -+ } 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; -+ } -+ -+ if (ia->ia_valid & ATTR_SIZE) { -+ struct file *f; -+ -+ if (ia->ia_size < i_size_read(inode)) -+ /* unmap only */ -+ truncate_setsize(inode, ia->ia_size); -+ -+ f = NULL; -+ if (ia->ia_valid & ATTR_FILE) -+ f = ia->ia_file; -+ 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; -+ } -+ } -+ /* -+ * regardless aufs 'acl' option setting. -+ * why don't all acl-aware fs call this func from their ->setattr()? -+ */ -+ if (!err && (ia->ia_valid & ATTR_MODE)) { -+ h_userns = mnt_user_ns(a->h_path.mnt); -+ err = vfsub_acl_chmod(h_userns, a->h_inode, ia->ia_mode); -+ } -+ if (!err) -+ au_cpup_attr_changeable(inode); -+ -+out_unlock: -+ inode_unlock(a->h_inode); -+ au_unpin(&a->pin); -+ if (unlikely(err)) -+ au_update_dbtop(dentry); -+out_dentry: -+ di_write_unlock(dentry); -+ if (file) { -+ fi_write_unlock(file); -+ ia->ia_file = file; -+ ia->ia_valid |= ATTR_FILE; -+ } -+out_si: -+ si_read_unlock(sb); -+out_kfree: -+ au_kfree_rcu(a); -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+#if IS_ENABLED(CONFIG_AUFS_XATTR) || IS_ENABLED(CONFIG_FS_POSIX_ACL) -+static int au_h_path_to_set_attr(struct dentry *dentry, -+ struct au_icpup_args *a, struct path *h_path) -+{ -+ int err; -+ struct super_block *sb; -+ -+ sb = dentry->d_sb; -+ a->udba = au_opt_udba(sb); -+ /* no d_unlinked(), to set UDBA_NONE for root */ -+ if (d_unhashed(dentry)) -+ a->udba = AuOpt_UDBA_NONE; -+ if (a->udba != AuOpt_UDBA_NONE) { -+ AuDebugOn(IS_ROOT(dentry)); -+ err = au_reval_for_attr(dentry, au_sigen(sb)); -+ if (unlikely(err)) -+ goto out; -+ } -+ err = au_pin_and_icpup(dentry, /*ia*/NULL, a); -+ if (unlikely(err < 0)) -+ goto out; -+ -+ h_path->dentry = a->h_path.dentry; -+ h_path->mnt = au_sbr_mnt(sb, a->btgt); -+ -+out: -+ return err; -+} -+ -+ssize_t au_sxattr(struct dentry *dentry, struct inode *inode, -+ struct au_sxattr *arg) -+{ -+ int err; -+ struct path h_path; -+ struct super_block *sb; -+ struct au_icpup_args *a; -+ struct inode *h_inode; -+ struct user_namespace *h_userns; -+ -+ IMustLock(inode); -+ -+ err = -ENOMEM; -+ a = kzalloc(sizeof(*a), GFP_NOFS); -+ if (unlikely(!a)) -+ goto out; -+ -+ sb = dentry->d_sb; -+ err = si_read_lock(sb, AuLock_FLUSH | AuLock_NOPLM); -+ if (unlikely(err)) -+ goto out_kfree; -+ -+ h_path.dentry = NULL; /* silence gcc */ -+ di_write_lock_child(dentry); -+ err = au_h_path_to_set_attr(dentry, a, &h_path); -+ if (unlikely(err)) -+ goto out_di; -+ h_userns = mnt_user_ns(h_path.mnt); -+ -+ inode_unlock(a->h_inode); -+ switch (arg->type) { -+ case AU_XATTR_SET: -+ AuDebugOn(d_is_negative(h_path.dentry)); -+ err = vfsub_setxattr(h_userns, h_path.dentry, -+ arg->u.set.name, arg->u.set.value, -+ arg->u.set.size, arg->u.set.flags); -+ break; -+ case AU_ACL_SET: -+ err = -EOPNOTSUPP; -+ h_inode = d_inode(h_path.dentry); -+ if (h_inode->i_op->set_acl) { -+ /* this will call posix_acl_update_mode */ -+ err = h_inode->i_op->set_acl(h_userns, h_inode, -+ arg->u.acl_set.acl, -+ arg->u.acl_set.type); -+ } -+ break; -+ } -+ if (!err) -+ au_cpup_attr_timesizes(inode); -+ -+ au_unpin(&a->pin); -+ if (unlikely(err)) -+ au_update_dbtop(dentry); -+ -+out_di: -+ di_write_unlock(dentry); -+ si_read_unlock(sb); -+out_kfree: -+ au_kfree_rcu(a); -+out: -+ AuTraceErr(err); -+ return err; -+} -+#endif -+ -+static void au_refresh_iattr(struct inode *inode, struct kstat *st, -+ unsigned int nlink) -+{ -+ unsigned int n; -+ -+ inode->i_mode = st->mode; -+ /* don't i_[ug]id_write() here */ -+ inode->i_uid = st->uid; -+ inode->i_gid = st->gid; -+ inode->i_atime = st->atime; -+ inode->i_mtime = st->mtime; -+ inode->i_ctime = st->ctime; -+ -+ au_cpup_attr_nlink(inode, /*force*/0); -+ if (S_ISDIR(inode->i_mode)) { -+ n = inode->i_nlink; -+ n -= nlink; -+ n += st->nlink; -+ smp_mb(); /* for i_nlink */ -+ /* 0 can happen */ -+ set_nlink(inode, n); -+ } -+ -+ spin_lock(&inode->i_lock); -+ inode->i_blocks = st->blocks; -+ i_size_write(inode, st->size); -+ spin_unlock(&inode->i_lock); -+} -+ -+/* -+ * common routine for aufs_getattr() and au_getxattr(). -+ * returns zero or negative (an error). -+ * @dentry will be read-locked in success. -+ */ -+int au_h_path_getattr(struct dentry *dentry, struct inode *inode, int force, -+ struct path *h_path, int locked) -+{ -+ int err; -+ unsigned int mnt_flags, sigen; -+ unsigned char udba_none; -+ aufs_bindex_t bindex; -+ struct super_block *sb, *h_sb; -+ -+ h_path->mnt = NULL; -+ h_path->dentry = NULL; -+ -+ err = 0; -+ sb = dentry->d_sb; -+ mnt_flags = au_mntflags(sb); -+ udba_none = !!au_opt_test(mnt_flags, UDBA_NONE); -+ -+ if (unlikely(locked)) -+ goto body; /* skip locking dinfo */ -+ -+ /* support fstat(2) */ -+ if (!d_unlinked(dentry) && !udba_none) { -+ sigen = au_sigen(sb); -+ err = au_digen_test(dentry, sigen); -+ if (!err) { -+ di_read_lock_child(dentry, AuLock_IR); -+ err = au_dbrange_test(dentry); -+ if (unlikely(err)) { -+ di_read_unlock(dentry, AuLock_IR); -+ goto out; -+ } -+ } else { -+ AuDebugOn(IS_ROOT(dentry)); -+ di_write_lock_child(dentry); -+ err = au_dbrange_test(dentry); -+ if (!err) -+ err = au_reval_for_attr(dentry, sigen); -+ if (!err) -+ di_downgrade_lock(dentry, AuLock_IR); -+ else { -+ di_write_unlock(dentry); -+ goto out; -+ } -+ } -+ } else -+ di_read_lock_child(dentry, AuLock_IR); -+ -+body: -+ if (!inode) { -+ inode = d_inode(dentry); -+ if (unlikely(!inode)) -+ goto out; -+ } -+ bindex = au_ibtop(inode); -+ h_path->mnt = au_sbr_mnt(sb, bindex); -+ h_sb = h_path->mnt->mnt_sb; -+ if (!force -+ && !au_test_fs_bad_iattr(h_sb) -+ && udba_none) -+ goto out; /* success */ -+ -+ if (au_dbtop(dentry) == bindex) -+ h_path->dentry = au_h_dptr(dentry, bindex); -+ else if (au_opt_test(mnt_flags, PLINK) && au_plink_test(inode)) { -+ h_path->dentry = au_plink_lkup(inode, bindex); -+ if (IS_ERR(h_path->dentry)) -+ /* pretending success */ -+ h_path->dentry = NULL; -+ else -+ dput(h_path->dentry); -+ } -+ -+out: -+ return err; -+} -+ -+static int aufs_getattr(struct user_namespace *userns, const struct path *path, -+ struct kstat *st, u32 request, unsigned int query) -+{ -+ int err; -+ unsigned char positive; -+ struct path h_path; -+ struct dentry *dentry; -+ struct inode *inode; -+ struct super_block *sb; -+ -+ dentry = path->dentry; -+ inode = d_inode(dentry); -+ sb = dentry->d_sb; -+ err = si_read_lock(sb, AuLock_FLUSH | AuLock_NOPLM); -+ if (unlikely(err)) -+ goto out; -+ err = au_h_path_getattr(dentry, /*inode*/NULL, /*force*/0, &h_path, -+ /*locked*/0); -+ if (unlikely(err)) -+ goto out_si; -+ if (unlikely(!h_path.dentry)) -+ /* illegally overlapped or something */ -+ goto out_fill; /* pretending success */ -+ -+ positive = d_is_positive(h_path.dentry); -+ if (positive) -+ /* no vfsub version */ -+ err = vfs_getattr(&h_path, st, request, query); -+ if (!err) { -+ if (positive) -+ au_refresh_iattr(inode, st, -+ d_inode(h_path.dentry)->i_nlink); -+ goto out_fill; /* success */ -+ } -+ AuTraceErr(err); -+ goto out_di; -+ -+out_fill: -+ generic_fillattr(userns, inode, st); -+out_di: -+ di_read_unlock(dentry, AuLock_IR); -+out_si: -+ si_read_unlock(sb); -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static const char *aufs_get_link(struct dentry *dentry, struct inode *inode, -+ struct delayed_call *done) -+{ -+ const char *ret; -+ struct dentry *h_dentry; -+ struct inode *h_inode; -+ int err; -+ aufs_bindex_t bindex; -+ -+ ret = NULL; /* suppress a warning */ -+ err = -ECHILD; -+ if (!dentry) -+ goto out; -+ -+ err = aufs_read_lock(dentry, AuLock_IR | AuLock_GEN); -+ if (unlikely(err)) -+ goto out; -+ -+ err = au_d_hashed_positive(dentry); -+ if (unlikely(err)) -+ goto out_unlock; -+ -+ err = -EINVAL; -+ inode = d_inode(dentry); -+ bindex = au_ibtop(inode); -+ h_inode = au_h_iptr(inode, bindex); -+ if (unlikely(!h_inode->i_op->get_link)) -+ goto out_unlock; -+ -+ err = -EBUSY; -+ h_dentry = NULL; -+ if (au_dbtop(dentry) <= bindex) { -+ h_dentry = au_h_dptr(dentry, bindex); -+ if (h_dentry) -+ dget(h_dentry); -+ } -+ if (!h_dentry) { -+ h_dentry = d_find_any_alias(h_inode); -+ if (IS_ERR(h_dentry)) { -+ err = PTR_ERR(h_dentry); -+ goto out_unlock; -+ } -+ } -+ if (unlikely(!h_dentry)) -+ goto out_unlock; -+ -+ err = 0; -+ AuDbg("%ps\n", h_inode->i_op->get_link); -+ AuDbgDentry(h_dentry); -+ ret = vfs_get_link(h_dentry, done); -+ dput(h_dentry); -+ if (IS_ERR(ret)) -+ err = PTR_ERR(ret); -+ -+out_unlock: -+ aufs_read_unlock(dentry, AuLock_IR); -+out: -+ if (unlikely(err)) -+ ret = ERR_PTR(err); -+ AuTraceErrPtr(ret); -+ return ret; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int au_is_special(struct inode *inode) -+{ -+ return (inode->i_mode & (S_IFBLK | S_IFCHR | S_IFIFO | S_IFSOCK)); -+} -+ -+static int aufs_update_time(struct inode *inode, struct timespec64 *ts, -+ int flags) -+{ -+ int err; -+ aufs_bindex_t bindex; -+ struct super_block *sb; -+ struct inode *h_inode; -+ struct vfsmount *h_mnt; -+ -+ sb = inode->i_sb; -+ WARN_ONCE((flags & S_ATIME) && !IS_NOATIME(inode), -+ "unexpected s_flags 0x%lx", sb->s_flags); -+ -+ /* mmap_sem might be acquired already, cf. aufs_mmap() */ -+ lockdep_off(); -+ si_read_lock(sb, AuLock_FLUSH); -+ ii_write_lock_child(inode); -+ -+ err = 0; -+ bindex = au_ibtop(inode); -+ h_inode = au_h_iptr(inode, bindex); -+ if (!au_test_ro(sb, bindex, inode)) { -+ h_mnt = au_sbr_mnt(sb, bindex); -+ err = vfsub_mnt_want_write(h_mnt); -+ if (!err) { -+ err = vfsub_update_time(h_inode, ts, flags); -+ vfsub_mnt_drop_write(h_mnt); -+ } -+ } else if (au_is_special(h_inode)) { -+ /* -+ * Never copy-up here. -+ * These special files may already be opened and used for -+ * communicating. If we copied it up, then the communication -+ * would be corrupted. -+ */ -+ AuWarn1("timestamps for i%lu are ignored " -+ "since it is on readonly branch (hi%lu).\n", -+ inode->i_ino, h_inode->i_ino); -+ } else if (flags & ~S_ATIME) { -+ err = -EIO; -+ AuIOErr1("unexpected flags 0x%x\n", flags); -+ AuDebugOn(1); -+ } -+ -+ if (!err) -+ au_cpup_attr_timesizes(inode); -+ ii_write_unlock(inode); -+ si_read_unlock(sb); -+ lockdep_on(); -+ -+ if (!err && (flags & S_VERSION)) -+ inode_inc_iversion(inode); -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* no getattr version will be set by module.c:aufs_init() */ -+struct inode_operations aufs_iop_nogetattr[AuIop_Last], -+ aufs_iop[] = { -+ [AuIop_SYMLINK] = { -+ .permission = aufs_permission, -+#ifdef CONFIG_FS_POSIX_ACL -+ .get_acl = aufs_get_acl, -+ .set_acl = aufs_set_acl, /* unsupport for symlink? */ -+#endif -+ -+ .setattr = aufs_setattr, -+ .getattr = aufs_getattr, -+ -+#ifdef CONFIG_AUFS_XATTR -+ .listxattr = aufs_listxattr, -+#endif -+ -+ .get_link = aufs_get_link, -+ -+ /* .update_time = aufs_update_time */ -+ }, -+ [AuIop_DIR] = { -+ .create = aufs_create, -+ .lookup = aufs_lookup, -+ .link = aufs_link, -+ .unlink = aufs_unlink, -+ .symlink = aufs_symlink, -+ .mkdir = aufs_mkdir, -+ .rmdir = aufs_rmdir, -+ .mknod = aufs_mknod, -+ .rename = aufs_rename, -+ -+ .permission = aufs_permission, -+#ifdef CONFIG_FS_POSIX_ACL -+ .get_acl = aufs_get_acl, -+ .set_acl = aufs_set_acl, -+#endif -+ -+ .setattr = aufs_setattr, -+ .getattr = aufs_getattr, -+ -+#ifdef CONFIG_AUFS_XATTR -+ .listxattr = aufs_listxattr, -+#endif -+ -+ .update_time = aufs_update_time, -+ .atomic_open = aufs_atomic_open, -+ .tmpfile = aufs_tmpfile -+ }, -+ [AuIop_OTHER] = { -+ .permission = aufs_permission, -+#ifdef CONFIG_FS_POSIX_ACL -+ .get_acl = aufs_get_acl, -+ .set_acl = aufs_set_acl, -+#endif -+ -+ .setattr = aufs_setattr, -+ .getattr = aufs_getattr, -+ -+#ifdef CONFIG_AUFS_XATTR -+ .listxattr = aufs_listxattr, -+#endif -+ -+ .update_time = aufs_update_time -+ } -+}; -diff -Naur null/fs/aufs/i_op_del.c linux-5.15.36/fs/aufs/i_op_del.c ---- /dev/null -+++ linux-5.15.36/fs/aufs/i_op_del.c 2022-05-10 16:51:39.873744219 +0300 -@@ -0,0 +1,522 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program. If not, see . -+ */ -+ -+/* -+ * inode operations (del entry) -+ */ -+ -+#include -+#include "aufs.h" -+ -+/* -+ * decide if a new whiteout for @dentry is necessary or not. -+ * when it is necessary, prepare the parent dir for the upper branch whose -+ * branch index is @bcpup for creation. the actual creation of the whiteout will -+ * be done by caller. -+ * return value: -+ * 0: wh is unnecessary -+ * plus: wh is necessary -+ * minus: error -+ */ -+int au_wr_dir_need_wh(struct dentry *dentry, int isdir, aufs_bindex_t *bcpup) -+{ -+ int need_wh, err; -+ aufs_bindex_t btop; -+ struct super_block *sb; -+ -+ sb = dentry->d_sb; -+ btop = au_dbtop(dentry); -+ if (*bcpup < 0) { -+ *bcpup = btop; -+ if (au_test_ro(sb, btop, d_inode(dentry))) { -+ err = AuWbrCopyup(au_sbi(sb), dentry); -+ *bcpup = err; -+ if (unlikely(err < 0)) -+ goto out; -+ } -+ } else -+ AuDebugOn(btop < *bcpup -+ || au_test_ro(sb, *bcpup, d_inode(dentry))); -+ AuDbg("bcpup %d, btop %d\n", *bcpup, btop); -+ -+ if (*bcpup != btop) { -+ err = au_cpup_dirs(dentry, *bcpup); -+ if (unlikely(err)) -+ goto out; -+ need_wh = 1; -+ } else { -+ struct au_dinfo *dinfo, *tmp; -+ -+ need_wh = -ENOMEM; -+ dinfo = au_di(dentry); -+ tmp = au_di_alloc(sb, AuLsc_DI_TMP); -+ if (tmp) { -+ au_di_cp(tmp, dinfo); -+ au_di_swap(tmp, dinfo); -+ /* returns the number of positive dentries */ -+ need_wh = au_lkup_dentry(dentry, btop + 1, -+ /* AuLkup_IGNORE_PERM */ 0); -+ au_di_swap(tmp, dinfo); -+ au_rw_write_unlock(&tmp->di_rwsem); -+ au_di_free(tmp); -+ } -+ } -+ AuDbg("need_wh %d\n", need_wh); -+ err = need_wh; -+ -+out: -+ return err; -+} -+ -+/* -+ * simple tests for the del-entry operations. -+ * following the checks in vfs, plus the parent-child relationship. -+ */ -+int au_may_del(struct dentry *dentry, aufs_bindex_t bindex, -+ struct dentry *h_parent, int isdir) -+{ -+ int err; -+ umode_t h_mode; -+ struct dentry *h_dentry, *h_latest; -+ struct inode *h_inode; -+ struct path h_ppath; -+ struct super_block *sb; -+ struct au_branch *br; -+ struct user_namespace *h_userns; -+ -+ h_dentry = au_h_dptr(dentry, bindex); -+ if (d_really_is_positive(dentry)) { -+ err = -ENOENT; -+ if (unlikely(d_is_negative(h_dentry))) -+ goto out; -+ h_inode = d_inode(h_dentry); -+ if (unlikely(!h_inode->i_nlink)) -+ goto out; -+ -+ h_mode = h_inode->i_mode; -+ if (!isdir) { -+ err = -EISDIR; -+ if (unlikely(S_ISDIR(h_mode))) -+ goto out; -+ } else if (unlikely(!S_ISDIR(h_mode))) { -+ err = -ENOTDIR; -+ goto out; -+ } -+ } else { -+ /* rename(2) case */ -+ err = -EIO; -+ if (unlikely(d_is_positive(h_dentry))) -+ goto out; -+ } -+ -+ err = -ENOENT; -+ /* expected parent dir is locked */ -+ if (unlikely(h_parent != h_dentry->d_parent)) -+ goto out; -+ err = 0; -+ -+ /* -+ * rmdir a dir may break the consistency on some filesystem. -+ * let's try heavy test. -+ */ -+ err = -EACCES; -+ sb = dentry->d_sb; -+ br = au_sbr(sb, bindex); -+ h_userns = au_br_userns(br); -+ if (unlikely(!au_opt_test(au_mntflags(sb), DIRPERM1) -+ && au_test_h_perm(h_userns, d_inode(h_parent), -+ MAY_EXEC | MAY_WRITE))) -+ goto out; -+ -+ h_ppath.dentry = h_parent; -+ h_ppath.mnt = au_br_mnt(br); -+ h_latest = au_sio_lkup_one(h_userns, &dentry->d_name, &h_ppath); -+ err = -EIO; -+ if (IS_ERR(h_latest)) -+ goto out; -+ if (h_latest == h_dentry) -+ err = 0; -+ dput(h_latest); -+ -+out: -+ return err; -+} -+ -+/* -+ * decide the branch where we operate for @dentry. the branch index will be set -+ * @rbcpup. after deciding it, 'pin' it and store the timestamps of the parent -+ * dir for reverting. -+ * when a new whiteout is necessary, create it. -+ */ -+static struct dentry* -+lock_hdir_create_wh(struct dentry *dentry, int isdir, aufs_bindex_t *rbcpup, -+ struct au_dtime *dt, struct au_pin *pin) -+{ -+ struct dentry *wh_dentry; -+ struct super_block *sb; -+ struct path h_path; -+ int err, need_wh; -+ unsigned int udba; -+ aufs_bindex_t bcpup; -+ -+ need_wh = au_wr_dir_need_wh(dentry, isdir, rbcpup); -+ wh_dentry = ERR_PTR(need_wh); -+ if (unlikely(need_wh < 0)) -+ goto out; -+ -+ sb = dentry->d_sb; -+ udba = au_opt_udba(sb); -+ bcpup = *rbcpup; -+ err = au_pin(pin, dentry, bcpup, udba, -+ AuPin_DI_LOCKED | AuPin_MNT_WRITE); -+ wh_dentry = ERR_PTR(err); -+ if (unlikely(err)) -+ goto out; -+ -+ h_path.dentry = au_pinned_h_parent(pin); -+ if (udba != AuOpt_UDBA_NONE -+ && au_dbtop(dentry) == bcpup) { -+ err = au_may_del(dentry, bcpup, h_path.dentry, isdir); -+ wh_dentry = ERR_PTR(err); -+ if (unlikely(err)) -+ goto out_unpin; -+ } -+ -+ h_path.mnt = au_sbr_mnt(sb, bcpup); -+ au_dtime_store(dt, au_pinned_parent(pin), &h_path); -+ wh_dentry = NULL; -+ if (!need_wh) -+ goto out; /* success, no need to create whiteout */ -+ -+ wh_dentry = au_wh_create(dentry, bcpup, h_path.dentry); -+ if (IS_ERR(wh_dentry)) -+ goto out_unpin; -+ -+ /* returns with the parent is locked and wh_dentry is dget-ed */ -+ goto out; /* success */ -+ -+out_unpin: -+ au_unpin(pin); -+out: -+ return wh_dentry; -+} -+ -+/* -+ * when removing a dir, rename it to a unique temporary whiteout-ed name first -+ * in order to be revertible and save time for removing many child whiteouts -+ * under the dir. -+ * returns 1 when there are too many child whiteout and caller should remove -+ * them asynchronously. returns 0 when the number of children is enough small to -+ * remove now or the branch fs is a remote fs. -+ * otherwise return an error. -+ */ -+static int renwh_and_rmdir(struct dentry *dentry, aufs_bindex_t bindex, -+ struct au_nhash *whlist, struct inode *dir) -+{ -+ int rmdir_later, err, dirwh; -+ struct dentry *h_dentry; -+ struct super_block *sb; -+ struct inode *inode; -+ -+ sb = dentry->d_sb; -+ SiMustAnyLock(sb); -+ h_dentry = au_h_dptr(dentry, bindex); -+ err = au_whtmp_ren(h_dentry, au_sbr(sb, bindex)); -+ if (unlikely(err)) -+ goto out; -+ -+ /* stop monitoring */ -+ inode = d_inode(dentry); -+ au_hn_free(au_hi(inode, bindex)); -+ -+ if (!au_test_fs_remote(h_dentry->d_sb)) { -+ dirwh = au_sbi(sb)->si_dirwh; -+ rmdir_later = (dirwh <= 1); -+ if (!rmdir_later) -+ rmdir_later = au_nhash_test_longer_wh(whlist, bindex, -+ dirwh); -+ if (rmdir_later) -+ return rmdir_later; -+ } -+ -+ err = au_whtmp_rmdir(dir, bindex, h_dentry, whlist); -+ if (unlikely(err)) { -+ AuIOErr("rmdir %pd, b%d failed, %d. ignored\n", -+ h_dentry, bindex, err); -+ err = 0; -+ } -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+/* -+ * final procedure for deleting a entry. -+ * maintain dentry and iattr. -+ */ -+static void epilog(struct inode *dir, struct dentry *dentry, -+ aufs_bindex_t bindex) -+{ -+ struct inode *inode; -+ -+ inode = d_inode(dentry); -+ d_drop(dentry); -+ inode->i_ctime = dir->i_ctime; -+ -+ au_dir_ts(dir, bindex); -+ inode_inc_iversion(dir); -+} -+ -+/* -+ * when an error happened, remove the created whiteout and revert everything. -+ */ -+static int do_revert(int err, struct inode *dir, aufs_bindex_t bindex, -+ aufs_bindex_t bwh, struct dentry *wh_dentry, -+ struct dentry *dentry, struct au_dtime *dt) -+{ -+ int rerr; -+ struct path h_path = { -+ .dentry = wh_dentry, -+ .mnt = au_sbr_mnt(dir->i_sb, bindex) -+ }; -+ -+ rerr = au_wh_unlink_dentry(au_h_iptr(dir, bindex), &h_path, dentry); -+ if (!rerr) { -+ au_set_dbwh(dentry, bwh); -+ au_dtime_revert(dt); -+ return 0; -+ } -+ -+ AuIOErr("%pd reverting whiteout failed(%d, %d)\n", dentry, err, rerr); -+ return -EIO; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+int aufs_unlink(struct inode *dir, struct dentry *dentry) -+{ -+ int err; -+ aufs_bindex_t bwh, bindex, btop; -+ struct inode *inode, *h_dir, *delegated; -+ struct dentry *parent, *wh_dentry; -+ /* to reduce stack size */ -+ struct { -+ struct au_dtime dt; -+ struct au_pin pin; -+ struct path h_path; -+ } *a; -+ -+ IMustLock(dir); -+ -+ err = -ENOMEM; -+ a = kmalloc(sizeof(*a), GFP_NOFS); -+ if (unlikely(!a)) -+ goto out; -+ -+ err = aufs_read_lock(dentry, AuLock_DW | AuLock_GEN); -+ if (unlikely(err)) -+ goto out_free; -+ err = au_d_hashed_positive(dentry); -+ if (unlikely(err)) -+ goto out_unlock; -+ inode = d_inode(dentry); -+ IMustLock(inode); -+ err = -EISDIR; -+ if (unlikely(d_is_dir(dentry))) -+ goto out_unlock; /* possible? */ -+ -+ btop = au_dbtop(dentry); -+ bwh = au_dbwh(dentry); -+ bindex = -1; -+ parent = dentry->d_parent; /* dir inode is locked */ -+ di_write_lock_parent(parent); -+ wh_dentry = lock_hdir_create_wh(dentry, /*isdir*/0, &bindex, &a->dt, -+ &a->pin); -+ err = PTR_ERR(wh_dentry); -+ if (IS_ERR(wh_dentry)) -+ goto out_parent; -+ -+ a->h_path.mnt = au_sbr_mnt(dentry->d_sb, btop); -+ a->h_path.dentry = au_h_dptr(dentry, btop); -+ 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); -+ } -+ } else { -+ /* dir inode is locked */ -+ h_dir = d_inode(wh_dentry->d_parent); -+ IMustLock(h_dir); -+ err = 0; -+ } -+ -+ if (!err) { -+ vfsub_drop_nlink(inode); -+ epilog(dir, dentry, bindex); -+ -+ /* update target timestamps */ -+ if (bindex == btop) { -+ vfsub_update_h_iattr(&a->h_path, /*did*/NULL); -+ /*ignore*/ -+ inode->i_ctime = d_inode(a->h_path.dentry)->i_ctime; -+ } else -+ /* todo: this timestamp may be reverted later */ -+ inode->i_ctime = h_dir->i_ctime; -+ goto out_unpin; /* success */ -+ } -+ -+ /* revert */ -+ if (wh_dentry) { -+ int rerr; -+ -+ rerr = do_revert(err, dir, bindex, bwh, wh_dentry, dentry, -+ &a->dt); -+ if (rerr) -+ err = rerr; -+ } -+ -+out_unpin: -+ au_unpin(&a->pin); -+ dput(wh_dentry); -+ dput(a->h_path.dentry); -+out_parent: -+ di_write_unlock(parent); -+out_unlock: -+ aufs_read_unlock(dentry, AuLock_DW); -+out_free: -+ au_kfree_rcu(a); -+out: -+ return err; -+} -+ -+int aufs_rmdir(struct inode *dir, struct dentry *dentry) -+{ -+ int err, rmdir_later; -+ aufs_bindex_t bwh, bindex, btop; -+ struct inode *inode; -+ struct dentry *parent, *wh_dentry, *h_dentry; -+ struct au_whtmp_rmdir *args; -+ /* to reduce stack size */ -+ struct { -+ struct au_dtime dt; -+ struct au_pin pin; -+ } *a; -+ -+ IMustLock(dir); -+ -+ err = -ENOMEM; -+ a = kmalloc(sizeof(*a), GFP_NOFS); -+ if (unlikely(!a)) -+ goto out; -+ -+ err = aufs_read_lock(dentry, AuLock_DW | AuLock_FLUSH | AuLock_GEN); -+ if (unlikely(err)) -+ goto out_free; -+ err = au_alive_dir(dentry); -+ if (unlikely(err)) -+ goto out_unlock; -+ inode = d_inode(dentry); -+ IMustLock(inode); -+ err = -ENOTDIR; -+ if (unlikely(!d_is_dir(dentry))) -+ goto out_unlock; /* possible? */ -+ -+ err = -ENOMEM; -+ args = au_whtmp_rmdir_alloc(dir->i_sb, GFP_NOFS); -+ if (unlikely(!args)) -+ goto out_unlock; -+ -+ parent = dentry->d_parent; /* dir inode is locked */ -+ di_write_lock_parent(parent); -+ err = au_test_empty(dentry, &args->whlist); -+ if (unlikely(err)) -+ goto out_parent; -+ -+ btop = au_dbtop(dentry); -+ bwh = au_dbwh(dentry); -+ bindex = -1; -+ wh_dentry = lock_hdir_create_wh(dentry, /*isdir*/1, &bindex, &a->dt, -+ &a->pin); -+ err = PTR_ERR(wh_dentry); -+ if (IS_ERR(wh_dentry)) -+ goto out_parent; -+ -+ h_dentry = au_h_dptr(dentry, btop); -+ dget(h_dentry); -+ rmdir_later = 0; -+ if (bindex == btop) { -+ err = renwh_and_rmdir(dentry, btop, &args->whlist, dir); -+ if (err > 0) { -+ rmdir_later = err; -+ err = 0; -+ } -+ } else { -+ /* stop monitoring */ -+ au_hn_free(au_hi(inode, btop)); -+ -+ /* dir inode is locked */ -+ IMustLock(d_inode(wh_dentry->d_parent)); -+ err = 0; -+ } -+ -+ if (!err) { -+ vfsub_dead_dir(inode); -+ au_set_dbdiropq(dentry, -1); -+ epilog(dir, dentry, bindex); -+ -+ if (rmdir_later) { -+ au_whtmp_kick_rmdir(dir, btop, h_dentry, args); -+ args = NULL; -+ } -+ -+ goto out_unpin; /* success */ -+ } -+ -+ /* revert */ -+ AuLabel(revert); -+ if (wh_dentry) { -+ int rerr; -+ -+ rerr = do_revert(err, dir, bindex, bwh, wh_dentry, dentry, -+ &a->dt); -+ if (rerr) -+ err = rerr; -+ } -+ -+out_unpin: -+ au_unpin(&a->pin); -+ dput(wh_dentry); -+ dput(h_dentry); -+out_parent: -+ di_write_unlock(parent); -+ if (args) -+ au_whtmp_rmdir_free(args); -+out_unlock: -+ aufs_read_unlock(dentry, AuLock_DW); -+out_free: -+ au_kfree_rcu(a); -+out: -+ AuTraceErr(err); -+ return err; -+} -diff -Naur null/fs/aufs/i_op_ren.c linux-5.15.36/fs/aufs/i_op_ren.c ---- /dev/null -+++ linux-5.15.36/fs/aufs/i_op_ren.c 2022-05-10 16:51:39.873744219 +0300 -@@ -0,0 +1,1257 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program. If not, see . -+ */ -+ -+/* -+ * inode operation (rename entry) -+ * todo: this is crazy monster -+ */ -+ -+#include -+#include "aufs.h" -+ -+enum { AuSRC, AuDST, AuSrcDst }; -+enum { AuPARENT, AuCHILD, AuParentChild }; -+ -+#define AuRen_ISDIR_SRC 1 -+#define AuRen_ISDIR_DST (1 << 1) -+#define AuRen_ISSAMEDIR (1 << 2) -+#define AuRen_WHSRC (1 << 3) -+#define AuRen_WHDST (1 << 4) -+#define AuRen_MNT_WRITE (1 << 5) -+#define AuRen_DT_DSTDIR (1 << 6) -+#define AuRen_DIROPQ_SRC (1 << 7) -+#define AuRen_DIROPQ_DST (1 << 8) -+#define AuRen_DIRREN (1 << 9) -+#define AuRen_DROPPED_SRC (1 << 10) -+#define AuRen_DROPPED_DST (1 << 11) -+#define au_ftest_ren(flags, name) ((flags) & AuRen_##name) -+#define au_fset_ren(flags, name) \ -+ do { (flags) |= AuRen_##name; } while (0) -+#define au_fclr_ren(flags, name) \ -+ do { (flags) &= ~AuRen_##name; } while (0) -+ -+#ifndef CONFIG_AUFS_DIRREN -+#undef AuRen_DIRREN -+#define AuRen_DIRREN 0 -+#endif -+ -+struct au_ren_args { -+ struct { -+ struct dentry *dentry, *h_dentry, *parent, *h_parent, -+ *wh_dentry; -+ struct inode *dir, *inode; -+ struct au_hinode *hdir, *hinode; -+ struct au_dtime dt[AuParentChild]; -+ aufs_bindex_t btop, bdiropq; -+ } sd[AuSrcDst]; -+ -+#define src_dentry sd[AuSRC].dentry -+#define src_dir sd[AuSRC].dir -+#define src_inode sd[AuSRC].inode -+#define src_h_dentry sd[AuSRC].h_dentry -+#define src_parent sd[AuSRC].parent -+#define src_h_parent sd[AuSRC].h_parent -+#define src_wh_dentry sd[AuSRC].wh_dentry -+#define src_hdir sd[AuSRC].hdir -+#define src_hinode sd[AuSRC].hinode -+#define src_h_dir sd[AuSRC].hdir->hi_inode -+#define src_dt sd[AuSRC].dt -+#define src_btop sd[AuSRC].btop -+#define src_bdiropq sd[AuSRC].bdiropq -+ -+#define dst_dentry sd[AuDST].dentry -+#define dst_dir sd[AuDST].dir -+#define dst_inode sd[AuDST].inode -+#define dst_h_dentry sd[AuDST].h_dentry -+#define dst_parent sd[AuDST].parent -+#define dst_h_parent sd[AuDST].h_parent -+#define dst_wh_dentry sd[AuDST].wh_dentry -+#define dst_hdir sd[AuDST].hdir -+#define dst_hinode sd[AuDST].hinode -+#define dst_h_dir sd[AuDST].hdir->hi_inode -+#define dst_dt sd[AuDST].dt -+#define dst_btop sd[AuDST].btop -+#define dst_bdiropq sd[AuDST].bdiropq -+ -+ struct dentry *h_trap; -+ struct au_branch *br; -+ struct path h_path; -+ struct au_nhash whlist; -+ aufs_bindex_t btgt, src_bwh; -+ -+ struct { -+ unsigned short auren_flags; -+ unsigned char flags; /* syscall parameter */ -+ unsigned char exchange; -+ } __packed; -+ -+ struct au_whtmp_rmdir *thargs; -+ struct dentry *h_dst; -+ struct au_hinode *h_root; -+}; -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * functions for reverting. -+ * when an error happened in a single rename systemcall, we should revert -+ * everything as if nothing happened. -+ * we don't need to revert the copied-up/down the parent dir since they are -+ * harmless. -+ */ -+ -+#define RevertFailure(fmt, ...) do { \ -+ AuIOErr("revert failure: " fmt " (%d, %d)\n", \ -+ ##__VA_ARGS__, err, rerr); \ -+ err = -EIO; \ -+} while (0) -+ -+static void au_ren_do_rev_diropq(int err, struct au_ren_args *a, int idx) -+{ -+ int rerr; -+ struct dentry *d; -+#define src_or_dst(member) a->sd[idx].member -+ -+ d = src_or_dst(dentry); /* {src,dst}_dentry */ -+ au_hn_inode_lock_nested(src_or_dst(hinode), AuLsc_I_CHILD); -+ rerr = au_diropq_remove(d, a->btgt); -+ au_hn_inode_unlock(src_or_dst(hinode)); -+ au_set_dbdiropq(d, src_or_dst(bdiropq)); -+ if (rerr) -+ RevertFailure("remove diropq %pd", d); -+ -+#undef src_or_dst_ -+} -+ -+static void au_ren_rev_diropq(int err, struct au_ren_args *a) -+{ -+ if (au_ftest_ren(a->auren_flags, DIROPQ_SRC)) -+ au_ren_do_rev_diropq(err, a, AuSRC); -+ if (au_ftest_ren(a->auren_flags, DIROPQ_DST)) -+ au_ren_do_rev_diropq(err, a, AuDST); -+} -+ -+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 -+ }; -+ -+ a->h_path.dentry = vfsub_lkup_one(&a->src_dentry->d_name, &h_ppath); -+ rerr = PTR_ERR(a->h_path.dentry); -+ if (IS_ERR(a->h_path.dentry)) { -+ RevertFailure("lkup one %pd", a->src_dentry); -+ 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); -+ } -+ d_drop(a->h_path.dentry); -+ dput(a->h_path.dentry); -+ /* au_set_h_dptr(a->src_dentry, a->btgt, NULL); */ -+ if (rerr) -+ RevertFailure("rename %pd", a->src_dentry); -+} -+ -+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 -+ }; -+ -+ a->h_path.dentry = vfsub_lkup_one(&a->dst_dentry->d_name, &h_ppath); -+ rerr = PTR_ERR(a->h_path.dentry); -+ if (IS_ERR(a->h_path.dentry)) { -+ RevertFailure("lkup one %pd", a->dst_dentry); -+ return; -+ } -+ if (d_is_positive(a->h_path.dentry)) { -+ d_drop(a->h_path.dentry); -+ dput(a->h_path.dentry); -+ 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); -+ } -+ d_drop(a->h_path.dentry); -+ dput(a->h_path.dentry); -+ if (!rerr) -+ au_set_h_dptr(a->dst_dentry, a->btgt, dget(a->h_dst)); -+ else -+ RevertFailure("rename %pd", a->h_dst); -+} -+ -+static void au_ren_rev_whsrc(int err, struct au_ren_args *a) -+{ -+ int rerr; -+ -+ a->h_path.dentry = a->src_wh_dentry; -+ rerr = au_wh_unlink_dentry(a->src_h_dir, &a->h_path, a->src_dentry); -+ au_set_dbwh(a->src_dentry, a->src_bwh); -+ if (rerr) -+ RevertFailure("unlink %pd", a->src_wh_dentry); -+} -+#undef RevertFailure -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * when we have to copyup the renaming entry, do it with the rename-target name -+ * in order to minimize the cost (the later actual rename is unnecessary). -+ * otherwise rename it on the target branch. -+ */ -+static int au_ren_or_cpup(struct au_ren_args *a) -+{ -+ 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); -+ } -+ } else -+ BUG(); -+ -+ if (!err && a->h_dst) -+ /* it will be set to dinfo later */ -+ dget(a->h_dst); -+ -+ return err; -+} -+ -+/* cf. aufs_rmdir() */ -+static int au_ren_del_whtmp(struct au_ren_args *a) -+{ -+ int err; -+ struct inode *dir; -+ -+ dir = a->dst_dir; -+ SiMustAnyLock(dir->i_sb); -+ if (!au_nhash_test_longer_wh(&a->whlist, a->btgt, -+ au_sbi(dir->i_sb)->si_dirwh) -+ || au_test_fs_remote(a->h_dst->d_sb)) { -+ err = au_whtmp_rmdir(dir, a->btgt, a->h_dst, &a->whlist); -+ if (unlikely(err)) -+ pr_warn("failed removing whtmp dir %pd (%d), " -+ "ignored.\n", a->h_dst, err); -+ } else { -+ au_nhash_wh_free(&a->thargs->whlist); -+ a->thargs->whlist = a->whlist; -+ a->whlist.nh_num = 0; -+ au_whtmp_kick_rmdir(dir, a->btgt, a->h_dst, a->thargs); -+ dput(a->h_dst); -+ a->thargs = NULL; -+ } -+ -+ return 0; -+} -+ -+/* make it 'opaque' dir. */ -+static int au_ren_do_diropq(struct au_ren_args *a, int idx) -+{ -+ int err; -+ struct dentry *d, *diropq; -+#define src_or_dst(member) a->sd[idx].member -+ -+ err = 0; -+ d = src_or_dst(dentry); /* {src,dst}_dentry */ -+ src_or_dst(bdiropq) = au_dbdiropq(d); -+ src_or_dst(hinode) = au_hi(src_or_dst(inode), a->btgt); -+ au_hn_inode_lock_nested(src_or_dst(hinode), AuLsc_I_CHILD); -+ diropq = au_diropq_create(d, a->btgt); -+ au_hn_inode_unlock(src_or_dst(hinode)); -+ if (IS_ERR(diropq)) -+ err = PTR_ERR(diropq); -+ else -+ dput(diropq); -+ -+#undef src_or_dst_ -+ return err; -+} -+ -+static int au_ren_diropq(struct au_ren_args *a) -+{ -+ int err; -+ unsigned char always; -+ struct dentry *d; -+ -+ err = 0; -+ d = a->dst_dentry; /* already renamed on the branch */ -+ always = !!au_opt_test(au_mntflags(d->d_sb), ALWAYS_DIROPQ); -+ if (au_ftest_ren(a->auren_flags, ISDIR_SRC) -+ && !au_ftest_ren(a->auren_flags, DIRREN) -+ && a->btgt != au_dbdiropq(a->src_dentry) -+ && (a->dst_wh_dentry -+ || a->btgt <= au_dbdiropq(d) -+ /* hide the lower to keep xino */ -+ /* the lowers may not be a dir, but we hide them anyway */ -+ || a->btgt < au_dbbot(d) -+ || always)) { -+ AuDbg("here\n"); -+ err = au_ren_do_diropq(a, AuSRC); -+ if (unlikely(err)) -+ goto out; -+ au_fset_ren(a->auren_flags, DIROPQ_SRC); -+ } -+ if (!a->exchange) -+ goto out; /* success */ -+ -+ d = a->src_dentry; /* already renamed on the branch */ -+ if (au_ftest_ren(a->auren_flags, ISDIR_DST) -+ && a->btgt != au_dbdiropq(a->dst_dentry) -+ && (a->btgt < au_dbdiropq(d) -+ || a->btgt < au_dbbot(d) -+ || always)) { -+ AuDbgDentry(a->src_dentry); -+ AuDbgDentry(a->dst_dentry); -+ err = au_ren_do_diropq(a, AuDST); -+ if (unlikely(err)) -+ goto out_rev_src; -+ au_fset_ren(a->auren_flags, DIROPQ_DST); -+ } -+ goto out; /* success */ -+ -+out_rev_src: -+ AuDbg("err %d, reverting src\n", err); -+ au_ren_rev_diropq(err, a); -+out: -+ return err; -+} -+ -+static int do_rename(struct au_ren_args *a) -+{ -+ int err; -+ struct dentry *d, *h_d; -+ -+ if (!a->exchange) { -+ /* prepare workqueue args for asynchronous rmdir */ -+ h_d = a->dst_h_dentry; -+ if (au_ftest_ren(a->auren_flags, ISDIR_DST) -+ /* && !au_ftest_ren(a->auren_flags, DIRREN) */ -+ && d_is_positive(h_d)) { -+ err = -ENOMEM; -+ a->thargs = au_whtmp_rmdir_alloc(a->src_dentry->d_sb, -+ GFP_NOFS); -+ if (unlikely(!a->thargs)) -+ goto out; -+ a->h_dst = dget(h_d); -+ } -+ -+ /* create whiteout for src_dentry */ -+ if (au_ftest_ren(a->auren_flags, WHSRC)) { -+ a->src_bwh = au_dbwh(a->src_dentry); -+ AuDebugOn(a->src_bwh >= 0); -+ a->src_wh_dentry = au_wh_create(a->src_dentry, a->btgt, -+ a->src_h_parent); -+ err = PTR_ERR(a->src_wh_dentry); -+ if (IS_ERR(a->src_wh_dentry)) -+ goto out_thargs; -+ } -+ -+ /* lookup whiteout for dentry */ -+ if (au_ftest_ren(a->auren_flags, WHDST)) { -+ h_d = au_wh_lkup(a->dst_h_parent, -+ &a->dst_dentry->d_name, a->br); -+ err = PTR_ERR(h_d); -+ if (IS_ERR(h_d)) -+ goto out_whsrc; -+ if (d_is_negative(h_d)) -+ dput(h_d); -+ else -+ a->dst_wh_dentry = h_d; -+ } -+ -+ /* rename dentry to tmpwh */ -+ if (a->thargs) { -+ err = au_whtmp_ren(a->dst_h_dentry, a->br); -+ if (unlikely(err)) -+ goto out_whdst; -+ -+ d = a->dst_dentry; -+ au_set_h_dptr(d, a->btgt, NULL); -+ err = au_lkup_neg(d, a->btgt, /*wh*/0); -+ if (unlikely(err)) -+ goto out_whtmp; -+ a->dst_h_dentry = au_h_dptr(d, a->btgt); -+ } -+ } -+ -+ BUG_ON(d_is_positive(a->dst_h_dentry) && a->src_btop != a->btgt); -+#if 0 /* debugging */ -+ BUG_ON(!au_ftest_ren(a->auren_flags, DIRREN) -+ && d_is_positive(a->dst_h_dentry) -+ && a->src_btop != a->btgt); -+#endif -+ -+ /* rename by vfs_rename or cpup */ -+ err = au_ren_or_cpup(a); -+ if (unlikely(err)) -+ /* leave the copied-up one */ -+ goto out_whtmp; -+ -+ /* make dir opaque */ -+ err = au_ren_diropq(a); -+ if (unlikely(err)) -+ goto out_rename; -+ -+ /* update target timestamps */ -+ if (a->exchange) { -+ AuDebugOn(au_dbtop(a->dst_dentry) != a->btgt); -+ a->h_path.dentry = au_h_dptr(a->dst_dentry, a->btgt); -+ vfsub_update_h_iattr(&a->h_path, /*did*/NULL); /*ignore*/ -+ a->dst_inode->i_ctime = d_inode(a->h_path.dentry)->i_ctime; -+ } -+ AuDebugOn(au_dbtop(a->src_dentry) != a->btgt); -+ a->h_path.dentry = au_h_dptr(a->src_dentry, a->btgt); -+ vfsub_update_h_iattr(&a->h_path, /*did*/NULL); /*ignore*/ -+ a->src_inode->i_ctime = d_inode(a->h_path.dentry)->i_ctime; -+ -+ if (!a->exchange) { -+ /* remove whiteout for dentry */ -+ if (a->dst_wh_dentry) { -+ a->h_path.dentry = a->dst_wh_dentry; -+ err = au_wh_unlink_dentry(a->dst_h_dir, &a->h_path, -+ a->dst_dentry); -+ if (unlikely(err)) -+ goto out_diropq; -+ } -+ -+ /* remove whtmp */ -+ if (a->thargs) -+ au_ren_del_whtmp(a); /* ignore this error */ -+ -+ au_fhsm_wrote(a->src_dentry->d_sb, a->btgt, /*force*/0); -+ } -+ err = 0; -+ goto out_success; -+ -+out_diropq: -+ au_ren_rev_diropq(err, a); -+out_rename: -+ au_ren_rev_rename(err, a); -+ dput(a->h_dst); -+out_whtmp: -+ if (a->thargs) -+ au_ren_rev_whtmp(err, a); -+out_whdst: -+ dput(a->dst_wh_dentry); -+ a->dst_wh_dentry = NULL; -+out_whsrc: -+ if (a->src_wh_dentry) -+ au_ren_rev_whsrc(err, a); -+out_success: -+ dput(a->src_wh_dentry); -+ dput(a->dst_wh_dentry); -+out_thargs: -+ if (a->thargs) { -+ dput(a->h_dst); -+ au_whtmp_rmdir_free(a->thargs); -+ a->thargs = NULL; -+ } -+out: -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * test if @dentry dir can be rename destination or not. -+ * success means, it is a logically empty dir. -+ */ -+static int may_rename_dstdir(struct dentry *dentry, struct au_nhash *whlist) -+{ -+ return au_test_empty(dentry, whlist); -+} -+ -+/* -+ * test if @a->src_dentry dir can be rename source or not. -+ * if it can, return 0. -+ * success means, -+ * - it is a logically empty dir. -+ * - or, it exists on writable branch and has no children including whiteouts -+ * on the lower branch unless DIRREN is on. -+ */ -+static int may_rename_srcdir(struct au_ren_args *a) -+{ -+ int err; -+ unsigned int rdhash; -+ aufs_bindex_t btop, btgt; -+ struct dentry *dentry; -+ struct super_block *sb; -+ struct au_sbinfo *sbinfo; -+ -+ dentry = a->src_dentry; -+ sb = dentry->d_sb; -+ sbinfo = au_sbi(sb); -+ if (au_opt_test(sbinfo->si_mntflags, DIRREN)) -+ au_fset_ren(a->auren_flags, DIRREN); -+ -+ btgt = a->btgt; -+ btop = au_dbtop(dentry); -+ if (btop != btgt) { -+ struct au_nhash whlist; -+ -+ SiMustAnyLock(sb); -+ rdhash = sbinfo->si_rdhash; -+ if (!rdhash) -+ rdhash = au_rdhash_est(au_dir_size(/*file*/NULL, -+ dentry)); -+ err = au_nhash_alloc(&whlist, rdhash, GFP_NOFS); -+ if (unlikely(err)) -+ goto out; -+ err = au_test_empty(dentry, &whlist); -+ au_nhash_wh_free(&whlist); -+ goto out; -+ } -+ -+ if (btop == au_dbtaildir(dentry)) -+ return 0; /* success */ -+ -+ err = au_test_empty_lower(dentry); -+ -+out: -+ if (err == -ENOTEMPTY) { -+ if (au_ftest_ren(a->auren_flags, DIRREN)) { -+ err = 0; -+ } else { -+ AuWarn1("renaming dir who has child(ren) on multiple " -+ "branches, is not supported\n"); -+ err = -EXDEV; -+ } -+ } -+ return err; -+} -+ -+/* side effect: sets whlist and h_dentry */ -+static int au_ren_may_dir(struct au_ren_args *a) -+{ -+ int err; -+ unsigned int rdhash; -+ struct dentry *d; -+ -+ d = a->dst_dentry; -+ SiMustAnyLock(d->d_sb); -+ -+ err = 0; -+ if (au_ftest_ren(a->auren_flags, ISDIR_DST) && a->dst_inode) { -+ rdhash = au_sbi(d->d_sb)->si_rdhash; -+ if (!rdhash) -+ rdhash = au_rdhash_est(au_dir_size(/*file*/NULL, d)); -+ err = au_nhash_alloc(&a->whlist, rdhash, GFP_NOFS); -+ if (unlikely(err)) -+ goto out; -+ -+ if (!a->exchange) { -+ au_set_dbtop(d, a->dst_btop); -+ err = may_rename_dstdir(d, &a->whlist); -+ au_set_dbtop(d, a->btgt); -+ } else -+ err = may_rename_srcdir(a); -+ } -+ a->dst_h_dentry = au_h_dptr(d, au_dbtop(d)); -+ if (unlikely(err)) -+ goto out; -+ -+ d = a->src_dentry; -+ a->src_h_dentry = au_h_dptr(d, au_dbtop(d)); -+ if (au_ftest_ren(a->auren_flags, ISDIR_SRC)) { -+ err = may_rename_srcdir(a); -+ if (unlikely(err)) { -+ au_nhash_wh_free(&a->whlist); -+ a->whlist.nh_num = 0; -+ } -+ } -+out: -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * simple tests for rename. -+ * following the checks in vfs, plus the parent-child relationship. -+ */ -+static int au_may_ren(struct au_ren_args *a) -+{ -+ int err, isdir; -+ struct inode *h_inode; -+ -+ if (a->src_btop == a->btgt) { -+ err = au_may_del(a->src_dentry, a->btgt, a->src_h_parent, -+ au_ftest_ren(a->auren_flags, ISDIR_SRC)); -+ if (unlikely(err)) -+ goto out; -+ err = -EINVAL; -+ if (unlikely(a->src_h_dentry == a->h_trap)) -+ goto out; -+ } -+ -+ err = 0; -+ if (a->dst_btop != a->btgt) -+ goto out; -+ -+ err = -ENOTEMPTY; -+ if (unlikely(a->dst_h_dentry == a->h_trap)) -+ goto out; -+ -+ err = -EIO; -+ isdir = !!au_ftest_ren(a->auren_flags, ISDIR_DST); -+ if (d_really_is_negative(a->dst_dentry)) { -+ if (d_is_negative(a->dst_h_dentry)) -+ err = au_may_add(a->dst_dentry, a->btgt, -+ a->dst_h_parent, isdir); -+ } else { -+ if (unlikely(d_is_negative(a->dst_h_dentry))) -+ goto out; -+ h_inode = d_inode(a->dst_h_dentry); -+ if (h_inode->i_nlink) -+ err = au_may_del(a->dst_dentry, a->btgt, -+ a->dst_h_parent, isdir); -+ } -+ -+out: -+ if (unlikely(err == -ENOENT || err == -EEXIST)) -+ err = -EIO; -+ AuTraceErr(err); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * locking order -+ * (VFS) -+ * - src_dir and dir by lock_rename() -+ * - inode if exists -+ * (aufs) -+ * - lock all -+ * + src_dentry and dentry by aufs_read_and_write_lock2() which calls, -+ * + si_read_lock -+ * + di_write_lock2_child() -+ * + di_write_lock_child() -+ * + ii_write_lock_child() -+ * + di_write_lock_child2() -+ * + ii_write_lock_child2() -+ * + src_parent and parent -+ * + di_write_lock_parent() -+ * + ii_write_lock_parent() -+ * + di_write_lock_parent2() -+ * + ii_write_lock_parent2() -+ * + lower src_dir and dir by vfsub_lock_rename() -+ * + verify the every relationships between child and parent. if any -+ * of them failed, unlock all and return -EBUSY. -+ */ -+static void au_ren_unlock(struct au_ren_args *a) -+{ -+ vfsub_unlock_rename(a->src_h_parent, a->src_hdir, -+ a->dst_h_parent, a->dst_hdir); -+ if (au_ftest_ren(a->auren_flags, DIRREN) -+ && a->h_root) -+ au_hn_inode_unlock(a->h_root); -+ if (au_ftest_ren(a->auren_flags, MNT_WRITE)) -+ vfsub_mnt_drop_write(au_br_mnt(a->br)); -+} -+ -+static int au_ren_lock(struct au_ren_args *a) -+{ -+ int err; -+ unsigned int udba; -+ -+ err = 0; -+ a->src_h_parent = au_h_dptr(a->src_parent, a->btgt); -+ a->src_hdir = au_hi(a->src_dir, a->btgt); -+ a->dst_h_parent = au_h_dptr(a->dst_parent, a->btgt); -+ a->dst_hdir = au_hi(a->dst_dir, a->btgt); -+ -+ err = vfsub_mnt_want_write(au_br_mnt(a->br)); -+ if (unlikely(err)) -+ goto out; -+ au_fset_ren(a->auren_flags, MNT_WRITE); -+ if (au_ftest_ren(a->auren_flags, DIRREN)) { -+ struct dentry *root; -+ struct inode *dir; -+ -+ /* -+ * sbinfo is already locked, so this ii_read_lock is -+ * unnecessary. but our debugging feature checks it. -+ */ -+ root = a->src_inode->i_sb->s_root; -+ if (root != a->src_parent && root != a->dst_parent) { -+ dir = d_inode(root); -+ ii_read_lock_parent3(dir); -+ a->h_root = au_hi(dir, a->btgt); -+ ii_read_unlock(dir); -+ au_hn_inode_lock_nested(a->h_root, AuLsc_I_PARENT3); -+ } -+ } -+ a->h_trap = vfsub_lock_rename(a->src_h_parent, a->src_hdir, -+ a->dst_h_parent, a->dst_hdir); -+ udba = au_opt_udba(a->src_dentry->d_sb); -+ if (unlikely(a->src_hdir->hi_inode != d_inode(a->src_h_parent) -+ || a->dst_hdir->hi_inode != d_inode(a->dst_h_parent))) -+ err = au_busy_or_stale(); -+ if (!err && au_dbtop(a->src_dentry) == a->btgt) -+ err = au_h_verify(a->src_h_dentry, udba, -+ d_inode(a->src_h_parent), a->src_h_parent, -+ a->br); -+ if (!err && au_dbtop(a->dst_dentry) == a->btgt) -+ err = au_h_verify(a->dst_h_dentry, udba, -+ d_inode(a->dst_h_parent), a->dst_h_parent, -+ a->br); -+ if (!err) -+ goto out; /* success */ -+ -+ err = au_busy_or_stale(); -+ au_ren_unlock(a); -+ -+out: -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static void au_ren_refresh_dir(struct au_ren_args *a) -+{ -+ struct inode *dir; -+ -+ dir = a->dst_dir; -+ inode_inc_iversion(dir); -+ if (au_ftest_ren(a->auren_flags, ISDIR_SRC)) { -+ /* is this updating defined in POSIX? */ -+ au_cpup_attr_timesizes(a->src_inode); -+ au_cpup_attr_nlink(dir, /*force*/1); -+ } -+ au_dir_ts(dir, a->btgt); -+ -+ if (a->exchange) { -+ dir = a->src_dir; -+ inode_inc_iversion(dir); -+ if (au_ftest_ren(a->auren_flags, ISDIR_DST)) { -+ /* is this updating defined in POSIX? */ -+ au_cpup_attr_timesizes(a->dst_inode); -+ au_cpup_attr_nlink(dir, /*force*/1); -+ } -+ au_dir_ts(dir, a->btgt); -+ } -+ -+ if (au_ftest_ren(a->auren_flags, ISSAMEDIR)) -+ return; -+ -+ dir = a->src_dir; -+ inode_inc_iversion(dir); -+ if (au_ftest_ren(a->auren_flags, ISDIR_SRC)) -+ au_cpup_attr_nlink(dir, /*force*/1); -+ au_dir_ts(dir, a->btgt); -+} -+ -+static void au_ren_refresh(struct au_ren_args *a) -+{ -+ aufs_bindex_t bbot, bindex; -+ struct dentry *d, *h_d; -+ struct inode *i, *h_i; -+ struct super_block *sb; -+ -+ d = a->dst_dentry; -+ d_drop(d); -+ if (a->h_dst) -+ /* already dget-ed by au_ren_or_cpup() */ -+ au_set_h_dptr(d, a->btgt, a->h_dst); -+ -+ i = a->dst_inode; -+ if (i) { -+ if (!a->exchange) { -+ if (!au_ftest_ren(a->auren_flags, ISDIR_DST)) -+ vfsub_drop_nlink(i); -+ else { -+ vfsub_dead_dir(i); -+ au_cpup_attr_timesizes(i); -+ } -+ au_update_dbrange(d, /*do_put_zero*/1); -+ } else -+ au_cpup_attr_nlink(i, /*force*/1); -+ } else { -+ bbot = a->btgt; -+ for (bindex = au_dbtop(d); bindex < bbot; bindex++) -+ au_set_h_dptr(d, bindex, NULL); -+ bbot = au_dbbot(d); -+ for (bindex = a->btgt + 1; bindex <= bbot; bindex++) -+ au_set_h_dptr(d, bindex, NULL); -+ au_update_dbrange(d, /*do_put_zero*/0); -+ } -+ -+ if (a->exchange -+ || au_ftest_ren(a->auren_flags, DIRREN)) { -+ d_drop(a->src_dentry); -+ if (au_ftest_ren(a->auren_flags, DIRREN)) -+ au_set_dbwh(a->src_dentry, -1); -+ return; -+ } -+ -+ d = a->src_dentry; -+ au_set_dbwh(d, -1); -+ bbot = au_dbbot(d); -+ for (bindex = a->btgt + 1; bindex <= bbot; bindex++) { -+ h_d = au_h_dptr(d, bindex); -+ if (h_d) -+ au_set_h_dptr(d, bindex, NULL); -+ } -+ au_set_dbbot(d, a->btgt); -+ -+ sb = d->d_sb; -+ i = a->src_inode; -+ if (au_opt_test(au_mntflags(sb), PLINK) && au_plink_test(i)) -+ return; /* success */ -+ -+ bbot = au_ibbot(i); -+ for (bindex = a->btgt + 1; bindex <= bbot; bindex++) { -+ h_i = au_h_iptr(i, bindex); -+ if (h_i) { -+ au_xino_write(sb, bindex, h_i->i_ino, /*ino*/0); -+ /* ignore this error */ -+ au_set_h_iptr(i, bindex, NULL, 0); -+ } -+ } -+ au_set_ibbot(i, a->btgt); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* mainly for link(2) and rename(2) */ -+int au_wbr(struct dentry *dentry, aufs_bindex_t btgt) -+{ -+ aufs_bindex_t bdiropq, bwh; -+ struct dentry *parent; -+ struct au_branch *br; -+ -+ parent = dentry->d_parent; -+ IMustLock(d_inode(parent)); /* dir is locked */ -+ -+ bdiropq = au_dbdiropq(parent); -+ bwh = au_dbwh(dentry); -+ br = au_sbr(dentry->d_sb, btgt); -+ if (au_br_rdonly(br) -+ || (0 <= bdiropq && bdiropq < btgt) -+ || (0 <= bwh && bwh < btgt)) -+ btgt = -1; -+ -+ AuDbg("btgt %d\n", btgt); -+ return btgt; -+} -+ -+/* sets src_btop, dst_btop and btgt */ -+static int au_ren_wbr(struct au_ren_args *a) -+{ -+ int err; -+ struct au_wr_dir_args wr_dir_args = { -+ /* .force_btgt = -1, */ -+ .flags = AuWrDir_ADD_ENTRY -+ }; -+ -+ a->src_btop = au_dbtop(a->src_dentry); -+ a->dst_btop = au_dbtop(a->dst_dentry); -+ if (au_ftest_ren(a->auren_flags, ISDIR_SRC) -+ || au_ftest_ren(a->auren_flags, ISDIR_DST)) -+ au_fset_wrdir(wr_dir_args.flags, ISDIR); -+ wr_dir_args.force_btgt = a->src_btop; -+ if (a->dst_inode && a->dst_btop < a->src_btop) -+ wr_dir_args.force_btgt = a->dst_btop; -+ wr_dir_args.force_btgt = au_wbr(a->dst_dentry, wr_dir_args.force_btgt); -+ err = au_wr_dir(a->dst_dentry, a->src_dentry, &wr_dir_args); -+ a->btgt = err; -+ if (a->exchange) -+ au_update_dbtop(a->dst_dentry); -+ -+ return err; -+} -+ -+static void au_ren_dt(struct au_ren_args *a) -+{ -+ a->h_path.dentry = a->src_h_parent; -+ au_dtime_store(a->src_dt + AuPARENT, a->src_parent, &a->h_path); -+ if (!au_ftest_ren(a->auren_flags, ISSAMEDIR)) { -+ a->h_path.dentry = a->dst_h_parent; -+ au_dtime_store(a->dst_dt + AuPARENT, a->dst_parent, &a->h_path); -+ } -+ -+ au_fclr_ren(a->auren_flags, DT_DSTDIR); -+ if (!au_ftest_ren(a->auren_flags, ISDIR_SRC) -+ && !a->exchange) -+ return; -+ -+ a->h_path.dentry = a->src_h_dentry; -+ au_dtime_store(a->src_dt + AuCHILD, a->src_dentry, &a->h_path); -+ if (d_is_positive(a->dst_h_dentry)) { -+ au_fset_ren(a->auren_flags, DT_DSTDIR); -+ a->h_path.dentry = a->dst_h_dentry; -+ au_dtime_store(a->dst_dt + AuCHILD, a->dst_dentry, &a->h_path); -+ } -+} -+ -+static void au_ren_rev_dt(int err, struct au_ren_args *a) -+{ -+ struct dentry *h_d; -+ struct inode *h_inode; -+ -+ au_dtime_revert(a->src_dt + AuPARENT); -+ if (!au_ftest_ren(a->auren_flags, ISSAMEDIR)) -+ au_dtime_revert(a->dst_dt + AuPARENT); -+ -+ if (au_ftest_ren(a->auren_flags, ISDIR_SRC) && err != -EIO) { -+ h_d = a->src_dt[AuCHILD].dt_h_path.dentry; -+ h_inode = d_inode(h_d); -+ inode_lock_nested(h_inode, AuLsc_I_CHILD); -+ au_dtime_revert(a->src_dt + AuCHILD); -+ inode_unlock(h_inode); -+ -+ if (au_ftest_ren(a->auren_flags, DT_DSTDIR)) { -+ h_d = a->dst_dt[AuCHILD].dt_h_path.dentry; -+ h_inode = d_inode(h_d); -+ inode_lock_nested(h_inode, AuLsc_I_CHILD); -+ au_dtime_revert(a->dst_dt + AuCHILD); -+ inode_unlock(h_inode); -+ } -+ } -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+int aufs_rename(struct user_namespace *userns, -+ struct inode *_src_dir, struct dentry *_src_dentry, -+ struct inode *_dst_dir, struct dentry *_dst_dentry, -+ unsigned int _flags) -+{ -+ int err, lock_flags; -+ void *rev; -+ /* reduce stack space */ -+ struct au_ren_args *a; -+ struct au_pin pin; -+ -+ AuDbg("%pd, %pd, 0x%x\n", _src_dentry, _dst_dentry, _flags); -+ IMustLock(_src_dir); -+ IMustLock(_dst_dir); -+ -+ err = -EINVAL; -+ if (unlikely(_flags & RENAME_WHITEOUT)) -+ goto out; -+ -+ err = -ENOMEM; -+ BUILD_BUG_ON(sizeof(*a) > PAGE_SIZE); -+ a = kzalloc(sizeof(*a), GFP_NOFS); -+ if (unlikely(!a)) -+ goto out; -+ -+ a->flags = _flags; -+ BUILD_BUG_ON(sizeof(a->exchange) == sizeof(u8) -+ && RENAME_EXCHANGE > U8_MAX); -+ a->exchange = _flags & RENAME_EXCHANGE; -+ a->src_dir = _src_dir; -+ a->src_dentry = _src_dentry; -+ a->src_inode = NULL; -+ if (d_really_is_positive(a->src_dentry)) -+ a->src_inode = d_inode(a->src_dentry); -+ a->src_parent = a->src_dentry->d_parent; /* dir inode is locked */ -+ a->dst_dir = _dst_dir; -+ a->dst_dentry = _dst_dentry; -+ a->dst_inode = NULL; -+ if (d_really_is_positive(a->dst_dentry)) -+ a->dst_inode = d_inode(a->dst_dentry); -+ a->dst_parent = a->dst_dentry->d_parent; /* dir inode is locked */ -+ if (a->dst_inode) { -+ /* -+ * if EXCHANGE && src is non-dir && dst is dir, -+ * dst is not locked. -+ */ -+ /* IMustLock(a->dst_inode); */ -+ au_igrab(a->dst_inode); -+ } -+ -+ err = -ENOTDIR; -+ lock_flags = AuLock_FLUSH | AuLock_NOPLM | AuLock_GEN; -+ if (d_is_dir(a->src_dentry)) { -+ au_fset_ren(a->auren_flags, ISDIR_SRC); -+ if (unlikely(!a->exchange -+ && d_really_is_positive(a->dst_dentry) -+ && !d_is_dir(a->dst_dentry))) -+ goto out_free; -+ lock_flags |= AuLock_DIRS; -+ } -+ if (a->dst_inode && d_is_dir(a->dst_dentry)) { -+ au_fset_ren(a->auren_flags, ISDIR_DST); -+ if (unlikely(!a->exchange -+ && d_really_is_positive(a->src_dentry) -+ && !d_is_dir(a->src_dentry))) -+ goto out_free; -+ lock_flags |= AuLock_DIRS; -+ } -+ err = aufs_read_and_write_lock2(a->dst_dentry, a->src_dentry, -+ lock_flags); -+ if (unlikely(err)) -+ goto out_free; -+ -+ err = au_d_hashed_positive(a->src_dentry); -+ if (unlikely(err)) -+ goto out_unlock; -+ err = -ENOENT; -+ if (a->dst_inode) { -+ /* -+ * If it is a dir, VFS unhash it before this -+ * function. It means we cannot rely upon d_unhashed(). -+ */ -+ if (unlikely(!a->dst_inode->i_nlink)) -+ goto out_unlock; -+ if (!au_ftest_ren(a->auren_flags, ISDIR_DST)) { -+ err = au_d_hashed_positive(a->dst_dentry); -+ if (unlikely(err && !a->exchange)) -+ goto out_unlock; -+ } else if (unlikely(IS_DEADDIR(a->dst_inode))) -+ goto out_unlock; -+ } else if (unlikely(d_unhashed(a->dst_dentry))) -+ goto out_unlock; -+ -+ /* -+ * is it possible? -+ * yes, it happened (in linux-3.3-rcN) but I don't know why. -+ * there may exist a problem somewhere else. -+ */ -+ err = -EINVAL; -+ if (unlikely(d_inode(a->dst_parent) == d_inode(a->src_dentry))) -+ goto out_unlock; -+ -+ au_fset_ren(a->auren_flags, ISSAMEDIR); /* temporary */ -+ di_write_lock_parent(a->dst_parent); -+ -+ /* which branch we process */ -+ err = au_ren_wbr(a); -+ if (unlikely(err < 0)) -+ goto out_parent; -+ a->br = au_sbr(a->dst_dentry->d_sb, a->btgt); -+ a->h_path.mnt = au_br_mnt(a->br); -+ -+ /* are they available to be renamed */ -+ err = au_ren_may_dir(a); -+ if (unlikely(err)) -+ goto out_children; -+ -+ /* prepare the writable parent dir on the same branch */ -+ if (a->dst_btop == a->btgt) { -+ au_fset_ren(a->auren_flags, WHDST); -+ } else { -+ err = au_cpup_dirs(a->dst_dentry, a->btgt); -+ if (unlikely(err)) -+ goto out_children; -+ } -+ -+ err = 0; -+ if (!a->exchange) { -+ if (a->src_dir != a->dst_dir) { -+ /* -+ * this temporary unlock is safe, -+ * because both dir->i_mutex are locked. -+ */ -+ di_write_unlock(a->dst_parent); -+ di_write_lock_parent(a->src_parent); -+ err = au_wr_dir_need_wh(a->src_dentry, -+ au_ftest_ren(a->auren_flags, -+ ISDIR_SRC), -+ &a->btgt); -+ di_write_unlock(a->src_parent); -+ di_write_lock2_parent(a->src_parent, a->dst_parent, -+ /*isdir*/1); -+ au_fclr_ren(a->auren_flags, ISSAMEDIR); -+ } else -+ err = au_wr_dir_need_wh(a->src_dentry, -+ au_ftest_ren(a->auren_flags, -+ ISDIR_SRC), -+ &a->btgt); -+ } -+ if (unlikely(err < 0)) -+ goto out_children; -+ if (err) -+ au_fset_ren(a->auren_flags, WHSRC); -+ -+ /* cpup src */ -+ if (a->src_btop != a->btgt) { -+ err = au_pin(&pin, a->src_dentry, a->btgt, -+ au_opt_udba(a->src_dentry->d_sb), -+ AuPin_DI_LOCKED | AuPin_MNT_WRITE); -+ if (!err) { -+ struct au_cp_generic cpg = { -+ .dentry = a->src_dentry, -+ .bdst = a->btgt, -+ .bsrc = a->src_btop, -+ .len = -1, -+ .pin = &pin, -+ .flags = AuCpup_DTIME | AuCpup_HOPEN -+ }; -+ AuDebugOn(au_dbtop(a->src_dentry) != a->src_btop); -+ err = au_sio_cpup_simple(&cpg); -+ au_unpin(&pin); -+ } -+ if (unlikely(err)) -+ goto out_children; -+ a->src_btop = a->btgt; -+ a->src_h_dentry = au_h_dptr(a->src_dentry, a->btgt); -+ if (!a->exchange) -+ au_fset_ren(a->auren_flags, WHSRC); -+ } -+ -+ /* cpup dst */ -+ if (a->exchange && a->dst_inode -+ && a->dst_btop != a->btgt) { -+ err = au_pin(&pin, a->dst_dentry, a->btgt, -+ au_opt_udba(a->dst_dentry->d_sb), -+ AuPin_DI_LOCKED | AuPin_MNT_WRITE); -+ if (!err) { -+ struct au_cp_generic cpg = { -+ .dentry = a->dst_dentry, -+ .bdst = a->btgt, -+ .bsrc = a->dst_btop, -+ .len = -1, -+ .pin = &pin, -+ .flags = AuCpup_DTIME | AuCpup_HOPEN -+ }; -+ err = au_sio_cpup_simple(&cpg); -+ au_unpin(&pin); -+ } -+ if (unlikely(err)) -+ goto out_children; -+ a->dst_btop = a->btgt; -+ a->dst_h_dentry = au_h_dptr(a->dst_dentry, a->btgt); -+ } -+ -+ /* lock them all */ -+ err = au_ren_lock(a); -+ if (unlikely(err)) -+ /* leave the copied-up one */ -+ goto out_children; -+ -+ if (!a->exchange) { -+ if (!au_opt_test(au_mntflags(a->dst_dir->i_sb), UDBA_NONE)) -+ err = au_may_ren(a); -+ else if (unlikely(a->dst_dentry->d_name.len > AUFS_MAX_NAMELEN)) -+ err = -ENAMETOOLONG; -+ if (unlikely(err)) -+ goto out_hdir; -+ } -+ -+ /* store timestamps to be revertible */ -+ au_ren_dt(a); -+ -+ /* store dirren info */ -+ if (au_ftest_ren(a->auren_flags, DIRREN)) { -+ err = au_dr_rename(a->src_dentry, a->btgt, -+ &a->dst_dentry->d_name, &rev); -+ AuTraceErr(err); -+ if (unlikely(err)) -+ goto out_dt; -+ } -+ -+ /* here we go */ -+ err = do_rename(a); -+ if (unlikely(err)) -+ goto out_dirren; -+ -+ if (au_ftest_ren(a->auren_flags, DIRREN)) -+ au_dr_rename_fin(a->src_dentry, a->btgt, rev); -+ -+ /* update dir attributes */ -+ au_ren_refresh_dir(a); -+ -+ /* dput/iput all lower dentries */ -+ au_ren_refresh(a); -+ -+ goto out_hdir; /* success */ -+ -+out_dirren: -+ if (au_ftest_ren(a->auren_flags, DIRREN)) -+ au_dr_rename_rev(a->src_dentry, a->btgt, rev); -+out_dt: -+ au_ren_rev_dt(err, a); -+out_hdir: -+ au_ren_unlock(a); -+out_children: -+ au_nhash_wh_free(&a->whlist); -+ if (err && a->dst_inode && a->dst_btop != a->btgt) { -+ AuDbg("btop %d, btgt %d\n", a->dst_btop, a->btgt); -+ au_set_h_dptr(a->dst_dentry, a->btgt, NULL); -+ au_set_dbtop(a->dst_dentry, a->dst_btop); -+ } -+out_parent: -+ if (!err) { -+ if (d_unhashed(a->src_dentry)) -+ au_fset_ren(a->auren_flags, DROPPED_SRC); -+ if (d_unhashed(a->dst_dentry)) -+ au_fset_ren(a->auren_flags, DROPPED_DST); -+ if (!a->exchange) -+ d_move(a->src_dentry, a->dst_dentry); -+ else { -+ d_exchange(a->src_dentry, a->dst_dentry); -+ if (au_ftest_ren(a->auren_flags, DROPPED_DST)) -+ d_drop(a->dst_dentry); -+ } -+ if (au_ftest_ren(a->auren_flags, DROPPED_SRC)) -+ d_drop(a->src_dentry); -+ } else { -+ au_update_dbtop(a->dst_dentry); -+ if (!a->dst_inode) -+ d_drop(a->dst_dentry); -+ } -+ if (au_ftest_ren(a->auren_flags, ISSAMEDIR)) -+ di_write_unlock(a->dst_parent); -+ else -+ di_write_unlock2(a->src_parent, a->dst_parent); -+out_unlock: -+ aufs_read_and_write_unlock2(a->dst_dentry, a->src_dentry); -+out_free: -+ iput(a->dst_inode); -+ if (a->thargs) -+ au_whtmp_rmdir_free(a->thargs); -+ au_kfree_rcu(a); -+out: -+ AuTraceErr(err); -+ return err; -+} -diff -Naur null/fs/aufs/Kconfig linux-5.15.36/fs/aufs/Kconfig ---- /dev/null -+++ linux-5.15.36/fs/aufs/Kconfig 2022-05-10 16:51:39.866744220 +0300 -@@ -0,0 +1,199 @@ -+# SPDX-License-Identifier: GPL-2.0 -+config AUFS_FS -+ tristate "Aufs (Advanced multi layered unification filesystem) support" -+ help -+ Aufs is a stackable unification filesystem such as Unionfs, -+ which unifies several directories and provides a merged single -+ directory. -+ In the early days, aufs was entirely re-designed and -+ re-implemented Unionfs Version 1.x series. Introducing many -+ original ideas, approaches and improvements, it becomes totally -+ different from Unionfs while keeping the basic features. -+ -+if AUFS_FS -+choice -+ prompt "Maximum number of branches" -+ default AUFS_BRANCH_MAX_127 -+ help -+ Specifies the maximum number of branches (or member directories) -+ in a single aufs. The larger value consumes more system -+ resources and has a minor impact to performance. -+config AUFS_BRANCH_MAX_127 -+ bool "127" -+ help -+ Specifies the maximum number of branches (or member directories) -+ in a single aufs. The larger value consumes more system -+ resources and has a minor impact to performance. -+config AUFS_BRANCH_MAX_511 -+ bool "511" -+ help -+ Specifies the maximum number of branches (or member directories) -+ in a single aufs. The larger value consumes more system -+ resources and has a minor impact to performance. -+config AUFS_BRANCH_MAX_1023 -+ bool "1023" -+ help -+ Specifies the maximum number of branches (or member directories) -+ in a single aufs. The larger value consumes more system -+ resources and has a minor impact to performance. -+config AUFS_BRANCH_MAX_32767 -+ bool "32767" -+ help -+ Specifies the maximum number of branches (or member directories) -+ in a single aufs. The larger value consumes more system -+ resources and has a minor impact to performance. -+endchoice -+ -+config AUFS_SBILIST -+ bool -+ depends on AUFS_MAGIC_SYSRQ || PROC_FS -+ default y -+ help -+ Automatic configuration for internal use. -+ When aufs supports Magic SysRq or /proc, enabled automatically. -+ -+config AUFS_HNOTIFY -+ bool "Detect direct branch access (bypassing aufs)" -+ help -+ If you want to modify files on branches directly, eg. bypassing aufs, -+ and want aufs to detect the changes of them fully, then enable this -+ option and use 'udba=notify' mount option. -+ Currently there is only one available configuration, "fsnotify". -+ It will have a negative impact to the performance. -+ See detail in aufs.5. -+ -+choice -+ prompt "method" if AUFS_HNOTIFY -+ default AUFS_HFSNOTIFY -+config AUFS_HFSNOTIFY -+ bool "fsnotify" -+ select FSNOTIFY -+endchoice -+ -+config AUFS_EXPORT -+ bool "NFS-exportable aufs" -+ depends on EXPORTFS -+ help -+ If you want to export your mounted aufs via NFS, then enable this -+ option. There are several requirements for this configuration. -+ See detail in aufs.5. -+ -+config AUFS_INO_T_64 -+ bool -+ depends on AUFS_EXPORT -+ depends on 64BIT && !(ALPHA || S390) -+ default y -+ help -+ Automatic configuration for internal use. -+ /* typedef unsigned long/int __kernel_ino_t */ -+ /* alpha and s390x are int */ -+ -+config AUFS_XATTR -+ bool "support for XATTR/EA (including Security Labels)" -+ help -+ If your branch fs supports XATTR/EA and you want to make them -+ available in aufs too, then enable this opsion and specify the -+ branch attributes for EA. -+ See detail in aufs.5. -+ -+config AUFS_FHSM -+ bool "File-based Hierarchical Storage Management" -+ help -+ Hierarchical Storage Management (or HSM) is a well-known feature -+ in the storage world. Aufs provides this feature as file-based. -+ with multiple branches. -+ These multiple branches are prioritized, ie. the topmost one -+ should be the fastest drive and be used heavily. -+ -+config AUFS_RDU -+ bool "Readdir in userspace" -+ help -+ Aufs has two methods to provide a merged view for a directory, -+ by a user-space library and by kernel-space natively. The latter -+ is always enabled but sometimes large and slow. -+ If you enable this option, install the library in aufs2-util -+ package, and set some environment variables for your readdir(3), -+ then the work will be handled in user-space which generally -+ shows better performance in most cases. -+ See detail in aufs.5. -+ -+config AUFS_DIRREN -+ bool "Workaround for rename(2)-ing a directory" -+ help -+ By default, aufs returns EXDEV error in renameing a dir who has -+ his child on the lower branch, since it is a bad idea to issue -+ rename(2) internally for every lower branch. But user may not -+ accept this behaviour. So here is a workaround to allow such -+ rename(2) and store some extra infromation on the writable -+ branch. Obviously this costs high (and I don't like it). -+ To use this feature, you need to enable this configuration AND -+ to specify the mount option `dirren.' -+ See details in aufs.5 and the design documents. -+ -+config AUFS_SHWH -+ bool "Show whiteouts" -+ help -+ If you want to make the whiteouts in aufs visible, then enable -+ this option and specify 'shwh' mount option. Although it may -+ sounds like philosophy or something, but in technically it -+ simply shows the name of whiteout with keeping its behaviour. -+ -+config AUFS_BR_RAMFS -+ bool "Ramfs (initramfs/rootfs) as an aufs branch" -+ help -+ If you want to use ramfs as an aufs branch fs, then enable this -+ option. Generally tmpfs is recommended. -+ Aufs prohibited them to be a branch fs by default, because -+ initramfs becomes unusable after switch_root or something -+ generally. If you sets initramfs as an aufs branch and boot your -+ system by switch_root, you will meet a problem easily since the -+ files in initramfs may be inaccessible. -+ Unless you are going to use ramfs as an aufs branch fs without -+ switch_root or something, leave it N. -+ -+config AUFS_BR_FUSE -+ bool "Fuse fs as an aufs branch" -+ depends on FUSE_FS -+ select AUFS_POLL -+ help -+ If you want to use fuse-based userspace filesystem as an aufs -+ branch fs, then enable this option. -+ It implements the internal poll(2) operation which is -+ implemented by fuse only (curretnly). -+ -+config AUFS_POLL -+ bool -+ help -+ Automatic configuration for internal use. -+ -+config AUFS_BR_HFSPLUS -+ bool "Hfsplus as an aufs branch" -+ depends on HFSPLUS_FS -+ default y -+ help -+ If you want to use hfsplus fs as an aufs branch fs, then enable -+ this option. This option introduces a small overhead at -+ copying-up a file on hfsplus. -+ -+config AUFS_BDEV_LOOP -+ bool -+ depends on BLK_DEV_LOOP -+ default y -+ help -+ Automatic configuration for internal use. -+ Convert =[ym] into =y. -+ -+config AUFS_DEBUG -+ bool "Debug aufs" -+ help -+ Enable this to compile aufs internal debug code. -+ It will have a negative impact to the performance. -+ -+config AUFS_MAGIC_SYSRQ -+ bool -+ depends on AUFS_DEBUG && MAGIC_SYSRQ -+ default y -+ help -+ Automatic configuration for internal use. -+ When aufs supports Magic SysRq, enabled automatically. -+endif -diff -Naur null/fs/aufs/lcnt.h linux-5.15.36/fs/aufs/lcnt.h ---- /dev/null -+++ linux-5.15.36/fs/aufs/lcnt.h 2022-05-10 16:51:39.874744219 +0300 -@@ -0,0 +1,186 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * Copyright (C) 2018-2021 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program. If not, see . -+ */ -+ -+/* -+ * simple long counter wrapper -+ */ -+ -+#ifndef __AUFS_LCNT_H__ -+#define __AUFS_LCNT_H__ -+ -+#ifdef __KERNEL__ -+ -+#include "debug.h" -+ -+#define AuLCntATOMIC 1 -+#define AuLCntPCPUCNT 2 -+/* -+ * why does percpu_refcount require extra synchronize_rcu()s in -+ * au_br_do_free() -+ */ -+#define AuLCntPCPUREF 3 -+ -+/* #define AuLCntChosen AuLCntATOMIC */ -+#define AuLCntChosen AuLCntPCPUCNT -+/* #define AuLCntChosen AuLCntPCPUREF */ -+ -+#if AuLCntChosen == AuLCntATOMIC -+#include -+ -+typedef atomic_long_t au_lcnt_t; -+ -+static inline int au_lcnt_init(au_lcnt_t *cnt, void *release __maybe_unused) -+{ -+ atomic_long_set(cnt, 0); -+ return 0; -+} -+ -+static inline void au_lcnt_wait_for_fin(au_lcnt_t *cnt __maybe_unused) -+{ -+ /* empty */ -+} -+ -+static inline void au_lcnt_fin(au_lcnt_t *cnt __maybe_unused, -+ int do_sync __maybe_unused) -+{ -+ /* empty */ -+} -+ -+static inline void au_lcnt_inc(au_lcnt_t *cnt) -+{ -+ atomic_long_inc(cnt); -+} -+ -+static inline void au_lcnt_dec(au_lcnt_t *cnt) -+{ -+ atomic_long_dec(cnt); -+} -+ -+static inline long au_lcnt_read(au_lcnt_t *cnt, int do_rev __maybe_unused) -+{ -+ return atomic_long_read(cnt); -+} -+#endif -+ -+#if AuLCntChosen == AuLCntPCPUCNT -+#include -+ -+typedef struct percpu_counter au_lcnt_t; -+ -+static inline int au_lcnt_init(au_lcnt_t *cnt, void *release __maybe_unused) -+{ -+ return percpu_counter_init(cnt, 0, GFP_NOFS); -+} -+ -+static inline void au_lcnt_wait_for_fin(au_lcnt_t *cnt __maybe_unused) -+{ -+ /* empty */ -+} -+ -+static inline void au_lcnt_fin(au_lcnt_t *cnt, int do_sync __maybe_unused) -+{ -+ percpu_counter_destroy(cnt); -+} -+ -+static inline void au_lcnt_inc(au_lcnt_t *cnt) -+{ -+ percpu_counter_inc(cnt); -+} -+ -+static inline void au_lcnt_dec(au_lcnt_t *cnt) -+{ -+ percpu_counter_dec(cnt); -+} -+ -+static inline long au_lcnt_read(au_lcnt_t *cnt, int do_rev __maybe_unused) -+{ -+ s64 n; -+ -+ n = percpu_counter_sum(cnt); -+ BUG_ON(n < 0); -+ if (LONG_MAX != LLONG_MAX -+ && n > LONG_MAX) -+ AuWarn1("%s\n", "wrap-around"); -+ -+ return n; -+} -+#endif -+ -+#if AuLCntChosen == AuLCntPCPUREF -+#include -+ -+typedef struct percpu_ref au_lcnt_t; -+ -+static inline int au_lcnt_init(au_lcnt_t *cnt, percpu_ref_func_t *release) -+{ -+ if (!release) -+ release = percpu_ref_exit; -+ return percpu_ref_init(cnt, release, /*percpu mode*/0, GFP_NOFS); -+} -+ -+static inline void au_lcnt_wait_for_fin(au_lcnt_t *cnt __maybe_unused) -+{ -+ synchronize_rcu(); -+} -+ -+static inline void au_lcnt_fin(au_lcnt_t *cnt, int do_sync) -+{ -+ percpu_ref_kill(cnt); -+ if (do_sync) -+ au_lcnt_wait_for_fin(cnt); -+} -+ -+static inline void au_lcnt_inc(au_lcnt_t *cnt) -+{ -+ percpu_ref_get(cnt); -+} -+ -+static inline void au_lcnt_dec(au_lcnt_t *cnt) -+{ -+ percpu_ref_put(cnt); -+} -+ -+/* -+ * avoid calling this func as possible. -+ */ -+static inline long au_lcnt_read(au_lcnt_t *cnt, int do_rev) -+{ -+ long l; -+ -+ percpu_ref_switch_to_atomic_sync(cnt); -+ l = atomic_long_read(&cnt->count); -+ if (do_rev) -+ percpu_ref_switch_to_percpu(cnt); -+ -+ /* percpu_ref is initialized by 1 instead of 0 */ -+ return l - 1; -+} -+#endif -+ -+#ifdef CONFIG_AUFS_DEBUG -+#define AuLCntZero(val) do { \ -+ long l = val; \ -+ if (l) \ -+ AuDbg("%s = %ld\n", #val, l); \ -+} while (0) -+#else -+#define AuLCntZero(val) do {} while (0) -+#endif -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_LCNT_H__ */ -diff -Naur null/fs/aufs/loop.c linux-5.15.36/fs/aufs/loop.c ---- /dev/null -+++ linux-5.15.36/fs/aufs/loop.c 2022-05-10 16:51:39.874744219 +0300 -@@ -0,0 +1,148 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program. If not, see . -+ */ -+ -+/* -+ * support for loopback block device as a branch -+ */ -+ -+#include "aufs.h" -+ -+/* added into drivers/block/loop.c */ -+static struct file *(*backing_file_func)(struct super_block *sb); -+ -+/* -+ * test if two lower dentries have overlapping branches. -+ */ -+int au_test_loopback_overlap(struct super_block *sb, struct dentry *h_adding) -+{ -+ struct super_block *h_sb; -+ struct file *backing_file; -+ -+ if (unlikely(!backing_file_func)) { -+ /* don't load "loop" module here */ -+ backing_file_func = symbol_get(loop_backing_file); -+ if (unlikely(!backing_file_func)) -+ /* "loop" module is not loaded */ -+ return 0; -+ } -+ -+ h_sb = h_adding->d_sb; -+ backing_file = backing_file_func(h_sb); -+ if (!backing_file) -+ return 0; -+ -+ h_adding = backing_file->f_path.dentry; -+ /* -+ * h_adding can be local NFS. -+ * in this case aufs cannot detect the loop. -+ */ -+ if (unlikely(h_adding->d_sb == sb)) -+ return 1; -+ return !!au_test_subdir(h_adding, sb->s_root); -+} -+ -+/* true if a kernel thread named 'loop[0-9].*' accesses a file */ -+int au_test_loopback_kthread(void) -+{ -+ int ret; -+ struct task_struct *tsk = current; -+ char c, comm[sizeof(tsk->comm)]; -+ -+ ret = 0; -+ if (tsk->flags & PF_KTHREAD) { -+ get_task_comm(comm, tsk); -+ c = comm[4]; -+ ret = ('0' <= c && c <= '9' -+ && !strncmp(comm, "loop", 4)); -+ } -+ -+ return ret; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+#define au_warn_loopback_step 16 -+static int au_warn_loopback_nelem = au_warn_loopback_step; -+static unsigned long *au_warn_loopback_array; -+ -+void au_warn_loopback(struct super_block *h_sb) -+{ -+ int i, new_nelem; -+ unsigned long *a, magic; -+ static DEFINE_SPINLOCK(spin); -+ -+ magic = h_sb->s_magic; -+ spin_lock(&spin); -+ a = au_warn_loopback_array; -+ for (i = 0; i < au_warn_loopback_nelem && *a; i++) -+ if (a[i] == magic) { -+ spin_unlock(&spin); -+ return; -+ } -+ -+ /* h_sb is new to us, print it */ -+ if (i < au_warn_loopback_nelem) { -+ a[i] = magic; -+ goto pr; -+ } -+ -+ /* expand the array */ -+ new_nelem = au_warn_loopback_nelem + au_warn_loopback_step; -+ a = au_kzrealloc(au_warn_loopback_array, -+ au_warn_loopback_nelem * sizeof(unsigned long), -+ new_nelem * sizeof(unsigned long), GFP_ATOMIC, -+ /*may_shrink*/0); -+ if (a) { -+ au_warn_loopback_nelem = new_nelem; -+ au_warn_loopback_array = a; -+ a[i] = magic; -+ goto pr; -+ } -+ -+ spin_unlock(&spin); -+ AuWarn1("realloc failed, ignored\n"); -+ return; -+ -+pr: -+ spin_unlock(&spin); -+ pr_warn("you may want to try another patch for loopback file " -+ "on %s(0x%lx) branch\n", au_sbtype(h_sb), magic); -+} -+ -+int au_loopback_init(void) -+{ -+ int err; -+ struct super_block *sb __maybe_unused; -+ -+ BUILD_BUG_ON(sizeof(sb->s_magic) != sizeof(*au_warn_loopback_array)); -+ -+ err = 0; -+ au_warn_loopback_array = kcalloc(au_warn_loopback_step, -+ sizeof(unsigned long), GFP_NOFS); -+ if (unlikely(!au_warn_loopback_array)) -+ err = -ENOMEM; -+ -+ return err; -+} -+ -+void au_loopback_fin(void) -+{ -+ if (backing_file_func) -+ symbol_put(loop_backing_file); -+ au_kfree_try_rcu(au_warn_loopback_array); -+} -diff -Naur null/fs/aufs/loop.h linux-5.15.36/fs/aufs/loop.h ---- /dev/null -+++ linux-5.15.36/fs/aufs/loop.h 2022-05-10 16:51:39.874744219 +0300 -@@ -0,0 +1,55 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program. If not, see . -+ */ -+ -+/* -+ * support for loopback mount as a branch -+ */ -+ -+#ifndef __AUFS_LOOP_H__ -+#define __AUFS_LOOP_H__ -+ -+#ifdef __KERNEL__ -+ -+struct dentry; -+struct super_block; -+ -+#ifdef CONFIG_AUFS_BDEV_LOOP -+/* drivers/block/loop.c */ -+struct file *loop_backing_file(struct super_block *sb); -+ -+/* loop.c */ -+int au_test_loopback_overlap(struct super_block *sb, struct dentry *h_adding); -+int au_test_loopback_kthread(void); -+void au_warn_loopback(struct super_block *h_sb); -+ -+int au_loopback_init(void); -+void au_loopback_fin(void); -+#else -+AuStub(struct file *, loop_backing_file, return NULL, struct super_block *sb) -+ -+AuStubInt0(au_test_loopback_overlap, struct super_block *sb, -+ struct dentry *h_adding) -+AuStubInt0(au_test_loopback_kthread, void) -+AuStubVoid(au_warn_loopback, struct super_block *h_sb) -+ -+AuStubInt0(au_loopback_init, void) -+AuStubVoid(au_loopback_fin, void) -+#endif /* BLK_DEV_LOOP */ -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_LOOP_H__ */ -diff -Naur null/fs/aufs/magic.mk linux-5.15.36/fs/aufs/magic.mk ---- /dev/null -+++ linux-5.15.36/fs/aufs/magic.mk 2022-05-10 16:51:39.874744219 +0300 -@@ -0,0 +1,31 @@ -+# SPDX-License-Identifier: GPL-2.0 -+ -+# defined in ${srctree}/fs/fuse/inode.c -+# tristate -+ifdef CONFIG_FUSE_FS -+ccflags-y += -DFUSE_SUPER_MAGIC=0x65735546 -+endif -+ -+# defined in ${srctree}/fs/xfs/xfs_sb.h -+# tristate -+ifdef CONFIG_XFS_FS -+ccflags-y += -DXFS_SB_MAGIC=0x58465342 -+endif -+ -+# defined in ${srctree}/fs/configfs/mount.c -+# tristate -+ifdef CONFIG_CONFIGFS_FS -+ccflags-y += -DCONFIGFS_MAGIC=0x62656570 -+endif -+ -+# defined in ${srctree}/fs/ubifs/ubifs.h -+# tristate -+ifdef CONFIG_UBIFS_FS -+ccflags-y += -DUBIFS_SUPER_MAGIC=0x24051905 -+endif -+ -+# defined in ${srctree}/fs/hfsplus/hfsplus_raw.h -+# tristate -+ifdef CONFIG_HFSPLUS_FS -+ccflags-y += -DHFSPLUS_SUPER_MAGIC=0x482b -+endif -diff -Naur null/fs/aufs/Makefile linux-5.15.36/fs/aufs/Makefile ---- /dev/null -+++ linux-5.15.36/fs/aufs/Makefile 2022-05-10 16:51:39.866744220 +0300 -@@ -0,0 +1,46 @@ -+# SPDX-License-Identifier: GPL-2.0 -+ -+include ${src}/magic.mk -+ifeq (${CONFIG_AUFS_FS},m) -+include ${src}/conf.mk -+endif -+-include ${src}/priv_def.mk -+ -+# cf. include/linux/kernel.h -+# enable pr_debug -+ccflags-y += -DDEBUG -+# sparse requires the full pathname -+ifdef M -+ccflags-y += -include ${M}/../../include/uapi/linux/aufs_type.h -+else -+ccflags-y += -include ${srctree}/include/uapi/linux/aufs_type.h -+endif -+ -+obj-$(CONFIG_AUFS_FS) += aufs.o -+aufs-y := module.o sbinfo.o super.o branch.o xino.o sysaufs.o opts.o fsctx.o \ -+ wkq.o vfsub.o dcsub.o \ -+ cpup.o whout.o wbr_policy.o \ -+ dinfo.o dentry.o \ -+ dynop.o \ -+ finfo.o file.o f_op.o \ -+ dir.o vdir.o \ -+ iinfo.o inode.o i_op.o i_op_add.o i_op_del.o i_op_ren.o \ -+ mvdown.o ioctl.o -+ -+# all are boolean -+aufs-$(CONFIG_PROC_FS) += procfs.o plink.o -+aufs-$(CONFIG_SYSFS) += sysfs.o -+aufs-$(CONFIG_DEBUG_FS) += dbgaufs.o -+aufs-$(CONFIG_AUFS_BDEV_LOOP) += loop.o -+aufs-$(CONFIG_AUFS_HNOTIFY) += hnotify.o -+aufs-$(CONFIG_AUFS_HFSNOTIFY) += hfsnotify.o -+aufs-$(CONFIG_AUFS_EXPORT) += export.o -+aufs-$(CONFIG_AUFS_XATTR) += xattr.o -+aufs-$(CONFIG_FS_POSIX_ACL) += posix_acl.o -+aufs-$(CONFIG_AUFS_DIRREN) += dirren.o -+aufs-$(CONFIG_AUFS_FHSM) += fhsm.o -+aufs-$(CONFIG_AUFS_POLL) += poll.o -+aufs-$(CONFIG_AUFS_RDU) += rdu.o -+aufs-$(CONFIG_AUFS_BR_HFSPLUS) += hfsplus.o -+aufs-$(CONFIG_AUFS_DEBUG) += debug.o -+aufs-$(CONFIG_AUFS_MAGIC_SYSRQ) += sysrq.o -diff -Naur null/fs/aufs/module.c linux-5.15.36/fs/aufs/module.c ---- /dev/null -+++ linux-5.15.36/fs/aufs/module.c 2022-05-10 16:51:39.874744219 +0300 -@@ -0,0 +1,273 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program. If not, see . -+ */ -+ -+/* -+ * module global variables and operations -+ */ -+ -+#include -+#include -+#include "aufs.h" -+ -+/* shrinkable realloc */ -+void *au_krealloc(void *p, unsigned int new_sz, gfp_t gfp, int may_shrink) -+{ -+ size_t sz; -+ int diff; -+ -+ sz = 0; -+ diff = -1; -+ if (p) { -+#if 0 /* unused */ -+ if (!new_sz) { -+ au_kfree_rcu(p); -+ p = NULL; -+ goto out; -+ } -+#else -+ AuDebugOn(!new_sz); -+#endif -+ sz = ksize(p); -+ diff = au_kmidx_sub(sz, new_sz); -+ } -+ if (sz && !diff) -+ goto out; -+ -+ if (sz < new_sz) -+ /* expand or SLOB */ -+ p = krealloc(p, new_sz, gfp); -+ else if (new_sz < sz && may_shrink) { -+ /* shrink */ -+ void *q; -+ -+ q = kmalloc(new_sz, gfp); -+ if (q) { -+ if (p) { -+ memcpy(q, p, new_sz); -+ au_kfree_try_rcu(p); -+ } -+ p = q; -+ } else -+ p = NULL; -+ } -+ -+out: -+ return p; -+} -+ -+void *au_kzrealloc(void *p, unsigned int nused, unsigned int new_sz, gfp_t gfp, -+ int may_shrink) -+{ -+ p = au_krealloc(p, new_sz, gfp, may_shrink); -+ if (p && new_sz > nused) -+ memset(p + nused, 0, new_sz - nused); -+ return p; -+} -+ -+/* ---------------------------------------------------------------------- */ -+/* -+ * aufs caches -+ */ -+struct kmem_cache *au_cache[AuCache_Last]; -+ -+static void au_cache_fin(void) -+{ -+ int i; -+ -+ /* -+ * Make sure all delayed rcu free inodes are flushed before we -+ * destroy cache. -+ */ -+ rcu_barrier(); -+ -+ /* excluding AuCache_HNOTIFY */ -+ BUILD_BUG_ON(AuCache_HNOTIFY + 1 != AuCache_Last); -+ for (i = 0; i < AuCache_HNOTIFY; i++) { -+ kmem_cache_destroy(au_cache[i]); -+ au_cache[i] = NULL; -+ } -+} -+ -+static int __init au_cache_init(void) -+{ -+ au_cache[AuCache_DINFO] = AuCacheCtor(au_dinfo, au_di_init_once); -+ if (au_cache[AuCache_DINFO]) -+ /* SLAB_DESTROY_BY_RCU */ -+ au_cache[AuCache_ICNTNR] = AuCacheCtor(au_icntnr, -+ au_icntnr_init_once); -+ if (au_cache[AuCache_ICNTNR]) -+ au_cache[AuCache_FINFO] = AuCacheCtor(au_finfo, -+ au_fi_init_once); -+ if (au_cache[AuCache_FINFO]) -+ au_cache[AuCache_VDIR] = AuCache(au_vdir); -+ if (au_cache[AuCache_VDIR]) -+ au_cache[AuCache_DEHSTR] = AuCache(au_vdir_dehstr); -+ if (au_cache[AuCache_DEHSTR]) -+ return 0; -+ -+ au_cache_fin(); -+ return -ENOMEM; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+int au_dir_roflags; -+ -+#ifdef CONFIG_AUFS_SBILIST -+/* -+ * iterate_supers_type() doesn't protect us from -+ * remounting (branch management) -+ */ -+struct hlist_bl_head au_sbilist; -+#endif -+ -+/* -+ * functions for module interface. -+ */ -+MODULE_LICENSE("GPL"); -+/* MODULE_LICENSE("GPL v2"); */ -+MODULE_AUTHOR("Junjiro R. Okajima "); -+MODULE_DESCRIPTION(AUFS_NAME -+ " -- Advanced multi layered unification filesystem"); -+MODULE_VERSION(AUFS_VERSION); -+MODULE_ALIAS_FS(AUFS_NAME); -+ -+/* this module parameter has no meaning when SYSFS is disabled */ -+int sysaufs_brs = 1; -+MODULE_PARM_DESC(brs, "use /fs/aufs/si_*/brN"); -+module_param_named(brs, sysaufs_brs, int, 0444); -+ -+/* this module parameter has no meaning when USER_NS is disabled */ -+bool au_userns; -+MODULE_PARM_DESC(allow_userns, "allow unprivileged to mount under userns"); -+module_param_named(allow_userns, au_userns, bool, 0444); -+ -+/* ---------------------------------------------------------------------- */ -+ -+static char au_esc_chars[0x20 + 3]; /* 0x01-0x20, backslash, del, and NULL */ -+ -+int au_seq_path(struct seq_file *seq, struct path *path) -+{ -+ int err; -+ -+ err = seq_path(seq, path, au_esc_chars); -+ if (err >= 0) -+ err = 0; -+ else -+ err = -ENOMEM; -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int __init aufs_init(void) -+{ -+ int err, i; -+ char *p; -+ -+ p = au_esc_chars; -+ for (i = 1; i <= ' '; i++) -+ *p++ = i; -+ *p++ = '\\'; -+ *p++ = '\x7f'; -+ *p = 0; -+ -+ au_dir_roflags = au_file_roflags(O_DIRECTORY | O_LARGEFILE); -+ -+ memcpy(aufs_iop_nogetattr, aufs_iop, sizeof(aufs_iop)); -+ for (i = 0; i < AuIop_Last; i++) -+ aufs_iop_nogetattr[i].getattr = NULL; -+ -+ memset(au_cache, 0, sizeof(au_cache)); /* including hnotify */ -+ -+ au_sbilist_init(); -+ sysaufs_brs_init(); -+ au_debug_init(); -+ au_dy_init(); -+ err = sysaufs_init(); -+ if (unlikely(err)) -+ goto out; -+ err = dbgaufs_init(); -+ if (unlikely(err)) -+ goto out_sysaufs; -+ err = au_procfs_init(); -+ if (unlikely(err)) -+ goto out_dbgaufs; -+ err = au_wkq_init(); -+ if (unlikely(err)) -+ goto out_procfs; -+ err = au_loopback_init(); -+ if (unlikely(err)) -+ goto out_wkq; -+ err = au_hnotify_init(); -+ if (unlikely(err)) -+ goto out_loopback; -+ err = au_sysrq_init(); -+ if (unlikely(err)) -+ goto out_hin; -+ err = au_cache_init(); -+ if (unlikely(err)) -+ goto out_sysrq; -+ -+ aufs_fs_type.fs_flags |= au_userns ? FS_USERNS_MOUNT : 0; -+ err = register_filesystem(&aufs_fs_type); -+ if (unlikely(err)) -+ goto out_cache; -+ -+ /* since we define pr_fmt, call printk directly */ -+ printk(KERN_INFO AUFS_NAME " " AUFS_VERSION "\n"); -+ goto out; /* success */ -+ -+out_cache: -+ au_cache_fin(); -+out_sysrq: -+ au_sysrq_fin(); -+out_hin: -+ au_hnotify_fin(); -+out_loopback: -+ au_loopback_fin(); -+out_wkq: -+ au_wkq_fin(); -+out_procfs: -+ au_procfs_fin(); -+out_dbgaufs: -+ dbgaufs_fin(); -+out_sysaufs: -+ sysaufs_fin(); -+ au_dy_fin(); -+out: -+ return err; -+} -+ -+static void __exit aufs_exit(void) -+{ -+ unregister_filesystem(&aufs_fs_type); -+ au_cache_fin(); -+ au_sysrq_fin(); -+ au_hnotify_fin(); -+ au_loopback_fin(); -+ au_wkq_fin(); -+ au_procfs_fin(); -+ dbgaufs_fin(); -+ sysaufs_fin(); -+ au_dy_fin(); -+} -+ -+module_init(aufs_init); -+module_exit(aufs_exit); -diff -Naur null/fs/aufs/module.h linux-5.15.36/fs/aufs/module.h ---- /dev/null -+++ linux-5.15.36/fs/aufs/module.h 2022-05-10 16:51:39.874744219 +0300 -@@ -0,0 +1,166 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program. If not, see . -+ */ -+ -+/* -+ * module initialization and module-global -+ */ -+ -+#ifndef __AUFS_MODULE_H__ -+#define __AUFS_MODULE_H__ -+ -+#ifdef __KERNEL__ -+ -+#include -+#include "debug.h" -+#include "dentry.h" -+#include "dir.h" -+#include "file.h" -+#include "inode.h" -+ -+struct path; -+struct seq_file; -+ -+/* module parameters */ -+extern int sysaufs_brs; -+extern bool au_userns; -+ -+/* ---------------------------------------------------------------------- */ -+ -+extern int au_dir_roflags; -+ -+void *au_krealloc(void *p, unsigned int new_sz, gfp_t gfp, int may_shrink); -+void *au_kzrealloc(void *p, unsigned int nused, unsigned int new_sz, gfp_t gfp, -+ int may_shrink); -+ -+/* -+ * Comparing the size of the object with sizeof(struct rcu_head) -+ * case 1: object is always larger -+ * --> au_kfree_rcu() or au_kfree_do_rcu() -+ * case 2: object is always smaller -+ * --> au_kfree_small() -+ * case 3: object can be any size -+ * --> au_kfree_try_rcu() -+ */ -+ -+static inline void au_kfree_do_rcu(const void *p) -+{ -+ struct { -+ struct rcu_head rcu; -+ } *a = (void *)p; -+ -+ kfree_rcu(a, rcu); -+} -+ -+#define au_kfree_rcu(_p) do { \ -+ typeof(_p) p = (_p); \ -+ BUILD_BUG_ON(sizeof(*p) < sizeof(struct rcu_head)); \ -+ if (p) \ -+ au_kfree_do_rcu(p); \ -+ } while (0) -+ -+#define au_kfree_do_sz_test(sz) (sz >= sizeof(struct rcu_head)) -+#define au_kfree_sz_test(p) (p && au_kfree_do_sz_test(ksize(p))) -+ -+static inline void au_kfree_try_rcu(const void *p) -+{ -+ if (!p) -+ return; -+ if (au_kfree_sz_test(p)) -+ au_kfree_do_rcu(p); -+ else -+ kfree(p); -+} -+ -+static inline void au_kfree_small(const void *p) -+{ -+ if (!p) -+ return; -+ AuDebugOn(au_kfree_sz_test(p)); -+ kfree(p); -+} -+ -+static inline int au_kmidx_sub(size_t sz, size_t new_sz) -+{ -+#ifndef CONFIG_SLOB -+ return __kmalloc_index(sz, false) - __kmalloc_index(new_sz, false); -+#else -+ return -1; /* SLOB is untested */ -+#endif -+} -+ -+int au_seq_path(struct seq_file *seq, struct path *path); -+ -+#ifdef CONFIG_PROC_FS -+/* procfs.c */ -+int __init au_procfs_init(void); -+void au_procfs_fin(void); -+#else -+AuStubInt0(au_procfs_init, void); -+AuStubVoid(au_procfs_fin, void); -+#endif -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* kmem cache */ -+enum { -+ AuCache_DINFO, -+ AuCache_ICNTNR, -+ AuCache_FINFO, -+ AuCache_VDIR, -+ AuCache_DEHSTR, -+ AuCache_HNOTIFY, /* must be last */ -+ AuCache_Last -+}; -+ -+extern struct kmem_cache *au_cache[AuCache_Last]; -+ -+#define AuCacheFlags (SLAB_RECLAIM_ACCOUNT | SLAB_MEM_SPREAD) -+#define AuCache(type) KMEM_CACHE(type, AuCacheFlags) -+#define AuCacheCtor(type, ctor) \ -+ kmem_cache_create(#type, sizeof(struct type), \ -+ __alignof__(struct type), AuCacheFlags, ctor) -+ -+#define AuCacheFuncs(name, index) \ -+ static inline struct au_##name *au_cache_alloc_##name(void) \ -+ { return kmem_cache_alloc(au_cache[AuCache_##index], GFP_NOFS); } \ -+ static inline void au_cache_free_##name##_norcu(struct au_##name *p) \ -+ { kmem_cache_free(au_cache[AuCache_##index], p); } \ -+ \ -+ static inline void au_cache_free_##name##_rcu_cb(struct rcu_head *rcu) \ -+ { void *p = rcu; \ -+ p -= offsetof(struct au_##name, rcu); \ -+ kmem_cache_free(au_cache[AuCache_##index], p); } \ -+ static inline void au_cache_free_##name##_rcu(struct au_##name *p) \ -+ { BUILD_BUG_ON(sizeof(struct au_##name) < sizeof(struct rcu_head)); \ -+ call_rcu(&p->rcu, au_cache_free_##name##_rcu_cb); } \ -+ \ -+ static inline void au_cache_free_##name(struct au_##name *p) \ -+ { /* au_cache_free_##name##_norcu(p); */ \ -+ au_cache_free_##name##_rcu(p); } -+ -+AuCacheFuncs(dinfo, DINFO); -+AuCacheFuncs(icntnr, ICNTNR); -+AuCacheFuncs(finfo, FINFO); -+AuCacheFuncs(vdir, VDIR); -+AuCacheFuncs(vdir_dehstr, DEHSTR); -+#ifdef CONFIG_AUFS_HNOTIFY -+AuCacheFuncs(hnotify, HNOTIFY); -+#endif -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_MODULE_H__ */ -diff -Naur null/fs/aufs/mvdown.c linux-5.15.36/fs/aufs/mvdown.c ---- /dev/null -+++ linux-5.15.36/fs/aufs/mvdown.c 2022-05-10 16:51:39.874744219 +0300 -@@ -0,0 +1,706 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2011-2021 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program. If not, see . -+ */ -+ -+/* -+ * move-down, opposite of copy-up -+ */ -+ -+#include "aufs.h" -+ -+struct au_mvd_args { -+ struct { -+ struct super_block *h_sb; -+ struct dentry *h_parent; -+ struct au_hinode *hdir; -+ struct inode *h_dir, *h_inode; -+ struct au_pin pin; -+ } info[AUFS_MVDOWN_NARRAY]; -+ -+ struct aufs_mvdown mvdown; -+ struct dentry *dentry, *parent; -+ struct inode *inode, *dir; -+ struct super_block *sb; -+ aufs_bindex_t bopq, bwh, bfound; -+ unsigned char rename_lock; -+}; -+ -+#define mvd_errno mvdown.au_errno -+#define mvd_bsrc mvdown.stbr[AUFS_MVDOWN_UPPER].bindex -+#define mvd_src_brid mvdown.stbr[AUFS_MVDOWN_UPPER].brid -+#define mvd_bdst mvdown.stbr[AUFS_MVDOWN_LOWER].bindex -+#define mvd_dst_brid mvdown.stbr[AUFS_MVDOWN_LOWER].brid -+ -+#define mvd_h_src_sb info[AUFS_MVDOWN_UPPER].h_sb -+#define mvd_h_src_parent info[AUFS_MVDOWN_UPPER].h_parent -+#define mvd_hdir_src info[AUFS_MVDOWN_UPPER].hdir -+#define mvd_h_src_dir info[AUFS_MVDOWN_UPPER].h_dir -+#define mvd_h_src_inode info[AUFS_MVDOWN_UPPER].h_inode -+#define mvd_pin_src info[AUFS_MVDOWN_UPPER].pin -+ -+#define mvd_h_dst_sb info[AUFS_MVDOWN_LOWER].h_sb -+#define mvd_h_dst_parent info[AUFS_MVDOWN_LOWER].h_parent -+#define mvd_hdir_dst info[AUFS_MVDOWN_LOWER].hdir -+#define mvd_h_dst_dir info[AUFS_MVDOWN_LOWER].h_dir -+#define mvd_h_dst_inode info[AUFS_MVDOWN_LOWER].h_inode -+#define mvd_pin_dst info[AUFS_MVDOWN_LOWER].pin -+ -+#define AU_MVD_PR(flag, ...) do { \ -+ if (flag) \ -+ pr_err(__VA_ARGS__); \ -+ } while (0) -+ -+static int find_lower_writable(struct au_mvd_args *a) -+{ -+ struct super_block *sb; -+ aufs_bindex_t bindex, bbot; -+ struct au_branch *br; -+ -+ sb = a->sb; -+ bindex = a->mvd_bsrc; -+ bbot = au_sbbot(sb); -+ if (a->mvdown.flags & AUFS_MVDOWN_FHSM_LOWER) -+ for (bindex++; bindex <= bbot; bindex++) { -+ br = au_sbr(sb, bindex); -+ if (au_br_fhsm(br->br_perm) -+ && !sb_rdonly(au_br_sb(br))) -+ return bindex; -+ } -+ else if (!(a->mvdown.flags & AUFS_MVDOWN_ROLOWER)) -+ for (bindex++; bindex <= bbot; bindex++) { -+ br = au_sbr(sb, bindex); -+ if (!au_br_rdonly(br)) -+ return bindex; -+ } -+ else -+ for (bindex++; bindex <= bbot; bindex++) { -+ br = au_sbr(sb, bindex); -+ if (!sb_rdonly(au_br_sb(br))) { -+ if (au_br_rdonly(br)) -+ a->mvdown.flags -+ |= AUFS_MVDOWN_ROLOWER_R; -+ return bindex; -+ } -+ } -+ -+ return -1; -+} -+ -+/* make the parent dir on bdst */ -+static int au_do_mkdir(const unsigned char dmsg, struct au_mvd_args *a) -+{ -+ int err; -+ -+ err = 0; -+ a->mvd_hdir_src = au_hi(a->dir, a->mvd_bsrc); -+ a->mvd_hdir_dst = au_hi(a->dir, a->mvd_bdst); -+ a->mvd_h_src_parent = au_h_dptr(a->parent, a->mvd_bsrc); -+ a->mvd_h_dst_parent = NULL; -+ if (au_dbbot(a->parent) >= a->mvd_bdst) -+ a->mvd_h_dst_parent = au_h_dptr(a->parent, a->mvd_bdst); -+ if (!a->mvd_h_dst_parent) { -+ err = au_cpdown_dirs(a->dentry, a->mvd_bdst); -+ if (unlikely(err)) { -+ AU_MVD_PR(dmsg, "cpdown_dirs failed\n"); -+ goto out; -+ } -+ a->mvd_h_dst_parent = au_h_dptr(a->parent, a->mvd_bdst); -+ } -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+/* lock them all */ -+static int au_do_lock(const unsigned char dmsg, struct au_mvd_args *a) -+{ -+ int err; -+ struct dentry *h_trap; -+ -+ a->mvd_h_src_sb = au_sbr_sb(a->sb, a->mvd_bsrc); -+ a->mvd_h_dst_sb = au_sbr_sb(a->sb, a->mvd_bdst); -+ err = au_pin(&a->mvd_pin_dst, a->dentry, a->mvd_bdst, -+ au_opt_udba(a->sb), -+ AuPin_MNT_WRITE | AuPin_DI_LOCKED); -+ AuTraceErr(err); -+ if (unlikely(err)) { -+ AU_MVD_PR(dmsg, "pin_dst failed\n"); -+ goto out; -+ } -+ -+ if (a->mvd_h_src_sb != a->mvd_h_dst_sb) { -+ a->rename_lock = 0; -+ au_pin_init(&a->mvd_pin_src, a->dentry, a->mvd_bsrc, -+ AuLsc_DI_PARENT, AuLsc_I_PARENT3, -+ au_opt_udba(a->sb), -+ AuPin_MNT_WRITE | AuPin_DI_LOCKED); -+ err = au_do_pin(&a->mvd_pin_src); -+ AuTraceErr(err); -+ a->mvd_h_src_dir = d_inode(a->mvd_h_src_parent); -+ if (unlikely(err)) { -+ AU_MVD_PR(dmsg, "pin_src failed\n"); -+ goto out_dst; -+ } -+ goto out; /* success */ -+ } -+ -+ a->rename_lock = 1; -+ au_pin_hdir_unlock(&a->mvd_pin_dst); -+ err = au_pin(&a->mvd_pin_src, a->dentry, a->mvd_bsrc, -+ au_opt_udba(a->sb), -+ AuPin_MNT_WRITE | AuPin_DI_LOCKED); -+ AuTraceErr(err); -+ a->mvd_h_src_dir = d_inode(a->mvd_h_src_parent); -+ if (unlikely(err)) { -+ AU_MVD_PR(dmsg, "pin_src failed\n"); -+ au_pin_hdir_lock(&a->mvd_pin_dst); -+ goto out_dst; -+ } -+ au_pin_hdir_unlock(&a->mvd_pin_src); -+ h_trap = vfsub_lock_rename(a->mvd_h_src_parent, a->mvd_hdir_src, -+ a->mvd_h_dst_parent, a->mvd_hdir_dst); -+ if (h_trap) { -+ err = (h_trap != a->mvd_h_src_parent); -+ if (err) -+ err = (h_trap != a->mvd_h_dst_parent); -+ } -+ BUG_ON(err); /* it should never happen */ -+ if (unlikely(a->mvd_h_src_dir != au_pinned_h_dir(&a->mvd_pin_src))) { -+ err = -EBUSY; -+ AuTraceErr(err); -+ vfsub_unlock_rename(a->mvd_h_src_parent, a->mvd_hdir_src, -+ a->mvd_h_dst_parent, a->mvd_hdir_dst); -+ au_pin_hdir_lock(&a->mvd_pin_src); -+ au_unpin(&a->mvd_pin_src); -+ au_pin_hdir_lock(&a->mvd_pin_dst); -+ goto out_dst; -+ } -+ goto out; /* success */ -+ -+out_dst: -+ au_unpin(&a->mvd_pin_dst); -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+static void au_do_unlock(const unsigned char dmsg, struct au_mvd_args *a) -+{ -+ if (!a->rename_lock) -+ au_unpin(&a->mvd_pin_src); -+ else { -+ vfsub_unlock_rename(a->mvd_h_src_parent, a->mvd_hdir_src, -+ a->mvd_h_dst_parent, a->mvd_hdir_dst); -+ au_pin_hdir_lock(&a->mvd_pin_src); -+ au_unpin(&a->mvd_pin_src); -+ au_pin_hdir_lock(&a->mvd_pin_dst); -+ } -+ au_unpin(&a->mvd_pin_dst); -+} -+ -+/* copy-down the file */ -+static int au_do_cpdown(const unsigned char dmsg, struct au_mvd_args *a) -+{ -+ int err; -+ struct au_cp_generic cpg = { -+ .dentry = a->dentry, -+ .bdst = a->mvd_bdst, -+ .bsrc = a->mvd_bsrc, -+ .len = -1, -+ .pin = &a->mvd_pin_dst, -+ .flags = AuCpup_DTIME | AuCpup_HOPEN -+ }; -+ -+ AuDbg("b%d, b%d\n", cpg.bsrc, cpg.bdst); -+ if (a->mvdown.flags & AUFS_MVDOWN_OWLOWER) -+ au_fset_cpup(cpg.flags, OVERWRITE); -+ if (a->mvdown.flags & AUFS_MVDOWN_ROLOWER) -+ au_fset_cpup(cpg.flags, RWDST); -+ err = au_sio_cpdown_simple(&cpg); -+ if (unlikely(err)) -+ AU_MVD_PR(dmsg, "cpdown failed\n"); -+ -+ AuTraceErr(err); -+ return err; -+} -+ -+/* -+ * unlink the whiteout on bdst if exist which may be created by UDBA while we -+ * were sleeping -+ */ -+static int au_do_unlink_wh(const unsigned char dmsg, struct au_mvd_args *a) -+{ -+ 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); -+ err = PTR_ERR(h_path.dentry); -+ if (IS_ERR(h_path.dentry)) { -+ AU_MVD_PR(dmsg, "wh_lkup failed\n"); -+ goto out; -+ } -+ -+ 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); -+ } -+ if (unlikely(err)) -+ AU_MVD_PR(dmsg, "wh_unlink failed\n"); -+ } -+ dput(h_path.dentry); -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+/* -+ * unlink the topmost h_dentry -+ */ -+static int au_do_unlink(const unsigned char dmsg, struct au_mvd_args *a) -+{ -+ 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); -+ } -+ if (unlikely(err)) -+ AU_MVD_PR(dmsg, "unlink failed\n"); -+ -+ AuTraceErr(err); -+ return err; -+} -+ -+/* Since mvdown succeeded, we ignore an error of this function */ -+static void au_do_stfs(const unsigned char dmsg, struct au_mvd_args *a) -+{ -+ int err; -+ struct au_branch *br; -+ -+ a->mvdown.flags |= AUFS_MVDOWN_STFS_FAILED; -+ br = au_sbr(a->sb, a->mvd_bsrc); -+ err = au_br_stfs(br, &a->mvdown.stbr[AUFS_MVDOWN_UPPER].stfs); -+ if (!err) { -+ br = au_sbr(a->sb, a->mvd_bdst); -+ a->mvdown.stbr[AUFS_MVDOWN_LOWER].brid = br->br_id; -+ err = au_br_stfs(br, &a->mvdown.stbr[AUFS_MVDOWN_LOWER].stfs); -+ } -+ if (!err) -+ a->mvdown.flags &= ~AUFS_MVDOWN_STFS_FAILED; -+ else -+ AU_MVD_PR(dmsg, "statfs failed (%d), ignored\n", err); -+} -+ -+/* -+ * copy-down the file and unlink the bsrc file. -+ * - unlink the bdst whout if exist -+ * - copy-down the file (with whtmp name and rename) -+ * - unlink the bsrc file -+ */ -+static int au_do_mvdown(const unsigned char dmsg, struct au_mvd_args *a) -+{ -+ int err; -+ -+ err = au_do_mkdir(dmsg, a); -+ if (!err) -+ err = au_do_lock(dmsg, a); -+ if (unlikely(err)) -+ goto out; -+ -+ /* -+ * do not revert the activities we made on bdst since they should be -+ * harmless in aufs. -+ */ -+ -+ err = au_do_cpdown(dmsg, a); -+ if (!err) -+ err = au_do_unlink_wh(dmsg, a); -+ if (!err && !(a->mvdown.flags & AUFS_MVDOWN_KUPPER)) -+ err = au_do_unlink(dmsg, a); -+ if (unlikely(err)) -+ goto out_unlock; -+ -+ AuDbg("%pd2, 0x%x, %d --> %d\n", -+ a->dentry, a->mvdown.flags, a->mvd_bsrc, a->mvd_bdst); -+ if (find_lower_writable(a) < 0) -+ a->mvdown.flags |= AUFS_MVDOWN_BOTTOM; -+ -+ if (a->mvdown.flags & AUFS_MVDOWN_STFS) -+ au_do_stfs(dmsg, a); -+ -+ /* maintain internal array */ -+ if (!(a->mvdown.flags & AUFS_MVDOWN_KUPPER)) { -+ au_set_h_dptr(a->dentry, a->mvd_bsrc, NULL); -+ au_set_dbtop(a->dentry, a->mvd_bdst); -+ au_set_h_iptr(a->inode, a->mvd_bsrc, NULL, /*flags*/0); -+ au_set_ibtop(a->inode, a->mvd_bdst); -+ } else { -+ /* hide the lower */ -+ au_set_h_dptr(a->dentry, a->mvd_bdst, NULL); -+ au_set_dbbot(a->dentry, a->mvd_bsrc); -+ au_set_h_iptr(a->inode, a->mvd_bdst, NULL, /*flags*/0); -+ au_set_ibbot(a->inode, a->mvd_bsrc); -+ } -+ if (au_dbbot(a->dentry) < a->mvd_bdst) -+ au_set_dbbot(a->dentry, a->mvd_bdst); -+ if (au_ibbot(a->inode) < a->mvd_bdst) -+ au_set_ibbot(a->inode, a->mvd_bdst); -+ -+out_unlock: -+ au_do_unlock(dmsg, a); -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* make sure the file is idle */ -+static int au_mvd_args_busy(const unsigned char dmsg, struct au_mvd_args *a) -+{ -+ int err, plinked; -+ -+ err = 0; -+ plinked = !!au_opt_test(au_mntflags(a->sb), PLINK); -+ if (au_dbtop(a->dentry) == a->mvd_bsrc -+ && au_dcount(a->dentry) == 1 -+ && atomic_read(&a->inode->i_count) == 1 -+ /* && a->mvd_h_src_inode->i_nlink == 1 */ -+ && (!plinked || !au_plink_test(a->inode)) -+ && a->inode->i_nlink == 1) -+ goto out; -+ -+ err = -EBUSY; -+ AU_MVD_PR(dmsg, -+ "b%d, d{b%d, c%d?}, i{c%d?, l%u}, hi{l%u}, p{%d, %d}\n", -+ a->mvd_bsrc, au_dbtop(a->dentry), au_dcount(a->dentry), -+ atomic_read(&a->inode->i_count), a->inode->i_nlink, -+ a->mvd_h_src_inode->i_nlink, -+ plinked, plinked ? au_plink_test(a->inode) : 0); -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+/* make sure the parent dir is fine */ -+static int au_mvd_args_parent(const unsigned char dmsg, -+ struct au_mvd_args *a) -+{ -+ int err; -+ aufs_bindex_t bindex; -+ -+ err = 0; -+ if (unlikely(au_alive_dir(a->parent))) { -+ err = -ENOENT; -+ AU_MVD_PR(dmsg, "parent dir is dead\n"); -+ goto out; -+ } -+ -+ a->bopq = au_dbdiropq(a->parent); -+ bindex = au_wbr_nonopq(a->dentry, a->mvd_bdst); -+ AuDbg("b%d\n", bindex); -+ if (unlikely((bindex >= 0 && bindex < a->mvd_bdst) -+ || (a->bopq != -1 && a->bopq < a->mvd_bdst))) { -+ err = -EINVAL; -+ a->mvd_errno = EAU_MVDOWN_OPAQUE; -+ AU_MVD_PR(dmsg, "ancestor is opaque b%d, b%d\n", -+ a->bopq, a->mvd_bdst); -+ } -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+static int au_mvd_args_intermediate(const unsigned char dmsg, -+ struct au_mvd_args *a) -+{ -+ int err; -+ struct au_dinfo *dinfo, *tmp; -+ -+ /* lookup the next lower positive entry */ -+ err = -ENOMEM; -+ tmp = au_di_alloc(a->sb, AuLsc_DI_TMP); -+ if (unlikely(!tmp)) -+ goto out; -+ -+ a->bfound = -1; -+ a->bwh = -1; -+ dinfo = au_di(a->dentry); -+ au_di_cp(tmp, dinfo); -+ au_di_swap(tmp, dinfo); -+ -+ /* returns the number of positive dentries */ -+ err = au_lkup_dentry(a->dentry, a->mvd_bsrc + 1, -+ /* AuLkup_IGNORE_PERM */ 0); -+ if (!err) -+ a->bwh = au_dbwh(a->dentry); -+ else if (err > 0) -+ a->bfound = au_dbtop(a->dentry); -+ -+ au_di_swap(tmp, dinfo); -+ au_rw_write_unlock(&tmp->di_rwsem); -+ au_di_free(tmp); -+ if (unlikely(err < 0)) -+ AU_MVD_PR(dmsg, "failed look-up lower\n"); -+ -+ /* -+ * here, we have these cases. -+ * bfound == -1 -+ * no positive dentry under bsrc. there are more sub-cases. -+ * bwh < 0 -+ * there no whiteout, we can safely move-down. -+ * bwh <= bsrc -+ * impossible -+ * bsrc < bwh && bwh < bdst -+ * there is a whiteout on RO branch. cannot proceed. -+ * bwh == bdst -+ * there is a whiteout on the RW target branch. it should -+ * be removed. -+ * bdst < bwh -+ * there is a whiteout somewhere unrelated branch. -+ * -1 < bfound && bfound <= bsrc -+ * impossible. -+ * bfound < bdst -+ * found, but it is on RO branch between bsrc and bdst. cannot -+ * proceed. -+ * bfound == bdst -+ * found, replace it if AUFS_MVDOWN_FORCE is set. otherwise return -+ * error. -+ * bdst < bfound -+ * found, after we create the file on bdst, it will be hidden. -+ */ -+ -+ AuDebugOn(a->bfound == -1 -+ && a->bwh != -1 -+ && a->bwh <= a->mvd_bsrc); -+ AuDebugOn(-1 < a->bfound -+ && a->bfound <= a->mvd_bsrc); -+ -+ err = -EINVAL; -+ if (a->bfound == -1 -+ && a->mvd_bsrc < a->bwh -+ && a->bwh != -1 -+ && a->bwh < a->mvd_bdst) { -+ a->mvd_errno = EAU_MVDOWN_WHITEOUT; -+ AU_MVD_PR(dmsg, "bsrc %d, bdst %d, bfound %d, bwh %d\n", -+ a->mvd_bsrc, a->mvd_bdst, a->bfound, a->bwh); -+ goto out; -+ } else if (a->bfound != -1 && a->bfound < a->mvd_bdst) { -+ a->mvd_errno = EAU_MVDOWN_UPPER; -+ AU_MVD_PR(dmsg, "bdst %d, bfound %d\n", -+ a->mvd_bdst, a->bfound); -+ goto out; -+ } -+ -+ err = 0; /* success */ -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+static int au_mvd_args_exist(const unsigned char dmsg, struct au_mvd_args *a) -+{ -+ int err; -+ -+ err = 0; -+ if (!(a->mvdown.flags & AUFS_MVDOWN_OWLOWER) -+ && a->bfound == a->mvd_bdst) -+ err = -EEXIST; -+ AuTraceErr(err); -+ return err; -+} -+ -+static int au_mvd_args(const unsigned char dmsg, struct au_mvd_args *a) -+{ -+ int err; -+ struct au_branch *br; -+ -+ err = -EISDIR; -+ if (unlikely(S_ISDIR(a->inode->i_mode))) -+ goto out; -+ -+ err = -EINVAL; -+ if (!(a->mvdown.flags & AUFS_MVDOWN_BRID_UPPER)) -+ a->mvd_bsrc = au_ibtop(a->inode); -+ else { -+ a->mvd_bsrc = au_br_index(a->sb, a->mvd_src_brid); -+ if (unlikely(a->mvd_bsrc < 0 -+ || (a->mvd_bsrc < au_dbtop(a->dentry) -+ || au_dbbot(a->dentry) < a->mvd_bsrc -+ || !au_h_dptr(a->dentry, a->mvd_bsrc)) -+ || (a->mvd_bsrc < au_ibtop(a->inode) -+ || au_ibbot(a->inode) < a->mvd_bsrc -+ || !au_h_iptr(a->inode, a->mvd_bsrc)))) { -+ a->mvd_errno = EAU_MVDOWN_NOUPPER; -+ AU_MVD_PR(dmsg, "no upper\n"); -+ goto out; -+ } -+ } -+ if (unlikely(a->mvd_bsrc == au_sbbot(a->sb))) { -+ a->mvd_errno = EAU_MVDOWN_BOTTOM; -+ AU_MVD_PR(dmsg, "on the bottom\n"); -+ goto out; -+ } -+ a->mvd_h_src_inode = au_h_iptr(a->inode, a->mvd_bsrc); -+ br = au_sbr(a->sb, a->mvd_bsrc); -+ err = au_br_rdonly(br); -+ if (!(a->mvdown.flags & AUFS_MVDOWN_ROUPPER)) { -+ if (unlikely(err)) -+ goto out; -+ } else if (!(vfsub_native_ro(a->mvd_h_src_inode) -+ || IS_APPEND(a->mvd_h_src_inode))) { -+ if (err) -+ a->mvdown.flags |= AUFS_MVDOWN_ROUPPER_R; -+ /* go on */ -+ } else -+ goto out; -+ -+ err = -EINVAL; -+ if (!(a->mvdown.flags & AUFS_MVDOWN_BRID_LOWER)) { -+ a->mvd_bdst = find_lower_writable(a); -+ if (unlikely(a->mvd_bdst < 0)) { -+ a->mvd_errno = EAU_MVDOWN_BOTTOM; -+ AU_MVD_PR(dmsg, "no writable lower branch\n"); -+ goto out; -+ } -+ } else { -+ a->mvd_bdst = au_br_index(a->sb, a->mvd_dst_brid); -+ if (unlikely(a->mvd_bdst < 0 -+ || au_sbbot(a->sb) < a->mvd_bdst)) { -+ a->mvd_errno = EAU_MVDOWN_NOLOWERBR; -+ AU_MVD_PR(dmsg, "no lower brid\n"); -+ goto out; -+ } -+ } -+ -+ err = au_mvd_args_busy(dmsg, a); -+ if (!err) -+ err = au_mvd_args_parent(dmsg, a); -+ if (!err) -+ err = au_mvd_args_intermediate(dmsg, a); -+ if (!err) -+ err = au_mvd_args_exist(dmsg, a); -+ if (!err) -+ AuDbg("b%d, b%d\n", a->mvd_bsrc, a->mvd_bdst); -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+int au_mvdown(struct dentry *dentry, struct aufs_mvdown __user *uarg) -+{ -+ int err, e; -+ unsigned char dmsg; -+ struct au_mvd_args *args; -+ struct inode *inode; -+ -+ inode = d_inode(dentry); -+ err = -EPERM; -+ if (unlikely(!capable(CAP_SYS_ADMIN))) -+ goto out; -+ -+ err = -ENOMEM; -+ args = kmalloc(sizeof(*args), GFP_NOFS); -+ if (unlikely(!args)) -+ goto out; -+ -+ err = copy_from_user(&args->mvdown, uarg, sizeof(args->mvdown)); -+ if (!err) -+ /* VERIFY_WRITE */ -+ err = !access_ok(uarg, sizeof(*uarg)); -+ if (unlikely(err)) { -+ err = -EFAULT; -+ AuTraceErr(err); -+ goto out_free; -+ } -+ AuDbg("flags 0x%x\n", args->mvdown.flags); -+ args->mvdown.flags &= ~(AUFS_MVDOWN_ROLOWER_R | AUFS_MVDOWN_ROUPPER_R); -+ args->mvdown.au_errno = 0; -+ args->dentry = dentry; -+ args->inode = inode; -+ args->sb = dentry->d_sb; -+ -+ err = -ENOENT; -+ dmsg = !!(args->mvdown.flags & AUFS_MVDOWN_DMSG); -+ args->parent = dget_parent(dentry); -+ args->dir = d_inode(args->parent); -+ inode_lock_nested(args->dir, I_MUTEX_PARENT); -+ dput(args->parent); -+ if (unlikely(args->parent != dentry->d_parent)) { -+ AU_MVD_PR(dmsg, "parent dir is moved\n"); -+ goto out_dir; -+ } -+ -+ inode_lock_nested(inode, I_MUTEX_CHILD); -+ err = aufs_read_lock(dentry, AuLock_DW | AuLock_FLUSH | AuLock_NOPLMW); -+ if (unlikely(err)) -+ goto out_inode; -+ -+ di_write_lock_parent(args->parent); -+ err = au_mvd_args(dmsg, args); -+ if (unlikely(err)) -+ goto out_parent; -+ -+ err = au_do_mvdown(dmsg, args); -+ if (unlikely(err)) -+ goto out_parent; -+ -+ au_cpup_attr_timesizes(args->dir); -+ au_cpup_attr_timesizes(inode); -+ if (!(args->mvdown.flags & AUFS_MVDOWN_KUPPER)) -+ au_cpup_igen(inode, au_h_iptr(inode, args->mvd_bdst)); -+ /* au_digen_dec(dentry); */ -+ -+out_parent: -+ di_write_unlock(args->parent); -+ aufs_read_unlock(dentry, AuLock_DW); -+out_inode: -+ inode_unlock(inode); -+out_dir: -+ inode_unlock(args->dir); -+out_free: -+ e = copy_to_user(uarg, &args->mvdown, sizeof(args->mvdown)); -+ if (unlikely(e)) -+ err = -EFAULT; -+ au_kfree_rcu(args); -+out: -+ AuTraceErr(err); -+ return err; -+} -diff -Naur null/fs/aufs/opts.c linux-5.15.36/fs/aufs/opts.c ---- /dev/null -+++ linux-5.15.36/fs/aufs/opts.c 2022-05-10 16:51:39.875744219 +0300 -@@ -0,0 +1,1032 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program. If not, see . -+ */ -+ -+/* -+ * mount options/flags -+ */ -+ -+#include /* a distribution requires */ -+#include -+#include "aufs.h" -+ -+/* ---------------------------------------------------------------------- */ -+ -+static const char *au_parser_pattern(int val, match_table_t tbl) -+{ -+ struct match_token *p; -+ -+ p = tbl; -+ while (p->pattern) { -+ if (p->token == val) -+ return p->pattern; -+ p++; -+ } -+ BUG(); -+ return "??"; -+} -+ -+static const char *au_optstr(int *val, match_table_t tbl) -+{ -+ struct match_token *p; -+ int v; -+ -+ v = *val; -+ if (!v) -+ goto out; -+ p = tbl; -+ while (p->pattern) { -+ if (p->token -+ && (v & p->token) == p->token) { -+ *val &= ~p->token; -+ return p->pattern; -+ } -+ p++; -+ } -+ -+out: -+ return NULL; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static match_table_t brperm = { -+ {AuBrPerm_RO, AUFS_BRPERM_RO}, -+ {AuBrPerm_RR, AUFS_BRPERM_RR}, -+ {AuBrPerm_RW, AUFS_BRPERM_RW}, -+ {0, NULL} -+}; -+ -+static match_table_t brattr = { -+ /* general */ -+ {AuBrAttr_COO_REG, AUFS_BRATTR_COO_REG}, -+ {AuBrAttr_COO_ALL, AUFS_BRATTR_COO_ALL}, -+ /* 'unpin' attrib is meaningless since linux-3.18-rc1 */ -+ {AuBrAttr_UNPIN, AUFS_BRATTR_UNPIN}, -+#ifdef CONFIG_AUFS_FHSM -+ {AuBrAttr_FHSM, AUFS_BRATTR_FHSM}, -+#endif -+#ifdef CONFIG_AUFS_XATTR -+ {AuBrAttr_ICEX, AUFS_BRATTR_ICEX}, -+ {AuBrAttr_ICEX_SEC, AUFS_BRATTR_ICEX_SEC}, -+ {AuBrAttr_ICEX_SYS, AUFS_BRATTR_ICEX_SYS}, -+ {AuBrAttr_ICEX_TR, AUFS_BRATTR_ICEX_TR}, -+ {AuBrAttr_ICEX_USR, AUFS_BRATTR_ICEX_USR}, -+ {AuBrAttr_ICEX_OTH, AUFS_BRATTR_ICEX_OTH}, -+#endif -+ -+ /* ro/rr branch */ -+ {AuBrRAttr_WH, AUFS_BRRATTR_WH}, -+ -+ /* rw branch */ -+ {AuBrWAttr_MOO, AUFS_BRWATTR_MOO}, -+ {AuBrWAttr_NoLinkWH, AUFS_BRWATTR_NLWH}, -+ -+ {0, NULL} -+}; -+ -+static int br_attr_val(char *str, match_table_t table, substring_t args[]) -+{ -+ int attr, v; -+ char *p; -+ -+ attr = 0; -+ do { -+ p = strchr(str, '+'); -+ if (p) -+ *p = 0; -+ v = match_token(str, table, args); -+ if (v) { -+ if (v & AuBrAttr_CMOO_Mask) -+ attr &= ~AuBrAttr_CMOO_Mask; -+ attr |= v; -+ } else { -+ if (p) -+ *p = '+'; -+ pr_warn("ignored branch attribute %s\n", str); -+ break; -+ } -+ if (p) -+ str = p + 1; -+ } while (p); -+ -+ return attr; -+} -+ -+static int au_do_optstr_br_attr(au_br_perm_str_t *str, int perm) -+{ -+ int sz; -+ const char *p; -+ char *q; -+ -+ q = str->a; -+ *q = 0; -+ p = au_optstr(&perm, brattr); -+ if (p) { -+ sz = strlen(p); -+ memcpy(q, p, sz + 1); -+ q += sz; -+ } else -+ goto out; -+ -+ do { -+ p = au_optstr(&perm, brattr); -+ if (p) { -+ *q++ = '+'; -+ sz = strlen(p); -+ memcpy(q, p, sz + 1); -+ q += sz; -+ } -+ } while (p); -+ -+out: -+ return q - str->a; -+} -+ -+int au_br_perm_val(char *perm) -+{ -+ int val, bad, sz; -+ char *p; -+ substring_t args[MAX_OPT_ARGS]; -+ au_br_perm_str_t attr; -+ -+ p = strchr(perm, '+'); -+ if (p) -+ *p = 0; -+ val = match_token(perm, brperm, args); -+ if (!val) { -+ if (p) -+ *p = '+'; -+ pr_warn("ignored branch permission %s\n", perm); -+ val = AuBrPerm_RO; -+ goto out; -+ } -+ if (!p) -+ goto out; -+ -+ val |= br_attr_val(p + 1, brattr, args); -+ -+ bad = 0; -+ switch (val & AuBrPerm_Mask) { -+ case AuBrPerm_RO: -+ case AuBrPerm_RR: -+ bad = val & AuBrWAttr_Mask; -+ val &= ~AuBrWAttr_Mask; -+ break; -+ case AuBrPerm_RW: -+ bad = val & AuBrRAttr_Mask; -+ val &= ~AuBrRAttr_Mask; -+ break; -+ } -+ -+ /* -+ * 'unpin' attrib becomes meaningless since linux-3.18-rc1, but aufs -+ * does not treat it as an error, just warning. -+ * this is a tiny guard for the user operation. -+ */ -+ if (val & AuBrAttr_UNPIN) { -+ bad |= AuBrAttr_UNPIN; -+ val &= ~AuBrAttr_UNPIN; -+ } -+ -+ if (unlikely(bad)) { -+ sz = au_do_optstr_br_attr(&attr, bad); -+ AuDebugOn(!sz); -+ pr_warn("ignored branch attribute %s\n", attr.a); -+ } -+ -+out: -+ return val; -+} -+ -+void au_optstr_br_perm(au_br_perm_str_t *str, int perm) -+{ -+ au_br_perm_str_t attr; -+ const char *p; -+ char *q; -+ int sz; -+ -+ q = str->a; -+ p = au_optstr(&perm, brperm); -+ AuDebugOn(!p || !*p); -+ sz = strlen(p); -+ memcpy(q, p, sz + 1); -+ q += sz; -+ -+ sz = au_do_optstr_br_attr(&attr, perm); -+ if (sz) { -+ *q++ = '+'; -+ memcpy(q, attr.a, sz + 1); -+ } -+ -+ AuDebugOn(strlen(str->a) >= sizeof(str->a)); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static match_table_t udbalevel = { -+ {AuOpt_UDBA_REVAL, "reval"}, -+ {AuOpt_UDBA_NONE, "none"}, -+#ifdef CONFIG_AUFS_HNOTIFY -+ {AuOpt_UDBA_HNOTIFY, "notify"}, /* abstraction */ -+#ifdef CONFIG_AUFS_HFSNOTIFY -+ {AuOpt_UDBA_HNOTIFY, "fsnotify"}, -+#endif -+#endif -+ {-1, NULL} -+}; -+ -+int au_udba_val(char *str) -+{ -+ substring_t args[MAX_OPT_ARGS]; -+ -+ return match_token(str, udbalevel, args); -+} -+ -+const char *au_optstr_udba(int udba) -+{ -+ return au_parser_pattern(udba, udbalevel); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static match_table_t au_wbr_create_policy = { -+ {AuWbrCreate_TDP, "tdp"}, -+ {AuWbrCreate_TDP, "top-down-parent"}, -+ {AuWbrCreate_RR, "rr"}, -+ {AuWbrCreate_RR, "round-robin"}, -+ {AuWbrCreate_MFS, "mfs"}, -+ {AuWbrCreate_MFS, "most-free-space"}, -+ {AuWbrCreate_MFSV, "mfs:%d"}, -+ {AuWbrCreate_MFSV, "most-free-space:%d"}, -+ -+ /* top-down regardless the parent, and then mfs */ -+ {AuWbrCreate_TDMFS, "tdmfs:%d"}, -+ {AuWbrCreate_TDMFSV, "tdmfs:%d:%d"}, -+ -+ {AuWbrCreate_MFSRR, "mfsrr:%d"}, -+ {AuWbrCreate_MFSRRV, "mfsrr:%d:%d"}, -+ {AuWbrCreate_PMFS, "pmfs"}, -+ {AuWbrCreate_PMFSV, "pmfs:%d"}, -+ {AuWbrCreate_PMFSRR, "pmfsrr:%d"}, -+ {AuWbrCreate_PMFSRRV, "pmfsrr:%d:%d"}, -+ -+ {-1, NULL} -+}; -+ -+static int au_wbr_mfs_wmark(substring_t *arg, char *str, -+ struct au_opt_wbr_create *create) -+{ -+ int err; -+ unsigned long long ull; -+ -+ err = 0; -+ if (!match_u64(arg, &ull)) -+ create->mfsrr_watermark = ull; -+ else { -+ pr_err("bad integer in %s\n", str); -+ err = -EINVAL; -+ } -+ -+ return err; -+} -+ -+static int au_wbr_mfs_sec(substring_t *arg, char *str, -+ struct au_opt_wbr_create *create) -+{ -+ int n, err; -+ -+ err = 0; -+ if (!match_int(arg, &n) && 0 <= n && n <= AUFS_MFS_MAX_SEC) -+ create->mfs_second = n; -+ else { -+ pr_err("bad integer in %s\n", str); -+ err = -EINVAL; -+ } -+ -+ return err; -+} -+ -+int au_wbr_create_val(char *str, struct au_opt_wbr_create *create) -+{ -+ int err, e; -+ substring_t args[MAX_OPT_ARGS]; -+ -+ err = match_token(str, au_wbr_create_policy, args); -+ create->wbr_create = err; -+ switch (err) { -+ case AuWbrCreate_MFSRRV: -+ case AuWbrCreate_TDMFSV: -+ case AuWbrCreate_PMFSRRV: -+ e = au_wbr_mfs_wmark(&args[0], str, create); -+ if (!e) -+ e = au_wbr_mfs_sec(&args[1], str, create); -+ if (unlikely(e)) -+ err = e; -+ break; -+ case AuWbrCreate_MFSRR: -+ case AuWbrCreate_TDMFS: -+ case AuWbrCreate_PMFSRR: -+ e = au_wbr_mfs_wmark(&args[0], str, create); -+ if (unlikely(e)) { -+ err = e; -+ break; -+ } -+ fallthrough; -+ case AuWbrCreate_MFS: -+ case AuWbrCreate_PMFS: -+ create->mfs_second = AUFS_MFS_DEF_SEC; -+ break; -+ case AuWbrCreate_MFSV: -+ case AuWbrCreate_PMFSV: -+ e = au_wbr_mfs_sec(&args[0], str, create); -+ if (unlikely(e)) -+ err = e; -+ break; -+ } -+ -+ return err; -+} -+ -+const char *au_optstr_wbr_create(int wbr_create) -+{ -+ return au_parser_pattern(wbr_create, au_wbr_create_policy); -+} -+ -+static match_table_t au_wbr_copyup_policy = { -+ {AuWbrCopyup_TDP, "tdp"}, -+ {AuWbrCopyup_TDP, "top-down-parent"}, -+ {AuWbrCopyup_BUP, "bup"}, -+ {AuWbrCopyup_BUP, "bottom-up-parent"}, -+ {AuWbrCopyup_BU, "bu"}, -+ {AuWbrCopyup_BU, "bottom-up"}, -+ {-1, NULL} -+}; -+ -+int au_wbr_copyup_val(char *str) -+{ -+ substring_t args[MAX_OPT_ARGS]; -+ -+ return match_token(str, au_wbr_copyup_policy, args); -+} -+ -+const char *au_optstr_wbr_copyup(int wbr_copyup) -+{ -+ return au_parser_pattern(wbr_copyup, au_wbr_copyup_policy); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+int au_opt_add(struct au_opt *opt, char *opt_str, unsigned long sb_flags, -+ aufs_bindex_t bindex) -+{ -+ int err; -+ struct au_opt_add *add = &opt->add; -+ char *p; -+ -+ add->bindex = bindex; -+ add->perm = AuBrPerm_RO; -+ add->pathname = opt_str; -+ p = strchr(opt_str, '='); -+ if (p) { -+ *p++ = 0; -+ if (*p) -+ add->perm = au_br_perm_val(p); -+ } -+ -+ err = vfsub_kern_path(add->pathname, AuOpt_LkupDirFlags, &add->path); -+ if (!err) { -+ if (!p) { -+ add->perm = AuBrPerm_RO; -+ if (au_test_fs_rr(add->path.dentry->d_sb)) -+ add->perm = AuBrPerm_RR; -+ else if (!bindex && !(sb_flags & SB_RDONLY)) -+ add->perm = AuBrPerm_RW; -+ } -+ opt->type = Opt_add; -+ goto out; -+ } -+ pr_err("lookup failed %s (%d)\n", add->pathname, err); -+ err = -EINVAL; -+ -+out: -+ return err; -+} -+ -+static int au_opt_wbr_create(struct super_block *sb, -+ struct au_opt_wbr_create *create) -+{ -+ int err; -+ struct au_sbinfo *sbinfo; -+ -+ SiMustWriteLock(sb); -+ -+ err = 1; /* handled */ -+ sbinfo = au_sbi(sb); -+ if (sbinfo->si_wbr_create_ops->fin) { -+ err = sbinfo->si_wbr_create_ops->fin(sb); -+ if (!err) -+ err = 1; -+ } -+ -+ sbinfo->si_wbr_create = create->wbr_create; -+ sbinfo->si_wbr_create_ops = au_wbr_create_ops + create->wbr_create; -+ switch (create->wbr_create) { -+ case AuWbrCreate_MFSRRV: -+ case AuWbrCreate_MFSRR: -+ case AuWbrCreate_TDMFS: -+ case AuWbrCreate_TDMFSV: -+ case AuWbrCreate_PMFSRR: -+ case AuWbrCreate_PMFSRRV: -+ sbinfo->si_wbr_mfs.mfsrr_watermark = create->mfsrr_watermark; -+ fallthrough; -+ case AuWbrCreate_MFS: -+ case AuWbrCreate_MFSV: -+ case AuWbrCreate_PMFS: -+ case AuWbrCreate_PMFSV: -+ sbinfo->si_wbr_mfs.mfs_expire -+ = msecs_to_jiffies(create->mfs_second * MSEC_PER_SEC); -+ break; -+ } -+ -+ if (sbinfo->si_wbr_create_ops->init) -+ sbinfo->si_wbr_create_ops->init(sb); /* ignore */ -+ -+ return err; -+} -+ -+/* -+ * returns, -+ * plus: processed without an error -+ * zero: unprocessed -+ */ -+static int au_opt_simple(struct super_block *sb, struct au_opt *opt, -+ struct au_opts *opts) -+{ -+ int err; -+ struct au_sbinfo *sbinfo; -+ -+ SiMustWriteLock(sb); -+ -+ err = 1; /* handled */ -+ sbinfo = au_sbi(sb); -+ switch (opt->type) { -+ case Opt_udba: -+ sbinfo->si_mntflags &= ~AuOptMask_UDBA; -+ sbinfo->si_mntflags |= opt->udba; -+ opts->given_udba |= opt->udba; -+ break; -+ -+ case Opt_plink: -+ if (opt->tf) -+ au_opt_set(sbinfo->si_mntflags, PLINK); -+ else { -+ if (au_opt_test(sbinfo->si_mntflags, PLINK)) -+ au_plink_put(sb, /*verbose*/1); -+ au_opt_clr(sbinfo->si_mntflags, PLINK); -+ } -+ break; -+ case Opt_list_plink: -+ if (au_opt_test(sbinfo->si_mntflags, PLINK)) -+ au_plink_list(sb); -+ break; -+ -+ case Opt_dio: -+ if (opt->tf) { -+ au_opt_set(sbinfo->si_mntflags, DIO); -+ au_fset_opts(opts->flags, REFRESH_DYAOP); -+ } else { -+ au_opt_clr(sbinfo->si_mntflags, DIO); -+ au_fset_opts(opts->flags, REFRESH_DYAOP); -+ } -+ break; -+ -+ case Opt_fhsm_sec: -+ au_fhsm_set(sbinfo, opt->fhsm_second); -+ break; -+ -+ case Opt_diropq_a: -+ au_opt_set(sbinfo->si_mntflags, ALWAYS_DIROPQ); -+ break; -+ case Opt_diropq_w: -+ au_opt_clr(sbinfo->si_mntflags, ALWAYS_DIROPQ); -+ break; -+ -+ case Opt_warn_perm: -+ if (opt->tf) -+ au_opt_set(sbinfo->si_mntflags, WARN_PERM); -+ else -+ au_opt_clr(sbinfo->si_mntflags, WARN_PERM); -+ break; -+ -+ case Opt_verbose: -+ if (opt->tf) -+ au_opt_set(sbinfo->si_mntflags, VERBOSE); -+ else -+ au_opt_clr(sbinfo->si_mntflags, VERBOSE); -+ break; -+ -+ case Opt_sum: -+ if (opt->tf) -+ au_opt_set(sbinfo->si_mntflags, SUM); -+ else { -+ au_opt_clr(sbinfo->si_mntflags, SUM); -+ au_opt_clr(sbinfo->si_mntflags, SUM_W); -+ } -+ break; -+ case Opt_wsum: -+ au_opt_clr(sbinfo->si_mntflags, SUM); -+ au_opt_set(sbinfo->si_mntflags, SUM_W); -+ break; -+ -+ case Opt_wbr_create: -+ err = au_opt_wbr_create(sb, &opt->wbr_create); -+ break; -+ case Opt_wbr_copyup: -+ sbinfo->si_wbr_copyup = opt->wbr_copyup; -+ sbinfo->si_wbr_copyup_ops = au_wbr_copyup_ops + opt->wbr_copyup; -+ break; -+ -+ case Opt_dirwh: -+ sbinfo->si_dirwh = opt->dirwh; -+ break; -+ -+ case Opt_rdcache: -+ sbinfo->si_rdcache -+ = msecs_to_jiffies(opt->rdcache * MSEC_PER_SEC); -+ break; -+ case Opt_rdblk: -+ sbinfo->si_rdblk = opt->rdblk; -+ break; -+ case Opt_rdhash: -+ sbinfo->si_rdhash = opt->rdhash; -+ break; -+ -+ case Opt_shwh: -+ if (opt->tf) -+ au_opt_set(sbinfo->si_mntflags, SHWH); -+ else -+ au_opt_clr(sbinfo->si_mntflags, SHWH); -+ break; -+ -+ case Opt_dirperm1: -+ if (opt->tf) -+ au_opt_set(sbinfo->si_mntflags, DIRPERM1); -+ else -+ au_opt_clr(sbinfo->si_mntflags, DIRPERM1); -+ break; -+ -+ case Opt_trunc_xino: -+ if (opt->tf) -+ au_opt_set(sbinfo->si_mntflags, TRUNC_XINO); -+ else -+ au_opt_clr(sbinfo->si_mntflags, TRUNC_XINO); -+ break; -+ -+ case Opt_trunc_xino_path: -+ case Opt_itrunc_xino: -+ err = au_xino_trunc(sb, opt->xino_itrunc.bindex, -+ /*idx_begin*/0); -+ if (!err) -+ err = 1; -+ break; -+ -+ case Opt_trunc_xib: -+ if (opt->tf) -+ au_fset_opts(opts->flags, TRUNC_XIB); -+ else -+ au_fclr_opts(opts->flags, TRUNC_XIB); -+ break; -+ -+ case Opt_dirren: -+ err = 1; -+ if (opt->tf) { -+ if (!au_opt_test(sbinfo->si_mntflags, DIRREN)) { -+ err = au_dr_opt_set(sb); -+ if (!err) -+ err = 1; -+ } -+ if (err == 1) -+ au_opt_set(sbinfo->si_mntflags, DIRREN); -+ } else { -+ if (au_opt_test(sbinfo->si_mntflags, DIRREN)) { -+ err = au_dr_opt_clr(sb, au_ftest_opts(opts->flags, -+ DR_FLUSHED)); -+ if (!err) -+ err = 1; -+ } -+ if (err == 1) -+ au_opt_clr(sbinfo->si_mntflags, DIRREN); -+ } -+ break; -+ -+ case Opt_acl: -+ if (opt->tf) -+ sb->s_flags |= SB_POSIXACL; -+ else -+ sb->s_flags &= ~SB_POSIXACL; -+ break; -+ -+ default: -+ err = 0; -+ break; -+ } -+ -+ return err; -+} -+ -+/* -+ * returns tri-state. -+ * plus: processed without an error -+ * zero: unprocessed -+ * minus: error -+ */ -+static int au_opt_br(struct super_block *sb, struct au_opt *opt, -+ struct au_opts *opts) -+{ -+ int err, do_refresh; -+ -+ err = 0; -+ switch (opt->type) { -+ case Opt_append: -+ opt->add.bindex = au_sbbot(sb) + 1; -+ if (opt->add.bindex < 0) -+ opt->add.bindex = 0; -+ goto add; -+ /* Always goto add, not fallthrough */ -+ case Opt_prepend: -+ opt->add.bindex = 0; -+ fallthrough; -+ add: /* indented label */ -+ case Opt_add: -+ err = au_br_add(sb, &opt->add, -+ au_ftest_opts(opts->flags, REMOUNT)); -+ if (!err) { -+ err = 1; -+ au_fset_opts(opts->flags, REFRESH); -+ } -+ break; -+ -+ case Opt_del: -+ case Opt_idel: -+ err = au_br_del(sb, &opt->del, -+ au_ftest_opts(opts->flags, REMOUNT)); -+ if (!err) { -+ err = 1; -+ au_fset_opts(opts->flags, TRUNC_XIB); -+ au_fset_opts(opts->flags, REFRESH); -+ } -+ break; -+ -+ case Opt_mod: -+ case Opt_imod: -+ err = au_br_mod(sb, &opt->mod, -+ au_ftest_opts(opts->flags, REMOUNT), -+ &do_refresh); -+ if (!err) { -+ err = 1; -+ if (do_refresh) -+ au_fset_opts(opts->flags, REFRESH); -+ } -+ break; -+ } -+ return err; -+} -+ -+static int au_opt_xino(struct super_block *sb, struct au_opt *opt, -+ struct au_opt_xino **opt_xino, -+ struct au_opts *opts) -+{ -+ int err; -+ -+ err = 0; -+ switch (opt->type) { -+ case Opt_xino: -+ err = au_xino_set(sb, &opt->xino, -+ !!au_ftest_opts(opts->flags, REMOUNT)); -+ if (!err) -+ *opt_xino = &opt->xino; -+ break; -+ case Opt_noxino: -+ au_xino_clr(sb); -+ *opt_xino = (void *)-1; -+ break; -+ } -+ -+ return err; -+} -+ -+int au_opts_verify(struct super_block *sb, unsigned long sb_flags, -+ unsigned int pending) -+{ -+ int err, fhsm; -+ aufs_bindex_t bindex, bbot; -+ unsigned char do_plink, skip, do_free, can_no_dreval; -+ struct au_branch *br; -+ struct au_wbr *wbr; -+ struct dentry *root, *dentry; -+ struct inode *dir, *h_dir; -+ struct au_sbinfo *sbinfo; -+ struct au_hinode *hdir; -+ -+ SiMustAnyLock(sb); -+ -+ sbinfo = au_sbi(sb); -+ AuDebugOn(!(sbinfo->si_mntflags & AuOptMask_UDBA)); -+ -+ if (!(sb_flags & SB_RDONLY)) { -+ if (unlikely(!au_br_writable(au_sbr_perm(sb, 0)))) -+ pr_warn("first branch should be rw\n"); -+ if (unlikely(au_opt_test(sbinfo->si_mntflags, SHWH))) -+ pr_warn_once("shwh should be used with ro\n"); -+ } -+ -+ if (au_opt_test((sbinfo->si_mntflags | pending), UDBA_HNOTIFY) -+ && !au_opt_test(sbinfo->si_mntflags, XINO)) -+ pr_warn_once("udba=*notify requires xino\n"); -+ -+ if (au_opt_test(sbinfo->si_mntflags, DIRPERM1)) -+ pr_warn_once("dirperm1 breaks the protection" -+ " by the permission bits on the lower branch\n"); -+ -+ err = 0; -+ fhsm = 0; -+ root = sb->s_root; -+ dir = d_inode(root); -+ do_plink = !!au_opt_test(sbinfo->si_mntflags, PLINK); -+ can_no_dreval = !!au_opt_test((sbinfo->si_mntflags | pending), -+ UDBA_NONE); -+ bbot = au_sbbot(sb); -+ for (bindex = 0; !err && bindex <= bbot; bindex++) { -+ skip = 0; -+ h_dir = au_h_iptr(dir, bindex); -+ br = au_sbr(sb, bindex); -+ -+ if ((br->br_perm & AuBrAttr_ICEX) -+ && !h_dir->i_op->listxattr) -+ br->br_perm &= ~AuBrAttr_ICEX; -+#if 0 /* untested */ -+ if ((br->br_perm & AuBrAttr_ICEX_SEC) -+ && (au_br_sb(br)->s_flags & SB_NOSEC)) -+ br->br_perm &= ~AuBrAttr_ICEX_SEC; -+#endif -+ -+ do_free = 0; -+ wbr = br->br_wbr; -+ if (wbr) -+ wbr_wh_read_lock(wbr); -+ -+ if (!au_br_writable(br->br_perm)) { -+ do_free = !!wbr; -+ skip = (!wbr -+ || (!wbr->wbr_whbase -+ && !wbr->wbr_plink -+ && !wbr->wbr_orph)); -+ } else if (!au_br_wh_linkable(br->br_perm)) { -+ /* skip = (!br->br_whbase && !br->br_orph); */ -+ skip = (!wbr || !wbr->wbr_whbase); -+ if (skip && wbr) { -+ if (do_plink) -+ skip = !!wbr->wbr_plink; -+ else -+ skip = !wbr->wbr_plink; -+ } -+ } else { -+ /* skip = (br->br_whbase && br->br_ohph); */ -+ skip = (wbr && wbr->wbr_whbase); -+ if (skip) { -+ if (do_plink) -+ skip = !!wbr->wbr_plink; -+ else -+ skip = !wbr->wbr_plink; -+ } -+ } -+ if (wbr) -+ wbr_wh_read_unlock(wbr); -+ -+ if (can_no_dreval) { -+ dentry = br->br_path.dentry; -+ spin_lock(&dentry->d_lock); -+ if (dentry->d_flags & -+ (DCACHE_OP_REVALIDATE | DCACHE_OP_WEAK_REVALIDATE)) -+ can_no_dreval = 0; -+ spin_unlock(&dentry->d_lock); -+ } -+ -+ if (au_br_fhsm(br->br_perm)) { -+ fhsm++; -+ AuDebugOn(!br->br_fhsm); -+ } -+ -+ if (skip) -+ continue; -+ -+ hdir = au_hi(dir, bindex); -+ au_hn_inode_lock_nested(hdir, AuLsc_I_PARENT); -+ if (wbr) -+ wbr_wh_write_lock(wbr); -+ err = au_wh_init(br, sb); -+ if (wbr) -+ wbr_wh_write_unlock(wbr); -+ au_hn_inode_unlock(hdir); -+ -+ if (!err && do_free) { -+ au_kfree_rcu(wbr); -+ br->br_wbr = NULL; -+ } -+ } -+ -+ if (can_no_dreval) -+ au_fset_si(sbinfo, NO_DREVAL); -+ else -+ au_fclr_si(sbinfo, NO_DREVAL); -+ -+ if (fhsm >= 2) { -+ au_fset_si(sbinfo, FHSM); -+ for (bindex = bbot; bindex >= 0; bindex--) { -+ br = au_sbr(sb, bindex); -+ if (au_br_fhsm(br->br_perm)) { -+ au_fhsm_set_bottom(sb, bindex); -+ break; -+ } -+ } -+ } else { -+ au_fclr_si(sbinfo, FHSM); -+ au_fhsm_set_bottom(sb, -1); -+ } -+ -+ return err; -+} -+ -+int au_opts_mount(struct super_block *sb, struct au_opts *opts) -+{ -+ int err; -+ unsigned int tmp; -+ aufs_bindex_t bindex, bbot; -+ struct au_opt *opt; -+ struct au_opt_xino *opt_xino, xino; -+ struct au_sbinfo *sbinfo; -+ struct au_branch *br; -+ struct inode *dir; -+ -+ SiMustWriteLock(sb); -+ -+ err = 0; -+ opt_xino = NULL; -+ opt = opts->opt; -+ while (err >= 0 && opt->type != Opt_tail) -+ err = au_opt_simple(sb, opt++, opts); -+ if (err > 0) -+ err = 0; -+ else if (unlikely(err < 0)) -+ goto out; -+ -+ /* disable xino and udba temporary */ -+ sbinfo = au_sbi(sb); -+ tmp = sbinfo->si_mntflags; -+ au_opt_clr(sbinfo->si_mntflags, XINO); -+ au_opt_set_udba(sbinfo->si_mntflags, UDBA_REVAL); -+ -+ opt = opts->opt; -+ while (err >= 0 && opt->type != Opt_tail) -+ err = au_opt_br(sb, opt++, opts); -+ if (err > 0) -+ err = 0; -+ else if (unlikely(err < 0)) -+ goto out; -+ -+ bbot = au_sbbot(sb); -+ if (unlikely(bbot < 0)) { -+ err = -EINVAL; -+ pr_err("no branches\n"); -+ goto out; -+ } -+ -+ if (au_opt_test(tmp, XINO)) -+ au_opt_set(sbinfo->si_mntflags, XINO); -+ opt = opts->opt; -+ while (!err && opt->type != Opt_tail) -+ err = au_opt_xino(sb, opt++, &opt_xino, opts); -+ if (unlikely(err)) -+ goto out; -+ -+ err = au_opts_verify(sb, sb->s_flags, tmp); -+ if (unlikely(err)) -+ goto out; -+ -+ /* restore xino */ -+ if (au_opt_test(tmp, XINO) && !opt_xino) { -+ xino.file = au_xino_def(sb); -+ err = PTR_ERR(xino.file); -+ if (IS_ERR(xino.file)) -+ goto out; -+ -+ err = au_xino_set(sb, &xino, /*remount*/0); -+ fput(xino.file); -+ if (unlikely(err)) -+ goto out; -+ } -+ -+ /* restore udba */ -+ tmp &= AuOptMask_UDBA; -+ sbinfo->si_mntflags &= ~AuOptMask_UDBA; -+ sbinfo->si_mntflags |= tmp; -+ bbot = au_sbbot(sb); -+ for (bindex = 0; bindex <= bbot; bindex++) { -+ br = au_sbr(sb, bindex); -+ err = au_hnotify_reset_br(tmp, br, br->br_perm); -+ if (unlikely(err)) -+ AuIOErr("hnotify failed on br %d, %d, ignored\n", -+ bindex, err); -+ /* go on even if err */ -+ } -+ if (au_opt_test(tmp, UDBA_HNOTIFY)) { -+ dir = d_inode(sb->s_root); -+ au_hn_reset(dir, au_hi_flags(dir, /*isdir*/1) & ~AuHi_XINO); -+ } -+ -+out: -+ return err; -+} -+ -+int au_opts_remount(struct super_block *sb, struct au_opts *opts) -+{ -+ int err, rerr; -+ unsigned char no_dreval; -+ struct inode *dir; -+ struct au_opt_xino *opt_xino; -+ struct au_opt *opt; -+ struct au_sbinfo *sbinfo; -+ -+ SiMustWriteLock(sb); -+ -+ err = au_dr_opt_flush(sb); -+ if (unlikely(err)) -+ goto out; -+ au_fset_opts(opts->flags, DR_FLUSHED); -+ -+ dir = d_inode(sb->s_root); -+ sbinfo = au_sbi(sb); -+ opt_xino = NULL; -+ opt = opts->opt; -+ while (err >= 0 && opt->type != Opt_tail) { -+ err = au_opt_simple(sb, opt, opts); -+ if (!err) -+ err = au_opt_br(sb, opt, opts); -+ if (!err) -+ err = au_opt_xino(sb, opt, &opt_xino, opts); -+ opt++; -+ } -+ if (err > 0) -+ err = 0; -+ AuTraceErr(err); -+ /* go on even err */ -+ -+ no_dreval = !!au_ftest_si(sbinfo, NO_DREVAL); -+ rerr = au_opts_verify(sb, opts->sb_flags, /*pending*/0); -+ if (unlikely(rerr && !err)) -+ err = rerr; -+ -+ if (no_dreval != !!au_ftest_si(sbinfo, NO_DREVAL)) -+ au_fset_opts(opts->flags, REFRESH_IDOP); -+ -+ if (au_ftest_opts(opts->flags, TRUNC_XIB)) { -+ rerr = au_xib_trunc(sb); -+ if (unlikely(rerr && !err)) -+ err = rerr; -+ } -+ -+ /* will be handled by the caller */ -+ if (!au_ftest_opts(opts->flags, REFRESH) -+ && (opts->given_udba -+ || au_opt_test(sbinfo->si_mntflags, XINO) -+ || au_ftest_opts(opts->flags, REFRESH_IDOP) -+ )) -+ au_fset_opts(opts->flags, REFRESH); -+ -+ AuDbg("status 0x%x\n", opts->flags); -+ -+out: -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+unsigned int au_opt_udba(struct super_block *sb) -+{ -+ return au_mntflags(sb) & AuOptMask_UDBA; -+} -diff -Naur null/fs/aufs/opts.h linux-5.15.36/fs/aufs/opts.h ---- /dev/null -+++ linux-5.15.36/fs/aufs/opts.h 2022-05-10 16:51:39.875744219 +0300 -@@ -0,0 +1,263 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program. If not, see . -+ */ -+ -+/* -+ * mount options/flags -+ */ -+ -+#ifndef __AUFS_OPTS_H__ -+#define __AUFS_OPTS_H__ -+ -+#ifdef __KERNEL__ -+ -+#include -+#include -+#include -+ -+enum { -+ Opt_br, -+ Opt_add, Opt_del, Opt_mod, Opt_append, Opt_prepend, -+ Opt_idel, Opt_imod, -+ Opt_dirwh, Opt_rdcache, Opt_rdblk, Opt_rdhash, -+ Opt_xino, Opt_noxino, -+ Opt_trunc_xino, Opt_trunc_xino_v, -+ Opt_trunc_xino_path, Opt_itrunc_xino, -+ Opt_trunc_xib, -+ Opt_shwh, -+ Opt_plink, Opt_list_plink, -+ Opt_udba, -+ Opt_dio, -+ Opt_diropq, Opt_diropq_a, Opt_diropq_w, -+ Opt_warn_perm, -+ Opt_wbr_copyup, Opt_wbr_create, -+ Opt_fhsm_sec, -+ Opt_verbose, Opt_noverbose, -+ Opt_sum, Opt_wsum, -+ Opt_dirperm1, -+ Opt_dirren, -+ Opt_acl, -+ Opt_tail, Opt_ignore, Opt_ignore_silent, Opt_err -+}; -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* mount flags */ -+#define AuOpt_XINO 1 /* external inode number bitmap -+ and translation table */ -+#define AuOpt_TRUNC_XINO (1 << 1) /* truncate xino files */ -+#define AuOpt_UDBA_NONE (1 << 2) /* users direct branch access */ -+#define AuOpt_UDBA_REVAL (1 << 3) -+#define AuOpt_UDBA_HNOTIFY (1 << 4) -+#define AuOpt_SHWH (1 << 5) /* show whiteout */ -+#define AuOpt_PLINK (1 << 6) /* pseudo-link */ -+#define AuOpt_DIRPERM1 (1 << 7) /* ignore the lower dir's perm -+ bits */ -+#define AuOpt_ALWAYS_DIROPQ (1 << 9) /* policy to creating diropq */ -+#define AuOpt_SUM (1 << 10) /* summation for statfs(2) */ -+#define AuOpt_SUM_W (1 << 11) /* unimplemented */ -+#define AuOpt_WARN_PERM (1 << 12) /* warn when add-branch */ -+#define AuOpt_VERBOSE (1 << 13) /* print the cause of error */ -+#define AuOpt_DIO (1 << 14) /* direct io */ -+#define AuOpt_DIRREN (1 << 15) /* directory rename */ -+ -+#ifndef CONFIG_AUFS_HNOTIFY -+#undef AuOpt_UDBA_HNOTIFY -+#define AuOpt_UDBA_HNOTIFY 0 -+#endif -+#ifndef CONFIG_AUFS_DIRREN -+#undef AuOpt_DIRREN -+#define AuOpt_DIRREN 0 -+#endif -+#ifndef CONFIG_AUFS_SHWH -+#undef AuOpt_SHWH -+#define AuOpt_SHWH 0 -+#endif -+ -+#define AuOpt_Def (AuOpt_XINO \ -+ | AuOpt_UDBA_REVAL \ -+ | AuOpt_PLINK \ -+ /* | AuOpt_DIRPERM1 */ \ -+ | AuOpt_WARN_PERM) -+#define AuOptMask_UDBA (AuOpt_UDBA_NONE \ -+ | AuOpt_UDBA_REVAL \ -+ | AuOpt_UDBA_HNOTIFY) -+ -+#define AuOpt_LkupDirFlags (LOOKUP_FOLLOW | LOOKUP_DIRECTORY) -+ -+#define au_opt_test(flags, name) (flags & AuOpt_##name) -+#define au_opt_set(flags, name) do { \ -+ BUILD_BUG_ON(AuOpt_##name & AuOptMask_UDBA); \ -+ ((flags) |= AuOpt_##name); \ -+} while (0) -+#define au_opt_set_udba(flags, name) do { \ -+ (flags) &= ~AuOptMask_UDBA; \ -+ ((flags) |= AuOpt_##name); \ -+} while (0) -+#define au_opt_clr(flags, name) do { \ -+ ((flags) &= ~AuOpt_##name); \ -+} while (0) -+ -+static inline unsigned int au_opts_plink(unsigned int mntflags) -+{ -+#ifdef CONFIG_PROC_FS -+ return mntflags; -+#else -+ return mntflags & ~AuOpt_PLINK; -+#endif -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* policies to select one among multiple writable branches */ -+enum { -+ AuWbrCreate_TDP, /* top down parent */ -+ AuWbrCreate_RR, /* round robin */ -+ AuWbrCreate_MFS, /* most free space */ -+ AuWbrCreate_MFSV, /* mfs with seconds */ -+ AuWbrCreate_MFSRR, /* mfs then rr */ -+ AuWbrCreate_MFSRRV, /* mfs then rr with seconds */ -+ AuWbrCreate_TDMFS, /* top down regardless parent and mfs */ -+ AuWbrCreate_TDMFSV, /* top down regardless parent and mfs */ -+ AuWbrCreate_PMFS, /* parent and mfs */ -+ AuWbrCreate_PMFSV, /* parent and mfs with seconds */ -+ AuWbrCreate_PMFSRR, /* parent, mfs and round-robin */ -+ AuWbrCreate_PMFSRRV, /* plus seconds */ -+ -+ AuWbrCreate_Def = AuWbrCreate_TDP -+}; -+ -+enum { -+ AuWbrCopyup_TDP, /* top down parent */ -+ AuWbrCopyup_BUP, /* bottom up parent */ -+ AuWbrCopyup_BU, /* bottom up */ -+ -+ AuWbrCopyup_Def = AuWbrCopyup_TDP -+}; -+ -+/* ---------------------------------------------------------------------- */ -+ -+struct file; -+ -+struct au_opt_add { -+ aufs_bindex_t bindex; -+ char *pathname; -+ int perm; -+ struct path path; -+}; -+ -+struct au_opt_del { -+ char *pathname; -+ struct path h_path; -+}; -+ -+struct au_opt_mod { -+ char *path; -+ int perm; -+ struct dentry *h_root; -+}; -+ -+struct au_opt_xino { -+ char *path; -+ struct file *file; -+}; -+ -+struct au_opt_xino_itrunc { -+ aufs_bindex_t bindex; -+}; -+ -+struct au_opt_wbr_create { -+ int wbr_create; -+ int mfs_second; -+ unsigned long long mfsrr_watermark; -+}; -+ -+struct au_opt { -+ int type; -+ union { -+ struct au_opt_xino xino; -+ struct au_opt_xino_itrunc xino_itrunc; -+ struct au_opt_add add; -+ struct au_opt_del del; -+ struct au_opt_mod mod; -+ int dirwh; -+ int rdcache; -+ unsigned int rdblk; -+ unsigned int rdhash; -+ int udba; -+ struct au_opt_wbr_create wbr_create; -+ int wbr_copyup; -+ unsigned int fhsm_second; -+ bool tf; /* generic flag, true or false */ -+ }; -+}; -+ -+/* opts flags */ -+#define AuOpts_REMOUNT 1 -+#define AuOpts_REFRESH (1 << 1) -+#define AuOpts_TRUNC_XIB (1 << 2) -+#define AuOpts_REFRESH_DYAOP (1 << 3) -+#define AuOpts_REFRESH_IDOP (1 << 4) -+#define AuOpts_DR_FLUSHED (1 << 5) -+#define au_ftest_opts(flags, name) ((flags) & AuOpts_##name) -+#define au_fset_opts(flags, name) \ -+ do { (flags) |= AuOpts_##name; } while (0) -+#define au_fclr_opts(flags, name) \ -+ do { (flags) &= ~AuOpts_##name; } while (0) -+ -+#ifndef CONFIG_AUFS_DIRREN -+#undef AuOpts_DR_FLUSHED -+#define AuOpts_DR_FLUSHED 0 -+#endif -+ -+struct au_opts { -+ struct au_opt *opt; -+ int max_opt; -+ -+ unsigned int given_udba; -+ unsigned int flags; -+ unsigned long sb_flags; -+}; -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* opts.c */ -+int au_br_perm_val(char *perm); -+void au_optstr_br_perm(au_br_perm_str_t *str, int perm); -+int au_udba_val(char *str); -+const char *au_optstr_udba(int udba); -+int au_wbr_create_val(char *str, struct au_opt_wbr_create *create); -+const char *au_optstr_wbr_create(int wbr_create); -+int au_wbr_copyup_val(char *str); -+const char *au_optstr_wbr_copyup(int wbr_copyup); -+ -+int au_opt_add(struct au_opt *opt, char *opt_str, unsigned long sb_flags, -+ aufs_bindex_t bindex); -+struct super_block; -+int au_opts_verify(struct super_block *sb, unsigned long sb_flags, -+ unsigned int pending); -+int au_opts_mount(struct super_block *sb, struct au_opts *opts); -+int au_opts_remount(struct super_block *sb, struct au_opts *opts); -+ -+unsigned int au_opt_udba(struct super_block *sb); -+ -+/* fsctx.c */ -+int aufs_fsctx_init(struct fs_context *fc); -+extern const struct fs_parameter_spec aufs_fsctx_paramspec[]; -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_OPTS_H__ */ -diff -Naur null/fs/aufs/plink.c linux-5.15.36/fs/aufs/plink.c ---- /dev/null -+++ linux-5.15.36/fs/aufs/plink.c 2022-05-10 16:51:39.875744219 +0300 -@@ -0,0 +1,516 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program. If not, see . -+ */ -+ -+/* -+ * pseudo-link -+ */ -+ -+#include "aufs.h" -+ -+/* -+ * the pseudo-link maintenance mode. -+ * during a user process maintains the pseudo-links, -+ * prohibit adding a new plink and branch manipulation. -+ * -+ * Flags -+ * NOPLM: -+ * For entry functions which will handle plink, and i_mutex is already held -+ * in VFS. -+ * They cannot wait and should return an error at once. -+ * Callers has to check the error. -+ * NOPLMW: -+ * For entry functions which will handle plink, but i_mutex is not held -+ * in VFS. -+ * They can wait the plink maintenance mode to finish. -+ * -+ * They behave like F_SETLK and F_SETLKW. -+ * If the caller never handle plink, then both flags are unnecessary. -+ */ -+ -+int au_plink_maint(struct super_block *sb, int flags) -+{ -+ int err; -+ pid_t pid, ppid; -+ struct task_struct *parent, *prev; -+ struct au_sbinfo *sbi; -+ -+ SiMustAnyLock(sb); -+ -+ err = 0; -+ if (!au_opt_test(au_mntflags(sb), PLINK)) -+ goto out; -+ -+ sbi = au_sbi(sb); -+ pid = sbi->si_plink_maint_pid; -+ if (!pid || pid == current->pid) -+ goto out; -+ -+ /* todo: it highly depends upon /sbin/mount.aufs */ -+ prev = NULL; -+ parent = current; -+ ppid = 0; -+ rcu_read_lock(); -+ while (1) { -+ parent = rcu_dereference(parent->real_parent); -+ if (parent == prev) -+ break; -+ ppid = task_pid_vnr(parent); -+ if (pid == ppid) { -+ rcu_read_unlock(); -+ goto out; -+ } -+ prev = parent; -+ } -+ rcu_read_unlock(); -+ -+ if (au_ftest_lock(flags, NOPLMW)) { -+ /* if there is no i_mutex lock in VFS, we don't need to wait */ -+ /* AuDebugOn(!lockdep_depth(current)); */ -+ while (sbi->si_plink_maint_pid) { -+ si_read_unlock(sb); -+ /* gave up wake_up_bit() */ -+ wait_event(sbi->si_plink_wq, !sbi->si_plink_maint_pid); -+ -+ if (au_ftest_lock(flags, FLUSH)) -+ au_nwt_flush(&sbi->si_nowait); -+ si_noflush_read_lock(sb); -+ } -+ } else if (au_ftest_lock(flags, NOPLM)) { -+ AuDbg("ppid %d, pid %d\n", ppid, pid); -+ err = -EAGAIN; -+ } -+ -+out: -+ return err; -+} -+ -+void au_plink_maint_leave(struct au_sbinfo *sbinfo) -+{ -+ spin_lock(&sbinfo->si_plink_maint_lock); -+ sbinfo->si_plink_maint_pid = 0; -+ spin_unlock(&sbinfo->si_plink_maint_lock); -+ wake_up_all(&sbinfo->si_plink_wq); -+} -+ -+int au_plink_maint_enter(struct super_block *sb) -+{ -+ int err; -+ struct au_sbinfo *sbinfo; -+ -+ err = 0; -+ sbinfo = au_sbi(sb); -+ /* make sure i am the only one in this fs */ -+ si_write_lock(sb, AuLock_FLUSH); -+ if (au_opt_test(au_mntflags(sb), PLINK)) { -+ spin_lock(&sbinfo->si_plink_maint_lock); -+ if (!sbinfo->si_plink_maint_pid) -+ sbinfo->si_plink_maint_pid = current->pid; -+ else -+ err = -EBUSY; -+ spin_unlock(&sbinfo->si_plink_maint_lock); -+ } -+ si_write_unlock(sb); -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+#ifdef CONFIG_AUFS_DEBUG -+void au_plink_list(struct super_block *sb) -+{ -+ int i; -+ struct au_sbinfo *sbinfo; -+ struct hlist_bl_head *hbl; -+ struct hlist_bl_node *pos; -+ struct au_icntnr *icntnr; -+ -+ SiMustAnyLock(sb); -+ -+ sbinfo = au_sbi(sb); -+ AuDebugOn(!au_opt_test(au_mntflags(sb), PLINK)); -+ AuDebugOn(au_plink_maint(sb, AuLock_NOPLM)); -+ -+ for (i = 0; i < AuPlink_NHASH; i++) { -+ hbl = sbinfo->si_plink + i; -+ hlist_bl_lock(hbl); -+ hlist_bl_for_each_entry(icntnr, pos, hbl, plink) -+ AuDbg("%lu\n", icntnr->vfs_inode.i_ino); -+ hlist_bl_unlock(hbl); -+ } -+} -+#endif -+ -+/* is the inode pseudo-linked? */ -+int au_plink_test(struct inode *inode) -+{ -+ int found, i; -+ struct au_sbinfo *sbinfo; -+ struct hlist_bl_head *hbl; -+ struct hlist_bl_node *pos; -+ struct au_icntnr *icntnr; -+ -+ sbinfo = au_sbi(inode->i_sb); -+ AuRwMustAnyLock(&sbinfo->si_rwsem); -+ AuDebugOn(!au_opt_test(au_mntflags(inode->i_sb), PLINK)); -+ AuDebugOn(au_plink_maint(inode->i_sb, AuLock_NOPLM)); -+ -+ found = 0; -+ i = au_plink_hash(inode->i_ino); -+ hbl = sbinfo->si_plink + i; -+ hlist_bl_lock(hbl); -+ hlist_bl_for_each_entry(icntnr, pos, hbl, plink) -+ if (&icntnr->vfs_inode == inode) { -+ found = 1; -+ break; -+ } -+ hlist_bl_unlock(hbl); -+ return found; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * generate a name for plink. -+ * the file will be stored under AUFS_WH_PLINKDIR. -+ */ -+/* 20 is max digits length of ulong 64 */ -+#define PLINK_NAME_LEN ((20 + 1) * 2) -+ -+static int plink_name(char *name, int len, struct inode *inode, -+ aufs_bindex_t bindex) -+{ -+ int rlen; -+ struct inode *h_inode; -+ -+ h_inode = au_h_iptr(inode, bindex); -+ rlen = snprintf(name, len, "%lu.%lu", inode->i_ino, h_inode->i_ino); -+ return rlen; -+} -+ -+struct au_do_plink_lkup_args { -+ struct dentry **errp; -+ struct qstr *tgtname; -+ struct path *h_ppath; -+}; -+ -+static struct dentry *au_do_plink_lkup(struct qstr *tgtname, -+ struct path *h_ppath) -+{ -+ struct dentry *h_dentry; -+ struct inode *h_inode; -+ -+ h_inode = d_inode(h_ppath->dentry); -+ inode_lock_shared_nested(h_inode, AuLsc_I_CHILD2); -+ h_dentry = vfsub_lkup_one(tgtname, h_ppath); -+ inode_unlock_shared(h_inode); -+ -+ return h_dentry; -+} -+ -+static void au_call_do_plink_lkup(void *args) -+{ -+ struct au_do_plink_lkup_args *a = args; -+ *a->errp = au_do_plink_lkup(a->tgtname, a->h_ppath); -+} -+ -+/* lookup the plink-ed @inode under the branch at @bindex */ -+struct dentry *au_plink_lkup(struct inode *inode, aufs_bindex_t bindex) -+{ -+ struct dentry *h_dentry; -+ struct au_branch *br; -+ struct path h_ppath; -+ int wkq_err; -+ char a[PLINK_NAME_LEN]; -+ struct qstr tgtname = QSTR_INIT(a, 0); -+ -+ AuDebugOn(au_plink_maint(inode->i_sb, AuLock_NOPLM)); -+ -+ br = au_sbr(inode->i_sb, bindex); -+ h_ppath.dentry = br->br_wbr->wbr_plink; -+ h_ppath.mnt = au_br_mnt(br); -+ tgtname.len = plink_name(a, sizeof(a), inode, bindex); -+ -+ if (!uid_eq(current_fsuid(), GLOBAL_ROOT_UID)) { -+ struct au_do_plink_lkup_args args = { -+ .errp = &h_dentry, -+ .tgtname = &tgtname, -+ .h_ppath = &h_ppath -+ }; -+ -+ wkq_err = au_wkq_wait(au_call_do_plink_lkup, &args); -+ if (unlikely(wkq_err)) -+ h_dentry = ERR_PTR(wkq_err); -+ } else -+ h_dentry = au_do_plink_lkup(&tgtname, &h_ppath); -+ -+ return h_dentry; -+} -+ -+/* create a pseudo-link */ -+static int do_whplink(struct qstr *tgt, struct path *h_ppath, -+ struct dentry *h_dentry) -+{ -+ int err; -+ struct path h_path; -+ struct inode *h_dir, *delegated; -+ -+ h_dir = d_inode(h_ppath->dentry); -+ inode_lock_nested(h_dir, AuLsc_I_CHILD2); -+ h_path.mnt = h_ppath->mnt; -+again: -+ h_path.dentry = vfsub_lkup_one(tgt, h_ppath); -+ err = PTR_ERR(h_path.dentry); -+ if (IS_ERR(h_path.dentry)) -+ goto out; -+ -+ 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); -+ } -+ 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); -+ } -+ } -+ dput(h_path.dentry); -+ -+out: -+ inode_unlock(h_dir); -+ return err; -+} -+ -+struct do_whplink_args { -+ int *errp; -+ struct qstr *tgt; -+ struct path *h_ppath; -+ struct dentry *h_dentry; -+}; -+ -+static void call_do_whplink(void *args) -+{ -+ struct do_whplink_args *a = args; -+ *a->errp = do_whplink(a->tgt, a->h_ppath, a->h_dentry); -+} -+ -+static int whplink(struct dentry *h_dentry, struct inode *inode, -+ aufs_bindex_t bindex) -+{ -+ int err, wkq_err; -+ struct au_branch *br; -+ struct au_wbr *wbr; -+ struct path h_ppath; -+ char a[PLINK_NAME_LEN]; -+ struct qstr tgtname = QSTR_INIT(a, 0); -+ -+ br = au_sbr(inode->i_sb, bindex); -+ wbr = br->br_wbr; -+ h_ppath.dentry = wbr->wbr_plink; -+ h_ppath.mnt = au_br_mnt(br); -+ tgtname.len = plink_name(a, sizeof(a), inode, bindex); -+ -+ /* always superio. */ -+ if (!uid_eq(current_fsuid(), GLOBAL_ROOT_UID)) { -+ struct do_whplink_args args = { -+ .errp = &err, -+ .tgt = &tgtname, -+ .h_ppath = &h_ppath, -+ .h_dentry = h_dentry -+ }; -+ wkq_err = au_wkq_wait(call_do_whplink, &args); -+ if (unlikely(wkq_err)) -+ err = wkq_err; -+ } else -+ err = do_whplink(&tgtname, &h_ppath, h_dentry); -+ -+ return err; -+} -+ -+/* -+ * create a new pseudo-link for @h_dentry on @bindex. -+ * the linked inode is held in aufs @inode. -+ */ -+void au_plink_append(struct inode *inode, aufs_bindex_t bindex, -+ struct dentry *h_dentry) -+{ -+ struct super_block *sb; -+ struct au_sbinfo *sbinfo; -+ struct hlist_bl_head *hbl; -+ struct hlist_bl_node *pos; -+ struct au_icntnr *icntnr; -+ int found, err, cnt, i; -+ -+ sb = inode->i_sb; -+ sbinfo = au_sbi(sb); -+ AuDebugOn(!au_opt_test(au_mntflags(sb), PLINK)); -+ AuDebugOn(au_plink_maint(sb, AuLock_NOPLM)); -+ -+ found = au_plink_test(inode); -+ if (found) -+ return; -+ -+ i = au_plink_hash(inode->i_ino); -+ hbl = sbinfo->si_plink + i; -+ au_igrab(inode); -+ -+ hlist_bl_lock(hbl); -+ hlist_bl_for_each_entry(icntnr, pos, hbl, plink) { -+ if (&icntnr->vfs_inode == inode) { -+ found = 1; -+ break; -+ } -+ } -+ if (!found) { -+ icntnr = container_of(inode, struct au_icntnr, vfs_inode); -+ hlist_bl_add_head(&icntnr->plink, hbl); -+ } -+ hlist_bl_unlock(hbl); -+ if (!found) { -+ cnt = au_hbl_count(hbl); -+#define msg "unexpectedly unbalanced or too many pseudo-links" -+ if (cnt > AUFS_PLINK_WARN) -+ AuWarn1(msg ", %d\n", cnt); -+#undef msg -+ err = whplink(h_dentry, inode, bindex); -+ if (unlikely(err)) { -+ pr_warn("err %d, damaged pseudo link.\n", err); -+ au_hbl_del(&icntnr->plink, hbl); -+ iput(&icntnr->vfs_inode); -+ } -+ } else -+ iput(&icntnr->vfs_inode); -+} -+ -+/* free all plinks */ -+void au_plink_put(struct super_block *sb, int verbose) -+{ -+ int i, warned; -+ struct au_sbinfo *sbinfo; -+ struct hlist_bl_head *hbl; -+ struct hlist_bl_node *pos, *tmp; -+ struct au_icntnr *icntnr; -+ -+ SiMustWriteLock(sb); -+ -+ sbinfo = au_sbi(sb); -+ AuDebugOn(!au_opt_test(au_mntflags(sb), PLINK)); -+ AuDebugOn(au_plink_maint(sb, AuLock_NOPLM)); -+ -+ /* no spin_lock since sbinfo is write-locked */ -+ warned = 0; -+ for (i = 0; i < AuPlink_NHASH; i++) { -+ hbl = sbinfo->si_plink + i; -+ if (!warned && verbose && !hlist_bl_empty(hbl)) { -+ pr_warn("pseudo-link is not flushed"); -+ warned = 1; -+ } -+ hlist_bl_for_each_entry_safe(icntnr, pos, tmp, hbl, plink) -+ iput(&icntnr->vfs_inode); -+ INIT_HLIST_BL_HEAD(hbl); -+ } -+} -+ -+void au_plink_clean(struct super_block *sb, int verbose) -+{ -+ struct dentry *root; -+ -+ root = sb->s_root; -+ aufs_write_lock(root); -+ if (au_opt_test(au_mntflags(sb), PLINK)) -+ au_plink_put(sb, verbose); -+ aufs_write_unlock(root); -+} -+ -+static int au_plink_do_half_refresh(struct inode *inode, aufs_bindex_t br_id) -+{ -+ int do_put; -+ aufs_bindex_t btop, bbot, bindex; -+ -+ do_put = 0; -+ btop = au_ibtop(inode); -+ bbot = au_ibbot(inode); -+ if (btop >= 0) { -+ for (bindex = btop; bindex <= bbot; bindex++) { -+ if (!au_h_iptr(inode, bindex) -+ || au_ii_br_id(inode, bindex) != br_id) -+ continue; -+ au_set_h_iptr(inode, bindex, NULL, 0); -+ do_put = 1; -+ break; -+ } -+ if (do_put) -+ for (bindex = btop; bindex <= bbot; bindex++) -+ if (au_h_iptr(inode, bindex)) { -+ do_put = 0; -+ break; -+ } -+ } else -+ do_put = 1; -+ -+ return do_put; -+} -+ -+/* free the plinks on a branch specified by @br_id */ -+void au_plink_half_refresh(struct super_block *sb, aufs_bindex_t br_id) -+{ -+ struct au_sbinfo *sbinfo; -+ struct hlist_bl_head *hbl; -+ struct hlist_bl_node *pos, *tmp; -+ struct au_icntnr *icntnr; -+ struct inode *inode; -+ int i, do_put; -+ -+ SiMustWriteLock(sb); -+ -+ sbinfo = au_sbi(sb); -+ AuDebugOn(!au_opt_test(au_mntflags(sb), PLINK)); -+ AuDebugOn(au_plink_maint(sb, AuLock_NOPLM)); -+ -+ /* no bit_lock since sbinfo is write-locked */ -+ for (i = 0; i < AuPlink_NHASH; i++) { -+ hbl = sbinfo->si_plink + i; -+ hlist_bl_for_each_entry_safe(icntnr, pos, tmp, hbl, plink) { -+ inode = au_igrab(&icntnr->vfs_inode); -+ ii_write_lock_child(inode); -+ do_put = au_plink_do_half_refresh(inode, br_id); -+ if (do_put) { -+ hlist_bl_del(&icntnr->plink); -+ iput(inode); -+ } -+ ii_write_unlock(inode); -+ iput(inode); -+ } -+ } -+} -diff -Naur null/fs/aufs/poll.c linux-5.15.36/fs/aufs/poll.c ---- /dev/null -+++ linux-5.15.36/fs/aufs/poll.c 2022-05-10 16:51:39.875744219 +0300 -@@ -0,0 +1,51 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program. If not, see . -+ */ -+ -+/* -+ * poll operation -+ * There is only one filesystem which implements ->poll operation, currently. -+ */ -+ -+#include "aufs.h" -+ -+__poll_t aufs_poll(struct file *file, struct poll_table_struct *pt) -+{ -+ __poll_t mask; -+ struct file *h_file; -+ struct super_block *sb; -+ -+ /* We should pretend an error happened. */ -+ mask = EPOLLERR /* | EPOLLIN | EPOLLOUT */; -+ sb = file->f_path.dentry->d_sb; -+ si_read_lock(sb, AuLock_FLUSH | AuLock_NOPLMW); -+ -+ h_file = au_read_pre(file, /*keep_fi*/0, /*lsc*/0); -+ if (IS_ERR(h_file)) { -+ AuDbg("h_file %ld\n", PTR_ERR(h_file)); -+ goto out; -+ } -+ -+ mask = vfs_poll(h_file, pt); -+ fput(h_file); /* instead of au_read_post() */ -+ -+out: -+ si_read_unlock(sb); -+ if (mask & EPOLLERR) -+ AuDbg("mask 0x%x\n", mask); -+ return mask; -+} -diff -Naur null/fs/aufs/posix_acl.c linux-5.15.36/fs/aufs/posix_acl.c ---- /dev/null -+++ linux-5.15.36/fs/aufs/posix_acl.c 2022-05-10 16:51:39.875744219 +0300 -@@ -0,0 +1,111 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2014-2021 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program. If not, see . -+ */ -+ -+/* -+ * posix acl operations -+ */ -+ -+#include -+#include "aufs.h" -+ -+struct posix_acl *aufs_get_acl(struct inode *inode, int type, bool rcu) -+{ -+ struct posix_acl *acl; -+ int err; -+ aufs_bindex_t bindex; -+ struct inode *h_inode; -+ struct super_block *sb; -+ -+ acl = ERR_PTR(-ECHILD); -+ if (rcu) -+ goto out; -+ -+ acl = NULL; -+ sb = inode->i_sb; -+ si_read_lock(sb, AuLock_FLUSH); -+ ii_read_lock_child(inode); -+ if (!(sb->s_flags & SB_POSIXACL)) -+ goto unlock; -+ -+ bindex = au_ibtop(inode); -+ h_inode = au_h_iptr(inode, bindex); -+ if (unlikely(!h_inode -+ || ((h_inode->i_mode & S_IFMT) -+ != (inode->i_mode & S_IFMT)))) { -+ err = au_busy_or_stale(); -+ acl = ERR_PTR(err); -+ goto unlock; -+ } -+ -+ /* always topmost only */ -+ acl = get_acl(h_inode, type); -+ if (IS_ERR(acl)) -+ forget_cached_acl(inode, type); -+ else -+ set_cached_acl(inode, type, acl); -+ -+unlock: -+ ii_read_unlock(inode); -+ si_read_unlock(sb); -+ -+out: -+ AuTraceErrPtr(acl); -+ return acl; -+} -+ -+int aufs_set_acl(struct user_namespace *userns, struct inode *inode, -+ struct posix_acl *acl, int type) -+{ -+ int err; -+ ssize_t ssz; -+ struct dentry *dentry; -+ struct au_sxattr arg = { -+ .type = AU_ACL_SET, -+ .u.acl_set = { -+ .acl = acl, -+ .type = type -+ }, -+ }; -+ -+ IMustLock(inode); -+ -+ if (inode->i_ino == AUFS_ROOT_INO) -+ dentry = dget(inode->i_sb->s_root); -+ else { -+ dentry = d_find_alias(inode); -+ if (!dentry) -+ dentry = d_find_any_alias(inode); -+ if (!dentry) { -+ pr_warn("cannot handle this inode, " -+ "please report to aufs-users ML\n"); -+ err = -ENOENT; -+ goto out; -+ } -+ } -+ -+ ssz = au_sxattr(dentry, inode, &arg); -+ /* forget even it if succeeds since the branch might set differently */ -+ forget_cached_acl(inode, type); -+ dput(dentry); -+ err = ssz; -+ if (ssz >= 0) -+ err = 0; -+ -+out: -+ return err; -+} -diff -Naur null/fs/aufs/procfs.c linux-5.15.36/fs/aufs/procfs.c ---- /dev/null -+++ linux-5.15.36/fs/aufs/procfs.c 2022-05-10 16:51:39.875744219 +0300 -@@ -0,0 +1,170 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2010-2021 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program. If not, see . -+ */ -+ -+/* -+ * procfs interfaces -+ */ -+ -+#include -+#include "aufs.h" -+ -+static int au_procfs_plm_release(struct inode *inode, struct file *file) -+{ -+ struct au_sbinfo *sbinfo; -+ -+ sbinfo = file->private_data; -+ if (sbinfo) { -+ au_plink_maint_leave(sbinfo); -+ kobject_put(&sbinfo->si_kobj); -+ } -+ -+ return 0; -+} -+ -+static void au_procfs_plm_write_clean(struct file *file) -+{ -+ struct au_sbinfo *sbinfo; -+ -+ sbinfo = file->private_data; -+ if (sbinfo) -+ au_plink_clean(sbinfo->si_sb, /*verbose*/0); -+} -+ -+static int au_procfs_plm_write_si(struct file *file, unsigned long id) -+{ -+ int err; -+ struct super_block *sb; -+ struct au_sbinfo *sbinfo; -+ struct hlist_bl_node *pos; -+ -+ err = -EBUSY; -+ if (unlikely(file->private_data)) -+ goto out; -+ -+ sb = NULL; -+ /* don't use au_sbilist_lock() here */ -+ hlist_bl_lock(&au_sbilist); -+ hlist_bl_for_each_entry(sbinfo, pos, &au_sbilist, si_list) -+ if (id == sysaufs_si_id(sbinfo)) { -+ if (kobject_get_unless_zero(&sbinfo->si_kobj)) -+ sb = sbinfo->si_sb; -+ break; -+ } -+ hlist_bl_unlock(&au_sbilist); -+ -+ err = -EINVAL; -+ if (unlikely(!sb)) -+ goto out; -+ -+ err = au_plink_maint_enter(sb); -+ if (!err) -+ /* keep kobject_get() */ -+ file->private_data = sbinfo; -+ else -+ kobject_put(&sbinfo->si_kobj); -+out: -+ return err; -+} -+ -+/* -+ * Accept a valid "si=xxxx" only. -+ * Once it is accepted successfully, accept "clean" too. -+ */ -+static ssize_t au_procfs_plm_write(struct file *file, const char __user *ubuf, -+ size_t count, loff_t *ppos) -+{ -+ ssize_t err; -+ unsigned long id; -+ /* last newline is allowed */ -+ char buf[3 + sizeof(unsigned long) * 2 + 1]; -+ -+ err = -EACCES; -+ if (unlikely(!capable(CAP_SYS_ADMIN))) -+ goto out; -+ -+ err = -EINVAL; -+ if (unlikely(count > sizeof(buf))) -+ goto out; -+ -+ err = copy_from_user(buf, ubuf, count); -+ if (unlikely(err)) { -+ err = -EFAULT; -+ goto out; -+ } -+ buf[count] = 0; -+ -+ err = -EINVAL; -+ if (!strcmp("clean", buf)) { -+ au_procfs_plm_write_clean(file); -+ goto out_success; -+ } else if (unlikely(strncmp("si=", buf, 3))) -+ goto out; -+ -+ err = kstrtoul(buf + 3, 16, &id); -+ if (unlikely(err)) -+ goto out; -+ -+ err = au_procfs_plm_write_si(file, id); -+ if (unlikely(err)) -+ goto out; -+ -+out_success: -+ err = count; /* success */ -+out: -+ return err; -+} -+ -+static const struct proc_ops au_procfs_plm_op = { -+ .proc_write = au_procfs_plm_write, -+ .proc_release = au_procfs_plm_release -+}; -+ -+/* ---------------------------------------------------------------------- */ -+ -+static struct proc_dir_entry *au_procfs_dir; -+ -+void au_procfs_fin(void) -+{ -+ remove_proc_entry(AUFS_PLINK_MAINT_NAME, au_procfs_dir); -+ remove_proc_entry(AUFS_PLINK_MAINT_DIR, NULL); -+} -+ -+int __init au_procfs_init(void) -+{ -+ int err; -+ struct proc_dir_entry *entry; -+ -+ err = -ENOMEM; -+ au_procfs_dir = proc_mkdir(AUFS_PLINK_MAINT_DIR, NULL); -+ if (unlikely(!au_procfs_dir)) -+ goto out; -+ -+ entry = proc_create(AUFS_PLINK_MAINT_NAME, S_IFREG | 0200, -+ au_procfs_dir, &au_procfs_plm_op); -+ if (unlikely(!entry)) -+ goto out_dir; -+ -+ err = 0; -+ goto out; /* success */ -+ -+ -+out_dir: -+ remove_proc_entry(AUFS_PLINK_MAINT_DIR, NULL); -+out: -+ return err; -+} -diff -Naur null/fs/aufs/rdu.c linux-5.15.36/fs/aufs/rdu.c ---- /dev/null -+++ linux-5.15.36/fs/aufs/rdu.c 2022-05-10 16:51:39.876744219 +0300 -@@ -0,0 +1,384 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program. If not, see . -+ */ -+ -+/* -+ * readdir in userspace. -+ */ -+ -+#include -+#include -+#include -+#include "aufs.h" -+ -+/* bits for struct aufs_rdu.flags */ -+#define AuRdu_CALLED 1 -+#define AuRdu_CONT (1 << 1) -+#define AuRdu_FULL (1 << 2) -+#define au_ftest_rdu(flags, name) ((flags) & AuRdu_##name) -+#define au_fset_rdu(flags, name) \ -+ do { (flags) |= AuRdu_##name; } while (0) -+#define au_fclr_rdu(flags, name) \ -+ do { (flags) &= ~AuRdu_##name; } while (0) -+ -+struct au_rdu_arg { -+ struct dir_context ctx; -+ struct aufs_rdu *rdu; -+ union au_rdu_ent_ul ent; -+ unsigned long end; -+ -+ struct super_block *sb; -+ int err; -+}; -+ -+static int au_rdu_fill(struct dir_context *ctx, const char *name, int nlen, -+ loff_t offset, u64 h_ino, unsigned int d_type) -+{ -+ int err, len; -+ struct au_rdu_arg *arg = container_of(ctx, struct au_rdu_arg, ctx); -+ struct aufs_rdu *rdu = arg->rdu; -+ struct au_rdu_ent ent; -+ -+ err = 0; -+ arg->err = 0; -+ au_fset_rdu(rdu->cookie.flags, CALLED); -+ len = au_rdu_len(nlen); -+ if (arg->ent.ul + len < arg->end) { -+ ent.ino = h_ino; -+ ent.bindex = rdu->cookie.bindex; -+ ent.type = d_type; -+ ent.nlen = nlen; -+ if (unlikely(nlen > AUFS_MAX_NAMELEN)) -+ ent.type = DT_UNKNOWN; -+ -+ /* unnecessary to support mmap_sem since this is a dir */ -+ err = -EFAULT; -+ if (copy_to_user(arg->ent.e, &ent, sizeof(ent))) -+ goto out; -+ if (copy_to_user(arg->ent.e->name, name, nlen)) -+ goto out; -+ /* the terminating NULL */ -+ if (__put_user(0, arg->ent.e->name + nlen)) -+ goto out; -+ err = 0; -+ /* AuDbg("%p, %.*s\n", arg->ent.p, nlen, name); */ -+ arg->ent.ul += len; -+ rdu->rent++; -+ } else { -+ err = -EFAULT; -+ au_fset_rdu(rdu->cookie.flags, FULL); -+ rdu->full = 1; -+ rdu->tail = arg->ent; -+ } -+ -+out: -+ /* AuTraceErr(err); */ -+ return err; -+} -+ -+static int au_rdu_do(struct file *h_file, struct au_rdu_arg *arg) -+{ -+ int err; -+ loff_t offset; -+ struct au_rdu_cookie *cookie = &arg->rdu->cookie; -+ -+ /* we don't have to care (FMODE_32BITHASH | FMODE_64BITHASH) for ext4 */ -+ offset = vfsub_llseek(h_file, cookie->h_pos, SEEK_SET); -+ err = offset; -+ if (unlikely(offset != cookie->h_pos)) -+ goto out; -+ -+ err = 0; -+ do { -+ arg->err = 0; -+ au_fclr_rdu(cookie->flags, CALLED); -+ /* smp_mb(); */ -+ err = vfsub_iterate_dir(h_file, &arg->ctx); -+ if (err >= 0) -+ err = arg->err; -+ } while (!err -+ && au_ftest_rdu(cookie->flags, CALLED) -+ && !au_ftest_rdu(cookie->flags, FULL)); -+ cookie->h_pos = h_file->f_pos; -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+static int au_rdu(struct file *file, struct aufs_rdu *rdu) -+{ -+ int err; -+ aufs_bindex_t bbot; -+ struct au_rdu_arg arg = { -+ .ctx = { -+ .actor = au_rdu_fill -+ } -+ }; -+ struct dentry *dentry; -+ struct inode *inode; -+ struct file *h_file; -+ struct au_rdu_cookie *cookie = &rdu->cookie; -+ -+ /* VERIFY_WRITE */ -+ err = !access_ok(rdu->ent.e, rdu->sz); -+ if (unlikely(err)) { -+ err = -EFAULT; -+ AuTraceErr(err); -+ goto out; -+ } -+ rdu->rent = 0; -+ rdu->tail = rdu->ent; -+ rdu->full = 0; -+ arg.rdu = rdu; -+ arg.ent = rdu->ent; -+ arg.end = arg.ent.ul; -+ arg.end += rdu->sz; -+ -+ err = -ENOTDIR; -+ if (unlikely(!file->f_op->iterate && !file->f_op->iterate_shared)) -+ goto out; -+ -+ err = security_file_permission(file, MAY_READ); -+ AuTraceErr(err); -+ if (unlikely(err)) -+ goto out; -+ -+ dentry = file->f_path.dentry; -+ inode = d_inode(dentry); -+ inode_lock_shared(inode); -+ -+ arg.sb = inode->i_sb; -+ err = si_read_lock(arg.sb, AuLock_FLUSH | AuLock_NOPLM); -+ if (unlikely(err)) -+ goto out_mtx; -+ err = au_alive_dir(dentry); -+ if (unlikely(err)) -+ goto out_si; -+ /* todo: reval? */ -+ fi_read_lock(file); -+ -+ err = -EAGAIN; -+ if (unlikely(au_ftest_rdu(cookie->flags, CONT) -+ && cookie->generation != au_figen(file))) -+ goto out_unlock; -+ -+ err = 0; -+ if (!rdu->blk) { -+ rdu->blk = au_sbi(arg.sb)->si_rdblk; -+ if (!rdu->blk) -+ rdu->blk = au_dir_size(file, /*dentry*/NULL); -+ } -+ bbot = au_fbtop(file); -+ if (cookie->bindex < bbot) -+ cookie->bindex = bbot; -+ bbot = au_fbbot_dir(file); -+ /* AuDbg("b%d, b%d\n", cookie->bindex, bbot); */ -+ for (; !err && cookie->bindex <= bbot; -+ cookie->bindex++, cookie->h_pos = 0) { -+ h_file = au_hf_dir(file, cookie->bindex); -+ if (!h_file) -+ continue; -+ -+ au_fclr_rdu(cookie->flags, FULL); -+ err = au_rdu_do(h_file, &arg); -+ AuTraceErr(err); -+ if (unlikely(au_ftest_rdu(cookie->flags, FULL) || err)) -+ break; -+ } -+ AuDbg("rent %llu\n", rdu->rent); -+ -+ if (!err && !au_ftest_rdu(cookie->flags, CONT)) { -+ rdu->shwh = !!au_opt_test(au_sbi(arg.sb)->si_mntflags, SHWH); -+ au_fset_rdu(cookie->flags, CONT); -+ cookie->generation = au_figen(file); -+ } -+ -+ ii_read_lock_child(inode); -+ fsstack_copy_attr_atime(inode, au_h_iptr(inode, au_ibtop(inode))); -+ ii_read_unlock(inode); -+ -+out_unlock: -+ fi_read_unlock(file); -+out_si: -+ si_read_unlock(arg.sb); -+out_mtx: -+ inode_unlock_shared(inode); -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+static int au_rdu_ino(struct file *file, struct aufs_rdu *rdu) -+{ -+ int err; -+ ino_t ino; -+ unsigned long long nent; -+ union au_rdu_ent_ul *u; -+ struct au_rdu_ent ent; -+ struct super_block *sb; -+ -+ err = 0; -+ nent = rdu->nent; -+ u = &rdu->ent; -+ sb = file->f_path.dentry->d_sb; -+ si_read_lock(sb, AuLock_FLUSH); -+ while (nent-- > 0) { -+ /* unnecessary to support mmap_sem since this is a dir */ -+ err = copy_from_user(&ent, u->e, sizeof(ent)); -+ if (!err) -+ /* VERIFY_WRITE */ -+ err = !access_ok(&u->e->ino, sizeof(ino)); -+ if (unlikely(err)) { -+ err = -EFAULT; -+ AuTraceErr(err); -+ break; -+ } -+ -+ /* AuDbg("b%d, i%llu\n", ent.bindex, ent.ino); */ -+ if (!ent.wh) -+ err = au_ino(sb, ent.bindex, ent.ino, ent.type, &ino); -+ else -+ err = au_wh_ino(sb, ent.bindex, ent.ino, ent.type, -+ &ino); -+ if (unlikely(err)) { -+ AuTraceErr(err); -+ break; -+ } -+ -+ err = __put_user(ino, &u->e->ino); -+ if (unlikely(err)) { -+ err = -EFAULT; -+ AuTraceErr(err); -+ break; -+ } -+ u->ul += au_rdu_len(ent.nlen); -+ } -+ si_read_unlock(sb); -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int au_rdu_verify(struct aufs_rdu *rdu) -+{ -+ AuDbg("rdu{%llu, %p, %u | %u | %llu, %u, %u | " -+ "%llu, b%d, 0x%x, g%u}\n", -+ rdu->sz, rdu->ent.e, rdu->verify[AufsCtlRduV_SZ], -+ rdu->blk, -+ rdu->rent, rdu->shwh, rdu->full, -+ rdu->cookie.h_pos, rdu->cookie.bindex, rdu->cookie.flags, -+ rdu->cookie.generation); -+ -+ if (rdu->verify[AufsCtlRduV_SZ] == sizeof(*rdu)) -+ return 0; -+ -+ AuDbg("%u:%u\n", -+ rdu->verify[AufsCtlRduV_SZ], (unsigned int)sizeof(*rdu)); -+ return -EINVAL; -+} -+ -+long au_rdu_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -+{ -+ long err, e; -+ struct aufs_rdu rdu; -+ void __user *p = (void __user *)arg; -+ -+ err = copy_from_user(&rdu, p, sizeof(rdu)); -+ if (unlikely(err)) { -+ err = -EFAULT; -+ AuTraceErr(err); -+ goto out; -+ } -+ err = au_rdu_verify(&rdu); -+ if (unlikely(err)) -+ goto out; -+ -+ switch (cmd) { -+ case AUFS_CTL_RDU: -+ err = au_rdu(file, &rdu); -+ if (unlikely(err)) -+ break; -+ -+ e = copy_to_user(p, &rdu, sizeof(rdu)); -+ if (unlikely(e)) { -+ err = -EFAULT; -+ AuTraceErr(err); -+ } -+ break; -+ case AUFS_CTL_RDU_INO: -+ err = au_rdu_ino(file, &rdu); -+ break; -+ -+ default: -+ /* err = -ENOTTY; */ -+ err = -EINVAL; -+ } -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+#ifdef CONFIG_COMPAT -+long au_rdu_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -+{ -+ long err, e; -+ struct aufs_rdu rdu; -+ void __user *p = compat_ptr(arg); -+ -+ /* todo: get_user()? */ -+ err = copy_from_user(&rdu, p, sizeof(rdu)); -+ if (unlikely(err)) { -+ err = -EFAULT; -+ AuTraceErr(err); -+ goto out; -+ } -+ rdu.ent.e = compat_ptr(rdu.ent.ul); -+ err = au_rdu_verify(&rdu); -+ if (unlikely(err)) -+ goto out; -+ -+ switch (cmd) { -+ case AUFS_CTL_RDU: -+ err = au_rdu(file, &rdu); -+ if (unlikely(err)) -+ break; -+ -+ rdu.ent.ul = ptr_to_compat(rdu.ent.e); -+ rdu.tail.ul = ptr_to_compat(rdu.tail.e); -+ e = copy_to_user(p, &rdu, sizeof(rdu)); -+ if (unlikely(e)) { -+ err = -EFAULT; -+ AuTraceErr(err); -+ } -+ break; -+ case AUFS_CTL_RDU_INO: -+ err = au_rdu_ino(file, &rdu); -+ break; -+ -+ default: -+ /* err = -ENOTTY; */ -+ err = -EINVAL; -+ } -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+#endif -diff -Naur null/fs/aufs/rwsem.h linux-5.15.36/fs/aufs/rwsem.h ---- /dev/null -+++ linux-5.15.36/fs/aufs/rwsem.h 2022-05-10 16:51:39.876744219 +0300 -@@ -0,0 +1,85 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program. If not, see . -+ */ -+ -+/* -+ * simple read-write semaphore wrappers -+ */ -+ -+#ifndef __AUFS_RWSEM_H__ -+#define __AUFS_RWSEM_H__ -+ -+#ifdef __KERNEL__ -+ -+#include "debug.h" -+ -+/* in the future, the name 'au_rwsem' will be totally gone */ -+#define au_rwsem rw_semaphore -+ -+/* to debug easier, do not make them inlined functions */ -+#define AuRwMustNoWaiters(rw) AuDebugOn(rwsem_is_contended(rw)) -+ -+#ifdef CONFIG_LOCKDEP -+/* rwsem_is_locked() is unusable */ -+#define AuRwMustReadLock(rw) AuDebugOn(IS_ENABLED(CONFIG_LOCKDEP) \ -+ && !lockdep_recursing(current) \ -+ && debug_locks \ -+ && !lockdep_is_held_type(rw, 1)) -+#define AuRwMustWriteLock(rw) AuDebugOn(IS_ENABLED(CONFIG_LOCKDEP) \ -+ && !lockdep_recursing(current) \ -+ && debug_locks \ -+ && !lockdep_is_held_type(rw, 0)) -+#define AuRwMustAnyLock(rw) AuDebugOn(IS_ENABLED(CONFIG_LOCKDEP) \ -+ && !lockdep_recursing(current) \ -+ && debug_locks \ -+ && !lockdep_is_held(rw)) -+#define AuRwDestroy(rw) AuDebugOn(IS_ENABLED(CONFIG_LOCKDEP) \ -+ && !lockdep_recursing(current) \ -+ && debug_locks \ -+ && lockdep_is_held(rw)) -+#else -+#define AuRwMustReadLock(rw) do {} while (0) -+#define AuRwMustWriteLock(rw) do {} while (0) -+#define AuRwMustAnyLock(rw) do {} while (0) -+#define AuRwDestroy(rw) do {} while (0) -+#endif -+ -+#define au_rw_init(rw) init_rwsem(rw) -+ -+#define au_rw_init_wlock(rw) do { \ -+ au_rw_init(rw); \ -+ down_write(rw); \ -+ } while (0) -+ -+#define au_rw_init_wlock_nested(rw, lsc) do { \ -+ au_rw_init(rw); \ -+ down_write_nested(rw, lsc); \ -+ } while (0) -+ -+#define au_rw_read_lock(rw) down_read(rw) -+#define au_rw_read_lock_nested(rw, lsc) down_read_nested(rw, lsc) -+#define au_rw_read_unlock(rw) up_read(rw) -+#define au_rw_dgrade_lock(rw) downgrade_write(rw) -+#define au_rw_write_lock(rw) down_write(rw) -+#define au_rw_write_lock_nested(rw, lsc) down_write_nested(rw, lsc) -+#define au_rw_write_unlock(rw) up_write(rw) -+/* why is not _nested version defined? */ -+#define au_rw_read_trylock(rw) down_read_trylock(rw) -+#define au_rw_write_trylock(rw) down_write_trylock(rw) -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_RWSEM_H__ */ -diff -Naur null/fs/aufs/sbinfo.c linux-5.15.36/fs/aufs/sbinfo.c ---- /dev/null -+++ linux-5.15.36/fs/aufs/sbinfo.c 2022-05-10 16:51:39.876744219 +0300 -@@ -0,0 +1,316 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program. If not, see . -+ */ -+ -+/* -+ * superblock private data -+ */ -+ -+#include -+#include "aufs.h" -+ -+/* -+ * they are necessary regardless sysfs is disabled. -+ */ -+void au_si_free(struct kobject *kobj) -+{ -+ int i; -+ struct au_sbinfo *sbinfo; -+ char *locked __maybe_unused; /* debug only */ -+ -+ sbinfo = container_of(kobj, struct au_sbinfo, si_kobj); -+ for (i = 0; i < AuPlink_NHASH; i++) -+ AuDebugOn(!hlist_bl_empty(sbinfo->si_plink + i)); -+ AuDebugOn(atomic_read(&sbinfo->si_nowait.nw_len)); -+ -+ AuLCntZero(au_lcnt_read(&sbinfo->si_ninodes, /*do_rev*/0)); -+ au_lcnt_fin(&sbinfo->si_ninodes, /*do_sync*/0); -+ AuLCntZero(au_lcnt_read(&sbinfo->si_nfiles, /*do_rev*/0)); -+ au_lcnt_fin(&sbinfo->si_nfiles, /*do_sync*/0); -+ -+ dbgaufs_si_fin(sbinfo); -+ au_rw_write_lock(&sbinfo->si_rwsem); -+ au_br_free(sbinfo); -+ au_rw_write_unlock(&sbinfo->si_rwsem); -+ -+ au_kfree_try_rcu(sbinfo->si_branch); -+ mutex_destroy(&sbinfo->si_xib_mtx); -+ AuRwDestroy(&sbinfo->si_rwsem); -+ -+ au_lcnt_wait_for_fin(&sbinfo->si_ninodes); -+ /* si_nfiles is waited too */ -+ au_kfree_rcu(sbinfo); -+} -+ -+struct au_sbinfo *au_si_alloc(struct super_block *sb) -+{ -+ struct au_sbinfo *sbinfo; -+ int err, i; -+ -+ err = -ENOMEM; -+ sbinfo = kzalloc(sizeof(*sbinfo), GFP_NOFS); -+ if (unlikely(!sbinfo)) -+ goto out; -+ -+ /* will be reallocated separately */ -+ sbinfo->si_branch = kzalloc(sizeof(*sbinfo->si_branch), GFP_NOFS); -+ if (unlikely(!sbinfo->si_branch)) -+ goto out_sbinfo; -+ -+ err = sysaufs_si_init(sbinfo); -+ if (!err) { -+ dbgaufs_si_null(sbinfo); -+ err = dbgaufs_si_init(sbinfo); -+ if (unlikely(err)) -+ kobject_put(&sbinfo->si_kobj); -+ } -+ if (unlikely(err)) -+ goto out_br; -+ -+ au_nwt_init(&sbinfo->si_nowait); -+ au_rw_init_wlock(&sbinfo->si_rwsem); -+ -+ au_lcnt_init(&sbinfo->si_ninodes, /*release*/NULL); -+ au_lcnt_init(&sbinfo->si_nfiles, /*release*/NULL); -+ -+ sbinfo->si_bbot = -1; -+ sbinfo->si_last_br_id = AUFS_BRANCH_MAX / 2; -+ -+ sbinfo->si_wbr_copyup = AuWbrCopyup_Def; -+ sbinfo->si_wbr_create = AuWbrCreate_Def; -+ sbinfo->si_wbr_copyup_ops = au_wbr_copyup_ops + sbinfo->si_wbr_copyup; -+ sbinfo->si_wbr_create_ops = au_wbr_create_ops + sbinfo->si_wbr_create; -+ -+ au_fhsm_init(sbinfo); -+ -+ sbinfo->si_mntflags = au_opts_plink(AuOpt_Def); -+ -+ sbinfo->si_xino_jiffy = jiffies; -+ sbinfo->si_xino_expire -+ = msecs_to_jiffies(AUFS_XINO_DEF_SEC * MSEC_PER_SEC); -+ mutex_init(&sbinfo->si_xib_mtx); -+ /* leave si_xib_last_pindex and si_xib_next_bit */ -+ -+ INIT_HLIST_BL_HEAD(&sbinfo->si_aopen); -+ -+ sbinfo->si_rdcache = msecs_to_jiffies(AUFS_RDCACHE_DEF * MSEC_PER_SEC); -+ sbinfo->si_rdblk = AUFS_RDBLK_DEF; -+ sbinfo->si_rdhash = AUFS_RDHASH_DEF; -+ sbinfo->si_dirwh = AUFS_DIRWH_DEF; -+ -+ for (i = 0; i < AuPlink_NHASH; i++) -+ INIT_HLIST_BL_HEAD(sbinfo->si_plink + i); -+ init_waitqueue_head(&sbinfo->si_plink_wq); -+ spin_lock_init(&sbinfo->si_plink_maint_lock); -+ -+ INIT_HLIST_BL_HEAD(&sbinfo->si_files); -+ -+ /* with getattr by default */ -+ sbinfo->si_iop_array = aufs_iop; -+ -+ /* leave other members for sysaufs and si_mnt. */ -+ sbinfo->si_sb = sb; -+ if (sb) { -+ sb->s_fs_info = sbinfo; -+ si_pid_set(sb); -+ } -+ return sbinfo; /* success */ -+ -+out_br: -+ au_kfree_try_rcu(sbinfo->si_branch); -+out_sbinfo: -+ au_kfree_rcu(sbinfo); -+out: -+ return ERR_PTR(err); -+} -+ -+int au_sbr_realloc(struct au_sbinfo *sbinfo, int nbr, int may_shrink) -+{ -+ int err, sz; -+ struct au_branch **brp; -+ -+ AuRwMustWriteLock(&sbinfo->si_rwsem); -+ -+ err = -ENOMEM; -+ sz = sizeof(*brp) * (sbinfo->si_bbot + 1); -+ if (unlikely(!sz)) -+ sz = sizeof(*brp); -+ brp = au_kzrealloc(sbinfo->si_branch, sz, sizeof(*brp) * nbr, GFP_NOFS, -+ may_shrink); -+ if (brp) { -+ sbinfo->si_branch = brp; -+ err = 0; -+ } -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+unsigned int au_sigen_inc(struct super_block *sb) -+{ -+ unsigned int gen; -+ struct inode *inode; -+ -+ SiMustWriteLock(sb); -+ -+ gen = ++au_sbi(sb)->si_generation; -+ au_update_digen(sb->s_root); -+ inode = d_inode(sb->s_root); -+ au_update_iigen(inode, /*half*/0); -+ inode_inc_iversion(inode); -+ return gen; -+} -+ -+aufs_bindex_t au_new_br_id(struct super_block *sb) -+{ -+ aufs_bindex_t br_id; -+ int i; -+ struct au_sbinfo *sbinfo; -+ -+ SiMustWriteLock(sb); -+ -+ sbinfo = au_sbi(sb); -+ for (i = 0; i <= AUFS_BRANCH_MAX; i++) { -+ br_id = ++sbinfo->si_last_br_id; -+ AuDebugOn(br_id < 0); -+ if (br_id && au_br_index(sb, br_id) < 0) -+ return br_id; -+ } -+ -+ return -1; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* it is ok that new 'nwt' tasks are appended while we are sleeping */ -+int si_read_lock(struct super_block *sb, int flags) -+{ -+ int err; -+ -+ err = 0; -+ if (au_ftest_lock(flags, FLUSH)) -+ au_nwt_flush(&au_sbi(sb)->si_nowait); -+ -+ si_noflush_read_lock(sb); -+ err = au_plink_maint(sb, flags); -+ if (unlikely(err)) -+ si_read_unlock(sb); -+ -+ return err; -+} -+ -+int si_write_lock(struct super_block *sb, int flags) -+{ -+ int err; -+ -+ if (au_ftest_lock(flags, FLUSH)) -+ au_nwt_flush(&au_sbi(sb)->si_nowait); -+ -+ si_noflush_write_lock(sb); -+ err = au_plink_maint(sb, flags); -+ if (unlikely(err)) -+ si_write_unlock(sb); -+ -+ return err; -+} -+ -+/* dentry and super_block lock. call at entry point */ -+int aufs_read_lock(struct dentry *dentry, int flags) -+{ -+ int err; -+ struct super_block *sb; -+ -+ sb = dentry->d_sb; -+ err = si_read_lock(sb, flags); -+ if (unlikely(err)) -+ goto out; -+ -+ if (au_ftest_lock(flags, DW)) -+ di_write_lock_child(dentry); -+ else -+ di_read_lock_child(dentry, flags); -+ -+ if (au_ftest_lock(flags, GEN)) { -+ err = au_digen_test(dentry, au_sigen(sb)); -+ if (!au_opt_test(au_mntflags(sb), UDBA_NONE)) -+ AuDebugOn(!err && au_dbrange_test(dentry)); -+ else if (!err) -+ err = au_dbrange_test(dentry); -+ if (unlikely(err)) -+ aufs_read_unlock(dentry, flags); -+ } -+ -+out: -+ return err; -+} -+ -+void aufs_read_unlock(struct dentry *dentry, int flags) -+{ -+ if (au_ftest_lock(flags, DW)) -+ di_write_unlock(dentry); -+ else -+ di_read_unlock(dentry, flags); -+ si_read_unlock(dentry->d_sb); -+} -+ -+void aufs_write_lock(struct dentry *dentry) -+{ -+ si_write_lock(dentry->d_sb, AuLock_FLUSH | AuLock_NOPLMW); -+ di_write_lock_child(dentry); -+} -+ -+void aufs_write_unlock(struct dentry *dentry) -+{ -+ di_write_unlock(dentry); -+ si_write_unlock(dentry->d_sb); -+} -+ -+int aufs_read_and_write_lock2(struct dentry *d1, struct dentry *d2, int flags) -+{ -+ int err; -+ unsigned int sigen; -+ struct super_block *sb; -+ -+ sb = d1->d_sb; -+ err = si_read_lock(sb, flags); -+ if (unlikely(err)) -+ goto out; -+ -+ di_write_lock2_child(d1, d2, au_ftest_lock(flags, DIRS)); -+ -+ if (au_ftest_lock(flags, GEN)) { -+ sigen = au_sigen(sb); -+ err = au_digen_test(d1, sigen); -+ AuDebugOn(!err && au_dbrange_test(d1)); -+ if (!err) { -+ err = au_digen_test(d2, sigen); -+ AuDebugOn(!err && au_dbrange_test(d2)); -+ } -+ if (unlikely(err)) -+ aufs_read_and_write_unlock2(d1, d2); -+ } -+ -+out: -+ return err; -+} -+ -+void aufs_read_and_write_unlock2(struct dentry *d1, struct dentry *d2) -+{ -+ di_write_unlock2(d1, d2); -+ si_read_unlock(d1->d_sb); -+} -diff -Naur null/fs/aufs/super.c linux-5.15.36/fs/aufs/super.c ---- /dev/null -+++ linux-5.15.36/fs/aufs/super.c 2022-05-10 16:51:39.876744219 +0300 -@@ -0,0 +1,871 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program. If not, see . -+ */ -+ -+/* -+ * mount and super_block operations -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include "aufs.h" -+ -+/* -+ * super_operations -+ */ -+static struct inode *aufs_alloc_inode(struct super_block *sb __maybe_unused) -+{ -+ struct au_icntnr *c; -+ -+ c = au_cache_alloc_icntnr(); -+ if (c) { -+ au_icntnr_init(c); -+ inode_set_iversion(&c->vfs_inode, 1); /* sigen(sb); */ -+ c->iinfo.ii_hinode = NULL; -+ return &c->vfs_inode; -+ } -+ return NULL; -+} -+ -+static void aufs_destroy_inode(struct inode *inode) -+{ -+ if (!au_is_bad_inode(inode)) -+ au_iinfo_fin(inode); -+} -+ -+static void aufs_free_inode(struct inode *inode) -+{ -+ au_cache_free_icntnr(container_of(inode, struct au_icntnr, vfs_inode)); -+} -+ -+struct inode *au_iget_locked(struct super_block *sb, ino_t ino) -+{ -+ struct inode *inode; -+ int err; -+ -+ inode = iget_locked(sb, ino); -+ if (unlikely(!inode)) { -+ inode = ERR_PTR(-ENOMEM); -+ goto out; -+ } -+ if (!(inode->i_state & I_NEW)) -+ goto out; -+ -+ err = au_xigen_new(inode); -+ if (!err) -+ err = au_iinfo_init(inode); -+ if (!err) -+ inode_inc_iversion(inode); -+ else { -+ iget_failed(inode); -+ inode = ERR_PTR(err); -+ } -+ -+out: -+ /* never return NULL */ -+ AuDebugOn(!inode); -+ AuTraceErrPtr(inode); -+ return inode; -+} -+ -+/* lock free root dinfo */ -+static int au_show_brs(struct seq_file *seq, struct super_block *sb) -+{ -+ int err; -+ aufs_bindex_t bindex, bbot; -+ struct path path; -+ struct au_hdentry *hdp; -+ struct au_branch *br; -+ au_br_perm_str_t perm; -+ -+ err = 0; -+ bbot = au_sbbot(sb); -+ bindex = 0; -+ hdp = au_hdentry(au_di(sb->s_root), bindex); -+ for (; !err && bindex <= bbot; bindex++, hdp++) { -+ br = au_sbr(sb, bindex); -+ path.mnt = au_br_mnt(br); -+ path.dentry = hdp->hd_dentry; -+ err = au_seq_path(seq, &path); -+ if (!err) { -+ au_optstr_br_perm(&perm, br->br_perm); -+ seq_printf(seq, "=%s", perm.a); -+ if (bindex != bbot) -+ seq_putc(seq, ':'); -+ } -+ } -+ if (unlikely(err || seq_has_overflowed(seq))) -+ err = -E2BIG; -+ -+ return err; -+} -+ -+static void au_gen_fmt(char *fmt, int len __maybe_unused, const char *pat, -+ const char *append) -+{ -+ char *p; -+ -+ p = fmt; -+ while (*pat != ':') -+ *p++ = *pat++; -+ *p++ = *pat++; -+ strcpy(p, append); -+ AuDebugOn(strlen(fmt) >= len); -+} -+ -+static void au_show_wbr_create(struct seq_file *m, int v, -+ struct au_sbinfo *sbinfo) -+{ -+ const char *pat; -+ char fmt[32]; -+ struct au_wbr_mfs *mfs; -+ -+ AuRwMustAnyLock(&sbinfo->si_rwsem); -+ -+ seq_puts(m, ",create="); -+ pat = au_optstr_wbr_create(v); -+ mfs = &sbinfo->si_wbr_mfs; -+ switch (v) { -+ case AuWbrCreate_TDP: -+ case AuWbrCreate_RR: -+ case AuWbrCreate_MFS: -+ case AuWbrCreate_PMFS: -+ seq_puts(m, pat); -+ break; -+ case AuWbrCreate_MFSRR: -+ case AuWbrCreate_TDMFS: -+ case AuWbrCreate_PMFSRR: -+ au_gen_fmt(fmt, sizeof(fmt), pat, "%llu"); -+ seq_printf(m, fmt, mfs->mfsrr_watermark); -+ break; -+ case AuWbrCreate_MFSV: -+ case AuWbrCreate_PMFSV: -+ au_gen_fmt(fmt, sizeof(fmt), pat, "%lu"); -+ seq_printf(m, fmt, -+ jiffies_to_msecs(mfs->mfs_expire) -+ / MSEC_PER_SEC); -+ break; -+ case AuWbrCreate_MFSRRV: -+ case AuWbrCreate_TDMFSV: -+ case AuWbrCreate_PMFSRRV: -+ au_gen_fmt(fmt, sizeof(fmt), pat, "%llu:%lu"); -+ seq_printf(m, fmt, mfs->mfsrr_watermark, -+ jiffies_to_msecs(mfs->mfs_expire) / MSEC_PER_SEC); -+ break; -+ default: -+ BUG(); -+ } -+} -+ -+static int au_show_xino(struct seq_file *seq, struct super_block *sb) -+{ -+#ifdef CONFIG_SYSFS -+ return 0; -+#else -+ int err; -+ const int len = sizeof(AUFS_XINO_FNAME) - 1; -+ aufs_bindex_t bindex, brid; -+ struct qstr *name; -+ struct file *f; -+ struct dentry *d, *h_root; -+ struct au_branch *br; -+ -+ AuRwMustAnyLock(&sbinfo->si_rwsem); -+ -+ err = 0; -+ f = au_sbi(sb)->si_xib; -+ if (!f) -+ goto out; -+ -+ /* stop printing the default xino path on the first writable branch */ -+ h_root = NULL; -+ bindex = au_xi_root(sb, f->f_path.dentry); -+ if (bindex >= 0) { -+ br = au_sbr_sb(sb, bindex); -+ h_root = au_br_dentry(br); -+ } -+ -+ d = f->f_path.dentry; -+ name = &d->d_name; -+ /* safe ->d_parent because the file is unlinked */ -+ if (d->d_parent == h_root -+ && name->len == len -+ && !memcmp(name->name, AUFS_XINO_FNAME, len)) -+ goto out; -+ -+ seq_puts(seq, ",xino="); -+ err = au_xino_path(seq, f); -+ -+out: -+ return err; -+#endif -+} -+ -+/* seq_file will re-call me in case of too long string */ -+static int aufs_show_options(struct seq_file *m, struct dentry *dentry) -+{ -+ int err; -+ unsigned int mnt_flags, v; -+ struct super_block *sb; -+ struct au_sbinfo *sbinfo; -+ -+#define AuBool(name, str) do { \ -+ v = au_opt_test(mnt_flags, name); \ -+ if (v != au_opt_test(AuOpt_Def, name)) \ -+ seq_printf(m, ",%s" #str, v ? "" : "no"); \ -+} while (0) -+ -+#define AuStr(name, str) do { \ -+ v = mnt_flags & AuOptMask_##name; \ -+ if (v != (AuOpt_Def & AuOptMask_##name)) \ -+ seq_printf(m, "," #str "=%s", au_optstr_##str(v)); \ -+} while (0) -+ -+#define AuUInt(name, str, val) do { \ -+ if (val != AUFS_##name##_DEF) \ -+ seq_printf(m, "," #str "=%u", val); \ -+} while (0) -+ -+ sb = dentry->d_sb; -+ if (sb->s_flags & SB_POSIXACL) -+ seq_puts(m, ",acl"); -+#if 0 /* reserved for future use */ -+ if (sb->s_flags & SB_I_VERSION) -+ seq_puts(m, ",i_version"); -+#endif -+ -+ /* lock free root dinfo */ -+ si_noflush_read_lock(sb); -+ sbinfo = au_sbi(sb); -+ seq_printf(m, ",si=%lx", sysaufs_si_id(sbinfo)); -+ -+ mnt_flags = au_mntflags(sb); -+ if (au_opt_test(mnt_flags, XINO)) { -+ err = au_show_xino(m, sb); -+ if (unlikely(err)) -+ goto out; -+ } else -+ seq_puts(m, ",noxino"); -+ -+ AuBool(TRUNC_XINO, trunc_xino); -+ AuStr(UDBA, udba); -+ AuBool(SHWH, shwh); -+ AuBool(PLINK, plink); -+ AuBool(DIO, dio); -+ AuBool(DIRPERM1, dirperm1); -+ -+ v = sbinfo->si_wbr_create; -+ if (v != AuWbrCreate_Def) -+ au_show_wbr_create(m, v, sbinfo); -+ -+ v = sbinfo->si_wbr_copyup; -+ if (v != AuWbrCopyup_Def) -+ seq_printf(m, ",cpup=%s", au_optstr_wbr_copyup(v)); -+ -+ v = au_opt_test(mnt_flags, ALWAYS_DIROPQ); -+ if (v != au_opt_test(AuOpt_Def, ALWAYS_DIROPQ)) -+ seq_printf(m, ",diropq=%c", v ? 'a' : 'w'); -+ -+ AuUInt(DIRWH, dirwh, sbinfo->si_dirwh); -+ -+ v = jiffies_to_msecs(sbinfo->si_rdcache) / MSEC_PER_SEC; -+ AuUInt(RDCACHE, rdcache, v); -+ -+ AuUInt(RDBLK, rdblk, sbinfo->si_rdblk); -+ AuUInt(RDHASH, rdhash, sbinfo->si_rdhash); -+ -+ au_fhsm_show(m, sbinfo); -+ -+ AuBool(DIRREN, dirren); -+ AuBool(SUM, sum); -+ /* AuBool(SUM_W, wsum); */ -+ AuBool(WARN_PERM, warn_perm); -+ AuBool(VERBOSE, verbose); -+ -+out: -+ /* be sure to print "br:" last */ -+ if (!sysaufs_brs) { -+ seq_puts(m, ",br:"); -+ au_show_brs(m, sb); -+ } -+ si_read_unlock(sb); -+ return 0; -+ -+#undef AuBool -+#undef AuStr -+#undef AuUInt -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* sum mode which returns the summation for statfs(2) */ -+ -+static u64 au_add_till_max(u64 a, u64 b) -+{ -+ u64 old; -+ -+ old = a; -+ a += b; -+ if (old <= a) -+ return a; -+ return ULLONG_MAX; -+} -+ -+static u64 au_mul_till_max(u64 a, long mul) -+{ -+ u64 old; -+ -+ old = a; -+ a *= mul; -+ if (old <= a) -+ return a; -+ return ULLONG_MAX; -+} -+ -+static int au_statfs_sum(struct super_block *sb, struct kstatfs *buf) -+{ -+ int err; -+ long bsize, factor; -+ u64 blocks, bfree, bavail, files, ffree; -+ aufs_bindex_t bbot, bindex, i; -+ unsigned char shared; -+ struct path h_path; -+ struct super_block *h_sb; -+ -+ err = 0; -+ bsize = LONG_MAX; -+ files = 0; -+ ffree = 0; -+ blocks = 0; -+ bfree = 0; -+ bavail = 0; -+ bbot = au_sbbot(sb); -+ for (bindex = 0; bindex <= bbot; bindex++) { -+ h_path.mnt = au_sbr_mnt(sb, bindex); -+ h_sb = h_path.mnt->mnt_sb; -+ shared = 0; -+ for (i = 0; !shared && i < bindex; i++) -+ shared = (au_sbr_sb(sb, i) == h_sb); -+ if (shared) -+ continue; -+ -+ /* sb->s_root for NFS is unreliable */ -+ h_path.dentry = h_path.mnt->mnt_root; -+ err = vfs_statfs(&h_path, buf); -+ if (unlikely(err)) -+ goto out; -+ -+ if (bsize > buf->f_bsize) { -+ /* -+ * we will reduce bsize, so we have to expand blocks -+ * etc. to match them again -+ */ -+ factor = (bsize / buf->f_bsize); -+ blocks = au_mul_till_max(blocks, factor); -+ bfree = au_mul_till_max(bfree, factor); -+ bavail = au_mul_till_max(bavail, factor); -+ bsize = buf->f_bsize; -+ } -+ -+ factor = (buf->f_bsize / bsize); -+ blocks = au_add_till_max(blocks, -+ au_mul_till_max(buf->f_blocks, factor)); -+ bfree = au_add_till_max(bfree, -+ au_mul_till_max(buf->f_bfree, factor)); -+ bavail = au_add_till_max(bavail, -+ au_mul_till_max(buf->f_bavail, factor)); -+ files = au_add_till_max(files, buf->f_files); -+ ffree = au_add_till_max(ffree, buf->f_ffree); -+ } -+ -+ buf->f_bsize = bsize; -+ buf->f_blocks = blocks; -+ buf->f_bfree = bfree; -+ buf->f_bavail = bavail; -+ buf->f_files = files; -+ buf->f_ffree = ffree; -+ buf->f_frsize = 0; -+ -+out: -+ return err; -+} -+ -+static int aufs_statfs(struct dentry *dentry, struct kstatfs *buf) -+{ -+ int err; -+ struct path h_path; -+ struct super_block *sb; -+ -+ /* lock free root dinfo */ -+ sb = dentry->d_sb; -+ si_noflush_read_lock(sb); -+ if (!au_opt_test(au_mntflags(sb), SUM)) { -+ /* sb->s_root for NFS is unreliable */ -+ h_path.mnt = au_sbr_mnt(sb, 0); -+ h_path.dentry = h_path.mnt->mnt_root; -+ err = vfs_statfs(&h_path, buf); -+ } else -+ err = au_statfs_sum(sb, buf); -+ si_read_unlock(sb); -+ -+ if (!err) { -+ buf->f_type = AUFS_SUPER_MAGIC; -+ buf->f_namelen = AUFS_MAX_NAMELEN; -+ memset(&buf->f_fsid, 0, sizeof(buf->f_fsid)); -+ } -+ /* buf->f_bsize = buf->f_blocks = buf->f_bfree = buf->f_bavail = -1; */ -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int aufs_sync_fs(struct super_block *sb, int wait) -+{ -+ int err, e; -+ aufs_bindex_t bbot, bindex; -+ struct au_branch *br; -+ struct super_block *h_sb; -+ -+ err = 0; -+ si_noflush_read_lock(sb); -+ bbot = au_sbbot(sb); -+ for (bindex = 0; bindex <= bbot; bindex++) { -+ br = au_sbr(sb, bindex); -+ if (!au_br_writable(br->br_perm)) -+ continue; -+ -+ h_sb = au_sbr_sb(sb, bindex); -+ e = vfsub_sync_filesystem(h_sb); -+ if (unlikely(e && !err)) -+ err = e; -+ /* go on even if an error happens */ -+ } -+ si_read_unlock(sb); -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* final actions when unmounting a file system */ -+static void aufs_put_super(struct super_block *sb) -+{ -+ struct au_sbinfo *sbinfo; -+ -+ sbinfo = au_sbi(sb); -+ if (sbinfo) -+ kobject_put(&sbinfo->si_kobj); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+void *au_array_alloc(unsigned long long *hint, au_arraycb_t cb, -+ struct super_block *sb, void *arg) -+{ -+ void *array; -+ unsigned long long n, sz; -+ -+ array = NULL; -+ n = 0; -+ if (!*hint) -+ goto out; -+ -+ if (*hint > ULLONG_MAX / sizeof(array)) { -+ array = ERR_PTR(-EMFILE); -+ pr_err("hint %llu\n", *hint); -+ goto out; -+ } -+ -+ sz = sizeof(array) * *hint; -+ array = kzalloc(sz, GFP_NOFS); -+ if (unlikely(!array)) -+ array = vzalloc(sz); -+ if (unlikely(!array)) { -+ array = ERR_PTR(-ENOMEM); -+ goto out; -+ } -+ -+ n = cb(sb, array, *hint, arg); -+ AuDebugOn(n > *hint); -+ -+out: -+ *hint = n; -+ return array; -+} -+ -+static unsigned long long au_iarray_cb(struct super_block *sb, void *a, -+ unsigned long long max __maybe_unused, -+ void *arg) -+{ -+ unsigned long long n; -+ struct inode **p, *inode; -+ struct list_head *head; -+ -+ n = 0; -+ p = a; -+ head = arg; -+ spin_lock(&sb->s_inode_list_lock); -+ list_for_each_entry(inode, head, i_sb_list) { -+ if (!au_is_bad_inode(inode) -+ && au_ii(inode)->ii_btop >= 0) { -+ spin_lock(&inode->i_lock); -+ if (atomic_read(&inode->i_count)) { -+ au_igrab(inode); -+ *p++ = inode; -+ n++; -+ AuDebugOn(n > max); -+ } -+ spin_unlock(&inode->i_lock); -+ } -+ } -+ spin_unlock(&sb->s_inode_list_lock); -+ -+ return n; -+} -+ -+struct inode **au_iarray_alloc(struct super_block *sb, unsigned long long *max) -+{ -+ struct au_sbinfo *sbi; -+ -+ sbi = au_sbi(sb); -+ *max = au_lcnt_read(&sbi->si_ninodes, /*do_rev*/1); -+ return au_array_alloc(max, au_iarray_cb, sb, &sb->s_inodes); -+} -+ -+void au_iarray_free(struct inode **a, unsigned long long max) -+{ -+ unsigned long long ull; -+ -+ for (ull = 0; ull < max; ull++) -+ iput(a[ull]); -+ kvfree(a); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * refresh dentry and inode at remount time. -+ */ -+/* todo: consolidate with simple_reval_dpath() and au_reval_for_attr() */ -+static int au_do_refresh(struct dentry *dentry, unsigned int dir_flags, -+ struct dentry *parent) -+{ -+ int err; -+ -+ di_write_lock_child(dentry); -+ di_read_lock_parent(parent, AuLock_IR); -+ err = au_refresh_dentry(dentry, parent); -+ if (!err && dir_flags) -+ au_hn_reset(d_inode(dentry), dir_flags); -+ di_read_unlock(parent, AuLock_IR); -+ di_write_unlock(dentry); -+ -+ return err; -+} -+ -+static int au_do_refresh_d(struct dentry *dentry, unsigned int sigen, -+ struct au_sbinfo *sbinfo, -+ const unsigned int dir_flags, unsigned int do_idop) -+{ -+ int err; -+ struct dentry *parent; -+ -+ err = 0; -+ parent = dget_parent(dentry); -+ if (!au_digen_test(parent, sigen) && au_digen_test(dentry, sigen)) { -+ if (d_really_is_positive(dentry)) { -+ if (!d_is_dir(dentry)) -+ err = au_do_refresh(dentry, /*dir_flags*/0, -+ parent); -+ else { -+ err = au_do_refresh(dentry, dir_flags, parent); -+ if (unlikely(err)) -+ au_fset_si(sbinfo, FAILED_REFRESH_DIR); -+ } -+ } else -+ err = au_do_refresh(dentry, /*dir_flags*/0, parent); -+ AuDbgDentry(dentry); -+ } -+ dput(parent); -+ -+ if (!err) { -+ if (do_idop) -+ au_refresh_dop(dentry, /*force_reval*/0); -+ } else -+ au_refresh_dop(dentry, /*force_reval*/1); -+ -+ AuTraceErr(err); -+ return err; -+} -+ -+static int au_refresh_d(struct super_block *sb, unsigned int do_idop) -+{ -+ int err, i, j, ndentry, e; -+ unsigned int sigen; -+ struct au_dcsub_pages dpages; -+ struct au_dpage *dpage; -+ struct dentry **dentries, *d; -+ struct au_sbinfo *sbinfo; -+ struct dentry *root = sb->s_root; -+ const unsigned int dir_flags = au_hi_flags(d_inode(root), /*isdir*/1); -+ -+ if (do_idop) -+ au_refresh_dop(root, /*force_reval*/0); -+ -+ err = au_dpages_init(&dpages, GFP_NOFS); -+ if (unlikely(err)) -+ goto out; -+ err = au_dcsub_pages(&dpages, root, NULL, NULL); -+ if (unlikely(err)) -+ goto out_dpages; -+ -+ sigen = au_sigen(sb); -+ sbinfo = au_sbi(sb); -+ for (i = 0; i < dpages.ndpage; i++) { -+ dpage = dpages.dpages + i; -+ dentries = dpage->dentries; -+ ndentry = dpage->ndentry; -+ for (j = 0; j < ndentry; j++) { -+ d = dentries[j]; -+ e = au_do_refresh_d(d, sigen, sbinfo, dir_flags, -+ do_idop); -+ if (unlikely(e && !err)) -+ err = e; -+ /* go on even err */ -+ } -+ } -+ -+out_dpages: -+ au_dpages_free(&dpages); -+out: -+ return err; -+} -+ -+static int au_refresh_i(struct super_block *sb, unsigned int do_idop) -+{ -+ int err, e; -+ unsigned int sigen; -+ unsigned long long max, ull; -+ struct inode *inode, **array; -+ -+ array = au_iarray_alloc(sb, &max); -+ err = PTR_ERR(array); -+ if (IS_ERR(array)) -+ goto out; -+ -+ err = 0; -+ sigen = au_sigen(sb); -+ for (ull = 0; ull < max; ull++) { -+ inode = array[ull]; -+ if (unlikely(!inode)) -+ break; -+ -+ e = 0; -+ ii_write_lock_child(inode); -+ if (au_iigen(inode, NULL) != sigen) { -+ e = au_refresh_hinode_self(inode); -+ if (unlikely(e)) { -+ au_refresh_iop(inode, /*force_getattr*/1); -+ pr_err("error %d, i%lu\n", e, inode->i_ino); -+ if (!err) -+ err = e; -+ /* go on even if err */ -+ } -+ } -+ if (!e && do_idop) -+ au_refresh_iop(inode, /*force_getattr*/0); -+ ii_write_unlock(inode); -+ } -+ -+ au_iarray_free(array, max); -+ -+out: -+ return err; -+} -+ -+void au_remount_refresh(struct super_block *sb, unsigned int do_idop) -+{ -+ int err, e; -+ unsigned int udba; -+ aufs_bindex_t bindex, bbot; -+ struct dentry *root; -+ struct inode *inode; -+ struct au_branch *br; -+ struct au_sbinfo *sbi; -+ -+ au_sigen_inc(sb); -+ sbi = au_sbi(sb); -+ au_fclr_si(sbi, FAILED_REFRESH_DIR); -+ -+ root = sb->s_root; -+ DiMustNoWaiters(root); -+ inode = d_inode(root); -+ IiMustNoWaiters(inode); -+ -+ udba = au_opt_udba(sb); -+ bbot = au_sbbot(sb); -+ for (bindex = 0; bindex <= bbot; bindex++) { -+ br = au_sbr(sb, bindex); -+ err = au_hnotify_reset_br(udba, br, br->br_perm); -+ if (unlikely(err)) -+ AuIOErr("hnotify failed on br %d, %d, ignored\n", -+ bindex, err); -+ /* go on even if err */ -+ } -+ au_hn_reset(inode, au_hi_flags(inode, /*isdir*/1)); -+ -+ if (do_idop) { -+ if (au_ftest_si(sbi, NO_DREVAL)) { -+ AuDebugOn(sb->s_d_op == &aufs_dop_noreval); -+ sb->s_d_op = &aufs_dop_noreval; -+ AuDebugOn(sbi->si_iop_array == aufs_iop_nogetattr); -+ sbi->si_iop_array = aufs_iop_nogetattr; -+ } else { -+ AuDebugOn(sb->s_d_op == &aufs_dop); -+ sb->s_d_op = &aufs_dop; -+ AuDebugOn(sbi->si_iop_array == aufs_iop); -+ sbi->si_iop_array = aufs_iop; -+ } -+ pr_info("reset to %ps and %ps\n", -+ sb->s_d_op, sbi->si_iop_array); -+ } -+ -+ di_write_unlock(root); -+ err = au_refresh_d(sb, do_idop); -+ e = au_refresh_i(sb, do_idop); -+ if (unlikely(e && !err)) -+ err = e; -+ /* aufs_write_lock() calls ..._child() */ -+ di_write_lock_child(root); -+ -+ au_cpup_attr_all(inode, /*force*/1); -+ -+ if (unlikely(err)) -+ AuIOErr("refresh failed, ignored, %d\n", err); -+} -+ -+const struct super_operations aufs_sop = { -+ .alloc_inode = aufs_alloc_inode, -+ .destroy_inode = aufs_destroy_inode, -+ .free_inode = aufs_free_inode, -+ /* always deleting, no clearing */ -+ .drop_inode = generic_delete_inode, -+ .show_options = aufs_show_options, -+ .statfs = aufs_statfs, -+ .put_super = aufs_put_super, -+ .sync_fs = aufs_sync_fs -+}; -+ -+/* ---------------------------------------------------------------------- */ -+ -+int au_alloc_root(struct super_block *sb) -+{ -+ int err; -+ struct inode *inode; -+ struct dentry *root; -+ -+ err = -ENOMEM; -+ inode = au_iget_locked(sb, AUFS_ROOT_INO); -+ err = PTR_ERR(inode); -+ if (IS_ERR(inode)) -+ goto out; -+ -+ inode->i_op = aufs_iop + AuIop_DIR; /* with getattr by default */ -+ inode->i_fop = &aufs_dir_fop; -+ inode->i_mode = S_IFDIR; -+ set_nlink(inode, 2); -+ unlock_new_inode(inode); -+ -+ root = d_make_root(inode); -+ if (unlikely(!root)) -+ goto out; -+ err = PTR_ERR(root); -+ if (IS_ERR(root)) -+ goto out; -+ -+ err = au_di_init(root); -+ if (!err) { -+ sb->s_root = root; -+ return 0; /* success */ -+ } -+ dput(root); -+ -+out: -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static void aufs_kill_sb(struct super_block *sb) -+{ -+ struct au_sbinfo *sbinfo; -+ struct dentry *root; -+ -+ sbinfo = au_sbi(sb); -+ if (!sbinfo) -+ goto out; -+ -+ au_sbilist_del(sb); -+ -+ root = sb->s_root; -+ if (root) -+ aufs_write_lock(root); -+ else -+ __si_write_lock(sb); -+ -+ au_fhsm_fin(sb); -+ if (sbinfo->si_wbr_create_ops->fin) -+ sbinfo->si_wbr_create_ops->fin(sb); -+ if (au_opt_test(sbinfo->si_mntflags, UDBA_HNOTIFY)) { -+ au_opt_set_udba(sbinfo->si_mntflags, UDBA_NONE); -+ au_remount_refresh(sb, /*do_idop*/0); -+ } -+ if (au_opt_test(sbinfo->si_mntflags, PLINK)) -+ au_plink_put(sb, /*verbose*/1); -+ au_xino_clr(sb); -+ if (root) -+ au_dr_opt_flush(sb); -+ -+ if (root) -+ aufs_write_unlock(root); -+ else -+ __si_write_unlock(sb); -+ -+ sbinfo->si_sb = NULL; -+ au_nwt_flush(&sbinfo->si_nowait); -+ -+out: -+ kill_anon_super(sb); -+} -+ -+struct file_system_type aufs_fs_type = { -+ .name = AUFS_FSTYPE, -+ /* a race between rename and others */ -+ .fs_flags = FS_RENAME_DOES_D_MOVE -+ /* untested */ -+ /*| FS_ALLOW_IDMAP*/ -+ , -+ .init_fs_context = aufs_fsctx_init, -+ .parameters = aufs_fsctx_paramspec, -+ .kill_sb = aufs_kill_sb, -+ /* no need to __module_get() and module_put(). */ -+ .owner = THIS_MODULE, -+}; -diff -Naur null/fs/aufs/super.h linux-5.15.36/fs/aufs/super.h ---- /dev/null -+++ linux-5.15.36/fs/aufs/super.h 2022-05-10 16:51:39.876744219 +0300 -@@ -0,0 +1,592 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program. If not, see . -+ */ -+ -+/* -+ * super_block operations -+ */ -+ -+#ifndef __AUFS_SUPER_H__ -+#define __AUFS_SUPER_H__ -+ -+#ifdef __KERNEL__ -+ -+#include -+#include -+#include "hbl.h" -+#include "lcnt.h" -+#include "rwsem.h" -+#include "wkq.h" -+ -+/* policies to select one among multiple writable branches */ -+struct au_wbr_copyup_operations { -+ int (*copyup)(struct dentry *dentry); -+}; -+ -+#define AuWbr_DIR 1 /* target is a dir */ -+#define AuWbr_PARENT (1 << 1) /* always require a parent */ -+ -+#define au_ftest_wbr(flags, name) ((flags) & AuWbr_##name) -+#define au_fset_wbr(flags, name) { (flags) |= AuWbr_##name; } -+#define au_fclr_wbr(flags, name) { (flags) &= ~AuWbr_##name; } -+ -+struct au_wbr_create_operations { -+ int (*create)(struct dentry *dentry, unsigned int flags); -+ int (*init)(struct super_block *sb); -+ int (*fin)(struct super_block *sb); -+}; -+ -+struct au_wbr_mfs { -+ struct mutex mfs_lock; /* protect this structure */ -+ unsigned long mfs_jiffy; -+ unsigned long mfs_expire; -+ aufs_bindex_t mfs_bindex; -+ -+ unsigned long long mfsrr_bytes; -+ unsigned long long mfsrr_watermark; -+}; -+ -+#define AuPlink_NHASH 100 -+static inline int au_plink_hash(ino_t ino) -+{ -+ return ino % AuPlink_NHASH; -+} -+ -+/* File-based Hierarchical Storage Management */ -+struct au_fhsm { -+#ifdef CONFIG_AUFS_FHSM -+ /* allow only one process who can receive the notification */ -+ spinlock_t fhsm_spin; -+ pid_t fhsm_pid; -+ wait_queue_head_t fhsm_wqh; -+ atomic_t fhsm_readable; -+ -+ /* these are protected by si_rwsem */ -+ unsigned long fhsm_expire; -+ aufs_bindex_t fhsm_bottom; -+#endif -+}; -+ -+struct au_branch; -+struct au_sbinfo { -+ /* nowait tasks in the system-wide workqueue */ -+ struct au_nowait_tasks si_nowait; -+ -+ /* -+ * tried sb->s_umount, but failed due to the dependency between i_mutex. -+ * rwsem for au_sbinfo is necessary. -+ */ -+ struct au_rwsem si_rwsem; -+ -+ /* -+ * dirty approach to protect sb->sb_inodes and ->s_files (gone) from -+ * remount. -+ */ -+ au_lcnt_t si_ninodes, si_nfiles; -+ -+ /* branch management */ -+ unsigned int si_generation; -+ -+ /* see AuSi_ flags */ -+ unsigned char au_si_status; -+ -+ aufs_bindex_t si_bbot; -+ -+ /* dirty trick to keep br_id plus */ -+ unsigned int si_last_br_id : -+ sizeof(aufs_bindex_t) * BITS_PER_BYTE - 1; -+ struct au_branch **si_branch; -+ -+ /* policy to select a writable branch */ -+ unsigned char si_wbr_copyup; -+ unsigned char si_wbr_create; -+ struct au_wbr_copyup_operations *si_wbr_copyup_ops; -+ struct au_wbr_create_operations *si_wbr_create_ops; -+ -+ /* round robin */ -+ atomic_t si_wbr_rr_next; -+ -+ /* most free space */ -+ struct au_wbr_mfs si_wbr_mfs; -+ -+ /* File-based Hierarchical Storage Management */ -+ struct au_fhsm si_fhsm; -+ -+ /* mount flags */ -+ /* include/asm-ia64/siginfo.h defines a macro named si_flags */ -+ unsigned int si_mntflags; -+ -+ /* external inode number (bitmap and translation table) */ -+ loff_t si_ximaxent; /* max entries in a xino */ -+ -+ struct file *si_xib; -+ struct mutex si_xib_mtx; /* protect xib members */ -+ unsigned long *si_xib_buf; -+ unsigned long si_xib_last_pindex; -+ int si_xib_next_bit; -+ -+ unsigned long si_xino_jiffy; -+ unsigned long si_xino_expire; -+ /* reserved for future use */ -+ /* unsigned long long si_xib_limit; */ /* Max xib file size */ -+ -+#ifdef CONFIG_AUFS_EXPORT -+ /* i_generation */ -+ /* todo: make xigen file an array to support many inode numbers */ -+ struct file *si_xigen; -+ atomic_t si_xigen_next; -+#endif -+ -+ /* dirty trick to support atomic_open */ -+ struct hlist_bl_head si_aopen; -+ -+ /* vdir parameters */ -+ unsigned long si_rdcache; /* max cache time in jiffies */ -+ unsigned int si_rdblk; /* deblk size */ -+ unsigned int si_rdhash; /* hash size */ -+ -+ /* -+ * If the number of whiteouts are larger than si_dirwh, leave all of -+ * them after au_whtmp_ren to reduce the cost of rmdir(2). -+ * future fsck.aufs or kernel thread will remove them later. -+ * Otherwise, remove all whiteouts and the dir in rmdir(2). -+ */ -+ unsigned int si_dirwh; -+ -+ /* pseudo_link list */ -+ struct hlist_bl_head si_plink[AuPlink_NHASH]; -+ wait_queue_head_t si_plink_wq; -+ spinlock_t si_plink_maint_lock; -+ pid_t si_plink_maint_pid; -+ -+ /* file list */ -+ struct hlist_bl_head si_files; -+ -+ /* with/without getattr, brother of sb->s_d_op */ -+ const struct inode_operations *si_iop_array; -+ -+ /* -+ * sysfs and lifetime management. -+ * this is not a small structure and it may be a waste of memory in case -+ * of sysfs is disabled, particularly when many aufs-es are mounted. -+ * but using sysfs is majority. -+ */ -+ struct kobject si_kobj; -+#ifdef CONFIG_DEBUG_FS -+ struct dentry *si_dbgaufs; -+ struct dentry *si_dbgaufs_plink; -+ struct dentry *si_dbgaufs_xib; -+#ifdef CONFIG_AUFS_EXPORT -+ struct dentry *si_dbgaufs_xigen; -+#endif -+#endif -+ -+#ifdef CONFIG_AUFS_SBILIST -+ struct hlist_bl_node si_list; -+#endif -+ -+ /* dirty, necessary for unmounting, sysfs and sysrq */ -+ struct super_block *si_sb; -+}; -+ -+/* sbinfo status flags */ -+/* -+ * set true when refresh_dirs() failed at remount time. -+ * then try refreshing dirs at access time again. -+ * if it is false, refreshing dirs at access time is unnecessary -+ */ -+#define AuSi_FAILED_REFRESH_DIR 1 -+#define AuSi_FHSM (1 << 1) /* fhsm is active now */ -+#define AuSi_NO_DREVAL (1 << 2) /* disable all d_revalidate */ -+ -+#ifndef CONFIG_AUFS_FHSM -+#undef AuSi_FHSM -+#define AuSi_FHSM 0 -+#endif -+ -+static inline unsigned char au_do_ftest_si(struct au_sbinfo *sbi, -+ unsigned int flag) -+{ -+ AuRwMustAnyLock(&sbi->si_rwsem); -+ return sbi->au_si_status & flag; -+} -+#define au_ftest_si(sbinfo, name) au_do_ftest_si(sbinfo, AuSi_##name) -+#define au_fset_si(sbinfo, name) do { \ -+ AuRwMustWriteLock(&(sbinfo)->si_rwsem); \ -+ (sbinfo)->au_si_status |= AuSi_##name; \ -+} while (0) -+#define au_fclr_si(sbinfo, name) do { \ -+ AuRwMustWriteLock(&(sbinfo)->si_rwsem); \ -+ (sbinfo)->au_si_status &= ~AuSi_##name; \ -+} while (0) -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* policy to select one among writable branches */ -+#define AuWbrCopyup(sbinfo, ...) \ -+ ((sbinfo)->si_wbr_copyup_ops->copyup(__VA_ARGS__)) -+#define AuWbrCreate(sbinfo, ...) \ -+ ((sbinfo)->si_wbr_create_ops->create(__VA_ARGS__)) -+ -+/* flags for si_read_lock()/aufs_read_lock()/di_read_lock() */ -+#define AuLock_DW 1 /* write-lock dentry */ -+#define AuLock_IR (1 << 1) /* read-lock inode */ -+#define AuLock_IW (1 << 2) /* write-lock inode */ -+#define AuLock_FLUSH (1 << 3) /* wait for 'nowait' tasks */ -+#define AuLock_DIRS (1 << 4) /* target is a pair of dirs */ -+ /* except RENAME_EXCHANGE */ -+#define AuLock_NOPLM (1 << 5) /* return err in plm mode */ -+#define AuLock_NOPLMW (1 << 6) /* wait for plm mode ends */ -+#define AuLock_GEN (1 << 7) /* test digen/iigen */ -+#define au_ftest_lock(flags, name) ((flags) & AuLock_##name) -+#define au_fset_lock(flags, name) \ -+ do { (flags) |= AuLock_##name; } while (0) -+#define au_fclr_lock(flags, name) \ -+ do { (flags) &= ~AuLock_##name; } while (0) -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* super.c */ -+struct inode *au_iget_locked(struct super_block *sb, ino_t ino); -+ -+typedef unsigned long long (*au_arraycb_t)(struct super_block *sb, void *array, -+ unsigned long long max, void *arg); -+void *au_array_alloc(unsigned long long *hint, au_arraycb_t cb, -+ struct super_block *sb, void *arg); -+struct inode **au_iarray_alloc(struct super_block *sb, unsigned long long *max); -+void au_iarray_free(struct inode **a, unsigned long long max); -+ -+void au_remount_refresh(struct super_block *sb, unsigned int do_idop); -+extern const struct super_operations aufs_sop; -+int au_alloc_root(struct super_block *sb); -+extern struct file_system_type aufs_fs_type; -+ -+/* sbinfo.c */ -+void au_si_free(struct kobject *kobj); -+struct au_sbinfo *au_si_alloc(struct super_block *sb); -+int au_sbr_realloc(struct au_sbinfo *sbinfo, int nbr, int may_shrink); -+ -+unsigned int au_sigen_inc(struct super_block *sb); -+aufs_bindex_t au_new_br_id(struct super_block *sb); -+ -+int si_read_lock(struct super_block *sb, int flags); -+int si_write_lock(struct super_block *sb, int flags); -+int aufs_read_lock(struct dentry *dentry, int flags); -+void aufs_read_unlock(struct dentry *dentry, int flags); -+void aufs_write_lock(struct dentry *dentry); -+void aufs_write_unlock(struct dentry *dentry); -+int aufs_read_and_write_lock2(struct dentry *d1, struct dentry *d2, int flags); -+void aufs_read_and_write_unlock2(struct dentry *d1, struct dentry *d2); -+ -+/* wbr_policy.c */ -+extern struct au_wbr_copyup_operations au_wbr_copyup_ops[]; -+extern struct au_wbr_create_operations au_wbr_create_ops[]; -+int au_cpdown_dirs(struct dentry *dentry, aufs_bindex_t bdst); -+int au_wbr_nonopq(struct dentry *dentry, aufs_bindex_t bindex); -+int au_wbr_do_copyup_bu(struct dentry *dentry, aufs_bindex_t btop); -+ -+/* mvdown.c */ -+int au_mvdown(struct dentry *dentry, struct aufs_mvdown __user *arg); -+ -+#ifdef CONFIG_AUFS_FHSM -+/* fhsm.c */ -+ -+static inline pid_t au_fhsm_pid(struct au_fhsm *fhsm) -+{ -+ pid_t pid; -+ -+ spin_lock(&fhsm->fhsm_spin); -+ pid = fhsm->fhsm_pid; -+ spin_unlock(&fhsm->fhsm_spin); -+ -+ return pid; -+} -+ -+void au_fhsm_wrote(struct super_block *sb, aufs_bindex_t bindex, int force); -+void au_fhsm_wrote_all(struct super_block *sb, int force); -+int au_fhsm_fd(struct super_block *sb, int oflags); -+int au_fhsm_br_alloc(struct au_branch *br); -+void au_fhsm_set_bottom(struct super_block *sb, aufs_bindex_t bindex); -+void au_fhsm_fin(struct super_block *sb); -+void au_fhsm_init(struct au_sbinfo *sbinfo); -+void au_fhsm_set(struct au_sbinfo *sbinfo, unsigned int sec); -+void au_fhsm_show(struct seq_file *seq, struct au_sbinfo *sbinfo); -+#else -+AuStubVoid(au_fhsm_wrote, struct super_block *sb, aufs_bindex_t bindex, -+ int force) -+AuStubVoid(au_fhsm_wrote_all, struct super_block *sb, int force) -+AuStub(int, au_fhsm_fd, return -EOPNOTSUPP, struct super_block *sb, int oflags) -+AuStub(pid_t, au_fhsm_pid, return 0, struct au_fhsm *fhsm) -+AuStubInt0(au_fhsm_br_alloc, struct au_branch *br) -+AuStubVoid(au_fhsm_set_bottom, struct super_block *sb, aufs_bindex_t bindex) -+AuStubVoid(au_fhsm_fin, struct super_block *sb) -+AuStubVoid(au_fhsm_init, struct au_sbinfo *sbinfo) -+AuStubVoid(au_fhsm_set, struct au_sbinfo *sbinfo, unsigned int sec) -+AuStubVoid(au_fhsm_show, struct seq_file *seq, struct au_sbinfo *sbinfo) -+#endif -+ -+/* ---------------------------------------------------------------------- */ -+ -+static inline struct au_sbinfo *au_sbi(struct super_block *sb) -+{ -+ return sb->s_fs_info; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+#ifdef CONFIG_AUFS_EXPORT -+int au_test_nfsd(void); -+void au_export_init(struct super_block *sb); -+void au_xigen_inc(struct inode *inode); -+int au_xigen_new(struct inode *inode); -+int au_xigen_set(struct super_block *sb, struct path *path); -+void au_xigen_clr(struct super_block *sb); -+ -+static inline int au_busy_or_stale(void) -+{ -+ if (!au_test_nfsd()) -+ return -EBUSY; -+ return -ESTALE; -+} -+#else -+AuStubInt0(au_test_nfsd, void) -+AuStubVoid(au_export_init, struct super_block *sb) -+AuStubVoid(au_xigen_inc, struct inode *inode) -+AuStubInt0(au_xigen_new, struct inode *inode) -+AuStubInt0(au_xigen_set, struct super_block *sb, struct path *path) -+AuStubVoid(au_xigen_clr, struct super_block *sb) -+AuStub(int, au_busy_or_stale, return -EBUSY, void) -+#endif /* CONFIG_AUFS_EXPORT */ -+ -+/* ---------------------------------------------------------------------- */ -+ -+#ifdef CONFIG_AUFS_SBILIST -+/* module.c */ -+extern struct hlist_bl_head au_sbilist; -+ -+static inline void au_sbilist_init(void) -+{ -+ INIT_HLIST_BL_HEAD(&au_sbilist); -+} -+ -+static inline void au_sbilist_add(struct super_block *sb) -+{ -+ au_hbl_add(&au_sbi(sb)->si_list, &au_sbilist); -+} -+ -+static inline void au_sbilist_del(struct super_block *sb) -+{ -+ au_hbl_del(&au_sbi(sb)->si_list, &au_sbilist); -+} -+ -+#ifdef CONFIG_AUFS_MAGIC_SYSRQ -+static inline void au_sbilist_lock(void) -+{ -+ hlist_bl_lock(&au_sbilist); -+} -+ -+static inline void au_sbilist_unlock(void) -+{ -+ hlist_bl_unlock(&au_sbilist); -+} -+#define AuGFP_SBILIST GFP_ATOMIC -+#else -+AuStubVoid(au_sbilist_lock, void) -+AuStubVoid(au_sbilist_unlock, void) -+#define AuGFP_SBILIST GFP_NOFS -+#endif /* CONFIG_AUFS_MAGIC_SYSRQ */ -+#else -+AuStubVoid(au_sbilist_init, void) -+AuStubVoid(au_sbilist_add, struct super_block *sb) -+AuStubVoid(au_sbilist_del, struct super_block *sb) -+AuStubVoid(au_sbilist_lock, void) -+AuStubVoid(au_sbilist_unlock, void) -+#define AuGFP_SBILIST GFP_NOFS -+#endif -+ -+/* ---------------------------------------------------------------------- */ -+ -+static inline void dbgaufs_si_null(struct au_sbinfo *sbinfo) -+{ -+ /* -+ * This function is a dynamic '__init' function actually, -+ * so the tiny check for si_rwsem is unnecessary. -+ */ -+ /* AuRwMustWriteLock(&sbinfo->si_rwsem); */ -+#ifdef CONFIG_DEBUG_FS -+ sbinfo->si_dbgaufs = NULL; -+ sbinfo->si_dbgaufs_plink = NULL; -+ sbinfo->si_dbgaufs_xib = NULL; -+#ifdef CONFIG_AUFS_EXPORT -+ sbinfo->si_dbgaufs_xigen = NULL; -+#endif -+#endif -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* current->atomic_flags */ -+/* this value should never corrupt the ones defined in linux/sched.h */ -+#define PFA_AUFS 0x10 -+ -+TASK_PFA_TEST(AUFS, test_aufs) /* task_test_aufs */ -+TASK_PFA_SET(AUFS, aufs) /* task_set_aufs */ -+TASK_PFA_CLEAR(AUFS, aufs) /* task_clear_aufs */ -+ -+static inline int si_pid_test(struct super_block *sb) -+{ -+ return !!task_test_aufs(current); -+} -+ -+static inline void si_pid_clr(struct super_block *sb) -+{ -+ AuDebugOn(!task_test_aufs(current)); -+ task_clear_aufs(current); -+} -+ -+static inline void si_pid_set(struct super_block *sb) -+{ -+ AuDebugOn(task_test_aufs(current)); -+ task_set_aufs(current); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* lock superblock. mainly for entry point functions */ -+#define __si_read_lock(sb) au_rw_read_lock(&au_sbi(sb)->si_rwsem) -+#define __si_write_lock(sb) au_rw_write_lock(&au_sbi(sb)->si_rwsem) -+#define __si_read_trylock(sb) au_rw_read_trylock(&au_sbi(sb)->si_rwsem) -+#define __si_write_trylock(sb) au_rw_write_trylock(&au_sbi(sb)->si_rwsem) -+/* -+#define __si_read_trylock_nested(sb) \ -+ au_rw_read_trylock_nested(&au_sbi(sb)->si_rwsem) -+#define __si_write_trylock_nested(sb) \ -+ au_rw_write_trylock_nested(&au_sbi(sb)->si_rwsem) -+*/ -+ -+#define __si_read_unlock(sb) au_rw_read_unlock(&au_sbi(sb)->si_rwsem) -+#define __si_write_unlock(sb) au_rw_write_unlock(&au_sbi(sb)->si_rwsem) -+#define __si_downgrade_lock(sb) au_rw_dgrade_lock(&au_sbi(sb)->si_rwsem) -+ -+#define SiMustNoWaiters(sb) AuRwMustNoWaiters(&au_sbi(sb)->si_rwsem) -+#define SiMustAnyLock(sb) AuRwMustAnyLock(&au_sbi(sb)->si_rwsem) -+#define SiMustWriteLock(sb) AuRwMustWriteLock(&au_sbi(sb)->si_rwsem) -+ -+static inline void si_noflush_read_lock(struct super_block *sb) -+{ -+ __si_read_lock(sb); -+ si_pid_set(sb); -+} -+ -+static inline int si_noflush_read_trylock(struct super_block *sb) -+{ -+ int locked; -+ -+ locked = __si_read_trylock(sb); -+ if (locked) -+ si_pid_set(sb); -+ return locked; -+} -+ -+static inline void si_noflush_write_lock(struct super_block *sb) -+{ -+ __si_write_lock(sb); -+ si_pid_set(sb); -+} -+ -+static inline int si_noflush_write_trylock(struct super_block *sb) -+{ -+ int locked; -+ -+ locked = __si_write_trylock(sb); -+ if (locked) -+ si_pid_set(sb); -+ return locked; -+} -+ -+#if 0 /* reserved */ -+static inline int si_read_trylock(struct super_block *sb, int flags) -+{ -+ if (au_ftest_lock(flags, FLUSH)) -+ au_nwt_flush(&au_sbi(sb)->si_nowait); -+ return si_noflush_read_trylock(sb); -+} -+#endif -+ -+static inline void si_read_unlock(struct super_block *sb) -+{ -+ si_pid_clr(sb); -+ __si_read_unlock(sb); -+} -+ -+#if 0 /* reserved */ -+static inline int si_write_trylock(struct super_block *sb, int flags) -+{ -+ if (au_ftest_lock(flags, FLUSH)) -+ au_nwt_flush(&au_sbi(sb)->si_nowait); -+ return si_noflush_write_trylock(sb); -+} -+#endif -+ -+static inline void si_write_unlock(struct super_block *sb) -+{ -+ si_pid_clr(sb); -+ __si_write_unlock(sb); -+} -+ -+#if 0 /* reserved */ -+static inline void si_downgrade_lock(struct super_block *sb) -+{ -+ __si_downgrade_lock(sb); -+} -+#endif -+ -+/* ---------------------------------------------------------------------- */ -+ -+static inline aufs_bindex_t au_sbbot(struct super_block *sb) -+{ -+ SiMustAnyLock(sb); -+ return au_sbi(sb)->si_bbot; -+} -+ -+static inline unsigned int au_mntflags(struct super_block *sb) -+{ -+ SiMustAnyLock(sb); -+ return au_sbi(sb)->si_mntflags; -+} -+ -+static inline unsigned int au_sigen(struct super_block *sb) -+{ -+ SiMustAnyLock(sb); -+ return au_sbi(sb)->si_generation; -+} -+ -+static inline struct au_branch *au_sbr(struct super_block *sb, -+ aufs_bindex_t bindex) -+{ -+ SiMustAnyLock(sb); -+ return au_sbi(sb)->si_branch[0 + bindex]; -+} -+ -+static inline loff_t au_xi_maxent(struct super_block *sb) -+{ -+ SiMustAnyLock(sb); -+ return au_sbi(sb)->si_ximaxent; -+} -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_SUPER_H__ */ -diff -Naur null/fs/aufs/sysaufs.c linux-5.15.36/fs/aufs/sysaufs.c ---- /dev/null -+++ linux-5.15.36/fs/aufs/sysaufs.c 2022-05-10 16:51:39.876744219 +0300 -@@ -0,0 +1,93 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program. If not, see . -+ */ -+ -+/* -+ * sysfs interface and lifetime management -+ * they are necessary regardless sysfs is disabled. -+ */ -+ -+#include -+#include "aufs.h" -+ -+unsigned long sysaufs_si_mask; -+struct kset *sysaufs_kset; -+ -+#define AuSiAttr(_name) { \ -+ .attr = { .name = __stringify(_name), .mode = 0444 }, \ -+ .show = sysaufs_si_##_name, \ -+} -+ -+static struct sysaufs_si_attr sysaufs_si_attr_xi_path = AuSiAttr(xi_path); -+struct attribute *sysaufs_si_attrs[] = { -+ &sysaufs_si_attr_xi_path.attr, -+ NULL, -+}; -+ -+static const struct sysfs_ops au_sbi_ops = { -+ .show = sysaufs_si_show -+}; -+ -+static struct kobj_type au_sbi_ktype = { -+ .release = au_si_free, -+ .sysfs_ops = &au_sbi_ops, -+ .default_attrs = sysaufs_si_attrs -+}; -+ -+/* ---------------------------------------------------------------------- */ -+ -+int sysaufs_si_init(struct au_sbinfo *sbinfo) -+{ -+ int err; -+ -+ sbinfo->si_kobj.kset = sysaufs_kset; -+ /* cf. sysaufs_name() */ -+ err = kobject_init_and_add -+ (&sbinfo->si_kobj, &au_sbi_ktype, /*&sysaufs_kset->kobj*/NULL, -+ SysaufsSiNamePrefix "%lx", sysaufs_si_id(sbinfo)); -+ -+ return err; -+} -+ -+void sysaufs_fin(void) -+{ -+ sysfs_remove_group(&sysaufs_kset->kobj, sysaufs_attr_group); -+ kset_unregister(sysaufs_kset); -+} -+ -+int __init sysaufs_init(void) -+{ -+ int err; -+ -+ do { -+ get_random_bytes(&sysaufs_si_mask, sizeof(sysaufs_si_mask)); -+ } while (!sysaufs_si_mask); -+ -+ err = -EINVAL; -+ sysaufs_kset = kset_create_and_add(AUFS_NAME, NULL, fs_kobj); -+ if (unlikely(!sysaufs_kset)) -+ goto out; -+ err = PTR_ERR(sysaufs_kset); -+ if (IS_ERR(sysaufs_kset)) -+ goto out; -+ err = sysfs_create_group(&sysaufs_kset->kobj, sysaufs_attr_group); -+ if (unlikely(err)) -+ kset_unregister(sysaufs_kset); -+ -+out: -+ return err; -+} -diff -Naur null/fs/aufs/sysaufs.h linux-5.15.36/fs/aufs/sysaufs.h ---- /dev/null -+++ linux-5.15.36/fs/aufs/sysaufs.h 2022-05-10 16:51:39.876744219 +0300 -@@ -0,0 +1,102 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program. If not, see . -+ */ -+ -+/* -+ * sysfs interface and mount lifetime management -+ */ -+ -+#ifndef __SYSAUFS_H__ -+#define __SYSAUFS_H__ -+ -+#ifdef __KERNEL__ -+ -+#include -+#include "module.h" -+ -+struct super_block; -+struct au_sbinfo; -+ -+struct sysaufs_si_attr { -+ struct attribute attr; -+ int (*show)(struct seq_file *seq, struct super_block *sb); -+}; -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* sysaufs.c */ -+extern unsigned long sysaufs_si_mask; -+extern struct kset *sysaufs_kset; -+extern struct attribute *sysaufs_si_attrs[]; -+int sysaufs_si_init(struct au_sbinfo *sbinfo); -+int __init sysaufs_init(void); -+void sysaufs_fin(void); -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* some people doesn't like to show a pointer in kernel */ -+static inline unsigned long sysaufs_si_id(struct au_sbinfo *sbinfo) -+{ -+ return sysaufs_si_mask ^ (unsigned long)sbinfo; -+} -+ -+#define SysaufsSiNamePrefix "si_" -+#define SysaufsSiNameLen (sizeof(SysaufsSiNamePrefix) + 16) -+static inline void sysaufs_name(struct au_sbinfo *sbinfo, char *name) -+{ -+ snprintf(name, SysaufsSiNameLen, SysaufsSiNamePrefix "%lx", -+ sysaufs_si_id(sbinfo)); -+} -+ -+struct au_branch; -+#ifdef CONFIG_SYSFS -+/* sysfs.c */ -+extern struct attribute_group *sysaufs_attr_group; -+ -+int sysaufs_si_xi_path(struct seq_file *seq, struct super_block *sb); -+ssize_t sysaufs_si_show(struct kobject *kobj, struct attribute *attr, -+ char *buf); -+long au_brinfo_ioctl(struct file *file, unsigned long arg); -+#ifdef CONFIG_COMPAT -+long au_brinfo_compat_ioctl(struct file *file, unsigned long arg); -+#endif -+ -+void sysaufs_br_init(struct au_branch *br); -+void sysaufs_brs_add(struct super_block *sb, aufs_bindex_t bindex); -+void sysaufs_brs_del(struct super_block *sb, aufs_bindex_t bindex); -+ -+#define sysaufs_brs_init() do {} while (0) -+ -+#else -+#define sysaufs_attr_group NULL -+ -+AuStubInt0(sysaufs_si_xi_path, struct seq_file *seq, struct super_block *sb) -+AuStub(ssize_t, sysaufs_si_show, return 0, struct kobject *kobj, -+ struct attribute *attr, char *buf) -+AuStubVoid(sysaufs_br_init, struct au_branch *br) -+AuStubVoid(sysaufs_brs_add, struct super_block *sb, aufs_bindex_t bindex) -+AuStubVoid(sysaufs_brs_del, struct super_block *sb, aufs_bindex_t bindex) -+ -+static inline void sysaufs_brs_init(void) -+{ -+ sysaufs_brs = 0; -+} -+ -+#endif /* CONFIG_SYSFS */ -+ -+#endif /* __KERNEL__ */ -+#endif /* __SYSAUFS_H__ */ -diff -Naur null/fs/aufs/sysfs.c linux-5.15.36/fs/aufs/sysfs.c ---- /dev/null -+++ linux-5.15.36/fs/aufs/sysfs.c 2022-05-10 16:51:39.876744219 +0300 -@@ -0,0 +1,374 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program. If not, see . -+ */ -+ -+/* -+ * sysfs interface -+ */ -+ -+#include -+#include -+#include "aufs.h" -+ -+#ifdef CONFIG_AUFS_FS_MODULE -+/* this entry violates the "one line per file" policy of sysfs */ -+static ssize_t config_show(struct kobject *kobj, struct kobj_attribute *attr, -+ char *buf) -+{ -+ ssize_t err; -+ static char *conf = -+/* this file is generated at compiling */ -+#include "conf.str" -+ ; -+ -+ err = snprintf(buf, PAGE_SIZE, conf); -+ if (unlikely(err >= PAGE_SIZE)) -+ err = -EFBIG; -+ return err; -+} -+ -+static struct kobj_attribute au_config_attr = __ATTR_RO(config); -+#endif -+ -+static struct attribute *au_attr[] = { -+#ifdef CONFIG_AUFS_FS_MODULE -+ &au_config_attr.attr, -+#endif -+ NULL, /* need to NULL terminate the list of attributes */ -+}; -+ -+static struct attribute_group sysaufs_attr_group_body = { -+ .attrs = au_attr -+}; -+ -+struct attribute_group *sysaufs_attr_group = &sysaufs_attr_group_body; -+ -+/* ---------------------------------------------------------------------- */ -+ -+int sysaufs_si_xi_path(struct seq_file *seq, struct super_block *sb) -+{ -+ int err; -+ -+ SiMustAnyLock(sb); -+ -+ err = 0; -+ if (au_opt_test(au_mntflags(sb), XINO)) { -+ err = au_xino_path(seq, au_sbi(sb)->si_xib); -+ seq_putc(seq, '\n'); -+ } -+ return err; -+} -+ -+/* -+ * the lifetime of branch is independent from the entry under sysfs. -+ * sysfs handles the lifetime of the entry, and never call ->show() after it is -+ * unlinked. -+ */ -+static int sysaufs_si_br(struct seq_file *seq, struct super_block *sb, -+ aufs_bindex_t bindex, int idx) -+{ -+ int err; -+ struct path path; -+ struct dentry *root; -+ struct au_branch *br; -+ au_br_perm_str_t perm; -+ -+ AuDbg("b%d\n", bindex); -+ -+ err = 0; -+ root = sb->s_root; -+ di_read_lock_parent(root, !AuLock_IR); -+ br = au_sbr(sb, bindex); -+ -+ switch (idx) { -+ case AuBrSysfs_BR: -+ path.mnt = au_br_mnt(br); -+ path.dentry = au_h_dptr(root, bindex); -+ err = au_seq_path(seq, &path); -+ if (!err) { -+ au_optstr_br_perm(&perm, br->br_perm); -+ seq_printf(seq, "=%s\n", perm.a); -+ } -+ break; -+ case AuBrSysfs_BRID: -+ seq_printf(seq, "%d\n", br->br_id); -+ break; -+ } -+ di_read_unlock(root, !AuLock_IR); -+ if (unlikely(err || seq_has_overflowed(seq))) -+ err = -E2BIG; -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static struct seq_file *au_seq(char *p, ssize_t len) -+{ -+ struct seq_file *seq; -+ -+ seq = kzalloc(sizeof(*seq), GFP_NOFS); -+ if (seq) { -+ /* mutex_init(&seq.lock); */ -+ seq->buf = p; -+ seq->size = len; -+ return seq; /* success */ -+ } -+ -+ seq = ERR_PTR(-ENOMEM); -+ return seq; -+} -+ -+#define SysaufsBr_PREFIX "br" -+#define SysaufsBrid_PREFIX "brid" -+ -+/* todo: file size may exceed PAGE_SIZE */ -+ssize_t sysaufs_si_show(struct kobject *kobj, struct attribute *attr, -+ char *buf) -+{ -+ ssize_t err; -+ int idx; -+ long l; -+ aufs_bindex_t bbot; -+ struct au_sbinfo *sbinfo; -+ struct super_block *sb; -+ struct seq_file *seq; -+ char *name; -+ struct attribute **cattr; -+ -+ sbinfo = container_of(kobj, struct au_sbinfo, si_kobj); -+ sb = sbinfo->si_sb; -+ -+ /* -+ * prevent a race condition between sysfs and aufs. -+ * for instance, sysfs_file_read() calls sysfs_get_active_two() which -+ * prohibits maintaining the sysfs entries. -+ * hew we acquire read lock after sysfs_get_active_two(). -+ * on the other hand, the remount process may maintain the sysfs/aufs -+ * entries after acquiring write lock. -+ * it can cause a deadlock. -+ * simply we gave up processing read here. -+ */ -+ err = -EBUSY; -+ if (unlikely(!si_noflush_read_trylock(sb))) -+ goto out; -+ -+ seq = au_seq(buf, PAGE_SIZE); -+ err = PTR_ERR(seq); -+ if (IS_ERR(seq)) -+ goto out_unlock; -+ -+ name = (void *)attr->name; -+ cattr = sysaufs_si_attrs; -+ while (*cattr) { -+ if (!strcmp(name, (*cattr)->name)) { -+ err = container_of(*cattr, struct sysaufs_si_attr, attr) -+ ->show(seq, sb); -+ goto out_seq; -+ } -+ cattr++; -+ } -+ -+ if (!strncmp(name, SysaufsBrid_PREFIX, -+ sizeof(SysaufsBrid_PREFIX) - 1)) { -+ idx = AuBrSysfs_BRID; -+ name += sizeof(SysaufsBrid_PREFIX) - 1; -+ } else if (!strncmp(name, SysaufsBr_PREFIX, -+ sizeof(SysaufsBr_PREFIX) - 1)) { -+ idx = AuBrSysfs_BR; -+ name += sizeof(SysaufsBr_PREFIX) - 1; -+ } else -+ BUG(); -+ -+ err = kstrtol(name, 10, &l); -+ if (!err) { -+ bbot = au_sbbot(sb); -+ if (l <= bbot) -+ err = sysaufs_si_br(seq, sb, (aufs_bindex_t)l, idx); -+ else -+ err = -ENOENT; -+ } -+ -+out_seq: -+ if (!err) { -+ err = seq->count; -+ /* sysfs limit */ -+ if (unlikely(err == PAGE_SIZE)) -+ err = -EFBIG; -+ } -+ au_kfree_rcu(seq); -+out_unlock: -+ si_read_unlock(sb); -+out: -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int au_brinfo(struct super_block *sb, union aufs_brinfo __user *arg) -+{ -+ int err; -+ int16_t brid; -+ aufs_bindex_t bindex, bbot; -+ size_t sz; -+ char *buf; -+ struct seq_file *seq; -+ struct au_branch *br; -+ -+ si_read_lock(sb, AuLock_FLUSH); -+ bbot = au_sbbot(sb); -+ err = bbot + 1; -+ if (!arg) -+ goto out; -+ -+ err = -ENOMEM; -+ buf = (void *)__get_free_page(GFP_NOFS); -+ if (unlikely(!buf)) -+ goto out; -+ -+ seq = au_seq(buf, PAGE_SIZE); -+ err = PTR_ERR(seq); -+ if (IS_ERR(seq)) -+ goto out_buf; -+ -+ sz = sizeof(*arg) - offsetof(union aufs_brinfo, path); -+ for (bindex = 0; bindex <= bbot; bindex++, arg++) { -+ /* VERIFY_WRITE */ -+ err = !access_ok(arg, sizeof(*arg)); -+ if (unlikely(err)) -+ break; -+ -+ br = au_sbr(sb, bindex); -+ brid = br->br_id; -+ BUILD_BUG_ON(sizeof(brid) != sizeof(arg->id)); -+ err = __put_user(brid, &arg->id); -+ if (unlikely(err)) -+ break; -+ -+ BUILD_BUG_ON(sizeof(br->br_perm) != sizeof(arg->perm)); -+ err = __put_user(br->br_perm, &arg->perm); -+ if (unlikely(err)) -+ break; -+ -+ err = au_seq_path(seq, &br->br_path); -+ if (unlikely(err)) -+ break; -+ seq_putc(seq, '\0'); -+ if (!seq_has_overflowed(seq)) { -+ err = copy_to_user(arg->path, seq->buf, seq->count); -+ seq->count = 0; -+ if (unlikely(err)) -+ break; -+ } else { -+ err = -E2BIG; -+ goto out_seq; -+ } -+ } -+ if (unlikely(err)) -+ err = -EFAULT; -+ -+out_seq: -+ au_kfree_rcu(seq); -+out_buf: -+ free_page((unsigned long)buf); -+out: -+ si_read_unlock(sb); -+ return err; -+} -+ -+long au_brinfo_ioctl(struct file *file, unsigned long arg) -+{ -+ return au_brinfo(file->f_path.dentry->d_sb, (void __user *)arg); -+} -+ -+#ifdef CONFIG_COMPAT -+long au_brinfo_compat_ioctl(struct file *file, unsigned long arg) -+{ -+ return au_brinfo(file->f_path.dentry->d_sb, compat_ptr(arg)); -+} -+#endif -+ -+/* ---------------------------------------------------------------------- */ -+ -+void sysaufs_br_init(struct au_branch *br) -+{ -+ int i; -+ struct au_brsysfs *br_sysfs; -+ struct attribute *attr; -+ -+ br_sysfs = br->br_sysfs; -+ for (i = 0; i < ARRAY_SIZE(br->br_sysfs); i++) { -+ attr = &br_sysfs->attr; -+ sysfs_attr_init(attr); -+ attr->name = br_sysfs->name; -+ attr->mode = 0444; -+ br_sysfs++; -+ } -+} -+ -+void sysaufs_brs_del(struct super_block *sb, aufs_bindex_t bindex) -+{ -+ struct au_branch *br; -+ struct kobject *kobj; -+ struct au_brsysfs *br_sysfs; -+ int i; -+ aufs_bindex_t bbot; -+ -+ if (!sysaufs_brs) -+ return; -+ -+ kobj = &au_sbi(sb)->si_kobj; -+ bbot = au_sbbot(sb); -+ for (; bindex <= bbot; bindex++) { -+ br = au_sbr(sb, bindex); -+ br_sysfs = br->br_sysfs; -+ for (i = 0; i < ARRAY_SIZE(br->br_sysfs); i++) { -+ sysfs_remove_file(kobj, &br_sysfs->attr); -+ br_sysfs++; -+ } -+ } -+} -+ -+void sysaufs_brs_add(struct super_block *sb, aufs_bindex_t bindex) -+{ -+ int err, i; -+ aufs_bindex_t bbot; -+ struct kobject *kobj; -+ struct au_branch *br; -+ struct au_brsysfs *br_sysfs; -+ -+ if (!sysaufs_brs) -+ return; -+ -+ kobj = &au_sbi(sb)->si_kobj; -+ bbot = au_sbbot(sb); -+ for (; bindex <= bbot; bindex++) { -+ br = au_sbr(sb, bindex); -+ br_sysfs = br->br_sysfs; -+ snprintf(br_sysfs[AuBrSysfs_BR].name, sizeof(br_sysfs->name), -+ SysaufsBr_PREFIX "%d", bindex); -+ snprintf(br_sysfs[AuBrSysfs_BRID].name, sizeof(br_sysfs->name), -+ SysaufsBrid_PREFIX "%d", bindex); -+ for (i = 0; i < ARRAY_SIZE(br->br_sysfs); i++) { -+ err = sysfs_create_file(kobj, &br_sysfs->attr); -+ if (unlikely(err)) -+ pr_warn("failed %s under sysfs(%d)\n", -+ br_sysfs->name, err); -+ br_sysfs++; -+ } -+ } -+} -diff -Naur null/fs/aufs/sysrq.c linux-5.15.36/fs/aufs/sysrq.c ---- /dev/null -+++ linux-5.15.36/fs/aufs/sysrq.c 2022-05-10 16:51:39.877744219 +0300 -@@ -0,0 +1,149 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program. If not, see . -+ */ -+ -+/* -+ * magic sysrq handler -+ */ -+ -+/* #include */ -+#include -+#include "aufs.h" -+ -+/* ---------------------------------------------------------------------- */ -+ -+static void sysrq_sb(struct super_block *sb) -+{ -+ char *plevel; -+ struct au_sbinfo *sbinfo; -+ struct file *file; -+ struct hlist_bl_head *files; -+ struct hlist_bl_node *pos; -+ struct au_finfo *finfo; -+ struct inode *i; -+ -+ plevel = au_plevel; -+ au_plevel = KERN_WARNING; -+ -+ /* since we define pr_fmt, call printk directly */ -+#define pr(str) printk(KERN_WARNING AUFS_NAME ": " str) -+ -+ sbinfo = au_sbi(sb); -+ printk(KERN_WARNING "si=%lx\n", sysaufs_si_id(sbinfo)); -+ pr("superblock\n"); -+ au_dpri_sb(sb); -+ -+#if 0 /* reserved */ -+ do { -+ int err, i, j, ndentry; -+ struct au_dcsub_pages dpages; -+ struct au_dpage *dpage; -+ -+ err = au_dpages_init(&dpages, GFP_ATOMIC); -+ if (unlikely(err)) -+ break; -+ err = au_dcsub_pages(&dpages, sb->s_root, NULL, NULL); -+ if (!err) -+ for (i = 0; i < dpages.ndpage; i++) { -+ dpage = dpages.dpages + i; -+ ndentry = dpage->ndentry; -+ for (j = 0; j < ndentry; j++) -+ au_dpri_dentry(dpage->dentries[j]); -+ } -+ au_dpages_free(&dpages); -+ } while (0); -+#endif -+ -+ pr("isolated inode\n"); -+ spin_lock(&sb->s_inode_list_lock); -+ list_for_each_entry(i, &sb->s_inodes, i_sb_list) { -+ spin_lock(&i->i_lock); -+ if (hlist_empty(&i->i_dentry)) -+ au_dpri_inode(i); -+ spin_unlock(&i->i_lock); -+ } -+ spin_unlock(&sb->s_inode_list_lock); -+ -+ pr("files\n"); -+ files = &au_sbi(sb)->si_files; -+ hlist_bl_lock(files); -+ hlist_bl_for_each_entry(finfo, pos, files, fi_hlist) { -+ umode_t mode; -+ -+ file = finfo->fi_file; -+ mode = file_inode(file)->i_mode; -+ if (!special_file(mode)) -+ au_dpri_file(file); -+ } -+ hlist_bl_unlock(files); -+ pr("done\n"); -+ -+#undef pr -+ au_plevel = plevel; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* module parameter */ -+static char *aufs_sysrq_key = "a"; -+module_param_named(sysrq, aufs_sysrq_key, charp, 0444); -+MODULE_PARM_DESC(sysrq, "MagicSysRq key for " AUFS_NAME); -+ -+static void au_sysrq(int key __maybe_unused) -+{ -+ struct au_sbinfo *sbinfo; -+ struct hlist_bl_node *pos; -+ -+ lockdep_off(); -+ au_sbilist_lock(); -+ hlist_bl_for_each_entry(sbinfo, pos, &au_sbilist, si_list) -+ sysrq_sb(sbinfo->si_sb); -+ au_sbilist_unlock(); -+ lockdep_on(); -+} -+ -+static struct sysrq_key_op au_sysrq_op = { -+ .handler = au_sysrq, -+ .help_msg = "Aufs", -+ .action_msg = "Aufs", -+ .enable_mask = SYSRQ_ENABLE_DUMP -+}; -+ -+/* ---------------------------------------------------------------------- */ -+ -+int __init au_sysrq_init(void) -+{ -+ int err; -+ char key; -+ -+ err = -1; -+ key = *aufs_sysrq_key; -+ if ('a' <= key && key <= 'z') -+ err = register_sysrq_key(key, &au_sysrq_op); -+ if (unlikely(err)) -+ pr_err("err %d, sysrq=%c\n", err, key); -+ return err; -+} -+ -+void au_sysrq_fin(void) -+{ -+ int err; -+ -+ err = unregister_sysrq_key(*aufs_sysrq_key, &au_sysrq_op); -+ if (unlikely(err)) -+ pr_err("err %d (ignored)\n", err); -+} -diff -Naur null/fs/aufs/vdir.c linux-5.15.36/fs/aufs/vdir.c ---- /dev/null -+++ linux-5.15.36/fs/aufs/vdir.c 2022-05-10 16:51:39.877744219 +0300 -@@ -0,0 +1,896 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program. If not, see . -+ */ -+ -+/* -+ * virtual or vertical directory -+ */ -+ -+#include -+#include "aufs.h" -+ -+static unsigned int calc_size(int nlen) -+{ -+ return ALIGN(sizeof(struct au_vdir_de) + nlen, sizeof(ino_t)); -+} -+ -+static int set_deblk_end(union au_vdir_deblk_p *p, -+ union au_vdir_deblk_p *deblk_end) -+{ -+ if (calc_size(0) <= deblk_end->deblk - p->deblk) { -+ p->de->de_str.len = 0; -+ /* smp_mb(); */ -+ return 0; -+ } -+ return -1; /* error */ -+} -+ -+/* returns true or false */ -+static int is_deblk_end(union au_vdir_deblk_p *p, -+ union au_vdir_deblk_p *deblk_end) -+{ -+ if (calc_size(0) <= deblk_end->deblk - p->deblk) -+ return !p->de->de_str.len; -+ return 1; -+} -+ -+static unsigned char *last_deblk(struct au_vdir *vdir) -+{ -+ return vdir->vd_deblk[vdir->vd_nblk - 1]; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* estimate the appropriate size for name hash table */ -+unsigned int au_rdhash_est(loff_t sz) -+{ -+ unsigned int n; -+ -+ n = UINT_MAX; -+ sz >>= 10; -+ if (sz < n) -+ n = sz; -+ if (sz < AUFS_RDHASH_DEF) -+ n = AUFS_RDHASH_DEF; -+ /* pr_info("n %u\n", n); */ -+ return n; -+} -+ -+/* -+ * the allocated memory has to be freed by -+ * au_nhash_wh_free() or au_nhash_de_free(). -+ */ -+int au_nhash_alloc(struct au_nhash *nhash, unsigned int num_hash, gfp_t gfp) -+{ -+ struct hlist_head *head; -+ unsigned int u; -+ size_t sz; -+ -+ sz = sizeof(*nhash->nh_head) * num_hash; -+ head = kmalloc(sz, gfp); -+ if (head) { -+ nhash->nh_num = num_hash; -+ nhash->nh_head = head; -+ for (u = 0; u < num_hash; u++) -+ INIT_HLIST_HEAD(head++); -+ return 0; /* success */ -+ } -+ -+ return -ENOMEM; -+} -+ -+static void nhash_count(struct hlist_head *head) -+{ -+#if 0 /* debugging */ -+ unsigned long n; -+ struct hlist_node *pos; -+ -+ n = 0; -+ hlist_for_each(pos, head) -+ n++; -+ pr_info("%lu\n", n); -+#endif -+} -+ -+static void au_nhash_wh_do_free(struct hlist_head *head) -+{ -+ struct au_vdir_wh *pos; -+ struct hlist_node *node; -+ -+ hlist_for_each_entry_safe(pos, node, head, wh_hash) -+ au_kfree_rcu(pos); -+} -+ -+static void au_nhash_de_do_free(struct hlist_head *head) -+{ -+ struct au_vdir_dehstr *pos; -+ struct hlist_node *node; -+ -+ hlist_for_each_entry_safe(pos, node, head, hash) -+ au_cache_free_vdir_dehstr(pos); -+} -+ -+static void au_nhash_do_free(struct au_nhash *nhash, -+ void (*free)(struct hlist_head *head)) -+{ -+ unsigned int n; -+ struct hlist_head *head; -+ -+ n = nhash->nh_num; -+ if (!n) -+ return; -+ -+ head = nhash->nh_head; -+ while (n-- > 0) { -+ nhash_count(head); -+ free(head++); -+ } -+ au_kfree_try_rcu(nhash->nh_head); -+} -+ -+void au_nhash_wh_free(struct au_nhash *whlist) -+{ -+ au_nhash_do_free(whlist, au_nhash_wh_do_free); -+} -+ -+static void au_nhash_de_free(struct au_nhash *delist) -+{ -+ au_nhash_do_free(delist, au_nhash_de_do_free); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+int au_nhash_test_longer_wh(struct au_nhash *whlist, aufs_bindex_t btgt, -+ int limit) -+{ -+ int num; -+ unsigned int u, n; -+ struct hlist_head *head; -+ struct au_vdir_wh *pos; -+ -+ num = 0; -+ n = whlist->nh_num; -+ head = whlist->nh_head; -+ for (u = 0; u < n; u++, head++) -+ hlist_for_each_entry(pos, head, wh_hash) -+ if (pos->wh_bindex == btgt && ++num > limit) -+ return 1; -+ return 0; -+} -+ -+static struct hlist_head *au_name_hash(struct au_nhash *nhash, -+ unsigned char *name, -+ unsigned int len) -+{ -+ unsigned int v; -+ /* const unsigned int magic_bit = 12; */ -+ -+ AuDebugOn(!nhash->nh_num || !nhash->nh_head); -+ -+ v = 0; -+ if (len > 8) -+ len = 8; -+ while (len--) -+ v += *name++; -+ /* v = hash_long(v, magic_bit); */ -+ v %= nhash->nh_num; -+ return nhash->nh_head + v; -+} -+ -+static int au_nhash_test_name(struct au_vdir_destr *str, const char *name, -+ int nlen) -+{ -+ return str->len == nlen && !memcmp(str->name, name, nlen); -+} -+ -+/* returns found or not */ -+int au_nhash_test_known_wh(struct au_nhash *whlist, char *name, int nlen) -+{ -+ struct hlist_head *head; -+ struct au_vdir_wh *pos; -+ struct au_vdir_destr *str; -+ -+ head = au_name_hash(whlist, name, nlen); -+ hlist_for_each_entry(pos, head, wh_hash) { -+ str = &pos->wh_str; -+ AuDbg("%.*s\n", str->len, str->name); -+ if (au_nhash_test_name(str, name, nlen)) -+ return 1; -+ } -+ return 0; -+} -+ -+/* returns found(true) or not */ -+static int test_known(struct au_nhash *delist, char *name, int nlen) -+{ -+ struct hlist_head *head; -+ struct au_vdir_dehstr *pos; -+ struct au_vdir_destr *str; -+ -+ head = au_name_hash(delist, name, nlen); -+ hlist_for_each_entry(pos, head, hash) { -+ str = pos->str; -+ AuDbg("%.*s\n", str->len, str->name); -+ if (au_nhash_test_name(str, name, nlen)) -+ return 1; -+ } -+ return 0; -+} -+ -+static void au_shwh_init_wh(struct au_vdir_wh *wh, ino_t ino, -+ unsigned char d_type) -+{ -+#ifdef CONFIG_AUFS_SHWH -+ wh->wh_ino = ino; -+ wh->wh_type = d_type; -+#endif -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+int au_nhash_append_wh(struct au_nhash *whlist, char *name, int nlen, ino_t ino, -+ unsigned int d_type, aufs_bindex_t bindex, -+ unsigned char shwh) -+{ -+ int err; -+ struct au_vdir_destr *str; -+ struct au_vdir_wh *wh; -+ -+ AuDbg("%.*s\n", nlen, name); -+ AuDebugOn(!whlist->nh_num || !whlist->nh_head); -+ -+ err = -ENOMEM; -+ wh = kmalloc(sizeof(*wh) + nlen, GFP_NOFS); -+ if (unlikely(!wh)) -+ goto out; -+ -+ err = 0; -+ wh->wh_bindex = bindex; -+ if (shwh) -+ au_shwh_init_wh(wh, ino, d_type); -+ str = &wh->wh_str; -+ str->len = nlen; -+ memcpy(str->name, name, nlen); -+ hlist_add_head(&wh->wh_hash, au_name_hash(whlist, name, nlen)); -+ /* smp_mb(); */ -+ -+out: -+ return err; -+} -+ -+static int append_deblk(struct au_vdir *vdir) -+{ -+ int err; -+ unsigned long ul; -+ const unsigned int deblk_sz = vdir->vd_deblk_sz; -+ union au_vdir_deblk_p p, deblk_end; -+ unsigned char **o; -+ -+ err = -ENOMEM; -+ o = au_krealloc(vdir->vd_deblk, sizeof(*o) * (vdir->vd_nblk + 1), -+ GFP_NOFS, /*may_shrink*/0); -+ if (unlikely(!o)) -+ goto out; -+ -+ vdir->vd_deblk = o; -+ p.deblk = kmalloc(deblk_sz, GFP_NOFS); -+ if (p.deblk) { -+ ul = vdir->vd_nblk++; -+ vdir->vd_deblk[ul] = p.deblk; -+ vdir->vd_last.ul = ul; -+ vdir->vd_last.p.deblk = p.deblk; -+ deblk_end.deblk = p.deblk + deblk_sz; -+ err = set_deblk_end(&p, &deblk_end); -+ } -+ -+out: -+ return err; -+} -+ -+static int append_de(struct au_vdir *vdir, char *name, int nlen, ino_t ino, -+ unsigned int d_type, struct au_nhash *delist) -+{ -+ int err; -+ unsigned int sz; -+ const unsigned int deblk_sz = vdir->vd_deblk_sz; -+ union au_vdir_deblk_p p, *room, deblk_end; -+ struct au_vdir_dehstr *dehstr; -+ -+ p.deblk = last_deblk(vdir); -+ deblk_end.deblk = p.deblk + deblk_sz; -+ room = &vdir->vd_last.p; -+ AuDebugOn(room->deblk < p.deblk || deblk_end.deblk <= room->deblk -+ || !is_deblk_end(room, &deblk_end)); -+ -+ sz = calc_size(nlen); -+ if (unlikely(sz > deblk_end.deblk - room->deblk)) { -+ err = append_deblk(vdir); -+ if (unlikely(err)) -+ goto out; -+ -+ p.deblk = last_deblk(vdir); -+ deblk_end.deblk = p.deblk + deblk_sz; -+ /* smp_mb(); */ -+ AuDebugOn(room->deblk != p.deblk); -+ } -+ -+ err = -ENOMEM; -+ dehstr = au_cache_alloc_vdir_dehstr(); -+ if (unlikely(!dehstr)) -+ goto out; -+ -+ dehstr->str = &room->de->de_str; -+ hlist_add_head(&dehstr->hash, au_name_hash(delist, name, nlen)); -+ room->de->de_ino = ino; -+ room->de->de_type = d_type; -+ room->de->de_str.len = nlen; -+ memcpy(room->de->de_str.name, name, nlen); -+ -+ err = 0; -+ room->deblk += sz; -+ if (unlikely(set_deblk_end(room, &deblk_end))) -+ err = append_deblk(vdir); -+ /* smp_mb(); */ -+ -+out: -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+void au_vdir_free(struct au_vdir *vdir) -+{ -+ unsigned char **deblk; -+ -+ deblk = vdir->vd_deblk; -+ while (vdir->vd_nblk--) -+ au_kfree_try_rcu(*deblk++); -+ au_kfree_try_rcu(vdir->vd_deblk); -+ au_cache_free_vdir(vdir); -+} -+ -+static struct au_vdir *alloc_vdir(struct file *file) -+{ -+ struct au_vdir *vdir; -+ struct super_block *sb; -+ int err; -+ -+ sb = file->f_path.dentry->d_sb; -+ SiMustAnyLock(sb); -+ -+ err = -ENOMEM; -+ vdir = au_cache_alloc_vdir(); -+ if (unlikely(!vdir)) -+ goto out; -+ -+ vdir->vd_deblk = kzalloc(sizeof(*vdir->vd_deblk), GFP_NOFS); -+ if (unlikely(!vdir->vd_deblk)) -+ goto out_free; -+ -+ vdir->vd_deblk_sz = au_sbi(sb)->si_rdblk; -+ if (!vdir->vd_deblk_sz) { -+ /* estimate the appropriate size for deblk */ -+ vdir->vd_deblk_sz = au_dir_size(file, /*dentry*/NULL); -+ /* pr_info("vd_deblk_sz %u\n", vdir->vd_deblk_sz); */ -+ } -+ vdir->vd_nblk = 0; -+ vdir->vd_version = 0; -+ vdir->vd_jiffy = 0; -+ err = append_deblk(vdir); -+ if (!err) -+ return vdir; /* success */ -+ -+ au_kfree_try_rcu(vdir->vd_deblk); -+ -+out_free: -+ au_cache_free_vdir(vdir); -+out: -+ vdir = ERR_PTR(err); -+ return vdir; -+} -+ -+static int reinit_vdir(struct au_vdir *vdir) -+{ -+ int err; -+ union au_vdir_deblk_p p, deblk_end; -+ -+ while (vdir->vd_nblk > 1) { -+ au_kfree_try_rcu(vdir->vd_deblk[vdir->vd_nblk - 1]); -+ /* vdir->vd_deblk[vdir->vd_nblk - 1] = NULL; */ -+ vdir->vd_nblk--; -+ } -+ p.deblk = vdir->vd_deblk[0]; -+ deblk_end.deblk = p.deblk + vdir->vd_deblk_sz; -+ err = set_deblk_end(&p, &deblk_end); -+ /* keep vd_dblk_sz */ -+ vdir->vd_last.ul = 0; -+ vdir->vd_last.p.deblk = vdir->vd_deblk[0]; -+ vdir->vd_version = 0; -+ vdir->vd_jiffy = 0; -+ /* smp_mb(); */ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+#define AuFillVdir_CALLED 1 -+#define AuFillVdir_WHABLE (1 << 1) -+#define AuFillVdir_SHWH (1 << 2) -+#define au_ftest_fillvdir(flags, name) ((flags) & AuFillVdir_##name) -+#define au_fset_fillvdir(flags, name) \ -+ do { (flags) |= AuFillVdir_##name; } while (0) -+#define au_fclr_fillvdir(flags, name) \ -+ do { (flags) &= ~AuFillVdir_##name; } while (0) -+ -+#ifndef CONFIG_AUFS_SHWH -+#undef AuFillVdir_SHWH -+#define AuFillVdir_SHWH 0 -+#endif -+ -+struct fillvdir_arg { -+ struct dir_context ctx; -+ struct file *file; -+ struct au_vdir *vdir; -+ struct au_nhash delist; -+ struct au_nhash whlist; -+ aufs_bindex_t bindex; -+ unsigned int flags; -+ int err; -+}; -+ -+static int fillvdir(struct dir_context *ctx, const char *__name, int nlen, -+ loff_t offset __maybe_unused, u64 h_ino, -+ unsigned int d_type) -+{ -+ struct fillvdir_arg *arg = container_of(ctx, struct fillvdir_arg, ctx); -+ char *name = (void *)__name; -+ struct super_block *sb; -+ ino_t ino; -+ const unsigned char shwh = !!au_ftest_fillvdir(arg->flags, SHWH); -+ -+ arg->err = 0; -+ sb = arg->file->f_path.dentry->d_sb; -+ au_fset_fillvdir(arg->flags, CALLED); -+ /* smp_mb(); */ -+ if (nlen <= AUFS_WH_PFX_LEN -+ || memcmp(name, AUFS_WH_PFX, AUFS_WH_PFX_LEN)) { -+ if (test_known(&arg->delist, name, nlen) -+ || au_nhash_test_known_wh(&arg->whlist, name, nlen)) -+ goto out; /* already exists or whiteouted */ -+ -+ arg->err = au_ino(sb, arg->bindex, h_ino, d_type, &ino); -+ if (!arg->err) { -+ if (unlikely(nlen > AUFS_MAX_NAMELEN)) -+ d_type = DT_UNKNOWN; -+ arg->err = append_de(arg->vdir, name, nlen, ino, -+ d_type, &arg->delist); -+ } -+ } else if (au_ftest_fillvdir(arg->flags, WHABLE)) { -+ name += AUFS_WH_PFX_LEN; -+ nlen -= AUFS_WH_PFX_LEN; -+ if (au_nhash_test_known_wh(&arg->whlist, name, nlen)) -+ goto out; /* already whiteouted */ -+ -+ ino = 0; /* just to suppress a warning */ -+ if (shwh) -+ arg->err = au_wh_ino(sb, arg->bindex, h_ino, d_type, -+ &ino); -+ if (!arg->err) { -+ if (nlen <= AUFS_MAX_NAMELEN + AUFS_WH_PFX_LEN) -+ d_type = DT_UNKNOWN; -+ arg->err = au_nhash_append_wh -+ (&arg->whlist, name, nlen, ino, d_type, -+ arg->bindex, shwh); -+ } -+ } -+ -+out: -+ if (!arg->err) -+ arg->vdir->vd_jiffy = jiffies; -+ /* smp_mb(); */ -+ AuTraceErr(arg->err); -+ return arg->err; -+} -+ -+static int au_handle_shwh(struct super_block *sb, struct au_vdir *vdir, -+ struct au_nhash *whlist, struct au_nhash *delist) -+{ -+#ifdef CONFIG_AUFS_SHWH -+ int err; -+ unsigned int nh, u; -+ struct hlist_head *head; -+ struct au_vdir_wh *pos; -+ struct hlist_node *n; -+ char *p, *o; -+ struct au_vdir_destr *destr; -+ -+ AuDebugOn(!au_opt_test(au_mntflags(sb), SHWH)); -+ -+ err = -ENOMEM; -+ o = p = (void *)__get_free_page(GFP_NOFS); -+ if (unlikely(!p)) -+ goto out; -+ -+ err = 0; -+ nh = whlist->nh_num; -+ memcpy(p, AUFS_WH_PFX, AUFS_WH_PFX_LEN); -+ p += AUFS_WH_PFX_LEN; -+ for (u = 0; u < nh; u++) { -+ head = whlist->nh_head + u; -+ hlist_for_each_entry_safe(pos, n, head, wh_hash) { -+ destr = &pos->wh_str; -+ memcpy(p, destr->name, destr->len); -+ err = append_de(vdir, o, destr->len + AUFS_WH_PFX_LEN, -+ pos->wh_ino, pos->wh_type, delist); -+ if (unlikely(err)) -+ break; -+ } -+ } -+ -+ free_page((unsigned long)o); -+ -+out: -+ AuTraceErr(err); -+ return err; -+#else -+ return 0; -+#endif -+} -+ -+static int au_do_read_vdir(struct fillvdir_arg *arg) -+{ -+ int err; -+ unsigned int rdhash; -+ loff_t offset; -+ aufs_bindex_t bbot, bindex, btop; -+ unsigned char shwh; -+ struct file *hf, *file; -+ struct super_block *sb; -+ -+ file = arg->file; -+ sb = file->f_path.dentry->d_sb; -+ SiMustAnyLock(sb); -+ -+ rdhash = au_sbi(sb)->si_rdhash; -+ if (!rdhash) -+ rdhash = au_rdhash_est(au_dir_size(file, /*dentry*/NULL)); -+ err = au_nhash_alloc(&arg->delist, rdhash, GFP_NOFS); -+ if (unlikely(err)) -+ goto out; -+ err = au_nhash_alloc(&arg->whlist, rdhash, GFP_NOFS); -+ if (unlikely(err)) -+ goto out_delist; -+ -+ err = 0; -+ arg->flags = 0; -+ shwh = 0; -+ if (au_opt_test(au_mntflags(sb), SHWH)) { -+ shwh = 1; -+ au_fset_fillvdir(arg->flags, SHWH); -+ } -+ btop = au_fbtop(file); -+ bbot = au_fbbot_dir(file); -+ for (bindex = btop; !err && bindex <= bbot; bindex++) { -+ hf = au_hf_dir(file, bindex); -+ if (!hf) -+ continue; -+ -+ offset = vfsub_llseek(hf, 0, SEEK_SET); -+ err = offset; -+ if (unlikely(offset)) -+ break; -+ -+ arg->bindex = bindex; -+ au_fclr_fillvdir(arg->flags, WHABLE); -+ if (shwh -+ || (bindex != bbot -+ && au_br_whable(au_sbr_perm(sb, bindex)))) -+ au_fset_fillvdir(arg->flags, WHABLE); -+ do { -+ arg->err = 0; -+ au_fclr_fillvdir(arg->flags, CALLED); -+ /* smp_mb(); */ -+ err = vfsub_iterate_dir(hf, &arg->ctx); -+ if (err >= 0) -+ err = arg->err; -+ } while (!err && au_ftest_fillvdir(arg->flags, CALLED)); -+ -+ /* -+ * dir_relax() may be good for concurrency, but aufs should not -+ * use it since it will cause a lockdep problem. -+ */ -+ } -+ -+ if (!err && shwh) -+ err = au_handle_shwh(sb, arg->vdir, &arg->whlist, &arg->delist); -+ -+ au_nhash_wh_free(&arg->whlist); -+ -+out_delist: -+ au_nhash_de_free(&arg->delist); -+out: -+ return err; -+} -+ -+static int read_vdir(struct file *file, int may_read) -+{ -+ int err; -+ unsigned long expire; -+ unsigned char do_read; -+ struct fillvdir_arg arg = { -+ .ctx = { -+ .actor = fillvdir -+ } -+ }; -+ struct inode *inode; -+ struct au_vdir *vdir, *allocated; -+ -+ err = 0; -+ inode = file_inode(file); -+ IMustLock(inode); -+ IiMustWriteLock(inode); -+ SiMustAnyLock(inode->i_sb); -+ -+ allocated = NULL; -+ do_read = 0; -+ expire = au_sbi(inode->i_sb)->si_rdcache; -+ vdir = au_ivdir(inode); -+ if (!vdir) { -+ do_read = 1; -+ vdir = alloc_vdir(file); -+ err = PTR_ERR(vdir); -+ if (IS_ERR(vdir)) -+ goto out; -+ err = 0; -+ allocated = vdir; -+ } else if (may_read -+ && (!inode_eq_iversion(inode, vdir->vd_version) -+ || time_after(jiffies, vdir->vd_jiffy + expire))) { -+ do_read = 1; -+ err = reinit_vdir(vdir); -+ if (unlikely(err)) -+ goto out; -+ } -+ -+ if (!do_read) -+ return 0; /* success */ -+ -+ arg.file = file; -+ arg.vdir = vdir; -+ err = au_do_read_vdir(&arg); -+ if (!err) { -+ /* file->f_pos = 0; */ /* todo: ctx->pos? */ -+ vdir->vd_version = inode_query_iversion(inode); -+ vdir->vd_last.ul = 0; -+ vdir->vd_last.p.deblk = vdir->vd_deblk[0]; -+ if (allocated) -+ au_set_ivdir(inode, allocated); -+ } else if (allocated) -+ au_vdir_free(allocated); -+ -+out: -+ return err; -+} -+ -+static int copy_vdir(struct au_vdir *tgt, struct au_vdir *src) -+{ -+ int err, rerr; -+ unsigned long ul, n; -+ const unsigned int deblk_sz = src->vd_deblk_sz; -+ -+ AuDebugOn(tgt->vd_nblk != 1); -+ -+ err = -ENOMEM; -+ if (tgt->vd_nblk < src->vd_nblk) { -+ unsigned char **p; -+ -+ p = au_krealloc(tgt->vd_deblk, sizeof(*p) * src->vd_nblk, -+ GFP_NOFS, /*may_shrink*/0); -+ if (unlikely(!p)) -+ goto out; -+ tgt->vd_deblk = p; -+ } -+ -+ if (tgt->vd_deblk_sz != deblk_sz) { -+ unsigned char *p; -+ -+ tgt->vd_deblk_sz = deblk_sz; -+ p = au_krealloc(tgt->vd_deblk[0], deblk_sz, GFP_NOFS, -+ /*may_shrink*/1); -+ if (unlikely(!p)) -+ goto out; -+ tgt->vd_deblk[0] = p; -+ } -+ memcpy(tgt->vd_deblk[0], src->vd_deblk[0], deblk_sz); -+ tgt->vd_version = src->vd_version; -+ tgt->vd_jiffy = src->vd_jiffy; -+ -+ n = src->vd_nblk; -+ for (ul = 1; ul < n; ul++) { -+ tgt->vd_deblk[ul] = kmemdup(src->vd_deblk[ul], deblk_sz, -+ GFP_NOFS); -+ if (unlikely(!tgt->vd_deblk[ul])) -+ goto out; -+ tgt->vd_nblk++; -+ } -+ tgt->vd_nblk = n; -+ tgt->vd_last.ul = tgt->vd_last.ul; -+ tgt->vd_last.p.deblk = tgt->vd_deblk[tgt->vd_last.ul]; -+ tgt->vd_last.p.deblk += src->vd_last.p.deblk -+ - src->vd_deblk[src->vd_last.ul]; -+ /* smp_mb(); */ -+ return 0; /* success */ -+ -+out: -+ rerr = reinit_vdir(tgt); -+ BUG_ON(rerr); -+ return err; -+} -+ -+int au_vdir_init(struct file *file) -+{ -+ int err; -+ struct inode *inode; -+ struct au_vdir *vdir_cache, *allocated; -+ -+ /* test file->f_pos here instead of ctx->pos */ -+ err = read_vdir(file, !file->f_pos); -+ if (unlikely(err)) -+ goto out; -+ -+ allocated = NULL; -+ vdir_cache = au_fvdir_cache(file); -+ if (!vdir_cache) { -+ vdir_cache = alloc_vdir(file); -+ err = PTR_ERR(vdir_cache); -+ if (IS_ERR(vdir_cache)) -+ goto out; -+ allocated = vdir_cache; -+ } else if (!file->f_pos && vdir_cache->vd_version != file->f_version) { -+ /* test file->f_pos here instead of ctx->pos */ -+ err = reinit_vdir(vdir_cache); -+ if (unlikely(err)) -+ goto out; -+ } else -+ return 0; /* success */ -+ -+ inode = file_inode(file); -+ err = copy_vdir(vdir_cache, au_ivdir(inode)); -+ if (!err) { -+ file->f_version = inode_query_iversion(inode); -+ if (allocated) -+ au_set_fvdir_cache(file, allocated); -+ } else if (allocated) -+ au_vdir_free(allocated); -+ -+out: -+ return err; -+} -+ -+static loff_t calc_offset(struct au_vdir *vdir) -+{ -+ loff_t offset; -+ union au_vdir_deblk_p p; -+ -+ p.deblk = vdir->vd_deblk[vdir->vd_last.ul]; -+ offset = vdir->vd_last.p.deblk - p.deblk; -+ offset += vdir->vd_deblk_sz * vdir->vd_last.ul; -+ return offset; -+} -+ -+/* returns true or false */ -+static int seek_vdir(struct file *file, struct dir_context *ctx) -+{ -+ int valid; -+ unsigned int deblk_sz; -+ unsigned long ul, n; -+ loff_t offset; -+ union au_vdir_deblk_p p, deblk_end; -+ struct au_vdir *vdir_cache; -+ -+ valid = 1; -+ vdir_cache = au_fvdir_cache(file); -+ offset = calc_offset(vdir_cache); -+ AuDbg("offset %lld\n", offset); -+ if (ctx->pos == offset) -+ goto out; -+ -+ vdir_cache->vd_last.ul = 0; -+ vdir_cache->vd_last.p.deblk = vdir_cache->vd_deblk[0]; -+ if (!ctx->pos) -+ goto out; -+ -+ valid = 0; -+ deblk_sz = vdir_cache->vd_deblk_sz; -+ ul = div64_u64(ctx->pos, deblk_sz); -+ AuDbg("ul %lu\n", ul); -+ if (ul >= vdir_cache->vd_nblk) -+ goto out; -+ -+ n = vdir_cache->vd_nblk; -+ for (; ul < n; ul++) { -+ p.deblk = vdir_cache->vd_deblk[ul]; -+ deblk_end.deblk = p.deblk + deblk_sz; -+ offset = ul; -+ offset *= deblk_sz; -+ while (!is_deblk_end(&p, &deblk_end) && offset < ctx->pos) { -+ unsigned int l; -+ -+ l = calc_size(p.de->de_str.len); -+ offset += l; -+ p.deblk += l; -+ } -+ if (!is_deblk_end(&p, &deblk_end)) { -+ valid = 1; -+ vdir_cache->vd_last.ul = ul; -+ vdir_cache->vd_last.p = p; -+ break; -+ } -+ } -+ -+out: -+ /* smp_mb(); */ -+ if (!valid) -+ AuDbg("valid %d\n", !valid); -+ return valid; -+} -+ -+int au_vdir_fill_de(struct file *file, struct dir_context *ctx) -+{ -+ unsigned int l, deblk_sz; -+ union au_vdir_deblk_p deblk_end; -+ struct au_vdir *vdir_cache; -+ struct au_vdir_de *de; -+ -+ if (!seek_vdir(file, ctx)) -+ return 0; -+ -+ vdir_cache = au_fvdir_cache(file); -+ deblk_sz = vdir_cache->vd_deblk_sz; -+ while (1) { -+ deblk_end.deblk = vdir_cache->vd_deblk[vdir_cache->vd_last.ul]; -+ deblk_end.deblk += deblk_sz; -+ while (!is_deblk_end(&vdir_cache->vd_last.p, &deblk_end)) { -+ de = vdir_cache->vd_last.p.de; -+ AuDbg("%.*s, off%lld, i%lu, dt%d\n", -+ de->de_str.len, de->de_str.name, ctx->pos, -+ (unsigned long)de->de_ino, de->de_type); -+ if (unlikely(!dir_emit(ctx, de->de_str.name, -+ de->de_str.len, de->de_ino, -+ de->de_type))) { -+ /* todo: ignore the error caused by udba? */ -+ /* return err; */ -+ return 0; -+ } -+ -+ l = calc_size(de->de_str.len); -+ vdir_cache->vd_last.p.deblk += l; -+ ctx->pos += l; -+ } -+ if (vdir_cache->vd_last.ul < vdir_cache->vd_nblk - 1) { -+ vdir_cache->vd_last.ul++; -+ vdir_cache->vd_last.p.deblk -+ = vdir_cache->vd_deblk[vdir_cache->vd_last.ul]; -+ ctx->pos = deblk_sz * vdir_cache->vd_last.ul; -+ continue; -+ } -+ break; -+ } -+ -+ /* smp_mb(); */ -+ return 0; -+} -diff -Naur null/fs/aufs/vfsub.c linux-5.15.36/fs/aufs/vfsub.c ---- /dev/null -+++ linux-5.15.36/fs/aufs/vfsub.c 2022-05-10 16:51:39.877744219 +0300 -@@ -0,0 +1,918 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program. If not, see . -+ */ -+ -+/* -+ * sub-routines for VFS -+ */ -+ -+#include -+#include -+#include -+#include -+#include "aufs.h" -+ -+#ifdef CONFIG_AUFS_BR_FUSE -+int vfsub_test_mntns(struct vfsmount *mnt, struct super_block *h_sb) -+{ -+ if (!au_test_fuse(h_sb) || !au_userns) -+ return 0; -+ -+ return is_current_mnt_ns(mnt) ? 0 : -EACCES; -+} -+#endif -+ -+int vfsub_sync_filesystem(struct super_block *h_sb) -+{ -+ int err; -+ -+ lockdep_off(); -+ down_read(&h_sb->s_umount); -+ err = sync_filesystem(h_sb); -+ up_read(&h_sb->s_umount); -+ lockdep_on(); -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+int vfsub_update_h_iattr(struct path *h_path, int *did) -+{ -+ int err; -+ struct kstat st; -+ struct super_block *h_sb; -+ -+ /* -+ * Always needs h_path->mnt for LSM or FUSE branch. -+ */ -+ AuDebugOn(!h_path->mnt); -+ -+ /* for remote fs, leave work for its getattr or d_revalidate */ -+ /* for bad i_attr fs, handle them in aufs_getattr() */ -+ /* still some fs may acquire i_mutex. we need to skip them */ -+ err = 0; -+ if (!did) -+ did = &err; -+ h_sb = h_path->dentry->d_sb; -+ *did = (!au_test_fs_remote(h_sb) && au_test_fs_refresh_iattr(h_sb)); -+ if (*did) -+ err = vfsub_getattr(h_path, &st); -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+struct file *vfsub_dentry_open(struct path *path, int flags) -+{ -+ return dentry_open(path, flags /* | __FMODE_NONOTIFY */, -+ current_cred()); -+} -+ -+struct file *vfsub_filp_open(const char *path, int oflags, int mode) -+{ -+ struct file *file; -+ -+ lockdep_off(); -+ file = filp_open(path, -+ oflags /* | __FMODE_NONOTIFY */, -+ mode); -+ lockdep_on(); -+ if (IS_ERR(file)) -+ goto out; -+ vfsub_update_h_iattr(&file->f_path, /*did*/NULL); /*ignore*/ -+ -+out: -+ return file; -+} -+ -+/* -+ * Ideally this function should call VFS:do_last() in order to keep all its -+ * checkings. But it is very hard for aufs to regenerate several VFS internal -+ * structure such as nameidata. This is a second (or third) best approach. -+ * cf. linux/fs/namei.c:do_last(), lookup_open() and atomic_open(). -+ */ -+int vfsub_atomic_open(struct inode *dir, struct dentry *dentry, -+ struct vfsub_aopen_args *args) -+{ -+ int err; -+ struct au_branch *br = args->br; -+ struct file *file = args->file; -+ /* copied from linux/fs/namei.c:atomic_open() */ -+ struct dentry *const DENTRY_NOT_SET = (void *)-1UL; -+ -+ IMustLock(dir); -+ AuDebugOn(!dir->i_op->atomic_open); -+ -+ err = au_br_test_oflag(args->open_flag, br); -+ if (unlikely(err)) -+ goto out; -+ -+ au_lcnt_inc(&br->br_nfiles); -+ file->f_path.dentry = DENTRY_NOT_SET; -+ file->f_path.mnt = au_br_mnt(br); -+ AuDbg("%ps\n", dir->i_op->atomic_open); -+ err = dir->i_op->atomic_open(dir, dentry, file, args->open_flag, -+ args->create_mode); -+ if (unlikely(err < 0)) { -+ au_lcnt_dec(&br->br_nfiles); -+ goto out; -+ } -+ -+ /* temporary workaround for nfsv4 branch */ -+ if (au_test_nfs(dir->i_sb)) -+ nfs_mark_for_revalidate(dir); -+ -+ if (file->f_mode & FMODE_CREATED) -+ fsnotify_create(dir, dentry); -+ if (!(file->f_mode & FMODE_OPENED)) { -+ au_lcnt_dec(&br->br_nfiles); -+ goto out; -+ } -+ -+ /* todo: call VFS:may_open() here */ -+ /* todo: ima_file_check() too? */ -+ if (!err && (args->open_flag & __FMODE_EXEC)) -+ err = deny_write_access(file); -+ if (!err) -+ fsnotify_open(file); -+ else -+ au_lcnt_dec(&br->br_nfiles); -+ /* note that the file is created and still opened */ -+ -+out: -+ return err; -+} -+ -+int vfsub_kern_path(const char *name, unsigned int flags, struct path *path) -+{ -+ int err; -+ -+ err = kern_path(name, flags, path); -+ if (!err && d_is_positive(path->dentry)) -+ vfsub_update_h_iattr(path, /*did*/NULL); /*ignore*/ -+ return err; -+} -+ -+struct dentry *vfsub_lookup_one_len_unlocked(const char *name, -+ struct path *ppath, int len) -+{ -+ struct path path; -+ -+ path.dentry = lookup_one_len_unlocked(name, ppath->dentry, len); -+ if (IS_ERR(path.dentry)) -+ goto out; -+ if (d_is_positive(path.dentry)) { -+ path.mnt = ppath->mnt; -+ vfsub_update_h_iattr(&path, /*did*/NULL); /*ignore*/ -+ } -+ -+out: -+ AuTraceErrPtr(path.dentry); -+ return path.dentry; -+} -+ -+struct dentry *vfsub_lookup_one_len(const char *name, struct path *ppath, -+ int len) -+{ -+ struct path path; -+ -+ /* VFS checks it too, but by WARN_ON_ONCE() */ -+ IMustLock(d_inode(ppath->dentry)); -+ -+ path.dentry = lookup_one_len(name, ppath->dentry, len); -+ if (IS_ERR(path.dentry)) -+ goto out; -+ if (d_is_positive(path.dentry)) { -+ path.mnt = ppath->mnt; -+ vfsub_update_h_iattr(&path, /*did*/NULL); /*ignore*/ -+ } -+ -+out: -+ AuTraceErrPtr(path.dentry); -+ return path.dentry; -+} -+ -+void vfsub_call_lkup_one(void *args) -+{ -+ struct vfsub_lkup_one_args *a = args; -+ *a->errp = vfsub_lkup_one(a->name, a->ppath); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+struct dentry *vfsub_lock_rename(struct dentry *d1, struct au_hinode *hdir1, -+ struct dentry *d2, struct au_hinode *hdir2) -+{ -+ struct dentry *d; -+ -+ lockdep_off(); -+ d = lock_rename(d1, d2); -+ lockdep_on(); -+ au_hn_suspend(hdir1); -+ if (hdir1 != hdir2) -+ au_hn_suspend(hdir2); -+ -+ return d; -+} -+ -+void vfsub_unlock_rename(struct dentry *d1, struct au_hinode *hdir1, -+ struct dentry *d2, struct au_hinode *hdir2) -+{ -+ au_hn_resume(hdir1); -+ if (hdir1 != hdir2) -+ au_hn_resume(hdir2); -+ lockdep_off(); -+ unlock_rename(d1, d2); -+ lockdep_on(); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+int vfsub_create(struct inode *dir, struct path *path, int mode, bool want_excl) -+{ -+ int err; -+ struct dentry *d; -+ struct user_namespace *userns; -+ -+ IMustLock(dir); -+ -+ d = path->dentry; -+ path->dentry = d->d_parent; -+ err = security_path_mknod(path, d, mode, 0); -+ path->dentry = d; -+ if (unlikely(err)) -+ goto out; -+ userns = mnt_user_ns(path->mnt); -+ -+ lockdep_off(); -+ err = vfs_create(userns, dir, path->dentry, mode, want_excl); -+ lockdep_on(); -+ if (!err) { -+ struct path tmp = *path; -+ int did; -+ -+ vfsub_update_h_iattr(&tmp, &did); -+ if (did) { -+ tmp.dentry = path->dentry->d_parent; -+ vfsub_update_h_iattr(&tmp, /*did*/NULL); -+ } -+ /*ignore*/ -+ } -+ -+out: -+ return err; -+} -+ -+int vfsub_symlink(struct inode *dir, struct path *path, const char *symname) -+{ -+ int err; -+ struct dentry *d; -+ struct user_namespace *userns; -+ -+ IMustLock(dir); -+ -+ d = path->dentry; -+ path->dentry = d->d_parent; -+ err = security_path_symlink(path, d, symname); -+ path->dentry = d; -+ if (unlikely(err)) -+ goto out; -+ userns = mnt_user_ns(path->mnt); -+ -+ lockdep_off(); -+ err = vfs_symlink(userns, dir, path->dentry, symname); -+ lockdep_on(); -+ if (!err) { -+ struct path tmp = *path; -+ int did; -+ -+ vfsub_update_h_iattr(&tmp, &did); -+ if (did) { -+ tmp.dentry = path->dentry->d_parent; -+ vfsub_update_h_iattr(&tmp, /*did*/NULL); -+ } -+ /*ignore*/ -+ } -+ -+out: -+ return err; -+} -+ -+int vfsub_mknod(struct inode *dir, struct path *path, int mode, dev_t dev) -+{ -+ int err; -+ struct dentry *d; -+ struct user_namespace *userns; -+ -+ IMustLock(dir); -+ -+ d = path->dentry; -+ path->dentry = d->d_parent; -+ err = security_path_mknod(path, d, mode, new_encode_dev(dev)); -+ path->dentry = d; -+ if (unlikely(err)) -+ goto out; -+ userns = mnt_user_ns(path->mnt); -+ -+ lockdep_off(); -+ err = vfs_mknod(userns, dir, path->dentry, mode, dev); -+ lockdep_on(); -+ if (!err) { -+ struct path tmp = *path; -+ int did; -+ -+ vfsub_update_h_iattr(&tmp, &did); -+ if (did) { -+ tmp.dentry = path->dentry->d_parent; -+ vfsub_update_h_iattr(&tmp, /*did*/NULL); -+ } -+ /*ignore*/ -+ } -+ -+out: -+ return err; -+} -+ -+static int au_test_nlink(struct inode *inode) -+{ -+ const unsigned int link_max = UINT_MAX >> 1; /* rough margin */ -+ -+ if (!au_test_fs_no_limit_nlink(inode->i_sb) -+ || inode->i_nlink < link_max) -+ return 0; -+ return -EMLINK; -+} -+ -+int vfsub_link(struct dentry *src_dentry, struct inode *dir, struct path *path, -+ struct inode **delegated_inode) -+{ -+ int err; -+ struct dentry *d; -+ struct user_namespace *userns; -+ -+ IMustLock(dir); -+ -+ err = au_test_nlink(d_inode(src_dentry)); -+ if (unlikely(err)) -+ return err; -+ -+ /* we don't call may_linkat() */ -+ d = path->dentry; -+ path->dentry = d->d_parent; -+ err = security_path_link(src_dentry, path, d); -+ path->dentry = d; -+ if (unlikely(err)) -+ goto out; -+ userns = mnt_user_ns(path->mnt); -+ -+ lockdep_off(); -+ err = vfs_link(src_dentry, userns, dir, path->dentry, delegated_inode); -+ lockdep_on(); -+ if (!err) { -+ struct path tmp = *path; -+ int did; -+ -+ /* fuse has different memory inode for the same inumber */ -+ vfsub_update_h_iattr(&tmp, &did); -+ if (did) { -+ tmp.dentry = path->dentry->d_parent; -+ vfsub_update_h_iattr(&tmp, /*did*/NULL); -+ tmp.dentry = src_dentry; -+ vfsub_update_h_iattr(&tmp, /*did*/NULL); -+ } -+ /*ignore*/ -+ } -+ -+out: -+ return err; -+} -+ -+int vfsub_rename(struct inode *src_dir, struct dentry *src_dentry, -+ struct inode *dir, struct path *path, -+ struct inode **delegated_inode, unsigned int flags) -+{ -+ int err; -+ struct renamedata rd; -+ struct path tmp = { -+ .mnt = path->mnt -+ }; -+ struct dentry *d; -+ -+ IMustLock(dir); -+ IMustLock(src_dir); -+ -+ d = path->dentry; -+ path->dentry = d->d_parent; -+ tmp.dentry = src_dentry->d_parent; -+ err = security_path_rename(&tmp, src_dentry, path, d, /*flags*/0); -+ path->dentry = d; -+ if (unlikely(err)) -+ goto out; -+ -+ rd.old_mnt_userns = mnt_user_ns(path->mnt); -+ rd.old_dir = src_dir; -+ rd.old_dentry = src_dentry; -+ rd.new_mnt_userns = rd.old_mnt_userns; -+ rd.new_dir = dir; -+ rd.new_dentry = path->dentry; -+ rd.delegated_inode = delegated_inode; -+ rd.flags = flags; -+ lockdep_off(); -+ err = vfs_rename(&rd); -+ lockdep_on(); -+ if (!err) { -+ int did; -+ -+ tmp.dentry = d->d_parent; -+ vfsub_update_h_iattr(&tmp, &did); -+ if (did) { -+ tmp.dentry = src_dentry; -+ vfsub_update_h_iattr(&tmp, /*did*/NULL); -+ tmp.dentry = src_dentry->d_parent; -+ vfsub_update_h_iattr(&tmp, /*did*/NULL); -+ } -+ /*ignore*/ -+ } -+ -+out: -+ return err; -+} -+ -+int vfsub_mkdir(struct inode *dir, struct path *path, int mode) -+{ -+ int err; -+ struct dentry *d; -+ struct user_namespace *userns; -+ -+ IMustLock(dir); -+ -+ d = path->dentry; -+ path->dentry = d->d_parent; -+ err = security_path_mkdir(path, d, mode); -+ path->dentry = d; -+ if (unlikely(err)) -+ goto out; -+ userns = mnt_user_ns(path->mnt); -+ -+ lockdep_off(); -+ err = vfs_mkdir(userns, dir, path->dentry, mode); -+ lockdep_on(); -+ if (!err) { -+ struct path tmp = *path; -+ int did; -+ -+ vfsub_update_h_iattr(&tmp, &did); -+ if (did) { -+ tmp.dentry = path->dentry->d_parent; -+ vfsub_update_h_iattr(&tmp, /*did*/NULL); -+ } -+ /*ignore*/ -+ } -+ -+out: -+ return err; -+} -+ -+int vfsub_rmdir(struct inode *dir, struct path *path) -+{ -+ int err; -+ struct dentry *d; -+ struct user_namespace *userns; -+ -+ IMustLock(dir); -+ -+ d = path->dentry; -+ path->dentry = d->d_parent; -+ err = security_path_rmdir(path, d); -+ path->dentry = d; -+ if (unlikely(err)) -+ goto out; -+ userns = mnt_user_ns(path->mnt); -+ -+ lockdep_off(); -+ err = vfs_rmdir(userns, dir, path->dentry); -+ lockdep_on(); -+ if (!err) { -+ struct path tmp = { -+ .dentry = path->dentry->d_parent, -+ .mnt = path->mnt -+ }; -+ -+ vfsub_update_h_iattr(&tmp, /*did*/NULL); /*ignore*/ -+ } -+ -+out: -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* todo: support mmap_sem? */ -+ssize_t vfsub_read_u(struct file *file, char __user *ubuf, size_t count, -+ loff_t *ppos) -+{ -+ ssize_t err; -+ -+ lockdep_off(); -+ err = vfs_read(file, ubuf, count, ppos); -+ lockdep_on(); -+ if (err >= 0) -+ vfsub_update_h_iattr(&file->f_path, /*did*/NULL); /*ignore*/ -+ return err; -+} -+ -+ssize_t vfsub_read_k(struct file *file, void *kbuf, size_t count, -+ loff_t *ppos) -+{ -+ ssize_t err; -+ -+ lockdep_off(); -+ err = kernel_read(file, kbuf, count, ppos); -+ lockdep_on(); -+ AuTraceErr(err); -+ if (err >= 0) -+ vfsub_update_h_iattr(&file->f_path, /*did*/NULL); /*ignore*/ -+ return err; -+} -+ -+ssize_t vfsub_write_u(struct file *file, const char __user *ubuf, size_t count, -+ loff_t *ppos) -+{ -+ ssize_t err; -+ -+ lockdep_off(); -+ err = vfs_write(file, ubuf, count, ppos); -+ lockdep_on(); -+ if (err >= 0) -+ vfsub_update_h_iattr(&file->f_path, /*did*/NULL); /*ignore*/ -+ return err; -+} -+ -+ssize_t vfsub_write_k(struct file *file, void *kbuf, size_t count, loff_t *ppos) -+{ -+ ssize_t err; -+ -+ lockdep_off(); -+ err = kernel_write(file, kbuf, count, ppos); -+ lockdep_on(); -+ if (err >= 0) -+ vfsub_update_h_iattr(&file->f_path, /*did*/NULL); /*ignore*/ -+ return err; -+} -+ -+int vfsub_flush(struct file *file, fl_owner_t id) -+{ -+ int err; -+ -+ err = 0; -+ if (file->f_op->flush) { -+ if (!au_test_nfs(file->f_path.dentry->d_sb)) -+ err = file->f_op->flush(file, id); -+ else { -+ lockdep_off(); -+ err = file->f_op->flush(file, id); -+ lockdep_on(); -+ } -+ if (!err) -+ vfsub_update_h_iattr(&file->f_path, /*did*/NULL); -+ /*ignore*/ -+ } -+ return err; -+} -+ -+int vfsub_iterate_dir(struct file *file, struct dir_context *ctx) -+{ -+ int err; -+ -+ AuDbg("%pD, ctx{%ps, %llu}\n", file, ctx->actor, ctx->pos); -+ -+ lockdep_off(); -+ err = iterate_dir(file, ctx); -+ lockdep_on(); -+ if (err >= 0) -+ vfsub_update_h_iattr(&file->f_path, /*did*/NULL); /*ignore*/ -+ -+ return err; -+} -+ -+long vfsub_splice_to(struct file *in, loff_t *ppos, -+ struct pipe_inode_info *pipe, size_t len, -+ unsigned int flags) -+{ -+ long err; -+ -+ lockdep_off(); -+ err = do_splice_to(in, ppos, pipe, len, flags); -+ lockdep_on(); -+ file_accessed(in); -+ if (err >= 0) -+ vfsub_update_h_iattr(&in->f_path, /*did*/NULL); /*ignore*/ -+ return err; -+} -+ -+long vfsub_splice_from(struct pipe_inode_info *pipe, struct file *out, -+ loff_t *ppos, size_t len, unsigned int flags) -+{ -+ long err; -+ -+ lockdep_off(); -+ err = do_splice_from(pipe, out, ppos, len, flags); -+ lockdep_on(); -+ if (err >= 0) -+ vfsub_update_h_iattr(&out->f_path, /*did*/NULL); /*ignore*/ -+ return err; -+} -+ -+int vfsub_fsync(struct file *file, struct path *path, int datasync) -+{ -+ int err; -+ -+ /* file can be NULL */ -+ lockdep_off(); -+ err = vfs_fsync(file, datasync); -+ lockdep_on(); -+ if (!err) { -+ if (!path) { -+ AuDebugOn(!file); -+ path = &file->f_path; -+ } -+ vfsub_update_h_iattr(path, /*did*/NULL); /*ignore*/ -+ } -+ return err; -+} -+ -+/* cf. open.c:do_sys_truncate() and do_sys_ftruncate() */ -+int vfsub_trunc(struct path *h_path, loff_t length, unsigned int attr, -+ struct file *h_file) -+{ -+ int err; -+ struct inode *h_inode; -+ struct super_block *h_sb; -+ struct user_namespace *h_userns; -+ -+ if (!h_file) { -+ err = vfsub_truncate(h_path, length); -+ goto out; -+ } -+ -+ h_inode = d_inode(h_path->dentry); -+ h_sb = h_inode->i_sb; -+ lockdep_off(); -+ sb_start_write(h_sb); -+ lockdep_on(); -+ err = security_path_truncate(h_path); -+ if (!err) { -+ h_userns = mnt_user_ns(h_path->mnt); -+ lockdep_off(); -+ err = do_truncate(h_userns, h_path->dentry, length, attr, -+ h_file); -+ lockdep_on(); -+ } -+ lockdep_off(); -+ sb_end_write(h_sb); -+ lockdep_on(); -+ -+out: -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+struct au_vfsub_mkdir_args { -+ int *errp; -+ struct inode *dir; -+ struct path *path; -+ int mode; -+}; -+ -+static void au_call_vfsub_mkdir(void *args) -+{ -+ struct au_vfsub_mkdir_args *a = args; -+ *a->errp = vfsub_mkdir(a->dir, a->path, a->mode); -+} -+ -+int vfsub_sio_mkdir(struct inode *dir, struct path *path, int mode) -+{ -+ int err, do_sio, wkq_err; -+ struct user_namespace *userns; -+ -+ userns = mnt_user_ns(path->mnt); -+ do_sio = au_test_h_perm_sio(userns, dir, MAY_EXEC | MAY_WRITE); -+ if (!do_sio) { -+ lockdep_off(); -+ err = vfsub_mkdir(dir, path, mode); -+ lockdep_on(); -+ } else { -+ struct au_vfsub_mkdir_args args = { -+ .errp = &err, -+ .dir = dir, -+ .path = path, -+ .mode = mode -+ }; -+ wkq_err = au_wkq_wait(au_call_vfsub_mkdir, &args); -+ if (unlikely(wkq_err)) -+ err = wkq_err; -+ } -+ -+ return err; -+} -+ -+struct au_vfsub_rmdir_args { -+ int *errp; -+ struct inode *dir; -+ struct path *path; -+}; -+ -+static void au_call_vfsub_rmdir(void *args) -+{ -+ struct au_vfsub_rmdir_args *a = args; -+ *a->errp = vfsub_rmdir(a->dir, a->path); -+} -+ -+int vfsub_sio_rmdir(struct inode *dir, struct path *path) -+{ -+ int err, do_sio, wkq_err; -+ struct user_namespace *userns; -+ -+ userns = mnt_user_ns(path->mnt); -+ do_sio = au_test_h_perm_sio(userns, dir, MAY_EXEC | MAY_WRITE); -+ if (!do_sio) { -+ lockdep_off(); -+ err = vfsub_rmdir(dir, path); -+ lockdep_on(); -+ } else { -+ struct au_vfsub_rmdir_args args = { -+ .errp = &err, -+ .dir = dir, -+ .path = path -+ }; -+ wkq_err = au_wkq_wait(au_call_vfsub_rmdir, &args); -+ if (unlikely(wkq_err)) -+ err = wkq_err; -+ } -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+struct notify_change_args { -+ int *errp; -+ struct path *path; -+ struct iattr *ia; -+ struct inode **delegated_inode; -+}; -+ -+static void call_notify_change(void *args) -+{ -+ struct notify_change_args *a = args; -+ struct inode *h_inode; -+ struct user_namespace *userns; -+ -+ h_inode = d_inode(a->path->dentry); -+ IMustLock(h_inode); -+ -+ *a->errp = -EPERM; -+ if (!IS_IMMUTABLE(h_inode) && !IS_APPEND(h_inode)) { -+ userns = mnt_user_ns(a->path->mnt); -+ lockdep_off(); -+ *a->errp = notify_change(userns, a->path->dentry, a->ia, -+ a->delegated_inode); -+ lockdep_on(); -+ if (!*a->errp) -+ vfsub_update_h_iattr(a->path, /*did*/NULL); /*ignore*/ -+ } -+ AuTraceErr(*a->errp); -+} -+ -+int vfsub_notify_change(struct path *path, struct iattr *ia, -+ struct inode **delegated_inode) -+{ -+ int err; -+ struct notify_change_args args = { -+ .errp = &err, -+ .path = path, -+ .ia = ia, -+ .delegated_inode = delegated_inode -+ }; -+ -+ call_notify_change(&args); -+ -+ return err; -+} -+ -+int vfsub_sio_notify_change(struct path *path, struct iattr *ia, -+ struct inode **delegated_inode) -+{ -+ int err, wkq_err; -+ struct notify_change_args args = { -+ .errp = &err, -+ .path = path, -+ .ia = ia, -+ .delegated_inode = delegated_inode -+ }; -+ -+ wkq_err = au_wkq_wait(call_notify_change, &args); -+ if (unlikely(wkq_err)) -+ err = wkq_err; -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+struct unlink_args { -+ int *errp; -+ struct inode *dir; -+ struct path *path; -+ struct inode **delegated_inode; -+}; -+ -+static void call_unlink(void *args) -+{ -+ struct unlink_args *a = args; -+ struct dentry *d = a->path->dentry; -+ struct inode *h_inode; -+ struct user_namespace *userns; -+ const int stop_sillyrename = (au_test_nfs(d->d_sb) -+ && au_dcount(d) == 1); -+ -+ IMustLock(a->dir); -+ -+ a->path->dentry = d->d_parent; -+ *a->errp = security_path_unlink(a->path, d); -+ a->path->dentry = d; -+ if (unlikely(*a->errp)) -+ return; -+ -+ if (!stop_sillyrename) -+ dget(d); -+ h_inode = NULL; -+ if (d_is_positive(d)) { -+ h_inode = d_inode(d); -+ ihold(h_inode); -+ } -+ -+ userns = mnt_user_ns(a->path->mnt); -+ lockdep_off(); -+ *a->errp = vfs_unlink(userns, a->dir, d, a->delegated_inode); -+ lockdep_on(); -+ if (!*a->errp) { -+ struct path tmp = { -+ .dentry = d->d_parent, -+ .mnt = a->path->mnt -+ }; -+ vfsub_update_h_iattr(&tmp, /*did*/NULL); /*ignore*/ -+ } -+ -+ if (!stop_sillyrename) -+ dput(d); -+ if (h_inode) -+ iput(h_inode); -+ -+ AuTraceErr(*a->errp); -+} -+ -+/* -+ * @dir: must be locked. -+ * @dentry: target dentry. -+ */ -+int vfsub_unlink(struct inode *dir, struct path *path, -+ struct inode **delegated_inode, int force) -+{ -+ int err; -+ struct unlink_args args = { -+ .errp = &err, -+ .dir = dir, -+ .path = path, -+ .delegated_inode = delegated_inode -+ }; -+ -+ if (!force) -+ call_unlink(&args); -+ else { -+ int wkq_err; -+ -+ wkq_err = au_wkq_wait(call_unlink, &args); -+ if (unlikely(wkq_err)) -+ err = wkq_err; -+ } -+ -+ return err; -+} -diff -Naur null/fs/aufs/vfsub.h linux-5.15.36/fs/aufs/vfsub.h ---- /dev/null -+++ linux-5.15.36/fs/aufs/vfsub.h 2022-05-10 16:51:39.877744219 +0300 -@@ -0,0 +1,358 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program. If not, see . -+ */ -+ -+/* -+ * sub-routines for VFS -+ */ -+ -+#ifndef __AUFS_VFSUB_H__ -+#define __AUFS_VFSUB_H__ -+ -+#ifdef __KERNEL__ -+ -+#include -+#include -+#include -+#include -+#include "debug.h" -+ -+/* copied from linux/fs/internal.h */ -+/* todo: BAD approach!! */ -+extern void __mnt_drop_write(struct vfsmount *); -+extern struct file *alloc_empty_file(int, const struct cred *); -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* lock subclass for lower inode */ -+/* default MAX_LOCKDEP_SUBCLASSES(8) is not enough */ -+/* reduce? gave up. */ -+enum { -+ AuLsc_I_Begin = I_MUTEX_PARENT2, /* 5 */ -+ AuLsc_I_PARENT, /* lower inode, parent first */ -+ AuLsc_I_PARENT2, /* copyup dirs */ -+ AuLsc_I_PARENT3, /* copyup wh */ -+ AuLsc_I_CHILD, -+ AuLsc_I_CHILD2, -+ AuLsc_I_End -+}; -+ -+/* to debug easier, do not make them inlined functions */ -+#define MtxMustLock(mtx) AuDebugOn(!mutex_is_locked(mtx)) -+#define IMustLock(i) AuDebugOn(!inode_is_locked(i)) -+ -+/* ---------------------------------------------------------------------- */ -+ -+static inline void vfsub_drop_nlink(struct inode *inode) -+{ -+ AuDebugOn(!inode->i_nlink); -+ drop_nlink(inode); -+} -+ -+static inline void vfsub_dead_dir(struct inode *inode) -+{ -+ AuDebugOn(!S_ISDIR(inode->i_mode)); -+ inode->i_flags |= S_DEAD; -+ clear_nlink(inode); -+} -+ -+static inline int vfsub_native_ro(struct inode *inode) -+{ -+ return sb_rdonly(inode->i_sb) -+ || IS_RDONLY(inode) -+ /* || IS_APPEND(inode) */ -+ || IS_IMMUTABLE(inode); -+} -+ -+#ifdef CONFIG_AUFS_BR_FUSE -+int vfsub_test_mntns(struct vfsmount *mnt, struct super_block *h_sb); -+#else -+AuStubInt0(vfsub_test_mntns, struct vfsmount *mnt, struct super_block *h_sb); -+#endif -+ -+int vfsub_sync_filesystem(struct super_block *h_sb); -+ -+/* ---------------------------------------------------------------------- */ -+ -+int vfsub_update_h_iattr(struct path *h_path, int *did); -+struct file *vfsub_dentry_open(struct path *path, int flags); -+struct file *vfsub_filp_open(const char *path, int oflags, int mode); -+struct au_branch; -+struct vfsub_aopen_args { -+ struct file *file; -+ unsigned int open_flag; -+ umode_t create_mode; -+ struct au_branch *br; -+}; -+int vfsub_atomic_open(struct inode *dir, struct dentry *dentry, -+ struct vfsub_aopen_args *args); -+int vfsub_kern_path(const char *name, unsigned int flags, struct path *path); -+ -+struct dentry *vfsub_lookup_one_len_unlocked(const char *name, -+ struct path *ppath, int len); -+struct dentry *vfsub_lookup_one_len(const char *name, struct path *ppath, -+ int len); -+ -+struct vfsub_lkup_one_args { -+ struct dentry **errp; -+ struct qstr *name; -+ struct path *ppath; -+}; -+ -+static inline struct dentry *vfsub_lkup_one(struct qstr *name, -+ struct path *ppath) -+{ -+ return vfsub_lookup_one_len(name->name, ppath, name->len); -+} -+ -+void vfsub_call_lkup_one(void *args); -+ -+/* ---------------------------------------------------------------------- */ -+ -+static inline int vfsub_mnt_want_write(struct vfsmount *mnt) -+{ -+ int err; -+ -+ lockdep_off(); -+ err = mnt_want_write(mnt); -+ lockdep_on(); -+ return err; -+} -+ -+static inline void vfsub_mnt_drop_write(struct vfsmount *mnt) -+{ -+ lockdep_off(); -+ mnt_drop_write(mnt); -+ lockdep_on(); -+} -+ -+#if 0 /* reserved */ -+static inline void vfsub_mnt_drop_write_file(struct file *file) -+{ -+ lockdep_off(); -+ mnt_drop_write_file(file); -+ lockdep_on(); -+} -+#endif -+ -+/* ---------------------------------------------------------------------- */ -+ -+struct au_hinode; -+struct dentry *vfsub_lock_rename(struct dentry *d1, struct au_hinode *hdir1, -+ struct dentry *d2, struct au_hinode *hdir2); -+void vfsub_unlock_rename(struct dentry *d1, struct au_hinode *hdir1, -+ struct dentry *d2, struct au_hinode *hdir2); -+ -+int vfsub_create(struct inode *dir, struct path *path, int mode, -+ bool want_excl); -+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_rename(struct inode *src_hdir, struct dentry *src_dentry, -+ struct inode *hdir, struct path *path, -+ struct inode **delegated_inode, unsigned int flags); -+int vfsub_mkdir(struct inode *dir, struct path *path, int mode); -+int vfsub_rmdir(struct inode *dir, struct path *path); -+ -+/* ---------------------------------------------------------------------- */ -+ -+ssize_t vfsub_read_u(struct file *file, char __user *ubuf, size_t count, -+ loff_t *ppos); -+ssize_t vfsub_read_k(struct file *file, void *kbuf, size_t count, -+ loff_t *ppos); -+ssize_t vfsub_write_u(struct file *file, const char __user *ubuf, size_t count, -+ loff_t *ppos); -+ssize_t vfsub_write_k(struct file *file, void *kbuf, size_t count, -+ loff_t *ppos); -+int vfsub_flush(struct file *file, fl_owner_t id); -+int vfsub_iterate_dir(struct file *file, struct dir_context *ctx); -+ -+static inline loff_t vfsub_f_size_read(struct file *file) -+{ -+ return i_size_read(file_inode(file)); -+} -+ -+static inline unsigned int vfsub_file_flags(struct file *file) -+{ -+ unsigned int flags; -+ -+ spin_lock(&file->f_lock); -+ flags = file->f_flags; -+ spin_unlock(&file->f_lock); -+ -+ return flags; -+} -+ -+static inline int vfsub_file_execed(struct file *file) -+{ -+ /* todo: direct access f_flags */ -+ return !!(vfsub_file_flags(file) & __FMODE_EXEC); -+} -+ -+#if 0 /* reserved */ -+static inline void vfsub_file_accessed(struct file *h_file) -+{ -+ file_accessed(h_file); -+ vfsub_update_h_iattr(&h_file->f_path, /*did*/NULL); /*ignore*/ -+} -+#endif -+ -+#if 0 /* reserved */ -+static inline void vfsub_touch_atime(struct vfsmount *h_mnt, -+ struct dentry *h_dentry) -+{ -+ struct path h_path = { -+ .dentry = h_dentry, -+ .mnt = h_mnt -+ }; -+ touch_atime(&h_path); -+ vfsub_update_h_iattr(&h_path, /*did*/NULL); /*ignore*/ -+} -+#endif -+ -+static inline int vfsub_update_time(struct inode *h_inode, -+ struct timespec64 *ts, int flags) -+{ -+ return inode_update_time(h_inode, ts, flags); -+ /* no vfsub_update_h_iattr() since we don't have struct path */ -+} -+ -+#ifdef CONFIG_FS_POSIX_ACL -+static inline int vfsub_acl_chmod(struct user_namespace *h_userns, -+ struct inode *h_inode, umode_t h_mode) -+{ -+ int err; -+ -+ err = posix_acl_chmod(h_userns, h_inode, h_mode); -+ if (err == -EOPNOTSUPP) -+ err = 0; -+ return err; -+} -+#else -+AuStubInt0(vfsub_acl_chmod, struct user_namespace *h_userns, -+ struct inode *h_inode, umode_t h_mode); -+#endif -+ -+long vfsub_splice_to(struct file *in, loff_t *ppos, -+ struct pipe_inode_info *pipe, size_t len, -+ unsigned int flags); -+long vfsub_splice_from(struct pipe_inode_info *pipe, struct file *out, -+ loff_t *ppos, size_t len, unsigned int flags); -+ -+static inline long vfsub_truncate(struct path *path, loff_t length) -+{ -+ long err; -+ -+ lockdep_off(); -+ err = vfs_truncate(path, length); -+ lockdep_on(); -+ return err; -+} -+ -+int vfsub_trunc(struct path *h_path, loff_t length, unsigned int attr, -+ struct file *h_file); -+int vfsub_fsync(struct file *file, struct path *path, int datasync); -+ -+/* -+ * re-use branch fs's ioctl(FICLONE) while aufs itself doesn't support such -+ * ioctl. -+ */ -+static inline loff_t vfsub_clone_file_range(struct file *src, struct file *dst, -+ loff_t len) -+{ -+ loff_t err; -+ -+ lockdep_off(); -+ err = vfs_clone_file_range(src, 0, dst, 0, len, /*remap_flags*/0); -+ lockdep_on(); -+ -+ return err; -+} -+ -+/* copy_file_range(2) is a systemcall */ -+static inline ssize_t vfsub_copy_file_range(struct file *src, loff_t src_pos, -+ struct file *dst, loff_t dst_pos, -+ size_t len, unsigned int flags) -+{ -+ ssize_t ssz; -+ -+ lockdep_off(); -+ ssz = vfs_copy_file_range(src, src_pos, dst, dst_pos, len, flags); -+ lockdep_on(); -+ -+ return ssz; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static inline loff_t vfsub_llseek(struct file *file, loff_t offset, int origin) -+{ -+ loff_t err; -+ -+ lockdep_off(); -+ err = vfs_llseek(file, offset, origin); -+ lockdep_on(); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+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); -+ -+static inline int vfsub_getattr(const struct path *path, struct kstat *st) -+{ -+ return vfs_getattr(path, st, STATX_BASIC_STATS, AT_STATX_SYNC_AS_STAT); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static inline int vfsub_setxattr(struct user_namespace *userns, -+ struct dentry *dentry, const char *name, -+ const void *value, size_t size, int flags) -+{ -+ int err; -+ -+ lockdep_off(); -+ err = vfs_setxattr(userns, dentry, name, value, size, flags); -+ lockdep_on(); -+ -+ return err; -+} -+ -+static inline int vfsub_removexattr(struct user_namespace *userns, -+ struct dentry *dentry, const char *name) -+{ -+ int err; -+ -+ lockdep_off(); -+ err = vfs_removexattr(userns, dentry, name); -+ lockdep_on(); -+ -+ return err; -+} -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_VFSUB_H__ */ -diff -Naur null/fs/aufs/wbr_policy.c linux-5.15.36/fs/aufs/wbr_policy.c ---- /dev/null -+++ linux-5.15.36/fs/aufs/wbr_policy.c 2022-05-10 16:51:39.877744219 +0300 -@@ -0,0 +1,830 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program. If not, see . -+ */ -+ -+/* -+ * policies for selecting one among multiple writable branches -+ */ -+ -+#include -+#include "aufs.h" -+ -+/* subset of cpup_attr() */ -+static noinline_for_stack -+int au_cpdown_attr(struct path *h_path, struct dentry *h_src) -+{ -+ int err, sbits; -+ struct iattr ia; -+ struct inode *h_isrc; -+ -+ h_isrc = d_inode(h_src); -+ ia.ia_valid = ATTR_FORCE | ATTR_MODE | ATTR_UID | ATTR_GID; -+ ia.ia_mode = h_isrc->i_mode; -+ ia.ia_uid = h_isrc->i_uid; -+ 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); -+ -+ /* 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); -+ } -+ -+ return err; -+} -+ -+#define AuCpdown_PARENT_OPQ 1 -+#define AuCpdown_WHED (1 << 1) -+#define AuCpdown_MADE_DIR (1 << 2) -+#define AuCpdown_DIROPQ (1 << 3) -+#define au_ftest_cpdown(flags, name) ((flags) & AuCpdown_##name) -+#define au_fset_cpdown(flags, name) \ -+ do { (flags) |= AuCpdown_##name; } while (0) -+#define au_fclr_cpdown(flags, name) \ -+ do { (flags) &= ~AuCpdown_##name; } while (0) -+ -+static int au_cpdown_dir_opq(struct dentry *dentry, aufs_bindex_t bdst, -+ unsigned int *flags) -+{ -+ int err; -+ struct dentry *opq_dentry; -+ -+ opq_dentry = au_diropq_create(dentry, bdst); -+ err = PTR_ERR(opq_dentry); -+ if (IS_ERR(opq_dentry)) -+ goto out; -+ dput(opq_dentry); -+ au_fset_cpdown(*flags, DIROPQ); -+ -+out: -+ return err; -+} -+ -+static int au_cpdown_dir_wh(struct dentry *dentry, struct dentry *h_parent, -+ struct inode *dir, aufs_bindex_t bdst) -+{ -+ int err; -+ struct path h_path; -+ struct au_branch *br; -+ -+ br = au_sbr(dentry->d_sb, bdst); -+ h_path.dentry = au_wh_lkup(h_parent, &dentry->d_name, br); -+ err = PTR_ERR(h_path.dentry); -+ if (IS_ERR(h_path.dentry)) -+ goto out; -+ -+ err = 0; -+ if (d_is_positive(h_path.dentry)) { -+ h_path.mnt = au_br_mnt(br); -+ err = au_wh_unlink_dentry(au_h_iptr(dir, bdst), &h_path, -+ dentry); -+ } -+ dput(h_path.dentry); -+ -+out: -+ return err; -+} -+ -+static int au_cpdown_dir(struct dentry *dentry, aufs_bindex_t bdst, -+ struct au_pin *pin, -+ struct dentry *h_parent, void *arg) -+{ -+ int err, rerr; -+ aufs_bindex_t bopq, btop; -+ struct path h_path; -+ struct dentry *parent; -+ struct inode *h_dir, *h_inode, *inode, *dir; -+ unsigned int *flags = arg; -+ -+ btop = au_dbtop(dentry); -+ /* dentry is di-locked */ -+ parent = dget_parent(dentry); -+ dir = d_inode(parent); -+ h_dir = d_inode(h_parent); -+ AuDebugOn(h_dir != au_h_iptr(dir, bdst)); -+ IMustLock(h_dir); -+ -+ err = au_lkup_neg(dentry, bdst, /*wh*/0); -+ if (unlikely(err < 0)) -+ goto out; -+ h_path.dentry = au_h_dptr(dentry, bdst); -+ h_path.mnt = au_sbr_mnt(dentry->d_sb, bdst); -+ err = vfsub_sio_mkdir(au_h_iptr(dir, bdst), &h_path, 0755); -+ if (unlikely(err)) -+ goto out_put; -+ au_fset_cpdown(*flags, MADE_DIR); -+ -+ bopq = au_dbdiropq(dentry); -+ au_fclr_cpdown(*flags, WHED); -+ au_fclr_cpdown(*flags, DIROPQ); -+ if (au_dbwh(dentry) == bdst) -+ au_fset_cpdown(*flags, WHED); -+ if (!au_ftest_cpdown(*flags, PARENT_OPQ) && bopq <= bdst) -+ au_fset_cpdown(*flags, PARENT_OPQ); -+ h_inode = d_inode(h_path.dentry); -+ inode_lock_nested(h_inode, AuLsc_I_CHILD); -+ if (au_ftest_cpdown(*flags, WHED)) { -+ err = au_cpdown_dir_opq(dentry, bdst, flags); -+ if (unlikely(err)) { -+ inode_unlock(h_inode); -+ goto out_dir; -+ } -+ } -+ -+ err = au_cpdown_attr(&h_path, au_h_dptr(dentry, btop)); -+ inode_unlock(h_inode); -+ if (unlikely(err)) -+ goto out_opq; -+ -+ if (au_ftest_cpdown(*flags, WHED)) { -+ err = au_cpdown_dir_wh(dentry, h_parent, dir, bdst); -+ if (unlikely(err)) -+ goto out_opq; -+ } -+ -+ inode = d_inode(dentry); -+ if (au_ibbot(inode) < bdst) -+ au_set_ibbot(inode, bdst); -+ au_set_h_iptr(inode, bdst, au_igrab(h_inode), -+ au_hi_flags(inode, /*isdir*/1)); -+ au_fhsm_wrote(dentry->d_sb, bdst, /*force*/0); -+ goto out; /* success */ -+ -+ /* revert */ -+out_opq: -+ if (au_ftest_cpdown(*flags, DIROPQ)) { -+ inode_lock_nested(h_inode, AuLsc_I_CHILD); -+ rerr = au_diropq_remove(dentry, bdst); -+ inode_unlock(h_inode); -+ if (unlikely(rerr)) { -+ AuIOErr("failed removing diropq for %pd b%d (%d)\n", -+ dentry, bdst, rerr); -+ err = -EIO; -+ goto out; -+ } -+ } -+out_dir: -+ if (au_ftest_cpdown(*flags, MADE_DIR)) { -+ rerr = vfsub_sio_rmdir(au_h_iptr(dir, bdst), &h_path); -+ if (unlikely(rerr)) { -+ AuIOErr("failed removing %pd b%d (%d)\n", -+ dentry, bdst, rerr); -+ err = -EIO; -+ } -+ } -+out_put: -+ au_set_h_dptr(dentry, bdst, NULL); -+ if (au_dbbot(dentry) == bdst) -+ au_update_dbbot(dentry); -+out: -+ dput(parent); -+ return err; -+} -+ -+int au_cpdown_dirs(struct dentry *dentry, aufs_bindex_t bdst) -+{ -+ int err; -+ unsigned int flags; -+ -+ flags = 0; -+ err = au_cp_dirs(dentry, bdst, au_cpdown_dir, &flags); -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* policies for create */ -+ -+int au_wbr_nonopq(struct dentry *dentry, aufs_bindex_t bindex) -+{ -+ int err, i, j, ndentry; -+ aufs_bindex_t bopq; -+ struct au_dcsub_pages dpages; -+ struct au_dpage *dpage; -+ struct dentry **dentries, *parent, *d; -+ -+ err = au_dpages_init(&dpages, GFP_NOFS); -+ if (unlikely(err)) -+ goto out; -+ parent = dget_parent(dentry); -+ err = au_dcsub_pages_rev_aufs(&dpages, parent, /*do_include*/0); -+ if (unlikely(err)) -+ goto out_free; -+ -+ err = bindex; -+ for (i = 0; i < dpages.ndpage; i++) { -+ dpage = dpages.dpages + i; -+ dentries = dpage->dentries; -+ ndentry = dpage->ndentry; -+ for (j = 0; j < ndentry; j++) { -+ d = dentries[j]; -+ di_read_lock_parent2(d, !AuLock_IR); -+ bopq = au_dbdiropq(d); -+ di_read_unlock(d, !AuLock_IR); -+ if (bopq >= 0 && bopq < err) -+ err = bopq; -+ } -+ } -+ -+out_free: -+ dput(parent); -+ au_dpages_free(&dpages); -+out: -+ return err; -+} -+ -+static int au_wbr_bu(struct super_block *sb, aufs_bindex_t bindex) -+{ -+ for (; bindex >= 0; bindex--) -+ if (!au_br_rdonly(au_sbr(sb, bindex))) -+ return bindex; -+ return -EROFS; -+} -+ -+/* top down parent */ -+static int au_wbr_create_tdp(struct dentry *dentry, -+ unsigned int flags __maybe_unused) -+{ -+ int err; -+ aufs_bindex_t btop, bindex; -+ struct super_block *sb; -+ struct dentry *parent, *h_parent; -+ -+ sb = dentry->d_sb; -+ btop = au_dbtop(dentry); -+ err = btop; -+ if (!au_br_rdonly(au_sbr(sb, btop))) -+ goto out; -+ -+ err = -EROFS; -+ parent = dget_parent(dentry); -+ for (bindex = au_dbtop(parent); bindex < btop; bindex++) { -+ h_parent = au_h_dptr(parent, bindex); -+ if (!h_parent || d_is_negative(h_parent)) -+ continue; -+ -+ if (!au_br_rdonly(au_sbr(sb, bindex))) { -+ err = bindex; -+ break; -+ } -+ } -+ dput(parent); -+ -+ /* bottom up here */ -+ if (unlikely(err < 0)) { -+ err = au_wbr_bu(sb, btop - 1); -+ if (err >= 0) -+ err = au_wbr_nonopq(dentry, err); -+ } -+ -+out: -+ AuDbg("b%d\n", err); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* an exception for the policy other than tdp */ -+static int au_wbr_create_exp(struct dentry *dentry) -+{ -+ int err; -+ aufs_bindex_t bwh, bdiropq; -+ struct dentry *parent; -+ -+ err = -1; -+ bwh = au_dbwh(dentry); -+ parent = dget_parent(dentry); -+ bdiropq = au_dbdiropq(parent); -+ if (bwh >= 0) { -+ if (bdiropq >= 0) -+ err = min(bdiropq, bwh); -+ else -+ err = bwh; -+ AuDbg("%d\n", err); -+ } else if (bdiropq >= 0) { -+ err = bdiropq; -+ AuDbg("%d\n", err); -+ } -+ dput(parent); -+ -+ if (err >= 0) -+ err = au_wbr_nonopq(dentry, err); -+ -+ if (err >= 0 && au_br_rdonly(au_sbr(dentry->d_sb, err))) -+ err = -1; -+ -+ AuDbg("%d\n", err); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* round robin */ -+static int au_wbr_create_init_rr(struct super_block *sb) -+{ -+ int err; -+ -+ err = au_wbr_bu(sb, au_sbbot(sb)); -+ atomic_set(&au_sbi(sb)->si_wbr_rr_next, -err); /* less important */ -+ /* smp_mb(); */ -+ -+ AuDbg("b%d\n", err); -+ return err; -+} -+ -+static int au_wbr_create_rr(struct dentry *dentry, unsigned int flags) -+{ -+ int err, nbr; -+ unsigned int u; -+ aufs_bindex_t bindex, bbot; -+ struct super_block *sb; -+ atomic_t *next; -+ -+ err = au_wbr_create_exp(dentry); -+ if (err >= 0) -+ goto out; -+ -+ sb = dentry->d_sb; -+ next = &au_sbi(sb)->si_wbr_rr_next; -+ bbot = au_sbbot(sb); -+ nbr = bbot + 1; -+ for (bindex = 0; bindex <= bbot; bindex++) { -+ if (!au_ftest_wbr(flags, DIR)) { -+ err = atomic_dec_return(next) + 1; -+ /* modulo for 0 is meaningless */ -+ if (unlikely(!err)) -+ err = atomic_dec_return(next) + 1; -+ } else -+ err = atomic_read(next); -+ AuDbg("%d\n", err); -+ u = err; -+ err = u % nbr; -+ AuDbg("%d\n", err); -+ if (!au_br_rdonly(au_sbr(sb, err))) -+ break; -+ err = -EROFS; -+ } -+ -+ if (err >= 0) -+ err = au_wbr_nonopq(dentry, err); -+ -+out: -+ AuDbg("%d\n", err); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* most free space */ -+static void au_mfs(struct dentry *dentry, struct dentry *parent) -+{ -+ struct super_block *sb; -+ struct au_branch *br; -+ struct au_wbr_mfs *mfs; -+ struct dentry *h_parent; -+ aufs_bindex_t bindex, bbot; -+ int err; -+ unsigned long long b, bavail; -+ struct path h_path; -+ /* reduce the stack usage */ -+ struct kstatfs *st; -+ -+ st = kmalloc(sizeof(*st), GFP_NOFS); -+ if (unlikely(!st)) { -+ AuWarn1("failed updating mfs(%d), ignored\n", -ENOMEM); -+ return; -+ } -+ -+ bavail = 0; -+ sb = dentry->d_sb; -+ mfs = &au_sbi(sb)->si_wbr_mfs; -+ MtxMustLock(&mfs->mfs_lock); -+ mfs->mfs_bindex = -EROFS; -+ mfs->mfsrr_bytes = 0; -+ if (!parent) { -+ bindex = 0; -+ bbot = au_sbbot(sb); -+ } else { -+ bindex = au_dbtop(parent); -+ bbot = au_dbtaildir(parent); -+ } -+ -+ for (; bindex <= bbot; bindex++) { -+ if (parent) { -+ h_parent = au_h_dptr(parent, bindex); -+ if (!h_parent || d_is_negative(h_parent)) -+ continue; -+ } -+ br = au_sbr(sb, bindex); -+ if (au_br_rdonly(br)) -+ continue; -+ -+ /* sb->s_root for NFS is unreliable */ -+ h_path.mnt = au_br_mnt(br); -+ h_path.dentry = h_path.mnt->mnt_root; -+ err = vfs_statfs(&h_path, st); -+ if (unlikely(err)) { -+ AuWarn1("failed statfs, b%d, %d\n", bindex, err); -+ continue; -+ } -+ -+ /* when the available size is equal, select the lower one */ -+ BUILD_BUG_ON(sizeof(b) < sizeof(st->f_bavail) -+ || sizeof(b) < sizeof(st->f_bsize)); -+ b = st->f_bavail * st->f_bsize; -+ br->br_wbr->wbr_bytes = b; -+ if (b >= bavail) { -+ bavail = b; -+ mfs->mfs_bindex = bindex; -+ mfs->mfs_jiffy = jiffies; -+ } -+ } -+ -+ mfs->mfsrr_bytes = bavail; -+ AuDbg("b%d\n", mfs->mfs_bindex); -+ au_kfree_rcu(st); -+} -+ -+static int au_wbr_create_mfs(struct dentry *dentry, unsigned int flags) -+{ -+ int err; -+ struct dentry *parent; -+ struct super_block *sb; -+ struct au_wbr_mfs *mfs; -+ -+ err = au_wbr_create_exp(dentry); -+ if (err >= 0) -+ goto out; -+ -+ sb = dentry->d_sb; -+ parent = NULL; -+ if (au_ftest_wbr(flags, PARENT)) -+ parent = dget_parent(dentry); -+ mfs = &au_sbi(sb)->si_wbr_mfs; -+ mutex_lock(&mfs->mfs_lock); -+ if (time_after(jiffies, mfs->mfs_jiffy + mfs->mfs_expire) -+ || mfs->mfs_bindex < 0 -+ || au_br_rdonly(au_sbr(sb, mfs->mfs_bindex))) -+ au_mfs(dentry, parent); -+ mutex_unlock(&mfs->mfs_lock); -+ err = mfs->mfs_bindex; -+ dput(parent); -+ -+ if (err >= 0) -+ err = au_wbr_nonopq(dentry, err); -+ -+out: -+ AuDbg("b%d\n", err); -+ return err; -+} -+ -+static int au_wbr_create_init_mfs(struct super_block *sb) -+{ -+ struct au_wbr_mfs *mfs; -+ -+ mfs = &au_sbi(sb)->si_wbr_mfs; -+ mutex_init(&mfs->mfs_lock); -+ mfs->mfs_jiffy = 0; -+ mfs->mfs_bindex = -EROFS; -+ -+ return 0; -+} -+ -+static int au_wbr_create_fin_mfs(struct super_block *sb __maybe_unused) -+{ -+ mutex_destroy(&au_sbi(sb)->si_wbr_mfs.mfs_lock); -+ return 0; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* top down regardless parent, and then mfs */ -+static int au_wbr_create_tdmfs(struct dentry *dentry, -+ unsigned int flags __maybe_unused) -+{ -+ int err; -+ aufs_bindex_t bwh, btail, bindex, bfound, bmfs; -+ unsigned long long watermark; -+ struct super_block *sb; -+ struct au_wbr_mfs *mfs; -+ struct au_branch *br; -+ struct dentry *parent; -+ -+ sb = dentry->d_sb; -+ mfs = &au_sbi(sb)->si_wbr_mfs; -+ mutex_lock(&mfs->mfs_lock); -+ if (time_after(jiffies, mfs->mfs_jiffy + mfs->mfs_expire) -+ || mfs->mfs_bindex < 0) -+ au_mfs(dentry, /*parent*/NULL); -+ watermark = mfs->mfsrr_watermark; -+ bmfs = mfs->mfs_bindex; -+ mutex_unlock(&mfs->mfs_lock); -+ -+ /* another style of au_wbr_create_exp() */ -+ bwh = au_dbwh(dentry); -+ parent = dget_parent(dentry); -+ btail = au_dbtaildir(parent); -+ if (bwh >= 0 && bwh < btail) -+ btail = bwh; -+ -+ err = au_wbr_nonopq(dentry, btail); -+ if (unlikely(err < 0)) -+ goto out; -+ btail = err; -+ bfound = -1; -+ for (bindex = 0; bindex <= btail; bindex++) { -+ br = au_sbr(sb, bindex); -+ if (au_br_rdonly(br)) -+ continue; -+ if (br->br_wbr->wbr_bytes > watermark) { -+ bfound = bindex; -+ break; -+ } -+ } -+ err = bfound; -+ if (err < 0) -+ err = bmfs; -+ -+out: -+ dput(parent); -+ AuDbg("b%d\n", err); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* most free space and then round robin */ -+static int au_wbr_create_mfsrr(struct dentry *dentry, unsigned int flags) -+{ -+ int err; -+ struct au_wbr_mfs *mfs; -+ -+ err = au_wbr_create_mfs(dentry, flags); -+ if (err >= 0) { -+ mfs = &au_sbi(dentry->d_sb)->si_wbr_mfs; -+ mutex_lock(&mfs->mfs_lock); -+ if (mfs->mfsrr_bytes < mfs->mfsrr_watermark) -+ err = au_wbr_create_rr(dentry, flags); -+ mutex_unlock(&mfs->mfs_lock); -+ } -+ -+ AuDbg("b%d\n", err); -+ return err; -+} -+ -+static int au_wbr_create_init_mfsrr(struct super_block *sb) -+{ -+ int err; -+ -+ au_wbr_create_init_mfs(sb); /* ignore */ -+ err = au_wbr_create_init_rr(sb); -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* top down parent and most free space */ -+static int au_wbr_create_pmfs(struct dentry *dentry, unsigned int flags) -+{ -+ int err, e2; -+ unsigned long long b; -+ aufs_bindex_t bindex, btop, bbot; -+ struct super_block *sb; -+ struct dentry *parent, *h_parent; -+ struct au_branch *br; -+ -+ err = au_wbr_create_tdp(dentry, flags); -+ if (unlikely(err < 0)) -+ goto out; -+ parent = dget_parent(dentry); -+ btop = au_dbtop(parent); -+ bbot = au_dbtaildir(parent); -+ if (btop == bbot) -+ goto out_parent; /* success */ -+ -+ e2 = au_wbr_create_mfs(dentry, flags); -+ if (e2 < 0) -+ goto out_parent; /* success */ -+ -+ /* when the available size is equal, select upper one */ -+ sb = dentry->d_sb; -+ br = au_sbr(sb, err); -+ b = br->br_wbr->wbr_bytes; -+ AuDbg("b%d, %llu\n", err, b); -+ -+ for (bindex = btop; bindex <= bbot; bindex++) { -+ h_parent = au_h_dptr(parent, bindex); -+ if (!h_parent || d_is_negative(h_parent)) -+ continue; -+ -+ br = au_sbr(sb, bindex); -+ if (!au_br_rdonly(br) && br->br_wbr->wbr_bytes > b) { -+ b = br->br_wbr->wbr_bytes; -+ err = bindex; -+ AuDbg("b%d, %llu\n", err, b); -+ } -+ } -+ -+ if (err >= 0) -+ err = au_wbr_nonopq(dentry, err); -+ -+out_parent: -+ dput(parent); -+out: -+ AuDbg("b%d\n", err); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * - top down parent -+ * - most free space with parent -+ * - most free space round-robin regardless parent -+ */ -+static int au_wbr_create_pmfsrr(struct dentry *dentry, unsigned int flags) -+{ -+ int err; -+ unsigned long long watermark; -+ struct super_block *sb; -+ struct au_branch *br; -+ struct au_wbr_mfs *mfs; -+ -+ err = au_wbr_create_pmfs(dentry, flags | AuWbr_PARENT); -+ if (unlikely(err < 0)) -+ goto out; -+ -+ sb = dentry->d_sb; -+ br = au_sbr(sb, err); -+ mfs = &au_sbi(sb)->si_wbr_mfs; -+ mutex_lock(&mfs->mfs_lock); -+ watermark = mfs->mfsrr_watermark; -+ mutex_unlock(&mfs->mfs_lock); -+ if (br->br_wbr->wbr_bytes < watermark) -+ /* regardless the parent dir */ -+ err = au_wbr_create_mfsrr(dentry, flags); -+ -+out: -+ AuDbg("b%d\n", err); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* policies for copyup */ -+ -+/* top down parent */ -+static int au_wbr_copyup_tdp(struct dentry *dentry) -+{ -+ return au_wbr_create_tdp(dentry, /*flags, anything is ok*/0); -+} -+ -+/* bottom up parent */ -+static int au_wbr_copyup_bup(struct dentry *dentry) -+{ -+ int err; -+ aufs_bindex_t bindex, btop; -+ struct dentry *parent, *h_parent; -+ struct super_block *sb; -+ -+ err = -EROFS; -+ sb = dentry->d_sb; -+ parent = dget_parent(dentry); -+ btop = au_dbtop(parent); -+ for (bindex = au_dbtop(dentry); bindex >= btop; bindex--) { -+ h_parent = au_h_dptr(parent, bindex); -+ if (!h_parent || d_is_negative(h_parent)) -+ continue; -+ -+ if (!au_br_rdonly(au_sbr(sb, bindex))) { -+ err = bindex; -+ break; -+ } -+ } -+ dput(parent); -+ -+ /* bottom up here */ -+ if (unlikely(err < 0)) -+ err = au_wbr_bu(sb, btop - 1); -+ -+ AuDbg("b%d\n", err); -+ return err; -+} -+ -+/* bottom up */ -+int au_wbr_do_copyup_bu(struct dentry *dentry, aufs_bindex_t btop) -+{ -+ int err; -+ -+ err = au_wbr_bu(dentry->d_sb, btop); -+ AuDbg("b%d\n", err); -+ if (err > btop) -+ err = au_wbr_nonopq(dentry, err); -+ -+ AuDbg("b%d\n", err); -+ return err; -+} -+ -+static int au_wbr_copyup_bu(struct dentry *dentry) -+{ -+ int err; -+ aufs_bindex_t btop; -+ -+ btop = au_dbtop(dentry); -+ err = au_wbr_do_copyup_bu(dentry, btop); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+struct au_wbr_copyup_operations au_wbr_copyup_ops[] = { -+ [AuWbrCopyup_TDP] = { -+ .copyup = au_wbr_copyup_tdp -+ }, -+ [AuWbrCopyup_BUP] = { -+ .copyup = au_wbr_copyup_bup -+ }, -+ [AuWbrCopyup_BU] = { -+ .copyup = au_wbr_copyup_bu -+ } -+}; -+ -+struct au_wbr_create_operations au_wbr_create_ops[] = { -+ [AuWbrCreate_TDP] = { -+ .create = au_wbr_create_tdp -+ }, -+ [AuWbrCreate_RR] = { -+ .create = au_wbr_create_rr, -+ .init = au_wbr_create_init_rr -+ }, -+ [AuWbrCreate_MFS] = { -+ .create = au_wbr_create_mfs, -+ .init = au_wbr_create_init_mfs, -+ .fin = au_wbr_create_fin_mfs -+ }, -+ [AuWbrCreate_MFSV] = { -+ .create = au_wbr_create_mfs, -+ .init = au_wbr_create_init_mfs, -+ .fin = au_wbr_create_fin_mfs -+ }, -+ [AuWbrCreate_MFSRR] = { -+ .create = au_wbr_create_mfsrr, -+ .init = au_wbr_create_init_mfsrr, -+ .fin = au_wbr_create_fin_mfs -+ }, -+ [AuWbrCreate_MFSRRV] = { -+ .create = au_wbr_create_mfsrr, -+ .init = au_wbr_create_init_mfsrr, -+ .fin = au_wbr_create_fin_mfs -+ }, -+ [AuWbrCreate_TDMFS] = { -+ .create = au_wbr_create_tdmfs, -+ .init = au_wbr_create_init_mfs, -+ .fin = au_wbr_create_fin_mfs -+ }, -+ [AuWbrCreate_TDMFSV] = { -+ .create = au_wbr_create_tdmfs, -+ .init = au_wbr_create_init_mfs, -+ .fin = au_wbr_create_fin_mfs -+ }, -+ [AuWbrCreate_PMFS] = { -+ .create = au_wbr_create_pmfs, -+ .init = au_wbr_create_init_mfs, -+ .fin = au_wbr_create_fin_mfs -+ }, -+ [AuWbrCreate_PMFSV] = { -+ .create = au_wbr_create_pmfs, -+ .init = au_wbr_create_init_mfs, -+ .fin = au_wbr_create_fin_mfs -+ }, -+ [AuWbrCreate_PMFSRR] = { -+ .create = au_wbr_create_pmfsrr, -+ .init = au_wbr_create_init_mfsrr, -+ .fin = au_wbr_create_fin_mfs -+ }, -+ [AuWbrCreate_PMFSRRV] = { -+ .create = au_wbr_create_pmfsrr, -+ .init = au_wbr_create_init_mfsrr, -+ .fin = au_wbr_create_fin_mfs -+ } -+}; -diff -Naur null/fs/aufs/whout.c linux-5.15.36/fs/aufs/whout.c ---- /dev/null -+++ linux-5.15.36/fs/aufs/whout.c 2022-05-10 16:51:39.878744219 +0300 -@@ -0,0 +1,1072 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program. If not, see . -+ */ -+ -+/* -+ * whiteout for logical deletion and opaque directory -+ */ -+ -+#include "aufs.h" -+ -+#define WH_MASK 0444 -+ -+/* -+ * If a directory contains this file, then it is opaque. We start with the -+ * .wh. flag so that it is blocked by lookup. -+ */ -+static struct qstr diropq_name = QSTR_INIT(AUFS_WH_DIROPQ, -+ sizeof(AUFS_WH_DIROPQ) - 1); -+ -+/* -+ * generate whiteout name, which is NOT terminated by NULL. -+ * @name: original d_name.name -+ * @len: original d_name.len -+ * @wh: whiteout qstr -+ * returns zero when succeeds, otherwise error. -+ * succeeded value as wh->name should be freed by kfree(). -+ */ -+int au_wh_name_alloc(struct qstr *wh, const struct qstr *name) -+{ -+ char *p; -+ -+ if (unlikely(name->len > PATH_MAX - AUFS_WH_PFX_LEN)) -+ return -ENAMETOOLONG; -+ -+ wh->len = name->len + AUFS_WH_PFX_LEN; -+ p = kmalloc(wh->len, GFP_NOFS); -+ wh->name = p; -+ if (p) { -+ memcpy(p, AUFS_WH_PFX, AUFS_WH_PFX_LEN); -+ memcpy(p + AUFS_WH_PFX_LEN, name->name, name->len); -+ /* smp_mb(); */ -+ return 0; -+ } -+ return -ENOMEM; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * test if the @wh_name exists under @h_ppath. -+ * @try_sio specifies the necessary of super-io. -+ */ -+int au_wh_test(struct user_namespace *h_userns, struct path *h_ppath, -+ struct qstr *wh_name, int try_sio) -+{ -+ int err; -+ struct dentry *wh_dentry; -+ -+ if (!try_sio) -+ wh_dentry = vfsub_lkup_one(wh_name, h_ppath); -+ else -+ wh_dentry = au_sio_lkup_one(h_userns, wh_name, h_ppath); -+ err = PTR_ERR(wh_dentry); -+ if (IS_ERR(wh_dentry)) { -+ if (err == -ENAMETOOLONG) -+ err = 0; -+ goto out; -+ } -+ -+ err = 0; -+ if (d_is_negative(wh_dentry)) -+ goto out_wh; /* success */ -+ -+ err = 1; -+ if (d_is_reg(wh_dentry)) -+ goto out_wh; /* success */ -+ -+ err = -EIO; -+ AuIOErr("%pd Invalid whiteout entry type 0%o.\n", -+ wh_dentry, d_inode(wh_dentry)->i_mode); -+ -+out_wh: -+ dput(wh_dentry); -+out: -+ return err; -+} -+ -+/* -+ * test if the @h_path->dentry sets opaque or not. -+ */ -+int au_diropq_test(struct user_namespace *h_userns, struct path *h_path) -+{ -+ int err; -+ struct inode *h_dir; -+ -+ h_dir = d_inode(h_path->dentry); -+ err = au_wh_test(h_userns, h_path, &diropq_name, -+ au_test_h_perm_sio(h_userns, h_dir, MAY_EXEC)); -+ return err; -+} -+ -+/* -+ * returns a negative dentry whose name is unique and temporary. -+ */ -+struct dentry *au_whtmp_lkup(struct dentry *h_parent, struct au_branch *br, -+ struct qstr *prefix) -+{ -+ struct dentry *dentry; -+ int i; -+ char defname[NAME_MAX - AUFS_MAX_NAMELEN + DNAME_INLINE_LEN + 1], -+ *name, *p; -+ /* strict atomic_t is unnecessary here */ -+ static unsigned short cnt; -+ struct qstr qs; -+ struct path h_ppath; -+ struct user_namespace *h_userns; -+ -+ BUILD_BUG_ON(sizeof(cnt) * 2 > AUFS_WH_TMP_LEN); -+ -+ name = defname; -+ qs.len = sizeof(defname) - DNAME_INLINE_LEN + prefix->len - 1; -+ if (unlikely(prefix->len > DNAME_INLINE_LEN)) { -+ dentry = ERR_PTR(-ENAMETOOLONG); -+ if (unlikely(qs.len > NAME_MAX)) -+ goto out; -+ dentry = ERR_PTR(-ENOMEM); -+ name = kmalloc(qs.len + 1, GFP_NOFS); -+ if (unlikely(!name)) -+ goto out; -+ } -+ -+ /* doubly whiteout-ed */ -+ memcpy(name, AUFS_WH_PFX AUFS_WH_PFX, AUFS_WH_PFX_LEN * 2); -+ p = name + AUFS_WH_PFX_LEN * 2; -+ memcpy(p, prefix->name, prefix->len); -+ p += prefix->len; -+ *p++ = '.'; -+ AuDebugOn(name + qs.len + 1 - p <= AUFS_WH_TMP_LEN); -+ -+ h_ppath.dentry = h_parent; -+ h_ppath.mnt = au_br_mnt(br); -+ h_userns = au_br_userns(br); -+ qs.name = name; -+ for (i = 0; i < 3; i++) { -+ sprintf(p, "%.*x", AUFS_WH_TMP_LEN, cnt++); -+ dentry = au_sio_lkup_one(h_userns, &qs, &h_ppath); -+ if (IS_ERR(dentry) || d_is_negative(dentry)) -+ goto out_name; -+ dput(dentry); -+ } -+ /* pr_warn("could not get random name\n"); */ -+ dentry = ERR_PTR(-EEXIST); -+ AuDbg("%.*s\n", AuLNPair(&qs)); -+ BUG(); -+ -+out_name: -+ if (name != defname) -+ au_kfree_try_rcu(name); -+out: -+ AuTraceErrPtr(dentry); -+ return dentry; -+} -+ -+/* -+ * rename the @h_dentry on @br to the whiteouted temporary name. -+ */ -+int au_whtmp_ren(struct dentry *h_dentry, struct au_branch *br) -+{ -+ int err; -+ struct path h_path = { -+ .mnt = au_br_mnt(br) -+ }; -+ struct inode *h_dir, *delegated; -+ struct dentry *h_parent; -+ -+ h_parent = h_dentry->d_parent; /* dir inode is locked */ -+ h_dir = d_inode(h_parent); -+ IMustLock(h_dir); -+ -+ h_path.dentry = au_whtmp_lkup(h_parent, br, &h_dentry->d_name); -+ err = PTR_ERR(h_path.dentry); -+ if (IS_ERR(h_path.dentry)) -+ 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); -+ 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: -+ AuTraceErr(err); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+/* -+ * functions for removing a whiteout -+ */ -+ -+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. -+ * this may be a violation of unix fs semantics. -+ */ -+ 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); -+ } -+ return err; -+} -+ -+int au_wh_unlink_dentry(struct inode *h_dir, struct path *h_path, -+ struct dentry *dentry) -+{ -+ int err; -+ -+ err = do_unlink_wh(h_dir, h_path); -+ if (!err && dentry) -+ au_set_dbwh(dentry, -1); -+ -+ return err; -+} -+ -+static int unlink_wh_name(struct path *h_ppath, struct qstr *wh) -+{ -+ int err; -+ struct path h_path; -+ -+ err = 0; -+ h_path.dentry = vfsub_lkup_one(wh, h_ppath); -+ if (IS_ERR(h_path.dentry)) -+ err = PTR_ERR(h_path.dentry); -+ else { -+ if (d_is_reg(h_path.dentry)) { -+ h_path.mnt = h_ppath->mnt; -+ err = do_unlink_wh(d_inode(h_ppath->dentry), &h_path); -+ } -+ dput(h_path.dentry); -+ } -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+/* -+ * initialize/clean whiteout for a branch -+ */ -+ -+static void au_wh_clean(struct inode *h_dir, struct path *whpath, -+ 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); -+ } -+ } -+ if (unlikely(err)) -+ pr_warn("failed removing %pd (%d), ignored.\n", -+ whpath->dentry, err); -+} -+ -+static int test_linkable(struct dentry *h_root) -+{ -+ struct inode *h_dir = d_inode(h_root); -+ -+ if (h_dir->i_op->link) -+ return 0; -+ -+ pr_err("%pd (%s) doesn't support link(2), use noplink and rw+nolwh\n", -+ h_root, au_sbtype(h_root->d_sb)); -+ return -ENOSYS; /* the branch doesn't have its ->link() */ -+} -+ -+/* todo: should this mkdir be done in /sbin/mount.aufs helper? */ -+static int au_whdir(struct inode *h_dir, struct path *path) -+{ -+ int err; -+ -+ err = -EEXIST; -+ if (d_is_negative(path->dentry)) { -+ int mode = 0700; -+ -+ if (au_test_nfs(path->dentry->d_sb)) -+ mode |= 0111; -+ err = vfsub_mkdir(h_dir, path, mode); -+ } else if (d_is_dir(path->dentry)) -+ err = 0; -+ else -+ pr_err("unknown %pd exists\n", path->dentry); -+ -+ return err; -+} -+ -+struct au_wh_base { -+ const struct qstr *name; -+ struct dentry *dentry; -+}; -+ -+static void au_wh_init_ro(struct inode *h_dir, struct au_wh_base base[], -+ struct path *h_path) -+{ -+ h_path->dentry = base[AuBrWh_BASE].dentry; -+ au_wh_clean(h_dir, h_path, /*isdir*/0); -+ h_path->dentry = base[AuBrWh_PLINK].dentry; -+ au_wh_clean(h_dir, h_path, /*isdir*/1); -+ h_path->dentry = base[AuBrWh_ORPH].dentry; -+ au_wh_clean(h_dir, h_path, /*isdir*/1); -+} -+ -+/* -+ * returns tri-state, -+ * minus: error, caller should print the message -+ * zero: success -+ * plus: error, caller should NOT print the message -+ */ -+static int au_wh_init_rw_nolink(struct dentry *h_root, struct au_wbr *wbr, -+ int do_plink, struct au_wh_base base[], -+ struct path *h_path) -+{ -+ int err; -+ struct inode *h_dir; -+ -+ h_dir = d_inode(h_root); -+ h_path->dentry = base[AuBrWh_BASE].dentry; -+ au_wh_clean(h_dir, h_path, /*isdir*/0); -+ h_path->dentry = base[AuBrWh_PLINK].dentry; -+ if (do_plink) { -+ err = test_linkable(h_root); -+ if (unlikely(err)) { -+ err = 1; -+ goto out; -+ } -+ -+ err = au_whdir(h_dir, h_path); -+ if (unlikely(err)) -+ goto out; -+ wbr->wbr_plink = dget(base[AuBrWh_PLINK].dentry); -+ } else -+ au_wh_clean(h_dir, h_path, /*isdir*/1); -+ h_path->dentry = base[AuBrWh_ORPH].dentry; -+ err = au_whdir(h_dir, h_path); -+ if (unlikely(err)) -+ goto out; -+ wbr->wbr_orph = dget(base[AuBrWh_ORPH].dentry); -+ -+out: -+ return err; -+} -+ -+/* -+ * for the moment, aufs supports the branch filesystem which does not support -+ * link(2). testing on FAT which does not support i_op->setattr() fully either, -+ * copyup failed. finally, such filesystem will not be used as the writable -+ * branch. -+ * -+ * returns tri-state, see above. -+ */ -+static int au_wh_init_rw(struct dentry *h_root, struct au_wbr *wbr, -+ int do_plink, struct au_wh_base base[], -+ struct path *h_path) -+{ -+ int err; -+ struct inode *h_dir; -+ -+ WbrWhMustWriteLock(wbr); -+ -+ err = test_linkable(h_root); -+ if (unlikely(err)) { -+ err = 1; -+ goto out; -+ } -+ -+ /* -+ * todo: should this create be done in /sbin/mount.aufs helper? -+ */ -+ err = -EEXIST; -+ h_dir = d_inode(h_root); -+ if (d_is_negative(base[AuBrWh_BASE].dentry)) { -+ h_path->dentry = base[AuBrWh_BASE].dentry; -+ err = vfsub_create(h_dir, h_path, WH_MASK, /*want_excl*/true); -+ } else if (d_is_reg(base[AuBrWh_BASE].dentry)) -+ err = 0; -+ else -+ pr_err("unknown %pd2 exists\n", base[AuBrWh_BASE].dentry); -+ if (unlikely(err)) -+ goto out; -+ -+ h_path->dentry = base[AuBrWh_PLINK].dentry; -+ if (do_plink) { -+ err = au_whdir(h_dir, h_path); -+ if (unlikely(err)) -+ goto out; -+ wbr->wbr_plink = dget(base[AuBrWh_PLINK].dentry); -+ } else -+ au_wh_clean(h_dir, h_path, /*isdir*/1); -+ wbr->wbr_whbase = dget(base[AuBrWh_BASE].dentry); -+ -+ h_path->dentry = base[AuBrWh_ORPH].dentry; -+ err = au_whdir(h_dir, h_path); -+ if (unlikely(err)) -+ goto out; -+ wbr->wbr_orph = dget(base[AuBrWh_ORPH].dentry); -+ -+out: -+ return err; -+} -+ -+/* -+ * initialize the whiteout base file/dir for @br. -+ */ -+int au_wh_init(struct au_branch *br, struct super_block *sb) -+{ -+ int err, i; -+ const unsigned char do_plink -+ = !!au_opt_test(au_mntflags(sb), PLINK); -+ struct inode *h_dir; -+ struct path path = br->br_path; -+ struct dentry *h_root = path.dentry; -+ struct au_wbr *wbr = br->br_wbr; -+ static const struct qstr base_name[] = { -+ [AuBrWh_BASE] = QSTR_INIT(AUFS_BASE_NAME, -+ sizeof(AUFS_BASE_NAME) - 1), -+ [AuBrWh_PLINK] = QSTR_INIT(AUFS_PLINKDIR_NAME, -+ sizeof(AUFS_PLINKDIR_NAME) - 1), -+ [AuBrWh_ORPH] = QSTR_INIT(AUFS_ORPHDIR_NAME, -+ sizeof(AUFS_ORPHDIR_NAME) - 1) -+ }; -+ struct au_wh_base base[] = { -+ [AuBrWh_BASE] = { -+ .name = base_name + AuBrWh_BASE, -+ .dentry = NULL -+ }, -+ [AuBrWh_PLINK] = { -+ .name = base_name + AuBrWh_PLINK, -+ .dentry = NULL -+ }, -+ [AuBrWh_ORPH] = { -+ .name = base_name + AuBrWh_ORPH, -+ .dentry = NULL -+ } -+ }; -+ -+ if (wbr) -+ WbrWhMustWriteLock(wbr); -+ -+ for (i = 0; i < AuBrWh_Last; i++) { -+ /* doubly whiteouted */ -+ struct dentry *d; -+ -+ d = au_wh_lkup(h_root, (void *)base[i].name, br); -+ err = PTR_ERR(d); -+ if (IS_ERR(d)) -+ goto out; -+ -+ base[i].dentry = d; -+ AuDebugOn(wbr -+ && wbr->wbr_wh[i] -+ && wbr->wbr_wh[i] != base[i].dentry); -+ } -+ -+ if (wbr) -+ for (i = 0; i < AuBrWh_Last; i++) { -+ dput(wbr->wbr_wh[i]); -+ wbr->wbr_wh[i] = NULL; -+ } -+ -+ err = 0; -+ if (!au_br_writable(br->br_perm)) { -+ h_dir = d_inode(h_root); -+ au_wh_init_ro(h_dir, base, &path); -+ } else if (!au_br_wh_linkable(br->br_perm)) { -+ err = au_wh_init_rw_nolink(h_root, wbr, do_plink, base, &path); -+ if (err > 0) -+ goto out; -+ else if (err) -+ goto out_err; -+ } else { -+ err = au_wh_init_rw(h_root, wbr, do_plink, base, &path); -+ if (err > 0) -+ goto out; -+ else if (err) -+ goto out_err; -+ } -+ goto out; /* success */ -+ -+out_err: -+ pr_err("an error(%d) on the writable branch %pd(%s)\n", -+ err, h_root, au_sbtype(h_root->d_sb)); -+out: -+ for (i = 0; i < AuBrWh_Last; i++) -+ dput(base[i].dentry); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+/* -+ * whiteouts are all hard-linked usually. -+ * when its link count reaches a ceiling, we create a new whiteout base -+ * asynchronously. -+ */ -+ -+struct reinit_br_wh { -+ struct super_block *sb; -+ struct au_branch *br; -+}; -+ -+static void reinit_br_wh(void *arg) -+{ -+ int err; -+ aufs_bindex_t bindex; -+ struct path h_path; -+ struct reinit_br_wh *a = arg; -+ struct au_wbr *wbr; -+ struct inode *dir, *delegated; -+ struct dentry *h_root; -+ struct au_hinode *hdir; -+ -+ err = 0; -+ wbr = a->br->br_wbr; -+ /* big aufs lock */ -+ si_noflush_write_lock(a->sb); -+ if (!au_br_writable(a->br->br_perm)) -+ goto out; -+ bindex = au_br_index(a->sb, a->br->br_id); -+ if (unlikely(bindex < 0)) -+ goto out; -+ -+ di_read_lock_parent(a->sb->s_root, AuLock_IR); -+ dir = d_inode(a->sb->s_root); -+ hdir = au_hi(dir, bindex); -+ h_root = au_h_dptr(a->sb->s_root, bindex); -+ AuDebugOn(h_root != au_br_dentry(a->br)); -+ -+ au_hn_inode_lock_nested(hdir, AuLsc_I_PARENT); -+ wbr_wh_write_lock(wbr); -+ err = au_h_verify(wbr->wbr_whbase, au_opt_udba(a->sb), hdir->hi_inode, -+ h_root, a->br); -+ 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); -+ } -+ } else { -+ pr_warn("%pd is moved, ignored\n", wbr->wbr_whbase); -+ err = 0; -+ } -+ dput(wbr->wbr_whbase); -+ wbr->wbr_whbase = NULL; -+ if (!err) -+ err = au_wh_init(a->br, a->sb); -+ wbr_wh_write_unlock(wbr); -+ au_hn_inode_unlock(hdir); -+ di_read_unlock(a->sb->s_root, AuLock_IR); -+ if (!err) -+ au_fhsm_wrote(a->sb, bindex, /*force*/0); -+ -+out: -+ if (wbr) -+ atomic_dec(&wbr->wbr_wh_running); -+ au_lcnt_dec(&a->br->br_count); -+ si_write_unlock(a->sb); -+ au_nwt_done(&au_sbi(a->sb)->si_nowait); -+ au_kfree_rcu(a); -+ if (unlikely(err)) -+ AuIOErr("err %d\n", err); -+} -+ -+static void kick_reinit_br_wh(struct super_block *sb, struct au_branch *br) -+{ -+ int do_dec, wkq_err; -+ struct reinit_br_wh *arg; -+ -+ do_dec = 1; -+ if (atomic_inc_return(&br->br_wbr->wbr_wh_running) != 1) -+ goto out; -+ -+ /* ignore ENOMEM */ -+ arg = kmalloc(sizeof(*arg), GFP_NOFS); -+ if (arg) { -+ /* -+ * dec(wh_running), kfree(arg) and dec(br_count) -+ * in reinit function -+ */ -+ arg->sb = sb; -+ arg->br = br; -+ au_lcnt_inc(&br->br_count); -+ wkq_err = au_wkq_nowait(reinit_br_wh, arg, sb, /*flags*/0); -+ if (unlikely(wkq_err)) { -+ atomic_dec(&br->br_wbr->wbr_wh_running); -+ au_lcnt_dec(&br->br_count); -+ au_kfree_rcu(arg); -+ } -+ do_dec = 0; -+ } -+ -+out: -+ if (do_dec) -+ atomic_dec(&br->br_wbr->wbr_wh_running); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * create the whiteout @wh. -+ */ -+static int link_or_create_wh(struct super_block *sb, aufs_bindex_t bindex, -+ struct dentry *wh) -+{ -+ int err; -+ struct path h_path = { -+ .dentry = wh -+ }; -+ struct au_branch *br; -+ struct au_wbr *wbr; -+ struct dentry *h_parent; -+ struct inode *h_dir, *delegated; -+ -+ h_parent = wh->d_parent; /* dir inode is locked */ -+ h_dir = d_inode(h_parent); -+ IMustLock(h_dir); -+ -+ br = au_sbr(sb, bindex); -+ h_path.mnt = au_br_mnt(br); -+ 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); -+ } -+ if (!err || err != -EMLINK) -+ goto out; -+ -+ /* link count full. re-initialize br_whbase. */ -+ kick_reinit_br_wh(sb, br); -+ } -+ -+ /* return this error in this context */ -+ err = vfsub_create(h_dir, &h_path, WH_MASK, /*want_excl*/true); -+ if (!err) -+ au_fhsm_wrote(sb, bindex, /*force*/0); -+ -+out: -+ wbr_wh_read_unlock(wbr); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * create or remove the diropq. -+ */ -+static struct dentry *do_diropq(struct dentry *dentry, aufs_bindex_t bindex, -+ unsigned int flags) -+{ -+ struct dentry *opq_dentry; -+ struct super_block *sb; -+ struct au_branch *br; -+ struct path h_path; -+ int err; -+ -+ sb = dentry->d_sb; -+ br = au_sbr(sb, bindex); -+ h_path.dentry = au_h_dptr(dentry, bindex); -+ h_path.mnt = au_br_mnt(br); -+ opq_dentry = vfsub_lkup_one(&diropq_name, &h_path); -+ if (IS_ERR(opq_dentry)) -+ goto out; -+ -+ if (au_ftest_diropq(flags, CREATE)) { -+ err = link_or_create_wh(sb, bindex, opq_dentry); -+ if (!err) { -+ au_set_dbdiropq(dentry, bindex); -+ goto out; /* success */ -+ } -+ } else { -+ h_path.dentry = opq_dentry; -+ err = do_unlink_wh(au_h_iptr(d_inode(dentry), bindex), &h_path); -+ if (!err) -+ au_set_dbdiropq(dentry, -1); -+ } -+ dput(opq_dentry); -+ opq_dentry = ERR_PTR(err); -+ -+out: -+ return opq_dentry; -+} -+ -+struct do_diropq_args { -+ struct dentry **errp; -+ struct dentry *dentry; -+ aufs_bindex_t bindex; -+ unsigned int flags; -+}; -+ -+static void call_do_diropq(void *args) -+{ -+ struct do_diropq_args *a = args; -+ *a->errp = do_diropq(a->dentry, a->bindex, a->flags); -+} -+ -+struct dentry *au_diropq_sio(struct dentry *dentry, aufs_bindex_t bindex, -+ unsigned int flags) -+{ -+ struct dentry *diropq, *h_dentry; -+ struct user_namespace *h_userns; -+ -+ h_userns = au_sbr_userns(dentry->d_sb, bindex); -+ h_dentry = au_h_dptr(dentry, bindex); -+ if (!au_test_h_perm_sio(h_userns, d_inode(h_dentry), -+ MAY_EXEC | MAY_WRITE)) -+ diropq = do_diropq(dentry, bindex, flags); -+ else { -+ int wkq_err; -+ struct do_diropq_args args = { -+ .errp = &diropq, -+ .dentry = dentry, -+ .bindex = bindex, -+ .flags = flags -+ }; -+ -+ wkq_err = au_wkq_wait(call_do_diropq, &args); -+ if (unlikely(wkq_err)) -+ diropq = ERR_PTR(wkq_err); -+ } -+ -+ return diropq; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * lookup whiteout dentry. -+ * @h_parent: lower parent dentry which must exist and be locked -+ * @base_name: name of dentry which will be whiteouted -+ * returns dentry for whiteout. -+ */ -+struct dentry *au_wh_lkup(struct dentry *h_parent, struct qstr *base_name, -+ struct au_branch *br) -+{ -+ int err; -+ struct qstr wh_name; -+ struct dentry *wh_dentry; -+ struct path h_path; -+ -+ err = au_wh_name_alloc(&wh_name, base_name); -+ wh_dentry = ERR_PTR(err); -+ if (!err) { -+ h_path.dentry = h_parent; -+ h_path.mnt = au_br_mnt(br); -+ wh_dentry = vfsub_lkup_one(&wh_name, &h_path); -+ au_kfree_try_rcu(wh_name.name); -+ } -+ return wh_dentry; -+} -+ -+/* -+ * link/create a whiteout for @dentry on @bindex. -+ */ -+struct dentry *au_wh_create(struct dentry *dentry, aufs_bindex_t bindex, -+ struct dentry *h_parent) -+{ -+ struct dentry *wh_dentry; -+ struct super_block *sb; -+ int err; -+ -+ sb = dentry->d_sb; -+ wh_dentry = au_wh_lkup(h_parent, &dentry->d_name, au_sbr(sb, bindex)); -+ if (!IS_ERR(wh_dentry) && d_is_negative(wh_dentry)) { -+ err = link_or_create_wh(sb, bindex, wh_dentry); -+ if (!err) { -+ au_set_dbwh(dentry, bindex); -+ au_fhsm_wrote(sb, bindex, /*force*/0); -+ } else { -+ dput(wh_dentry); -+ wh_dentry = ERR_PTR(err); -+ } -+ } -+ -+ return wh_dentry; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* Delete all whiteouts in this directory on branch bindex. */ -+static int del_wh_children(struct path *h_path, struct au_nhash *whlist, -+ aufs_bindex_t bindex) -+{ -+ int err; -+ unsigned long ul, n; -+ struct qstr wh_name; -+ char *p; -+ struct hlist_head *head; -+ struct au_vdir_wh *pos; -+ struct au_vdir_destr *str; -+ -+ err = -ENOMEM; -+ p = (void *)__get_free_page(GFP_NOFS); -+ wh_name.name = p; -+ if (unlikely(!wh_name.name)) -+ goto out; -+ -+ err = 0; -+ memcpy(p, AUFS_WH_PFX, AUFS_WH_PFX_LEN); -+ p += AUFS_WH_PFX_LEN; -+ n = whlist->nh_num; -+ head = whlist->nh_head; -+ for (ul = 0; !err && ul < n; ul++, head++) { -+ hlist_for_each_entry(pos, head, wh_hash) { -+ if (pos->wh_bindex != bindex) -+ continue; -+ -+ str = &pos->wh_str; -+ if (str->len + AUFS_WH_PFX_LEN <= PATH_MAX) { -+ memcpy(p, str->name, str->len); -+ wh_name.len = AUFS_WH_PFX_LEN + str->len; -+ err = unlink_wh_name(h_path, &wh_name); -+ if (!err) -+ continue; -+ break; -+ } -+ AuIOErr("whiteout name too long %.*s\n", -+ str->len, str->name); -+ err = -EIO; -+ break; -+ } -+ } -+ free_page((unsigned long)wh_name.name); -+ -+out: -+ return err; -+} -+ -+struct del_wh_children_args { -+ int *errp; -+ struct path *h_path; -+ struct au_nhash *whlist; -+ aufs_bindex_t bindex; -+}; -+ -+static void call_del_wh_children(void *args) -+{ -+ struct del_wh_children_args *a = args; -+ *a->errp = del_wh_children(a->h_path, a->whlist, a->bindex); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+struct au_whtmp_rmdir *au_whtmp_rmdir_alloc(struct super_block *sb, gfp_t gfp) -+{ -+ struct au_whtmp_rmdir *whtmp; -+ int err; -+ unsigned int rdhash; -+ -+ SiMustAnyLock(sb); -+ -+ whtmp = kzalloc(sizeof(*whtmp), gfp); -+ if (unlikely(!whtmp)) { -+ whtmp = ERR_PTR(-ENOMEM); -+ goto out; -+ } -+ -+ /* no estimation for dir size */ -+ rdhash = au_sbi(sb)->si_rdhash; -+ if (!rdhash) -+ rdhash = AUFS_RDHASH_DEF; -+ err = au_nhash_alloc(&whtmp->whlist, rdhash, gfp); -+ if (unlikely(err)) { -+ au_kfree_rcu(whtmp); -+ whtmp = ERR_PTR(err); -+ } -+ -+out: -+ return whtmp; -+} -+ -+void au_whtmp_rmdir_free(struct au_whtmp_rmdir *whtmp) -+{ -+ if (whtmp->br) -+ au_lcnt_dec(&whtmp->br->br_count); -+ dput(whtmp->wh_dentry); -+ iput(whtmp->dir); -+ au_nhash_wh_free(&whtmp->whlist); -+ au_kfree_rcu(whtmp); -+} -+ -+/* -+ * rmdir the whiteouted temporary named dir @h_dentry. -+ * @whlist: whiteouted children. -+ */ -+int au_whtmp_rmdir(struct inode *dir, aufs_bindex_t bindex, -+ struct dentry *wh_dentry, struct au_nhash *whlist) -+{ -+ int err; -+ unsigned int h_nlink; -+ struct path wh_path; -+ struct inode *wh_inode, *h_dir; -+ struct au_branch *br; -+ struct user_namespace *h_userns; -+ -+ h_dir = d_inode(wh_dentry->d_parent); /* dir inode is locked */ -+ IMustLock(h_dir); -+ -+ br = au_sbr(dir->i_sb, bindex); -+ wh_path.dentry = wh_dentry; -+ wh_path.mnt = au_br_mnt(br); -+ h_userns = au_br_userns(br); -+ wh_inode = d_inode(wh_dentry); -+ inode_lock_nested(wh_inode, AuLsc_I_CHILD); -+ -+ /* -+ * someone else might change some whiteouts while we were sleeping. -+ * it means this whlist may have an obsoleted entry. -+ */ -+ if (!au_test_h_perm_sio(h_userns, wh_inode, MAY_EXEC | MAY_WRITE)) -+ err = del_wh_children(&wh_path, whlist, bindex); -+ else { -+ int wkq_err; -+ struct del_wh_children_args args = { -+ .errp = &err, -+ .h_path = &wh_path, -+ .whlist = whlist, -+ .bindex = bindex -+ }; -+ -+ wkq_err = au_wkq_wait(call_del_wh_children, &args); -+ if (unlikely(wkq_err)) -+ err = wkq_err; -+ } -+ inode_unlock(wh_inode); -+ -+ if (!err) { -+ h_nlink = h_dir->i_nlink; -+ err = vfsub_rmdir(h_dir, &wh_path); -+ /* some fs doesn't change the parent nlink in some cases */ -+ h_nlink -= h_dir->i_nlink; -+ } -+ -+ if (!err) { -+ if (au_ibtop(dir) == bindex) { -+ /* todo: dir->i_mutex is necessary */ -+ au_cpup_attr_timesizes(dir); -+ if (h_nlink) -+ vfsub_drop_nlink(dir); -+ } -+ return 0; /* success */ -+ } -+ -+ pr_warn("failed removing %pd(%d), ignored\n", wh_dentry, err); -+ return err; -+} -+ -+static void call_rmdir_whtmp(void *args) -+{ -+ int err; -+ aufs_bindex_t bindex; -+ struct au_whtmp_rmdir *a = args; -+ struct super_block *sb; -+ struct dentry *h_parent; -+ struct inode *h_dir; -+ struct au_hinode *hdir; -+ -+ /* rmdir by nfsd may cause deadlock with this i_mutex */ -+ /* inode_lock(a->dir); */ -+ err = -EROFS; -+ sb = a->dir->i_sb; -+ si_read_lock(sb, !AuLock_FLUSH); -+ if (!au_br_writable(a->br->br_perm)) -+ goto out; -+ bindex = au_br_index(sb, a->br->br_id); -+ if (unlikely(bindex < 0)) -+ goto out; -+ -+ err = -EIO; -+ ii_write_lock_parent(a->dir); -+ h_parent = dget_parent(a->wh_dentry); -+ h_dir = d_inode(h_parent); -+ hdir = au_hi(a->dir, bindex); -+ err = vfsub_mnt_want_write(au_br_mnt(a->br)); -+ if (unlikely(err)) -+ goto out_mnt; -+ au_hn_inode_lock_nested(hdir, AuLsc_I_PARENT); -+ err = au_h_verify(a->wh_dentry, au_opt_udba(sb), h_dir, h_parent, -+ a->br); -+ if (!err) -+ err = au_whtmp_rmdir(a->dir, bindex, a->wh_dentry, &a->whlist); -+ au_hn_inode_unlock(hdir); -+ vfsub_mnt_drop_write(au_br_mnt(a->br)); -+ -+out_mnt: -+ dput(h_parent); -+ ii_write_unlock(a->dir); -+out: -+ /* inode_unlock(a->dir); */ -+ au_whtmp_rmdir_free(a); -+ si_read_unlock(sb); -+ au_nwt_done(&au_sbi(sb)->si_nowait); -+ if (unlikely(err)) -+ AuIOErr("err %d\n", err); -+} -+ -+void au_whtmp_kick_rmdir(struct inode *dir, aufs_bindex_t bindex, -+ struct dentry *wh_dentry, struct au_whtmp_rmdir *args) -+{ -+ int wkq_err; -+ struct super_block *sb; -+ -+ IMustLock(dir); -+ -+ /* all post-process will be done in do_rmdir_whtmp(). */ -+ sb = dir->i_sb; -+ args->dir = au_igrab(dir); -+ args->br = au_sbr(sb, bindex); -+ au_lcnt_inc(&args->br->br_count); -+ args->wh_dentry = dget(wh_dentry); -+ wkq_err = au_wkq_nowait(call_rmdir_whtmp, args, sb, /*flags*/0); -+ if (unlikely(wkq_err)) { -+ pr_warn("rmdir error %pd (%d), ignored\n", wh_dentry, wkq_err); -+ au_whtmp_rmdir_free(args); -+ } -+} -diff -Naur null/fs/aufs/whout.h linux-5.15.36/fs/aufs/whout.h ---- /dev/null -+++ linux-5.15.36/fs/aufs/whout.h 2022-05-10 16:51:39.878744219 +0300 -@@ -0,0 +1,87 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program. If not, see . -+ */ -+ -+/* -+ * whiteout for logical deletion and opaque directory -+ */ -+ -+#ifndef __AUFS_WHOUT_H__ -+#define __AUFS_WHOUT_H__ -+ -+#ifdef __KERNEL__ -+ -+#include "dir.h" -+ -+/* whout.c */ -+int au_wh_name_alloc(struct qstr *wh, const struct qstr *name); -+int au_wh_test(struct user_namespace *h_userns, struct path *h_ppath, -+ struct qstr *wh_name, int try_sio); -+int au_diropq_test(struct user_namespace *h_userns, struct path *h_path); -+struct au_branch; -+struct dentry *au_whtmp_lkup(struct dentry *h_parent, struct au_branch *br, -+ struct qstr *prefix); -+int au_whtmp_ren(struct dentry *h_dentry, struct au_branch *br); -+int au_wh_unlink_dentry(struct inode *h_dir, struct path *h_path, -+ struct dentry *dentry); -+int au_wh_init(struct au_branch *br, struct super_block *sb); -+ -+/* diropq flags */ -+#define AuDiropq_CREATE 1 -+#define au_ftest_diropq(flags, name) ((flags) & AuDiropq_##name) -+#define au_fset_diropq(flags, name) \ -+ do { (flags) |= AuDiropq_##name; } while (0) -+#define au_fclr_diropq(flags, name) \ -+ do { (flags) &= ~AuDiropq_##name; } while (0) -+ -+struct dentry *au_diropq_sio(struct dentry *dentry, aufs_bindex_t bindex, -+ unsigned int flags); -+struct dentry *au_wh_lkup(struct dentry *h_parent, struct qstr *base_name, -+ struct au_branch *br); -+struct dentry *au_wh_create(struct dentry *dentry, aufs_bindex_t bindex, -+ struct dentry *h_parent); -+ -+/* real rmdir for the whiteout-ed dir */ -+struct au_whtmp_rmdir { -+ struct inode *dir; -+ struct au_branch *br; -+ struct dentry *wh_dentry; -+ struct au_nhash whlist; -+}; -+ -+struct au_whtmp_rmdir *au_whtmp_rmdir_alloc(struct super_block *sb, gfp_t gfp); -+void au_whtmp_rmdir_free(struct au_whtmp_rmdir *whtmp); -+int au_whtmp_rmdir(struct inode *dir, aufs_bindex_t bindex, -+ struct dentry *wh_dentry, struct au_nhash *whlist); -+void au_whtmp_kick_rmdir(struct inode *dir, aufs_bindex_t bindex, -+ struct dentry *wh_dentry, struct au_whtmp_rmdir *args); -+ -+/* ---------------------------------------------------------------------- */ -+ -+static inline struct dentry *au_diropq_create(struct dentry *dentry, -+ aufs_bindex_t bindex) -+{ -+ return au_diropq_sio(dentry, bindex, AuDiropq_CREATE); -+} -+ -+static inline int au_diropq_remove(struct dentry *dentry, aufs_bindex_t bindex) -+{ -+ return PTR_ERR(au_diropq_sio(dentry, bindex, !AuDiropq_CREATE)); -+} -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_WHOUT_H__ */ -diff -Naur null/fs/aufs/wkq.c linux-5.15.36/fs/aufs/wkq.c ---- /dev/null -+++ linux-5.15.36/fs/aufs/wkq.c 2022-05-10 16:51:39.878744219 +0300 -@@ -0,0 +1,372 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program. If not, see . -+ */ -+ -+/* -+ * workqueue for asynchronous/super-io operations -+ * todo: try new credential scheme -+ */ -+ -+#include -+#include "aufs.h" -+ -+/* internal workqueue named AUFS_WKQ_NAME */ -+ -+static struct workqueue_struct *au_wkq; -+ -+struct au_wkinfo { -+ struct work_struct wk; -+ struct kobject *kobj; -+ -+ unsigned int flags; /* see wkq.h */ -+ -+ au_wkq_func_t func; -+ void *args; -+ -+#ifdef CONFIG_LOCKDEP -+ int dont_check; -+ struct held_lock **hlock; -+#endif -+ -+ struct completion *comp; -+}; -+ -+/* ---------------------------------------------------------------------- */ -+/* -+ * Aufs passes some operations to the workqueue such as the internal copyup. -+ * This scheme looks rather unnatural for LOCKDEP debugging feature, since the -+ * job run by workqueue depends upon the locks acquired in the other task. -+ * Delegating a small operation to the workqueue, aufs passes its lockdep -+ * information too. And the job in the workqueue restores the info in order to -+ * pretend as if it acquired those locks. This is just to make LOCKDEP work -+ * correctly and expectedly. -+ */ -+ -+#ifndef CONFIG_LOCKDEP -+AuStubInt0(au_wkq_lockdep_alloc, struct au_wkinfo *wkinfo); -+AuStubVoid(au_wkq_lockdep_free, struct au_wkinfo *wkinfo); -+AuStubVoid(au_wkq_lockdep_pre, struct au_wkinfo *wkinfo); -+AuStubVoid(au_wkq_lockdep_post, struct au_wkinfo *wkinfo); -+AuStubVoid(au_wkq_lockdep_init, struct au_wkinfo *wkinfo); -+#else -+static void au_wkq_lockdep_init(struct au_wkinfo *wkinfo) -+{ -+ wkinfo->hlock = NULL; -+ wkinfo->dont_check = 0; -+} -+ -+/* -+ * 1: matched -+ * 0: unmatched -+ */ -+static int au_wkq_lockdep_test(struct lock_class_key *key, const char *name) -+{ -+ static DEFINE_SPINLOCK(spin); -+ static struct { -+ char *name; -+ struct lock_class_key *key; -+ } a[] = { -+ { .name = "&sbinfo->si_rwsem" }, -+ { .name = "&finfo->fi_rwsem" }, -+ { .name = "&dinfo->di_rwsem" }, -+ { .name = "&iinfo->ii_rwsem" } -+ }; -+ static int set; -+ int i; -+ -+ /* lockless read from 'set.' see below */ -+ if (set == ARRAY_SIZE(a)) { -+ for (i = 0; i < ARRAY_SIZE(a); i++) -+ if (a[i].key == key) -+ goto match; -+ goto unmatch; -+ } -+ -+ spin_lock(&spin); -+ if (set) -+ for (i = 0; i < ARRAY_SIZE(a); i++) -+ if (a[i].key == key) { -+ spin_unlock(&spin); -+ goto match; -+ } -+ for (i = 0; i < ARRAY_SIZE(a); i++) { -+ if (a[i].key) { -+ if (unlikely(a[i].key == key)) { /* rare but possible */ -+ spin_unlock(&spin); -+ goto match; -+ } else -+ continue; -+ } -+ if (strstr(a[i].name, name)) { -+ /* -+ * the order of these three lines is important for the -+ * lockless read above. -+ */ -+ a[i].key = key; -+ spin_unlock(&spin); -+ set++; -+ /* AuDbg("%d, %s\n", set, name); */ -+ goto match; -+ } -+ } -+ spin_unlock(&spin); -+ goto unmatch; -+ -+match: -+ return 1; -+unmatch: -+ return 0; -+} -+ -+static int au_wkq_lockdep_alloc(struct au_wkinfo *wkinfo) -+{ -+ int err, n; -+ struct task_struct *curr; -+ struct held_lock **hl, *held_locks, *p; -+ -+ err = 0; -+ curr = current; -+ wkinfo->dont_check = lockdep_recursing(curr); -+ if (wkinfo->dont_check) -+ goto out; -+ n = curr->lockdep_depth; -+ if (!n) -+ goto out; -+ -+ err = -ENOMEM; -+ wkinfo->hlock = kmalloc_array(n + 1, sizeof(*wkinfo->hlock), GFP_NOFS); -+ if (unlikely(!wkinfo->hlock)) -+ goto out; -+ -+ err = 0; -+#if 0 /* left for debugging */ -+ if (0 && au_debug_test()) -+ lockdep_print_held_locks(curr); -+#endif -+ held_locks = curr->held_locks; -+ hl = wkinfo->hlock; -+ while (n--) { -+ p = held_locks++; -+ if (au_wkq_lockdep_test(p->instance->key, p->instance->name)) -+ *hl++ = p; -+ } -+ *hl = NULL; -+ -+out: -+ return err; -+} -+ -+static void au_wkq_lockdep_free(struct au_wkinfo *wkinfo) -+{ -+ au_kfree_try_rcu(wkinfo->hlock); -+} -+ -+static void au_wkq_lockdep_pre(struct au_wkinfo *wkinfo) -+{ -+ struct held_lock *p, **hl = wkinfo->hlock; -+ int subclass; -+ -+ if (wkinfo->dont_check) -+ lockdep_off(); -+ if (!hl) -+ return; -+ while ((p = *hl++)) { /* assignment */ -+ subclass = lockdep_hlock_class(p)->subclass; -+ /* AuDbg("%s, %d\n", p->instance->name, subclass); */ -+ if (p->read) -+ rwsem_acquire_read(p->instance, subclass, 0, -+ /*p->acquire_ip*/_RET_IP_); -+ else -+ rwsem_acquire(p->instance, subclass, 0, -+ /*p->acquire_ip*/_RET_IP_); -+ } -+} -+ -+static void au_wkq_lockdep_post(struct au_wkinfo *wkinfo) -+{ -+ struct held_lock *p, **hl = wkinfo->hlock; -+ -+ if (wkinfo->dont_check) -+ lockdep_on(); -+ if (!hl) -+ return; -+ while ((p = *hl++)) /* assignment */ -+ rwsem_release(p->instance, /*p->acquire_ip*/_RET_IP_); -+} -+#endif -+ -+static void wkq_func(struct work_struct *wk) -+{ -+ struct au_wkinfo *wkinfo = container_of(wk, struct au_wkinfo, wk); -+ -+ AuDebugOn(!uid_eq(current_fsuid(), GLOBAL_ROOT_UID)); -+ AuDebugOn(rlimit(RLIMIT_FSIZE) != RLIM_INFINITY); -+ -+ au_wkq_lockdep_pre(wkinfo); -+ wkinfo->func(wkinfo->args); -+ au_wkq_lockdep_post(wkinfo); -+ if (au_ftest_wkq(wkinfo->flags, WAIT)) -+ complete(wkinfo->comp); -+ else { -+ kobject_put(wkinfo->kobj); -+ module_put(THIS_MODULE); /* todo: ?? */ -+ au_kfree_rcu(wkinfo); -+ } -+} -+ -+/* -+ * Since struct completion is large, try allocating it dynamically. -+ */ -+#define AuWkqCompDeclare(name) struct completion *comp = NULL -+ -+static int au_wkq_comp_alloc(struct au_wkinfo *wkinfo, struct completion **comp) -+{ -+ *comp = kmalloc(sizeof(**comp), GFP_NOFS); -+ if (*comp) { -+ init_completion(*comp); -+ wkinfo->comp = *comp; -+ return 0; -+ } -+ return -ENOMEM; -+} -+ -+static void au_wkq_comp_free(struct completion *comp) -+{ -+ au_kfree_rcu(comp); -+} -+ -+static void au_wkq_run(struct au_wkinfo *wkinfo) -+{ -+ if (au_ftest_wkq(wkinfo->flags, NEST)) { -+ if (au_wkq_test()) { -+ AuWarn1("wkq from wkq, unless silly-rename on NFS," -+ " due to a dead dir by UDBA," -+ " or async xino write?\n"); -+ AuDebugOn(au_ftest_wkq(wkinfo->flags, WAIT)); -+ } -+ } else -+ au_dbg_verify_kthread(); -+ -+ if (au_ftest_wkq(wkinfo->flags, WAIT)) { -+ INIT_WORK_ONSTACK(&wkinfo->wk, wkq_func); -+ queue_work(au_wkq, &wkinfo->wk); -+ } else { -+ INIT_WORK(&wkinfo->wk, wkq_func); -+ schedule_work(&wkinfo->wk); -+ } -+} -+ -+/* -+ * Be careful. It is easy to make deadlock happen. -+ * processA: lock, wkq and wait -+ * processB: wkq and wait, lock in wkq -+ * --> deadlock -+ */ -+int au_wkq_do_wait(unsigned int flags, au_wkq_func_t func, void *args) -+{ -+ int err; -+ AuWkqCompDeclare(comp); -+ struct au_wkinfo wkinfo = { -+ .flags = flags, -+ .func = func, -+ .args = args -+ }; -+ -+ err = au_wkq_comp_alloc(&wkinfo, &comp); -+ if (unlikely(err)) -+ goto out; -+ err = au_wkq_lockdep_alloc(&wkinfo); -+ if (unlikely(err)) -+ goto out_comp; -+ if (!err) { -+ au_wkq_run(&wkinfo); -+ /* no timeout, no interrupt */ -+ wait_for_completion(wkinfo.comp); -+ } -+ au_wkq_lockdep_free(&wkinfo); -+ -+out_comp: -+ au_wkq_comp_free(comp); -+out: -+ destroy_work_on_stack(&wkinfo.wk); -+ return err; -+} -+ -+/* -+ * Note: dget/dput() in func for aufs dentries are not supported. It will be a -+ * problem in a concurrent umounting. -+ */ -+int au_wkq_nowait(au_wkq_func_t func, void *args, struct super_block *sb, -+ unsigned int flags) -+{ -+ int err; -+ struct au_wkinfo *wkinfo; -+ -+ atomic_inc(&au_sbi(sb)->si_nowait.nw_len); -+ -+ /* -+ * wkq_func() must free this wkinfo. -+ * it highly depends upon the implementation of workqueue. -+ */ -+ err = 0; -+ wkinfo = kmalloc(sizeof(*wkinfo), GFP_NOFS); -+ if (wkinfo) { -+ wkinfo->kobj = &au_sbi(sb)->si_kobj; -+ wkinfo->flags = flags & ~AuWkq_WAIT; -+ wkinfo->func = func; -+ wkinfo->args = args; -+ wkinfo->comp = NULL; -+ au_wkq_lockdep_init(wkinfo); -+ kobject_get(wkinfo->kobj); -+ __module_get(THIS_MODULE); /* todo: ?? */ -+ -+ au_wkq_run(wkinfo); -+ } else { -+ err = -ENOMEM; -+ au_nwt_done(&au_sbi(sb)->si_nowait); -+ } -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+void au_nwt_init(struct au_nowait_tasks *nwt) -+{ -+ atomic_set(&nwt->nw_len, 0); -+ /* smp_mb(); */ /* atomic_set */ -+ init_waitqueue_head(&nwt->nw_wq); -+} -+ -+void au_wkq_fin(void) -+{ -+ destroy_workqueue(au_wkq); -+} -+ -+int __init au_wkq_init(void) -+{ -+ int err; -+ -+ err = 0; -+ au_wkq = alloc_workqueue(AUFS_WKQ_NAME, 0, WQ_DFL_ACTIVE); -+ if (IS_ERR(au_wkq)) -+ err = PTR_ERR(au_wkq); -+ else if (!au_wkq) -+ err = -ENOMEM; -+ -+ return err; -+} -diff -Naur null/fs/aufs/wkq.h linux-5.15.36/fs/aufs/wkq.h ---- /dev/null -+++ linux-5.15.36/fs/aufs/wkq.h 2022-05-10 16:51:39.878744219 +0300 -@@ -0,0 +1,89 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program. If not, see . -+ */ -+ -+/* -+ * workqueue for asynchronous/super-io operations -+ * todo: try new credentials management scheme -+ */ -+ -+#ifndef __AUFS_WKQ_H__ -+#define __AUFS_WKQ_H__ -+ -+#ifdef __KERNEL__ -+ -+#include -+ -+struct super_block; -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * in the next operation, wait for the 'nowait' tasks in system-wide workqueue -+ */ -+struct au_nowait_tasks { -+ atomic_t nw_len; -+ wait_queue_head_t nw_wq; -+}; -+ -+/* ---------------------------------------------------------------------- */ -+ -+typedef void (*au_wkq_func_t)(void *args); -+ -+/* wkq flags */ -+#define AuWkq_WAIT 1 -+#define AuWkq_NEST (1 << 1) -+#define au_ftest_wkq(flags, name) ((flags) & AuWkq_##name) -+#define au_fset_wkq(flags, name) \ -+ do { (flags) |= AuWkq_##name; } while (0) -+#define au_fclr_wkq(flags, name) \ -+ do { (flags) &= ~AuWkq_##name; } while (0) -+ -+/* wkq.c */ -+int au_wkq_do_wait(unsigned int flags, au_wkq_func_t func, void *args); -+int au_wkq_nowait(au_wkq_func_t func, void *args, struct super_block *sb, -+ unsigned int flags); -+void au_nwt_init(struct au_nowait_tasks *nwt); -+int __init au_wkq_init(void); -+void au_wkq_fin(void); -+ -+/* ---------------------------------------------------------------------- */ -+ -+static inline int au_wkq_test(void) -+{ -+ return current->flags & PF_WQ_WORKER; -+} -+ -+static inline int au_wkq_wait(au_wkq_func_t func, void *args) -+{ -+ return au_wkq_do_wait(AuWkq_WAIT, func, args); -+} -+ -+static inline void au_nwt_done(struct au_nowait_tasks *nwt) -+{ -+ if (atomic_dec_and_test(&nwt->nw_len)) -+ wake_up_all(&nwt->nw_wq); -+} -+ -+static inline int au_nwt_flush(struct au_nowait_tasks *nwt) -+{ -+ wait_event(nwt->nw_wq, !atomic_read(&nwt->nw_len)); -+ return 0; -+} -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_WKQ_H__ */ -diff -Naur null/fs/aufs/xattr.c linux-5.15.36/fs/aufs/xattr.c ---- /dev/null -+++ linux-5.15.36/fs/aufs/xattr.c 2022-05-10 16:51:39.878744219 +0300 -@@ -0,0 +1,368 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2014-2021 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program. If not, see . -+ */ -+ -+/* -+ * handling xattr functions -+ */ -+ -+#include -+#include -+#include -+#include "aufs.h" -+ -+static int au_xattr_ignore(int err, char *name, unsigned int ignore_flags) -+{ -+ if (!ignore_flags) -+ goto out; -+ switch (err) { -+ case -ENOMEM: -+ case -EDQUOT: -+ goto out; -+ } -+ -+ if ((ignore_flags & AuBrAttr_ICEX) == AuBrAttr_ICEX) { -+ err = 0; -+ goto out; -+ } -+ -+#define cmp(brattr, prefix) do { \ -+ if (!strncmp(name, XATTR_##prefix##_PREFIX, \ -+ XATTR_##prefix##_PREFIX_LEN)) { \ -+ if (ignore_flags & AuBrAttr_ICEX_##brattr) \ -+ err = 0; \ -+ goto out; \ -+ } \ -+ } while (0) -+ -+ cmp(SEC, SECURITY); -+ cmp(SYS, SYSTEM); -+ cmp(TR, TRUSTED); -+ cmp(USR, USER); -+#undef cmp -+ -+ if (ignore_flags & AuBrAttr_ICEX_OTH) -+ err = 0; -+ -+out: -+ return err; -+} -+ -+static const int au_xattr_out_of_list = AuBrAttr_ICEX_OTH << 1; -+ -+static int au_do_cpup_xattr(struct path *h_dst, struct path *h_src, -+ char *name, char **buf, unsigned int ignore_flags, -+ unsigned int verbose) -+{ -+ int err; -+ ssize_t ssz; -+ struct inode *h_idst; -+ struct dentry *h_dst_dentry, *h_src_dentry; -+ struct user_namespace *h_dst_userns, *h_src_userns; -+ -+ h_src_userns = mnt_user_ns(h_src->mnt); -+ h_src_dentry = h_src->dentry; -+ ssz = vfs_getxattr_alloc(h_src_userns, h_src_dentry, name, buf, 0, -+ GFP_NOFS); -+ err = ssz; -+ if (unlikely(err <= 0)) { -+ if (err == -ENODATA -+ || (err == -EOPNOTSUPP -+ && ((ignore_flags & au_xattr_out_of_list) -+ || (au_test_nfs_noacl(d_inode(h_src_dentry)) -+ && (!strcmp(name, XATTR_NAME_POSIX_ACL_ACCESS) -+ || !strcmp(name, -+ XATTR_NAME_POSIX_ACL_DEFAULT)))) -+ )) -+ err = 0; -+ if (err && (verbose || au_debug_test())) -+ pr_err("%s, err %d\n", name, err); -+ goto out; -+ } -+ -+ /* unlock it temporary */ -+ h_dst_userns = mnt_user_ns(h_dst->mnt); -+ h_dst_dentry = h_dst->dentry; -+ h_idst = d_inode(h_dst_dentry); -+ inode_unlock(h_idst); -+ err = vfsub_setxattr(h_dst_userns, h_dst_dentry, name, *buf, ssz, -+ /*flags*/0); -+ inode_lock_nested(h_idst, AuLsc_I_CHILD2); -+ if (unlikely(err)) { -+ if (verbose || au_debug_test()) -+ pr_err("%s, err %d\n", name, err); -+ err = au_xattr_ignore(err, name, ignore_flags); -+ } -+ -+out: -+ return err; -+} -+ -+int au_cpup_xattr(struct path *h_dst, struct path *h_src, int ignore_flags, -+ unsigned int verbose) -+{ -+ int err, unlocked, acl_access, acl_default; -+ ssize_t ssz; -+ struct dentry *h_dst_dentry, *h_src_dentry; -+ struct inode *h_isrc, *h_idst; -+ char *value, *p, *o, *e; -+ -+ /* try stopping to update the source inode while we are referencing */ -+ /* there should not be the parent-child relationship between them */ -+ h_dst_dentry = h_dst->dentry; -+ h_idst = d_inode(h_dst_dentry); -+ h_src_dentry = h_src->dentry; -+ h_isrc = d_inode(h_src_dentry); -+ inode_unlock(h_idst); -+ inode_lock_shared_nested(h_isrc, AuLsc_I_CHILD); -+ inode_lock_nested(h_idst, AuLsc_I_CHILD2); -+ unlocked = 0; -+ -+ /* some filesystems don't list POSIX ACL, for example tmpfs */ -+ ssz = vfs_listxattr(h_src_dentry, NULL, 0); -+ err = ssz; -+ if (unlikely(err < 0)) { -+ AuTraceErr(err); -+ if (err == -ENODATA -+ || err == -EOPNOTSUPP) -+ err = 0; /* ignore */ -+ goto out; -+ } -+ -+ err = 0; -+ p = NULL; -+ o = NULL; -+ if (ssz) { -+ err = -ENOMEM; -+ p = kmalloc(ssz, GFP_NOFS); -+ o = p; -+ if (unlikely(!p)) -+ goto out; -+ err = vfs_listxattr(h_src_dentry, p, ssz); -+ } -+ inode_unlock_shared(h_isrc); -+ unlocked = 1; -+ AuDbg("err %d, ssz %zd\n", err, ssz); -+ if (unlikely(err < 0)) -+ goto out_free; -+ -+ err = 0; -+ e = p + ssz; -+ value = NULL; -+ acl_access = 0; -+ acl_default = 0; -+ while (!err && p < e) { -+ acl_access |= !strncmp(p, XATTR_NAME_POSIX_ACL_ACCESS, -+ sizeof(XATTR_NAME_POSIX_ACL_ACCESS) - 1); -+ acl_default |= !strncmp(p, XATTR_NAME_POSIX_ACL_DEFAULT, -+ sizeof(XATTR_NAME_POSIX_ACL_DEFAULT) -+ - 1); -+ err = au_do_cpup_xattr(h_dst, h_src, p, &value, ignore_flags, -+ verbose); -+ p += strlen(p) + 1; -+ } -+ AuTraceErr(err); -+ ignore_flags |= au_xattr_out_of_list; -+ if (!err && !acl_access) { -+ err = au_do_cpup_xattr(h_dst, h_src, -+ XATTR_NAME_POSIX_ACL_ACCESS, &value, -+ ignore_flags, verbose); -+ AuTraceErr(err); -+ } -+ if (!err && !acl_default) { -+ err = au_do_cpup_xattr(h_dst, h_src, -+ XATTR_NAME_POSIX_ACL_DEFAULT, &value, -+ ignore_flags, verbose); -+ AuTraceErr(err); -+ } -+ -+ au_kfree_try_rcu(value); -+ -+out_free: -+ au_kfree_try_rcu(o); -+out: -+ if (!unlocked) -+ inode_unlock_shared(h_isrc); -+ AuTraceErr(err); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int au_smack_reentering(struct super_block *sb) -+{ -+#if IS_ENABLED(CONFIG_SECURITY_SMACK) || IS_ENABLED(CONFIG_SECURITY_SELINUX) -+ /* -+ * as a part of lookup, smack_d_instantiate() is called, and it calls -+ * i_op->getxattr(). ouch. -+ */ -+ return si_pid_test(sb); -+#else -+ return 0; -+#endif -+} -+ -+enum { -+ AU_XATTR_LIST, -+ AU_XATTR_GET -+}; -+ -+struct au_lgxattr { -+ int type; -+ union { -+ struct { -+ char *list; -+ size_t size; -+ } list; -+ struct { -+ const char *name; -+ void *value; -+ size_t size; -+ } get; -+ } u; -+}; -+ -+static ssize_t au_lgxattr(struct dentry *dentry, struct inode *inode, -+ struct au_lgxattr *arg) -+{ -+ ssize_t err; -+ int reenter; -+ struct path h_path; -+ struct super_block *sb; -+ -+ sb = dentry->d_sb; -+ reenter = au_smack_reentering(sb); -+ if (!reenter) { -+ err = si_read_lock(sb, AuLock_FLUSH | AuLock_NOPLM); -+ if (unlikely(err)) -+ goto out; -+ } -+ err = au_h_path_getattr(dentry, inode, /*force*/1, &h_path, reenter); -+ if (unlikely(err)) -+ goto out_si; -+ if (unlikely(!h_path.dentry)) -+ /* illegally overlapped or something */ -+ goto out_di; /* pretending success */ -+ -+ /* always topmost entry only */ -+ switch (arg->type) { -+ case AU_XATTR_LIST: -+ err = vfs_listxattr(h_path.dentry, -+ arg->u.list.list, arg->u.list.size); -+ break; -+ case AU_XATTR_GET: -+ AuDebugOn(d_is_negative(h_path.dentry)); -+ err = vfs_getxattr(mnt_user_ns(h_path.mnt), h_path.dentry, -+ arg->u.get.name, arg->u.get.value, -+ arg->u.get.size); -+ break; -+ } -+ -+out_di: -+ if (!reenter) -+ di_read_unlock(dentry, AuLock_IR); -+out_si: -+ if (!reenter) -+ si_read_unlock(sb); -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+ssize_t aufs_listxattr(struct dentry *dentry, char *list, size_t size) -+{ -+ struct au_lgxattr arg = { -+ .type = AU_XATTR_LIST, -+ .u.list = { -+ .list = list, -+ .size = size -+ }, -+ }; -+ -+ return au_lgxattr(dentry, /*inode*/NULL, &arg); -+} -+ -+static ssize_t au_getxattr(struct dentry *dentry, struct inode *inode, -+ const char *name, void *value, size_t size) -+{ -+ struct au_lgxattr arg = { -+ .type = AU_XATTR_GET, -+ .u.get = { -+ .name = name, -+ .value = value, -+ .size = size -+ }, -+ }; -+ -+ return au_lgxattr(dentry, inode, &arg); -+} -+ -+static int au_setxattr(struct dentry *dentry, struct inode *inode, -+ const char *name, const void *value, size_t size, -+ int flags) -+{ -+ struct au_sxattr arg = { -+ .type = AU_XATTR_SET, -+ .u.set = { -+ .name = name, -+ .value = value, -+ .size = size, -+ .flags = flags -+ }, -+ }; -+ -+ return au_sxattr(dentry, inode, &arg); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int au_xattr_get(const struct xattr_handler *handler, -+ struct dentry *dentry, struct inode *inode, -+ const char *name, void *buffer, size_t size) -+{ -+ return au_getxattr(dentry, inode, name, buffer, size); -+} -+ -+static int au_xattr_set(const struct xattr_handler *handler, -+ struct user_namespace *userns, -+ struct dentry *dentry, struct inode *inode, -+ const char *name, const void *value, size_t size, -+ int flags) -+{ -+ return au_setxattr(dentry, inode, name, value, size, flags); -+} -+ -+static const struct xattr_handler au_xattr_handler = { -+ .name = "", -+ .prefix = "", -+ .get = au_xattr_get, -+ .set = au_xattr_set -+}; -+ -+static const struct xattr_handler *au_xattr_handlers[] = { -+#ifdef CONFIG_FS_POSIX_ACL -+ &posix_acl_access_xattr_handler, -+ &posix_acl_default_xattr_handler, -+#endif -+ &au_xattr_handler, /* must be last */ -+ NULL -+}; -+ -+void au_xattr_init(struct super_block *sb) -+{ -+ sb->s_xattr = au_xattr_handlers; -+} -diff -Naur null/fs/aufs/xino.c linux-5.15.36/fs/aufs/xino.c ---- /dev/null -+++ linux-5.15.36/fs/aufs/xino.c 2022-05-10 16:51:39.879744219 +0300 -@@ -0,0 +1,1926 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program. If not, see . -+ */ -+ -+/* -+ * external inode number translation table and bitmap -+ * -+ * things to consider -+ * - the lifetime -+ * + au_xino object -+ * + XINO files (xino, xib, xigen) -+ * + dynamic debugfs entries (xiN) -+ * + static debugfs entries (xib, xigen) -+ * + static sysfs entry (xi_path) -+ * - several entry points to handle them. -+ * + mount(2) without xino option (default) -+ * + mount(2) with xino option -+ * + mount(2) with noxino option -+ * + umount(2) -+ * + remount with add/del branches -+ * + remount with xino/noxino options -+ */ -+ -+#include -+#include -+#include "aufs.h" -+ -+static aufs_bindex_t sbr_find_shared(struct super_block *sb, aufs_bindex_t btop, -+ aufs_bindex_t bbot, -+ struct super_block *h_sb) -+{ -+ /* todo: try binary-search if the branches are many */ -+ for (; btop <= bbot; btop++) -+ if (h_sb == au_sbr_sb(sb, btop)) -+ return btop; -+ return -1; -+} -+ -+/* -+ * find another branch who is on the same filesystem of the specified -+ * branch{@btgt}. search until @bbot. -+ */ -+static aufs_bindex_t is_sb_shared(struct super_block *sb, aufs_bindex_t btgt, -+ aufs_bindex_t bbot) -+{ -+ aufs_bindex_t bindex; -+ struct super_block *tgt_sb; -+ -+ tgt_sb = au_sbr_sb(sb, btgt); -+ bindex = sbr_find_shared(sb, /*btop*/0, btgt - 1, tgt_sb); -+ if (bindex < 0) -+ bindex = sbr_find_shared(sb, btgt + 1, bbot, tgt_sb); -+ -+ return bindex; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * stop unnecessary notify events at creating xino files -+ */ -+ -+aufs_bindex_t au_xi_root(struct super_block *sb, struct dentry *dentry) -+{ -+ aufs_bindex_t bfound, bindex, bbot; -+ struct dentry *parent; -+ struct au_branch *br; -+ -+ bfound = -1; -+ parent = dentry->d_parent; /* safe d_parent access */ -+ bbot = au_sbbot(sb); -+ for (bindex = 0; bindex <= bbot; bindex++) { -+ br = au_sbr(sb, bindex); -+ if (au_br_dentry(br) == parent) { -+ bfound = bindex; -+ break; -+ } -+ } -+ -+ AuDbg("bfound b%d\n", bfound); -+ return bfound; -+} -+ -+struct au_xino_lock_dir { -+ struct au_hinode *hdir; -+ struct dentry *parent; -+ struct inode *dir; -+}; -+ -+static struct dentry *au_dget_parent_lock(struct dentry *dentry, -+ unsigned int lsc) -+{ -+ struct dentry *parent; -+ struct inode *dir; -+ -+ parent = dget_parent(dentry); -+ dir = d_inode(parent); -+ inode_lock_nested(dir, lsc); -+#if 0 /* it should not happen */ -+ spin_lock(&dentry->d_lock); -+ if (unlikely(dentry->d_parent != parent)) { -+ spin_unlock(&dentry->d_lock); -+ inode_unlock(dir); -+ dput(parent); -+ parent = NULL; -+ goto out; -+ } -+ spin_unlock(&dentry->d_lock); -+ -+out: -+#endif -+ return parent; -+} -+ -+static void au_xino_lock_dir(struct super_block *sb, struct path *xipath, -+ struct au_xino_lock_dir *ldir) -+{ -+ aufs_bindex_t bindex; -+ -+ ldir->hdir = NULL; -+ bindex = au_xi_root(sb, xipath->dentry); -+ if (bindex >= 0) { -+ /* rw branch root */ -+ ldir->hdir = au_hi(d_inode(sb->s_root), bindex); -+ au_hn_inode_lock_nested(ldir->hdir, AuLsc_I_PARENT); -+ } else { -+ /* other */ -+ ldir->parent = au_dget_parent_lock(xipath->dentry, -+ AuLsc_I_PARENT); -+ ldir->dir = d_inode(ldir->parent); -+ } -+} -+ -+static void au_xino_unlock_dir(struct au_xino_lock_dir *ldir) -+{ -+ if (ldir->hdir) -+ au_hn_inode_unlock(ldir->hdir); -+ else { -+ inode_unlock(ldir->dir); -+ dput(ldir->parent); -+ } -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * create and set a new xino file -+ */ -+struct file *au_xino_create(struct super_block *sb, char *fpath, int silent, -+ int wbrtop) -+{ -+ struct file *file; -+ struct dentry *h_parent, *d; -+ struct inode *h_dir, *inode; -+ int err; -+ static DEFINE_MUTEX(mtx); -+ -+ /* -+ * at mount-time, and the xino file is the default path, -+ * hnotify is disabled so we have no notify events to ignore. -+ * when a user specified the xino, we cannot get au_hdir to be ignored. -+ */ -+ if (!wbrtop) -+ mutex_lock(&mtx); -+ file = vfsub_filp_open(fpath, O_RDWR | O_CREAT | O_EXCL | O_LARGEFILE -+ /* | __FMODE_NONOTIFY */, -+ 0666); -+ if (IS_ERR(file)) { -+ if (!wbrtop) -+ mutex_unlock(&mtx); -+ if (!silent) -+ pr_err("open %s(%ld)\n", fpath, PTR_ERR(file)); -+ return file; -+ } -+ -+ /* keep file count */ -+ err = 0; -+ d = file->f_path.dentry; -+ 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 (inode->i_nlink) -+ err = vfsub_unlink(h_dir, &file->f_path, /*delegated*/NULL, -+ /*force*/0); -+ inode_unlock(h_dir); -+ dput(h_parent); -+ if (unlikely(err)) { -+ if (!silent) -+ pr_err("unlink %s(%d)\n", fpath, err); -+ goto out; -+ } -+ -+ err = -EINVAL; -+ if (unlikely(sb && sb == d->d_sb)) { -+ if (!silent) -+ pr_err("%s must be outside\n", fpath); -+ goto out; -+ } -+ if (unlikely(au_test_fs_bad_xino(d->d_sb))) { -+ if (!silent) -+ pr_err("xino doesn't support %s(%s)\n", -+ fpath, au_sbtype(d->d_sb)); -+ goto out; -+ } -+ return file; /* success */ -+ -+out: -+ fput(file); -+ file = ERR_PTR(err); -+ return file; -+} -+ -+/* -+ * create a new xinofile at the same place/path as @base. -+ */ -+struct file *au_xino_create2(struct super_block *sb, struct path *base, -+ struct file *copy_src) -+{ -+ struct file *file; -+ struct dentry *dentry; -+ struct inode *dir, *delegated; -+ struct qstr *name; -+ struct path ppath, path; -+ int err, do_unlock; -+ struct au_xino_lock_dir ldir; -+ -+ do_unlock = 1; -+ au_xino_lock_dir(sb, base, &ldir); -+ dentry = base->dentry; -+ ppath.dentry = dentry->d_parent; /* dir inode is locked */ -+ ppath.mnt = base->mnt; -+ dir = d_inode(ppath.dentry); -+ IMustLock(dir); -+ -+ name = &dentry->d_name; -+ path.dentry = vfsub_lookup_one_len(name->name, &ppath, name->len); -+ if (IS_ERR(path.dentry)) { -+ file = (void *)path.dentry; -+ pr_err("%pd lookup err %ld\n", dentry, PTR_ERR(path.dentry)); -+ goto out; -+ } -+ -+ /* no need to mnt_want_write() since we call dentry_open() later */ -+ err = vfs_create(mnt_user_ns(base->mnt), dir, path.dentry, 0666, NULL); -+ if (unlikely(err)) { -+ file = ERR_PTR(err); -+ pr_err("%pd create err %d\n", dentry, err); -+ goto out_dput; -+ } -+ -+ 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; -+ } -+ -+ delegated = NULL; -+ err = vfsub_unlink(dir, &file->f_path, &delegated, /*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; -+ } -+ -+ if (copy_src) { -+ /* no one can touch copy_src xino */ -+ err = au_copy_file(file, copy_src, vfsub_f_size_read(copy_src)); -+ if (unlikely(err)) { -+ pr_err("%pd copy err %d\n", dentry, err); -+ goto out_fput; -+ } -+ } -+ goto out_dput; /* success */ -+ -+out_fput: -+ fput(file); -+ file = ERR_PTR(err); -+out_dput: -+ dput(path.dentry); -+out: -+ if (do_unlock) -+ au_xino_unlock_dir(&ldir); -+ return file; -+} -+ -+struct file *au_xino_file1(struct au_xino *xi) -+{ -+ struct file *file; -+ unsigned int u, nfile; -+ -+ file = NULL; -+ nfile = xi->xi_nfile; -+ for (u = 0; u < nfile; u++) { -+ file = xi->xi_file[u]; -+ if (file) -+ break; -+ } -+ -+ return file; -+} -+ -+static int au_xino_file_set(struct au_xino *xi, int idx, struct file *file) -+{ -+ int err; -+ struct file *f; -+ void *p; -+ -+ if (file) -+ get_file(file); -+ -+ err = 0; -+ f = NULL; -+ if (idx < xi->xi_nfile) { -+ f = xi->xi_file[idx]; -+ if (f) -+ fput(f); -+ } else { -+ p = au_kzrealloc(xi->xi_file, -+ sizeof(*xi->xi_file) * xi->xi_nfile, -+ sizeof(*xi->xi_file) * (idx + 1), -+ GFP_NOFS, /*may_shrink*/0); -+ if (p) { -+ MtxMustLock(&xi->xi_mtx); -+ xi->xi_file = p; -+ xi->xi_nfile = idx + 1; -+ } else { -+ err = -ENOMEM; -+ if (file) -+ fput(file); -+ goto out; -+ } -+ } -+ xi->xi_file[idx] = file; -+ -+out: -+ return err; -+} -+ -+/* -+ * if @xinew->xi is not set, then create new xigen file. -+ */ -+struct file *au_xi_new(struct super_block *sb, struct au_xi_new *xinew) -+{ -+ struct file *file; -+ int err; -+ -+ SiMustAnyLock(sb); -+ -+ file = au_xino_create2(sb, xinew->base, xinew->copy_src); -+ if (IS_ERR(file)) { -+ err = PTR_ERR(file); -+ pr_err("%s[%d], err %d\n", -+ xinew->xi ? "xino" : "xigen", -+ xinew->idx, err); -+ goto out; -+ } -+ -+ if (xinew->xi) -+ err = au_xino_file_set(xinew->xi, xinew->idx, file); -+ else { -+ BUG(); -+ /* todo: make xigen file an array */ -+ /* err = au_xigen_file_set(sb, xinew->idx, file); */ -+ } -+ fput(file); -+ if (unlikely(err)) -+ file = ERR_PTR(err); -+ -+out: -+ return file; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * truncate xino files -+ */ -+static int au_xino_do_trunc(struct super_block *sb, aufs_bindex_t bindex, -+ int idx, struct kstatfs *st) -+{ -+ int err; -+ blkcnt_t blocks; -+ struct file *file, *new_xino; -+ struct au_xi_new xinew = { -+ .idx = idx -+ }; -+ -+ err = 0; -+ xinew.xi = au_sbr(sb, bindex)->br_xino; -+ file = au_xino_file(xinew.xi, idx); -+ if (!file) -+ goto out; -+ -+ xinew.base = &file->f_path; -+ err = vfs_statfs(xinew.base, st); -+ if (unlikely(err)) { -+ AuErr1("statfs err %d, ignored\n", err); -+ err = 0; -+ goto out; -+ } -+ -+ blocks = file_inode(file)->i_blocks; -+ pr_info("begin truncating xino(b%d-%d), ib%llu, %llu/%llu free blks\n", -+ bindex, idx, (u64)blocks, st->f_bfree, st->f_blocks); -+ -+ xinew.copy_src = file; -+ new_xino = au_xi_new(sb, &xinew); -+ if (IS_ERR(new_xino)) { -+ err = PTR_ERR(new_xino); -+ pr_err("xino(b%d-%d), err %d, ignored\n", bindex, idx, err); -+ goto out; -+ } -+ -+ err = vfs_statfs(&new_xino->f_path, st); -+ if (!err) -+ pr_info("end truncating xino(b%d-%d), ib%llu, %llu/%llu free blks\n", -+ bindex, idx, (u64)file_inode(new_xino)->i_blocks, -+ st->f_bfree, st->f_blocks); -+ else { -+ AuErr1("statfs err %d, ignored\n", err); -+ err = 0; -+ } -+ -+out: -+ return err; -+} -+ -+int au_xino_trunc(struct super_block *sb, aufs_bindex_t bindex, int idx_begin) -+{ -+ int err, i; -+ unsigned long jiffy; -+ aufs_bindex_t bbot; -+ struct kstatfs *st; -+ struct au_branch *br; -+ struct au_xino *xi; -+ -+ err = -ENOMEM; -+ st = kmalloc(sizeof(*st), GFP_NOFS); -+ if (unlikely(!st)) -+ goto out; -+ -+ err = -EINVAL; -+ bbot = au_sbbot(sb); -+ if (unlikely(bindex < 0 || bbot < bindex)) -+ goto out_st; -+ -+ err = 0; -+ jiffy = jiffies; -+ br = au_sbr(sb, bindex); -+ xi = br->br_xino; -+ for (i = idx_begin; !err && i < xi->xi_nfile; i++) -+ err = au_xino_do_trunc(sb, bindex, i, st); -+ if (!err) -+ au_sbi(sb)->si_xino_jiffy = jiffy; -+ -+out_st: -+ au_kfree_rcu(st); -+out: -+ return err; -+} -+ -+struct xino_do_trunc_args { -+ struct super_block *sb; -+ struct au_branch *br; -+ int idx; -+}; -+ -+static void xino_do_trunc(void *_args) -+{ -+ struct xino_do_trunc_args *args = _args; -+ struct super_block *sb; -+ struct au_branch *br; -+ struct inode *dir; -+ int err, idx; -+ aufs_bindex_t bindex; -+ -+ err = 0; -+ sb = args->sb; -+ dir = d_inode(sb->s_root); -+ br = args->br; -+ idx = args->idx; -+ -+ si_noflush_write_lock(sb); -+ ii_read_lock_parent(dir); -+ bindex = au_br_index(sb, br->br_id); -+ err = au_xino_trunc(sb, bindex, idx); -+ ii_read_unlock(dir); -+ if (unlikely(err)) -+ pr_warn("err b%d, (%d)\n", bindex, err); -+ atomic_dec(&br->br_xino->xi_truncating); -+ au_lcnt_dec(&br->br_count); -+ si_write_unlock(sb); -+ au_nwt_done(&au_sbi(sb)->si_nowait); -+ au_kfree_rcu(args); -+} -+ -+/* -+ * returns the index in the xi_file array whose corresponding file is necessary -+ * to truncate, or -1 which means no need to truncate. -+ */ -+static int xino_trunc_test(struct super_block *sb, struct au_branch *br) -+{ -+ int err; -+ unsigned int u; -+ struct kstatfs st; -+ struct au_sbinfo *sbinfo; -+ struct au_xino *xi; -+ struct file *file; -+ -+ /* todo: si_xino_expire and the ratio should be customizable */ -+ sbinfo = au_sbi(sb); -+ if (time_before(jiffies, -+ sbinfo->si_xino_jiffy + sbinfo->si_xino_expire)) -+ return -1; -+ -+ /* truncation border */ -+ xi = br->br_xino; -+ for (u = 0; u < xi->xi_nfile; u++) { -+ file = au_xino_file(xi, u); -+ if (!file) -+ continue; -+ -+ err = vfs_statfs(&file->f_path, &st); -+ if (unlikely(err)) { -+ AuErr1("statfs err %d, ignored\n", err); -+ return -1; -+ } -+ if (div64_u64(st.f_bfree * 100, st.f_blocks) -+ >= AUFS_XINO_DEF_TRUNC) -+ return u; -+ } -+ -+ return -1; -+} -+ -+static void xino_try_trunc(struct super_block *sb, struct au_branch *br) -+{ -+ int idx; -+ struct xino_do_trunc_args *args; -+ int wkq_err; -+ -+ idx = xino_trunc_test(sb, br); -+ if (idx < 0) -+ return; -+ -+ if (atomic_inc_return(&br->br_xino->xi_truncating) > 1) -+ goto out; -+ -+ /* lock and kfree() will be called in trunc_xino() */ -+ args = kmalloc(sizeof(*args), GFP_NOFS); -+ if (unlikely(!args)) { -+ AuErr1("no memory\n"); -+ goto out; -+ } -+ -+ au_lcnt_inc(&br->br_count); -+ args->sb = sb; -+ args->br = br; -+ args->idx = idx; -+ wkq_err = au_wkq_nowait(xino_do_trunc, args, sb, /*flags*/0); -+ if (!wkq_err) -+ return; /* success */ -+ -+ pr_err("wkq %d\n", wkq_err); -+ au_lcnt_dec(&br->br_count); -+ au_kfree_rcu(args); -+ -+out: -+ atomic_dec(&br->br_xino->xi_truncating); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+struct au_xi_calc { -+ int idx; -+ loff_t pos; -+}; -+ -+static void au_xi_calc(struct super_block *sb, ino_t h_ino, -+ struct au_xi_calc *calc) -+{ -+ loff_t maxent; -+ -+ maxent = au_xi_maxent(sb); -+ calc->idx = div64_u64_rem(h_ino, maxent, &calc->pos); -+ calc->pos *= sizeof(ino_t); -+} -+ -+static int au_xino_do_new_async(struct super_block *sb, struct au_branch *br, -+ struct au_xi_calc *calc) -+{ -+ int err; -+ struct file *file; -+ struct au_xino *xi = br->br_xino; -+ struct au_xi_new xinew = { -+ .xi = xi -+ }; -+ -+ SiMustAnyLock(sb); -+ -+ err = 0; -+ if (!xi) -+ goto out; -+ -+ mutex_lock(&xi->xi_mtx); -+ file = au_xino_file(xi, calc->idx); -+ if (file) -+ goto out_mtx; -+ -+ file = au_xino_file(xi, /*idx*/-1); -+ AuDebugOn(!file); -+ xinew.idx = calc->idx; -+ xinew.base = &file->f_path; -+ /* xinew.copy_src = NULL; */ -+ file = au_xi_new(sb, &xinew); -+ if (IS_ERR(file)) -+ err = PTR_ERR(file); -+ -+out_mtx: -+ mutex_unlock(&xi->xi_mtx); -+out: -+ return err; -+} -+ -+struct au_xino_do_new_async_args { -+ struct super_block *sb; -+ struct au_branch *br; -+ struct au_xi_calc calc; -+ ino_t ino; -+}; -+ -+struct au_xi_writing { -+ struct hlist_bl_node node; -+ ino_t h_ino, ino; -+}; -+ -+static int au_xino_do_write(struct file *file, struct au_xi_calc *calc, -+ ino_t ino); -+ -+static void au_xino_call_do_new_async(void *args) -+{ -+ struct au_xino_do_new_async_args *a = args; -+ struct au_branch *br; -+ struct super_block *sb; -+ struct au_sbinfo *sbi; -+ struct inode *root; -+ struct file *file; -+ struct au_xi_writing *del, *p; -+ struct hlist_bl_head *hbl; -+ struct hlist_bl_node *pos; -+ int err; -+ -+ br = a->br; -+ sb = a->sb; -+ sbi = au_sbi(sb); -+ si_noflush_read_lock(sb); -+ root = d_inode(sb->s_root); -+ ii_read_lock_child(root); -+ err = au_xino_do_new_async(sb, br, &a->calc); -+ if (unlikely(err)) { -+ AuIOErr("err %d\n", err); -+ goto out; -+ } -+ -+ file = au_xino_file(br->br_xino, a->calc.idx); -+ AuDebugOn(!file); -+ err = au_xino_do_write(file, &a->calc, a->ino); -+ if (unlikely(err)) { -+ AuIOErr("err %d\n", err); -+ goto out; -+ } -+ -+ del = NULL; -+ hbl = &br->br_xino->xi_writing; -+ hlist_bl_lock(hbl); -+ au_hbl_for_each(pos, hbl) { -+ p = container_of(pos, struct au_xi_writing, node); -+ if (p->ino == a->ino) { -+ del = p; -+ hlist_bl_del(&p->node); -+ break; -+ } -+ } -+ hlist_bl_unlock(hbl); -+ au_kfree_rcu(del); -+ -+out: -+ au_lcnt_dec(&br->br_count); -+ ii_read_unlock(root); -+ si_read_unlock(sb); -+ au_nwt_done(&sbi->si_nowait); -+ au_kfree_rcu(a); -+} -+ -+/* -+ * create a new xino file asynchronously -+ */ -+static int au_xino_new_async(struct super_block *sb, struct au_branch *br, -+ struct au_xi_calc *calc, ino_t ino) -+{ -+ int err; -+ struct au_xino_do_new_async_args *arg; -+ -+ err = -ENOMEM; -+ arg = kmalloc(sizeof(*arg), GFP_NOFS); -+ if (unlikely(!arg)) -+ goto out; -+ -+ arg->sb = sb; -+ arg->br = br; -+ arg->calc = *calc; -+ arg->ino = ino; -+ au_lcnt_inc(&br->br_count); -+ err = au_wkq_nowait(au_xino_call_do_new_async, arg, sb, AuWkq_NEST); -+ if (unlikely(err)) { -+ pr_err("wkq %d\n", err); -+ au_lcnt_dec(&br->br_count); -+ au_kfree_rcu(arg); -+ } -+ -+out: -+ return err; -+} -+ -+/* -+ * read @ino from xinofile for the specified branch{@sb, @bindex} -+ * at the position of @h_ino. -+ */ -+int au_xino_read(struct super_block *sb, aufs_bindex_t bindex, ino_t h_ino, -+ ino_t *ino) -+{ -+ int err; -+ ssize_t sz; -+ struct au_xi_calc calc; -+ struct au_sbinfo *sbinfo; -+ struct file *file; -+ struct au_xino *xi; -+ struct hlist_bl_head *hbl; -+ struct hlist_bl_node *pos; -+ struct au_xi_writing *p; -+ -+ *ino = 0; -+ if (!au_opt_test(au_mntflags(sb), XINO)) -+ return 0; /* no xino */ -+ -+ err = 0; -+ au_xi_calc(sb, h_ino, &calc); -+ xi = au_sbr(sb, bindex)->br_xino; -+ file = au_xino_file(xi, calc.idx); -+ if (!file) { -+ hbl = &xi->xi_writing; -+ hlist_bl_lock(hbl); -+ au_hbl_for_each(pos, hbl) { -+ p = container_of(pos, struct au_xi_writing, node); -+ if (p->h_ino == h_ino) { -+ AuDbg("hi%llu, i%llu, found\n", -+ (u64)p->h_ino, (u64)p->ino); -+ *ino = p->ino; -+ break; -+ } -+ } -+ hlist_bl_unlock(hbl); -+ return 0; -+ } else if (vfsub_f_size_read(file) < calc.pos + sizeof(*ino)) -+ return 0; /* no xino */ -+ -+ sbinfo = au_sbi(sb); -+ sz = xino_fread(file, ino, sizeof(*ino), &calc.pos); -+ if (sz == sizeof(*ino)) -+ return 0; /* success */ -+ -+ err = sz; -+ if (unlikely(sz >= 0)) { -+ err = -EIO; -+ AuIOErr("xino read error (%zd)\n", sz); -+ } -+ return err; -+} -+ -+static int au_xino_do_write(struct file *file, struct au_xi_calc *calc, -+ ino_t ino) -+{ -+ ssize_t sz; -+ -+ sz = xino_fwrite(file, &ino, sizeof(ino), &calc->pos); -+ if (sz == sizeof(ino)) -+ return 0; /* success */ -+ -+ AuIOErr("write failed (%zd)\n", sz); -+ return -EIO; -+} -+ -+/* -+ * write @ino to the xinofile for the specified branch{@sb, @bindex} -+ * at the position of @h_ino. -+ * even if @ino is zero, it is written to the xinofile and means no entry. -+ * if the size of the xino file on a specific filesystem exceeds the watermark, -+ * try truncating it. -+ */ -+int au_xino_write(struct super_block *sb, aufs_bindex_t bindex, ino_t h_ino, -+ ino_t ino) -+{ -+ int err; -+ unsigned int mnt_flags; -+ struct au_xi_calc calc; -+ struct file *file; -+ struct au_branch *br; -+ struct au_xino *xi; -+ struct au_xi_writing *p; -+ -+ SiMustAnyLock(sb); -+ -+ mnt_flags = au_mntflags(sb); -+ if (!au_opt_test(mnt_flags, XINO)) -+ return 0; -+ -+ au_xi_calc(sb, h_ino, &calc); -+ br = au_sbr(sb, bindex); -+ xi = br->br_xino; -+ file = au_xino_file(xi, calc.idx); -+ if (!file) { -+ /* store the inum pair into the list */ -+ p = kmalloc(sizeof(*p), GFP_NOFS | __GFP_NOFAIL); -+ p->h_ino = h_ino; -+ p->ino = ino; -+ au_hbl_add(&p->node, &xi->xi_writing); -+ -+ /* create and write a new xino file asynchronously */ -+ err = au_xino_new_async(sb, br, &calc, ino); -+ if (!err) -+ return 0; /* success */ -+ goto out; -+ } -+ -+ err = au_xino_do_write(file, &calc, ino); -+ if (!err) { -+ br = au_sbr(sb, bindex); -+ if (au_opt_test(mnt_flags, TRUNC_XINO) -+ && au_test_fs_trunc_xino(au_br_sb(br))) -+ xino_try_trunc(sb, br); -+ return 0; /* success */ -+ } -+ -+out: -+ AuIOErr("write failed (%d)\n", err); -+ return -EIO; -+} -+ -+static ssize_t xino_fread_wkq(struct file *file, void *buf, size_t size, -+ loff_t *pos); -+ -+/* todo: unnecessary to support mmap_sem since kernel-space? */ -+ssize_t xino_fread(struct file *file, void *kbuf, size_t size, loff_t *pos) -+{ -+ ssize_t err; -+ int i; -+ const int prevent_endless = 10; -+ -+ i = 0; -+ do { -+ err = vfsub_read_k(file, kbuf, size, pos); -+ if (err == -EINTR -+ && !au_wkq_test() -+ && fatal_signal_pending(current)) { -+ err = xino_fread_wkq(file, kbuf, size, pos); -+ BUG_ON(err == -EINTR); -+ } -+ } while (i++ < prevent_endless -+ && (err == -EAGAIN || err == -EINTR)); -+ -+#if 0 /* reserved for future use */ -+ if (err > 0) -+ fsnotify_access(file->f_path.dentry); -+#endif -+ -+ return err; -+} -+ -+struct xino_fread_args { -+ ssize_t *errp; -+ struct file *file; -+ void *buf; -+ size_t size; -+ loff_t *pos; -+}; -+ -+static void call_xino_fread(void *args) -+{ -+ struct xino_fread_args *a = args; -+ *a->errp = xino_fread(a->file, a->buf, a->size, a->pos); -+} -+ -+static ssize_t xino_fread_wkq(struct file *file, void *buf, size_t size, -+ loff_t *pos) -+{ -+ ssize_t err; -+ int wkq_err; -+ struct xino_fread_args args = { -+ .errp = &err, -+ .file = file, -+ .buf = buf, -+ .size = size, -+ .pos = pos -+ }; -+ -+ wkq_err = au_wkq_wait(call_xino_fread, &args); -+ if (unlikely(wkq_err)) -+ err = wkq_err; -+ -+ return err; -+} -+ -+static ssize_t xino_fwrite_wkq(struct file *file, void *buf, size_t size, -+ loff_t *pos); -+ -+static ssize_t do_xino_fwrite(struct file *file, void *kbuf, size_t size, -+ loff_t *pos) -+{ -+ ssize_t err; -+ int i; -+ const int prevent_endless = 10; -+ -+ i = 0; -+ do { -+ err = vfsub_write_k(file, kbuf, size, pos); -+ if (err == -EINTR -+ && !au_wkq_test() -+ && fatal_signal_pending(current)) { -+ err = xino_fwrite_wkq(file, kbuf, size, pos); -+ BUG_ON(err == -EINTR); -+ } -+ } while (i++ < prevent_endless -+ && (err == -EAGAIN || err == -EINTR)); -+ -+#if 0 /* reserved for future use */ -+ if (err > 0) -+ fsnotify_modify(file->f_path.dentry); -+#endif -+ -+ return err; -+} -+ -+struct do_xino_fwrite_args { -+ ssize_t *errp; -+ struct file *file; -+ void *buf; -+ size_t size; -+ loff_t *pos; -+}; -+ -+static void call_do_xino_fwrite(void *args) -+{ -+ struct do_xino_fwrite_args *a = args; -+ *a->errp = do_xino_fwrite(a->file, a->buf, a->size, a->pos); -+} -+ -+static ssize_t xino_fwrite_wkq(struct file *file, void *buf, size_t size, -+ loff_t *pos) -+{ -+ ssize_t err; -+ int wkq_err; -+ struct do_xino_fwrite_args args = { -+ .errp = &err, -+ .file = file, -+ .buf = buf, -+ .size = size, -+ .pos = pos -+ }; -+ -+ /* -+ * it breaks RLIMIT_FSIZE and normal user's limit, -+ * users should care about quota and real 'filesystem full.' -+ */ -+ wkq_err = au_wkq_wait(call_do_xino_fwrite, &args); -+ if (unlikely(wkq_err)) -+ err = wkq_err; -+ -+ return err; -+} -+ -+ssize_t xino_fwrite(struct file *file, void *buf, size_t size, loff_t *pos) -+{ -+ ssize_t err; -+ -+ if (rlimit(RLIMIT_FSIZE) == RLIM_INFINITY) { -+ lockdep_off(); -+ err = do_xino_fwrite(file, buf, size, pos); -+ lockdep_on(); -+ } else { -+ lockdep_off(); -+ err = xino_fwrite_wkq(file, buf, size, pos); -+ lockdep_on(); -+ } -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * inode number bitmap -+ */ -+static const int page_bits = (int)PAGE_SIZE * BITS_PER_BYTE; -+static ino_t xib_calc_ino(unsigned long pindex, int bit) -+{ -+ ino_t ino; -+ -+ AuDebugOn(bit < 0 || page_bits <= bit); -+ ino = AUFS_FIRST_INO + pindex * page_bits + bit; -+ return ino; -+} -+ -+static void xib_calc_bit(ino_t ino, unsigned long *pindex, int *bit) -+{ -+ AuDebugOn(ino < AUFS_FIRST_INO); -+ ino -= AUFS_FIRST_INO; -+ *pindex = ino / page_bits; -+ *bit = ino % page_bits; -+} -+ -+static int xib_pindex(struct super_block *sb, unsigned long pindex) -+{ -+ int err; -+ loff_t pos; -+ ssize_t sz; -+ struct au_sbinfo *sbinfo; -+ struct file *xib; -+ unsigned long *p; -+ -+ sbinfo = au_sbi(sb); -+ MtxMustLock(&sbinfo->si_xib_mtx); -+ AuDebugOn(pindex > ULONG_MAX / PAGE_SIZE -+ || !au_opt_test(sbinfo->si_mntflags, XINO)); -+ -+ if (pindex == sbinfo->si_xib_last_pindex) -+ return 0; -+ -+ xib = sbinfo->si_xib; -+ p = sbinfo->si_xib_buf; -+ pos = sbinfo->si_xib_last_pindex; -+ pos *= PAGE_SIZE; -+ sz = xino_fwrite(xib, p, PAGE_SIZE, &pos); -+ if (unlikely(sz != PAGE_SIZE)) -+ goto out; -+ -+ pos = pindex; -+ pos *= PAGE_SIZE; -+ if (vfsub_f_size_read(xib) >= pos + PAGE_SIZE) -+ sz = xino_fread(xib, p, PAGE_SIZE, &pos); -+ else { -+ memset(p, 0, PAGE_SIZE); -+ sz = xino_fwrite(xib, p, PAGE_SIZE, &pos); -+ } -+ if (sz == PAGE_SIZE) { -+ sbinfo->si_xib_last_pindex = pindex; -+ return 0; /* success */ -+ } -+ -+out: -+ AuIOErr1("write failed (%zd)\n", sz); -+ err = sz; -+ if (sz >= 0) -+ err = -EIO; -+ return err; -+} -+ -+static void au_xib_clear_bit(struct inode *inode) -+{ -+ int err, bit; -+ unsigned long pindex; -+ struct super_block *sb; -+ struct au_sbinfo *sbinfo; -+ -+ AuDebugOn(inode->i_nlink); -+ -+ sb = inode->i_sb; -+ xib_calc_bit(inode->i_ino, &pindex, &bit); -+ AuDebugOn(page_bits <= bit); -+ sbinfo = au_sbi(sb); -+ mutex_lock(&sbinfo->si_xib_mtx); -+ err = xib_pindex(sb, pindex); -+ if (!err) { -+ clear_bit(bit, sbinfo->si_xib_buf); -+ sbinfo->si_xib_next_bit = bit; -+ } -+ mutex_unlock(&sbinfo->si_xib_mtx); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * truncate a xino bitmap file -+ */ -+ -+/* todo: slow */ -+static int do_xib_restore(struct super_block *sb, struct file *file, void *page) -+{ -+ int err, bit; -+ ssize_t sz; -+ unsigned long pindex; -+ loff_t pos, pend; -+ struct au_sbinfo *sbinfo; -+ ino_t *ino; -+ unsigned long *p; -+ -+ err = 0; -+ sbinfo = au_sbi(sb); -+ MtxMustLock(&sbinfo->si_xib_mtx); -+ p = sbinfo->si_xib_buf; -+ pend = vfsub_f_size_read(file); -+ pos = 0; -+ while (pos < pend) { -+ sz = xino_fread(file, page, PAGE_SIZE, &pos); -+ err = sz; -+ if (unlikely(sz <= 0)) -+ goto out; -+ -+ err = 0; -+ for (ino = page; sz > 0; ino++, sz -= sizeof(ino)) { -+ if (unlikely(*ino < AUFS_FIRST_INO)) -+ continue; -+ -+ xib_calc_bit(*ino, &pindex, &bit); -+ AuDebugOn(page_bits <= bit); -+ err = xib_pindex(sb, pindex); -+ if (!err) -+ set_bit(bit, p); -+ else -+ goto out; -+ } -+ } -+ -+out: -+ return err; -+} -+ -+static int xib_restore(struct super_block *sb) -+{ -+ int err, i; -+ unsigned int nfile; -+ aufs_bindex_t bindex, bbot; -+ void *page; -+ struct au_branch *br; -+ struct au_xino *xi; -+ struct file *file; -+ -+ err = -ENOMEM; -+ page = (void *)__get_free_page(GFP_NOFS); -+ if (unlikely(!page)) -+ goto out; -+ -+ err = 0; -+ bbot = au_sbbot(sb); -+ for (bindex = 0; !err && bindex <= bbot; bindex++) -+ if (!bindex || is_sb_shared(sb, bindex, bindex - 1) < 0) { -+ br = au_sbr(sb, bindex); -+ xi = br->br_xino; -+ nfile = xi->xi_nfile; -+ for (i = 0; i < nfile; i++) { -+ file = au_xino_file(xi, i); -+ if (file) -+ err = do_xib_restore(sb, file, page); -+ } -+ } else -+ AuDbg("skip shared b%d\n", bindex); -+ free_page((unsigned long)page); -+ -+out: -+ return err; -+} -+ -+int au_xib_trunc(struct super_block *sb) -+{ -+ int err; -+ ssize_t sz; -+ loff_t pos; -+ struct au_sbinfo *sbinfo; -+ unsigned long *p; -+ struct file *file; -+ -+ SiMustWriteLock(sb); -+ -+ err = 0; -+ sbinfo = au_sbi(sb); -+ if (!au_opt_test(sbinfo->si_mntflags, XINO)) -+ goto out; -+ -+ file = sbinfo->si_xib; -+ if (vfsub_f_size_read(file) <= PAGE_SIZE) -+ goto out; -+ -+ file = au_xino_create2(sb, &sbinfo->si_xib->f_path, NULL); -+ err = PTR_ERR(file); -+ if (IS_ERR(file)) -+ goto out; -+ fput(sbinfo->si_xib); -+ sbinfo->si_xib = file; -+ -+ p = sbinfo->si_xib_buf; -+ memset(p, 0, PAGE_SIZE); -+ pos = 0; -+ sz = xino_fwrite(sbinfo->si_xib, p, PAGE_SIZE, &pos); -+ if (unlikely(sz != PAGE_SIZE)) { -+ err = sz; -+ AuIOErr("err %d\n", err); -+ if (sz >= 0) -+ err = -EIO; -+ goto out; -+ } -+ -+ mutex_lock(&sbinfo->si_xib_mtx); -+ /* mnt_want_write() is unnecessary here */ -+ err = xib_restore(sb); -+ mutex_unlock(&sbinfo->si_xib_mtx); -+ -+out: -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+struct au_xino *au_xino_alloc(unsigned int nfile) -+{ -+ struct au_xino *xi; -+ -+ xi = kzalloc(sizeof(*xi), GFP_NOFS); -+ if (unlikely(!xi)) -+ goto out; -+ xi->xi_nfile = nfile; -+ xi->xi_file = kcalloc(nfile, sizeof(*xi->xi_file), GFP_NOFS); -+ if (unlikely(!xi->xi_file)) -+ goto out_free; -+ -+ xi->xi_nondir.total = 8; /* initial size */ -+ xi->xi_nondir.array = kcalloc(xi->xi_nondir.total, sizeof(ino_t), -+ GFP_NOFS); -+ if (unlikely(!xi->xi_nondir.array)) -+ goto out_file; -+ -+ spin_lock_init(&xi->xi_nondir.spin); -+ init_waitqueue_head(&xi->xi_nondir.wqh); -+ mutex_init(&xi->xi_mtx); -+ INIT_HLIST_BL_HEAD(&xi->xi_writing); -+ atomic_set(&xi->xi_truncating, 0); -+ kref_init(&xi->xi_kref); -+ goto out; /* success */ -+ -+out_file: -+ au_kfree_try_rcu(xi->xi_file); -+out_free: -+ au_kfree_rcu(xi); -+ xi = NULL; -+out: -+ return xi; -+} -+ -+static int au_xino_init(struct au_branch *br, int idx, struct file *file) -+{ -+ int err; -+ struct au_xino *xi; -+ -+ err = 0; -+ xi = au_xino_alloc(idx + 1); -+ if (unlikely(!xi)) { -+ err = -ENOMEM; -+ goto out; -+ } -+ -+ if (file) -+ get_file(file); -+ xi->xi_file[idx] = file; -+ AuDebugOn(br->br_xino); -+ br->br_xino = xi; -+ -+out: -+ return err; -+} -+ -+static void au_xino_release(struct kref *kref) -+{ -+ struct au_xino *xi; -+ int i; -+ unsigned long ul; -+ struct hlist_bl_head *hbl; -+ struct hlist_bl_node *pos, *n; -+ struct au_xi_writing *p; -+ -+ xi = container_of(kref, struct au_xino, xi_kref); -+ for (i = 0; i < xi->xi_nfile; i++) -+ if (xi->xi_file[i]) -+ fput(xi->xi_file[i]); -+ for (i = xi->xi_nondir.total - 1; i >= 0; i--) -+ AuDebugOn(xi->xi_nondir.array[i]); -+ mutex_destroy(&xi->xi_mtx); -+ hbl = &xi->xi_writing; -+ ul = au_hbl_count(hbl); -+ if (unlikely(ul)) { -+ pr_warn("xi_writing %lu\n", ul); -+ hlist_bl_lock(hbl); -+ hlist_bl_for_each_entry_safe(p, pos, n, hbl, node) { -+ hlist_bl_del(&p->node); -+ /* kmemleak reported au_kfree_rcu() doesn't free it */ -+ kfree(p); -+ } -+ hlist_bl_unlock(hbl); -+ } -+ au_kfree_try_rcu(xi->xi_file); -+ au_kfree_try_rcu(xi->xi_nondir.array); -+ au_kfree_rcu(xi); -+} -+ -+int au_xino_put(struct au_branch *br) -+{ -+ int ret; -+ struct au_xino *xi; -+ -+ ret = 0; -+ xi = br->br_xino; -+ if (xi) { -+ br->br_xino = NULL; -+ ret = kref_put(&xi->xi_kref, au_xino_release); -+ } -+ -+ return ret; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * xino mount option handlers -+ */ -+ -+/* xino bitmap */ -+static void xino_clear_xib(struct super_block *sb) -+{ -+ struct au_sbinfo *sbinfo; -+ -+ SiMustWriteLock(sb); -+ -+ sbinfo = au_sbi(sb); -+ if (sbinfo->si_xib) -+ fput(sbinfo->si_xib); -+ sbinfo->si_xib = NULL; -+ if (sbinfo->si_xib_buf) -+ free_page((unsigned long)sbinfo->si_xib_buf); -+ sbinfo->si_xib_buf = NULL; -+} -+ -+static int au_xino_set_xib(struct super_block *sb, struct path *path) -+{ -+ int err; -+ loff_t pos; -+ struct au_sbinfo *sbinfo; -+ struct file *file; -+ struct super_block *xi_sb; -+ -+ SiMustWriteLock(sb); -+ -+ sbinfo = au_sbi(sb); -+ file = au_xino_create2(sb, path, sbinfo->si_xib); -+ err = PTR_ERR(file); -+ if (IS_ERR(file)) -+ goto out; -+ if (sbinfo->si_xib) -+ fput(sbinfo->si_xib); -+ sbinfo->si_xib = file; -+ xi_sb = file_inode(file)->i_sb; -+ sbinfo->si_ximaxent = xi_sb->s_maxbytes; -+ if (unlikely(sbinfo->si_ximaxent < PAGE_SIZE)) { -+ err = -EIO; -+ pr_err("s_maxbytes(%llu) on %s is too small\n", -+ (u64)sbinfo->si_ximaxent, au_sbtype(xi_sb)); -+ goto out_unset; -+ } -+ sbinfo->si_ximaxent /= sizeof(ino_t); -+ -+ err = -ENOMEM; -+ if (!sbinfo->si_xib_buf) -+ sbinfo->si_xib_buf = (void *)get_zeroed_page(GFP_NOFS); -+ if (unlikely(!sbinfo->si_xib_buf)) -+ goto out_unset; -+ -+ sbinfo->si_xib_last_pindex = 0; -+ sbinfo->si_xib_next_bit = 0; -+ if (vfsub_f_size_read(file) < PAGE_SIZE) { -+ pos = 0; -+ err = xino_fwrite(file, sbinfo->si_xib_buf, PAGE_SIZE, &pos); -+ if (unlikely(err != PAGE_SIZE)) -+ goto out_free; -+ } -+ err = 0; -+ goto out; /* success */ -+ -+out_free: -+ if (sbinfo->si_xib_buf) -+ free_page((unsigned long)sbinfo->si_xib_buf); -+ sbinfo->si_xib_buf = NULL; -+ if (err >= 0) -+ err = -EIO; -+out_unset: -+ fput(sbinfo->si_xib); -+ sbinfo->si_xib = NULL; -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+/* xino for each branch */ -+static void xino_clear_br(struct super_block *sb) -+{ -+ aufs_bindex_t bindex, bbot; -+ struct au_branch *br; -+ -+ bbot = au_sbbot(sb); -+ for (bindex = 0; bindex <= bbot; bindex++) { -+ br = au_sbr(sb, bindex); -+ AuDebugOn(!br); -+ au_xino_put(br); -+ } -+} -+ -+static void au_xino_set_br_shared(struct super_block *sb, struct au_branch *br, -+ aufs_bindex_t bshared) -+{ -+ struct au_branch *brshared; -+ -+ brshared = au_sbr(sb, bshared); -+ AuDebugOn(!brshared->br_xino); -+ AuDebugOn(!brshared->br_xino->xi_file); -+ if (br->br_xino != brshared->br_xino) { -+ au_xino_get(brshared); -+ au_xino_put(br); -+ br->br_xino = brshared->br_xino; -+ } -+} -+ -+struct au_xino_do_set_br { -+ struct au_branch *br; -+ ino_t h_ino; -+ aufs_bindex_t bshared; -+}; -+ -+static int au_xino_do_set_br(struct super_block *sb, struct path *path, -+ struct au_xino_do_set_br *args) -+{ -+ int err; -+ struct au_xi_calc calc; -+ struct file *file; -+ struct au_branch *br; -+ struct au_xi_new xinew = { -+ .base = path -+ }; -+ -+ br = args->br; -+ xinew.xi = br->br_xino; -+ au_xi_calc(sb, args->h_ino, &calc); -+ xinew.copy_src = au_xino_file(xinew.xi, calc.idx); -+ if (args->bshared >= 0) -+ /* shared xino */ -+ au_xino_set_br_shared(sb, br, args->bshared); -+ else if (!xinew.xi) { -+ /* new xino */ -+ err = au_xino_init(br, calc.idx, xinew.copy_src); -+ if (unlikely(err)) -+ goto out; -+ } -+ -+ /* force re-creating */ -+ xinew.xi = br->br_xino; -+ xinew.idx = calc.idx; -+ mutex_lock(&xinew.xi->xi_mtx); -+ file = au_xi_new(sb, &xinew); -+ mutex_unlock(&xinew.xi->xi_mtx); -+ err = PTR_ERR(file); -+ if (IS_ERR(file)) -+ goto out; -+ AuDebugOn(!file); -+ -+ err = au_xino_do_write(file, &calc, AUFS_ROOT_INO); -+ if (unlikely(err)) -+ au_xino_put(br); -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+static int au_xino_set_br(struct super_block *sb, struct path *path) -+{ -+ int err; -+ aufs_bindex_t bindex, bbot; -+ struct au_xino_do_set_br args; -+ struct inode *inode; -+ -+ SiMustWriteLock(sb); -+ -+ bbot = au_sbbot(sb); -+ inode = d_inode(sb->s_root); -+ for (bindex = 0; bindex <= bbot; bindex++) { -+ args.h_ino = au_h_iptr(inode, bindex)->i_ino; -+ args.br = au_sbr(sb, bindex); -+ args.bshared = is_sb_shared(sb, bindex, bindex - 1); -+ err = au_xino_do_set_br(sb, path, &args); -+ if (unlikely(err)) -+ break; -+ } -+ -+ AuTraceErr(err); -+ return err; -+} -+ -+void au_xino_clr(struct super_block *sb) -+{ -+ struct au_sbinfo *sbinfo; -+ -+ au_xigen_clr(sb); -+ xino_clear_xib(sb); -+ xino_clear_br(sb); -+ dbgaufs_brs_del(sb, 0); -+ sbinfo = au_sbi(sb); -+ /* lvalue, do not call au_mntflags() */ -+ au_opt_clr(sbinfo->si_mntflags, XINO); -+} -+ -+int au_xino_set(struct super_block *sb, struct au_opt_xino *xiopt, int remount) -+{ -+ int err, skip; -+ struct dentry *dentry, *parent, *cur_dentry, *cur_parent; -+ struct qstr *dname, *cur_name; -+ struct file *cur_xino; -+ struct au_sbinfo *sbinfo; -+ struct path *path, *cur_path; -+ -+ SiMustWriteLock(sb); -+ -+ err = 0; -+ sbinfo = au_sbi(sb); -+ path = &xiopt->file->f_path; -+ dentry = path->dentry; -+ parent = dget_parent(dentry); -+ if (remount) { -+ skip = 0; -+ cur_xino = sbinfo->si_xib; -+ if (cur_xino) { -+ cur_path = &cur_xino->f_path; -+ cur_dentry = cur_path->dentry; -+ cur_parent = dget_parent(cur_dentry); -+ cur_name = &cur_dentry->d_name; -+ dname = &dentry->d_name; -+ skip = (cur_parent == parent -+ && au_qstreq(dname, cur_name)); -+ dput(cur_parent); -+ } -+ if (skip) -+ goto out; -+ } -+ -+ au_opt_set(sbinfo->si_mntflags, XINO); -+ err = au_xino_set_xib(sb, path); -+ /* si_x{read,write} are set */ -+ if (!err) -+ err = au_xigen_set(sb, path); -+ if (!err) -+ err = au_xino_set_br(sb, path); -+ if (!err) { -+ dbgaufs_brs_add(sb, 0, /*topdown*/1); -+ goto out; /* success */ -+ } -+ -+ /* reset all */ -+ AuIOErr("failed setting xino(%d).\n", err); -+ au_xino_clr(sb); -+ -+out: -+ dput(parent); -+ return err; -+} -+ -+/* -+ * create a xinofile at the default place/path. -+ */ -+struct file *au_xino_def(struct super_block *sb) -+{ -+ struct file *file; -+ char *page, *p; -+ struct au_branch *br; -+ struct super_block *h_sb; -+ struct path path; -+ aufs_bindex_t bbot, bindex, bwr; -+ -+ br = NULL; -+ bbot = au_sbbot(sb); -+ bwr = -1; -+ for (bindex = 0; bindex <= bbot; bindex++) { -+ br = au_sbr(sb, bindex); -+ if (au_br_writable(br->br_perm) -+ && !au_test_fs_bad_xino(au_br_sb(br))) { -+ bwr = bindex; -+ break; -+ } -+ } -+ -+ if (bwr >= 0) { -+ file = ERR_PTR(-ENOMEM); -+ page = (void *)__get_free_page(GFP_NOFS); -+ if (unlikely(!page)) -+ goto out; -+ path.mnt = au_br_mnt(br); -+ path.dentry = au_h_dptr(sb->s_root, bwr); -+ p = d_path(&path, page, PATH_MAX - sizeof(AUFS_XINO_FNAME)); -+ file = (void *)p; -+ if (!IS_ERR(p)) { -+ strcat(p, "/" AUFS_XINO_FNAME); -+ AuDbg("%s\n", p); -+ file = au_xino_create(sb, p, /*silent*/0, /*wbrtop*/1); -+ } -+ free_page((unsigned long)page); -+ } else { -+ file = au_xino_create(sb, AUFS_XINO_DEFPATH, /*silent*/0, -+ /*wbrtop*/0); -+ if (IS_ERR(file)) -+ goto out; -+ h_sb = file->f_path.dentry->d_sb; -+ if (unlikely(au_test_fs_bad_xino(h_sb))) { -+ pr_err("xino doesn't support %s(%s)\n", -+ AUFS_XINO_DEFPATH, au_sbtype(h_sb)); -+ fput(file); -+ file = ERR_PTR(-EINVAL); -+ } -+ } -+ -+out: -+ return file; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * initialize the xinofile for the specified branch @br -+ * at the place/path where @base_file indicates. -+ * test whether another branch is on the same filesystem or not, -+ * if found then share the xinofile with another branch. -+ */ -+int au_xino_init_br(struct super_block *sb, struct au_branch *br, ino_t h_ino, -+ struct path *base) -+{ -+ int err; -+ struct au_xino_do_set_br args = { -+ .h_ino = h_ino, -+ .br = br -+ }; -+ -+ args.bshared = sbr_find_shared(sb, /*btop*/0, au_sbbot(sb), -+ au_br_sb(br)); -+ err = au_xino_do_set_br(sb, base, &args); -+ if (unlikely(err)) -+ au_xino_put(br); -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * get an unused inode number from bitmap -+ */ -+ino_t au_xino_new_ino(struct super_block *sb) -+{ -+ ino_t ino; -+ unsigned long *p, pindex, ul, pend; -+ struct au_sbinfo *sbinfo; -+ struct file *file; -+ int free_bit, err; -+ -+ if (!au_opt_test(au_mntflags(sb), XINO)) -+ return iunique(sb, AUFS_FIRST_INO); -+ -+ sbinfo = au_sbi(sb); -+ mutex_lock(&sbinfo->si_xib_mtx); -+ p = sbinfo->si_xib_buf; -+ free_bit = sbinfo->si_xib_next_bit; -+ if (free_bit < page_bits && !test_bit(free_bit, p)) -+ goto out; /* success */ -+ free_bit = find_first_zero_bit(p, page_bits); -+ if (free_bit < page_bits) -+ goto out; /* success */ -+ -+ pindex = sbinfo->si_xib_last_pindex; -+ for (ul = pindex - 1; ul < ULONG_MAX; ul--) { -+ err = xib_pindex(sb, ul); -+ if (unlikely(err)) -+ goto out_err; -+ free_bit = find_first_zero_bit(p, page_bits); -+ if (free_bit < page_bits) -+ goto out; /* success */ -+ } -+ -+ file = sbinfo->si_xib; -+ pend = vfsub_f_size_read(file) / PAGE_SIZE; -+ for (ul = pindex + 1; ul <= pend; ul++) { -+ err = xib_pindex(sb, ul); -+ if (unlikely(err)) -+ goto out_err; -+ free_bit = find_first_zero_bit(p, page_bits); -+ if (free_bit < page_bits) -+ goto out; /* success */ -+ } -+ BUG(); -+ -+out: -+ set_bit(free_bit, p); -+ sbinfo->si_xib_next_bit = free_bit + 1; -+ pindex = sbinfo->si_xib_last_pindex; -+ mutex_unlock(&sbinfo->si_xib_mtx); -+ ino = xib_calc_ino(pindex, free_bit); -+ AuDbg("i%lu\n", (unsigned long)ino); -+ return ino; -+out_err: -+ mutex_unlock(&sbinfo->si_xib_mtx); -+ AuDbg("i0\n"); -+ return 0; -+} -+ -+/* for s_op->delete_inode() */ -+void au_xino_delete_inode(struct inode *inode, const int unlinked) -+{ -+ int err; -+ unsigned int mnt_flags; -+ aufs_bindex_t bindex, bbot, bi; -+ unsigned char try_trunc; -+ struct au_iinfo *iinfo; -+ struct super_block *sb; -+ struct au_hinode *hi; -+ struct inode *h_inode; -+ struct au_branch *br; -+ struct au_xi_calc calc; -+ struct file *file; -+ -+ AuDebugOn(au_is_bad_inode(inode)); -+ -+ sb = inode->i_sb; -+ mnt_flags = au_mntflags(sb); -+ if (!au_opt_test(mnt_flags, XINO) -+ || inode->i_ino == AUFS_ROOT_INO) -+ return; -+ -+ if (unlinked) { -+ au_xigen_inc(inode); -+ au_xib_clear_bit(inode); -+ } -+ -+ iinfo = au_ii(inode); -+ bindex = iinfo->ii_btop; -+ if (bindex < 0) -+ return; -+ -+ try_trunc = !!au_opt_test(mnt_flags, TRUNC_XINO); -+ hi = au_hinode(iinfo, bindex); -+ bbot = iinfo->ii_bbot; -+ for (; bindex <= bbot; bindex++, hi++) { -+ h_inode = hi->hi_inode; -+ if (!h_inode -+ || (!unlinked && h_inode->i_nlink)) -+ continue; -+ -+ /* inode may not be revalidated */ -+ bi = au_br_index(sb, hi->hi_id); -+ if (bi < 0) -+ continue; -+ -+ br = au_sbr(sb, bi); -+ au_xi_calc(sb, h_inode->i_ino, &calc); -+ file = au_xino_file(br->br_xino, calc.idx); -+ if (IS_ERR_OR_NULL(file)) -+ continue; -+ -+ err = au_xino_do_write(file, &calc, /*ino*/0); -+ if (!err && try_trunc -+ && au_test_fs_trunc_xino(au_br_sb(br))) -+ xino_try_trunc(sb, br); -+ } -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int au_xinondir_find(struct au_xino *xi, ino_t h_ino) -+{ -+ int found, total, i; -+ -+ found = -1; -+ total = xi->xi_nondir.total; -+ for (i = 0; i < total; i++) { -+ if (xi->xi_nondir.array[i] != h_ino) -+ continue; -+ found = i; -+ break; -+ } -+ -+ return found; -+} -+ -+static int au_xinondir_expand(struct au_xino *xi) -+{ -+ int err, sz; -+ ino_t *p; -+ -+ BUILD_BUG_ON(KMALLOC_MAX_SIZE > INT_MAX); -+ -+ err = -ENOMEM; -+ sz = xi->xi_nondir.total * sizeof(ino_t); -+ if (unlikely(sz > KMALLOC_MAX_SIZE / 2)) -+ goto out; -+ p = au_kzrealloc(xi->xi_nondir.array, sz, sz << 1, GFP_ATOMIC, -+ /*may_shrink*/0); -+ if (p) { -+ xi->xi_nondir.array = p; -+ xi->xi_nondir.total <<= 1; -+ AuDbg("xi_nondir.total %d\n", xi->xi_nondir.total); -+ err = 0; -+ } -+ -+out: -+ return err; -+} -+ -+void au_xinondir_leave(struct super_block *sb, aufs_bindex_t bindex, -+ ino_t h_ino, int idx) -+{ -+ struct au_xino *xi; -+ -+ AuDebugOn(!au_opt_test(au_mntflags(sb), XINO)); -+ xi = au_sbr(sb, bindex)->br_xino; -+ AuDebugOn(idx < 0 || xi->xi_nondir.total <= idx); -+ -+ spin_lock(&xi->xi_nondir.spin); -+ AuDebugOn(xi->xi_nondir.array[idx] != h_ino); -+ xi->xi_nondir.array[idx] = 0; -+ spin_unlock(&xi->xi_nondir.spin); -+ wake_up_all(&xi->xi_nondir.wqh); -+} -+ -+int au_xinondir_enter(struct super_block *sb, aufs_bindex_t bindex, ino_t h_ino, -+ int *idx) -+{ -+ int err, found, empty; -+ struct au_xino *xi; -+ -+ err = 0; -+ *idx = -1; -+ if (!au_opt_test(au_mntflags(sb), XINO)) -+ goto out; /* no xino */ -+ -+ xi = au_sbr(sb, bindex)->br_xino; -+ -+again: -+ spin_lock(&xi->xi_nondir.spin); -+ found = au_xinondir_find(xi, h_ino); -+ if (found == -1) { -+ empty = au_xinondir_find(xi, /*h_ino*/0); -+ if (empty == -1) { -+ empty = xi->xi_nondir.total; -+ err = au_xinondir_expand(xi); -+ if (unlikely(err)) -+ goto out_unlock; -+ } -+ xi->xi_nondir.array[empty] = h_ino; -+ *idx = empty; -+ } else { -+ spin_unlock(&xi->xi_nondir.spin); -+ wait_event(xi->xi_nondir.wqh, -+ xi->xi_nondir.array[found] != h_ino); -+ goto again; -+ } -+ -+out_unlock: -+ spin_unlock(&xi->xi_nondir.spin); -+out: -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+int au_xino_path(struct seq_file *seq, struct file *file) -+{ -+ int err; -+ -+ err = au_seq_path(seq, &file->f_path); -+ if (unlikely(err)) -+ goto out; -+ -+#define Deleted "\\040(deleted)" -+ seq->count -= sizeof(Deleted) - 1; -+ AuDebugOn(memcmp(seq->buf + seq->count, Deleted, -+ sizeof(Deleted) - 1)); -+#undef Deleted -+ -+out: -+ return err; -+} -diff -Naur null/include/uapi/linux/aufs_type.h linux-5.15.36/include/uapi/linux/aufs_type.h ---- /dev/null -+++ linux-5.15.36/include/uapi/linux/aufs_type.h 2022-05-10 16:51:39.879744219 +0300 -@@ -0,0 +1,452 @@ -+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program. If not, see . -+ */ -+ -+#ifndef __AUFS_TYPE_H__ -+#define __AUFS_TYPE_H__ -+ -+#define AUFS_NAME "aufs" -+ -+#ifdef __KERNEL__ -+/* -+ * define it before including all other headers. -+ * sched.h may use pr_* macros before defining "current", so define the -+ * no-current version first, and re-define later. -+ */ -+#define pr_fmt(fmt) AUFS_NAME " %s:%d: " fmt, __func__, __LINE__ -+#include -+#undef pr_fmt -+#define pr_fmt(fmt) \ -+ AUFS_NAME " %s:%d:%.*s[%d]: " fmt, __func__, __LINE__, \ -+ (int)sizeof(current->comm), current->comm, current->pid -+#include -+#else -+#include -+#include -+#include -+#endif /* __KERNEL__ */ -+ -+#define AUFS_VERSION "5.15.36-20220509" -+ -+/* todo? move this to linux-2.6.19/include/magic.h */ -+#define AUFS_SUPER_MAGIC ('a' << 24 | 'u' << 16 | 'f' << 8 | 's') -+ -+/* ---------------------------------------------------------------------- */ -+ -+#ifdef __KERNEL__ -+#ifdef CONFIG_AUFS_BRANCH_MAX_127 -+typedef int8_t aufs_bindex_t; -+#define AUFS_BRANCH_MAX 127 -+#else -+typedef int16_t aufs_bindex_t; -+#ifdef CONFIG_AUFS_BRANCH_MAX_511 -+#define AUFS_BRANCH_MAX 511 -+#elif defined(CONFIG_AUFS_BRANCH_MAX_1023) -+#define AUFS_BRANCH_MAX 1023 -+#elif defined(CONFIG_AUFS_BRANCH_MAX_32767) -+#define AUFS_BRANCH_MAX 32767 -+#endif -+#endif -+ -+#ifndef AUFS_BRANCH_MAX -+#error unknown CONFIG_AUFS_BRANCH_MAX value -+#endif -+#endif /* __KERNEL__ */ -+ -+/* ---------------------------------------------------------------------- */ -+ -+#define AUFS_FSTYPE AUFS_NAME -+ -+#define AUFS_ROOT_INO 2 -+#define AUFS_FIRST_INO 11 -+ -+#define AUFS_WH_PFX ".wh." -+#define AUFS_WH_PFX_LEN ((int)sizeof(AUFS_WH_PFX) - 1) -+#define AUFS_WH_TMP_LEN 4 -+/* a limit for rmdir/rename a dir and copyup */ -+#define AUFS_MAX_NAMELEN (NAME_MAX \ -+ - AUFS_WH_PFX_LEN * 2 /* doubly whiteouted */\ -+ - 1 /* dot */\ -+ - AUFS_WH_TMP_LEN) /* hex */ -+#define AUFS_XINO_FNAME "." AUFS_NAME ".xino" -+#define AUFS_XINO_DEFPATH "/tmp/" AUFS_XINO_FNAME -+#define AUFS_XINO_DEF_SEC 30 /* seconds */ -+#define AUFS_XINO_DEF_TRUNC 45 /* percentage */ -+#define AUFS_DIRWH_DEF 3 -+#define AUFS_RDCACHE_DEF 10 /* seconds */ -+#define AUFS_RDCACHE_MAX 3600 /* seconds */ -+#define AUFS_RDBLK_DEF 512 /* bytes */ -+#define AUFS_RDHASH_DEF 32 -+#define AUFS_WKQ_NAME AUFS_NAME "d" -+#define AUFS_MFS_DEF_SEC 30 /* seconds */ -+#define AUFS_MFS_MAX_SEC 3600 /* seconds */ -+#define AUFS_FHSM_CACHE_DEF_SEC 30 /* seconds */ -+#define AUFS_PLINK_WARN 50 /* number of plinks in a single bucket */ -+ -+/* pseudo-link maintenace under /proc */ -+#define AUFS_PLINK_MAINT_NAME "plink_maint" -+#define AUFS_PLINK_MAINT_DIR "fs/" AUFS_NAME -+#define AUFS_PLINK_MAINT_PATH AUFS_PLINK_MAINT_DIR "/" AUFS_PLINK_MAINT_NAME -+ -+/* dirren, renamed dir */ -+#define AUFS_DR_INFO_PFX AUFS_WH_PFX ".dr." -+#define AUFS_DR_BRHINO_NAME AUFS_WH_PFX "hino" -+/* whiteouted doubly */ -+#define AUFS_WH_DR_INFO_PFX AUFS_WH_PFX AUFS_DR_INFO_PFX -+#define AUFS_WH_DR_BRHINO AUFS_WH_PFX AUFS_DR_BRHINO_NAME -+ -+#define AUFS_DIROPQ_NAME AUFS_WH_PFX ".opq" /* whiteouted doubly */ -+#define AUFS_WH_DIROPQ AUFS_WH_PFX AUFS_DIROPQ_NAME -+ -+#define AUFS_BASE_NAME AUFS_WH_PFX AUFS_NAME -+#define AUFS_PLINKDIR_NAME AUFS_WH_PFX "plnk" -+#define AUFS_ORPHDIR_NAME AUFS_WH_PFX "orph" -+ -+/* doubly whiteouted */ -+#define AUFS_WH_BASE AUFS_WH_PFX AUFS_BASE_NAME -+#define AUFS_WH_PLINKDIR AUFS_WH_PFX AUFS_PLINKDIR_NAME -+#define AUFS_WH_ORPHDIR AUFS_WH_PFX AUFS_ORPHDIR_NAME -+ -+/* branch permissions and attributes */ -+#define AUFS_BRPERM_RW "rw" -+#define AUFS_BRPERM_RO "ro" -+#define AUFS_BRPERM_RR "rr" -+#define AUFS_BRATTR_COO_REG "coo_reg" -+#define AUFS_BRATTR_COO_ALL "coo_all" -+#define AUFS_BRATTR_FHSM "fhsm" -+#define AUFS_BRATTR_UNPIN "unpin" -+#define AUFS_BRATTR_ICEX "icex" -+#define AUFS_BRATTR_ICEX_SEC "icexsec" -+#define AUFS_BRATTR_ICEX_SYS "icexsys" -+#define AUFS_BRATTR_ICEX_TR "icextr" -+#define AUFS_BRATTR_ICEX_USR "icexusr" -+#define AUFS_BRATTR_ICEX_OTH "icexoth" -+#define AUFS_BRRATTR_WH "wh" -+#define AUFS_BRWATTR_NLWH "nolwh" -+#define AUFS_BRWATTR_MOO "moo" -+ -+#define AuBrPerm_RW 1 /* writable, hardlinkable wh */ -+#define AuBrPerm_RO (1 << 1) /* readonly */ -+#define AuBrPerm_RR (1 << 2) /* natively readonly */ -+#define AuBrPerm_Mask (AuBrPerm_RW | AuBrPerm_RO | AuBrPerm_RR) -+ -+#define AuBrAttr_COO_REG (1 << 3) /* copy-up on open */ -+#define AuBrAttr_COO_ALL (1 << 4) -+#define AuBrAttr_COO_Mask (AuBrAttr_COO_REG | AuBrAttr_COO_ALL) -+ -+#define AuBrAttr_FHSM (1 << 5) /* file-based hsm */ -+#define AuBrAttr_UNPIN (1 << 6) /* rename-able top dir of -+ branch. meaningless since -+ linux-3.18-rc1 */ -+ -+/* ignore error in copying XATTR */ -+#define AuBrAttr_ICEX_SEC (1 << 7) -+#define AuBrAttr_ICEX_SYS (1 << 8) -+#define AuBrAttr_ICEX_TR (1 << 9) -+#define AuBrAttr_ICEX_USR (1 << 10) -+#define AuBrAttr_ICEX_OTH (1 << 11) -+#define AuBrAttr_ICEX (AuBrAttr_ICEX_SEC \ -+ | AuBrAttr_ICEX_SYS \ -+ | AuBrAttr_ICEX_TR \ -+ | AuBrAttr_ICEX_USR \ -+ | AuBrAttr_ICEX_OTH) -+ -+#define AuBrRAttr_WH (1 << 12) /* whiteout-able */ -+#define AuBrRAttr_Mask AuBrRAttr_WH -+ -+#define AuBrWAttr_NoLinkWH (1 << 13) /* un-hardlinkable whiteouts */ -+#define AuBrWAttr_MOO (1 << 14) /* move-up on open */ -+#define AuBrWAttr_Mask (AuBrWAttr_NoLinkWH | AuBrWAttr_MOO) -+ -+#define AuBrAttr_CMOO_Mask (AuBrAttr_COO_Mask | AuBrWAttr_MOO) -+ -+/* #warning test userspace */ -+#ifdef __KERNEL__ -+#ifndef CONFIG_AUFS_FHSM -+#undef AuBrAttr_FHSM -+#define AuBrAttr_FHSM 0 -+#endif -+#ifndef CONFIG_AUFS_XATTR -+#undef AuBrAttr_ICEX -+#define AuBrAttr_ICEX 0 -+#undef AuBrAttr_ICEX_SEC -+#define AuBrAttr_ICEX_SEC 0 -+#undef AuBrAttr_ICEX_SYS -+#define AuBrAttr_ICEX_SYS 0 -+#undef AuBrAttr_ICEX_TR -+#define AuBrAttr_ICEX_TR 0 -+#undef AuBrAttr_ICEX_USR -+#define AuBrAttr_ICEX_USR 0 -+#undef AuBrAttr_ICEX_OTH -+#define AuBrAttr_ICEX_OTH 0 -+#endif -+#endif -+ -+/* the longest combination */ -+/* AUFS_BRATTR_ICEX and AUFS_BRATTR_ICEX_TR don't affect here */ -+#define AuBrPermStrSz sizeof(AUFS_BRPERM_RW \ -+ "+" AUFS_BRATTR_COO_REG \ -+ "+" AUFS_BRATTR_FHSM \ -+ "+" AUFS_BRATTR_UNPIN \ -+ "+" AUFS_BRATTR_ICEX_SEC \ -+ "+" AUFS_BRATTR_ICEX_SYS \ -+ "+" AUFS_BRATTR_ICEX_USR \ -+ "+" AUFS_BRATTR_ICEX_OTH \ -+ "+" AUFS_BRWATTR_NLWH) -+ -+typedef struct { -+ char a[AuBrPermStrSz]; -+} au_br_perm_str_t; -+ -+static inline int au_br_writable(int brperm) -+{ -+ return brperm & AuBrPerm_RW; -+} -+ -+static inline int au_br_whable(int brperm) -+{ -+ return brperm & (AuBrPerm_RW | AuBrRAttr_WH); -+} -+ -+static inline int au_br_wh_linkable(int brperm) -+{ -+ return !(brperm & AuBrWAttr_NoLinkWH); -+} -+ -+static inline int au_br_cmoo(int brperm) -+{ -+ return brperm & AuBrAttr_CMOO_Mask; -+} -+ -+static inline int au_br_fhsm(int brperm) -+{ -+ return brperm & AuBrAttr_FHSM; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* ioctl */ -+enum { -+ /* readdir in userspace */ -+ AuCtl_RDU, -+ AuCtl_RDU_INO, -+ -+ AuCtl_WBR_FD, /* pathconf wrapper */ -+ AuCtl_IBUSY, /* busy inode */ -+ AuCtl_MVDOWN, /* move-down */ -+ AuCtl_BR, /* info about branches */ -+ AuCtl_FHSM_FD /* connection for fhsm */ -+}; -+ -+/* borrowed from linux/include/linux/kernel.h */ -+#ifndef ALIGN -+#ifdef _GNU_SOURCE -+#define ALIGN(x, a) __ALIGN_MASK(x, (typeof(x))(a)-1) -+#else -+#define ALIGN(x, a) (((x) + (a) - 1) & ~((a) - 1)) -+#endif -+#define __ALIGN_MASK(x, mask) (((x)+(mask))&~(mask)) -+#endif -+ -+/* borrowed from linux/include/linux/compiler-gcc3.h */ -+#ifndef __aligned -+#define __aligned(x) __attribute__((aligned(x))) -+#endif -+ -+#ifdef __KERNEL__ -+#ifndef __packed -+#define __packed __attribute__((packed)) -+#endif -+#endif -+ -+struct au_rdu_cookie { -+ uint64_t h_pos; -+ int16_t bindex; -+ uint8_t flags; -+ uint8_t pad; -+ uint32_t generation; -+} __aligned(8); -+ -+struct au_rdu_ent { -+ uint64_t ino; -+ int16_t bindex; -+ uint8_t type; -+ uint8_t nlen; -+ uint8_t wh; -+ char name[]; -+} __aligned(8); -+ -+static inline int au_rdu_len(int nlen) -+{ -+ /* include the terminating NULL */ -+ return ALIGN(sizeof(struct au_rdu_ent) + nlen + 1, -+ sizeof(uint64_t)); -+} -+ -+union au_rdu_ent_ul { -+ struct au_rdu_ent __user *e; -+ uint64_t ul; -+}; -+ -+enum { -+ AufsCtlRduV_SZ, -+ AufsCtlRduV_End -+}; -+ -+struct aufs_rdu { -+ /* input */ -+ union { -+ uint64_t sz; /* AuCtl_RDU */ -+ uint64_t nent; /* AuCtl_RDU_INO */ -+ }; -+ union au_rdu_ent_ul ent; -+ uint16_t verify[AufsCtlRduV_End]; -+ -+ /* input/output */ -+ uint32_t blk; -+ -+ /* output */ -+ union au_rdu_ent_ul tail; -+ /* number of entries which were added in a single call */ -+ uint64_t rent; -+ uint8_t full; -+ uint8_t shwh; -+ -+ struct au_rdu_cookie cookie; -+} __aligned(8); -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* dirren. the branch is identified by the filename who contains this */ -+struct au_drinfo { -+ uint64_t ino; -+ union { -+ uint8_t oldnamelen; -+ uint64_t _padding; -+ }; -+ uint8_t oldname[]; -+} __aligned(8); -+ -+struct au_drinfo_fdata { -+ uint32_t magic; -+ struct au_drinfo drinfo; -+} __aligned(8); -+ -+#define AUFS_DRINFO_MAGIC_V1 ('a' << 24 | 'd' << 16 | 'r' << 8 | 0x01) -+/* future */ -+#define AUFS_DRINFO_MAGIC_V2 ('a' << 24 | 'd' << 16 | 'r' << 8 | 0x02) -+ -+/* ---------------------------------------------------------------------- */ -+ -+struct aufs_wbr_fd { -+ uint32_t oflags; -+ int16_t brid; -+} __aligned(8); -+ -+/* ---------------------------------------------------------------------- */ -+ -+struct aufs_ibusy { -+ uint64_t ino, h_ino; -+ int16_t bindex; -+} __aligned(8); -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* error code for move-down */ -+/* the actual message strings are implemented in aufs-util.git */ -+enum { -+ EAU_MVDOWN_OPAQUE = 1, -+ EAU_MVDOWN_WHITEOUT, -+ EAU_MVDOWN_UPPER, -+ EAU_MVDOWN_BOTTOM, -+ EAU_MVDOWN_NOUPPER, -+ EAU_MVDOWN_NOLOWERBR, -+ EAU_Last -+}; -+ -+/* flags for move-down */ -+#define AUFS_MVDOWN_DMSG 1 -+#define AUFS_MVDOWN_OWLOWER (1 << 1) /* overwrite lower */ -+#define AUFS_MVDOWN_KUPPER (1 << 2) /* keep upper */ -+#define AUFS_MVDOWN_ROLOWER (1 << 3) /* do even if lower is RO */ -+#define AUFS_MVDOWN_ROLOWER_R (1 << 4) /* did on lower RO */ -+#define AUFS_MVDOWN_ROUPPER (1 << 5) /* do even if upper is RO */ -+#define AUFS_MVDOWN_ROUPPER_R (1 << 6) /* did on upper RO */ -+#define AUFS_MVDOWN_BRID_UPPER (1 << 7) /* upper brid */ -+#define AUFS_MVDOWN_BRID_LOWER (1 << 8) /* lower brid */ -+#define AUFS_MVDOWN_FHSM_LOWER (1 << 9) /* find fhsm attr for lower */ -+#define AUFS_MVDOWN_STFS (1 << 10) /* req. stfs */ -+#define AUFS_MVDOWN_STFS_FAILED (1 << 11) /* output: stfs is unusable */ -+#define AUFS_MVDOWN_BOTTOM (1 << 12) /* output: no more lowers */ -+ -+/* index for move-down */ -+enum { -+ AUFS_MVDOWN_UPPER, -+ AUFS_MVDOWN_LOWER, -+ AUFS_MVDOWN_NARRAY -+}; -+ -+/* -+ * additional info of move-down -+ * number of free blocks and inodes. -+ * subset of struct kstatfs, but smaller and always 64bit. -+ */ -+struct aufs_stfs { -+ uint64_t f_blocks; -+ uint64_t f_bavail; -+ uint64_t f_files; -+ uint64_t f_ffree; -+}; -+ -+struct aufs_stbr { -+ int16_t brid; /* optional input */ -+ int16_t bindex; /* output */ -+ struct aufs_stfs stfs; /* output when AUFS_MVDOWN_STFS set */ -+} __aligned(8); -+ -+struct aufs_mvdown { -+ uint32_t flags; /* input/output */ -+ struct aufs_stbr stbr[AUFS_MVDOWN_NARRAY]; /* input/output */ -+ int8_t au_errno; /* output */ -+} __aligned(8); -+ -+/* ---------------------------------------------------------------------- */ -+ -+union aufs_brinfo { -+ /* PATH_MAX may differ between kernel-space and user-space */ -+ char _spacer[4096]; -+ struct { -+ int16_t id; -+ int perm; -+ char path[]; -+ }; -+} __aligned(8); -+ -+/* ---------------------------------------------------------------------- */ -+ -+#define AuCtlType 'A' -+#define AUFS_CTL_RDU _IOWR(AuCtlType, AuCtl_RDU, struct aufs_rdu) -+#define AUFS_CTL_RDU_INO _IOWR(AuCtlType, AuCtl_RDU_INO, struct aufs_rdu) -+#define AUFS_CTL_WBR_FD _IOW(AuCtlType, AuCtl_WBR_FD, \ -+ struct aufs_wbr_fd) -+#define AUFS_CTL_IBUSY _IOWR(AuCtlType, AuCtl_IBUSY, struct aufs_ibusy) -+#define AUFS_CTL_MVDOWN _IOWR(AuCtlType, AuCtl_MVDOWN, \ -+ struct aufs_mvdown) -+#define AUFS_CTL_BRINFO _IOW(AuCtlType, AuCtl_BR, union aufs_brinfo) -+#define AUFS_CTL_FHSM_FD _IOW(AuCtlType, AuCtl_FHSM_FD, int) -+ -+#endif /* __AUFS_TYPE_H__ */ diff --git a/kernel/kernel/files/patches/aufs5/aufs5.15.41-20220530.patch b/kernel/kernel/files/patches/aufs5/aufs5.15.41-20220620.patch similarity index 99% rename from kernel/kernel/files/patches/aufs5/aufs5.15.41-20220530.patch rename to kernel/kernel/files/patches/aufs5/aufs5.15.41-20220620.patch index 4b3bd5f3..ab061321 100644 --- a/kernel/kernel/files/patches/aufs5/aufs5.15.41-20220530.patch +++ b/kernel/kernel/files/patches/aufs5/aufs5.15.41-20220620.patch @@ -1,6 +1,6 @@ diff -Naur null/Documentation/ABI/testing/debugfs-aufs linux-5.15.41/Documentation/ABI/testing/debugfs-aufs --- /dev/null -+++ linux-5.15.41/Documentation/ABI/testing/debugfs-aufs 2022-05-31 16:59:51.182880353 +0300 ++++ linux-5.15.41/Documentation/ABI/testing/debugfs-aufs 2022-09-06 12:51:51.030710012 +0300 @@ -0,0 +1,55 @@ +What: /debug/aufs/si_/ +Date: March 2009 @@ -59,7 +59,7 @@ diff -Naur null/Documentation/ABI/testing/debugfs-aufs linux-5.15.41/Documentati + will be empty. About XINO files, see the aufs manual. diff -Naur null/Documentation/ABI/testing/sysfs-aufs linux-5.15.41/Documentation/ABI/testing/sysfs-aufs --- /dev/null -+++ linux-5.15.41/Documentation/ABI/testing/sysfs-aufs 2022-05-31 16:59:51.182880353 +0300 ++++ linux-5.15.41/Documentation/ABI/testing/sysfs-aufs 2022-09-06 12:51:51.030710012 +0300 @@ -0,0 +1,31 @@ +What: /sys/fs/aufs/si_/ +Date: March 2009 @@ -94,7 +94,7 @@ diff -Naur null/Documentation/ABI/testing/sysfs-aufs linux-5.15.41/Documentation + will be empty. About XINO files, see the aufs manual. diff -Naur null/Documentation/filesystems/aufs/design/01intro.txt linux-5.15.41/Documentation/filesystems/aufs/design/01intro.txt --- /dev/null -+++ linux-5.15.41/Documentation/filesystems/aufs/design/01intro.txt 2022-05-31 16:59:51.183880353 +0300 ++++ linux-5.15.41/Documentation/filesystems/aufs/design/01intro.txt 2022-09-06 12:51:51.031709999 +0300 @@ -0,0 +1,171 @@ + +# Copyright (C) 2005-2021 Junjiro R. Okajima @@ -269,7 +269,7 @@ diff -Naur null/Documentation/filesystems/aufs/design/01intro.txt linux-5.15.41/ +about it. But currently I have implemented it in kernel space. diff -Naur null/Documentation/filesystems/aufs/design/02struct.txt linux-5.15.41/Documentation/filesystems/aufs/design/02struct.txt --- /dev/null -+++ linux-5.15.41/Documentation/filesystems/aufs/design/02struct.txt 2022-05-31 16:59:51.183880353 +0300 ++++ linux-5.15.41/Documentation/filesystems/aufs/design/02struct.txt 2022-09-06 12:51:51.031709999 +0300 @@ -0,0 +1,258 @@ + +# Copyright (C) 2005-2021 Junjiro R. Okajima @@ -531,7 +531,7 @@ diff -Naur null/Documentation/filesystems/aufs/design/02struct.txt linux-5.15.41 +For this purpose, use "aumvdown" command in aufs-util.git. diff -Naur null/Documentation/filesystems/aufs/design/03atomic_open.txt linux-5.15.41/Documentation/filesystems/aufs/design/03atomic_open.txt --- /dev/null -+++ linux-5.15.41/Documentation/filesystems/aufs/design/03atomic_open.txt 2022-05-31 16:59:51.183880353 +0300 ++++ linux-5.15.41/Documentation/filesystems/aufs/design/03atomic_open.txt 2022-09-06 12:51:51.031709999 +0300 @@ -0,0 +1,85 @@ + +# Copyright (C) 2015-2021 Junjiro R. Okajima @@ -620,7 +620,7 @@ diff -Naur null/Documentation/filesystems/aufs/design/03atomic_open.txt linux-5. + be implemented in aufs, but not all I am afraid. diff -Naur null/Documentation/filesystems/aufs/design/03lookup.txt linux-5.15.41/Documentation/filesystems/aufs/design/03lookup.txt --- /dev/null -+++ linux-5.15.41/Documentation/filesystems/aufs/design/03lookup.txt 2022-05-31 16:59:51.183880353 +0300 ++++ linux-5.15.41/Documentation/filesystems/aufs/design/03lookup.txt 2022-09-06 12:51:51.031709999 +0300 @@ -0,0 +1,113 @@ + +# Copyright (C) 2005-2021 Junjiro R. Okajima @@ -737,7 +737,7 @@ diff -Naur null/Documentation/filesystems/aufs/design/03lookup.txt linux-5.15.41 + by over-mounting something (or another method). diff -Naur null/Documentation/filesystems/aufs/design/04branch.txt linux-5.15.41/Documentation/filesystems/aufs/design/04branch.txt --- /dev/null -+++ linux-5.15.41/Documentation/filesystems/aufs/design/04branch.txt 2022-05-31 16:59:51.183880353 +0300 ++++ linux-5.15.41/Documentation/filesystems/aufs/design/04branch.txt 2022-09-06 12:51:51.031709999 +0300 @@ -0,0 +1,74 @@ + +# Copyright (C) 2005-2021 Junjiro R. Okajima @@ -815,7 +815,7 @@ diff -Naur null/Documentation/filesystems/aufs/design/04branch.txt linux-5.15.41 + same named entry on the upper branch. diff -Naur null/Documentation/filesystems/aufs/design/05wbr_policy.txt linux-5.15.41/Documentation/filesystems/aufs/design/05wbr_policy.txt --- /dev/null -+++ linux-5.15.41/Documentation/filesystems/aufs/design/05wbr_policy.txt 2022-05-31 16:59:51.183880353 +0300 ++++ linux-5.15.41/Documentation/filesystems/aufs/design/05wbr_policy.txt 2022-09-06 12:51:51.032709987 +0300 @@ -0,0 +1,64 @@ + +# Copyright (C) 2005-2021 Junjiro R. Okajima @@ -883,7 +883,7 @@ diff -Naur null/Documentation/filesystems/aufs/design/05wbr_policy.txt linux-5.1 + copyup policy. diff -Naur null/Documentation/filesystems/aufs/design/06dirren.dot linux-5.15.41/Documentation/filesystems/aufs/design/06dirren.dot --- /dev/null -+++ linux-5.15.41/Documentation/filesystems/aufs/design/06dirren.dot 2022-05-31 16:59:51.184880353 +0300 ++++ linux-5.15.41/Documentation/filesystems/aufs/design/06dirren.dot 2022-09-06 12:51:51.032709987 +0300 @@ -0,0 +1,31 @@ + +// to view this graph, run dot(1) command in GRAPHVIZ. @@ -918,7 +918,7 @@ diff -Naur null/Documentation/filesystems/aufs/design/06dirren.dot linux-5.15.41 +} diff -Naur null/Documentation/filesystems/aufs/design/06dirren.txt linux-5.15.41/Documentation/filesystems/aufs/design/06dirren.txt --- /dev/null -+++ linux-5.15.41/Documentation/filesystems/aufs/design/06dirren.txt 2022-05-31 16:59:51.184880353 +0300 ++++ linux-5.15.41/Documentation/filesystems/aufs/design/06dirren.txt 2022-09-06 12:51:51.032709987 +0300 @@ -0,0 +1,102 @@ + +# Copyright (C) 2017-2021 Junjiro R. Okajima @@ -999,7 +999,7 @@ diff -Naur null/Documentation/filesystems/aufs/design/06dirren.txt linux-5.15.41 +simply the inode-numbers on the branch. The file is created or updated +in removing the branch, and loaded in adding the branch. Its lifetime is +equal to the branch. -+The list is refered in lookup, and when the current target inode is ++The list is referred in lookup, and when the current target inode is +found in the list, the aufs tries loading the "detailed info per +directory" and get the changed and valid name of the dir. + @@ -1024,7 +1024,7 @@ diff -Naur null/Documentation/filesystems/aufs/design/06dirren.txt linux-5.15.41 +equivalen to udba=reval case. diff -Naur null/Documentation/filesystems/aufs/design/06fhsm.txt linux-5.15.41/Documentation/filesystems/aufs/design/06fhsm.txt --- /dev/null -+++ linux-5.15.41/Documentation/filesystems/aufs/design/06fhsm.txt 2022-05-31 16:59:51.184880353 +0300 ++++ linux-5.15.41/Documentation/filesystems/aufs/design/06fhsm.txt 2022-09-06 12:51:51.032709987 +0300 @@ -0,0 +1,120 @@ + +# Copyright (C) 2011-2021 Junjiro R. Okajima @@ -1148,7 +1148,7 @@ diff -Naur null/Documentation/filesystems/aufs/design/06fhsm.txt linux-5.15.41/D +should restore the original file state after an error happens. diff -Naur null/Documentation/filesystems/aufs/design/06mmap.txt linux-5.15.41/Documentation/filesystems/aufs/design/06mmap.txt --- /dev/null -+++ linux-5.15.41/Documentation/filesystems/aufs/design/06mmap.txt 2022-05-31 16:59:51.184880353 +0300 ++++ linux-5.15.41/Documentation/filesystems/aufs/design/06mmap.txt 2022-09-06 12:51:51.032709987 +0300 @@ -0,0 +1,72 @@ + +# Copyright (C) 2005-2021 Junjiro R. Okajima @@ -1224,7 +1224,7 @@ diff -Naur null/Documentation/filesystems/aufs/design/06mmap.txt linux-5.15.41/D +I have to give up this "looks-smater" approach. diff -Naur null/Documentation/filesystems/aufs/design/06xattr.txt linux-5.15.41/Documentation/filesystems/aufs/design/06xattr.txt --- /dev/null -+++ linux-5.15.41/Documentation/filesystems/aufs/design/06xattr.txt 2022-05-31 16:59:51.184880353 +0300 ++++ linux-5.15.41/Documentation/filesystems/aufs/design/06xattr.txt 2022-09-06 12:51:51.032709987 +0300 @@ -0,0 +1,96 @@ + +# Copyright (C) 2014-2021 Junjiro R. Okajima @@ -1324,7 +1324,7 @@ diff -Naur null/Documentation/filesystems/aufs/design/06xattr.txt linux-5.15.41/ +now, aufs implements the branch attributes to ignore the error. diff -Naur null/Documentation/filesystems/aufs/design/07export.txt linux-5.15.41/Documentation/filesystems/aufs/design/07export.txt --- /dev/null -+++ linux-5.15.41/Documentation/filesystems/aufs/design/07export.txt 2022-05-31 16:59:51.184880353 +0300 ++++ linux-5.15.41/Documentation/filesystems/aufs/design/07export.txt 2022-09-06 12:51:51.032709987 +0300 @@ -0,0 +1,58 @@ + +# Copyright (C) 2005-2021 Junjiro R. Okajima @@ -1386,7 +1386,7 @@ diff -Naur null/Documentation/filesystems/aufs/design/07export.txt linux-5.15.41 + lookup_one_len(), vfs_getattr(), encode_fh() and others. diff -Naur null/Documentation/filesystems/aufs/design/08shwh.txt linux-5.15.41/Documentation/filesystems/aufs/design/08shwh.txt --- /dev/null -+++ linux-5.15.41/Documentation/filesystems/aufs/design/08shwh.txt 2022-05-31 16:59:51.184880353 +0300 ++++ linux-5.15.41/Documentation/filesystems/aufs/design/08shwh.txt 2022-09-06 12:51:51.032709987 +0300 @@ -0,0 +1,52 @@ + +# Copyright (C) 2005-2021 Junjiro R. Okajima @@ -1442,7 +1442,7 @@ diff -Naur null/Documentation/filesystems/aufs/design/08shwh.txt linux-5.15.41/D +initramfs will use it to replace the old one at the next boot. diff -Naur null/Documentation/filesystems/aufs/design/10dynop.txt linux-5.15.41/Documentation/filesystems/aufs/design/10dynop.txt --- /dev/null -+++ linux-5.15.41/Documentation/filesystems/aufs/design/10dynop.txt 2022-05-31 16:59:51.184880353 +0300 ++++ linux-5.15.41/Documentation/filesystems/aufs/design/10dynop.txt 2022-09-06 12:51:51.032709987 +0300 @@ -0,0 +1,47 @@ + +# Copyright (C) 2010-2021 Junjiro R. Okajima @@ -1493,7 +1493,7 @@ diff -Naur null/Documentation/filesystems/aufs/design/10dynop.txt linux-5.15.41/ +regular files only. diff -Naur null/Documentation/filesystems/aufs/README linux-5.15.41/Documentation/filesystems/aufs/README --- /dev/null -+++ linux-5.15.41/Documentation/filesystems/aufs/README 2022-05-31 16:59:51.183880353 +0300 ++++ linux-5.15.41/Documentation/filesystems/aufs/README 2022-09-06 12:51:51.031709999 +0300 @@ -0,0 +1,397 @@ + +Aufs5 -- advanced multi layered unification filesystem version 5.x @@ -1894,7 +1894,7 @@ diff -Naur null/Documentation/filesystems/aufs/README linux-5.15.41/Documentatio +# End: ; diff -Naur null/fs/aufs/aufs.h linux-5.15.41/fs/aufs/aufs.h --- /dev/null -+++ linux-5.15.41/fs/aufs/aufs.h 2022-05-31 16:59:51.186880353 +0300 ++++ linux-5.15.41/fs/aufs/aufs.h 2022-09-06 12:51:51.034709962 +0300 @@ -0,0 +1,62 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* @@ -1960,7 +1960,7 @@ diff -Naur null/fs/aufs/aufs.h linux-5.15.41/fs/aufs/aufs.h +#endif /* __AUFS_H__ */ diff -Naur null/fs/aufs/branch.c linux-5.15.41/fs/aufs/branch.c --- /dev/null -+++ linux-5.15.41/fs/aufs/branch.c 2022-05-31 16:59:51.186880353 +0300 ++++ linux-5.15.41/fs/aufs/branch.c 2022-09-06 12:51:51.034709962 +0300 @@ -0,0 +1,1427 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -3243,7 +3243,7 @@ diff -Naur null/fs/aufs/branch.c linux-5.15.41/fs/aufs/branch.c + * file_release_write() for each file, because the branch + * attribute in aufs world is totally different from the native + * fs rw/ro mode. -+ */ ++ */ + /* fi_read_lock(file); */ + hfile = &au_fi(file)->fi_htop; + hf = hfile->hf_file; @@ -3391,7 +3391,7 @@ diff -Naur null/fs/aufs/branch.c linux-5.15.41/fs/aufs/branch.c +} diff -Naur null/fs/aufs/branch.h linux-5.15.41/fs/aufs/branch.h --- /dev/null -+++ linux-5.15.41/fs/aufs/branch.h 2022-05-31 16:59:51.186880353 +0300 ++++ linux-5.15.41/fs/aufs/branch.h 2022-09-06 12:51:51.034709962 +0300 @@ -0,0 +1,375 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* @@ -3770,7 +3770,7 @@ diff -Naur null/fs/aufs/branch.h linux-5.15.41/fs/aufs/branch.h +#endif /* __AUFS_BRANCH_H__ */ diff -Naur null/fs/aufs/conf.mk linux-5.15.41/fs/aufs/conf.mk --- /dev/null -+++ linux-5.15.41/fs/aufs/conf.mk 2022-05-31 16:59:51.186880353 +0300 ++++ linux-5.15.41/fs/aufs/conf.mk 2022-09-06 12:51:51.035709949 +0300 @@ -0,0 +1,40 @@ +# SPDX-License-Identifier: GPL-2.0 + @@ -3814,7 +3814,7 @@ diff -Naur null/fs/aufs/conf.mk linux-5.15.41/fs/aufs/conf.mk +-include ${srctree}/${src}/conf_priv.mk diff -Naur null/fs/aufs/cpup.c linux-5.15.41/fs/aufs/cpup.c --- /dev/null -+++ linux-5.15.41/fs/aufs/cpup.c 2022-05-31 16:59:51.187880353 +0300 ++++ linux-5.15.41/fs/aufs/cpup.c 2022-09-06 12:51:51.035709949 +0300 @@ -0,0 +1,1459 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -5277,7 +5277,7 @@ diff -Naur null/fs/aufs/cpup.c linux-5.15.41/fs/aufs/cpup.c +} diff -Naur null/fs/aufs/cpup.h linux-5.15.41/fs/aufs/cpup.h --- /dev/null -+++ linux-5.15.41/fs/aufs/cpup.h 2022-05-31 16:59:51.187880353 +0300 ++++ linux-5.15.41/fs/aufs/cpup.h 2022-09-06 12:51:51.035709949 +0300 @@ -0,0 +1,100 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* @@ -5381,7 +5381,7 @@ diff -Naur null/fs/aufs/cpup.h linux-5.15.41/fs/aufs/cpup.h +#endif /* __AUFS_CPUP_H__ */ diff -Naur null/fs/aufs/dbgaufs.c linux-5.15.41/fs/aufs/dbgaufs.c --- /dev/null -+++ linux-5.15.41/fs/aufs/dbgaufs.c 2022-05-31 16:59:51.187880353 +0300 ++++ linux-5.15.41/fs/aufs/dbgaufs.c 2022-09-06 12:51:51.035709949 +0300 @@ -0,0 +1,526 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -5911,7 +5911,7 @@ diff -Naur null/fs/aufs/dbgaufs.c linux-5.15.41/fs/aufs/dbgaufs.c +} diff -Naur null/fs/aufs/dbgaufs.h linux-5.15.41/fs/aufs/dbgaufs.h --- /dev/null -+++ linux-5.15.41/fs/aufs/dbgaufs.h 2022-05-31 16:59:51.187880353 +0300 ++++ linux-5.15.41/fs/aufs/dbgaufs.h 2022-09-06 12:51:51.035709949 +0300 @@ -0,0 +1,53 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* @@ -5968,7 +5968,7 @@ diff -Naur null/fs/aufs/dbgaufs.h linux-5.15.41/fs/aufs/dbgaufs.h +#endif /* __DBGAUFS_H__ */ diff -Naur null/fs/aufs/dcsub.c linux-5.15.41/fs/aufs/dcsub.c --- /dev/null -+++ linux-5.15.41/fs/aufs/dcsub.c 2022-05-31 16:59:51.187880353 +0300 ++++ linux-5.15.41/fs/aufs/dcsub.c 2022-09-06 12:51:51.035709949 +0300 @@ -0,0 +1,225 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -6197,7 +6197,7 @@ diff -Naur null/fs/aufs/dcsub.c linux-5.15.41/fs/aufs/dcsub.c +} diff -Naur null/fs/aufs/dcsub.h linux-5.15.41/fs/aufs/dcsub.h --- /dev/null -+++ linux-5.15.41/fs/aufs/dcsub.h 2022-05-31 16:59:51.187880353 +0300 ++++ linux-5.15.41/fs/aufs/dcsub.h 2022-09-06 12:51:51.035709949 +0300 @@ -0,0 +1,137 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* @@ -6338,7 +6338,7 @@ diff -Naur null/fs/aufs/dcsub.h linux-5.15.41/fs/aufs/dcsub.h +#endif /* __AUFS_DCSUB_H__ */ diff -Naur null/fs/aufs/debug.c linux-5.15.41/fs/aufs/debug.c --- /dev/null -+++ linux-5.15.41/fs/aufs/debug.c 2022-05-31 16:59:51.187880353 +0300 ++++ linux-5.15.41/fs/aufs/debug.c 2022-09-06 12:51:51.036709937 +0300 @@ -0,0 +1,444 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -6389,7 +6389,7 @@ diff -Naur null/fs/aufs/debug.c linux-5.15.41/fs/aufs/debug.c + return sprintf(buffer, "%d", atomic_read(a)); +} + -+static struct kernel_param_ops param_ops_atomic_t = { ++static const struct kernel_param_ops param_ops_atomic_t = { + .set = param_atomic_t_set, + .get = param_atomic_t_get + /* void (*free)(void *arg) */ @@ -6786,7 +6786,7 @@ diff -Naur null/fs/aufs/debug.c linux-5.15.41/fs/aufs/debug.c +} diff -Naur null/fs/aufs/debug.h linux-5.15.41/fs/aufs/debug.h --- /dev/null -+++ linux-5.15.41/fs/aufs/debug.h 2022-05-31 16:59:51.187880353 +0300 ++++ linux-5.15.41/fs/aufs/debug.h 2022-09-06 12:51:51.036709937 +0300 @@ -0,0 +1,226 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* @@ -7016,7 +7016,7 @@ diff -Naur null/fs/aufs/debug.h linux-5.15.41/fs/aufs/debug.h +#endif /* __AUFS_DEBUG_H__ */ diff -Naur null/fs/aufs/dentry.c linux-5.15.41/fs/aufs/dentry.c --- /dev/null -+++ linux-5.15.41/fs/aufs/dentry.c 2022-05-31 16:59:51.188880353 +0300 ++++ linux-5.15.41/fs/aufs/dentry.c 2022-09-06 12:51:51.036709937 +0300 @@ -0,0 +1,1168 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -8188,7 +8188,7 @@ diff -Naur null/fs/aufs/dentry.c linux-5.15.41/fs/aufs/dentry.c +}; diff -Naur null/fs/aufs/dentry.h linux-5.15.41/fs/aufs/dentry.h --- /dev/null -+++ linux-5.15.41/fs/aufs/dentry.h 2022-05-31 16:59:51.188880353 +0300 ++++ linux-5.15.41/fs/aufs/dentry.h 2022-09-06 12:51:51.036709937 +0300 @@ -0,0 +1,269 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* @@ -8461,7 +8461,7 @@ diff -Naur null/fs/aufs/dentry.h linux-5.15.41/fs/aufs/dentry.h +#endif /* __AUFS_DENTRY_H__ */ diff -Naur null/fs/aufs/dinfo.c linux-5.15.41/fs/aufs/dinfo.c --- /dev/null -+++ linux-5.15.41/fs/aufs/dinfo.c 2022-05-31 16:59:51.188880353 +0300 ++++ linux-5.15.41/fs/aufs/dinfo.c 2022-09-06 12:51:51.037709924 +0300 @@ -0,0 +1,554 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -9019,7 +9019,7 @@ diff -Naur null/fs/aufs/dinfo.c linux-5.15.41/fs/aufs/dinfo.c +} diff -Naur null/fs/aufs/dir.c linux-5.15.41/fs/aufs/dir.c --- /dev/null -+++ linux-5.15.41/fs/aufs/dir.c 2022-05-31 16:59:51.188880353 +0300 ++++ linux-5.15.41/fs/aufs/dir.c 2022-09-06 12:51:51.037709924 +0300 @@ -0,0 +1,765 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -9788,7 +9788,7 @@ diff -Naur null/fs/aufs/dir.c linux-5.15.41/fs/aufs/dir.c +}; diff -Naur null/fs/aufs/dir.h linux-5.15.41/fs/aufs/dir.h --- /dev/null -+++ linux-5.15.41/fs/aufs/dir.h 2022-05-31 16:59:51.189880353 +0300 ++++ linux-5.15.41/fs/aufs/dir.h 2022-09-06 12:51:51.037709924 +0300 @@ -0,0 +1,134 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* @@ -9926,7 +9926,7 @@ diff -Naur null/fs/aufs/dir.h linux-5.15.41/fs/aufs/dir.h +#endif /* __AUFS_DIR_H__ */ diff -Naur null/fs/aufs/dirren.c linux-5.15.41/fs/aufs/dirren.c --- /dev/null -+++ linux-5.15.41/fs/aufs/dirren.c 2022-05-31 16:59:51.189880353 +0300 ++++ linux-5.15.41/fs/aufs/dirren.c 2022-09-06 12:51:51.037709924 +0300 @@ -0,0 +1,1315 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -11245,7 +11245,7 @@ diff -Naur null/fs/aufs/dirren.c linux-5.15.41/fs/aufs/dirren.c +} diff -Naur null/fs/aufs/dirren.h linux-5.15.41/fs/aufs/dirren.h --- /dev/null -+++ linux-5.15.41/fs/aufs/dirren.h 2022-05-31 16:59:51.189880353 +0300 ++++ linux-5.15.41/fs/aufs/dirren.h 2022-09-06 12:51:51.037709924 +0300 @@ -0,0 +1,140 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* @@ -11389,7 +11389,7 @@ diff -Naur null/fs/aufs/dirren.h linux-5.15.41/fs/aufs/dirren.h +#endif /* __AUFS_DIRREN_H__ */ diff -Naur null/fs/aufs/dynop.c linux-5.15.41/fs/aufs/dynop.c --- /dev/null -+++ linux-5.15.41/fs/aufs/dynop.c 2022-05-31 16:59:51.189880353 +0300 ++++ linux-5.15.41/fs/aufs/dynop.c 2022-09-06 12:51:51.037709924 +0300 @@ -0,0 +1,368 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -11761,7 +11761,7 @@ diff -Naur null/fs/aufs/dynop.c linux-5.15.41/fs/aufs/dynop.c +} diff -Naur null/fs/aufs/dynop.h linux-5.15.41/fs/aufs/dynop.h --- /dev/null -+++ linux-5.15.41/fs/aufs/dynop.h 2022-05-31 16:59:51.189880353 +0300 ++++ linux-5.15.41/fs/aufs/dynop.h 2022-09-06 12:51:51.038709912 +0300 @@ -0,0 +1,77 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* @@ -11842,7 +11842,7 @@ diff -Naur null/fs/aufs/dynop.h linux-5.15.41/fs/aufs/dynop.h +#endif /* __AUFS_DYNOP_H__ */ diff -Naur null/fs/aufs/export.c linux-5.15.41/fs/aufs/export.c --- /dev/null -+++ linux-5.15.41/fs/aufs/export.c 2022-05-31 16:59:51.189880353 +0300 ++++ linux-5.15.41/fs/aufs/export.c 2022-09-06 12:51:51.038709912 +0300 @@ -0,0 +1,830 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -12676,7 +12676,7 @@ diff -Naur null/fs/aufs/export.c linux-5.15.41/fs/aufs/export.c +} diff -Naur null/fs/aufs/fhsm.c linux-5.15.41/fs/aufs/fhsm.c --- /dev/null -+++ linux-5.15.41/fs/aufs/fhsm.c 2022-05-31 16:59:51.190880353 +0300 ++++ linux-5.15.41/fs/aufs/fhsm.c 2022-09-06 12:51:51.038709912 +0300 @@ -0,0 +1,427 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -13107,7 +13107,7 @@ diff -Naur null/fs/aufs/fhsm.c linux-5.15.41/fs/aufs/fhsm.c +} diff -Naur null/fs/aufs/file.c linux-5.15.41/fs/aufs/file.c --- /dev/null -+++ linux-5.15.41/fs/aufs/file.c 2022-05-31 16:59:51.190880353 +0300 ++++ linux-5.15.41/fs/aufs/file.c 2022-09-06 12:51:51.039709899 +0300 @@ -0,0 +1,863 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -13974,7 +13974,7 @@ diff -Naur null/fs/aufs/file.c linux-5.15.41/fs/aufs/file.c +}; diff -Naur null/fs/aufs/file.h linux-5.15.41/fs/aufs/file.h --- /dev/null -+++ linux-5.15.41/fs/aufs/file.h 2022-05-31 16:59:51.190880353 +0300 ++++ linux-5.15.41/fs/aufs/file.h 2022-09-06 12:51:51.039709899 +0300 @@ -0,0 +1,342 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* @@ -14320,7 +14320,7 @@ diff -Naur null/fs/aufs/file.h linux-5.15.41/fs/aufs/file.h +#endif /* __AUFS_FILE_H__ */ diff -Naur null/fs/aufs/finfo.c linux-5.15.41/fs/aufs/finfo.c --- /dev/null -+++ linux-5.15.41/fs/aufs/finfo.c 2022-05-31 16:59:51.190880353 +0300 ++++ linux-5.15.41/fs/aufs/finfo.c 2022-09-06 12:51:51.039709899 +0300 @@ -0,0 +1,149 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -14473,7 +14473,7 @@ diff -Naur null/fs/aufs/finfo.c linux-5.15.41/fs/aufs/finfo.c +} diff -Naur null/fs/aufs/f_op.c linux-5.15.41/fs/aufs/f_op.c --- /dev/null -+++ linux-5.15.41/fs/aufs/f_op.c 2022-05-31 16:59:51.190880353 +0300 ++++ linux-5.15.41/fs/aufs/f_op.c 2022-09-06 12:51:51.038709912 +0300 @@ -0,0 +1,771 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -15248,7 +15248,7 @@ diff -Naur null/fs/aufs/f_op.c linux-5.15.41/fs/aufs/f_op.c +}; diff -Naur null/fs/aufs/fsctx.c linux-5.15.41/fs/aufs/fsctx.c --- /dev/null -+++ linux-5.15.41/fs/aufs/fsctx.c 2022-05-31 16:59:51.191880353 +0300 ++++ linux-5.15.41/fs/aufs/fsctx.c 2022-09-06 12:51:51.039709899 +0300 @@ -0,0 +1,1242 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -15693,7 +15693,7 @@ diff -Naur null/fs/aufs/fsctx.c linux-5.15.41/fs/aufs/fsctx.c +#ifdef CONFIG_FS_POSIX_ACL + fsparam_flag_no("acl", Opt_acl), +#else -+ au_ignore_flag("acl"), ++ au_ignore_flag("acl", Opt_ignore), +#endif + + /* internal use for the scripts */ @@ -16255,7 +16255,7 @@ diff -Naur null/fs/aufs/fsctx.c linux-5.15.41/fs/aufs/fsctx.c + case Opt_##name: \ + err = 0; \ + opt->tf = !result.negated; \ -+ break; ++ break + au_fsctx_TF(trunc_xino); + au_fsctx_TF(trunc_xib); + au_fsctx_TF(dirperm1); @@ -16332,7 +16332,7 @@ diff -Naur null/fs/aufs/fsctx.c linux-5.15.41/fs/aufs/fsctx.c +{ +#define do_test(name) \ + if (!strncmp(str, name ":", sizeof(name))) \ -+ return sizeof(name) - 1; ++ return sizeof(name) - 1 + do_test("br"); + do_test("add"); + do_test("ins"); @@ -16494,7 +16494,7 @@ diff -Naur null/fs/aufs/fsctx.c linux-5.15.41/fs/aufs/fsctx.c +} diff -Naur null/fs/aufs/fstype.h linux-5.15.41/fs/aufs/fstype.h --- /dev/null -+++ linux-5.15.41/fs/aufs/fstype.h 2022-05-31 16:59:51.191880353 +0300 ++++ linux-5.15.41/fs/aufs/fstype.h 2022-09-06 12:51:51.039709899 +0300 @@ -0,0 +1,401 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* @@ -16899,7 +16899,7 @@ diff -Naur null/fs/aufs/fstype.h linux-5.15.41/fs/aufs/fstype.h +#endif /* __AUFS_FSTYPE_H__ */ diff -Naur null/fs/aufs/hbl.h linux-5.15.41/fs/aufs/hbl.h --- /dev/null -+++ linux-5.15.41/fs/aufs/hbl.h 2022-05-31 16:59:51.191880353 +0300 ++++ linux-5.15.41/fs/aufs/hbl.h 2022-09-06 12:51:51.039709899 +0300 @@ -0,0 +1,65 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* @@ -16968,7 +16968,7 @@ diff -Naur null/fs/aufs/hbl.h linux-5.15.41/fs/aufs/hbl.h +#endif /* __AUFS_HBL_H__ */ diff -Naur null/fs/aufs/hfsnotify.c linux-5.15.41/fs/aufs/hfsnotify.c --- /dev/null -+++ linux-5.15.41/fs/aufs/hfsnotify.c 2022-05-31 16:59:51.191880353 +0300 ++++ linux-5.15.41/fs/aufs/hfsnotify.c 2022-09-06 12:51:51.040709887 +0300 @@ -0,0 +1,288 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -17260,7 +17260,7 @@ diff -Naur null/fs/aufs/hfsnotify.c linux-5.15.41/fs/aufs/hfsnotify.c +}; diff -Naur null/fs/aufs/hfsplus.c linux-5.15.41/fs/aufs/hfsplus.c --- /dev/null -+++ linux-5.15.41/fs/aufs/hfsplus.c 2022-05-31 16:59:51.191880353 +0300 ++++ linux-5.15.41/fs/aufs/hfsplus.c 2022-09-06 12:51:51.040709887 +0300 @@ -0,0 +1,60 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -17324,7 +17324,7 @@ diff -Naur null/fs/aufs/hfsplus.c linux-5.15.41/fs/aufs/hfsplus.c +} diff -Naur null/fs/aufs/hnotify.c linux-5.15.41/fs/aufs/hnotify.c --- /dev/null -+++ linux-5.15.41/fs/aufs/hnotify.c 2022-05-31 16:59:51.191880353 +0300 ++++ linux-5.15.41/fs/aufs/hnotify.c 2022-09-06 12:51:51.040709887 +0300 @@ -0,0 +1,715 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -18043,7 +18043,7 @@ diff -Naur null/fs/aufs/hnotify.c linux-5.15.41/fs/aufs/hnotify.c +} diff -Naur null/fs/aufs/iinfo.c linux-5.15.41/fs/aufs/iinfo.c --- /dev/null -+++ linux-5.15.41/fs/aufs/iinfo.c 2022-05-31 16:59:51.193880353 +0300 ++++ linux-5.15.41/fs/aufs/iinfo.c 2022-09-06 12:51:51.041709874 +0300 @@ -0,0 +1,286 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -18333,7 +18333,7 @@ diff -Naur null/fs/aufs/iinfo.c linux-5.15.41/fs/aufs/iinfo.c +} diff -Naur null/fs/aufs/inode.c linux-5.15.41/fs/aufs/inode.c --- /dev/null -+++ linux-5.15.41/fs/aufs/inode.c 2022-05-31 16:59:51.193880353 +0300 ++++ linux-5.15.41/fs/aufs/inode.c 2022-09-06 12:51:51.041709874 +0300 @@ -0,0 +1,531 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -18868,7 +18868,7 @@ diff -Naur null/fs/aufs/inode.c linux-5.15.41/fs/aufs/inode.c +} diff -Naur null/fs/aufs/inode.h linux-5.15.41/fs/aufs/inode.h --- /dev/null -+++ linux-5.15.41/fs/aufs/inode.h 2022-05-31 16:59:51.193880353 +0300 ++++ linux-5.15.41/fs/aufs/inode.h 2022-09-06 12:51:51.042709862 +0300 @@ -0,0 +1,705 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* @@ -19577,7 +19577,7 @@ diff -Naur null/fs/aufs/inode.h linux-5.15.41/fs/aufs/inode.h +#endif /* __AUFS_INODE_H__ */ diff -Naur null/fs/aufs/ioctl.c linux-5.15.41/fs/aufs/ioctl.c --- /dev/null -+++ linux-5.15.41/fs/aufs/ioctl.c 2022-05-31 16:59:51.193880353 +0300 ++++ linux-5.15.41/fs/aufs/ioctl.c 2022-09-06 12:51:51.042709862 +0300 @@ -0,0 +1,220 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -19801,7 +19801,7 @@ diff -Naur null/fs/aufs/ioctl.c linux-5.15.41/fs/aufs/ioctl.c +#endif diff -Naur null/fs/aufs/i_op_add.c linux-5.15.41/fs/aufs/i_op_add.c --- /dev/null -+++ linux-5.15.41/fs/aufs/i_op_add.c 2022-05-31 16:59:51.192880353 +0300 ++++ linux-5.15.41/fs/aufs/i_op_add.c 2022-09-06 12:51:51.041709874 +0300 @@ -0,0 +1,941 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -20746,7 +20746,7 @@ diff -Naur null/fs/aufs/i_op_add.c linux-5.15.41/fs/aufs/i_op_add.c +} diff -Naur null/fs/aufs/i_op.c linux-5.15.41/fs/aufs/i_op.c --- /dev/null -+++ linux-5.15.41/fs/aufs/i_op.c 2022-05-31 16:59:51.192880353 +0300 ++++ linux-5.15.41/fs/aufs/i_op.c 2022-09-06 12:51:51.040709887 +0300 @@ -0,0 +1,1512 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -22262,7 +22262,7 @@ diff -Naur null/fs/aufs/i_op.c linux-5.15.41/fs/aufs/i_op.c +}; diff -Naur null/fs/aufs/i_op_del.c linux-5.15.41/fs/aufs/i_op_del.c --- /dev/null -+++ linux-5.15.41/fs/aufs/i_op_del.c 2022-05-31 16:59:51.192880353 +0300 ++++ linux-5.15.41/fs/aufs/i_op_del.c 2022-09-06 12:51:51.041709874 +0300 @@ -0,0 +1,522 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -22788,7 +22788,7 @@ diff -Naur null/fs/aufs/i_op_del.c linux-5.15.41/fs/aufs/i_op_del.c +} diff -Naur null/fs/aufs/i_op_ren.c linux-5.15.41/fs/aufs/i_op_ren.c --- /dev/null -+++ linux-5.15.41/fs/aufs/i_op_ren.c 2022-05-31 16:59:51.193880353 +0300 ++++ linux-5.15.41/fs/aufs/i_op_ren.c 2022-09-06 12:51:51.041709874 +0300 @@ -0,0 +1,1257 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -24049,7 +24049,7 @@ diff -Naur null/fs/aufs/i_op_ren.c linux-5.15.41/fs/aufs/i_op_ren.c +} diff -Naur null/fs/aufs/Kconfig linux-5.15.41/fs/aufs/Kconfig --- /dev/null -+++ linux-5.15.41/fs/aufs/Kconfig 2022-05-31 16:59:51.186880353 +0300 ++++ linux-5.15.41/fs/aufs/Kconfig 2022-09-06 12:51:51.034709962 +0300 @@ -0,0 +1,199 @@ +# SPDX-License-Identifier: GPL-2.0 +config AUFS_FS @@ -24177,7 +24177,7 @@ diff -Naur null/fs/aufs/Kconfig linux-5.15.41/fs/aufs/Kconfig + his child on the lower branch, since it is a bad idea to issue + rename(2) internally for every lower branch. But user may not + accept this behaviour. So here is a workaround to allow such -+ rename(2) and store some extra infromation on the writable ++ rename(2) and store some extra information on the writable + branch. Obviously this costs high (and I don't like it). + To use this feature, you need to enable this configuration AND + to specify the mount option `dirren.' @@ -24252,7 +24252,7 @@ diff -Naur null/fs/aufs/Kconfig linux-5.15.41/fs/aufs/Kconfig +endif diff -Naur null/fs/aufs/lcnt.h linux-5.15.41/fs/aufs/lcnt.h --- /dev/null -+++ linux-5.15.41/fs/aufs/lcnt.h 2022-05-31 16:59:51.193880353 +0300 ++++ linux-5.15.41/fs/aufs/lcnt.h 2022-09-06 12:51:51.042709862 +0300 @@ -0,0 +1,186 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* @@ -24442,7 +24442,7 @@ diff -Naur null/fs/aufs/lcnt.h linux-5.15.41/fs/aufs/lcnt.h +#endif /* __AUFS_LCNT_H__ */ diff -Naur null/fs/aufs/loop.c linux-5.15.41/fs/aufs/loop.c --- /dev/null -+++ linux-5.15.41/fs/aufs/loop.c 2022-05-31 16:59:51.193880353 +0300 ++++ linux-5.15.41/fs/aufs/loop.c 2022-09-06 12:51:51.042709862 +0300 @@ -0,0 +1,148 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -24594,7 +24594,7 @@ diff -Naur null/fs/aufs/loop.c linux-5.15.41/fs/aufs/loop.c +} diff -Naur null/fs/aufs/loop.h linux-5.15.41/fs/aufs/loop.h --- /dev/null -+++ linux-5.15.41/fs/aufs/loop.h 2022-05-31 16:59:51.193880353 +0300 ++++ linux-5.15.41/fs/aufs/loop.h 2022-09-06 12:51:51.042709862 +0300 @@ -0,0 +1,55 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* @@ -24653,7 +24653,7 @@ diff -Naur null/fs/aufs/loop.h linux-5.15.41/fs/aufs/loop.h +#endif /* __AUFS_LOOP_H__ */ diff -Naur null/fs/aufs/magic.mk linux-5.15.41/fs/aufs/magic.mk --- /dev/null -+++ linux-5.15.41/fs/aufs/magic.mk 2022-05-31 16:59:51.194880352 +0300 ++++ linux-5.15.41/fs/aufs/magic.mk 2022-09-06 12:51:51.042709862 +0300 @@ -0,0 +1,31 @@ +# SPDX-License-Identifier: GPL-2.0 + @@ -24688,7 +24688,7 @@ diff -Naur null/fs/aufs/magic.mk linux-5.15.41/fs/aufs/magic.mk +endif diff -Naur null/fs/aufs/Makefile linux-5.15.41/fs/aufs/Makefile --- /dev/null -+++ linux-5.15.41/fs/aufs/Makefile 2022-05-31 16:59:51.186880353 +0300 ++++ linux-5.15.41/fs/aufs/Makefile 2022-09-06 12:51:51.034709962 +0300 @@ -0,0 +1,46 @@ +# SPDX-License-Identifier: GPL-2.0 + @@ -24738,7 +24738,7 @@ diff -Naur null/fs/aufs/Makefile linux-5.15.41/fs/aufs/Makefile +aufs-$(CONFIG_AUFS_MAGIC_SYSRQ) += sysrq.o diff -Naur null/fs/aufs/module.c linux-5.15.41/fs/aufs/module.c --- /dev/null -+++ linux-5.15.41/fs/aufs/module.c 2022-05-31 16:59:51.194880352 +0300 ++++ linux-5.15.41/fs/aufs/module.c 2022-09-06 12:51:51.042709862 +0300 @@ -0,0 +1,273 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -25015,7 +25015,7 @@ diff -Naur null/fs/aufs/module.c linux-5.15.41/fs/aufs/module.c +module_exit(aufs_exit); diff -Naur null/fs/aufs/module.h linux-5.15.41/fs/aufs/module.h --- /dev/null -+++ linux-5.15.41/fs/aufs/module.h 2022-05-31 16:59:51.194880352 +0300 ++++ linux-5.15.41/fs/aufs/module.h 2022-09-06 12:51:51.042709862 +0300 @@ -0,0 +1,166 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* @@ -25185,7 +25185,7 @@ diff -Naur null/fs/aufs/module.h linux-5.15.41/fs/aufs/module.h +#endif /* __AUFS_MODULE_H__ */ diff -Naur null/fs/aufs/mvdown.c linux-5.15.41/fs/aufs/mvdown.c --- /dev/null -+++ linux-5.15.41/fs/aufs/mvdown.c 2022-05-31 16:59:51.194880352 +0300 ++++ linux-5.15.41/fs/aufs/mvdown.c 2022-09-06 12:51:51.043709849 +0300 @@ -0,0 +1,706 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -25895,7 +25895,7 @@ diff -Naur null/fs/aufs/mvdown.c linux-5.15.41/fs/aufs/mvdown.c +} diff -Naur null/fs/aufs/opts.c linux-5.15.41/fs/aufs/opts.c --- /dev/null -+++ linux-5.15.41/fs/aufs/opts.c 2022-05-31 16:59:51.194880352 +0300 ++++ linux-5.15.41/fs/aufs/opts.c 2022-09-06 12:51:51.043709849 +0300 @@ -0,0 +1,1032 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -26931,7 +26931,7 @@ diff -Naur null/fs/aufs/opts.c linux-5.15.41/fs/aufs/opts.c +} diff -Naur null/fs/aufs/opts.h linux-5.15.41/fs/aufs/opts.h --- /dev/null -+++ linux-5.15.41/fs/aufs/opts.h 2022-05-31 16:59:51.195880352 +0300 ++++ linux-5.15.41/fs/aufs/opts.h 2022-09-06 12:51:51.043709849 +0300 @@ -0,0 +1,263 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* @@ -27198,7 +27198,7 @@ diff -Naur null/fs/aufs/opts.h linux-5.15.41/fs/aufs/opts.h +#endif /* __AUFS_OPTS_H__ */ diff -Naur null/fs/aufs/plink.c linux-5.15.41/fs/aufs/plink.c --- /dev/null -+++ linux-5.15.41/fs/aufs/plink.c 2022-05-31 16:59:51.195880352 +0300 ++++ linux-5.15.41/fs/aufs/plink.c 2022-09-06 12:51:51.043709849 +0300 @@ -0,0 +1,516 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -27718,7 +27718,7 @@ diff -Naur null/fs/aufs/plink.c linux-5.15.41/fs/aufs/plink.c +} diff -Naur null/fs/aufs/poll.c linux-5.15.41/fs/aufs/poll.c --- /dev/null -+++ linux-5.15.41/fs/aufs/poll.c 2022-05-31 16:59:51.195880352 +0300 ++++ linux-5.15.41/fs/aufs/poll.c 2022-09-06 12:51:51.044709837 +0300 @@ -0,0 +1,51 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -27773,7 +27773,7 @@ diff -Naur null/fs/aufs/poll.c linux-5.15.41/fs/aufs/poll.c +} diff -Naur null/fs/aufs/posix_acl.c linux-5.15.41/fs/aufs/posix_acl.c --- /dev/null -+++ linux-5.15.41/fs/aufs/posix_acl.c 2022-05-31 16:59:51.195880352 +0300 ++++ linux-5.15.41/fs/aufs/posix_acl.c 2022-09-06 12:51:51.044709837 +0300 @@ -0,0 +1,111 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -27888,7 +27888,7 @@ diff -Naur null/fs/aufs/posix_acl.c linux-5.15.41/fs/aufs/posix_acl.c +} diff -Naur null/fs/aufs/procfs.c linux-5.15.41/fs/aufs/procfs.c --- /dev/null -+++ linux-5.15.41/fs/aufs/procfs.c 2022-05-31 16:59:51.195880352 +0300 ++++ linux-5.15.41/fs/aufs/procfs.c 2022-09-06 12:51:51.044709837 +0300 @@ -0,0 +1,170 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -28062,7 +28062,7 @@ diff -Naur null/fs/aufs/procfs.c linux-5.15.41/fs/aufs/procfs.c +} diff -Naur null/fs/aufs/rdu.c linux-5.15.41/fs/aufs/rdu.c --- /dev/null -+++ linux-5.15.41/fs/aufs/rdu.c 2022-05-31 16:59:51.195880352 +0300 ++++ linux-5.15.41/fs/aufs/rdu.c 2022-09-06 12:51:51.044709837 +0300 @@ -0,0 +1,384 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -28450,7 +28450,7 @@ diff -Naur null/fs/aufs/rdu.c linux-5.15.41/fs/aufs/rdu.c +#endif diff -Naur null/fs/aufs/rwsem.h linux-5.15.41/fs/aufs/rwsem.h --- /dev/null -+++ linux-5.15.41/fs/aufs/rwsem.h 2022-05-31 16:59:51.195880352 +0300 ++++ linux-5.15.41/fs/aufs/rwsem.h 2022-09-06 12:51:51.044709837 +0300 @@ -0,0 +1,85 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* @@ -28539,7 +28539,7 @@ diff -Naur null/fs/aufs/rwsem.h linux-5.15.41/fs/aufs/rwsem.h +#endif /* __AUFS_RWSEM_H__ */ diff -Naur null/fs/aufs/sbinfo.c linux-5.15.41/fs/aufs/sbinfo.c --- /dev/null -+++ linux-5.15.41/fs/aufs/sbinfo.c 2022-05-31 16:59:51.195880352 +0300 ++++ linux-5.15.41/fs/aufs/sbinfo.c 2022-09-06 12:51:51.044709837 +0300 @@ -0,0 +1,316 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -28859,7 +28859,7 @@ diff -Naur null/fs/aufs/sbinfo.c linux-5.15.41/fs/aufs/sbinfo.c +} diff -Naur null/fs/aufs/super.c linux-5.15.41/fs/aufs/super.c --- /dev/null -+++ linux-5.15.41/fs/aufs/super.c 2022-05-31 16:59:51.196880352 +0300 ++++ linux-5.15.41/fs/aufs/super.c 2022-09-06 12:51:51.044709837 +0300 @@ -0,0 +1,871 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -29734,7 +29734,7 @@ diff -Naur null/fs/aufs/super.c linux-5.15.41/fs/aufs/super.c +}; diff -Naur null/fs/aufs/super.h linux-5.15.41/fs/aufs/super.h --- /dev/null -+++ linux-5.15.41/fs/aufs/super.h 2022-05-31 16:59:51.196880352 +0300 ++++ linux-5.15.41/fs/aufs/super.h 2022-09-06 12:51:51.045709824 +0300 @@ -0,0 +1,592 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* @@ -30330,7 +30330,7 @@ diff -Naur null/fs/aufs/super.h linux-5.15.41/fs/aufs/super.h +#endif /* __AUFS_SUPER_H__ */ diff -Naur null/fs/aufs/sysaufs.c linux-5.15.41/fs/aufs/sysaufs.c --- /dev/null -+++ linux-5.15.41/fs/aufs/sysaufs.c 2022-05-31 16:59:51.196880352 +0300 ++++ linux-5.15.41/fs/aufs/sysaufs.c 2022-09-06 12:51:51.045709824 +0300 @@ -0,0 +1,93 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -30427,7 +30427,7 @@ diff -Naur null/fs/aufs/sysaufs.c linux-5.15.41/fs/aufs/sysaufs.c +} diff -Naur null/fs/aufs/sysaufs.h linux-5.15.41/fs/aufs/sysaufs.h --- /dev/null -+++ linux-5.15.41/fs/aufs/sysaufs.h 2022-05-31 16:59:51.196880352 +0300 ++++ linux-5.15.41/fs/aufs/sysaufs.h 2022-09-06 12:51:51.045709824 +0300 @@ -0,0 +1,102 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* @@ -30533,7 +30533,7 @@ diff -Naur null/fs/aufs/sysaufs.h linux-5.15.41/fs/aufs/sysaufs.h +#endif /* __SYSAUFS_H__ */ diff -Naur null/fs/aufs/sysfs.c linux-5.15.41/fs/aufs/sysfs.c --- /dev/null -+++ linux-5.15.41/fs/aufs/sysfs.c 2022-05-31 16:59:51.196880352 +0300 ++++ linux-5.15.41/fs/aufs/sysfs.c 2022-09-06 12:51:51.045709824 +0300 @@ -0,0 +1,374 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -30911,7 +30911,7 @@ diff -Naur null/fs/aufs/sysfs.c linux-5.15.41/fs/aufs/sysfs.c +} diff -Naur null/fs/aufs/sysrq.c linux-5.15.41/fs/aufs/sysrq.c --- /dev/null -+++ linux-5.15.41/fs/aufs/sysrq.c 2022-05-31 16:59:51.196880352 +0300 ++++ linux-5.15.41/fs/aufs/sysrq.c 2022-09-06 12:51:51.045709824 +0300 @@ -0,0 +1,149 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -31064,7 +31064,7 @@ diff -Naur null/fs/aufs/sysrq.c linux-5.15.41/fs/aufs/sysrq.c +} diff -Naur null/fs/aufs/vdir.c linux-5.15.41/fs/aufs/vdir.c --- /dev/null -+++ linux-5.15.41/fs/aufs/vdir.c 2022-05-31 16:59:51.197880352 +0300 ++++ linux-5.15.41/fs/aufs/vdir.c 2022-09-06 12:51:51.045709824 +0300 @@ -0,0 +1,896 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -31964,7 +31964,7 @@ diff -Naur null/fs/aufs/vdir.c linux-5.15.41/fs/aufs/vdir.c +} diff -Naur null/fs/aufs/vfsub.c linux-5.15.41/fs/aufs/vfsub.c --- /dev/null -+++ linux-5.15.41/fs/aufs/vfsub.c 2022-05-31 16:59:51.197880352 +0300 ++++ linux-5.15.41/fs/aufs/vfsub.c 2022-09-06 12:51:51.045709824 +0300 @@ -0,0 +1,918 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -32886,7 +32886,7 @@ diff -Naur null/fs/aufs/vfsub.c linux-5.15.41/fs/aufs/vfsub.c +} diff -Naur null/fs/aufs/vfsub.h linux-5.15.41/fs/aufs/vfsub.h --- /dev/null -+++ linux-5.15.41/fs/aufs/vfsub.h 2022-05-31 16:59:51.197880352 +0300 ++++ linux-5.15.41/fs/aufs/vfsub.h 2022-09-06 12:51:51.046709812 +0300 @@ -0,0 +1,358 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* @@ -33248,7 +33248,7 @@ diff -Naur null/fs/aufs/vfsub.h linux-5.15.41/fs/aufs/vfsub.h +#endif /* __AUFS_VFSUB_H__ */ diff -Naur null/fs/aufs/wbr_policy.c linux-5.15.41/fs/aufs/wbr_policy.c --- /dev/null -+++ linux-5.15.41/fs/aufs/wbr_policy.c 2022-05-31 16:59:51.197880352 +0300 ++++ linux-5.15.41/fs/aufs/wbr_policy.c 2022-09-06 12:51:51.046709812 +0300 @@ -0,0 +1,830 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -34082,7 +34082,7 @@ diff -Naur null/fs/aufs/wbr_policy.c linux-5.15.41/fs/aufs/wbr_policy.c +}; diff -Naur null/fs/aufs/whout.c linux-5.15.41/fs/aufs/whout.c --- /dev/null -+++ linux-5.15.41/fs/aufs/whout.c 2022-05-31 16:59:51.197880352 +0300 ++++ linux-5.15.41/fs/aufs/whout.c 2022-09-06 12:51:51.046709812 +0300 @@ -0,0 +1,1072 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -35158,7 +35158,7 @@ diff -Naur null/fs/aufs/whout.c linux-5.15.41/fs/aufs/whout.c +} diff -Naur null/fs/aufs/whout.h linux-5.15.41/fs/aufs/whout.h --- /dev/null -+++ linux-5.15.41/fs/aufs/whout.h 2022-05-31 16:59:51.198880352 +0300 ++++ linux-5.15.41/fs/aufs/whout.h 2022-09-06 12:51:51.046709812 +0300 @@ -0,0 +1,87 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* @@ -35249,7 +35249,7 @@ diff -Naur null/fs/aufs/whout.h linux-5.15.41/fs/aufs/whout.h +#endif /* __AUFS_WHOUT_H__ */ diff -Naur null/fs/aufs/wkq.c linux-5.15.41/fs/aufs/wkq.c --- /dev/null -+++ linux-5.15.41/fs/aufs/wkq.c 2022-05-31 16:59:51.198880352 +0300 ++++ linux-5.15.41/fs/aufs/wkq.c 2022-09-06 12:51:51.046709812 +0300 @@ -0,0 +1,372 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -35625,7 +35625,7 @@ diff -Naur null/fs/aufs/wkq.c linux-5.15.41/fs/aufs/wkq.c +} diff -Naur null/fs/aufs/wkq.h linux-5.15.41/fs/aufs/wkq.h --- /dev/null -+++ linux-5.15.41/fs/aufs/wkq.h 2022-05-31 16:59:51.198880352 +0300 ++++ linux-5.15.41/fs/aufs/wkq.h 2022-09-06 12:51:51.047709799 +0300 @@ -0,0 +1,89 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* @@ -35718,7 +35718,7 @@ diff -Naur null/fs/aufs/wkq.h linux-5.15.41/fs/aufs/wkq.h +#endif /* __AUFS_WKQ_H__ */ diff -Naur null/fs/aufs/xattr.c linux-5.15.41/fs/aufs/xattr.c --- /dev/null -+++ linux-5.15.41/fs/aufs/xattr.c 2022-05-31 16:59:51.198880352 +0300 ++++ linux-5.15.41/fs/aufs/xattr.c 2022-09-06 12:51:51.047709799 +0300 @@ -0,0 +1,368 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -36090,7 +36090,7 @@ diff -Naur null/fs/aufs/xattr.c linux-5.15.41/fs/aufs/xattr.c +} diff -Naur null/fs/aufs/xino.c linux-5.15.41/fs/aufs/xino.c --- /dev/null -+++ linux-5.15.41/fs/aufs/xino.c 2022-05-31 16:59:51.199880352 +0300 ++++ linux-5.15.41/fs/aufs/xino.c 2022-09-06 12:51:51.047709799 +0300 @@ -0,0 +1,1926 @@ +// SPDX-License-Identifier: GPL-2.0 +/* @@ -38020,7 +38020,7 @@ diff -Naur null/fs/aufs/xino.c linux-5.15.41/fs/aufs/xino.c +} diff -Naur null/include/uapi/linux/aufs_type.h linux-5.15.41/include/uapi/linux/aufs_type.h --- /dev/null -+++ linux-5.15.41/include/uapi/linux/aufs_type.h 2022-05-31 16:59:51.199880352 +0300 ++++ linux-5.15.41/include/uapi/linux/aufs_type.h 2022-09-06 12:51:51.048709787 +0300 @@ -0,0 +1,452 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +/* @@ -38064,7 +38064,7 @@ diff -Naur null/include/uapi/linux/aufs_type.h linux-5.15.41/include/uapi/linux/ +#include +#endif /* __KERNEL__ */ + -+#define AUFS_VERSION "5.15.41-20220530" ++#define AUFS_VERSION "5.15.41-20220620" + +/* 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/kernel/files/patches/linux/patch-5.15.67.xz b/kernel/kernel/files/patches/linux/patch-5.15.67.xz new file mode 100644 index 0000000000000000000000000000000000000000..8334395f943402b9561c468da5101c2ee4eb0cb0 GIT binary patch literal 2725440 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 HD$o%ZUi{v%2%%S<-H!^9A(&B%7OkYvBQLtC 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

>A}U-@`kHis=MFNdnS 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�H6Bm!M{NqTEt`O?6U)V_1LP> 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 C}4{j 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 (L8!xXM1ixwU(=4u;BBb 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⪻)8RaN? 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�Vi~#Sv8@N%g`=-IzNV3fg=3DCyz^&x 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�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%0ANu3q(R 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%0Dndp+iJkx?N8Jl(F__owVHq^!tcOcA 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 tB0X^TIMN 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 *Ae7rnCJf3l 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≷C@UUB+*?GHmq=)H68GC-|mV9fwN_6B#57cZ=cU zBtV9JC>dcXnCb-_yMSJ|r!62uNH(G;Hn7pi`kMYJ!$-&*%h;c-n~ z>OW-y<6eI?d{~FGk3_Rgh%$1Q`>60CikwyHK$jl@%`0_Nl$e)iW_OY&ZAIh^YP#NM zIT2*`&(e-U@o*#Wg>VF9%{z3*u^}q z6f=F_94GE^#98P@z#gvVF9PlkM>)&3YK_~nPQwww&f{A?_uil!7P9;Wn@1P%$w*Wn z^5*vp`F`K>vlhRY+imPzJkpf?5puTWCGQBYUX;#PF$X<0g;ewBp>F|Sf6YXA2Wqk$^om2)+l08hJb>X z(OcX^o+Y~*XusKM_=gJOtr^S(A)W3S_EtnPGRs1Jg4+G}OKWF>|R(_Jc{WgG~~2~tSn%OD=A*GgZq9(-SU2bA7h5pQO-5W!jUhgWa=L!&)NRP zC7bS=e$lJ-ExZh&DtfiJKZ@OdcYk7D`IBS6KU+_}cv=$g{4dCYzUxk6cN(B`%rH_*#qPSXtkU>h9gerurIG~;PeB|@&T zo)7G&EuCyGl{bO8n;mQSyO_f<+n}o@7)H)Jbzwq2LE!bk3tE{s;K!?jY%(-a_{xiG z$R95zA(6Wmyuo9Do#KZiHxtTE=$*jIKjc+mCp zLWu5_|AzzqlP;nhhXsegmSv_Fv3C3+=Ss0pX=Mi!>mwkSIYR@bMiD`@m;W+$n3vE{ zTFr4e=sNvD$^RU^E@SRh?8*9t@n0}tUd|w-h&It;zi1x11Gur3()RljnM2Rw zwriWY*e;9u_`BUNELPF9yRtZ`>6C-kP7f?DCE&5ow)omq;j{-}Yx7YKiS%{?u=y8e z!~uojbQVxY%5~)v*-|CZH7HoD0w8uM@&T=z}l%KzrkNuiP-eofG(qpV7m<7h6oc+lXtjJ!nHVZ#r}Pw zM9SJr@e>8QwuosB9@(WFtiof`a42MtD%fqE_S~5)5O84dd0I{Nkp;tXO1^u`Xhn8D#H9KctdXF<2cdC0E zx8@6rnGRA=YeDH2463ZTz_=L+wKP~aTcRTY@byyb(pM=l?@*B6V%|+?)je> z;L&gLRNU&21$fVFjO-)xhDqzL7``nr4Je8EFpkJ_visAs8xJGPu^E~C*zRELnAI*>Agw|qjd3*i1&CtaWPv^%z zqS1$N!l|YSyIv5A5ILj7f>=A!c~StZo~Jd8b#Ke%H2ql?`VebUQA>o8y^jBzi?$gg zj#c?UyvZ!fa5~%7dlUWjh>_r?XpI*JJoLdNe?uHkvY+wZZM%oPtSQn)LV4j2&XEfq zyqwv99D^t8SlI;eXl4YtEWoc>%vMxLS@rutMWLfGD4@S!f)p8&CiZAVVJ*s7SD}GN z@d}#%)kEp1J+1dQJMFLPlz`}?-&EpIqQk`hK)&CGe&ERJ+;EY*ybkB!-p9`3Gyq}` z5o($8ZP*!9k0<&+eB}>@R8KJc();K*h(ZT$&kD}4#!&`6fMx=sUv_jd=N(SDfYTKy zV<1Tp{Fo+%scn0WW?_s&^u|ij6TmsZ+OB`_6lz_|b6NcmxfX6z);=z6YjTBsabXB0 zRP%S6f%-4(E7M42OJ*w2WC+s`89XY#WvM)CyBw3b3At?IIT<5%G3zqs88QDfC60Vu z5Ff%>H)siFe(_(GWOypuFY|7KRXhRmOO!&7)x^$#W%j_?B11S0`A9Xz@1PlHzU|S* z^r!agg9zlB7RxNVgb_TF_5khBzgGluRx%e$1{nDzyLcL}wk+0?12m(96&w6hs?GZW z!TnySz3BI-<^v^%a{VAx0*yYAFlTot>crV*G^SJy1yf78tBL2TW0=~V^0ta#+wn`qcAqIpc;{;c+yxeK6}i=)x6K||CQEa zT2#1mng{gxa5&CR5d<1dFaJPEk$#Uwz%De{5Jz3mv|8YV;z}8WLa<`0?_+nVxSMH| zRm%!0ekb^H7`o(~@*g|}`a#rq-zXOVlKl<<*{u}{xN7e1tJK@0q*9;W4LboYIwmi* zuy=lIq|Lofp6MhS0nM8jq(3|(PeFg_b2kKUCXop}0Z^ss)CNM%kN3rWq2i@T8eQGx zSQhL+?SV}JpEjcHid5RvPc3{;>Uz;``*Q#U^}J;A5O)xpwpuIbdfoAKzRT71CeJUN z{CnRbN$h;!?u#$y>=PC(fqY$9%sh5U9Wz^4_E_AVIK1C7ZE*o)%<#05tP?s0xv{?_ zPDrTC(=Xp#ro**L!o^10H6p-5Z8UPyz+2#pLi(XYDt$ZS^1c>{%H^XB{v>^Ptf_^w z^%Oh9z6X0cvLJWL!Ak0``p1>JueN`-eh6yzsItaIB-p#1kdljaaxN_G;E_AQDupnm z|J1WQbz+U4h|&seXF_1^ti{T;fG*;xK)fdL5VN(ay-1pATWmu!g$dG~G zKEo@#njrpHgHTMA4uACxm|SFCB5ygLtCIIM74+!o*$n%E?J8LXA_R1JCV7Oa+N?k1 zfqGy<7TVCA;}4d`Qj`EqWoM?!sZd%RQ2BA06A}`@L`qa5#CM8fLN(U-zG?mNU6Px0 zXN%5BDagzp#Trm?sFTJrSoXgnMb2>)1D_hs94QwK4n$_sE2h`JXl6&BXDbn60b>+B zv(Otz^d~}ej~-i;)LSEm&$nK~x@z8nv^2q@yLT4lCs2?yshK07p7oqXF%Zae$mkzk zSbm7Q+-$+T??@1whT*#i0g@!I>%*9hB41-@F#YA*LU@77TV`ShjJl>bX0Cgg5`^+k#K&rQC% zed;K|C;=POT8sBnfBdnIw0v(ArY1YnE!#2}YV*Zzj0Ue-HiUTr>}Sity58e_6-IXW zRY%w}nsy`e72pz3TZFe##jU6CI@@3#7y<0r0I0C?K~1}^hz`GU>x0LBUUTb5t7`sT zq5QAK)1plu=S$1fpjNQjjRWR7?(B?7luzTk#UfZCHXjaz!x;iLBY2nNK$t93jcas_ zOYOxO89?odvUKRV3T9Sq6I!hIu5Z!t^B35BlhMXbl5x z&Xeq}J)QC(+eUO5P^I1C71FiV)w(K#CaW~+{G;z8O?Mdzd9xW;Qd=%>v)T0nW46C9 zmGX2)*dRnlCtwSb1-ouruEi}Zc33d#c>lC9jT$4{{jMOil+%YA3qIt5VVLG$x;{|+ zX{HpXN05&+#Ea%7kqWfe4d7D-0=W_MLx$+g0MpuN2FVr5trNI)Y|F|Fzyej#XzZ(% z0COZ*%J=Z9s2qAGB2sMg-KQ4^bl+o#cX%lflX^x59b;C&XFS3ETcFA~QFUpb4 z?x^DwP;n3n{5b96npIqk*MYR^bV@!8RRR1M1hLx1{&TsWOWb3x9$33fSx~4l&`}ElV4UmA@^XR~Q3oNm}HMp_k%Im5>1my>BF>_X{A#VaU z7^turGdIEv!y~Yf+t$>IQ1PxFeJMmz`dz-6$@zeIb`sWVSCRRI_$5|p4h1BkD3h8V>n_$aGiB$ousW_yuECGc6 zHXmeTZuIT{1BhpZ5Ukodx=M_$)FDNTI6GjYF0pIN^8iQPlWY5u#wz*~69&~M?eaAZ zSvGl9DP%;aZrNtzp#b-zf_&3}EAZ?$C*{>la@aVlDje-pkbyVcJCQ(jYOE;eF*Ta{ z8j%UvRg^J7jLPH?)G;7$!sB__%W>##0%BBf`MWMrp^u>ebz|9!Z@KQFa+1Z0bb~3^t2vq|DY_ zFw;OtQKaXMhc=gUAeRY5)~M5;KZ*HjXWAg!=Ff}tN)jVxe4T;^*&?6ps=rrq*~>h{ zzz}BpVx!$`uB;}qT0$rZfqz~Ns0&Xi@%#sCGe>W#$yixxz!N%;PHDuMF=Pqi^of{& z-UiwG-kEkVmyxzVvy*x zkjlADa$vexJV*JWAJ9^?2*$*z1@GREwI?Y$a8XYX_x0VG>=rAcF1ZW7+qzR1;nX0fW+tzZ6uj zzKY>*>TY2_`^W|9J(SZG47>*;;9)ie+QE4}_&ix!D4d4tKuDU}MQ2bN_Ld!muU<_z zRWhc@kk}0C$62;;@QE?>#PP;*;+7d6!1vU%LOGXSqa~lPmGrs}7K$F=fcq`ov7iYe>MZvHHVsZUIU(JqvO%wb$k!ocEqtY&n%%jG6i>-1h`8^zOOD;D zD(>%+K~7&jAWZO_#E8QmVX*ksVtS&9WjL*T5pc`QZM{8+Z+^LpAE6gRx|u)-Icsn^ zPXTiIckx#PR}mB8AYYP){vZo)$EuT4us{Y~>TmVAA*2@wY4{XVEa5zU zb5Zb=MXIdy%|o*VU4(}J*2Gn*x;6dJLXJNV$AV!_-m}q`dwUWaPoA?&GdeI5@zo8nE}DK|jEXq4Ab8Z9%}uG7*mrdMdC zs-O6uTj=%~57V3=eqlzD!p*FEwPG>S7Pa9iq)W{R z7aR1R|ET_@J$+_u&Y;v0GKSMZpym(co?`8_Exglg1B2;P#V#i@QsaDmqX@po|F&#z z?ASo?C#H-7q-Z#LK8LZ#M9n4)O(ZLs{h4fkY$O z04}jf~_V0M9lz?W>Um2^4sEEqfeVu_U!L|SH zd$bImGMu9=CWi~r-5rq^p@P$#NzDi%hfANZnWtb)oQOOl$X)pQ6R+-6eq^b%yf%(d z*1B?@rkr>qktvM7FD~k_8-`^`c^S?C&y>>wlnF@i56d?A{f`VA%6V{Wrgo9tupjkV zoi*J({ZfrqbFv)$f>%(93%l(e027BJ0W92-c?IncteYTAWTveI8GWBr!Y>)nKqi4U zH925ff^zJH_yYcokHQuJfamkEjRAvf{r`@UbKZDw}e8EqJ|5dQ2r2>Y$D#Z zEFU;AEm5PzOzQ2@Oqz7vv!WKjQtr$peIYapahx9z5pU6AK*j7IajIffL4dNZFtgl& zrsy&ryqcv;_kR{SbRMR!RTRdJwYv4tp@P&~KJDO{CeIq4eoNy1jU>Z?cPJ zjfHv*0Tq5PNNpOw%1F^cWou)drI-G;g<*>GQZBLjp?YqK?%r4w^5jSt@MHVip~IJp{d^HA`a78p$e*X~W^-2TE4{lFvDpQN#-9^9-hgsex~ag6MVowvC;;YHFd!Er%9gj{TMlkwXS zR1Z{ZSKLZo7MX){wywaKZCD@F-GK;#vR{bl#8{>AV+(Lm6|6qNJ%an{J;5O^CxOA` zVCybR2UR0)I0`RA;IYbRe&Pw8*W9G$=WBC?KyJqnyPZb(1Zl9xz|5%-sDlF1(SX}l zEHxgXcBa!*x8?YFSi=qUgu{5OFs>U^>m?dgDRv)QJGw5T``%${;C)iNXAl8zB`klx z;WW;yiGF4F=f*$o^1TR?aTNXkrnpypiZg}pftXpM*ES%e?Wlo^Ff2V7s-dJo`H$KG&hc0wi_;5aZlGqmnB>}vJMe0F4>l1Mi}omM`J zj}yUHSX}QiMAW?NW^|8!{Fr6F&+i1d*LMyM#(cET-CG^PlWd#+i8LG7Y)cUx|6dP2S&&C?_9iof6xe(T$ zNbGziPlqH8Dj%19nNOj-OaQ)zexxvbV3?mA>x$Ph#s-rZon9blv!#WFBFGN`!Q{$N z6EtUy&Zq49xo`I1sr+sx8r>$YTFwhEnt)c1w*3|uE>V*nEYDrD5miFRJgU?s-Rm*) zq+KFU$+Viu>G;*n#D%A)NRV1fi8gNf;K+AkH^8@0(15O*#lKv+Jz!mxJeTay2(23H zZ<+p+YMH>w3L1gka67405}rF}K1Z-7bW{cZu{5Q}K{CBl@(SZA8Zh79CvT^bgW+(m zoIq2y&=Y>+ks-}zCYSktF_(G$fy#T-d?0}mRvTRMAsx#&kO(=O=VBG!)L^9Kh3Mg| zcy#JcpYXZo#l(NBwwMJGAa3jH!3U647P`#AWXDd*YzR2tM^I*h@_kB+`;^}BQUDu{ z>CAN9Z6v{)a*?kRgI^!!BV1pLp%4tkZy{I6t)Sb5=}Mny@eG67Jir`r$7z{5{+*0~ zToc3B)q>Ffvjfet^CTkS16CztZZKUnZ}Y0#Y}s+V-@i|Gc_wtEmK{>bGa{m%ciNm+48`s|(AFV$=u;IT>->ml`CG5n~@w{F> zy3Mo65)km$kR=Ik@i>20auf^$$)YasF1Kk8*0Z;yZ|D!r9K4 zJg)=-$bc?ZXFBCB@Ptu^rL+_~Wxjw_EZlZ=+;PSU@>k(Yh7`2rc zDxS9~;QzL@&t87t8|w53K;@Gd=xCgz^=&j^3sFU;T-?TW1k__k`q z3!dd_-7*TqS-Ic<7ecm8T>~D=Ac3KET#K|LE^I_{Q<>=*H764mzl>>4hJ>%-SIE~4 z?)jQpD>u9Nj1ePI68g-eyMqY`^DNRUMDZN1GJu>CJ2hZ(R8XTV32w~k=I57RB9SQ*!=w}# z()+mgyJwWyApbo3LUgyr*$805PNOIDE<(U8_=?b*k1!;%Ki0D_=>rUhv|PW0!|#oo z^l@pAIe3ZUiF=0=_Sh>ok%k_Sm7&tT^4(w}oE*$8ilyU19IEa{kqLu5~f(CDWgtjT`PA;o&8-8_abeN^l$;0Xv@T+u8v012n4WqN-z4ueo^bd zr`ITF+}pB$CtBn6F8{I#MC=pVdQc%bqvC^gx#U(+yXoD#HVVUmO8zQYtquS_3r=;9 zhLsRiJ_W4zH}BX5YA~_tdTEuk;tBC<$Y328EJ=9;q$1>J<%rMLgaaH|Z6ZaW=3Y={ z9;JOSQ#~etjH@!^2D-blSHaxp1Y!?OH$+y^EdN0bOR!hTzMeFT*`ZrX(Ar=0dL}qor}Y*Dq(VG6OX|FYJ1(?R8mecz1-(n~C@n1UqlItCzrP|C zx5g?Qm9$)=t=ZvHni)sCIF~al3}7S#vL(HoAesNW-DEDGFljIeN>1(#Q*NHV^UPKf z0b*wl@~>7Gz8IrltQ=gsA7lUgb1(soExD~0=+BsN#2W?TR$<41I)dCu(noEnRvCUF zT(2AoC2^l(qj2_;n2uxYcez~DgP z2F7$2ommv&{X%qg`Brexw6c-Ly&&89-+Rx)U-7u6)c7U~w{=bvmUv}*@bE*Z8BGHt zaSLW(eJ(_q_4imHNxBQ!3v)95_Tg{_1sCVJ~0~V{~=O=p_O8 zmOBv4nw*kJs{6#4?jCMF`&rTTq_n;9`K1c#DU8bBfW zG7h;0EY+`!+b-S^#PgluHtTugjOoEGsR& z;{bT>;1lHquIgu+KBPEVEn&A)>b+MV(osl(RH?`h;#L%o8SjaN7^oLFz@oXG^9 zEIj`N^SNV`Z1b7jmbLfChG7cqQ*VBfo!JTv5u2}>eYi3(X9yv@UQLffbSfVGbL5GA zJ`y*#8NdGqmK2r~Yx$V$t|Q)^c3<`P!2*y@aYOzq?A~aL+>qZpC26 zRFvB7J49f?UAt5FsJ27HX8*qw$bn8Oj#ewx4Fw_RxMRa4e?DGZ6SU^dq>G6AdU=~z zw=PJlGr{ZV)abMFNL-s_s89Esvfg{{xW)rfjTvwy7i?xf1Mmr?D<_-0eYJi!9`YiM z5bauctBB2l)(sK75n$wV8%?aRwau`Xvu1H@G-IOSKphYj&;vsjl~kL~O)g5k{TQ-|aR>;VB{?Lgl*lkk9m{pB;M)8)AX;f-9-=cY zL9;P4?)S0PfiFNhm#2_zYeKc#Xqyzx3?%DgQ`$TqMa%OB zm1&eST?MNvDSKV}&3E5+3S_Wff6W@?j#`PwbV;_S=|}=zvuc04GTOT00Klcz)eaEx zb@liK=W>Z0p@P16ojWic5Uc9OZ6R`C=BYO1?yc2p{FrW+{HnZ@LHecrj(tSuJ|`$z zvf2K!=Qnc`AWf0H^GZv9Pk0A4%sKDyU5_6#U_f=9G4Kz@yMzWW^WBJc2*>8Qtnexq zPcNbPhA(^cZ+m-WN|zm$t5Eymg-riD!goM!;#C3=3?dYt41`{?`E}bT9RDBrdLoIJ zDpsnrtI?9AuNTt6TSH0ORbHPRn_rVxZN3m{D?)G1u?v@+c@KL4nUSjJO+JhiY4!e8d zOE8Bwh8SJCw>5z)Sp7PCRdH#bqrJ1*w?F*3ku83b$Q%CE~-S6Ah!2L$2JRYpFy%}pNHjd8=fa0cGvSjgWK8c|ko{|?KeT1LA7q9roE zr%vSdiWOEMf;muThG*oQ!ph2<1^D)B({(q@Oz8up$3pDhQA@jB>UADgy~^A|WJ^x@79p`g0UbsIT2Jltr<4}l=RGIL-<~;*+LZxE&`=0KPAVf0!%Y$eBL3DZ{C4HNg zav%d4(PKkkh}kByM8)(eD|a{WU8??YNR@#k=k?%?BPuz#trznw`32fEfSImn`ogvx zT6~=9xnQu-*_vp$LaE1-!FfST;8iZ$RYRkwjJcQafyR*G1dk_{NTX8$FyDxbp{zL{iXWhw4>$3btw` zh6U30p3%x*jJIh};*Ywlp*v2`Cm?omsD^R=#?HSZG&%E(e#fZ{C>Ujr&)NaBUT_I7 z-dBY*?$`DFIl%+}Td%f2W3z`N^NTeZBS`gbPiMK6e7Dn5n4!neS`o`|G=Gbn$Q1v> z1ear(YTUUKUa#ytE&!MFZot}S|6M^TYA?hcrH)gMy43i2UdMtHbUvbarlqIDqx`H! zoQ)R>=7HsB0s}a>W@|v&y@^aRQB$e^n#yVeO%xsL2k{)GCACI$ikaPI0ZRlB30KT( zk^ZU%+(Da{*pLj3iJAM5@fTvR~jQL z%o@;UgOvB6L>>JjpY)HV_DyJk6dMQl6yWUgOW`@#AZ1{fM#@mc1Yc4qT)(&Q!={+10dQFo~3P{r0LtvW#G%@kn;!%@1AKGwI>+F zIG+A)j>`6rs@lp8d$!#W+AT%+si zGP{0w?QO2&b;Vk`4cn)XtR?xqdMu?$LK@Y}qwMo?Ma!BWGvgtTSk_zPf{f+v1O=s4 zHDHD}%xb^qIsF!$53I%Tt4o5&K^)ERCkP(8LogY1ZH9Uk>YW-=y~1;P!e=$B)?@IS zL*M0m`g9c{3%|U?W#l2VEH;C^mt9Mo6>w1JVUr7yMP`co`eTHAf_@}cINe!aA5@cH z^E3e~1r&l^bWod5b_E%(*ym+KP0xXY(44I(RIq!2G&OW2=ZRWFti)*Q&HP+vc4|jm z%tP%vOIJobw^+P|7cXMlBTv4L?me(6srxm(ZQ!B^rglyS8HEBDza?cvQBu4IkFwlh z&1?hCDvg!V+u%u7`;$8~+MT6xY;c^?h3`0p`fnK967+c6g6dr0wS^LugOxZIYE%rI zk>bsrzw`JOe{Xwaz*So$c~>CMWqSH+PH$xMqgZtcH@_5Ehh zDqBO5=rxMNY>c3ASme8PL$S!7(4Pw|vMRULkamex5wU^TXGq_ZbB=Q2Nzw8?(#QPF z{k0Cq*>fyluHd~D!_X?zYJt7;ATs#dfq3x@o?eYp{p#ix-yGnEbap|W$)gospRjY{ zbG_aC{~oo52rY2B!>t;2~w{YPeY5_q(+ks9ZDVVWR5s9CifV%QL# z(jCiMC#1fn`2sSK_laR4-wWxDn~VCz$D9N&6*z=W=d3ZLEN1|E%R3?vaXH$^>mBwx z7fSxq?A3=+zaqgdM&Pu<$fM0oCX@<2cqt<_ZZ{ziBoWE4$1&odK)JqnO)|QqinNAn zPm?gJ_d%-PrrDFQ4{9P?=lC;WS)ywMy_?N6GZ@?mxmg~?RgJ;T*5Uo=f+*~e@)0b> zBZH2ntW_uO?y8sGAL3G=+_Q!j&=W7dQY3`u2#BI=drP*I#biEilqx5S8A;^Byta{U61L9$3pI|kA2nqRYbO&C z6;$DoS*pqJa9l|FBLL*iYpBDHKdZUSX&hx8TkciWn0OpWhL4(?hgoY&vgEd#t|>1N z?L8SzZAS88`C0XU?Q)JcuJ_RK5v1oua?BQm$=pysO; zOyXWgl^gZN^UzMOmviaX!Y*KWLU1v0p%}h>06Rd$zlxD2txLh$2@HQTCd0m_M?~rw zJJFQ}Ly~+hz+V9EE6%}2CW}g|hF%be00)DXj+$dJgxz#YpD*_gj;h^RlOaxjLa)Qn z`sSMTu`+zkryaGbcWLLL{g`C;=v7Cwc(-4?UOVgvIJ+&J3kn*tNXVohcZ8%x_eApn zgyQPX0Nm8(U3hS_3-kVWMTrG#glVHL(%JGarFzPj-8>W3wI_vl-)ZMmJTAz*ozTtd zD6t*g=ho<#pWB!-on27>*dtRQ4}Hm(UBFG8%AvldwP2*CSv2qN##$oFd?FUW*F*5W zH_b;OvJR(G%O!aeheakg(N^k1V%r&y;?RQ_My0=b-St znta3At9WCDcdt)i-eDwWk*YeGbBsy=h#kZMbTvQ&KC;%eT+DCl2gz!yz3HHOuWA?d z4YS{ZQ5);nH1Gu7ZwmmzO)et|qkIY`_1xYy6q=pC6Ce!_?!@K65z;LtDW zExo#a&wloa$CMo{J_p{e^+(bE^*pyx)KOpA*Z%W9A2q*~1tVpfw0fL}Go$xMZ%#N| zn<5%0f^a$tus$9%Z~RmRnWkebc;SdZi7uX{pHA~d1dAvyi!V|pe`fyw%kG}bh&4cl z&bx9{%_&((9Kk;RRo!HhQ&1fk7`rE1EVUVPoD*|u>O{o4do{!GXC z(+@#wAod-JRJeoK{L!`WzF~DEh0O|%7im@K6C67siTqxZ^fhb(x#A@MVA-cj4(ll1 zh@B2fZ*|b)6%w~Wa`qI)SdgRSJc+7>5sj{8sLsbd}|Kbd|i(a0{m|7Z~2;)54Ez)hkV%#&cY(28IO?&+KEwuXN?}48Y*WuSF$Q7 zD+-bJfNHGD-s6!_S71~uMGJbPLILZ8kmc!gp0zG#!T~v2faBzrwMBYdP`N+IZSFu^ zW=x*Un5}wT0QDg4X;A(34eQh{=}Z*de%x~CddpcADD+Y*ASZgc{dD}D=G*-#tB~ta zrVvmO1Asi8Aw6vA-3%O}I1a`w2FVC!#-0GrZzfeCCfbB`0>}aczI+2s+S~-w6@()N zBIjZhVsJC$n|^9ea=s?lH+4CT@?|FgM?{uK$`_3a!IySO82^ zzTZ36{i7Y|iSyiUwlj%Dm@FwP)PRQKr#F!oSGv6FpICGF73~?X2U=!Z>eSKA1EUjnGl?x=K!8glo z5gE_5c`SNNsV9)y)*t&#(^L9Jb3Q-oPs|3PuweU}B|{rFn2`R~h&DC~a;eavkUz}a zhqX$Y?+=lt`DSP9-LIYXG)+mF+NO!1Y&7DH}ExlJeRTXYF%LsG1_MU!OQb%@}NT01l zj~f$K06E*b3m4(OKN0&Lf>CazOrxHhIe!)arng!$C#;n;i%+{cDE$np#tla>@iqxV z)xXH>e?SGug}L@&by+0akvt?jw6@bGUtgic1bHTcB>OJ{k4Pq1n32)Tntk zvY?%=dV3=-{=hnV4_%|;CfB-UgwB8GzQ0rq3xHTG`F+K?MEY;FQRqHUh**gjcmPYs z2)Ui;9Y9cD6I3C3bTJ?d=|n=`$19jeoU8f}RO`A{=K-CwN(=wTF zcIH<-^`d%TP1c9gK9Xzfoe|+0$;sQ5k0K8Ala8F~zaQSsca8WJ4awM|{+Ng;XW&iV zoWXYcPEF5RZYkpt8j;CbQ5QO?ACSZdb%^(8M+Sa9glTGfTbc-TfI@42X=TTxk)EP= z^XSn8jCGHLWn4!t{f??xH6V9Z>>VQnzJIl#&eX+o5#6kr*)W4sNMxPt_>=Hu4LxLJ z!(LLOKeIg9LB|u6Ru40kYa(#%4N)_>sZ%bA6g`V=U!W5wI(PwB$ezP=bD_{PKEO!Q z%2xgZC8Ad#z!?HXS%vFtQQ00@@tDyBtpeKgm7PF7#dOAWGM348pF6eVgF>3sH~0b< zzq&d49WfYm)2bI^gnt3b2_}SJ)1Dwvyy{i99b3i_7^7CHa4xjvFFyC9x6tmV5yANn zCX!IV#q_k(EZO4Xtq@gIhpArwt#!h{Hd)@dw%)GA>5QnyL;ngUA$Pi zPrr7DL>JnGb>Ydn>z6r)+e-eJ>jrb4(ze*zW>H)ax5rtQy%6C!^T8dnfrP~BY&s~K zs|O!o$@Nibh$2Cnv2^j~S|dzurx|*;V;Rc*6L5kybU0_ekM!>CzmiFcO;+dyG82$MjSTkM}Ym+(G z2?IEpR$RJ=C(%g?*SAe# z*Yn%@er%JjLSN%mQQR6a+a6^)^Rk$qGJGYV{JBQJRE<Qe11` zDGl>xZhXfssYpxy3^$|#Y7~IWytI0G4I?K`YFb&Id=e&yuBf6T;wi0f20KRL)-Q~fZpp6OW(tkn~8&~8#f|rgaK|33#gx`kwVQ3iG zYDIx-kz(z}m--tUtk6#uR}pOzGUUOf@stc$s`T>7kiG^dpto+wtROq9XnJW)J3ReT z4S%542?UTa16-K-lPk?siscCL1IA1BtflJd8_}=EGRpVU2?R?3mMFkHFx>qX?U?L-&P$*7jfr zNWM!9j?!@w2Mi@RmDL{5(LUNUjJT*FEY+C9ERs4nKm#n*+@TaTuGgEBF`fMU;wpi5#;)H+tt+c7f7DeD646LCskygkqQ6C=U#P)+erQyROJ`7o;` z{tbz_#KAuBl9WhQeoj-)A}Sl57LS`T^3Q+~of$y$eZZIJIgO%dOI4u!11>kNH>7OL^<~}eBnp$+t=8SlQY36v$`oy2|pS8tJqC;*a-5>KpWF1$Zq8~S@n8L_|O`ZS( zbM+IWcC(#dw;yL=PN%%XG&rL@Elq3!ODxknuHxQ2AQM;l9+k(@XFuLXBXxFDqFDe` zM@v_c*;}}#`RT2{f#EQ@%1=FaCiT4(>3+O3PguWE3m0WC2jf#Or|kVqBf~VZf!ajd zSH5aE*m`M$_CC9_9~bBv3sHzMkz^YLn6%Vg@}^XQ2mbE)0*B00v?%EWLbxB}Pn8fJ zQIMt?#)Cx}xjR8(ST$kDa8`P~@ii z8ZRvIU%apa>&Q2V8kaHU{OM*Er0%~7e}^<)qew|h9L?jP@CkZbak&L(sTTGXwQj*k z?C)v=_vt>kX_a(4Lb@kYDnb=cE~OwtXgbM9R6T9w{;D6JMcJA8 zY7aVP^Q)FD^&qk^!5CNaI`n~HRH1ouD(ivP+fJa+SVR2klgm=q<9P@oHh@$zfAV^zHP9cIwA8PGdRdX%fMTkclm@LJU3^P<*`ND<7Y7a{4V1J(CsP zsu1YY!sCGWR(sOm<$A?K`~52r9d15R$Mf_OGf5a(Xfh}VhPcm*XV*O{;9MbcV?rCn zw%boKTaeVWTiSiTr=;nmo=kn!hKOLS^`{7b=R+j}b~Ru6K0c34PDq~r>9{v0=vW@Y zNo0+=SOe$VPEo|jMiALwtZZ%F{1A0^#u@2VlaEIE1T>>zSe~JR0Vzo7n{jbVQI;5Q z+s|F}`Gw!dm`0Ue2+u)nnfd>K%+a=4{&t7E3z3@fKswu6HI6I#DVN#jcoXFPcKmJ(+W(IP0jC>Q zC5+{e@egc~!o78$peqdVcUQxm$euGn!NL4(us*d_m8H`#)^;c+!3U#T_-(;DI%^36 zjK^U5^+wcTpULQRw!(~#)EUZMnF^w!mo@P!)cf}>>jq1PpH_pwvC7PGdr98j2Q*D} zT`*dmng`o_QRjYr1T;QCrdfI&4Y0dJd06=%cv@A*=T|F zK(k?8If5DThNk@h36Kupca+o!Kjx>0Yu0tm*UglND-#>hS_C9fo0}WP2 zCy0s|H0*qxB{2wqM(TH#@~$c#Za=0s1ii=qce8SOP; zApP9I;na>KCdP0-fffnJ{}|RYO7GqlO!B9?+np5{EJ?KIn6MFi7!g+4Lx}Rt+x{P# zkNeu5`EfiKuUZ*ZWxO8cyBLYkvyh#`r@9qdoJa! zpW)TWF^dL|kkw%uTz2O|?gTn29~{0AL>=N_%{4DYy%S`6g~}_x7jSm-5umpvVL_}h z>UO~D`Jik0x}uKuk6bVaZvtP1Tz-dffx?Q|U%|?#8GG?0JDmv|!!t-1qL{?w<#`Jk ztSBjJv!Y=+N%}I%UwOx0@@u1Ej3b4f(PGT+;J^Mfa>n1Yr%R=FeziF&Yq;Gx1yu5o zTFf%)szUFXDPhB)N!LUI}|8Bj?YM=1)r9=uS>O!%S_fELG$>PJ@2Y@dn(Y<_5oqCvfHMfEUq?s-Qx82=h>rc%MeuU2Ue%?stW;*%njiR8P->(m{4SE zJ; zp_I77Yw!m;$!KD$ielfvz@oL7QT^Q{Uop<766EzFm@{zDgWYC8tZFVHC$u)DrM@5f z7qMPa;ft_C7q%n?6$qn98}92qmhzGm&%4X$!oKtRFJv53EdbHVwcck@Tj*ngcKy%n zv1#Dj&umoM&+j4!qTe*6*1b{fZ6yUZ5(WEKw9FZ;g_lG