typedef struct {
char *global_id;
rbd_mirror_image_state_t state;
-} rbd_mirror_image_t;
+ bool primary;
+} rbd_mirror_image_info_t;
CEPH_RBD_API void rbd_version(int *major, int *minor, int *extra);
CEPH_RBD_API int rbd_mirror_image_promote(rbd_image_t image, bool force);
CEPH_RBD_API int rbd_mirror_image_demote(rbd_image_t image);
CEPH_RBD_API int rbd_mirror_image_resync(rbd_image_t image);
-CEPH_RBD_API int rbd_mirror_image_get(rbd_image_t image,
- rbd_mirror_image_t *mirror_image);
+CEPH_RBD_API int rbd_mirror_image_get_info(rbd_image_t image,
+ rbd_mirror_image_info_t *mirror_image_info,
+ size_t info_size);
#ifdef __cplusplus
}
typedef struct {
std::string global_id;
mirror_image_state_t state;
- } mirror_image_t;
+ bool primary;
+ } mirror_image_info_t;
typedef rbd_image_info_t image_info_t;
int mirror_image_promote(bool force);
int mirror_image_demote();
int mirror_image_resync();
- int mirror_image_get(mirror_image_t *mirror_image);
+ int mirror_image_get_info(mirror_image_info_t *mirror_image_info,
+ size_t info_size);
private:
friend class RBD;
return -EOPNOTSUPP;
}
- int mirror_image_get(ImageCtx *ictx, mirror_image_t *mirror_image) {
+ int mirror_image_get_info(ImageCtx *ictx, mirror_image_info_t *mirror_image_info,
+ size_t info_size) {
CephContext *cct = ictx->cct;
- ldout(cct, 20) << "mirror_image_get " << ictx << dendl;
+ ldout(cct, 20) << __func__ << ": ictx=" << ictx << dendl;
+ if (info_size < sizeof(mirror_image_info_t)) {
+ return -ERANGE;
+ }
cls::rbd::MirrorImage mirror_image_internal;
int r = cls_client::mirror_image_get(&ictx->md_ctx, ictx->id,
return r;
}
- mirror_image->global_id = mirror_image_internal.global_image_id;
+ mirror_image_info->global_id = mirror_image_internal.global_image_id;
if (r == -ENOENT) {
- mirror_image->state = RBD_MIRROR_IMAGE_DISABLED;
+ mirror_image_info->state = RBD_MIRROR_IMAGE_DISABLED;
} else {
- mirror_image->state =
+ mirror_image_info->state =
static_cast<rbd_mirror_image_state_t>(mirror_image_internal.state);
}
+ r = Journal<>::is_tag_owner(ictx, &mirror_image_info->primary);
+ if (r < 0) {
+ lderr(cct) << "failed to check tag ownership: "
+ << cpp_strerror(r) << dendl;
+ return r;
+ }
+
return 0;
}
int mirror_image_promote(ImageCtx *ictx, bool force);
int mirror_image_demote(ImageCtx *ictx);
int mirror_image_resync(ImageCtx *ictx);
- int mirror_image_get(ImageCtx *ictx, mirror_image_t *mirror_image);
+ int mirror_image_get_info(ImageCtx *ictx, mirror_image_info_t *mirror_image_info,
+ size_t info_size);
}
#endif
return librbd::mirror_image_resync(ictx);
}
- int Image::mirror_image_get(mirror_image_t *mirror_image) {
+ int Image::mirror_image_get_info(mirror_image_info_t *mirror_image_info,
+ size_t info_size) {
ImageCtx *ictx = (ImageCtx *)ctx;
- return librbd::mirror_image_get(ictx, mirror_image);
+ return librbd::mirror_image_get_info(ictx, mirror_image_info, info_size);
}
} // namespace librbd
return librbd::mirror_image_resync(ictx);
}
-extern "C" int rbd_mirror_image_get(rbd_image_t image,
- rbd_mirror_image_t *mirror_image)
+extern "C" int rbd_mirror_image_get_info(rbd_image_t image,
+ rbd_mirror_image_info_t *mirror_image_info,
+ size_t info_size)
{
librbd::ImageCtx *ictx = (librbd::ImageCtx *)image;
- librbd::mirror_image_t cpp_mirror_image;
- int r = librbd::mirror_image_get(ictx, &cpp_mirror_image);
+ librbd::mirror_image_info_t cpp_mirror_image;
+ int r = librbd::mirror_image_get_info(ictx, &cpp_mirror_image,
+ sizeof(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;
+ mirror_image_info->global_id = strdup(cpp_mirror_image.global_id.c_str());
+ mirror_image_info->state = cpp_mirror_image.state;
+ mirror_image_info->primary = cpp_mirror_image.primary;
return 0;
}