]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: fix memory leak when quiesce fails
authorMykola Golub <mgolub@suse.com>
Thu, 11 Jun 2020 16:25:11 +0000 (17:25 +0100)
committerMykola Golub <mgolub@suse.com>
Thu, 11 Jun 2020 16:25:11 +0000 (17:25 +0100)
Signed-off-by: Mykola Golub <mgolub@suse.com>
src/librbd/ImageWatcher.cc

index ee7c6e08baedf6dce6726fb63be9037807f86d9a..1b101bd2396fe0c94bafc08ca83584f6bd1f2ef5 100644 (file)
@@ -702,28 +702,28 @@ Context *ImageWatcher<I>::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);
       }