From: Mykola Golub Date: Sat, 5 Nov 2016 20:44:33 +0000 (+0200) Subject: cls/rbd: add get_all_features on client side X-Git-Tag: v11.1.0~293^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=84f6d5c109911923c25414de639308921983e438;p=ceph.git cls/rbd: add get_all_features on client side Signed-off-by: Mykola Golub --- diff --git a/src/cls/rbd/cls_rbd_client.cc b/src/cls/rbd/cls_rbd_client.cc index 9cbbef31f08..c0f3da77858 100644 --- a/src/cls/rbd/cls_rbd_client.cc +++ b/src/cls/rbd/cls_rbd_client.cc @@ -712,6 +712,36 @@ namespace librbd { return old_snapshot_list_finish(&it, names, sizes, snapc); } + void get_all_features_start(librados::ObjectReadOperation *op) { + bufferlist in; + op->exec("rbd", "get_all_features", in); + } + + int get_all_features_finish(bufferlist::iterator *it, + uint64_t *all_features) { + try { + ::decode(*all_features, *it); + } catch (const buffer::error &err) { + return -EBADMSG; + } + return 0; + } + + int get_all_features(librados::IoCtx *ioctx, const std::string &oid, + uint64_t *all_features) { + librados::ObjectReadOperation op; + get_all_features_start(&op); + + bufferlist out_bl; + int r = ioctx->operate(oid, &op, &out_bl); + if (r < 0) { + return r; + } + + bufferlist::iterator it = out_bl.begin(); + return get_all_features_finish(&it, all_features); + } + int copyup(librados::IoCtx *ioctx, const std::string &oid, bufferlist data) { bufferlist out; diff --git a/src/cls/rbd/cls_rbd_client.h b/src/cls/rbd/cls_rbd_client.h index 0b74a25394f..52f259d25c6 100644 --- a/src/cls/rbd/cls_rbd_client.h +++ b/src/cls/rbd/cls_rbd_client.h @@ -135,6 +135,12 @@ namespace librbd { const std::vector &ids, std::vector *namespaces); + void get_all_features_start(librados::ObjectReadOperation *op); + int get_all_features_finish(bufferlist::iterator *it, + uint64_t *all_features); + int get_all_features(librados::IoCtx *ioctx, const std::string &oid, + uint64_t *all_features); + int copyup(librados::IoCtx *ioctx, const std::string &oid, bufferlist data); int get_protection_status(librados::IoCtx *ioctx, const std::string &oid, diff --git a/src/test/cls_rbd/test_cls_rbd.cc b/src/test/cls_rbd/test_cls_rbd.cc index 01a4d7a5039..30f51202bda 100644 --- a/src/test/cls_rbd/test_cls_rbd.cc +++ b/src/test/cls_rbd/test_cls_rbd.cc @@ -89,6 +89,21 @@ std::string TestClsRbd::_pool_name; librados::Rados TestClsRbd::_rados; uint64_t TestClsRbd::_image_number = 0; +TEST_F(TestClsRbd, get_all_features) +{ + librados::IoCtx ioctx; + ASSERT_EQ(0, _rados.ioctx_create(_pool_name.c_str(), ioctx)); + + string oid = get_temp_image_name(); + ASSERT_EQ(0, ioctx.create(oid, false)); + + uint64_t all_features = 0; + ASSERT_EQ(0, get_all_features(&ioctx, oid, &all_features)); + ASSERT_EQ(RBD_FEATURES_ALL, all_features); + + ioctx.close(); +} + TEST_F(TestClsRbd, copyup) { librados::IoCtx ioctx;