From: Jason Dillaman Date: Thu, 17 May 2018 17:52:04 +0000 (-0400) Subject: librbd: prevent creation of images with internal feature bits X-Git-Tag: v14.0.0~73^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=20ff4fdaea4ab0090c75fee427033c2c662a93d0;p=ceph.git librbd: prevent creation of images with internal feature bits Signed-off-by: Jason Dillaman --- diff --git a/src/librbd/api/Image.cc b/src/librbd/api/Image.cc index 5c61746deeb9..cda6b1c6b17d 100644 --- a/src/librbd/api/Image.cc +++ b/src/librbd/api/Image.cc @@ -174,7 +174,7 @@ int Image::deep_copy(I *src, librados::IoCtx& dest_md_ctx, uint64_t src_size; { RWLock::RLocker snap_locker(src->snap_lock); - features = src->features; + features = (src->features & ~RBD_FEATURES_IMPLICIT_ENABLE); src_size = src->get_image_size(src->snap_id); } uint64_t format = 2; diff --git a/src/librbd/image/CreateRequest.cc b/src/librbd/image/CreateRequest.cc index 77e4e850b52d..695d320ce2e2 100644 --- a/src/librbd/image/CreateRequest.cc +++ b/src/librbd/image/CreateRequest.cc @@ -36,6 +36,10 @@ int validate_features(CephContext *cct, uint64_t features, lderr(cct) << "librbd does not support requested features." << dendl; return -ENOSYS; } + if ((features & RBD_FEATURES_INTERNAL) != 0) { + lderr(cct) << "cannot use internally controlled features" << dendl; + return -EINVAL; + } if ((features & RBD_FEATURE_FAST_DIFF) != 0 && (features & RBD_FEATURE_OBJECT_MAP) == 0) { lderr(cct) << "cannot use fast diff without object map" << dendl; diff --git a/src/test/librbd/test_DeepCopy.cc b/src/test/librbd/test_DeepCopy.cc index fcd1a2876a40..1badf2c7a6f0 100644 --- a/src/test/librbd/test_DeepCopy.cc +++ b/src/test/librbd/test_DeepCopy.cc @@ -336,6 +336,8 @@ struct TestDeepCopy : public TestFixture { int order = m_src_ictx->order; uint64_t features; ASSERT_EQ(0, librbd::get_features(m_src_ictx, &features)); + features &= ~RBD_FEATURES_IMPLICIT_ENABLE; + std::cout << "clone " << m_src_ictx->name << " -> " << clone_name << std::endl; ASSERT_EQ(0, librbd::clone(m_ioctx, m_src_ictx->name.c_str(), diff --git a/src/test/rbd_mirror/test_ImageDeleter.cc b/src/test/rbd_mirror/test_ImageDeleter.cc index 3f37ca3fb633..69f7ba9ef13f 100644 --- a/src/test/rbd_mirror/test_ImageDeleter.cc +++ b/src/test/rbd_mirror/test_ImageDeleter.cc @@ -66,7 +66,8 @@ public: m_local_image_id = librbd::util::generate_image_id(m_local_io_ctx); librbd::ImageOptions image_opts; - image_opts.set(RBD_IMAGE_OPTION_FEATURES, RBD_FEATURES_ALL); + image_opts.set(RBD_IMAGE_OPTION_FEATURES, + (RBD_FEATURES_ALL & ~RBD_FEATURES_IMPLICIT_ENABLE)); EXPECT_EQ(0, librbd::create(m_local_io_ctx, m_image_name, m_local_image_id, 1 << 20, image_opts, GLOBAL_IMAGE_ID, m_remote_mirror_uuid, true)); diff --git a/src/test/rbd_mirror/test_fixture.cc b/src/test/rbd_mirror/test_fixture.cc index 67a7932d8f88..b2a51cae32a9 100644 --- a/src/test/rbd_mirror/test_fixture.cc +++ b/src/test/rbd_mirror/test_fixture.cc @@ -89,7 +89,9 @@ void TestFixture::TearDown() { int TestFixture::create_image(librbd::RBD &rbd, librados::IoCtx &ioctx, const std::string &name, uint64_t size) { int order = 18; - return rbd.create2(ioctx, name.c_str(), size, RBD_FEATURES_ALL, &order); + return rbd.create2(ioctx, name.c_str(), size, + (RBD_FEATURES_ALL & ~RBD_FEATURES_IMPLICIT_ENABLE), + &order); } int TestFixture::open_image(librados::IoCtx &io_ctx,