linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Al Viro <viro@ZenIV.linux.org.uk>
To: linux-fsdevel@vger.kernel.org
Cc: linux-kernel@vger.kernel.org,
	Linus Torvalds <torvalds@linux-foundation.org>
Subject: [RFC][PATCH v3 28/55] link_path_walk(): simplify stack handling
Date: Sun,  1 Mar 2020 21:52:13 +0000	[thread overview]
Message-ID: <20200301215240.873899-28-viro@ZenIV.linux.org.uk> (raw)
In-Reply-To: <20200301215240.873899-1-viro@ZenIV.linux.org.uk>

From: Al Viro <viro@zeniv.linux.org.uk>

We use nd->stack to store two things: pinning down the symlinks
we are resolving and resuming the name traversal when a nested
symlink is finished.

Currently, nd->depth is used to keep track of both.  It's 0 when
we call link_path_walk() for the first time (for the pathname
itself) and 1 on all subsequent calls (for trailing symlinks,
if any).  That's fine, as far as pinning symlinks goes - when
handling a trailing symlink, the string we are interpreting
is the body of symlink pinned down in nd->stack[0].  It's
rather inconvenient with respect to handling nested symlinks,
though - when we run out of a string we are currently interpreting,
we need to decide whether it's a nested symlink (in which case
we need to pick the string saved back when we started to interpret
that nested symlink and resume its traversal) or not (in which
case we are done with link_path_walk()).

Current solution is a bit of a kludge - in handling of trailing symlink
(in lookup_last() and open_last_lookups() we clear nd->stack[0].name.
That allows link_path_walk() to use the following rules when
running out of a string to interpret:
	* if nd->depth is zero, we are at the end of pathname itself.
	* if nd->depth is positive, check the saved string; for
nested symlink it will be non-NULL, for trailing symlink - NULL.

It works, but it's rather non-obvious.  Note that we have two sets:
the set of symlinks currently being traversed and the set of postponed
pathname tails.  The former is stored in nd->stack[0..nd->depth-1].link
and it's valid throught the pathname resolution; the latter is valid only
during an individual call of link_path_walk() and it occupies
nd->stack[0..nd->depth-1].name for the first call of link_path_walk() and
nd->stack[1..nd->depth-1].name for subsequent ones.  The kludge is basically
a way to recognize the second set becoming empty.

The things get simpler if we keep track of the second set's size
explicitly and always store it in nd->stack[0..depth-1].name.
We access the second set only inside link_path_walk(), so its
size can live in a local variable; that way the check becomes
trivial without the need of that kludge.

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
---
 fs/namei.c | 14 +++++---------
 1 file changed, 5 insertions(+), 9 deletions(-)

diff --git a/fs/namei.c b/fs/namei.c
index 56bbbb9c0c0d..5fe499399fcb 100644
--- a/fs/namei.c
+++ b/fs/namei.c
@@ -2120,6 +2120,7 @@ static inline u64 hash_name(const void *salt, const char *name)
  */
 static int link_path_walk(const char *name, struct nameidata *nd)
 {
+	int depth = 0; // depth <= nd->depth
 	int err;
 
 	nd->last_type = LAST_ROOT;
@@ -2182,14 +2183,11 @@ static int link_path_walk(const char *name, struct nameidata *nd)
 		} while (unlikely(*name == '/'));
 		if (unlikely(!*name)) {
 OK:
-			/* pathname body, done */
-			if (!nd->depth)
-				return 0;
-			name = nd->stack[nd->depth - 1].name;
-			/* trailing symlink, done */
-			if (!name)
+			/* pathname or trailing symlin, done */
+			if (!depth)
 				return 0;
 			/* last component of nested symlink */
+			name = nd->stack[--depth].name;
 			link = walk_component(nd, 0);
 		} else {
 			/* not the last component */
@@ -2199,7 +2197,7 @@ static int link_path_walk(const char *name, struct nameidata *nd)
 			if (IS_ERR(link))
 				return PTR_ERR(link);
 			/* a symlink to follow */
-			nd->stack[nd->depth - 1].name = name;
+			nd->stack[depth++].name = name;
 			name = link;
 			continue;
 		}
@@ -2324,7 +2322,6 @@ static inline const char *lookup_last(struct nameidata *nd)
 	link = walk_component(nd, WALK_TRAILING);
 	if (link) {
 		nd->flags |= LOOKUP_PARENT;
-		nd->stack[0].name = NULL;
 	}
 	return link;
 }
@@ -3278,7 +3275,6 @@ static const char *do_last(struct nameidata *nd,
 	if (unlikely(link)) {
 		nd->flags |= LOOKUP_PARENT;
 		nd->flags &= ~(LOOKUP_OPEN|LOOKUP_CREATE|LOOKUP_EXCL);
-		nd->stack[0].name = NULL;
 		return link;
 	}
 
-- 
2.11.0


  parent reply	other threads:[~2020-03-01 21:54 UTC|newest]

Thread overview: 198+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-02-23  1:11 [RFC][PATCHSET] sanitized pathwalk machinery (v2) Al Viro
2020-02-23  1:15 ` [RFC][PATCH v2 01/34] do_add_mount(): lift lock_mount/unlock_mount into callers Al Viro
2020-02-23  1:15   ` [RFC][PATCH v2 02/34] fix automount/automount race properly Al Viro
2020-02-23  2:07     ` Linus Torvalds
2020-02-27 19:43       ` Al Viro
2020-02-27 20:00         ` Linus Torvalds
2020-02-23  1:15   ` [RFC][PATCH v2 03/34] follow_automount(): get rid of dead^Wstillborn code Al Viro
2020-02-23  1:15   ` [RFC][PATCH v2 04/34] follow_automount() doesn't need the entire nameidata Al Viro
2020-02-23  1:15   ` [RFC][PATCH v2 05/34] make build_open_flags() treat O_CREAT | O_EXCL as implying O_NOFOLLOW Al Viro
2020-02-23  1:15   ` [RFC][PATCH v2 06/34] handle_mounts(): start building a sane wrapper for follow_managed() Al Viro
2020-02-23  1:15   ` [RFC][PATCH v2 07/34] atomic_open(): saner calling conventions (return dentry on success) Al Viro
2020-02-23  1:16   ` [RFC][PATCH v2 08/34] lookup_open(): " Al Viro
2020-02-23  1:16   ` [RFC][PATCH v2 09/34] do_last(): collapse the call of path_to_nameidata() Al Viro
2020-02-23  1:16   ` [RFC][PATCH v2 10/34] handle_mounts(): pass dentry in, turn path into a pure out argument Al Viro
2020-02-23  1:16   ` [RFC][PATCH v2 11/34] lookup_fast(): consolidate the RCU success case Al Viro
2020-02-23  1:16   ` [RFC][PATCH v2 12/34] teach handle_mounts() to handle RCU mode Al Viro
2020-02-23  1:16   ` [RFC][PATCH v2 13/34] lookup_fast(): take mount traversal into callers Al Viro
2020-02-23  1:16   ` [RFC][PATCH v2 14/34] new step_into() flag: WALK_NOFOLLOW Al Viro
2020-02-23  2:14     ` Linus Torvalds
2020-02-23 22:07       ` Al Viro
2020-02-23  1:16   ` [RFC][PATCH v2 15/34] fold handle_mounts() into step_into() Al Viro
2020-02-23  1:16   ` [RFC][PATCH v2 16/34] LOOKUP_MOUNTPOINT: fold path_mountpointat() into path_lookupat() Al Viro
2020-02-23  1:16   ` [RFC][PATCH v2 17/34] expand the only remaining call of path_lookup_conditional() Al Viro
2020-02-23  1:16   ` [RFC][PATCH v2 18/34] merging pick_link() with get_link(), part 1 Al Viro
2020-02-23  1:16   ` [RFC][PATCH v2 19/34] merging pick_link() with get_link(), part 2 Al Viro
2020-02-23  1:16   ` [RFC][PATCH v2 20/34] merging pick_link() with get_link(), part 3 Al Viro
2020-02-23  1:16   ` [RFC][PATCH v2 21/34] merging pick_link() with get_link(), part 4 Al Viro
2020-02-23  2:19     ` Linus Torvalds
2020-02-23  1:16   ` [RFC][PATCH v2 22/34] merging pick_link() with get_link(), part 5 Al Viro
2020-02-23  2:22     ` Linus Torvalds
2020-02-23  1:16   ` [RFC][PATCH v2 23/34] merging pick_link() with get_link(), part 6 Al Viro
2020-02-23  2:24     ` Linus Torvalds
2020-02-23  1:16   ` [RFC][PATCH v2 24/34] finally fold get_link() into pick_link() Al Viro
2020-02-23  2:31     ` Linus Torvalds
2020-02-23  1:16   ` [RFC][PATCH v2 25/34] massage __follow_mount_rcu() a bit Al Viro
2020-02-23  1:16   ` [RFC][PATCH v2 26/34] new helper: traverse_mounts() Al Viro
2020-02-23  1:16   ` [RFC][PATCH v2 27/34] atomic_open(): return the right dentry in FMODE_OPENED case Al Viro
2020-02-23  1:16   ` [RFC][PATCH v2 28/34] atomic_open(): lift the call of may_open() into do_last() Al Viro
2020-02-23  1:16   ` [RFC][PATCH v2 29/34] do_last(): merge the may_open() calls Al Viro
2020-02-23  1:16   ` [RFC][PATCH v2 30/34] do_last(): don't bother with keeping got_write in FMODE_OPENED case Al Viro
2020-02-23  1:16   ` [RFC][PATCH v2 31/34] do_last(): rejoing the common path earlier in FMODE_{OPENED,CREATED} case Al Viro
2020-02-23  1:16   ` [RFC][PATCH v2 32/34] do_last(): simplify the liveness analysis past finish_open_created Al Viro
2020-02-23  1:16   ` [RFC][PATCH v2 33/34] do_last(): rejoin the common path even earlier in FMODE_{OPENED,CREATED} case Al Viro
2020-02-23  1:16   ` [RFC][PATCH v2 34/34] split the lookup-related parts of do_last() into a separate helper Al Viro
2020-02-25  1:24 ` [RFC][PATCHSET] sanitized pathwalk machinery (v2) Al Viro
2020-02-25  2:03   ` Al Viro
2020-02-28  1:24   ` Aleksa Sarai
2020-02-28  3:02     ` Al Viro
2020-03-01 21:51 ` [RFC][PATCHSET] sanitized pathwalk machinery (v3) Al Viro
2020-03-01 21:51   ` [RFC][PATCH v3 01/55] do_add_mount(): lift lock_mount/unlock_mount into callers Al Viro
2020-03-01 21:51     ` [RFC][PATCH v3 02/55] fix automount/automount race properly Al Viro
2020-03-01 21:51     ` [RFC][PATCH v3 03/55] follow_automount(): get rid of dead^Wstillborn code Al Viro
2020-03-01 21:51     ` [RFC][PATCH v3 04/55] follow_automount() doesn't need the entire nameidata Al Viro
2020-03-01 21:51     ` [RFC][PATCH v3 05/55] make build_open_flags() treat O_CREAT | O_EXCL as implying O_NOFOLLOW Al Viro
2020-03-01 21:51     ` [RFC][PATCH v3 06/55] handle_mounts(): start building a sane wrapper for follow_managed() Al Viro
2020-03-01 21:51     ` [RFC][PATCH v3 07/55] atomic_open(): saner calling conventions (return dentry on success) Al Viro
2020-03-01 21:51     ` [RFC][PATCH v3 08/55] lookup_open(): " Al Viro
2020-03-01 21:51     ` [RFC][PATCH v3 09/55] do_last(): collapse the call of path_to_nameidata() Al Viro
2020-03-01 21:51     ` [RFC][PATCH v3 10/55] handle_mounts(): pass dentry in, turn path into a pure out argument Al Viro
2020-03-01 21:51     ` [RFC][PATCH v3 11/55] lookup_fast(): consolidate the RCU success case Al Viro
2020-03-01 21:51     ` [RFC][PATCH v3 12/55] teach handle_mounts() to handle RCU mode Al Viro
2020-03-01 21:51     ` [RFC][PATCH v3 13/55] lookup_fast(): take mount traversal into callers Al Viro
2020-03-01 21:51     ` [RFC][PATCH v3 14/55] new step_into() flag: WALK_NOFOLLOW Al Viro
2020-03-01 21:52     ` [RFC][PATCH v3 15/55] fold handle_mounts() into step_into() Al Viro
2020-03-01 21:52     ` [RFC][PATCH v3 16/55] LOOKUP_MOUNTPOINT: fold path_mountpointat() into path_lookupat() Al Viro
2020-03-01 21:52     ` [RFC][PATCH v3 17/55] expand the only remaining call of path_lookup_conditional() Al Viro
2020-03-01 21:52     ` [RFC][PATCH v3 18/55] merging pick_link() with get_link(), part 1 Al Viro
2020-03-01 21:52     ` [RFC][PATCH v3 19/55] merging pick_link() with get_link(), part 2 Al Viro
2020-03-01 21:52     ` [RFC][PATCH v3 20/55] merging pick_link() with get_link(), part 3 Al Viro
2020-03-01 21:52     ` [RFC][PATCH v3 21/55] merging pick_link() with get_link(), part 4 Al Viro
2020-03-01 21:52     ` [RFC][PATCH v3 22/55] merging pick_link() with get_link(), part 5 Al Viro
2020-03-01 21:52     ` [RFC][PATCH v3 23/55] merging pick_link() with get_link(), part 6 Al Viro
2020-03-01 21:52     ` [RFC][PATCH v3 24/55] finally fold get_link() into pick_link() Al Viro
2020-03-01 21:52     ` [RFC][PATCH v3 25/55] sanitize handling of nd->last_type, kill LAST_BIND Al Viro
2020-03-01 21:52     ` [RFC][PATCH v3 26/55] namei: invert the meaning of WALK_FOLLOW Al Viro
2020-03-01 21:52     ` [RFC][PATCH v3 27/55] pick_link(): check for WALK_TRAILING, not LOOKUP_PARENT Al Viro
2020-03-01 21:52     ` Al Viro [this message]
2020-03-01 21:52     ` [RFC][PATCH v3 29/55] massage __follow_mount_rcu() a bit Al Viro
2020-03-01 21:52     ` [RFC][PATCH v3 30/55] new helper: traverse_mounts() Al Viro
2020-03-01 21:52     ` [RFC][PATCH v3 31/55] atomic_open(): return the right dentry in FMODE_OPENED case Al Viro
2020-03-01 21:52     ` [RFC][PATCH v3 32/55] atomic_open(): lift the call of may_open() into do_last() Al Viro
2020-03-01 21:52     ` [RFC][PATCH v3 33/55] do_last(): merge the may_open() calls Al Viro
2020-03-01 21:52     ` [RFC][PATCH v3 34/55] do_last(): don't bother with keeping got_write in FMODE_OPENED case Al Viro
2020-03-01 21:52     ` [RFC][PATCH v3 35/55] do_last(): rejoing the common path earlier in FMODE_{OPENED,CREATED} case Al Viro
2020-03-01 21:52     ` [RFC][PATCH v3 36/55] do_last(): simplify the liveness analysis past finish_open_created Al Viro
2020-03-01 21:52     ` [RFC][PATCH v3 37/55] do_last(): rejoin the common path even earlier in FMODE_{OPENED,CREATED} case Al Viro
2020-03-01 21:52     ` [RFC][PATCH v3 38/55] split the lookup-related parts of do_last() into a separate helper Al Viro
2020-03-01 21:52     ` [RFC][PATCH v3 39/55] path_connected(): pass mount and dentry separately Al Viro
2020-03-01 21:52     ` [RFC][PATCH v3 40/55] path_parent_directory(): leave changing path->dentry to callers Al Viro
2020-03-01 21:52     ` [RFC][PATCH v3 41/55] follow_dotdot(): expand the call of path_parent_directory() Al Viro
2020-03-01 21:52     ` [RFC][PATCH v3 42/55] follow_dotdot{,_rcu}(): lift switching nd->path to parent out of loop Al Viro
2020-03-01 21:52     ` [RFC][PATCH v3 43/55] follow_dotdot{,_rcu}(): lift LOOKUP_BENEATH checks " Al Viro
2020-03-01 21:52     ` [RFC][PATCH v3 44/55] move put_link() into handle_dots() Al Viro
2020-03-01 21:52     ` [RFC][PATCH v3 45/55] handle_dots(): return ERR_PTR/NULL instead of -E.../0 Al Viro
2020-03-01 21:52     ` [RFC][PATCH v3 46/55] move follow_dotdot() and follow_dotdot_rcu() towards handle_dots() Al Viro
2020-03-01 21:52     ` [RFC][PATCH v3 47/55] follow_dotdot{,_rcu}(): preparation to switch to step_into() Al Viro
2020-03-01 21:52     ` [RFC][PATCH v3 48/55] follow_dotdot{,_rcu}(): switch to use of step_into() Al Viro
2020-03-01 21:52     ` [RFC][PATCH v3 49/55] lift all calls of step_into() out of follow_dotdot/follow_dotdot_rcu Al Viro
2020-03-01 21:52     ` [RFC][PATCH v3 50/55] follow_dotdot{,_rcu}(): massage loops Al Viro
2020-03-01 21:52     ` [RFC][PATCH v3 51/55] follow_dotdot_rcu(): be lazy about changing nd->path Al Viro
2020-03-01 21:52     ` [RFC][PATCH v3 52/55] follow_dotdot(): " Al Viro
2020-03-01 21:52     ` [RFC][PATCH v3 53/55] helper for mount rootwards traversal Al Viro
2020-03-01 21:52     ` [RFC][PATCH v3 54/55] non-RCU analogue of the previous commit Al Viro
2020-03-01 21:52     ` [RFC][PATCH v3 55/55] fs/namei.c: kill follow_mount() Al Viro
2020-03-01 22:34   ` [RFC][PATCHSET] sanitized pathwalk machinery (v3) Linus Torvalds
2020-03-02  0:39     ` Al Viro
2020-03-03 23:48       ` Eric W. Biederman
2020-03-04  0:24         ` Al Viro
2020-03-04  5:23           ` Eric W. Biederman
2020-03-04  6:55             ` Al Viro
2020-03-04 13:28               ` Matthew Wilcox
2020-03-04 16:20                 ` Al Viro
2020-03-04 20:54                   ` Al Viro
     [not found]               ` <20200304105946.4xseo3jokcnpptrj@yavin>
2020-03-04 21:00                 ` Al Viro
2020-03-05  1:11                   ` Matthew Wilcox
2020-03-13 23:53   ` [RFC][PATCHSET] sanitized pathwalk machinery (v4) Al Viro
2020-03-13 23:52     ` [RFC][PATCH v4 01/69] do_add_mount(): lift lock_mount/unlock_mount into callers Al Viro
2020-03-13 23:52       ` [RFC][PATCH v4 02/69] fix automount/automount race properly Al Viro
2020-03-13 23:52       ` [RFC][PATCH v4 03/69] follow_automount(): get rid of dead^Wstillborn code Al Viro
2020-03-13 23:52       ` [RFC][PATCH v4 04/69] follow_automount() doesn't need the entire nameidata Al Viro
2020-03-13 23:52       ` [RFC][PATCH v4 05/69] make build_open_flags() treat O_CREAT | O_EXCL as implying O_NOFOLLOW Al Viro
2020-03-13 23:52       ` [RFC][PATCH v4 06/69] handle_mounts(): start building a sane wrapper for follow_managed() Al Viro
2020-03-13 23:52       ` [RFC][PATCH v4 07/69] atomic_open(): saner calling conventions (return dentry on success) Al Viro
2020-03-13 23:52       ` [RFC][PATCH v4 08/69] lookup_open(): " Al Viro
2020-03-13 23:52       ` [RFC][PATCH v4 09/69] do_last(): collapse the call of path_to_nameidata() Al Viro
2020-03-13 23:52       ` [RFC][PATCH v4 10/69] handle_mounts(): pass dentry in, turn path into a pure out argument Al Viro
2020-03-13 23:52       ` [RFC][PATCH v4 11/69] lookup_fast(): consolidate the RCU success case Al Viro
2020-03-14  0:25         ` Linus Torvalds
2020-03-13 23:53       ` [RFC][PATCH v4 12/69] teach handle_mounts() to handle RCU mode Al Viro
2020-03-14  0:28         ` Linus Torvalds
2020-03-14  1:00           ` Al Viro
2020-03-13 23:53       ` [RFC][PATCH v4 13/69] lookup_fast(): take mount traversal into callers Al Viro
2020-03-13 23:53       ` [RFC][PATCH v4 14/69] step_into() callers: dismiss the symlink earlier Al Viro
2020-03-13 23:53       ` [RFC][PATCH v4 15/69] new step_into() flag: WALK_NOFOLLOW Al Viro
2020-03-14  0:32         ` Linus Torvalds
2020-03-14  1:06           ` Al Viro
2020-03-13 23:53       ` [RFC][PATCH v4 16/69] fold handle_mounts() into step_into() Al Viro
2020-03-13 23:53       ` [RFC][PATCH v4 17/69] LOOKUP_MOUNTPOINT: fold path_mountpointat() into path_lookupat() Al Viro
2020-03-13 23:53       ` [RFC][PATCH v4 18/69] expand the only remaining call of path_lookup_conditional() Al Viro
2020-03-13 23:53       ` [RFC][PATCH v4 19/69] merging pick_link() with get_link(), part 1 Al Viro
2020-03-13 23:53       ` [RFC][PATCH v4 20/69] merging pick_link() with get_link(), part 2 Al Viro
2020-03-14  0:40         ` Linus Torvalds
2020-03-13 23:53       ` [RFC][PATCH v4 21/69] merging pick_link() with get_link(), part 3 Al Viro
2020-03-13 23:53       ` [RFC][PATCH v4 22/69] merging pick_link() with get_link(), part 4 Al Viro
2020-03-13 23:53       ` [RFC][PATCH v4 23/69] merging pick_link() with get_link(), part 5 Al Viro
2020-03-13 23:53       ` [RFC][PATCH v4 24/69] merging pick_link() with get_link(), part 6 Al Viro
2020-03-13 23:53       ` [RFC][PATCH v4 25/69] finally fold get_link() into pick_link() Al Viro
2020-03-13 23:53       ` [RFC][PATCH v4 26/69] sanitize handling of nd->last_type, kill LAST_BIND Al Viro
2020-03-13 23:53       ` [RFC][PATCH v4 27/69] namei: invert the meaning of WALK_FOLLOW Al Viro
2020-03-14  0:42         ` Linus Torvalds
2020-03-13 23:53       ` [RFC][PATCH v4 28/69] pick_link(): check for WALK_TRAILING, not LOOKUP_PARENT Al Viro
2020-03-13 23:53       ` [RFC][PATCH v4 29/69] link_path_walk(): simplify stack handling Al Viro
2020-03-13 23:53       ` [RFC][PATCH v4 30/69] namei: have link_path_walk() maintain LOOKUP_PARENT Al Viro
2020-03-13 23:53       ` [RFC][PATCH v4 31/69] massage __follow_mount_rcu() a bit Al Viro
2020-03-13 23:53       ` [RFC][PATCH v4 32/69] new helper: traverse_mounts() Al Viro
2020-03-13 23:53       ` [RFC][PATCH v4 33/69] atomic_open(): return the right dentry in FMODE_OPENED case Al Viro
2020-03-13 23:53       ` [RFC][PATCH v4 34/69] atomic_open(): lift the call of may_open() into do_last() Al Viro
2020-03-13 23:53       ` [RFC][PATCH v4 35/69] do_last(): merge the may_open() calls Al Viro
2020-03-13 23:53       ` [RFC][PATCH v4 36/69] do_last(): don't bother with keeping got_write in FMODE_OPENED case Al Viro
2020-03-13 23:53       ` [RFC][PATCH v4 37/69] do_last(): rejoing the common path earlier in FMODE_{OPENED,CREATED} case Al Viro
2020-03-13 23:53       ` [RFC][PATCH v4 38/69] do_last(): simplify the liveness analysis past finish_open_created Al Viro
2020-03-13 23:53       ` [RFC][PATCH v4 39/69] do_last(): rejoin the common path even earlier in FMODE_{OPENED,CREATED} case Al Viro
2020-03-13 23:53       ` [RFC][PATCH v4 40/69] split the lookup-related parts of do_last() into a separate helper Al Viro
2020-03-13 23:53       ` [RFC][PATCH v4 41/69] path_connected(): pass mount and dentry separately Al Viro
2020-03-13 23:53       ` [RFC][PATCH v4 42/69] path_parent_directory(): leave changing path->dentry to callers Al Viro
2020-03-13 23:53       ` [RFC][PATCH v4 43/69] expand path_parent_directory() in its callers Al Viro
2020-03-13 23:53       ` [RFC][PATCH v4 44/69] follow_dotdot{,_rcu}(): lift switching nd->path to parent out of loop Al Viro
2020-03-13 23:53       ` [RFC][PATCH v4 45/69] follow_dotdot{,_rcu}(): lift LOOKUP_BENEATH checks " Al Viro
2020-03-13 23:53       ` [RFC][PATCH v4 46/69] move handle_dots(), follow_dotdot() and follow_dotdot_rcu() past step_into() Al Viro
2020-03-13 23:53       ` [RFC][PATCH v4 47/69] handle_dots(), follow_dotdot{,_rcu}(): preparation to switch to step_into() Al Viro
2020-03-13 23:53       ` [RFC][PATCH v4 48/69] follow_dotdot{,_rcu}(): switch to use of step_into() Al Viro
2020-03-13 23:53       ` [RFC][PATCH v4 49/69] lift all calls of step_into() out of follow_dotdot/follow_dotdot_rcu Al Viro
2020-03-13 23:53       ` [RFC][PATCH v4 50/69] follow_dotdot{,_rcu}(): massage loops Al Viro
2020-03-13 23:53       ` [RFC][PATCH v4 51/69] follow_dotdot_rcu(): be lazy about changing nd->path Al Viro
2020-03-13 23:53       ` [RFC][PATCH v4 52/69] follow_dotdot(): " Al Viro
2020-03-13 23:53       ` [RFC][PATCH v4 53/69] helper for mount rootwards traversal Al Viro
2020-03-13 23:53       ` [RFC][PATCH v4 54/69] non-RCU analogue of the previous commit Al Viro
2020-03-13 23:53       ` [RFC][PATCH v4 55/69] fs/namei.c: kill follow_mount() Al Viro
2020-03-13 23:53       ` [RFC][PATCH v4 56/69] pick_link(): more straightforward handling of allocation failures Al Viro
2020-03-13 23:53       ` [RFC][PATCH v4 57/69] pick_link(): pass it struct path already with normal refcounting rules Al Viro
2020-03-13 23:53       ` [RFC][PATCH v4 58/69] fold path_to_nameidata() into its only remaining caller Al Viro
2020-03-13 23:53       ` [RFC][PATCH v4 59/69] pick_link(): take reserving space on stack into a new helper Al Viro
2020-03-13 23:53       ` [RFC][PATCH v4 60/69] reserve_stack(): switch to __nd_alloc_stack() Al Viro
2020-03-13 23:53       ` [RFC][PATCH v4 61/69] __nd_alloc_stack(): make it return bool Al Viro
2020-03-13 23:53       ` [RFC][PATCH v4 62/69] link_path_walk(): sample parent's i_uid and i_mode for the last component Al Viro
2020-03-13 23:53       ` [RFC][PATCH v4 63/69] take post-lookup part of do_last() out of loop Al Viro
2020-03-13 23:53       ` [RFC][PATCH v4 64/69] open_last_lookups(): consolidate fsnotify_create() calls Al Viro
2020-03-13 23:53       ` [RFC][PATCH v4 65/69] open_last_lookups(): don't abuse complete_walk() when all we want is unlazy Al Viro
2020-03-13 23:53       ` [RFC][PATCH v4 66/69] open_last_lookups(): lift O_EXCL|O_CREAT handling into do_open() Al Viro
2020-03-13 23:53       ` [RFC][PATCH v4 67/69] open_last_lookups(): move complete_walk() " Al Viro
2020-03-13 23:53       ` [RFC][PATCH v4 68/69] atomic_open(): no need to pass struct open_flags anymore Al Viro
2020-03-13 23:53       ` [RFC][PATCH v4 69/69] lookup_open(): don't bother with fallbacks to lookup+create Al Viro
     [not found]       ` <20200315094148.12872-1-hdanton@sina.com>
2020-03-15 14:23         ` [RFC][PATCH v4 22/69] merging pick_link() with get_link(), part 4 Al Viro
     [not found]       ` <20200315095323.220-1-hdanton@sina.com>
2020-03-15 14:24         ` [RFC][PATCH v4 23/69] merging pick_link() with get_link(), part 5 Al Viro
     [not found]       ` <20200315124007.1504-1-hdanton@sina.com>
2020-03-15 14:34         ` [RFC][PATCH v4 38/69] do_last(): simplify the liveness analysis past finish_open_created Al Viro
     [not found]       ` <20200315102905.12468-1-hdanton@sina.com>
2020-03-15 14:37         ` [RFC][PATCH v4 26/69] sanitize handling of nd->last_type, kill LAST_BIND Al Viro
2020-03-14  0:50     ` [RFC][PATCHSET] sanitized pathwalk machinery (v4) Linus Torvalds
2020-03-14  2:27       ` Al Viro

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=20200301215240.873899-28-viro@ZenIV.linux.org.uk \
    --to=viro@zeniv.linux.org.uk \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=torvalds@linux-foundation.org \
    /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).