IB/uverbs: Fix unbalanced unlock on error path for rdma_explicit_destroy
[ Upstream commitec6f8401c4
] If remove_commit fails then the lock is left locked while the uobj still exists. Eventually the kernel will deadlock. lockdep detects this and says: test/4221 is leaving the kernel with locks still held! 1 lock held by test/4221: #0: (&ucontext->cleanup_rwsem){.+.+}, at: [<000000001e5c7523>] rdma_explicit_destroy+0x37/0x120 [ib_uverbs] Fixes:4da70da23e
("IB/core: Explicitly destroy an object while keeping uobject") Signed-off-by: Leon Romanovsky <leon@kernel.org> Reviewed-by: Dennis Dalessandro <dennis.dalessandro@intel.com> Signed-off-by: Jason Gunthorpe <jgg@mellanox.com> Signed-off-by: Sasha Levin <alexander.levin@microsoft.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
5b0622bfe6
commit
357b528e6b
|
@ -486,12 +486,13 @@ int rdma_explicit_destroy(struct ib_uobject *uobject)
|
|||
ret = uobject->type->type_class->remove_commit(uobject,
|
||||
RDMA_REMOVE_DESTROY);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto out;
|
||||
|
||||
uobject->type = &null_obj_type;
|
||||
|
||||
out:
|
||||
up_read(&ucontext->cleanup_rwsem);
|
||||
return 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void alloc_commit_idr_uobject(struct ib_uobject *uobj)
|
||||
|
|
Loading…
Reference in a new issue