#include "common/ceph_context.h"
#include "common/dout.h"
+#include "common/errno.h"
#include "librbd/AioRequest.h"
#include "librbd/internal.h"
building = false;
if (!pending_count) {
finalize(cct, rval);
- complete();
+ complete(cct);
}
lock.Unlock();
}
}
}
+ void AioCompletion::complete(CephContext *cct) {
+ utime_t elapsed;
+ assert(lock.is_locked());
+ elapsed = ceph_clock_now(cct) - start_time;
+ switch (aio_type) {
+ case AIO_TYPE_READ:
+ ictx->perfcounter->tinc(l_librbd_aio_rd_latency, elapsed); break;
+ case AIO_TYPE_WRITE:
+ ictx->perfcounter->tinc(l_librbd_aio_wr_latency, elapsed); break;
+ case AIO_TYPE_DISCARD:
+ ictx->perfcounter->tinc(l_librbd_aio_discard_latency, elapsed); break;
+ case AIO_TYPE_FLUSH:
+ ictx->perfcounter->tinc(l_librbd_aio_flush_latency, elapsed); break;
+ default:
+ lderr(cct) << "completed invalid aio_type: " << aio_type << dendl;
+ break;
+ }
+
+ if (complete_cb) {
+ complete_cb(rbd_comp, complete_arg);
+ }
+ done = true;
+ cond.Signal();
+ }
+
+ void AioCompletion::fail(CephContext *cct, int r)
+ {
+ lderr(cct) << "AioCompletion::fail() " << this << ": " << cpp_strerror(r)
+ << dendl;
+ lock.Lock();
+ assert(pending_count == 0);
+ rval = r;
+ complete(cct);
+ put_unlock();
+ }
+
void AioCompletion::complete_request(CephContext *cct, ssize_t r)
{
ldout(cct, 20) << "AioCompletion::complete_request() "
int count = --pending_count;
if (!count && !building) {
finalize(cct, rval);
- complete();
+ complete(cct);
}
put_unlock();
}
start_time = ceph_clock_now(ictx->cct);
}
- void complete() {
- utime_t elapsed;
- assert(lock.is_locked());
- elapsed = ceph_clock_now(ictx->cct) - start_time;
- switch (aio_type) {
- case AIO_TYPE_READ:
- ictx->perfcounter->tinc(l_librbd_aio_rd_latency, elapsed); break;
- case AIO_TYPE_WRITE:
- ictx->perfcounter->tinc(l_librbd_aio_wr_latency, elapsed); break;
- case AIO_TYPE_DISCARD:
- ictx->perfcounter->tinc(l_librbd_aio_discard_latency, elapsed); break;
- case AIO_TYPE_FLUSH:
- ictx->perfcounter->tinc(l_librbd_aio_flush_latency, elapsed); break;
- default:
- lderr(ictx->cct) << "completed invalid aio_type: " << aio_type << dendl;
- break;
- }
- if (complete_cb) {
- complete_cb(rbd_comp, complete_arg);
- }
- done = true;
- cond.Signal();
- }
+ void complete(CephContext *cct);
+ void fail(CephContext *cct, int r);
void set_complete_cb(void *cb_arg, callback_t cb) {
complete_cb = cb;