PendingIO::PendingIO(action_id_t id,
ActionCtx &worker)
: m_id(id),
- m_completion(this, pending_io_callback),
+ m_completion(new librbd::RBD::AioCompletion(this, pending_io_callback)),
m_worker(worker) {
}
+PendingIO::~PendingIO() {
+ m_completion->release();
+}
+
void PendingIO::completed(librbd::completion_t cb) {
dout(ACTION_LEVEL) << "Completed pending IO #" << m_id << dendl;
- ssize_t r = m_completion.get_return_value();
+ ssize_t r = m_completion->get_return_value();
assertf(r >= 0, "id = %d, r = %d", m_id, r);
m_worker.remove_pending(shared_from_this());
}
PendingIO(action_id_t id,
ActionCtx &worker);
+ ~PendingIO();
+
void completed(librbd::completion_t cb);
action_id_t id() const {
}
librbd::RBD::AioCompletion &completion() {
- return m_completion;
+ return *m_completion;
}
private:
const action_id_t m_id;
ceph::bufferlist m_bl;
- librbd::RBD::AioCompletion m_completion;
+ librbd::RBD::AioCompletion *m_completion;
ActionCtx &m_worker;
};