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
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);
}
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