lkml.org 
[lkml]   [2024]   [Jan]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 6.1 21/27] ceph: fix deadlock or deadcode of misusing dget()
    Date
    From: Xiubo Li <xiubli@redhat.com>

    [ Upstream commit b493ad718b1f0357394d2cdecbf00a44a36fa085 ]

    The lock order is incorrect between denty and its parent, we should
    always make sure that the parent get the lock first.

    But since this deadcode is never used and the parent dir will always
    be set from the callers, let's just remove it.

    Link: https://lore.kernel.org/r/20231116081919.GZ1957730@ZenIV
    Reported-by: Al Viro <viro@zeniv.linux.org.uk>
    Signed-off-by: Xiubo Li <xiubli@redhat.com>
    Reviewed-by: Jeff Layton <jlayton@kernel.org>
    Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    fs/ceph/caps.c | 9 +++------
    1 file changed, 3 insertions(+), 6 deletions(-)

    diff --git a/fs/ceph/caps.c b/fs/ceph/caps.c
    index 36052a362683..111938a6307e 100644
    --- a/fs/ceph/caps.c
    +++ b/fs/ceph/caps.c
    @@ -4597,12 +4597,14 @@ int ceph_encode_dentry_release(void **p, struct dentry *dentry,
    struct inode *dir,
    int mds, int drop, int unless)
    {
    - struct dentry *parent = NULL;
    struct ceph_mds_request_release *rel = *p;
    struct ceph_dentry_info *di = ceph_dentry(dentry);
    int force = 0;
    int ret;

    + /* This shouldn't happen */
    + BUG_ON(!dir);
    +
    /*
    * force an record for the directory caps if we have a dentry lease.
    * this is racy (can't take i_ceph_lock and d_lock together), but it
    @@ -4612,14 +4614,9 @@ int ceph_encode_dentry_release(void **p, struct dentry *dentry,
    spin_lock(&dentry->d_lock);
    if (di->lease_session && di->lease_session->s_mds == mds)
    force = 1;
    - if (!dir) {
    - parent = dget(dentry->d_parent);
    - dir = d_inode(parent);
    - }
    spin_unlock(&dentry->d_lock);

    ret = ceph_encode_inode_release(p, dir, mds, drop, unless, force);
    - dput(parent);

    spin_lock(&dentry->d_lock);
    if (ret && di->lease_session && di->lease_session->s_mds == mds) {
    --
    2.43.0

    \
     
     \ /
      Last update: 2024-05-27 14:37    [W:2.297 / U:0.108 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site