From e2ee3cd50c96bdcaab19ef9a68dc92cf54a35904 Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Tue, 30 Apr 2019 11:10:09 -0400 Subject: [PATCH] librbd: AioCompletion fail path should complete in clean thread Ensure that no internal librbd locks are being held when the callbacks are invoked for AioCompletion::fail. Signed-off-by: Jason Dillaman --- src/librbd/io/AioCompletion.cc | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/librbd/io/AioCompletion.cc b/src/librbd/io/AioCompletion.cc index b282397f01d..610435aceef 100644 --- a/src/librbd/io/AioCompletion.cc +++ b/src/librbd/io/AioCompletion.cc @@ -146,12 +146,11 @@ void AioCompletion::fail(int r) CephContext *cct = ictx->cct; lderr(cct) << cpp_strerror(r) << dendl; - ceph_assert(pending_count == 0); + uint32_t previous_pending_count = pending_count.exchange(1); + ceph_assert(previous_pending_count == 0); - get(); - rval = r; - complete(); - put(); + // ensure completion fires in clean lock context + ictx->op_work_queue->queue(new C_AioRequest(this), r); } void AioCompletion::set_request_count(uint32_t count) { -- 2.39.5