linux-fsdevel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: NeilBrown <neilb@suse.de>
To: Al Viro <viro@ZenIV.linux.org.uk>
Cc: Linus Torvalds <torvalds@linux-foundation.org>,
	Andreas Dilger <adilger@dilger.ca>,
	Dave Chinner <david@fromorbit.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	linux-fsdevel <linux-fsdevel@vger.kernel.org>,
	Christoph Hellwig <hch@infradead.org>
Subject: Re: [RFC][PATCHSET v3] non-recursive pathname resolution & RCU symlinks
Date: Sun, 17 May 2015 13:03:30 +1000	[thread overview]
Message-ID: <20150517130330.6807b9f4@notabene.brown> (raw)
In-Reply-To: <20150516054626.GS7232@ZenIV.linux.org.uk>

[-- Attachment #1: Type: text/plain, Size: 4980 bytes --]

On Sat, 16 May 2015 06:46:26 +0100 Al Viro <viro@ZenIV.linux.org.uk> wrote:

> On Sat, May 16, 2015 at 02:45:27PM +1000, NeilBrown wrote:
> 
> > Yes, I've looked lately :-)
> > I think that all of RCU-walk, and probably some of REF-walk should happen
> > before the filesystem gets to see anything.
> > But once you hit a non-positive dentry or the parent of the target name, I'd
> > rather hand over the the FS.
> 
> ... and be ready to get it back when the sucker runs into a symlink.  Unless
> you want to handle _those_ in NFS somehow (including an absolute one starting
> with /sys/, etc.).

Certain - when a symlink or mountpoint is found, the filesystem stops.
mountpoints should be rarely hit because the path to a mountpoint will
usually be stable enough for RCU-walk to find it....
Thinks: I wonder what happens when a mount-on NFS directory is deleted on the
server...

automountpoints would be handled completely by the filesystem.  It would
mount something and then return saying "Look, I found a mount point - you
wanna handle for me?".


> 
> > NFSv4 has the ability to look up multiple components in a single LOOKUP call.
> > VFS doesn't give it a chance to try because it wants to go step-by-step, and
> > wants each entry in the cache to have an inode etc.
> 
> Do tell, how do we deal with .. afterwards if we leave the intermediate ones
> without inodes?  We _could_ feed multi-component requests to filesystems
> (and NFSv4 isn't the first one to handle that - 9p had been there a lot
> earlier), but then you get to
> 	* populate all of them with inodes
> 	* be damn careful to avoid multiple dentries for the same directory
> inode

NFS directories already need to be revalidated occasionally.  Having a dentry
in "unknown" state just means a revalidation is that much more likely.

Suppose I cd into a directory, then rename the directory on the server.  What
happens?  What should happen?
I could make a case that the NFS client should lookup ".." on the server and
rebuild the path upwards.

There is a (to me) really key point here.
Local filesystems use the dcache for correctness.  It prevents concurrent
directory renames from creating loops and it ensure that only one file of a
given name exists in each directory.

Remote filesystems don't use it for correctness.  For them it is simply an
optimisation.  So getting upset about directories with multiple dentries, or
directories that aren't connected to the root is very important for local
filesystems, and largely irrelevant for network filesystems.

A local filesystem needs the cache to remain consistent with storage.  A
network filesystem cannot possible ensure that the cache is consistent with
storage, and just need to be able to notice the more offensive
inconsistencies reasonably quickly, and repair them.

> Look, creating those suckers isn't the worst part; you need to be ready for
> e.g. mount(2) or pathname resolution playing with the ones you'd created.
> It's not fs-private data structure; pathname resolution might very well span
> many filesystem types.

Any partname lookup which touched these dentries would call d_revalidate()
(or similar) which could get the inode etc if it was really needed.

> 
> Worse, you get to deal with several multi-component requests jumping into
> fs at the same place.  With responses arriving a bit afterwards, and guess
> what?  Those requests happen to share bits and pieces of prefixes.  Oh,
> and one of them is a rename.  Dealing with just the final components isn't
> a problem; you'll need to deal with directory tree in all its fscking glory.
> In a way that wouldn't be in too incestous relationship with the pathwalking
> logics in VFS and, by that proxy, such in all other fs types.
> 
> In particular, "unknown" for intermediate nodes is a recipe for really
> nasty mess.  If the path can rejoin the known universe several components
> later... <shudder>
> 
> Dealing with multi-component lookups isn't impossible and might be a good
> idea, but only if all intermediates are populated.  What information does
> NFSv4 multi-component lookup give you?  9p one gives an array of FIDs,
> one per component, and that is best used as multi-component revalidate
> on hot dcache...

If was remembering RFC3010 in which a LOOKUP had a "pathname4" which was an
array of "component4".  It could just return the filehandle and attributes of
the final target.
RFC3530 and later revised that so "LOOKUP" gets a "component4".  That just
means that it is easy to get the attributes if you want them.

I'm not really saying that multiple component lookups are a good idea, or
that doing the lookup and not getting the intermediate attributes is a
sensible approach.  What I'm really pointing out is that the current dcache
imposes a particular model very strongly on filesystems and I'm far from
convinced that that is a good idea.

NeilBrown

[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 811 bytes --]

  parent reply	other threads:[~2015-05-17  3:03 UTC|newest]

Thread overview: 298+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-05-05  5:22 [RFC][PATCHSET] non-recursive pathname resolution Al Viro
2015-05-05  5:21 ` [PATCH 01/79] 9p: don't bother with 4K allocation for 24-byte local array Al Viro
2015-05-05  5:21 ` [PATCH 02/79] 9p: don't bother with __getname() in ->follow_link() Al Viro
2015-05-05  5:21 ` [PATCH 03/79] ovl: rearrange ovl_follow_link to it doesn't need to call ->put_link Al Viro
2015-05-05  5:21 ` [PATCH 04/79] ext4: split inode_operations for encrypted symlinks off the rest Al Viro
2015-05-05  9:10   ` Jan Kara
2015-05-05 15:01   ` Linus Torvalds
2015-05-05 15:10     ` Al Viro
2015-05-05  5:21 ` [PATCH 05/79] libfs: simple_follow_link() Al Viro
2015-05-05  9:20   ` Jan Kara
2015-05-05  5:21 ` [PATCH 06/79] ext2: use simple_follow_link() Al Viro
2015-05-05  9:17   ` Jan Kara
2015-05-05  5:21 ` [PATCH 07/79] befs: switch to simple_follow_link() Al Viro
2015-05-05  9:21   ` Jan Kara
2015-05-05  5:21 ` [PATCH 08/79] ext3: " Al Viro
2015-05-05  9:19   ` Jan Kara
2015-05-05  5:21 ` [PATCH 09/79] ext4: " Al Viro
2015-05-05  9:22   ` Jan Kara
2015-05-05  5:21 ` [PATCH 10/79] jffs2: " Al Viro
2015-05-05  5:21 ` [PATCH 11/79] shmem: " Al Viro
2015-05-05  9:24   ` Jan Kara
2015-05-05  5:21 ` [PATCH 12/79] debugfs: " Al Viro
2015-05-05  9:25   ` Jan Kara
2015-05-05  5:21 ` [PATCH 13/79] ufs: " Al Viro
2015-05-05  5:21 ` [PATCH 14/79] ubifs: " Al Viro
2015-05-05  5:21 ` [PATCH 15/79] sysv: " Al Viro
2015-05-05  5:21 ` [PATCH 16/79] jfs: " Al Viro
2015-05-05  9:27   ` Jan Kara
2015-05-06 13:39   ` Dave Kleikamp
2015-05-05  5:21 ` [PATCH 17/79] freevxfs: " Al Viro
2015-05-05  5:21 ` [PATCH 18/79] exofs: switch to {simple,page}_symlink_inode_operations Al Viro
2015-05-06  9:59   ` Boaz Harrosh
2015-05-05  5:21 ` [PATCH 19/79] ceph: switch to simple_follow_link() Al Viro
2015-05-05  5:21 ` [PATCH 20/79] logfs: fix a pagecache leak for symlinks Al Viro
2015-05-05  5:21 ` [PATCH 21/79] SECURITY: remove nameidata arg from inode_follow_link Al Viro
2015-05-05  5:21 ` [PATCH 22/79] uninline walk_component() Al Viro
2015-05-05  5:21 ` [PATCH 23/79] namei: take O_NOFOLLOW treatment into do_last() Al Viro
2015-05-05  5:21 ` [PATCH 24/79] do_last: kill symlink_ok Al Viro
2015-05-05  5:21 ` [PATCH 25/79] do_last: regularize the logics around following symlinks Al Viro
2015-05-05  5:22 ` [PATCH 26/79] namei: get rid of lookup_hash() Al Viro
2015-05-05  5:22 ` [PATCH 27/79] name: shift nameidata down into user_path_walk() Al Viro
2015-05-05  5:22 ` [PATCH 28/79] namei: lift nameidata into filename_mountpoint() Al Viro
2015-05-05  5:22 ` [PATCH 29/79] new ->follow_link() and ->put_link() calling conventions Al Viro
2015-05-05  5:22 ` [PATCH 30/79] namei.c: separate the parts of follow_link() that find the link body Al Viro
2015-05-05  5:22 ` [PATCH 31/79] namei: don't bother with ->follow_link() if ->i_link is set Al Viro
2015-05-05  5:22 ` [PATCH 32/79] namei: introduce nameidata->link Al Viro
2015-05-05  5:22 ` [PATCH 33/79] do_last: move path there from caller's stack frame Al Viro
2015-05-05  5:22 ` [PATCH 34/79] namei: expand nested_symlink() in its only caller Al Viro
2015-05-05  5:22 ` [PATCH 35/79] namei: expand the call of follow_link() in link_path_walk() Al Viro
2015-05-05  5:22 ` [PATCH 36/79] namei: move the calls of may_follow_link() into follow_link() Al Viro
2015-05-05  5:22 ` [PATCH 37/79] namei: rename follow_link to trailing_symlink, move it down Al Viro
2015-05-05  5:22 ` [PATCH 38/79] link_path_walk: handle get_link() returning ERR_PTR() immediately Al Viro
2015-05-05  5:22 ` [PATCH 39/79] link_path_walk: don't bother with walk_component() after jumping link Al Viro
2015-05-05  5:22 ` [PATCH 40/79] link_path_walk: turn inner loop into explicit goto Al Viro
2015-05-05 15:09   ` Linus Torvalds
2015-05-05 15:17     ` Al Viro
2015-05-05 15:21       ` Linus Torvalds
2015-05-05  5:22 ` [PATCH 41/79] link_path_walk: massage a bit more Al Viro
2015-05-05  5:22 ` [PATCH 42/79] link_path_walk: get rid of duplication Al Viro
2015-05-05 15:10   ` Linus Torvalds
2015-05-05  5:22 ` [PATCH 43/79] link_path_walk: final preparations to killing recursion Al Viro
2015-05-05  5:22 ` [PATCH 44/79] link_path_walk: kill the recursion Al Viro
2015-05-05  5:22 ` [PATCH 45/79] link_path_walk: split "return from recursive call" path Al Viro
2015-05-05  5:22 ` [PATCH 46/79] link_path_walk: cleanup - turn goto start; into continue; Al Viro
2015-05-05  5:22 ` [PATCH 47/79] namei: move link/cookie pairs into nameidata Al Viro
2015-05-06  2:42   ` NeilBrown
2015-05-06  7:22     ` Al Viro
2015-05-05  5:22 ` [PATCH 48/79] namei: trim redundant arguments of trailing_symlink() Al Viro
2015-05-05  5:22 ` [PATCH 49/79] namei: trim redundant arguments of fs/namei.c:put_link() Al Viro
2015-05-05  5:22 ` [PATCH 50/79] namei: trim the arguments of get_link() Al Viro
2015-05-05  5:22 ` [PATCH 51/79] namei: remove restrictions on nesting depth Al Viro
2015-05-06  2:55   ` NeilBrown
2015-05-06  7:24     ` Al Viro
2015-05-06 16:22       ` Al Viro
2015-05-05  5:22 ` [PATCH 52/79] link_path_walk: nd->depth massage, part 1 Al Viro
2015-05-05  5:22 ` [PATCH 53/79] link_path_walk: nd->depth massage, part 2 Al Viro
2015-05-05  5:22 ` [PATCH 54/79] link_path_walk: nd->depth massage, part 3 Al Viro
2015-05-05  5:22 ` [PATCH 55/79] link_path_walk: nd->depth massage, part 4 Al Viro
2015-05-05  5:22 ` [PATCH 56/79] trailing_symlink: nd->depth massage, part 5 Al Viro
2015-05-05  5:22 ` [PATCH 57/79] get_link: nd->depth massage, part 6 Al Viro
2015-05-05  5:22 ` [PATCH 58/79] trailing_symlink: nd->depth massage, part 7 Al Viro
2015-05-05  5:22 ` [PATCH 59/79] put_link: nd->depth massage, part 8 Al Viro
2015-05-05  5:22 ` [PATCH 60/79] link_path_walk: nd->depth massage, part 9 Al Viro
2015-05-05  5:22 ` [PATCH 61/79] link_path_walk: nd->depth massage, part 10 Al Viro
2015-05-05  5:22 ` [PATCH 62/79] link_path_walk: end of nd->depth massage Al Viro
2015-05-05  5:22 ` [PATCH 63/79] namei: we never need more than MAXSYMLINKS entries in nd->stack Al Viro
2015-05-05  5:22 ` [PATCH 64/79] namei: lift (open-coded) terminate_walk() in follow_dotdot_rcu() into callers Al Viro
2015-05-05  5:22 ` [PATCH 65/79] lift terminate_walk() into callers of walk_component() Al Viro
2015-05-05  5:22 ` [PATCH 66/79] namei: lift (open-coded) terminate_walk() into callers of get_link() Al Viro
2015-05-05  5:22 ` [PATCH 67/79] namei: take put_link() into {lookup,mountpoint,do}_last() Al Viro
2015-05-05  5:22 ` [PATCH 68/79] namei: have terminate_walk() do put_link() on everything left Al Viro
2015-05-05  5:22 ` [PATCH 69/79] link_path_walk: move the OK: inside the loop Al Viro
2015-05-05  5:22 ` [PATCH 70/79] namei: new calling conventions for walk_component() Al Viro
2015-05-05  5:22 ` [PATCH 71/79] namei: make should_follow_link() store the link in nd->link Al Viro
2015-05-05  5:22 ` [PATCH 72/79] namei: move link count check and stack allocation into pick_link() Al Viro
2015-05-05  5:22 ` [PATCH 73/79] lustre: rip the private symlink nesting limit out Al Viro
2015-05-05  5:22 ` [PATCH 74/79] VFS: replace {, total_}link_count in task_struct with pointer to nameidata Al Viro
2015-05-05  5:22 ` [PATCH 75/79] namei: simplify the callers of follow_managed() Al Viro
2015-05-05  5:22 ` [PATCH 76/79] don't pass nameidata to ->follow_link() Al Viro
2015-05-05  5:22 ` [PATCH 77/79] namei: move unlazying on symlinks towards get_link() call sites Al Viro
2015-05-05  5:22 ` [PATCH 78/79] namei: new helper - is_stale() Al Viro
2015-05-05  5:22 ` [PATCH 79/79] namei: stretch RCU mode into get_link() Al Viro
2015-05-05 15:20 ` [RFC][PATCHSET] non-recursive pathname resolution Linus Torvalds
2015-05-05 23:59   ` Al Viro
2015-05-10  5:45     ` Al Viro
2015-05-11 18:06 ` [RFC][PATCHSET v3] non-recursive pathname resolution & RCU symlinks Al Viro
2015-05-11 18:06   ` [PATCH v3 001/110] 9p: don't bother with 4K allocation for 24-byte local array Al Viro
2015-05-11 18:06   ` [PATCH v3 002/110] 9p: don't bother with __getname() in ->follow_link() Al Viro
2015-05-11 18:06   ` [PATCH v3 003/110] ovl: rearrange ovl_follow_link to it doesn't need to call ->put_link Al Viro
2015-05-11 18:06   ` [PATCH v3 004/110] ext4: split inode_operations for encrypted symlinks off the rest Al Viro
2015-05-11 18:20     ` Linus Torvalds
2015-05-11 18:06   ` [PATCH v3 005/110] libfs: simple_follow_link() Al Viro
2015-05-11 18:06   ` [PATCH v3 006/110] ext2: use simple_follow_link() Al Viro
2015-05-11 18:06   ` [PATCH v3 007/110] befs: switch to simple_follow_link() Al Viro
2015-05-11 18:06   ` [PATCH v3 008/110] ext3: " Al Viro
2015-05-11 18:06   ` [PATCH v3 009/110] ext4: " Al Viro
2015-05-11 18:06   ` [PATCH v3 010/110] jffs2: " Al Viro
2015-05-11 18:06   ` [PATCH v3 011/110] shmem: " Al Viro
2015-05-11 18:06   ` [PATCH v3 012/110] debugfs: " Al Viro
2015-05-11 18:06   ` [PATCH v3 013/110] ufs: " Al Viro
2015-05-11 18:06   ` [PATCH v3 014/110] ubifs: " Al Viro
2015-05-11 18:06   ` [PATCH v3 015/110] sysv: " Al Viro
2015-05-11 18:06   ` [PATCH v3 016/110] jfs: " Al Viro
2015-05-11 18:06   ` [PATCH v3 017/110] freevxfs: " Al Viro
2015-05-11 18:06   ` [PATCH v3 018/110] exofs: switch to {simple,page}_symlink_inode_operations Al Viro
2015-05-11 18:06   ` [PATCH v3 019/110] ceph: switch to simple_follow_link() Al Viro
2015-05-11 18:06   ` [PATCH v3 020/110] logfs: fix a pagecache leak for symlinks Al Viro
2015-05-11 18:06   ` [PATCH v3 021/110] SECURITY: remove nameidata arg from inode_follow_link Al Viro
2015-05-11 18:06   ` [PATCH v3 022/110] uninline walk_component() Al Viro
2015-05-11 18:06   ` [PATCH v3 023/110] namei: take O_NOFOLLOW treatment into do_last() Al Viro
2015-05-11 18:06   ` [PATCH v3 024/110] do_last: kill symlink_ok Al Viro
2015-05-11 18:06   ` [PATCH v3 025/110] do_last: regularize the logics around following symlinks Al Viro
2015-05-11 18:06   ` [PATCH v3 026/110] namei: get rid of lookup_hash() Al Viro
2015-05-11 18:06   ` [PATCH v3 027/110] name: shift nameidata down into user_path_walk() Al Viro
2015-05-11 18:06   ` [PATCH v3 028/110] namei: lift nameidata into filename_mountpoint() Al Viro
2015-05-11 18:06   ` [PATCH v3 029/110] new ->follow_link() and ->put_link() calling conventions Al Viro
2015-05-11 18:06   ` [PATCH v3 030/110] namei.c: separate the parts of follow_link() that find the link body Al Viro
2015-05-11 18:06   ` [PATCH v3 031/110] namei: don't bother with ->follow_link() if ->i_link is set Al Viro
2015-05-11 18:06   ` [PATCH v3 032/110] namei: introduce nameidata->link Al Viro
2015-05-11 18:06   ` [PATCH v3 033/110] do_last: move path there from caller's stack frame Al Viro
2015-05-11 18:06   ` [PATCH v3 034/110] namei: expand nested_symlink() in its only caller Al Viro
2015-05-11 18:06   ` [PATCH v3 035/110] namei: expand the call of follow_link() in link_path_walk() Al Viro
2015-05-11 18:06   ` [PATCH v3 036/110] namei: move the calls of may_follow_link() into follow_link() Al Viro
2015-05-11 18:06   ` [PATCH v3 037/110] namei: rename follow_link to trailing_symlink, move it down Al Viro
2015-05-11 18:06   ` [PATCH v3 038/110] link_path_walk: handle get_link() returning ERR_PTR() immediately Al Viro
2015-05-11 18:06   ` [PATCH v3 039/110] link_path_walk: don't bother with walk_component() after jumping link Al Viro
2015-05-11 18:07   ` [PATCH v3 040/110] link_path_walk: turn inner loop into explicit goto Al Viro
2015-05-11 18:07   ` [PATCH v3 041/110] link_path_walk: massage a bit more Al Viro
2015-05-11 18:07   ` [PATCH v3 042/110] link_path_walk: get rid of duplication Al Viro
2015-05-11 18:07   ` [PATCH v3 043/110] link_path_walk: final preparations to killing recursion Al Viro
2015-05-11 18:07   ` [PATCH v3 044/110] link_path_walk: kill the recursion Al Viro
2015-05-11 18:07   ` [PATCH v3 045/110] link_path_walk: split "return from recursive call" path Al Viro
2015-05-11 18:07   ` [PATCH v3 046/110] link_path_walk: cleanup - turn goto start; into continue; Al Viro
2015-05-11 18:07   ` [PATCH v3 047/110] namei: move link/cookie pairs into nameidata Al Viro
2015-05-11 18:07   ` [PATCH v3 048/110] namei: trim redundant arguments of trailing_symlink() Al Viro
2015-05-11 18:07   ` [PATCH v3 049/110] namei: trim redundant arguments of fs/namei.c:put_link() Al Viro
2015-05-11 18:07   ` [PATCH v3 050/110] namei: trim the arguments of get_link() Al Viro
2015-05-11 18:07   ` [PATCH v3 051/110] namei: remove restrictions on nesting depth Al Viro
2015-05-11 18:07   ` [PATCH v3 052/110] link_path_walk: nd->depth massage, part 1 Al Viro
2015-05-11 18:07   ` [PATCH v3 053/110] link_path_walk: nd->depth massage, part 2 Al Viro
2015-05-11 18:07   ` [PATCH v3 054/110] link_path_walk: nd->depth massage, part 3 Al Viro
2015-05-11 18:07   ` [PATCH v3 055/110] link_path_walk: nd->depth massage, part 4 Al Viro
2015-05-11 18:07   ` [PATCH v3 056/110] trailing_symlink: nd->depth massage, part 5 Al Viro
2015-05-11 18:07   ` [PATCH v3 057/110] get_link: nd->depth massage, part 6 Al Viro
2015-05-11 18:07   ` [PATCH v3 058/110] trailing_symlink: nd->depth massage, part 7 Al Viro
2015-05-11 18:07   ` [PATCH v3 059/110] put_link: nd->depth massage, part 8 Al Viro
2015-05-11 18:07   ` [PATCH v3 060/110] link_path_walk: nd->depth massage, part 9 Al Viro
2015-05-11 18:07   ` [PATCH v3 061/110] link_path_walk: nd->depth massage, part 10 Al Viro
2015-05-11 18:07   ` [PATCH v3 062/110] link_path_walk: end of nd->depth massage Al Viro
2015-05-11 18:07   ` [PATCH v3 063/110] namei: we never need more than MAXSYMLINKS entries in nd->stack Al Viro
2015-05-11 18:07   ` [PATCH v3 064/110] namei: lift (open-coded) terminate_walk() in follow_dotdot_rcu() into callers Al Viro
2015-05-11 18:07   ` [PATCH v3 065/110] lift terminate_walk() into callers of walk_component() Al Viro
2015-05-11 18:07   ` [PATCH v3 066/110] namei: lift (open-coded) terminate_walk() into callers of get_link() Al Viro
2015-05-11 18:07   ` [PATCH v3 067/110] namei: take put_link() into {lookup,mountpoint,do}_last() Al Viro
2015-05-11 18:07   ` [PATCH v3 068/110] namei: have terminate_walk() do put_link() on everything left Al Viro
2015-05-11 18:07   ` [PATCH v3 069/110] link_path_walk: move the OK: inside the loop Al Viro
2015-05-11 18:07   ` [PATCH v3 070/110] namei: new calling conventions for walk_component() Al Viro
2015-05-11 18:07   ` [PATCH v3 071/110] namei: make should_follow_link() store the link in nd->link Al Viro
2015-05-11 18:07   ` [PATCH v3 072/110] namei: move link count check and stack allocation into pick_link() Al Viro
2015-05-11 18:07   ` [PATCH v3 073/110] lustre: rip the private symlink nesting limit out Al Viro
2015-05-11 18:07   ` [PATCH v3 074/110] VFS: replace {, total_}link_count in task_struct with pointer to nameidata Al Viro
2015-05-14 23:21     ` Al Viro
2015-05-11 18:07   ` [PATCH v3 075/110] namei: simplify the callers of follow_managed() Al Viro
2015-05-11 18:07   ` [PATCH v3 076/110] don't pass nameidata to ->follow_link() Al Viro
2015-05-11 18:07   ` [PATCH v3 077/110] namei: simplify failure exits in get_link() Al Viro
2015-05-11 18:07   ` [PATCH v3 078/110] namei: simpler treatment of symlinks with nothing other that / in the body Al Viro
2015-05-11 18:07   ` [PATCH v3 079/110] namei: take the treatment of absolute symlinks to get_link() Al Viro
2015-05-11 18:07   ` [PATCH v3 080/110] namei: fold put_link() into the failure case of complete_walk() Al Viro
2015-05-11 18:07   ` [PATCH v3 081/110] namei: move bumping the refcount of link->mnt into pick_link() Al Viro
2015-05-11 18:07   ` [PATCH v3 082/110] may_follow_link(): trim arguments Al Viro
2015-05-11 18:07   ` [PATCH v3 083/110] namei: kill nd->link Al Viro
2015-05-11 18:07   ` [PATCH v3 084/110] namei: take increment of nd->depth into pick_link() Al Viro
2015-05-11 18:07   ` [PATCH v3 085/110] namei: may_follow_link() - lift terminate_walk() on failures into caller Al Viro
2015-05-11 18:07   ` [PATCH v3 086/110] namei: split off filename_lookupat() with LOOKUP_PARENT Al Viro
2015-05-11 18:07   ` [PATCH v3 087/110] namei: get rid of nameidata->base Al Viro
2015-05-11 18:07   ` [PATCH v3 088/110] namei: path_init() calling conventions change Al Viro
2015-05-11 18:07   ` [PATCH v3 089/110] namei: lift link_path_walk() call out of trailing_symlink() Al Viro
2015-05-11 18:07   ` [PATCH v3 090/110] namei: lift terminate_walk() all the way up Al Viro
2015-05-11 18:07   ` [PATCH v3 091/110] link_path_walk: use explicit returns for failure exits Al Viro
2015-05-11 18:07   ` [PATCH v3 092/110] namei: explicitly pass seq number to unlazy_walk() when dentry != NULL Al Viro
2015-05-11 18:07   ` [PATCH v3 093/110] namei: don't mangle nd->seq in lookup_fast() Al Viro
2015-05-11 18:07   ` [PATCH v3 094/110] namei: store inode in nd->stack[] Al Viro
2015-05-11 18:07   ` [PATCH v3 095/110] VFS: Handle lower layer dentry/inode in pathwalk Al Viro
2015-05-11 18:07   ` [PATCH v3 096/110] namei: pick_link() callers already have inode Al Viro
2015-05-11 18:07   ` [PATCH v3 097/110] security/selinux: pass 'flags' arg to avc_audit() and avc_has_perm_flags() Al Viro
2015-05-11 18:07   ` [PATCH v3 098/110] security: make inode_follow_link RCU-walk aware Al Viro
2015-05-11 18:07   ` [PATCH v3 099/110] switch ->put_link() from dentry to inode Al Viro
2015-05-11 18:08   ` [PATCH v3 100/110] new helper: free_page_put_link() Al Viro
2015-05-11 18:08   ` [PATCH v3 101/110] namei: make put_link() RCU-safe Al Viro
2015-05-11 18:08   ` [PATCH v3 102/110] namei: make may_follow_link() safe in RCU mode Al Viro
2015-05-11 18:08   ` [PATCH v3 103/110] new helper: __legitimize_mnt() Al Viro
2015-05-11 18:08   ` [PATCH v3 104/110] namei: store seq numbers in nd->stack[] Al Viro
2015-05-11 18:08   ` [PATCH v3 105/110] namei: make unlazy_walk and terminate_walk handle nd->stack, add unlazy_link Al Viro
2015-05-11 23:43     ` Al Viro
2015-05-12  4:10       ` Al Viro
2015-05-15  5:07         ` Al Viro
2015-05-11 18:08   ` [PATCH v3 106/110] namei: don't unlazy until get_link() Al Viro
2015-05-11 18:08   ` [PATCH v3 107/110] VFS/namei: make the use of touch_atime() in get_link() RCU-safe Al Viro
2015-05-11 18:08   ` [PATCH v3 108/110] enable passing fast relative symlinks without dropping out of RCU mode Al Viro
2015-05-11 18:08   ` [PATCH v3 109/110] namei: handle absolute " Al Viro
2015-05-15  5:11     ` Al Viro
2015-05-11 18:08   ` [PATCH v3 110/110] update Documentation/filesystems/ regarding the follow_link/put_link changes Al Viro
2015-05-13 22:25   ` [RFC][PATCHSET v3] non-recursive pathname resolution & RCU symlinks Al Viro
2015-05-13 22:25     ` [PATCH 01/21] namei: unlazy_walk() doesn't need to mess with current->fs anymore Al Viro
2015-05-13 22:25     ` [PATCH 02/21] lustre: kill unused macro (LOOKUP_CONTINUE) Al Viro
2015-05-13 22:25     ` [PATCH 03/21] lustre: kill unused helper Al Viro
2015-05-13 22:25     ` [PATCH 04/21] get rid of assorted nameidata-related debris Al Viro
2015-05-13 22:25     ` [PATCH 05/21] Documentation: remove outdated information from automount-support.txt Al Viro
2015-05-13 22:26     ` [PATCH 06/21] namei: be careful with mountpoint crossings in follow_dotdot_rcu() Al Viro
2015-05-13 22:26     ` [PATCH 07/21] namei: uninline set_root{,_rcu}() Al Viro
2015-05-13 22:26     ` [PATCH 08/21] namei: pass the struct path to store the result down into path_lookupat() Al Viro
2015-05-13 22:26     ` [PATCH 09/21] namei: move putname() call into filename_lookup() Al Viro
2015-05-13 22:26     ` [PATCH 10/21] namei: shift nameidata inside filename_lookup() Al Viro
2015-05-13 22:26     ` [PATCH 11/21] namei: make filename_lookup() reject ERR_PTR() passed as name Al Viro
2015-05-13 22:26     ` [PATCH 12/21] namei: shift nameidata down into filename_parentat() Al Viro
2015-05-13 22:26     ` [PATCH 13/21] namei: saner calling conventions for filename_create() Al Viro
2015-05-13 22:26     ` [PATCH 14/21] namei: saner calling conventions for filename_parentat() Al Viro
2015-05-13 22:26     ` [PATCH 15/21] namei: fold path_cleanup() into terminate_walk() Al Viro
2015-05-13 22:26     ` [PATCH 16/21] namei: stash dfd and name into nameidata Al Viro
2015-05-13 22:26     ` [PATCH 17/21] namei: trim do_last() arguments Al Viro
2015-05-13 22:26     ` [PATCH 18/21] inline user_path_parent() Al Viro
2015-05-13 22:26     ` [PATCH 19/21] inline user_path_create() Al Viro
2015-05-13 22:26     ` [PATCH 20/21] namei: move saved_nd pointer into struct nameidata Al Viro
2015-05-13 22:26     ` [PATCH 21/21] turn user_{path_at,path,lpath,path_dir}() into static inlines Al Viro
2015-05-14  1:39     ` [RFC][PATCHSET v3] non-recursive pathname resolution & RCU symlinks Linus Torvalds
2015-05-14  3:30       ` Al Viro
2015-05-14  3:52         ` Linus Torvalds
2015-05-14 11:23           ` Dave Chinner
2015-05-14 12:46             ` Jan Kara
2015-05-14 15:51             ` Linus Torvalds
2015-05-14 17:02               ` Linus Torvalds
2015-05-15 23:38               ` Dave Chinner
2015-05-16  0:10                 ` Al Viro
2015-05-16  0:20                   ` Al Viro
2015-05-16  1:23                 ` Linus Torvalds
2015-05-15 21:15             ` Andreas Dilger
2015-05-15 23:30               ` NeilBrown
2015-05-15 23:49                 ` Al Viro
2015-05-16  0:45                 ` Linus Torvalds
2015-05-16  1:25                   ` NeilBrown
2015-05-16  1:47                     ` Linus Torvalds
2015-05-16  1:55                       ` Al Viro
2015-05-16  2:23                         ` Linus Torvalds
2015-05-16  3:16                           ` Al Viro
     [not found]                             ` <CA+55aFzOcE7e=sOckb56KTs+WGutnL2_uum=pLD6Y+73t=EwOQ@mail.gmail.com>
2015-05-16  4:31                               ` Al Viro
2015-05-16 19:36                                 ` Linus Torvalds
2015-05-16  1:47                     ` Al Viro
2015-05-16  4:45                       ` NeilBrown
2015-05-16  5:46                         ` Al Viro
2015-05-16 14:18                           ` Al Viro
2015-05-17  3:12                             ` NeilBrown
2015-05-17  3:48                               ` Linus Torvalds
2015-05-17  4:04                                 ` Linus Torvalds
2015-05-17  4:47                                   ` NeilBrown
2015-05-17 10:55                                   ` Al Viro
2015-05-17 16:43                                     ` Linus Torvalds
2015-05-17 16:56                                       ` Linus Torvalds
2015-05-17 23:16                                       ` NeilBrown
2015-05-18  2:56                                         ` Linus Torvalds
2015-05-18  3:42                                           ` Al Viro
2015-05-18  4:20                                             ` Linus Torvalds
2015-05-19  8:33                                           ` NeilBrown
2015-05-17 23:39                                     ` NeilBrown
2015-05-18  0:10                                       ` Al Viro
2015-05-17  3:03                           ` NeilBrown [this message]
2015-05-16  1:38                   ` Al Viro
2015-05-15 23:39               ` Dave Chinner
2015-05-14 22:09           ` Jeremy Allison
2015-05-14 23:24             ` Linus Torvalds
2015-05-14 23:36               ` Al Viro
2015-05-15  0:25                 ` Linus Torvalds
2015-05-15  1:26                   ` Al Viro
2015-05-15  2:18                     ` Linus Torvalds
2015-05-15  2:51                       ` Al Viro
2015-05-15 18:30                         ` Linus Torvalds
2015-05-14 23:57               ` Jeremy Allison
2015-05-15 23:43                 ` Dave Chinner
2015-05-14 16:32         ` Eric W. Biederman

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20150517130330.6807b9f4@notabene.brown \
    --to=neilb@suse.de \
    --cc=adilger@dilger.ca \
    --cc=david@fromorbit.com \
    --cc=hch@infradead.org \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=torvalds@linux-foundation.org \
    --cc=viro@ZenIV.linux.org.uk \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).