From: Ricardo Dias Date: Fri, 24 Feb 2017 18:00:00 +0000 (+0000) Subject: librbd: added open an image by id to API X-Git-Tag: v12.0.2~106^2~10 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=d5e947946b3063888f660332ade44ee5fb16d5c2;p=ceph-ci.git librbd: added open an image by id to API Signed-off-by: Ricardo Dias --- diff --git a/src/include/rbd/librbd.h b/src/include/rbd/librbd.h index 115f90bfafe..c24d89dde71 100644 --- a/src/include/rbd/librbd.h +++ b/src/include/rbd/librbd.h @@ -278,10 +278,16 @@ CEPH_RBD_API int rbd_mirror_image_status_summary(rados_ioctx_t io_ctx, CEPH_RBD_API int rbd_open(rados_ioctx_t io, const char *name, rbd_image_t *image, const char *snap_name); +CEPH_RBD_API int rbd_open_by_id(rados_ioctx_t io, const char *id, + rbd_image_t *image, const char *snap_name); CEPH_RBD_API int rbd_aio_open(rados_ioctx_t io, const char *name, rbd_image_t *image, const char *snap_name, rbd_completion_t c); +CEPH_RBD_API int rbd_aio_open_by_id(rados_ioctx_t io, const char *id, + rbd_image_t *image, const char *snap_name, + rbd_completion_t c); + /** * Open an image in read-only mode. * @@ -303,9 +309,14 @@ CEPH_RBD_API int rbd_aio_open(rados_ioctx_t io, const char *name, */ CEPH_RBD_API int rbd_open_read_only(rados_ioctx_t io, const char *name, rbd_image_t *image, const char *snap_name); +CEPH_RBD_API int rbd_open_by_id_read_only(rados_ioctx_t io, const char *id, + rbd_image_t *image, const char *snap_name); CEPH_RBD_API int rbd_aio_open_read_only(rados_ioctx_t io, const char *name, rbd_image_t *image, const char *snap_name, rbd_completion_t c); +CEPH_RBD_API int rbd_aio_open_by_id_read_only(rados_ioctx_t io, const char *id, + rbd_image_t *image, const char *snap_name, + rbd_completion_t c); CEPH_RBD_API int rbd_close(rbd_image_t image); CEPH_RBD_API int rbd_aio_close(rbd_image_t image, rbd_completion_t c); CEPH_RBD_API int rbd_resize(rbd_image_t image, uint64_t size); diff --git a/src/include/rbd/librbd.hpp b/src/include/rbd/librbd.hpp index 5d85ab77ffa..dfd4e8b60b9 100644 --- a/src/include/rbd/librbd.hpp +++ b/src/include/rbd/librbd.hpp @@ -116,13 +116,21 @@ public: int open(IoCtx& io_ctx, Image& image, const char *name); int open(IoCtx& io_ctx, Image& image, const char *name, const char *snapname); + int open_by_id(IoCtx& io_ctx, Image& image, const char *id); + int open_by_id(IoCtx& io_ctx, Image& image, const char *id, const char *snapname); int aio_open(IoCtx& io_ctx, Image& image, const char *name, const char *snapname, RBD::AioCompletion *c); + int aio_open_by_id(IoCtx& io_ctx, Image& image, const char *id, + const char *snapname, RBD::AioCompletion *c); // see librbd.h int open_read_only(IoCtx& io_ctx, Image& image, const char *name, const char *snapname); + int open_by_id_read_only(IoCtx& io_ctx, Image& image, const char *id, + const char *snapname); int aio_open_read_only(IoCtx& io_ctx, Image& image, const char *name, const char *snapname, RBD::AioCompletion *c); + int aio_open_by_id_read_only(IoCtx& io_ctx, Image& image, const char *id, + const char *snapname, RBD::AioCompletion *c); int list(IoCtx& io_ctx, std::vector& names); int create(IoCtx& io_ctx, const char *name, uint64_t size, int *order); int create2(IoCtx& io_ctx, const char *name, uint64_t size, diff --git a/src/librbd/librbd.cc b/src/librbd/librbd.cc index cbc96bd6009..14b2318fc50 100644 --- a/src/librbd/librbd.cc +++ b/src/librbd/librbd.cc @@ -272,6 +272,11 @@ namespace librbd { return open(io_ctx, image, name, NULL); } + int RBD::open_by_id(IoCtx& io_ctx, Image& image, const char *id) + { + return open_by_id(io_ctx, image, id, nullptr); + } + int RBD::open(IoCtx& io_ctx, Image& image, const char *name, const char *snap_name) { @@ -295,6 +300,30 @@ namespace librbd { return 0; } + int RBD::open_by_id(IoCtx& io_ctx, Image& image, const char *id, + const char *snap_name) + { + ImageCtx *ictx = new ImageCtx("", id, snap_name, io_ctx, false); + TracepointProvider::initialize(get_cct(io_ctx)); + tracepoint(librbd, open_image_by_id_enter, ictx, ictx->id.c_str(), + ictx->snap_name.c_str(), ictx->read_only); + + if (image.ctx != nullptr) { + reinterpret_cast(image.ctx)->state->close(); + image.ctx = nullptr; + } + + int r = ictx->state->open(false); + if (r < 0) { + tracepoint(librbd, open_image_by_id_exit, r); + return r; + } + + image.ctx = (image_ctx_t) ictx; + tracepoint(librbd, open_image_by_id_exit, 0); + return 0; + } + int RBD::aio_open(IoCtx& io_ctx, Image& image, const char *name, const char *snap_name, RBD::AioCompletion *c) { @@ -313,6 +342,25 @@ namespace librbd { return 0; } + int RBD::aio_open_by_id(IoCtx& io_ctx, Image& image, const char *id, + const char *snap_name, RBD::AioCompletion *c) + { + ImageCtx *ictx = new ImageCtx("", id, snap_name, io_ctx, false); + TracepointProvider::initialize(get_cct(io_ctx)); + tracepoint(librbd, aio_open_image_by_id_enter, ictx, ictx->id.c_str(), + ictx->snap_name.c_str(), ictx->read_only, c->pc); + + if (image.ctx != nullptr) { + reinterpret_cast(image.ctx)->state->close( + new C_OpenAfterCloseComplete(ictx, get_aio_completion(c), &image.ctx)); + } else { + ictx->state->open(false, new C_OpenComplete(ictx, get_aio_completion(c), + &image.ctx)); + } + tracepoint(librbd, aio_open_image_by_id_exit, 0); + return 0; + } + int RBD::open_read_only(IoCtx& io_ctx, Image& image, const char *name, const char *snap_name) { @@ -336,6 +384,30 @@ namespace librbd { return 0; } + int RBD::open_by_id_read_only(IoCtx& io_ctx, Image& image, const char *id, + const char *snap_name) + { + ImageCtx *ictx = new ImageCtx("", id, snap_name, io_ctx, true); + TracepointProvider::initialize(get_cct(io_ctx)); + tracepoint(librbd, open_image_by_id_enter, ictx, ictx->id.c_str(), + ictx->snap_name.c_str(), ictx->read_only); + + if (image.ctx != nullptr) { + reinterpret_cast(image.ctx)->state->close(); + image.ctx = nullptr; + } + + int r = ictx->state->open(false); + if (r < 0) { + tracepoint(librbd, open_image_by_id_exit, r); + return r; + } + + image.ctx = (image_ctx_t) ictx; + tracepoint(librbd, open_image_by_id_exit, 0); + return 0; + } + int RBD::aio_open_read_only(IoCtx& io_ctx, Image& image, const char *name, const char *snap_name, RBD::AioCompletion *c) { @@ -354,6 +426,25 @@ namespace librbd { return 0; } + int RBD::aio_open_by_id_read_only(IoCtx& io_ctx, Image& image, const char *id, + const char *snap_name, RBD::AioCompletion *c) + { + ImageCtx *ictx = new ImageCtx("", id, snap_name, io_ctx, true); + TracepointProvider::initialize(get_cct(io_ctx)); + tracepoint(librbd, aio_open_image_by_id_enter, ictx, ictx->id.c_str(), + ictx->snap_name.c_str(), ictx->read_only, c->pc); + + if (image.ctx != nullptr) { + reinterpret_cast(image.ctx)->state->close( + new C_OpenAfterCloseComplete(ictx, get_aio_completion(c), &image.ctx)); + } else { + ictx->state->open(false, new C_OpenComplete(ictx, get_aio_completion(c), + &image.ctx)); + } + tracepoint(librbd, aio_open_image_by_id_exit, 0); + return 0; + } + int RBD::create(IoCtx& io_ctx, const char *name, uint64_t size, int *order) { TracepointProvider::initialize(get_cct(io_ctx)); @@ -2276,6 +2367,27 @@ extern "C" int rbd_open(rados_ioctx_t p, const char *name, rbd_image_t *image, return r; } +extern "C" int rbd_open_by_id(rados_ioctx_t p, const char *id, + rbd_image_t *image, const char *snap_name) +{ + librados::IoCtx io_ctx; + librados::IoCtx::from_rados_ioctx_t(p, io_ctx); + TracepointProvider::initialize(get_cct(io_ctx)); + librbd::ImageCtx *ictx = new librbd::ImageCtx("", id, snap_name, io_ctx, + false); + tracepoint(librbd, open_image_enter, ictx, ictx->name.c_str(), + ictx->id.c_str(), ictx->snap_name.c_str(), ictx->read_only); + + int r = ictx->state->open(false); + if (r < 0) { + delete ictx; + } else { + *image = (rbd_image_t)ictx; + } + tracepoint(librbd, open_image_exit, r); + return r; +} + extern "C" int rbd_aio_open(rados_ioctx_t p, const char *name, rbd_image_t *image, const char *snap_name, rbd_completion_t c) @@ -2292,6 +2404,24 @@ extern "C" int rbd_aio_open(rados_ioctx_t p, const char *name, return 0; } +extern "C" int rbd_aio_open_by_id(rados_ioctx_t p, const char *id, + rbd_image_t *image, const char *snap_name, + rbd_completion_t c) +{ + librados::IoCtx io_ctx; + librados::IoCtx::from_rados_ioctx_t(p, io_ctx); + TracepointProvider::initialize(get_cct(io_ctx)); + librbd::ImageCtx *ictx = new librbd::ImageCtx("", id, snap_name, io_ctx, + false); + librbd::RBD::AioCompletion *comp = (librbd::RBD::AioCompletion *)c; + tracepoint(librbd, aio_open_image_enter, ictx, ictx->name.c_str(), + ictx->id.c_str(), ictx->snap_name.c_str(), ictx->read_only, + comp->pc); + ictx->state->open(false, new C_OpenComplete(ictx, get_aio_completion(comp), image)); + tracepoint(librbd, aio_open_image_exit, 0); + return 0; +} + extern "C" int rbd_open_read_only(rados_ioctx_t p, const char *name, rbd_image_t *image, const char *snap_name) { @@ -2310,6 +2440,27 @@ extern "C" int rbd_open_read_only(rados_ioctx_t p, const char *name, return r; } +extern "C" int rbd_open_by_id_read_only(rados_ioctx_t p, const char *id, + rbd_image_t *image, const char *snap_name) +{ + librados::IoCtx io_ctx; + librados::IoCtx::from_rados_ioctx_t(p, io_ctx); + TracepointProvider::initialize(get_cct(io_ctx)); + librbd::ImageCtx *ictx = new librbd::ImageCtx("", id, snap_name, io_ctx, + true); + tracepoint(librbd, open_image_enter, ictx, ictx->name.c_str(), + ictx->id.c_str(), ictx->snap_name.c_str(), ictx->read_only); + + int r = ictx->state->open(false); + if (r < 0) { + delete ictx; + } else { + *image = (rbd_image_t)ictx; + } + tracepoint(librbd, open_image_exit, r); + return r; +} + extern "C" int rbd_aio_open_read_only(rados_ioctx_t p, const char *name, rbd_image_t *image, const char *snap_name, rbd_completion_t c) @@ -2327,6 +2478,25 @@ extern "C" int rbd_aio_open_read_only(rados_ioctx_t p, const char *name, return 0; } +extern "C" int rbd_aio_open_by_id_read_only(rados_ioctx_t p, const char *id, + rbd_image_t *image, + const char *snap_name, + rbd_completion_t c) +{ + librados::IoCtx io_ctx; + librados::IoCtx::from_rados_ioctx_t(p, io_ctx); + TracepointProvider::initialize(get_cct(io_ctx)); + librbd::ImageCtx *ictx = new librbd::ImageCtx("", id, snap_name, io_ctx, + true); + librbd::RBD::AioCompletion *comp = (librbd::RBD::AioCompletion *)c; + tracepoint(librbd, aio_open_image_enter, ictx, ictx->name.c_str(), + ictx->id.c_str(), ictx->snap_name.c_str(), ictx->read_only, comp->pc); + ictx->state->open(false, new C_OpenComplete(ictx, get_aio_completion(comp), + image)); + tracepoint(librbd, aio_open_image_exit, 0); + return 0; +} + extern "C" int rbd_close(rbd_image_t image) { librbd::ImageCtx *ictx = (librbd::ImageCtx *)image;