]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: pass bit-flags to image::CreateRequest
authorJason Dillaman <dillaman@redhat.com>
Mon, 20 Apr 2020 19:23:53 +0000 (15:23 -0400)
committerNathan Cutler <ncutler@suse.com>
Wed, 29 Apr 2020 12:06:57 +0000 (14:06 +0200)
The current boolean for skip enable mirror will be able to be changed to
a tri-state to force enable mirror (in addition to the current auto-enable
if in pool-mode).

Signed-off-by: Jason Dillaman <dillaman@redhat.com>
(cherry picked from commit b0c3ca63c2dff11c823d0d4456a2a07f1594fb9f)

src/librbd/api/Migration.cc
src/librbd/image/CloneRequest.cc
src/librbd/image/CreateRequest.cc
src/librbd/image/CreateRequest.h
src/librbd/image/Types.h [new file with mode: 0644]
src/librbd/internal.cc
src/tools/rbd_mirror/image_replayer/CreateImageRequest.cc

index f776ab7d024b113c93dc99e117e7755c4f57841f..fb6a1078e1b8a0dbaf5c5d9d2577fc5488021222 100644 (file)
@@ -29,6 +29,7 @@
 #include "librbd/image/DetachParentRequest.h"
 #include "librbd/image/ListWatchersRequest.h"
 #include "librbd/image/RemoveRequest.h"
+#include "librbd/image/Types.h"
 #include "librbd/internal.h"
 #include "librbd/io/ImageRequestWQ.h"
 #include "librbd/mirror/DisableRequest.h"
@@ -1232,7 +1233,7 @@ int Migration<I>::create_dst_image() {
   if (parent_spec.pool_id == -1) {
     auto *req = image::CreateRequest<I>::create(
       config, m_dst_io_ctx, m_dst_image_name, m_dst_image_id, size,
-      m_image_options, true /* skip_mirror_enable */,
+      m_image_options, image::CREATE_FLAG_SKIP_MIRROR_ENABLE,
       cls::rbd::MIRROR_IMAGE_MODE_JOURNAL, "", "", op_work_queue, &on_create);
     req->send();
   } else {
index 0de9f78afa4dd473af8cde1f2eac1ee9d439aa8e..b69dc0cb2075fce0e95979e9e15a34a2f22e8ca5 100644 (file)
@@ -14,6 +14,7 @@
 #include "librbd/image/CloneRequest.h"
 #include "librbd/image/CreateRequest.h"
 #include "librbd/image/RemoveRequest.h"
+#include "librbd/image/Types.h"
 #include "librbd/mirror/EnableRequest.h"
 
 #define dout_subsys ceph_subsys_rbd
@@ -285,8 +286,9 @@ void CloneRequest<I>::create_child() {
   Context *ctx = create_context_callback<
     klass, &klass::handle_create_child>(this);
 
-  CreateRequest<I> *req = CreateRequest<I>::create(
-    m_config, m_ioctx, m_name, m_id, m_size, m_opts, true,
+  auto req = CreateRequest<I>::create(
+    m_config, m_ioctx, m_name, m_id, m_size, m_opts,
+    image::CREATE_FLAG_SKIP_MIRROR_ENABLE,
     cls::rbd::MIRROR_IMAGE_MODE_JOURNAL, m_non_primary_global_image_id,
     m_primary_mirror_uuid, m_op_work_queue, ctx);
   req->send();
index 175565223c7e2a8763ca3a77b80cde621cd70e15..dbc03e7a221aa55b7a1a0378126783aa7df1d5c6 100644 (file)
@@ -12,6 +12,7 @@
 #include "librbd/Journal.h"
 #include "librbd/ObjectMap.h"
 #include "librbd/Utils.h"
+#include "librbd/image/Types.h"
 #include "librbd/image/ValidatePoolRequest.h"
 #include "librbd/journal/CreateRequest.h"
 #include "librbd/journal/RemoveRequest.h"
@@ -114,13 +115,13 @@ CreateRequest<I>::CreateRequest(const ConfigProxy& config, IoCtx &ioctx,
                                 const std::string &image_name,
                                 const std::string &image_id, uint64_t size,
                                 const ImageOptions &image_options,
-                                bool skip_mirror_enable,
+                                uint32_t create_flags,
                                 cls::rbd::MirrorImageMode mirror_image_mode,
                                 const std::string &non_primary_global_image_id,
                                 const std::string &primary_mirror_uuid,
                                 ContextWQ *op_work_queue, Context *on_finish)
   : m_config(config), m_image_name(image_name), m_image_id(image_id),
-    m_size(size), m_skip_mirror_enable(skip_mirror_enable),
+    m_size(size), m_create_flags(create_flags),
     m_mirror_image_mode(mirror_image_mode),
     m_non_primary_global_image_id(non_primary_global_image_id),
     m_primary_mirror_uuid(primary_mirror_uuid),
@@ -635,7 +636,8 @@ void CreateRequest<I>::handle_journal_create(int r) {
 template<typename I>
 void CreateRequest<I>::mirror_image_enable() {
   if (((m_mirror_mode != cls::rbd::MIRROR_MODE_POOL) && !m_force_non_primary) ||
-      m_skip_mirror_enable) {
+      ((m_create_flags & CREATE_FLAG_MIRROR_ENABLE_MASK) ==
+          CREATE_FLAG_SKIP_MIRROR_ENABLE)) {
     complete(0);
     return;
   }
index 5a7bdac03e89186bbda407c53ea2c6be00c3ffd5..632ba077ac964a07a160c35c74b29f8d2e81de2c 100644 (file)
@@ -29,13 +29,13 @@ public:
                                const std::string &image_name,
                                const std::string &image_id, uint64_t size,
                                const ImageOptions &image_options,
-                               bool skip_mirror_enable,
+                               uint32_t create_flags,
                                cls::rbd::MirrorImageMode mirror_image_mode,
                                const std::string &non_primary_global_image_id,
                                const std::string &primary_mirror_uuid,
                                ContextWQ *op_work_queue, Context *on_finish) {
     return new CreateRequest(config, ioctx, image_name, image_id, size,
-                             image_options, skip_mirror_enable,
+                             image_options, create_flags,
                              mirror_image_mode, non_primary_global_image_id,
                              primary_mirror_uuid, op_work_queue, on_finish);
   }
@@ -91,7 +91,7 @@ private:
                 const std::string &image_name,
                 const std::string &image_id, uint64_t size,
                 const ImageOptions &image_options,
-                bool skip_mirror_enable,
+                uint32_t create_flags,
                 cls::rbd::MirrorImageMode mirror_image_mode,
                 const std::string &non_primary_global_image_id,
                 const std::string &primary_mirror_uuid,
@@ -112,7 +112,7 @@ private:
   std::string m_journal_pool;
   std::string m_data_pool;
   int64_t m_data_pool_id = -1;
-  bool m_skip_mirror_enable;
+  uint32_t m_create_flags;
   cls::rbd::MirrorImageMode m_mirror_image_mode;
   const std::string m_non_primary_global_image_id;
   const std::string m_primary_mirror_uuid;
diff --git a/src/librbd/image/Types.h b/src/librbd/image/Types.h
new file mode 100644 (file)
index 0000000..44c66e2
--- /dev/null
@@ -0,0 +1,20 @@
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// vim: ts=8 sw=2 smarttab
+
+#ifndef LIBRBD_IMAGE_TYPES_H
+#define LIBRBD_IMAGE_TYPES_H
+
+namespace librbd {
+namespace image {
+
+enum {
+  CREATE_FLAG_SKIP_MIRROR_ENABLE  = 1 << 0,
+  CREATE_FLAG_FORCE_MIRROR_ENABLE = 1 << 1,
+  CREATE_FLAG_MIRROR_ENABLE_MASK = (CREATE_FLAG_SKIP_MIRROR_ENABLE |
+                                    CREATE_FLAG_FORCE_MIRROR_ENABLE),
+};
+
+} // namespace image
+} // librbd
+
+#endif // LIBRBD_IMAGE_TYPES_H
index a68405ae26e62e881a7d99dec187f06d43665998..3dbbcd00918d835988c51d4a7bf0eee012c8635e 100644 (file)
@@ -40,6 +40,7 @@
 #include "librbd/image/CloneRequest.h"
 #include "librbd/image/CreateRequest.h"
 #include "librbd/image/GetMetadataRequest.h"
+#include "librbd/image/Types.h"
 #include "librbd/io/AioCompletion.h"
 #include "librbd/io/ImageRequest.h"
 #include "librbd/io/ImageRequestWQ.h"
@@ -687,9 +688,14 @@ int validate_pool(IoCtx &io_ctx, CephContext *cct) {
       ConfigProxy config{cct->_conf};
       api::Config<>::apply_pool_overrides(io_ctx, &config);
 
+      uint32_t create_flags = 0U;
+      if (skip_mirror_enable) {
+        create_flags = image::CREATE_FLAG_SKIP_MIRROR_ENABLE;
+      }
+
       C_SaferCond cond;
       image::CreateRequest<> *req = image::CreateRequest<>::create(
-        config, io_ctx, image_name, id, size, opts, skip_mirror_enable,
+        config, io_ctx, image_name, id, size, opts, create_flags,
         cls::rbd::MIRROR_IMAGE_MODE_JOURNAL, non_primary_global_image_id,
         primary_mirror_uuid, op_work_queue, &cond);
       req->send();
index c023902c20944f864ac6c0443d4f5a767f9d8763..3cd57afc5f0865809493969bdbaf73fe36465cfe 100644 (file)
@@ -89,7 +89,7 @@ void CreateImageRequest<I>::create_image() {
 
   auto req = librbd::image::CreateRequest<I>::create(
     config, m_local_io_ctx, m_local_image_name, m_local_image_id,
-    m_remote_image_ctx->size, image_options, false, m_mirror_image_mode,
+    m_remote_image_ctx->size, image_options, 0U, m_mirror_image_mode,
     m_global_image_id, m_remote_mirror_uuid, m_remote_image_ctx->op_work_queue,
     ctx);
   req->send();