]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: prevent creation of images with internal feature bits
authorJason Dillaman <dillaman@redhat.com>
Thu, 17 May 2018 17:52:04 +0000 (13:52 -0400)
committerPrashant D <pdhange@redhat.com>
Thu, 24 May 2018 12:11:00 +0000 (08:11 -0400)
Signed-off-by: Jason Dillaman <dillaman@redhat.com>
(cherry picked from commit 20ff4fdaea4ab0090c75fee427033c2c662a93d0)

src/librbd/api/Image.cc
src/librbd/image/CreateRequest.cc
src/test/librbd/test_DeepCopy.cc
src/test/rbd_mirror/test_ImageDeleter.cc
src/test/rbd_mirror/test_fixture.cc

index 5c61746deeb99fe3ea35601fd66ffa27b5368f78..cda6b1c6b17d71efe3b49a1e872d79b7735c6e4f 100644 (file)
@@ -174,7 +174,7 @@ int Image<I>::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;
index 24b3f608b46ed5bdd0d164b7d4dc02959b8c81a8..935780aa194b6eadee9fb3693c93f47fdd48466d 100644 (file)
@@ -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;
index fcd1a2876a40b923e1685e42baa4338df07eb38c..1badf2c7a6f078da2bebe31b106a47004b1ce4a4 100644 (file)
@@ -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(),
index 3f37ca3fb63375404d8ecc33f66000c16f2b2162..69f7ba9ef13f60cccb0d7c889ee09ddddaa20e36 100644 (file)
@@ -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));
index 67a7932d8f885f07b8d75384f61b62f9e8d66c71..b2a51cae32a9cac53c582d126bc8bc86bb87bd43 100644 (file)
@@ -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,