linux-fsdevel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Al Viro <viro@ZenIV.linux.org.uk>
To: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Neil Brown <neilb@suse.de>, Christoph Hellwig <hch@infradead.org>,
	linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org
Subject: [PATCH v3 027/110] name: shift nameidata down into user_path_walk()
Date: Mon, 11 May 2015 19:06:47 +0100	[thread overview]
Message-ID: <1431367690-5223-27-git-send-email-viro@ZenIV.linux.org.uk> (raw)
In-Reply-To: <20150511180650.GA4147@ZenIV.linux.org.uk>

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

that avoids having nameidata on stack during the calls of
->rmdir()/->unlink() and *two* of those during the calls
of ->rename().

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

diff --git a/fs/namei.c b/fs/namei.c
index 1439aa3..293300c 100644
--- a/fs/namei.c
+++ b/fs/namei.c
@@ -2211,9 +2211,13 @@ EXPORT_SYMBOL(user_path_at);
  *     path-walking is complete.
  */
 static struct filename *
-user_path_parent(int dfd, const char __user *path, struct nameidata *nd,
+user_path_parent(int dfd, const char __user *path,
+		 struct path *parent,
+		 struct qstr *last,
+		 int *type,
 		 unsigned int flags)
 {
+	struct nameidata nd;
 	struct filename *s = getname(path);
 	int error;
 
@@ -2223,11 +2227,14 @@ user_path_parent(int dfd, const char __user *path, struct nameidata *nd,
 	if (IS_ERR(s))
 		return s;
 
-	error = filename_lookup(dfd, s, flags | LOOKUP_PARENT, nd);
+	error = filename_lookup(dfd, s, flags | LOOKUP_PARENT, &nd);
 	if (error) {
 		putname(s);
 		return ERR_PTR(error);
 	}
+	*parent = nd.path;
+	*last = nd.last;
+	*type = nd.last_type;
 
 	return s;
 }
@@ -3630,14 +3637,17 @@ static long do_rmdir(int dfd, const char __user *pathname)
 	int error = 0;
 	struct filename *name;
 	struct dentry *dentry;
-	struct nameidata nd;
+	struct path path;
+	struct qstr last;
+	int type;
 	unsigned int lookup_flags = 0;
 retry:
-	name = user_path_parent(dfd, pathname, &nd, lookup_flags);
+	name = user_path_parent(dfd, pathname,
+				&path, &last, &type, lookup_flags);
 	if (IS_ERR(name))
 		return PTR_ERR(name);
 
-	switch(nd.last_type) {
+	switch (type) {
 	case LAST_DOTDOT:
 		error = -ENOTEMPTY;
 		goto exit1;
@@ -3649,13 +3659,12 @@ retry:
 		goto exit1;
 	}
 
-	nd.flags &= ~LOOKUP_PARENT;
-	error = mnt_want_write(nd.path.mnt);
+	error = mnt_want_write(path.mnt);
 	if (error)
 		goto exit1;
 
-	mutex_lock_nested(&nd.path.dentry->d_inode->i_mutex, I_MUTEX_PARENT);
-	dentry = __lookup_hash(&nd.last, nd.path.dentry, nd.flags);
+	mutex_lock_nested(&path.dentry->d_inode->i_mutex, I_MUTEX_PARENT);
+	dentry = __lookup_hash(&last, path.dentry, lookup_flags);
 	error = PTR_ERR(dentry);
 	if (IS_ERR(dentry))
 		goto exit2;
@@ -3663,17 +3672,17 @@ retry:
 		error = -ENOENT;
 		goto exit3;
 	}
-	error = security_path_rmdir(&nd.path, dentry);
+	error = security_path_rmdir(&path, dentry);
 	if (error)
 		goto exit3;
-	error = vfs_rmdir(nd.path.dentry->d_inode, dentry);
+	error = vfs_rmdir(path.dentry->d_inode, dentry);
 exit3:
 	dput(dentry);
 exit2:
-	mutex_unlock(&nd.path.dentry->d_inode->i_mutex);
-	mnt_drop_write(nd.path.mnt);
+	mutex_unlock(&path.dentry->d_inode->i_mutex);
+	mnt_drop_write(path.mnt);
 exit1:
-	path_put(&nd.path);
+	path_put(&path);
 	putname(name);
 	if (retry_estale(error, lookup_flags)) {
 		lookup_flags |= LOOKUP_REVAL;
@@ -3756,43 +3765,45 @@ static long do_unlinkat(int dfd, const char __user *pathname)
 	int error;
 	struct filename *name;
 	struct dentry *dentry;
-	struct nameidata nd;
+	struct path path;
+	struct qstr last;
+	int type;
 	struct inode *inode = NULL;
 	struct inode *delegated_inode = NULL;
 	unsigned int lookup_flags = 0;
 retry:
-	name = user_path_parent(dfd, pathname, &nd, lookup_flags);
+	name = user_path_parent(dfd, pathname,
+				&path, &last, &type, lookup_flags);
 	if (IS_ERR(name))
 		return PTR_ERR(name);
 
 	error = -EISDIR;
-	if (nd.last_type != LAST_NORM)
+	if (type != LAST_NORM)
 		goto exit1;
 
-	nd.flags &= ~LOOKUP_PARENT;
-	error = mnt_want_write(nd.path.mnt);
+	error = mnt_want_write(path.mnt);
 	if (error)
 		goto exit1;
 retry_deleg:
-	mutex_lock_nested(&nd.path.dentry->d_inode->i_mutex, I_MUTEX_PARENT);
-	dentry = __lookup_hash(&nd.last, nd.path.dentry, nd.flags);
+	mutex_lock_nested(&path.dentry->d_inode->i_mutex, I_MUTEX_PARENT);
+	dentry = __lookup_hash(&last, path.dentry, lookup_flags);
 	error = PTR_ERR(dentry);
 	if (!IS_ERR(dentry)) {
 		/* Why not before? Because we want correct error value */
-		if (nd.last.name[nd.last.len])
+		if (last.name[last.len])
 			goto slashes;
 		inode = dentry->d_inode;
 		if (d_is_negative(dentry))
 			goto slashes;
 		ihold(inode);
-		error = security_path_unlink(&nd.path, dentry);
+		error = security_path_unlink(&path, dentry);
 		if (error)
 			goto exit2;
-		error = vfs_unlink(nd.path.dentry->d_inode, dentry, &delegated_inode);
+		error = vfs_unlink(path.dentry->d_inode, dentry, &delegated_inode);
 exit2:
 		dput(dentry);
 	}
-	mutex_unlock(&nd.path.dentry->d_inode->i_mutex);
+	mutex_unlock(&path.dentry->d_inode->i_mutex);
 	if (inode)
 		iput(inode);	/* truncate the inode here */
 	inode = NULL;
@@ -3801,9 +3812,9 @@ exit2:
 		if (!error)
 			goto retry_deleg;
 	}
-	mnt_drop_write(nd.path.mnt);
+	mnt_drop_write(path.mnt);
 exit1:
-	path_put(&nd.path);
+	path_put(&path);
 	putname(name);
 	if (retry_estale(error, lookup_flags)) {
 		lookup_flags |= LOOKUP_REVAL;
@@ -4233,14 +4244,15 @@ EXPORT_SYMBOL(vfs_rename);
 SYSCALL_DEFINE5(renameat2, int, olddfd, const char __user *, oldname,
 		int, newdfd, const char __user *, newname, unsigned int, flags)
 {
-	struct dentry *old_dir, *new_dir;
 	struct dentry *old_dentry, *new_dentry;
 	struct dentry *trap;
-	struct nameidata oldnd, newnd;
+	struct path old_path, new_path;
+	struct qstr old_last, new_last;
+	int old_type, new_type;
 	struct inode *delegated_inode = NULL;
 	struct filename *from;
 	struct filename *to;
-	unsigned int lookup_flags = 0;
+	unsigned int lookup_flags = 0, target_flags = LOOKUP_RENAME_TARGET;
 	bool should_retry = false;
 	int error;
 
@@ -4254,47 +4266,45 @@ SYSCALL_DEFINE5(renameat2, int, olddfd, const char __user *, oldname,
 	if ((flags & RENAME_WHITEOUT) && !capable(CAP_MKNOD))
 		return -EPERM;
 
+	if (flags & RENAME_EXCHANGE)
+		target_flags = 0;
+
 retry:
-	from = user_path_parent(olddfd, oldname, &oldnd, lookup_flags);
+	from = user_path_parent(olddfd, oldname,
+				&old_path, &old_last, &old_type, lookup_flags);
 	if (IS_ERR(from)) {
 		error = PTR_ERR(from);
 		goto exit;
 	}
 
-	to = user_path_parent(newdfd, newname, &newnd, lookup_flags);
+	to = user_path_parent(newdfd, newname,
+				&new_path, &new_last, &new_type, lookup_flags);
 	if (IS_ERR(to)) {
 		error = PTR_ERR(to);
 		goto exit1;
 	}
 
 	error = -EXDEV;
-	if (oldnd.path.mnt != newnd.path.mnt)
+	if (old_path.mnt != new_path.mnt)
 		goto exit2;
 
-	old_dir = oldnd.path.dentry;
 	error = -EBUSY;
-	if (oldnd.last_type != LAST_NORM)
+	if (old_type != LAST_NORM)
 		goto exit2;
 
-	new_dir = newnd.path.dentry;
 	if (flags & RENAME_NOREPLACE)
 		error = -EEXIST;
-	if (newnd.last_type != LAST_NORM)
+	if (new_type != LAST_NORM)
 		goto exit2;
 
-	error = mnt_want_write(oldnd.path.mnt);
+	error = mnt_want_write(old_path.mnt);
 	if (error)
 		goto exit2;
 
-	oldnd.flags &= ~LOOKUP_PARENT;
-	newnd.flags &= ~LOOKUP_PARENT;
-	if (!(flags & RENAME_EXCHANGE))
-		newnd.flags |= LOOKUP_RENAME_TARGET;
-
 retry_deleg:
-	trap = lock_rename(new_dir, old_dir);
+	trap = lock_rename(new_path.dentry, old_path.dentry);
 
-	old_dentry = __lookup_hash(&oldnd.last, oldnd.path.dentry, oldnd.flags);
+	old_dentry = __lookup_hash(&old_last, old_path.dentry, lookup_flags);
 	error = PTR_ERR(old_dentry);
 	if (IS_ERR(old_dentry))
 		goto exit3;
@@ -4302,7 +4312,7 @@ retry_deleg:
 	error = -ENOENT;
 	if (d_is_negative(old_dentry))
 		goto exit4;
-	new_dentry = __lookup_hash(&newnd.last, newnd.path.dentry, newnd.flags);
+	new_dentry = __lookup_hash(&new_last, new_path.dentry, lookup_flags | target_flags);
 	error = PTR_ERR(new_dentry);
 	if (IS_ERR(new_dentry))
 		goto exit4;
@@ -4316,16 +4326,16 @@ retry_deleg:
 
 		if (!d_is_dir(new_dentry)) {
 			error = -ENOTDIR;
-			if (newnd.last.name[newnd.last.len])
+			if (new_last.name[new_last.len])
 				goto exit5;
 		}
 	}
 	/* unless the source is a directory trailing slashes give -ENOTDIR */
 	if (!d_is_dir(old_dentry)) {
 		error = -ENOTDIR;
-		if (oldnd.last.name[oldnd.last.len])
+		if (old_last.name[old_last.len])
 			goto exit5;
-		if (!(flags & RENAME_EXCHANGE) && newnd.last.name[newnd.last.len])
+		if (!(flags & RENAME_EXCHANGE) && new_last.name[new_last.len])
 			goto exit5;
 	}
 	/* source should not be ancestor of target */
@@ -4338,32 +4348,32 @@ retry_deleg:
 	if (new_dentry == trap)
 		goto exit5;
 
-	error = security_path_rename(&oldnd.path, old_dentry,
-				     &newnd.path, new_dentry, flags);
+	error = security_path_rename(&old_path, old_dentry,
+				     &new_path, new_dentry, flags);
 	if (error)
 		goto exit5;
-	error = vfs_rename(old_dir->d_inode, old_dentry,
-			   new_dir->d_inode, new_dentry,
+	error = vfs_rename(old_path.dentry->d_inode, old_dentry,
+			   new_path.dentry->d_inode, new_dentry,
 			   &delegated_inode, flags);
 exit5:
 	dput(new_dentry);
 exit4:
 	dput(old_dentry);
 exit3:
-	unlock_rename(new_dir, old_dir);
+	unlock_rename(new_path.dentry, old_path.dentry);
 	if (delegated_inode) {
 		error = break_deleg_wait(&delegated_inode);
 		if (!error)
 			goto retry_deleg;
 	}
-	mnt_drop_write(oldnd.path.mnt);
+	mnt_drop_write(old_path.mnt);
 exit2:
 	if (retry_estale(error, lookup_flags))
 		should_retry = true;
-	path_put(&newnd.path);
+	path_put(&new_path);
 	putname(to);
 exit1:
-	path_put(&oldnd.path);
+	path_put(&old_path);
 	putname(from);
 	if (should_retry) {
 		should_retry = false;
-- 
2.1.4


  parent reply	other threads:[~2015-05-11 18:08 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   ` Al Viro [this message]
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
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=1431367690-5223-27-git-send-email-viro@ZenIV.linux.org.uk \
    --to=viro@zeniv.linux.org.uk \
    --cc=hch@infradead.org \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=neilb@suse.de \
    --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).