In this pile: pathname resolution rewrite. * recursion in link_path_walk() is gone. * nesting limits on symlinks are gone (the only limit remaining is that the total amount of symlinks is no more than 40, no matter how nested). * "fast" (inline) symlinks are handled without leaving rcuwalk mode. * stack footprint (independent of the nesting) is below kilobyte now - about on par with what it used to be with one level of nested symlinks and ~2.8 times lower than it used to be in the worst case. * struct nameidata is entirely private to fs/namei.c now (not even opaque pointers are being passed around). * ->follow_link() and ->put_link() calling conventions had been changed; all in-tree filesystems converted, out-of-tree should be able to follow reasonably easy; see Documentation/filesystems/porting for details (and in-tree filesystems for examples of conversion). That has sat in -next since mid-May, seems to survive all testing without regressions and merges clean with v4.1. Please, pull from git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs.git for-linus-1 Shortlog: Al Viro (123): 9p: don't bother with 4K allocation for 24-byte local array... 9p: don't bother with __getname() in ->follow_link() ext4: split inode_operations for encrypted symlinks off the rest libfs: simple_follow_link() ext2: use simple_follow_link() befs: switch to simple_follow_link() ext3: switch to simple_follow_link() ext4: switch to simple_follow_link() jffs2: switch to simple_follow_link() shmem: switch to simple_follow_link() debugfs: switch to simple_follow_link() ufs: switch to simple_follow_link() ubifs: switch to simple_follow_link() sysv: switch to simple_follow_link() jfs: switch to simple_follow_link() freevxfs: switch to simple_follow_link() exofs: switch to {simple,page}_symlink_inode_operations ceph: switch to simple_follow_link() logfs: fix a pagecache leak for symlinks uninline walk_component() namei: take O_NOFOLLOW treatment into do_last() do_last: kill symlink_ok do_last: regularize the logics around following symlinks namei: get rid of lookup_hash() name: shift nameidata down into user_path_walk() namei: lift nameidata into filename_mountpoint() new ->follow_link() and ->put_link() calling conventions namei.c: separate the parts of follow_link() that find the link body namei: don't bother with ->follow_link() if ->i_link is set namei: introduce nameidata->link do_last: move path there from caller's stack frame namei: expand nested_symlink() in its only caller namei: expand the call of follow_link() in link_path_walk() namei: move the calls of may_follow_link() into follow_link() namei: rename follow_link to trailing_symlink, move it down link_path_walk: handle get_link() returning ERR_PTR() immediately link_path_walk: don't bother with walk_component() after jumping link link_path_walk: turn inner loop into explicit goto link_path_walk: massage a bit more link_path_walk: get rid of duplication link_path_walk: final preparations to killing recursion link_path_walk: kill the recursion link_path_walk: split "return from recursive call" path link_path_walk: cleanup - turn goto start; into continue; namei: move link/cookie pairs into nameidata namei: trim redundant arguments of trailing_symlink() namei: trim redundant arguments of fs/namei.c:put_link() namei: trim the arguments of get_link() namei: remove restrictions on nesting depth link_path_walk: nd->depth massage, part 1 link_path_walk: nd->depth massage, part 2 link_path_walk: nd->depth massage, part 3 link_path_walk: nd->depth massage, part 4 trailing_symlink: nd->depth massage, part 5 get_link: nd->depth massage, part 6 trailing_symlink: nd->depth massage, part 7 put_link: nd->depth massage, part 8 link_path_walk: nd->depth massage, part 9 link_path_walk: nd->depth massage, part 10 link_path_walk: end of nd->depth massage namei: we never need more than MAXSYMLINKS entries in nd->stack namei: lift (open-coded) terminate_walk() in follow_dotdot_rcu() into callers lift terminate_walk() into callers of walk_component() namei: lift (open-coded) terminate_walk() into callers of get_link() namei: take put_link() into {lookup,mountpoint,do}_last() namei: have terminate_walk() do put_link() on everything left link_path_walk: move the OK: inside the loop namei: new calling conventions for walk_component() namei: make should_follow_link() store the link in nd->link namei: move link count check and stack allocation into pick_link() lustre: rip the private symlink nesting limit out namei: simplify the callers of follow_managed() don't pass nameidata to ->follow_link() namei: simplify failure exits in get_link() namei: simpler treatment of symlinks with nothing other that / in the body namei: take the treatment of absolute symlinks to get_link() namei: fold put_link() into the failure case of complete_walk() namei: move bumping the refcount of link->mnt into pick_link() may_follow_link(): trim arguments namei: kill nd->link namei: take increment of nd->depth into pick_link() namei: may_follow_link() - lift terminate_walk() on failures into caller namei: split off filename_lookupat() with LOOKUP_PARENT namei: get rid of nameidata->base namei: path_init() calling conventions change namei: lift link_path_walk() call out of trailing_symlink() namei: lift terminate_walk() all the way up link_path_walk: use explicit returns for failure exits namei: explicitly pass seq number to unlazy_walk() when dentry != NULL namei: don't mangle nd->seq in lookup_fast() namei: store inode in nd->stack[] namei: pick_link() callers already have inode switch ->put_link() from dentry to inode new helper: free_page_put_link() namei: make put_link() RCU-safe namei: make may_follow_link() safe in RCU mode new helper: __legitimize_mnt() namei: store seq numbers in nd->stack[] namei: make unlazy_walk and terminate_walk handle nd->stack, add unlazy_link namei: don't unlazy until get_link() enable passing fast relative symlinks without dropping out of RCU mode namei: handle absolute symlinks without dropping out of RCU mode update Documentation/filesystems/ regarding the follow_link/put_link changes namei: unlazy_walk() doesn't need to mess with current->fs anymore lustre: kill unused macro (LOOKUP_CONTINUE) lustre: kill unused helper get rid of assorted nameidata-related debris namei: be careful with mountpoint crossings in follow_dotdot_rcu() namei: uninline set_root{,_rcu}() namei: pass the struct path to store the result down into path_lookupat() namei: move putname() call into filename_lookup() namei: shift nameidata inside filename_lookup() namei: make filename_lookup() reject ERR_PTR() passed as name namei: shift nameidata down into filename_parentat() namei: saner calling conventions for filename_create() namei: saner calling conventions for filename_parentat() namei: fold path_cleanup() into terminate_walk() namei: stash dfd and name into nameidata namei: trim do_last() arguments inline user_path_parent() inline user_path_create() namei: move saved_nd pointer into struct nameidata turn user_{path_at,path,lpath,path_dir}() into static inlines David Howells (1): VFS: Handle lower layer dentry/inode in pathwalk NeilBrown (7): ovl: rearrange ovl_follow_link to it doesn't need to call ->put_link SECURITY: remove nameidata arg from inode_follow_link. VFS: replace {, total_}link_count in task_struct with pointer to nameidata security/selinux: pass 'flags' arg to avc_audit() and avc_has_perm_flags() security: make inode_follow_link RCU-walk aware VFS/namei: make the use of touch_atime() in get_link() RCU-safe. Documentation: remove outdated information from automount-support.txt Diffstat: Documentation/filesystems/Locking | 4 +- Documentation/filesystems/automount-support.txt | 51 +- Documentation/filesystems/porting | 17 + Documentation/filesystems/vfs.txt | 22 +- .../lustre/lustre/include/linux/lustre_compat25.h | 15 - .../staging/lustre/lustre/llite/llite_internal.h | 6 - drivers/staging/lustre/lustre/llite/symlink.c | 26 +- fs/9p/v9fs.h | 2 - fs/9p/vfs_inode.c | 123 +- fs/9p/vfs_inode_dotl.c | 39 +- fs/autofs4/symlink.c | 5 +- fs/befs/linuxvfs.c | 57 +- fs/ceph/inode.c | 11 +- fs/cifs/cifsfs.h | 2 +- fs/cifs/link.c | 28 +- fs/configfs/symlink.c | 31 +- fs/debugfs/file.c | 12 - fs/debugfs/inode.c | 6 +- fs/ecryptfs/inode.c | 11 +- fs/exofs/Kbuild | 2 +- fs/exofs/exofs.h | 4 - fs/exofs/inode.c | 9 +- fs/exofs/namei.c | 5 +- fs/exofs/symlink.c | 55 - fs/ext2/inode.c | 1 + fs/ext2/namei.c | 3 +- fs/ext2/symlink.c | 10 +- fs/ext3/inode.c | 1 + fs/ext3/namei.c | 3 +- fs/ext3/symlink.c | 10 +- fs/ext4/ext4.h | 1 + fs/ext4/inode.c | 7 +- fs/ext4/namei.c | 11 +- fs/ext4/symlink.c | 48 +- fs/f2fs/namei.c | 18 +- fs/freevxfs/vxfs_extern.h | 3 - fs/freevxfs/vxfs_immed.c | 34 - fs/freevxfs/vxfs_inode.c | 7 +- fs/fuse/dir.c | 22 +- fs/gfs2/inode.c | 10 +- fs/hostfs/hostfs_kern.c | 15 +- fs/hppfs/hppfs.c | 13 +- fs/inode.c | 31 +- fs/jffs2/dir.c | 1 + fs/jffs2/fs.c | 1 + fs/jffs2/symlink.c | 45 +- fs/jfs/inode.c | 3 +- fs/jfs/namei.c | 5 +- fs/jfs/symlink.c | 10 +- fs/kernfs/symlink.c | 25 +- fs/libfs.c | 25 +- fs/logfs/dir.c | 1 + fs/mount.h | 1 + fs/namei.c | 1453 ++++++++++---------- fs/namespace.c | 27 +- fs/nfs/symlink.c | 19 +- fs/ntfs/namei.c | 2 +- fs/open.c | 2 +- fs/overlayfs/inode.c | 35 +- fs/proc/base.c | 4 +- fs/proc/inode.c | 9 +- fs/proc/namespaces.c | 4 +- fs/proc/self.c | 24 +- fs/proc/thread_self.c | 22 +- fs/sysv/Makefile | 2 +- fs/sysv/inode.c | 5 +- fs/sysv/symlink.c | 20 - fs/sysv/sysv.h | 1 - fs/ubifs/dir.c | 1 + fs/ubifs/file.c | 11 +- fs/ubifs/super.c | 1 + fs/ufs/inode.c | 5 +- fs/ufs/namei.c | 3 +- fs/ufs/symlink.c | 13 +- fs/xfs/xfs_iops.c | 11 +- include/linux/debugfs.h | 1 - include/linux/fs.h | 16 +- include/linux/namei.h | 41 +- include/linux/sched.h | 3 +- include/linux/security.h | 13 +- mm/shmem.c | 32 +- security/capability.c | 4 +- security/security.c | 7 +- security/selinux/avc.c | 18 +- security/selinux/hooks.c | 18 +- security/selinux/include/avc.h | 9 +- 86 files changed, 1222 insertions(+), 1522 deletions(-) delete mode 100644 fs/exofs/symlink.c delete mode 100644 fs/sysv/symlink.c -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in