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: v10.2.10~89^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=5b5468189ea74da5db63bcba0ae6450d83cc99f7;p=ceph.git cls/rbd: add get_all_features on client side Signed-off-by: Mykola Golub (cherry picked from commit 84f6d5c109911923c25414de639308921983e438) Conflicts: src/cls/rbd/cls_rbd_client.h: trivial resolution --- diff --git a/src/cls/rbd/cls_rbd_client.cc b/src/cls/rbd/cls_rbd_client.cc index 6ff245100eef..68a6585c4206 100644 --- a/src/cls/rbd/cls_rbd_client.cc +++ b/src/cls/rbd/cls_rbd_client.cc @@ -616,6 +616,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 1ccbf76685cf..6f1ac73d0f95 100644 --- a/src/cls/rbd/cls_rbd_client.h +++ b/src/cls/rbd/cls_rbd_client.h @@ -116,6 +116,12 @@ namespace librbd { std::vector *parents, std::vector *protection_statuses); + 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 b6989658f765..f003882b66bd 100644 --- a/src/test/cls_rbd/test_cls_rbd.cc +++ b/src/test/cls_rbd/test_cls_rbd.cc @@ -88,6 +88,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;