From: Al Viro Date: Mon, 14 Nov 2016 06:43:34 +0000 (-0500) Subject: namei: pass both WALK_GET and WALK_MORE to should_follow_link() X-Git-Tag: v4.10-rc1~70^2^2~1 X-Git-Url: https://asedeno.scripts.mit.edu/gitweb/?a=commitdiff_plain;h=31d66bcd3f197d135145afb268996b4f5ea83459;p=linux.git namei: pass both WALK_GET and WALK_MORE to should_follow_link() ... and pull put_link() logics into it. Signed-off-by: Al Viro --- 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;