mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-04 04:06:26 +00:00
ceph: fix deadlock or deadcode of misusing dget()
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>
This commit is contained in:
parent
aaefabc4a5
commit
b493ad718b
@ -4887,13 +4887,15 @@ 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);
|
||||
struct ceph_client *cl;
|
||||
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
|
||||
@ -4903,14 +4905,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);
|
||||
|
||||
cl = ceph_inode_to_client(dir);
|
||||
spin_lock(&dentry->d_lock);
|
||||
|
Loading…
Reference in New Issue
Block a user