lkml.org 
[lkml]   [2020]   [Mar]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[RFC][PATCH v4 48/69] follow_dotdot{,_rcu}(): switch to use of step_into()
    Date
    From: Al Viro <viro@zeniv.linux.org.uk>

    gets the regular mount crossing on result of ..

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

    diff --git a/fs/namei.c b/fs/namei.c
    index 1749e435edc7..9c775013368a 100644
    --- a/fs/namei.c
    +++ b/fs/namei.c
    @@ -1722,33 +1722,18 @@ static const char *follow_dotdot_rcu(struct nameidata *nd)
    /* we know that mountpoint was pinned */
    nd->path.dentry = mountpoint;
    nd->path.mnt = &mparent->mnt;
    - inode = inode2;
    + inode = nd->inode = inode2;
    nd->seq = seq;
    }
    }
    if (unlikely(!parent)) {
    if (unlikely(nd->flags & LOOKUP_BENEATH))
    return ERR_PTR(-ECHILD);
    + return step_into(nd, WALK_NOFOLLOW,
    + nd->path.dentry, nd->inode, nd->seq);
    } else {
    - nd->path.dentry = parent;
    - nd->seq = seq;
    + return step_into(nd, WALK_NOFOLLOW, parent, inode, seq);
    }
    - while (unlikely(d_mountpoint(nd->path.dentry))) {
    - struct mount *mounted;
    - mounted = __lookup_mnt(nd->path.mnt, nd->path.dentry);
    - if (unlikely(read_seqretry(&mount_lock, nd->m_seq)))
    - return ERR_PTR(-ECHILD);
    - if (!mounted)
    - break;
    - if (unlikely(nd->flags & LOOKUP_NO_XDEV))
    - return ERR_PTR(-ECHILD);
    - nd->path.mnt = &mounted->mnt;
    - nd->path.dentry = mounted->mnt.mnt_root;
    - inode = nd->path.dentry->d_inode;
    - nd->seq = read_seqcount_begin(&nd->path.dentry->d_seq);
    - }
    - nd->inode = inode;
    - return NULL;
    }

    static const char *follow_dotdot(struct nameidata *nd)
    @@ -1774,13 +1759,11 @@ static const char *follow_dotdot(struct nameidata *nd)
    if (unlikely(!parent)) {
    if (unlikely(nd->flags & LOOKUP_BENEATH))
    return ERR_PTR(-EXDEV);
    + return step_into(nd, WALK_NOFOLLOW,
    + dget(nd->path.dentry), nd->inode, nd->seq);
    } else {
    - dput(nd->path.dentry);
    - nd->path.dentry = parent;
    + return step_into(nd, WALK_NOFOLLOW, parent, parent->d_inode, 0);
    }
    - follow_mount(&nd->path);
    - nd->inode = nd->path.dentry->d_inode;
    - return NULL;
    }

    static const char *handle_dots(struct nameidata *nd, int type)
    --
    2.11.0
    \
     
     \ /
      Last update: 2020-03-14 00:56    [W:4.294 / U:0.004 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site