static inline int step_into(struct nameidata *nd, struct path *path,
int flags, struct inode *inode, unsigned seq)
{
- if (!(flags & WALK_MORE) && nd->depth)
- put_link(nd);
if (likely(!d_is_symlink(path->dentry)) ||
!(flags & WALK_FOLLOW || nd->flags & LOOKUP_FOLLOW)) {
/* not a symlink or should not follow */
* parent relationships.
*/
if (unlikely(nd->last_type != LAST_NORM)) {
- err = handle_dots(nd, nd->last_type);
if (!(flags & WALK_MORE) && nd->depth)
put_link(nd);
+ err = handle_dots(nd, nd->last_type);
return err;
}
dentry = lookup_fast(nd, &inode, &seq);
if (IS_ERR(dentry))
return PTR_ERR(dentry);
}
+ if (!(flags & WALK_MORE) && nd->depth)
+ put_link(nd);
err = handle_mounts(nd, dentry, &path, &inode, &seq);
if (unlikely(err < 0))
nd->flags |= op->intent;
if (nd->last_type != LAST_NORM) {
+ if (nd->depth)
+ put_link(nd);
error = handle_dots(nd, nd->last_type);
if (unlikely(error))
return error;
}
finish_lookup:
+ if (nd->depth)
+ put_link(nd);
error = handle_mounts(nd, dentry, &path, &inode, &seq);
if (unlikely(error < 0))
return error;