diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2016-11-14 01:43:34 -0500 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2016-12-05 19:11:58 -0500 |
commit | 31d66bcd3f197d135145afb268996b4f5ea83459 (patch) | |
tree | 6814094108a24a01144960ee0905e04704842a84 | |
parent | 1c4ff1a87e46a06fc00a83da2fbbc3ac0298f221 (diff) |
namei: pass both WALK_GET and WALK_MORE to should_follow_link()
... and pull put_link() logics into it.
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
-rw-r--r-- | fs/namei.c | 18 |
1 files changed, 7 insertions, 11 deletions
diff --git a/fs/namei.c b/fs/namei.c index 57d60922396e..5d31f0b2006d 100644 --- a/fs/namei.c +++ b/fs/namei.c @@ -1725,6 +1725,8 @@ static int pick_link(struct nameidata *nd, struct path *link, return 1; } +enum {WALK_GET = 1, WALK_MORE = 2}; + /* * Do we need to follow links? We _really_ want to be able * to do this check without having to look at inode->i_op, @@ -1732,12 +1734,14 @@ static int pick_link(struct nameidata *nd, struct path *link, * for the common case. */ static inline int should_follow_link(struct nameidata *nd, struct path *link, - int follow, + int flags, struct inode *inode, unsigned seq) { + if (!(flags & WALK_MORE) && nd->depth) + put_link(nd); if (likely(!d_is_symlink(link->dentry))) return 0; - if (!follow && !(nd->flags & LOOKUP_FOLLOW)) + if (!(flags & WALK_GET) && !(nd->flags & LOOKUP_FOLLOW)) return 0; /* make sure that d_is_symlink above matches inode */ if (nd->flags & LOOKUP_RCU) { @@ -1747,8 +1751,6 @@ static inline int should_follow_link(struct nameidata *nd, struct path *link, return pick_link(nd, link, inode, seq); } -enum {WALK_GET = 1, WALK_MORE = 2}; - static int walk_component(struct nameidata *nd, int flags) { struct path path; @@ -1789,9 +1791,7 @@ static int walk_component(struct nameidata *nd, int flags) inode = d_backing_inode(path.dentry); } - if (!(flags & WALK_MORE) && nd->depth) - put_link(nd); - err = should_follow_link(nd, &path, flags & WALK_GET, inode, seq); + err = should_follow_link(nd, &path, flags, inode, seq); if (unlikely(err)) return err; path_to_nameidata(&path, nd); @@ -2616,8 +2616,6 @@ mountpoint_last(struct nameidata *nd) dput(path.dentry); return -ENOENT; } - if (nd->depth) - put_link(nd); path.mnt = nd->path.mnt; error = should_follow_link(nd, &path, 0, d_backing_inode(path.dentry), 0); @@ -3313,8 +3311,6 @@ static int do_last(struct nameidata *nd, seq = 0; /* out of RCU mode, so the value doesn't matter */ inode = d_backing_inode(path.dentry); finish_lookup: - if (nd->depth) - put_link(nd); error = should_follow_link(nd, &path, 0, inode, seq); if (unlikely(error)) return error; |