From 2633b045e0b57827cc10c2e7707bd5a5e344e59a Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Mon, 2 May 2016 14:51:31 -0400 Subject: [PATCH] librbd: add rbd_image_options_is_set helper method to API Signed-off-by: Jason Dillaman --- src/include/rbd/librbd.h | 2 ++ src/include/rbd/librbd.hpp | 1 + src/librbd/internal.cc | 13 +++++++++++++ src/librbd/internal.h | 2 ++ src/librbd/librbd.cc | 11 +++++++++++ src/test/librbd/test_librbd.cc | 11 +++++++++++ 6 files changed, 40 insertions(+) diff --git a/src/include/rbd/librbd.h b/src/include/rbd/librbd.h index 03c85b7185f66..eefa689d63029 100644 --- a/src/include/rbd/librbd.h +++ b/src/include/rbd/librbd.h @@ -155,6 +155,8 @@ CEPH_RBD_API int rbd_image_options_get_string(rbd_image_options_t opts, size_t maxlen); CEPH_RBD_API int rbd_image_options_get_uint64(rbd_image_options_t opts, int optname, uint64_t* optval); +CEPH_RBD_API int rbd_image_options_is_set(rbd_image_options_t opts, + int optname, bool* is_set); CEPH_RBD_API int rbd_image_options_unset(rbd_image_options_t opts, int optname); CEPH_RBD_API void rbd_image_options_clear(rbd_image_options_t opts); CEPH_RBD_API int rbd_image_options_is_empty(rbd_image_options_t opts); diff --git a/src/include/rbd/librbd.hpp b/src/include/rbd/librbd.hpp index 3cba391d3ebb3..1ead0909bad75 100644 --- a/src/include/rbd/librbd.hpp +++ b/src/include/rbd/librbd.hpp @@ -163,6 +163,7 @@ public: int set(int optname, uint64_t optval); int get(int optname, std::string* optval) const; int get(int optname, uint64_t* optval) const; + int is_set(int optname, bool* is_set); int unset(int optname); void clear(); bool empty() const; diff --git a/src/librbd/internal.cc b/src/librbd/internal.cc index 3ec1f35e11ad0..8a5161f4a96a2 100644 --- a/src/librbd/internal.cc +++ b/src/librbd/internal.cc @@ -750,6 +750,19 @@ remove_mirroring_image: return 0; } + int image_options_is_set(rbd_image_options_t opts, int optname, + bool* is_set) + { + if (IMAGE_OPTIONS_TYPE_MAPPING.find(optname) == + IMAGE_OPTIONS_TYPE_MAPPING.end()) { + return -EINVAL; + } + + image_options_ref* opts_ = static_cast(opts); + *is_set = ((*opts_)->find(optname) != (*opts_)->end()); + return 0; + } + int image_options_unset(rbd_image_options_t opts, int optname) { image_options_ref* opts_ = static_cast(opts); diff --git a/src/librbd/internal.h b/src/librbd/internal.h index c58c5f2c3d270..47f6f3381541a 100644 --- a/src/librbd/internal.h +++ b/src/librbd/internal.h @@ -81,6 +81,8 @@ namespace librbd { std::string* optval); int image_options_get(rbd_image_options_t opts, int optname, uint64_t* optval); + int image_options_is_set(rbd_image_options_t opts, int optname, + bool* is_set); int image_options_unset(rbd_image_options_t opts, int optname); void image_options_clear(rbd_image_options_t opts); bool image_options_is_empty(rbd_image_options_t opts); diff --git a/src/librbd/librbd.cc b/src/librbd/librbd.cc index 339bbf367f6d5..c3cc7e8ef3bfb 100644 --- a/src/librbd/librbd.cc +++ b/src/librbd/librbd.cc @@ -514,6 +514,11 @@ namespace librbd { return librbd::image_options_get(opts, optname, optval); } + int ImageOptions::is_set(int optname, bool* is_set) + { + return librbd::image_options_is_set(opts, optname, is_set); + } + int ImageOptions::unset(int optname) { return librbd::image_options_unset(opts, optname); @@ -1352,6 +1357,12 @@ extern "C" int rbd_image_options_get_uint64(rbd_image_options_t opts, int optnam return librbd::image_options_get(opts, optname, optval); } +extern "C" int rbd_image_options_is_set(rbd_image_options_t opts, int optname, + bool* is_set) +{ + return librbd::image_options_is_set(opts, optname, is_set); +} + extern "C" int rbd_image_options_unset(rbd_image_options_t opts, int optname) { return librbd::image_options_unset(opts, optname); diff --git a/src/test/librbd/test_librbd.cc b/src/test/librbd/test_librbd.cc index 064af73bcef18..c3754610b12d0 100644 --- a/src/test/librbd/test_librbd.cc +++ b/src/test/librbd/test_librbd.cc @@ -3935,6 +3935,13 @@ TEST_F(TestLibRBD, TestImageOptions) uint64_t stripe_count = 16; rbd_image_options_t opts; rbd_image_options_create(&opts); + + bool is_set; + ASSERT_EQ(-EINVAL, rbd_image_options_is_set(opts, 12345, &is_set)); + ASSERT_EQ(0, rbd_image_options_is_set(opts, RBD_IMAGE_OPTION_FORMAT, + &is_set)); + ASSERT_FALSE(is_set); + ASSERT_EQ(0, rbd_image_options_set_uint64(opts, RBD_IMAGE_OPTION_FORMAT, 2)); ASSERT_EQ(0, rbd_image_options_set_uint64(opts, RBD_IMAGE_OPTION_FEATURES, @@ -3946,6 +3953,10 @@ TEST_F(TestLibRBD, TestImageOptions) ASSERT_EQ(0, rbd_image_options_set_uint64(opts, RBD_IMAGE_OPTION_STRIPE_COUNT, stripe_count)); + ASSERT_EQ(0, rbd_image_options_is_set(opts, RBD_IMAGE_OPTION_FORMAT, + &is_set)); + ASSERT_TRUE(is_set); + std::string parent_name = get_temp_image_name(); // make parent -- 2.39.5