-// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// -*- mode:C; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
// vim: ts=8 sw=2 smarttab
/*
* Ceph - scalable distributed file system
typedef struct {
char *name;
int64_t pool;
-} rbd_group_image_spec_t;
-
-typedef struct {
- rbd_group_image_spec_t spec;
rbd_group_image_state_t state;
-} rbd_group_image_status_t;
+} rbd_group_image_info_t;
typedef struct {
char *name;
int64_t pool;
-} rbd_group_spec_t;
+} rbd_group_info_t;
typedef enum {
RBD_GROUP_SNAP_STATE_INCOMPLETE,
typedef struct {
char *name;
rbd_group_snap_state_t state;
-} rbd_group_snap_spec_t;
+} rbd_group_snap_info_t;
typedef enum {
RBD_SNAP_NAMESPACE_TYPE_USER = 0,
CEPH_RBD_API int rbd_get_features(rbd_image_t image, uint64_t *features);
CEPH_RBD_API int rbd_update_features(rbd_image_t image, uint64_t features,
uint8_t enabled);
+CEPH_RBD_API int rbd_get_op_features(rbd_image_t image, uint64_t *op_features);
CEPH_RBD_API int rbd_get_stripe_unit(rbd_image_t image, uint64_t *stripe_unit);
CEPH_RBD_API int rbd_get_stripe_count(rbd_image_t image,
uint64_t *stripe_count);
char *parent_snapname,
size_t psnapnamelen);
CEPH_RBD_API int rbd_get_flags(rbd_image_t image, uint64_t *flags);
+CEPH_RBD_API int rbd_get_group(rbd_image_t image, rbd_group_info_t *group_info,
+ size_t group_info_size);
CEPH_RBD_API int rbd_set_image_notification(rbd_image_t image, int fd, int type);
/* exclusive lock feature */
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);
+ rbd_snap_group_namespace_t *group_snap,
+ size_t group_snap_size);
+CEPH_RBD_API int rbd_snap_group_namespace_cleanup(rbd_snap_group_namespace_t *group_snap,
+ size_t group_snap_size);
CEPH_RBD_API int rbd_flatten(rbd_image_t image);
CEPH_RBD_API int rbd_group_create(rados_ioctx_t p, const char *name);
CEPH_RBD_API int rbd_group_remove(rados_ioctx_t p, const char *name);
CEPH_RBD_API int rbd_group_list(rados_ioctx_t p, char *names, size_t *size);
+CEPH_RBD_API int rbd_group_info_cleanup(rbd_group_info_t *group_info,
+ size_t group_info_size);
/**
* Register an image metadata change watcher.
CEPH_RBD_API void rbd_watchers_list_cleanup(rbd_image_watcher_t *watchers,
size_t num_watchers);
-CEPH_RBD_API int rbd_group_image_add(
- rados_ioctx_t group_p, const char *group_name,
- rados_ioctx_t image_p, const char *image_name);
-CEPH_RBD_API int rbd_group_image_remove(
- rados_ioctx_t group_p, const char *group_name,
- rados_ioctx_t image_p, const char *image_name);
-CEPH_RBD_API int rbd_group_image_remove_by_id(
- rados_ioctx_t group_p, const char *group_name,
- rados_ioctx_t image_p, const char *image_id);
-CEPH_RBD_API int rbd_group_image_list(
- rados_ioctx_t group_p, const char *group_name,
- rbd_group_image_status_t *images,
- size_t *image_size);
-CEPH_RBD_API int rbd_image_get_group(rados_ioctx_t image_p,
- const char *image_name,
- rbd_group_spec_t *group_spec);
-CEPH_RBD_API void rbd_group_spec_cleanup(rbd_group_spec_t *group_spec);
-CEPH_RBD_API void rbd_group_image_status_cleanup(rbd_group_image_status_t *image);
-CEPH_RBD_API void rbd_group_image_status_list_cleanup(rbd_group_image_status_t *images,
- size_t len);
+CEPH_RBD_API int rbd_group_image_add(rados_ioctx_t group_p,
+ const char *group_name,
+ rados_ioctx_t image_p,
+ const char *image_name);
+CEPH_RBD_API int rbd_group_image_remove(rados_ioctx_t group_p,
+ const char *group_name,
+ rados_ioctx_t image_p,
+ const char *image_name);
+CEPH_RBD_API int rbd_group_image_remove_by_id(rados_ioctx_t group_p,
+ const char *group_name,
+ rados_ioctx_t image_p,
+ const char *image_id);
+CEPH_RBD_API int rbd_group_image_list(rados_ioctx_t group_p,
+ const char *group_name,
+ rbd_group_image_info_t *images,
+ size_t group_image_info_size,
+ size_t *num_entries);
+CEPH_RBD_API int rbd_group_image_list_cleanup(rbd_group_image_info_t *images,
+ size_t group_image_info_size,
+ size_t num_entries);
+
CEPH_RBD_API int rbd_group_snap_create(rados_ioctx_t group_p,
const char *group_name,
const char *snap_name);
const char *new_snap_name);
CEPH_RBD_API int rbd_group_snap_list(rados_ioctx_t group_p,
const char *group_name,
- rbd_group_snap_spec_t *snaps,
- size_t *snaps_size);
-CEPH_RBD_API void rbd_group_snap_list_cleanup(rbd_group_snap_spec_t *snaps,
- size_t len);
+ rbd_group_snap_info_t *snaps,
+ size_t group_snap_info_size,
+ size_t *num_entries);
+CEPH_RBD_API int rbd_group_snap_list_cleanup(rbd_group_snap_info_t *snaps,
+ size_t group_snap_info_size,
+ size_t num_entries);
#ifdef __cplusplus
}
}
};
-void group_image_status_cpp_to_c(const librbd::group_image_status_t &cpp_status,
- rbd_group_image_status_t *c_status) {
- c_status->spec.name = strdup(cpp_status.name.c_str());
- c_status->spec.pool = cpp_status.pool;
- c_status->state = cpp_status.state;
+void group_image_status_cpp_to_c(const librbd::group_image_info_t &cpp_info,
+ rbd_group_image_info_t *c_info) {
+ c_info->name = strdup(cpp_info.name.c_str());
+ c_info->pool = cpp_info.pool;
+ c_info->state = cpp_info.state;
}
-void group_spec_cpp_to_c(const librbd::group_spec_t &cpp_spec,
- rbd_group_spec_t *c_spec) {
- c_spec->name = strdup(cpp_spec.name.c_str());
- c_spec->pool = cpp_spec.pool;
+void group_info_cpp_to_c(const librbd::group_info_t &cpp_info,
+ rbd_group_info_t *c_info) {
+ c_info->name = strdup(cpp_info.name.c_str());
+ c_info->pool = cpp_info.pool;
}
-void group_snap_spec_cpp_to_c(const librbd::group_snap_spec_t &cpp_spec,
- rbd_group_snap_spec_t *c_spec) {
- c_spec->name = strdup(cpp_spec.name.c_str());
- c_spec->state = cpp_spec.state;
+void group_snap_info_cpp_to_c(const librbd::group_snap_info_t &cpp_info,
+ rbd_group_snap_info_t *c_info) {
+ c_info->name = strdup(cpp_info.name.c_str());
+ c_info->state = cpp_info.state;
}
void mirror_image_info_cpp_to_c(const librbd::mirror_image_info_t &cpp_info,
IoCtx& image_ioctx, const char *image_name)
{
TracepointProvider::initialize<tracepoint_traits>(get_cct(group_ioctx));
- tracepoint(librbd, group_image_add_enter, group_ioctx.get_pool_name().c_str(),
- group_ioctx.get_id(), group_name, image_ioctx.get_pool_name().c_str(),
- image_ioctx.get_id(), image_name);
+ tracepoint(librbd, group_image_add_enter,
+ group_ioctx.get_pool_name().c_str(),
+ group_ioctx.get_id(), group_name,
+ image_ioctx.get_pool_name().c_str(),
+ image_ioctx.get_id(), image_name);
int r = librbd::api::Group<>::image_add(group_ioctx, group_name,
image_ioctx, image_name);
tracepoint(librbd, group_image_add_exit, r);
IoCtx& image_ioctx, const char *image_name)
{
TracepointProvider::initialize<tracepoint_traits>(get_cct(group_ioctx));
- tracepoint(librbd, group_image_remove_enter, group_ioctx.get_pool_name().c_str(),
- group_ioctx.get_id(), group_name, image_ioctx.get_pool_name().c_str(),
- image_ioctx.get_id(), image_name);
+ tracepoint(librbd, group_image_remove_enter,
+ group_ioctx.get_pool_name().c_str(),
+ group_ioctx.get_id(), group_name,
+ image_ioctx.get_pool_name().c_str(),
+ image_ioctx.get_id(), image_name);
int r = librbd::api::Group<>::image_remove(group_ioctx, group_name,
image_ioctx, image_name);
tracepoint(librbd, group_image_remove_exit, r);
}
int RBD::group_image_list(IoCtx& group_ioctx, const char *group_name,
- std::vector<group_image_status_t> *images)
+ std::vector<group_image_info_t> *images,
+ size_t group_image_info_size)
{
TracepointProvider::initialize<tracepoint_traits>(get_cct(group_ioctx));
- tracepoint(librbd, group_image_list_enter, group_ioctx.get_pool_name().c_str(),
+ tracepoint(librbd, group_image_list_enter,
+ group_ioctx.get_pool_name().c_str(),
group_ioctx.get_id(), group_name);
+
+ if (group_image_info_size != sizeof(group_image_info_t)) {
+ tracepoint(librbd, group_image_list_exit, -ERANGE);
+ return -ERANGE;
+ }
+
int r = librbd::api::Group<>::image_list(group_ioctx, group_name, images);
tracepoint(librbd, group_image_list_exit, r);
return r;
int RBD::group_snap_create(IoCtx& group_ioctx, const char *group_name,
const char *snap_name) {
TracepointProvider::initialize<tracepoint_traits>(get_cct(group_ioctx));
- tracepoint(librbd, group_snap_create_enter, group_ioctx.get_pool_name().c_str(),
+ tracepoint(librbd, group_snap_create_enter,
+ group_ioctx.get_pool_name().c_str(),
group_ioctx.get_id(), group_name, snap_name);
- int r = librbd::api::Group<>::snap_create(group_ioctx, group_name, snap_name);
+ int r = librbd::api::Group<>::snap_create(group_ioctx, group_name,
+ snap_name);
tracepoint(librbd, group_snap_create_exit, r);
return r;
}
int RBD::group_snap_remove(IoCtx& group_ioctx, const char *group_name,
const char *snap_name) {
TracepointProvider::initialize<tracepoint_traits>(get_cct(group_ioctx));
- tracepoint(librbd, group_snap_remove_enter, group_ioctx.get_pool_name().c_str(),
+ tracepoint(librbd, group_snap_remove_enter,
+ group_ioctx.get_pool_name().c_str(),
group_ioctx.get_id(), group_name, snap_name);
- int r = librbd::api::Group<>::snap_remove(group_ioctx, group_name, snap_name);
+ int r = librbd::api::Group<>::snap_remove(group_ioctx, group_name,
+ snap_name);
tracepoint(librbd, group_snap_remove_exit, r);
return r;
}
int RBD::group_snap_list(IoCtx& group_ioctx, const char *group_name,
- std::vector<group_snap_spec_t> *snaps)
+ std::vector<group_snap_info_t> *snaps,
+ size_t group_snap_info_size)
{
TracepointProvider::initialize<tracepoint_traits>(get_cct(group_ioctx));
- tracepoint(librbd, group_snap_list_enter, group_ioctx.get_pool_name().c_str(),
+ tracepoint(librbd, group_snap_list_enter,
+ group_ioctx.get_pool_name().c_str(),
group_ioctx.get_id(), group_name);
+
+ if (group_snap_info_size != sizeof(group_snap_info_t)) {
+ tracepoint(librbd, group_snap_list_exit, -ERANGE);
+ return -ERANGE;
+ }
+
int r = librbd::api::Group<>::snap_list(group_ioctx, group_name, snaps);
tracepoint(librbd, group_snap_list_exit, r);
return r;
return r;
}
- int Image::get_group(group_spec_t *group_spec)
+ int Image::get_group(group_info_t *group_info, size_t group_info_size)
{
ImageCtx *ictx = (ImageCtx *)ctx;
tracepoint(librbd, image_get_group_enter, ictx->name.c_str());
- int r = librbd::api::Group<>::image_get_group(ictx, group_spec);
+
+ if (group_info_size != sizeof(group_info_t)) {
+ tracepoint(librbd, image_get_group_exit, -ERANGE);
+ return -ERANGE;
+ }
+
+ int r = librbd::api::Group<>::image_get_group(ictx, group_info);
tracepoint(librbd, image_get_group_exit, r);
return r;
}
return r;
}
+ int Image::get_op_features(uint64_t *op_features)
+ {
+ ImageCtx *ictx = (ImageCtx *)ctx;
+ return librbd::api::Image<>::get_op_features(ictx, op_features);
+ }
+
uint64_t Image::get_stripe_unit() const
{
ImageCtx *ictx = (ImageCtx *)ctx;
}
int Image::snap_get_group_namespace(uint64_t snap_id,
- snap_group_namespace_t *group_snap) {
+ snap_group_namespace_t *group_snap,
+ size_t group_snap_size) {
ImageCtx *ictx = (ImageCtx *)ctx;
tracepoint(librbd, snap_get_group_namespace_enter, ictx,
ictx->name.c_str());
+
+ if (group_snap_size != sizeof(snap_group_namespace_t)) {
+ tracepoint(librbd, snap_get_group_namespace_exit, -ERANGE);
+ return -ERANGE;
+ }
+
int r = librbd::api::Snapshot<>::get_group_namespace(ictx, snap_id,
group_snap);
tracepoint(librbd, snap_get_group_namespace_exit, r);
return r;
}
+extern "C" int rbd_get_op_features(rbd_image_t image, uint64_t *op_features)
+{
+ librbd::ImageCtx *ictx = (librbd::ImageCtx *)image;
+ return librbd::api::Image<>::get_op_features(ictx, op_features);
+}
+
extern "C" int rbd_get_stripe_unit(rbd_image_t image, uint64_t *stripe_unit)
{
librbd::ImageCtx *ictx = (librbd::ImageCtx *)image;
return r;
}
+extern "C" int rbd_get_group(rbd_image_t image, rbd_group_info_t *group_info,
+ size_t group_info_size)
+{
+ librbd::ImageCtx *ictx = (librbd::ImageCtx *)image;
+ tracepoint(librbd, image_get_group_enter, ictx->name.c_str());
+
+ if (group_info_size != sizeof(rbd_group_info_t)) {
+ tracepoint(librbd, image_get_group_exit, -ERANGE);
+ return -ERANGE;
+ }
+
+ librbd::group_info_t cpp_group_info;
+ int r = librbd::api::Group<>::image_get_group(ictx, &cpp_group_info);
+ if (r >= 0) {
+ group_info_cpp_to_c(cpp_group_info, group_info);
+ } else {
+ group_info->name = NULL;
+ }
+
+ tracepoint(librbd, image_get_group_exit, r);
+ return r;
+}
+
extern "C" int rbd_set_image_notification(rbd_image_t image, int fd, int type)
{
librbd::ImageCtx *ictx = (librbd::ImageCtx *)image;
return (int)expected_size;
}
-extern "C" int rbd_group_image_add(
- rados_ioctx_t group_p, const char *group_name,
- rados_ioctx_t image_p, const char *image_name)
+extern "C" int rbd_group_image_add(rados_ioctx_t group_p,
+ const char *group_name,
+ rados_ioctx_t image_p,
+ const char *image_name)
{
librados::IoCtx group_ioctx;
librados::IoCtx image_ioctx;
return r;
}
-extern "C" int rbd_group_image_remove(
- rados_ioctx_t group_p, const char *group_name,
- rados_ioctx_t image_p, const char *image_name)
+extern "C" int rbd_group_image_remove(rados_ioctx_t group_p,
+ const char *group_name,
+ rados_ioctx_t image_p,
+ const char *image_name)
{
librados::IoCtx group_ioctx;
librados::IoCtx image_ioctx;
extern "C" int rbd_group_image_list(rados_ioctx_t group_p,
const char *group_name,
- rbd_group_image_status_t *images,
+ rbd_group_image_info_t *images,
+ size_t group_image_info_size,
size_t *image_size)
{
librados::IoCtx group_ioctx;
librados::IoCtx::from_rados_ioctx_t(group_p, group_ioctx);
TracepointProvider::initialize<tracepoint_traits>(get_cct(group_ioctx));
- tracepoint(librbd, group_image_list_enter, group_ioctx.get_pool_name().c_str(),
+ tracepoint(librbd, group_image_list_enter,
+ group_ioctx.get_pool_name().c_str(),
group_ioctx.get_id(), group_name);
- std::vector<librbd::group_image_status_t> cpp_images;
+ if (group_image_info_size != sizeof(rbd_group_image_info_t)) {
+ *image_size = 0;
+ tracepoint(librbd, group_image_list_exit, -ERANGE);
+ return -ERANGE;
+ }
+
+ std::vector<librbd::group_image_info_t> cpp_images;
int r = librbd::api::Group<>::image_list(group_ioctx, group_name,
&cpp_images);
return r;
}
-extern "C" int rbd_image_get_group(rados_ioctx_t image_p,
- const char *image_name,
- rbd_group_spec_t *c_group_spec)
-{
- librados::IoCtx io_ctx;
- librados::IoCtx::from_rados_ioctx_t(image_p, io_ctx);
-
- librbd::ImageCtx *ictx = new librbd::ImageCtx(image_name, "", "", io_ctx, false);
- int r = ictx->state->open(false);
- if (r < 0) {
- tracepoint(librbd, open_image_exit, r);
- return r;
+extern "C" int rbd_group_info_cleanup(rbd_group_info_t *group_info,
+ size_t group_info_size) {
+ if (group_info_size != sizeof(rbd_group_info_t)) {
+ return -ERANGE;
}
- tracepoint(librbd, image_get_group_enter, ictx->name.c_str());
- librbd::group_spec_t group_spec;
- r = librbd::api::Group<>::image_get_group(ictx, &group_spec);
- group_spec_cpp_to_c(group_spec, c_group_spec);
- tracepoint(librbd, image_get_group_exit, r);
- ictx->state->close();
- return r;
-}
-
-extern "C" void rbd_group_spec_cleanup(rbd_group_spec_t *group_spec) {
- free(group_spec->name);
+ free(group_info->name);
+ return 0;
}
-extern "C" void rbd_group_image_status_cleanup(
- rbd_group_image_status_t *image) {
- free(image->spec.name);
-}
+extern "C" int rbd_group_image_list_cleanup(rbd_group_image_info_t *images,
+ size_t group_image_info_size,
+ size_t len) {
+ if (group_image_info_size != sizeof(rbd_group_image_info_t)) {
+ return -ERANGE;
+ }
-extern "C" void rbd_group_image_status_list_cleanup(
- rbd_group_image_status_t *images,
- size_t len) {
for (size_t i = 0; i < len; ++i) {
- rbd_group_image_status_cleanup(&images[i]);
+ free(images[i].name);
}
+ return 0;
}
-extern "C" int rbd_group_snap_create(rados_ioctx_t group_p, const char *group_name,
- const char *snap_name)
+extern "C" int rbd_group_snap_create(rados_ioctx_t group_p,
+ const char *group_name,
+ const char *snap_name)
{
librados::IoCtx group_ioctx;
librados::IoCtx::from_rados_ioctx_t(group_p, group_ioctx);
TracepointProvider::initialize<tracepoint_traits>(get_cct(group_ioctx));
- tracepoint(librbd, group_snap_create_enter, group_ioctx.get_pool_name().c_str(),
+ tracepoint(librbd, group_snap_create_enter,
+ group_ioctx.get_pool_name().c_str(),
group_ioctx.get_id(), group_name, snap_name);
int r = librbd::api::Group<>::snap_create(group_ioctx, group_name, snap_name);
return r;
}
-extern "C" int rbd_group_snap_remove(rados_ioctx_t group_p, const char *group_name,
- const char *snap_name)
+extern "C" int rbd_group_snap_remove(rados_ioctx_t group_p,
+ const char *group_name,
+ const char *snap_name)
{
librados::IoCtx group_ioctx;
librados::IoCtx::from_rados_ioctx_t(group_p, group_ioctx);
TracepointProvider::initialize<tracepoint_traits>(get_cct(group_ioctx));
- tracepoint(librbd, group_snap_remove_enter, group_ioctx.get_pool_name().c_str(),
+ tracepoint(librbd, group_snap_remove_enter,
+ group_ioctx.get_pool_name().c_str(),
group_ioctx.get_id(), group_name, snap_name);
int r = librbd::api::Group<>::snap_remove(group_ioctx, group_name, snap_name);
return r;
}
-extern "C" int rbd_group_snap_list(rados_ioctx_t group_p, const char *group_name,
- rbd_group_snap_spec_t *snaps, size_t *snaps_size)
+extern "C" int rbd_group_snap_list(rados_ioctx_t group_p,
+ const char *group_name,
+ rbd_group_snap_info_t *snaps,
+ size_t group_snap_info_size,
+ size_t *snaps_size)
{
librados::IoCtx group_ioctx;
librados::IoCtx::from_rados_ioctx_t(group_p, group_ioctx);
tracepoint(librbd, group_snap_list_enter, group_ioctx.get_pool_name().c_str(),
group_ioctx.get_id(), group_name);
- std::vector<librbd::group_snap_spec_t> cpp_snaps;
+ if (group_snap_info_size != sizeof(rbd_group_snap_info_t)) {
+ *snaps_size = 0;
+ tracepoint(librbd, group_snap_list_exit, -ERANGE);
+ return -ERANGE;
+ }
+
+ std::vector<librbd::group_snap_info_t> cpp_snaps;
int r = librbd::api::Group<>::snap_list(group_ioctx, group_name, &cpp_snaps);
if (r == -ENOENT) {
}
for (size_t i = 0; i < cpp_snaps.size(); ++i) {
- group_snap_spec_cpp_to_c(cpp_snaps[i], &snaps[i]);
+ group_snap_info_cpp_to_c(cpp_snaps[i], &snaps[i]);
}
*snaps_size = cpp_snaps.size();
return 0;
}
-extern "C" void rbd_group_snap_list_cleanup(rbd_group_snap_spec_t *snaps,
- size_t len) {
+extern "C" int rbd_group_snap_list_cleanup(rbd_group_snap_info_t *snaps,
+ size_t group_snap_info_size,
+ size_t len) {
+ if (group_snap_info_size != sizeof(rbd_group_snap_info_t)) {
+ return -ERANGE;
+ }
+
for (size_t i = 0; i < len; ++i) {
free(snaps[i].name);
}
+ return 0;
}
extern "C" int rbd_snap_get_namespace_type(rbd_image_t image,
}
extern "C" int rbd_snap_get_group_namespace(rbd_image_t image, uint64_t snap_id,
- rbd_snap_group_namespace_t *group_snap) {
+ rbd_snap_group_namespace_t *group_snap,
+ size_t snap_group_namespace_size) {
librbd::ImageCtx *ictx = (librbd::ImageCtx *)image;
tracepoint(librbd, snap_get_group_namespace_enter, ictx,
ictx->name.c_str());
+ if (snap_group_namespace_size != sizeof(rbd_snap_group_namespace_t)) {
+ tracepoint(librbd, snap_get_group_namespace_exit, -ERANGE);
+ return -ERANGE;
+ }
+
librbd::snap_group_namespace_t group_namespace;
int r = librbd::api::Snapshot<>::get_group_namespace(ictx, snap_id,
&group_namespace);
return r;
}
-extern "C" void rbd_snap_group_namespace_cleanup(rbd_snap_group_namespace_t *group_snap) {
+extern "C" int rbd_snap_group_namespace_cleanup(rbd_snap_group_namespace_t *group_snap,
+ size_t snap_group_namespace_size) {
+ if (snap_group_namespace_size != sizeof(rbd_snap_group_namespace_t)) {
+ tracepoint(librbd, snap_get_group_namespace_exit, -ERANGE);
+ return -ERANGE;
+ }
+
free(group_snap->group_name);
free(group_snap->group_snap_name);
+ return 0;
}
extern "C" int rbd_watchers_list(rbd_image_t image,
TEST_F(TestGroup, add_image)
{
+ REQUIRE_FORMAT_V2();
+
librados::IoCtx ioctx;
ASSERT_EQ(0, _rados.ioctx_create(_pool_name.c_str(), ioctx));
const char *group_name = "mycg";
- const char *image_name = "myimage";
librbd::RBD rbd;
ASSERT_EQ(0, rbd.group_create(ioctx, group_name));
- int order = 14;
- ASSERT_EQ(0, rbd.create2(ioctx, image_name, 65535,
- RBD_FEATURE_LAYERING, &order)); // Specified features make image of new format.
- ASSERT_EQ(0, rbd.group_image_add(ioctx, group_name, ioctx, image_name));
+ librbd::Image image;
+ ASSERT_EQ(0, rbd.open(ioctx, image, m_image_name.c_str(), NULL));
+
+ uint64_t features;
+ ASSERT_EQ(0, image.features(&features));
+ ASSERT_TRUE((features & RBD_FEATURE_OPERATIONS) == 0ULL);
+
+ uint64_t op_features;
+ ASSERT_EQ(0, image.get_op_features(&op_features));
+ ASSERT_TRUE((op_features & RBD_OPERATION_FEATURE_GROUP) == 0ULL);
+
+ ASSERT_EQ(0, rbd.group_image_add(ioctx, group_name, ioctx,
+ m_image_name.c_str()));
- vector<librbd::group_image_status_t> images;
- ASSERT_EQ(0, rbd.group_image_list(ioctx, group_name, &images));
+ ASSERT_EQ(0, image.features(&features));
+ ASSERT_TRUE((features & RBD_FEATURE_OPERATIONS) ==
+ RBD_FEATURE_OPERATIONS);
+ ASSERT_EQ(0, image.get_op_features(&op_features));
+ ASSERT_TRUE((op_features & RBD_OPERATION_FEATURE_GROUP) ==
+ RBD_OPERATION_FEATURE_GROUP);
+
+ vector<librbd::group_image_info_t> images;
+ ASSERT_EQ(0, rbd.group_image_list(ioctx, group_name, &images,
+ sizeof(librbd::group_image_info_t)));
ASSERT_EQ(1U, images.size());
- ASSERT_EQ("myimage", images[0].name);
+ ASSERT_EQ(m_image_name, images[0].name);
ASSERT_EQ(ioctx.get_id(), images[0].pool);
- ASSERT_EQ(0, rbd.group_image_remove(ioctx, group_name, ioctx, image_name));
+ ASSERT_EQ(0, rbd.group_image_remove(ioctx, group_name, ioctx,
+ m_image_name.c_str()));
+
+ ASSERT_EQ(0, image.features(&features));
+ ASSERT_TRUE((features & RBD_FEATURE_OPERATIONS) == 0ULL);
+ ASSERT_EQ(0, image.get_op_features(&op_features));
+ ASSERT_TRUE((op_features & RBD_OPERATION_FEATURE_GROUP) == 0ULL);
images.clear();
- ASSERT_EQ(0, rbd.group_image_list(ioctx, group_name, &images));
+ ASSERT_EQ(0, rbd.group_image_list(ioctx, group_name, &images,
+ sizeof(librbd::group_image_info_t)));
ASSERT_EQ(0U, images.size());
}
TEST_F(TestGroup, add_snapshot)
{
+ REQUIRE_FORMAT_V2();
+
librados::IoCtx ioctx;
ASSERT_EQ(0, _rados.ioctx_create(_pool_name.c_str(), ioctx));
const char *group_name = "snap_group";
- const char *image_name = "snap_image";
const char *snap_name = "snap_snapshot";
librbd::RBD rbd;
ASSERT_EQ(0, rbd.group_create(ioctx, group_name));
- int order = 14;
- ASSERT_EQ(0, rbd.create2(ioctx, image_name, 65535,
- RBD_FEATURE_LAYERING, &order)); // Specified features make image of new format.
-
- ASSERT_EQ(0, rbd.group_image_add(ioctx, group_name, ioctx, image_name));
+ ASSERT_EQ(0, rbd.group_image_add(ioctx, group_name, ioctx,
+ m_image_name.c_str()));
ASSERT_EQ(0, rbd.group_snap_create(ioctx, group_name, snap_name));
- std::vector<librbd::group_snap_spec_t> snaps;
- ASSERT_EQ(0, rbd.group_snap_list(ioctx, group_name, &snaps));
+ std::vector<librbd::group_snap_info_t> snaps;
+ ASSERT_EQ(0, rbd.group_snap_list(ioctx, group_name, &snaps,
+ sizeof(librbd::group_snap_info_t)));
ASSERT_EQ(1U, snaps.size());
ASSERT_EQ(snap_name, snaps[0].name);
ASSERT_EQ(0, rbd.group_snap_remove(ioctx, group_name, snap_name));
snaps.clear();
- ASSERT_EQ(0, rbd.group_snap_list(ioctx, group_name, &snaps));
+ ASSERT_EQ(0, rbd.group_snap_list(ioctx, group_name, &snaps,
+ sizeof(librbd::group_snap_info_t)));
ASSERT_EQ(0U, snaps.size());
}