From: Jason Dillaman Date: Mon, 9 Nov 2015 16:22:24 +0000 (-0500) Subject: librbd: fixed deadlock while attempting to flush AIO requests X-Git-Tag: v0.94.6~60^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F6586%2Fhead;p=ceph.git librbd: fixed deadlock while attempting to flush AIO requests In-flight AIO requests might force a flush if a snapshot was created out-of-band. The flush completion was previously invoked asynchronously, potentially via the same thread worker handling the AIO request. This resulted in the flush operation deadlocking since it can't complete. Fixes: #13726 Backport: infernalis, hammer Signed-off-by: Jason Dillaman (cherry picked from commit bfeb90e5fe24347648c72345881fd3d932243c98) --- diff --git a/src/librbd/ImageCtx.cc b/src/librbd/ImageCtx.cc index 0f5d46a56f46..1574c56896fb 100644 --- a/src/librbd/ImageCtx.cc +++ b/src/librbd/ImageCtx.cc @@ -807,7 +807,7 @@ public: void ImageCtx::flush_async_operations(Context *on_finish) { Mutex::Locker l(async_ops_lock); if (async_ops.empty()) { - op_work_queue->queue(on_finish, 0); + on_finish->complete(0); return; }