lkml.org 
[lkml]   [2017]   [Oct]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[GIT PULL for-4.9 35/48] ceph: clean up unsafe d_parent accesses in build_dentry_path
    Date
    From: Jeff Layton <jlayton@redhat.com>

    [ Upstream commit c6b0b656ca24ede6657abb4a2cd910fa9c1879ba ]

    While we hold a reference to the dentry when build_dentry_path is
    called, we could end up racing with a rename that changes d_parent.
    Handle that situation correctly, by using the rcu_read_lock to
    ensure that the parent dentry and inode stick around long enough
    to safely check ceph_snap and ceph_ino.

    Link: http://tracker.ceph.com/issues/18148
    Signed-off-by: Jeff Layton <jlayton@redhat.com>
    Reviewed-by: Yan, Zheng <zyan@redhat.com>
    Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
    Signed-off-by: Sasha Levin <alexander.levin@verizon.com>
    ---
    fs/ceph/mds_client.c | 9 +++++++--
    1 file changed, 7 insertions(+), 2 deletions(-)

    diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c
    index e3e1a80b351e..c0f52c443c34 100644
    --- a/fs/ceph/mds_client.c
    +++ b/fs/ceph/mds_client.c
    @@ -1782,13 +1782,18 @@ static int build_dentry_path(struct dentry *dentry,
    int *pfreepath)
    {
    char *path;
    + struct inode *dir;

    - if (ceph_snap(d_inode(dentry->d_parent)) == CEPH_NOSNAP) {
    - *pino = ceph_ino(d_inode(dentry->d_parent));
    + rcu_read_lock();
    + dir = d_inode_rcu(dentry->d_parent);
    + if (dir && ceph_snap(dir) == CEPH_NOSNAP) {
    + *pino = ceph_ino(dir);
    + rcu_read_unlock();
    *ppath = dentry->d_name.name;
    *ppathlen = dentry->d_name.len;
    return 0;
    }
    + rcu_read_unlock();
    path = ceph_mdsc_build_path(dentry, ppathlen, pino, 1);
    if (IS_ERR(path))
    return PTR_ERR(path);
    --
    2.11.0
    \
     
     \ /
      Last update: 2017-10-11 03:02    [W:4.112 / U:0.472 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site