From: Mykola Golub Date: Thu, 11 Jun 2020 16:25:11 +0000 (+0100) Subject: librbd: fix memory leak when quiesce fails X-Git-Tag: v16.1.0~2015^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=ec00b5d6e5e2dc0eb92ab90a33dcf33f1b67a7d2;p=ceph.git librbd: fix memory leak when quiesce fails Signed-off-by: Mykola Golub --- diff --git a/src/librbd/ImageWatcher.cc b/src/librbd/ImageWatcher.cc index ee7c6e08baed..1b101bd2396f 100644 --- a/src/librbd/ImageWatcher.cc +++ b/src/librbd/ImageWatcher.cc @@ -702,28 +702,28 @@ Context *ImageWatcher::prepare_quiesce_request( m_async_requests[request] = AsyncRequest(ack_ctx, nullptr); m_async_op_tracker.start_op(); - auto unquiesce_ctx = new LambdaContext( - [this, request](int r) { - if (r == 0) { - ldout(m_image_ctx.cct, 10) << this << " quiesce request " << request - << " timed out" << dendl; - } - - auto on_finish = new LambdaContext( - [this, request](int r) { - std::unique_lock async_request_locker{m_async_request_lock}; - m_async_pending.erase(request); - }); - - m_image_ctx.state->notify_unquiesce(on_finish); - }); - return new LambdaContext( - [this, request, unquiesce_ctx, timeout](int r) { + [this, request, timeout](int r) { if (r < 0) { std::unique_lock async_request_locker{m_async_request_lock}; m_async_pending.erase(request); } else { + auto unquiesce_ctx = new LambdaContext( + [this, request](int r) { + if (r == 0) { + ldout(m_image_ctx.cct, 10) << this << " quiesce request " + << request << " timed out" << dendl; + } + + auto on_finish = new LambdaContext( + [this, request](int r) { + std::unique_lock async_request_locker{m_async_request_lock}; + m_async_pending.erase(request); + }); + + m_image_ctx.state->notify_unquiesce(on_finish); + }); + m_task_finisher->add_event_after(Task(TASK_CODE_QUIESCE, request), timeout, unquiesce_ctx); }