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,
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);
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
}
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;
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);
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 <typename T>
inline int operator()(const T&) const {
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;
}
};
} // anonymous namespace
template <typename I>
-int Snapshot<I>::get_group(I *ictx, uint64_t snap_id,
- group_snap_t *group_snap) {
+int Snapshot<I>::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;
template <typename ImageCtxT = librbd::ImageCtx>
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);
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;
}
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;
}
}
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);
}
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) {
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");
)
)
-TRACEPOINT_EVENT(librbd, snap_get_group_enter,
+TRACEPOINT_EVENT(librbd, snap_get_group_namespace_enter,
TP_ARGS(
void*, imagectx,
const char*, name),
)
)
-TRACEPOINT_EVENT(librbd, snap_get_group_exit,
+TRACEPOINT_EVENT(librbd, snap_get_group_namespace_exit,
TP_ARGS(
int, retval),
TP_FIELDS(