char *client_name;
} rbd_mirror_peer_t;
+typedef enum {
+ RBD_MIRROR_IMAGE_DISABLING = 0,
+ RBD_MIRROR_IMAGE_ENABLED = 1,
+ RBD_MIRROR_IMAGE_DISABLED = 2
+} rbd_mirror_image_state_t;
+
+typedef struct {
+ char *global_id;
+ rbd_mirror_image_state_t state;
+} rbd_mirror_image_t;
+
CEPH_RBD_API void rbd_version(int *major, int *minor, int *extra);
/* image options */
CEPH_RBD_API int rbd_mirror_image_enable(rbd_image_t image);
CEPH_RBD_API int rbd_mirror_image_disable(rbd_image_t image, bool force);
+CEPH_RBD_API int rbd_mirror_image_get(rbd_image_t image,
+ rbd_mirror_image_t *mirror_image);
#ifdef __cplusplus
}
std::string client_name;
} mirror_peer_t;
+ typedef rbd_mirror_image_state_t mirror_image_state_t;
+
+ typedef struct {
+ std::string global_id;
+ mirror_image_state_t state;
+ } mirror_image_t;
+
typedef rbd_image_info_t image_info_t;
class CEPH_RBD_API ProgressContext
int mirror_image_enable();
int mirror_image_disable(bool force);
+ int mirror_image_get(mirror_image_t *mirror_image);
private:
friend class RBD;
return 0;
}
+ int mirror_image_get(ImageCtx *ictx, mirror_image_t *mirror_image) {
+ CephContext *cct = ictx->cct;
+ ldout(cct, 20) << "mirror_image_get " << ictx << dendl;
+
+ cls::rbd::MirrorImage mirror_image_internal;
+ int r = cls_client::mirror_image_get(&ictx->md_ctx, ictx->id,
+ &mirror_image_internal);
+ if (r < 0 && r != -ENOENT) {
+ lderr(cct) << "failed to retrieve mirroring state: " << cpp_strerror(r)
+ << dendl;
+ return r;
+ }
+
+ mirror_image->global_id = mirror_image_internal.global_image_id;
+ if (r == -ENOENT) {
+ mirror_image->state = RBD_MIRROR_IMAGE_DISABLED;
+ } else {
+ mirror_image->state =
+ static_cast<rbd_mirror_image_state_t>(mirror_image_internal.state);
+ }
+
+ return 0;
+ }
+
int mirror_mode_get(IoCtx& io_ctx, rbd_mirror_mode_t *mirror_mode) {
CephContext *cct = reinterpret_cast<CephContext *>(io_ctx.cct());
ldout(cct, 20) << __func__ << dendl;
int mirror_image_enable(ImageCtx *ictx);
int mirror_image_disable(ImageCtx *ictx, bool force);
+ int mirror_image_get(ImageCtx *ictx, mirror_image_t *mirror_image);
}
#endif
return librbd::mirror_image_disable(ictx, force);
}
+ int Image::mirror_image_get(mirror_image_t *mirror_image) {
+ ImageCtx *ictx = (ImageCtx *)ctx;
+ return librbd::mirror_image_get(ictx, mirror_image);
+ }
+
} // namespace librbd
extern "C" void rbd_version(int *major, int *minor, int *extra)
return librbd::mirror_image_disable(ictx, force);
}
+extern "C" int rbd_mirror_image_get(rbd_image_t image,
+ rbd_mirror_image_t *mirror_image)
+{
+ librbd::ImageCtx *ictx = (librbd::ImageCtx *)image;
+
+ librbd::mirror_image_t cpp_mirror_image;
+ int r = librbd::mirror_image_get(ictx, &cpp_mirror_image);
+ if (r < 0) {
+ return r;
+ }
+
+ mirror_image->global_id = strdup(cpp_mirror_image.global_id.c_str());
+ mirror_image->state = cpp_mirror_image.state;
+
+ return 0;
+}
+
extern "C" int rbd_aio_is_complete(rbd_completion_t c)
{
librbd::RBD::AioCompletion *comp = (librbd::RBD::AioCompletion *)c;