]>
git.apps.os.sepia.ceph.com Git - ceph.git/commit
librbd: fix block_completion race condition
If block completions finished before all of them were scheduled, the
pending_count could reach 0, and the callback could be called more
than once. This caused the reference counting to be off, so the next
call to the callback passed an invalid pointer, resulting in crashes
like this (or more mysterious ones):
common/Mutex.h: In function 'void Mutex::Lock(bool)', in thread '0x7f5f37e62700'
common/Mutex.h: 118: FAILED assert(r == 0)
1: (librbd::RBD::AioCompletion::get_return_value()+0x19c) [0x7f5f408835bc]
2: /usr/bin/kvm() [0x4629fd]
3: (librbd::AioCompletion::complete_block(librbd::AioBlockCompletion*, long)+0x13c) [0x7f5f4088ab5c]
4: (librbd::rados_aio_sparse_read_cb(void*, void*)+0x8d) [0x7f5f4088b40d]
5: (librados::RadosClient::C_aio_sparse_read_Ack::finish(int)+0x12e) [0x7f5f4050beee]
6: (Objecter::handle_osd_op_reply(MOSDOpReply*)+0x783) [0x7f5f40517863]
7: (librados::RadosClient::_dispatch(Message*)+0x3c) [0x7f5f404ffe8c]
8: (librados::RadosClient::ms_dispatch(Message*)+0x33) [0x7f5f404fff53]
9: (SimpleMessenger::dispatch_entry()+0x69d) [0x7f5f405bf5bd]
10: (SimpleMessenger::DispatchThread::entry()+0x1c) [0x7f5f4050052c]
11: (()+0x6d8c) [0x7f5f40c9dd8c]
12: (clone()+0x6d) [0x7f5f3e0b904d]
Signed-off-by: Josh Durgin <josh.durgin@dreamhost.com>