From: Jason Dillaman Date: Thu, 11 Jan 2018 01:56:33 +0000 (-0500) Subject: librbd: added missing C API version for rbd_snap_get_group_namespace X-Git-Tag: wip-pdonnell-testing-20180317.202121~588^2~11 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=2f838104d8b557bb50f721de0c1e3a6644e23011;p=ceph-ci.git librbd: added missing C API version for rbd_snap_get_group_namespace Signed-off-by: Jason Dillaman --- diff --git a/src/include/rbd/librbd.h b/src/include/rbd/librbd.h index e178002bada..59f61383d80 100644 --- a/src/include/rbd/librbd.h +++ b/src/include/rbd/librbd.h @@ -185,6 +185,12 @@ typedef enum { SNAP_NAMESPACE_TYPE_UNKNOWN = -1, } rbd_snap_namespace_type_t; +typedef struct { + int64_t group_pool; + char *group_name; + char *group_snap_name; +} rbd_snap_group_namespace_t; + typedef enum { RBD_LOCK_MODE_EXCLUSIVE = 0, RBD_LOCK_MODE_SHARED = 1, @@ -542,6 +548,13 @@ CEPH_RBD_API int rbd_snap_set(rbd_image_t image, const char *snapname); CEPH_RBD_API int rbd_snap_get_namespace_type(rbd_image_t image, uint64_t snap_id, rbd_snap_namespace_type_t *namespace_type); +CEPH_RBD_API int rbd_snap_get_namespace_type(rbd_image_t image, + uint64_t snap_id, + rbd_snap_namespace_type_t *namespace_type); +CEPH_RBD_API int rbd_snap_get_group_namespace(rbd_image_t image, + uint64_t snap_id, + rbd_snap_group_namespace_t *group_snap); +CEPH_RBD_API void rbd_snap_group_namespace_cleanup(rbd_snap_group_namespace_t *group_snap); CEPH_RBD_API int rbd_flatten(rbd_image_t image); @@ -952,9 +965,6 @@ CEPH_RBD_API int rbd_group_snap_list(rados_ioctx_t group_p, size_t *snaps_size); CEPH_RBD_API void rbd_group_snap_list_cleanup(rbd_group_snap_spec_t *snaps, size_t len); -CEPH_RBD_API int rbd_snap_get_namespace_type(rbd_image_t image, - uint64_t snap_id, - rbd_snap_namespace_type_t *namespace_type); #ifdef __cplusplus } diff --git a/src/include/rbd/librbd.hpp b/src/include/rbd/librbd.hpp index b814a23e980..a25cba05c00 100644 --- a/src/include/rbd/librbd.hpp +++ b/src/include/rbd/librbd.hpp @@ -34,20 +34,20 @@ namespace librbd { typedef void *completion_t; typedef void (*callback_t)(completion_t cb, void *arg); - typedef struct { - int64_t group_pool; - std::string group_name; - std::string group_snap_name; - } group_snap_t; - - typedef rbd_snap_namespace_type_t snap_namespace_type_t; - typedef struct { uint64_t id; uint64_t size; std::string name; } snap_info_t; + typedef rbd_snap_namespace_type_t snap_namespace_type_t; + + typedef struct { + int64_t group_pool; + std::string group_name; + std::string group_snap_name; + } snap_group_namespace_t; + typedef struct { std::string client; std::string cookie; @@ -380,7 +380,8 @@ public: int snap_get_timestamp(uint64_t snap_id, struct timespec *timestamp); int snap_get_namespace_type(uint64_t snap_id, snap_namespace_type_t *namespace_type); - int snap_get_group(uint64_t snap_id, group_snap_t *group_snap); + int snap_get_group_namespace(uint64_t snap_id, + snap_group_namespace_t *group_namespace); /* I/O */ ssize_t read(uint64_t ofs, size_t len, ceph::bufferlist& bl); diff --git a/src/librbd/api/Snapshot.cc b/src/librbd/api/Snapshot.cc index aebb8d69583..b29a5f74d92 100644 --- a/src/librbd/api/Snapshot.cc +++ b/src/librbd/api/Snapshot.cc @@ -21,10 +21,11 @@ class GetGroupVisitor : public boost::static_visitor { public: CephContext* cct; librados::IoCtx *image_ioctx; - group_snap_t group_snap; + snap_group_namespace_t *group_snap; - explicit GetGroupVisitor(CephContext* cct, librados::IoCtx *_image_ioctx) - : cct(cct), image_ioctx(_image_ioctx) {}; + explicit GetGroupVisitor(CephContext* cct, librados::IoCtx *_image_ioctx, + snap_group_namespace_t *group_snap) + : cct(cct), image_ioctx(_image_ioctx), group_snap(group_snap) {}; template inline int operator()(const T&) const { @@ -64,9 +65,9 @@ public: return r; } - group_snap.group_pool = group_ioctx.get_id(); - group_snap.group_name = group_name; - group_snap.group_snap_name = group_snapshot.name; + group_snap->group_pool = group_ioctx.get_id(); + group_snap->group_name = group_name; + group_snap->group_snap_name = group_snapshot.name; return 0; } }; @@ -74,19 +75,19 @@ public: } // anonymous namespace template -int Snapshot::get_group(I *ictx, uint64_t snap_id, - group_snap_t *group_snap) { +int Snapshot::get_group_namespace(I *ictx, uint64_t snap_id, + snap_group_namespace_t *group_snap) { const SnapInfo *snap_info; { RWLock::RLocker snap_locker(ictx->snap_lock); snap_info = ictx->get_snap_info(snap_id); if (snap_info) { - GetGroupVisitor ggv = GetGroupVisitor(ictx->cct, &ictx->data_ctx); + GetGroupVisitor ggv = GetGroupVisitor(ictx->cct, &ictx->data_ctx, + group_snap); int r = boost::apply_visitor(ggv, snap_info->snap_namespace); if (r < 0) { return r; } - *group_snap = ggv.group_snap; } } return 0; diff --git a/src/librbd/api/Snapshot.h b/src/librbd/api/Snapshot.h index 83b1b306659..6629b6973d2 100644 --- a/src/librbd/api/Snapshot.h +++ b/src/librbd/api/Snapshot.h @@ -15,8 +15,8 @@ namespace api { template struct Snapshot { - static int get_group(ImageCtxT *ictx, uint64_t snap_id, - group_snap_t *group_snap); + static int get_group_namespace(ImageCtxT *ictx, uint64_t snap_id, + snap_group_namespace_t *group_snap); static int get_namespace_type(ImageCtxT *ictx, uint64_t snap_id, snap_namespace_type_t *namespace_type); diff --git a/src/librbd/librbd.cc b/src/librbd/librbd.cc index 0097639fd5d..f87763caa5d 100644 --- a/src/librbd/librbd.cc +++ b/src/librbd/librbd.cc @@ -1570,12 +1570,14 @@ namespace librbd { return r; } - int Image::snap_get_group(uint64_t snap_id, - group_snap_t *group_snap) { + int Image::snap_get_group_namespace(uint64_t snap_id, + snap_group_namespace_t *group_snap) { ImageCtx *ictx = (ImageCtx *)ctx; - tracepoint(librbd, snap_get_group_enter, ictx, ictx->name.c_str()); - int r = librbd::api::Snapshot<>::get_group(ictx, snap_id, group_snap); - tracepoint(librbd, snap_get_group_exit, r); + tracepoint(librbd, snap_get_group_namespace_enter, ictx, + ictx->name.c_str()); + int r = librbd::api::Snapshot<>::get_group_namespace(ictx, snap_id, + group_snap); + tracepoint(librbd, snap_get_group_namespace_exit, r); return r; } @@ -4617,6 +4619,7 @@ extern "C" int rbd_group_snap_list(rados_ioctx_t group_p, const char *group_name int r = librbd::api::Group<>::snap_list(group_ioctx, group_name, &cpp_snaps); if (r == -ENOENT) { + *snaps_size = 0; tracepoint(librbd, group_snap_list_exit, 0); return 0; } @@ -4642,7 +4645,7 @@ extern "C" int rbd_group_snap_list(rados_ioctx_t group_p, const char *group_name } extern "C" void rbd_group_snap_list_cleanup(rbd_group_snap_spec_t *snaps, - size_t len) { + size_t len) { for (size_t i = 0; i < len; ++i) { free(snaps[i].name); } @@ -4659,6 +4662,31 @@ extern "C" int rbd_snap_get_namespace_type(rbd_image_t image, return r; } +extern "C" int rbd_snap_get_group_namespace(rbd_image_t image, uint64_t snap_id, + rbd_snap_group_namespace_t *group_snap) { + librbd::ImageCtx *ictx = (librbd::ImageCtx *)image; + tracepoint(librbd, snap_get_group_namespace_enter, ictx, + ictx->name.c_str()); + + librbd::snap_group_namespace_t group_namespace; + int r = librbd::api::Snapshot<>::get_group_namespace(ictx, snap_id, + &group_namespace); + if (r >= 0) { + group_snap->group_pool = group_namespace.group_pool; + group_snap->group_name = strdup(group_namespace.group_name.c_str()); + group_snap->group_snap_name = + strdup(group_namespace.group_snap_name.c_str()); + } + + tracepoint(librbd, snap_get_group_namespace_exit, r); + return r; +} + +extern "C" void rbd_snap_group_namespace_cleanup(rbd_snap_group_namespace_t *group_snap) { + free(group_snap->group_name); + free(group_snap->group_snap_name); +} + extern "C" int rbd_watchers_list(rbd_image_t image, rbd_image_watcher_t *watchers, size_t *max_watchers) { diff --git a/src/tools/rbd/action/Snap.cc b/src/tools/rbd/action/Snap.cc index 06e2d01c1af..4cb756d1d0a 100644 --- a/src/tools/rbd/action/Snap.cc +++ b/src/tools/rbd/action/Snap.cc @@ -74,10 +74,10 @@ int do_list_snaps(librbd::Image& image, Formatter *f, bool all_snaps, librados:: if(timestamp.tv_sec != 0) { time_t tt = timestamp.tv_sec; tt_str = ctime(&tt); - tt_str = tt_str.substr(0, tt_str.length() - 1); + tt_str = tt_str.substr(0, tt_str.length() - 1); } - librbd::group_snap_t group_snap; - int get_group_res = image.snap_get_group(s->id, &group_snap); + librbd::snap_group_namespace_t group_snap; + int get_group_res = image.snap_get_group_namespace(s->id, &group_snap); if (f) { f->open_object_section("snapshot"); diff --git a/src/tracing/librbd.tp b/src/tracing/librbd.tp index 5413f324bd6..0935b7c2b5d 100644 --- a/src/tracing/librbd.tp +++ b/src/tracing/librbd.tp @@ -2435,7 +2435,7 @@ TRACEPOINT_EVENT(librbd, snap_get_namespace_type_exit, ) ) -TRACEPOINT_EVENT(librbd, snap_get_group_enter, +TRACEPOINT_EVENT(librbd, snap_get_group_namespace_enter, TP_ARGS( void*, imagectx, const char*, name), @@ -2445,7 +2445,7 @@ TRACEPOINT_EVENT(librbd, snap_get_group_enter, ) ) -TRACEPOINT_EVENT(librbd, snap_get_group_exit, +TRACEPOINT_EVENT(librbd, snap_get_group_namespace_exit, TP_ARGS( int, retval), TP_FIELDS(