On Mon, Apr 19, 2021 at 07:41:51PM +0300, Amir Goldstein wrote: > Would you be willing to make an exception for notify_change() > and pass mnt arg to the helper? and if so, which of the following > is the lesser evil in your opinion: > > 1. Optional mnt arg > -------------------------- > int notify_change(struct vfsmount *mnt, > struct user_namespace *mnt_userns, > struct dentry *dentry, struct iattr *attr, > struct inode **delegated_inode) > > @mnt is non-NULL from syscalls and nfsd and NULL from other callers. > > 2. path instead of dentry > -------------------------------- > int notify_change(struct user_namespace *mnt_userns, > struct path *path, struct iattr *attr, > struct inode **delegated_inode) > > This is symmetric with vfs_getattr(). > syscalls and nfsd use the actual path. > overlayfs, ecryptfs, cachefiles compose a path from the private mount > (Christian posted patches to make ecryptfs, cachefiles mount private). > > 3. Mandatory mnt arg > ----------------------------- > Like #1, but use some private mount instead of NULL, similar to the > mnt_userns arg. > > Any of the above acceptable? > > Pushed option #1 (along with rest of the work) to: > https://github.com/amir73il/linux/commits/fsnotify_path_hooks > > It's only sanity tested. Out of that bunch only #2 is more or less tolerable. HOWEVER, if we go that way, mnt_user_ns crap must go, and I really want to see details on all callers - which mount are you going to use in each case. The thing that is not going to be acceptable is a combination of mount from one filesystem and dentry from another. In particular, file_remove_privs() is going to be interesting. Note, BTW, that ftruncate() and file_remove_privs() are different in that respect - the latter hits d_real() (by way of file_dentry()), the former does not. Which one is correct and if both are, why are their needs different?