From 2ae32068dee22a0ca0698e230ead98f2eeeff3e6 Mon Sep 17 00:00:00 2001 From: Josh Durgin Date: Wed, 27 Mar 2013 15:37:27 -0700 Subject: [PATCH] librbd: add an is_complete() method to AioCompletions Mainly this is useful for testing, like flushing and checking that all pending writes are complete after the flush finishes. Signed-off-by: Josh Durgin --- src/include/rbd/librbd.h | 1 + src/include/rbd/librbd.hpp | 1 + src/librbd/AioCompletion.h | 5 +++++ src/librbd/librbd.cc | 12 ++++++++++++ 4 files changed, 19 insertions(+) diff --git a/src/include/rbd/librbd.h b/src/include/rbd/librbd.h index 8ce82e10c6d02..f41641bec7ef4 100644 --- a/src/include/rbd/librbd.h +++ b/src/include/rbd/librbd.h @@ -318,6 +318,7 @@ int rbd_aio_write(rbd_image_t image, uint64_t off, size_t len, const char *buf, int rbd_aio_read(rbd_image_t image, uint64_t off, size_t len, char *buf, rbd_completion_t c); int rbd_aio_discard(rbd_image_t image, uint64_t off, uint64_t len, rbd_completion_t c); int rbd_aio_create_completion(void *cb_arg, rbd_callback_t complete_cb, rbd_completion_t *c); +int rbd_aio_is_complete(rbd_completion_t c); int rbd_aio_wait_for_complete(rbd_completion_t c); ssize_t rbd_aio_get_return_value(rbd_completion_t c); void rbd_aio_release(rbd_completion_t c); diff --git a/src/include/rbd/librbd.hpp b/src/include/rbd/librbd.hpp index 9fdd14557a0a0..c256df267f9a9 100644 --- a/src/include/rbd/librbd.hpp +++ b/src/include/rbd/librbd.hpp @@ -63,6 +63,7 @@ public: struct AioCompletion { void *pc; AioCompletion(void *cb_arg, callback_t complete_cb); + bool is_complete(); int wait_for_complete(); ssize_t get_return_value(); void release(); diff --git a/src/librbd/AioCompletion.h b/src/librbd/AioCompletion.h index 361d425531f24..8420d37c8bd6f 100644 --- a/src/librbd/AioCompletion.h +++ b/src/librbd/AioCompletion.h @@ -125,6 +125,11 @@ namespace librbd { void complete_request(CephContext *cct, ssize_t r); + bool is_complete() { + Mutex::Locker l(lock); + return done; + } + ssize_t get_return_value() { lock.Lock(); ssize_t r = rval; diff --git a/src/librbd/librbd.cc b/src/librbd/librbd.cc index 9621f352abbe6..a155abb03764d 100644 --- a/src/librbd/librbd.cc +++ b/src/librbd/librbd.cc @@ -181,6 +181,12 @@ namespace librbd { c->rbd_comp = this; } + bool RBD::AioCompletion::is_complete() + { + librbd::AioCompletion *c = (librbd::AioCompletion *)pc; + return c->is_complete(); + } + int RBD::AioCompletion::wait_for_complete() { librbd::AioCompletion *c = (librbd::AioCompletion *)pc; @@ -1060,6 +1066,12 @@ extern "C" int rbd_flush(rbd_image_t image) return librbd::flush(ictx); } +extern "C" int rbd_aio_is_complete(rbd_completion_t c) +{ + librbd::RBD::AioCompletion *comp = (librbd::RBD::AioCompletion *)c; + return comp->is_complete(); +} + extern "C" int rbd_aio_wait_for_complete(rbd_completion_t c) { librbd::RBD::AioCompletion *comp = (librbd::RBD::AioCompletion *)c; -- 2.39.5