]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: ensure image cannot be closed until in-flight IO callbacks complete
authorJason Dillaman <dillaman@redhat.com>
Tue, 28 Jul 2020 13:07:49 +0000 (09:07 -0400)
committerJason Dillaman <dillaman@redhat.com>
Wed, 29 Jul 2020 14:42:21 +0000 (10:42 -0400)
If a librbd client attempts to close the image while it still has in-flight IO
pending, it's possible for the AsyncOperation tracker which prevents the image
from being closed to be completed before the actual AioCompletion callback
fires. This can result in the now destructed ImageCtx being de-referenced by
the AioCompletion.

Fixes: https://tracker.ceph.com/issues/46737
Signed-off-by: Jason Dillaman <dillaman@redhat.com>
(cherry picked from commit 0d64e31c191f04b10b5318eb6d4db9dd83b2d166)

Conflicts:
src/librbd/io/AioCompletion.cc: trivial resolution

src/librbd/io/AioCompletion.cc

index 2ddefdaccb96959789ec1f0a1f159582f076003c..fa0548f15573cea2b960632782b61378e730aba3 100644 (file)
@@ -112,10 +112,6 @@ void AioCompletion::complete() {
     notify_callbacks_complete();
   }
 
-  // note: possible for image to be closed after op marked finished
-  if (async_op.started()) {
-    async_op.finish_op();
-  }
   tracepoint(librbd, aio_complete_exit);
 }
 
@@ -278,8 +274,15 @@ void AioCompletion::complete_event_socket() {
 void AioCompletion::notify_callbacks_complete() {
   state = AIO_STATE_COMPLETE;
 
-  std::unique_lock<std::mutex> locker(lock);
-  cond.notify_all();
+  {
+    std::unique_lock<std::mutex> locker(lock);
+    cond.notify_all();
+  }
+
+  // note: possible for image to be closed after op marked finished
+  if (async_op.started()) {
+    async_op.finish_op();
+  }
 }
 
 } // namespace io