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
next prev 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).