int mirror_image_get(librados::IoCtx *ioctx, const std::string &image_id,
cls::rbd::MirrorImage *mirror_image) {
- bufferlist in_bl;
+ librados::ObjectReadOperation op;
+ mirror_image_get_start(&op, image_id);
+
bufferlist out_bl;
- ::encode(image_id, in_bl);
+ int r = ioctx->operate(RBD_MIRRORING, &op, &out_bl);
+ if (r < 0) {
+ return r;
+ }
- int r = ioctx->exec(RBD_MIRRORING, "rbd", "mirror_image_get", in_bl,
- out_bl);
+ bufferlist::iterator iter = out_bl.begin();
+ r = mirror_image_get_finish(&iter, mirror_image);
if (r < 0) {
- return r;
+ return r;
}
+ return 0;
+ }
+
+ void mirror_image_get_start(librados::ObjectReadOperation *op,
+ const std::string &image_id) {
+ bufferlist in_bl;
+ ::encode(image_id, in_bl);
+ op->exec("rbd", "mirror_image_get", in_bl);
+ }
+
+ int mirror_image_get_finish(bufferlist::iterator *iter,
+ cls::rbd::MirrorImage *mirror_image) {
try {
- bufferlist::iterator bl_it = out_bl.begin();
- ::decode(*mirror_image, bl_it);
+ ::decode(*mirror_image, *iter);
} catch (const buffer::error &err) {
return -EBADMSG;
}
std::string *image_id);
int mirror_image_get(librados::IoCtx *ioctx, const std::string &image_id,
cls::rbd::MirrorImage *mirror_image);
+ void mirror_image_get_start(librados::ObjectReadOperation *op,
+ const std::string &image_id);
+ int mirror_image_get_finish(bufferlist::iterator *iter,
+ cls::rbd::MirrorImage *mirror_image);
int mirror_image_set(librados::IoCtx *ioctx, const std::string &image_id,
const cls::rbd::MirrorImage &mirror_image);
int mirror_image_remove(librados::IoCtx *ioctx,