From 126d720f0c98c4e6b47c78e79388ed6c2ba4c65a Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Mon, 20 Apr 2020 15:23:53 -0400 Subject: [PATCH] librbd: pass bit-flags to image::CreateRequest 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 (cherry picked from commit b0c3ca63c2dff11c823d0d4456a2a07f1594fb9f) --- src/librbd/api/Migration.cc | 3 ++- src/librbd/image/CloneRequest.cc | 6 ++++-- src/librbd/image/CreateRequest.cc | 8 +++++--- src/librbd/image/CreateRequest.h | 8 ++++---- src/librbd/image/Types.h | 20 +++++++++++++++++++ src/librbd/internal.cc | 8 +++++++- .../image_replayer/CreateImageRequest.cc | 2 +- 7 files changed, 43 insertions(+), 12 deletions(-) create mode 100644 src/librbd/image/Types.h diff --git a/src/librbd/api/Migration.cc b/src/librbd/api/Migration.cc index f776ab7d024b1..fb6a1078e1b8a 100644 --- a/src/librbd/api/Migration.cc +++ b/src/librbd/api/Migration.cc @@ -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::create_dst_image() { if (parent_spec.pool_id == -1) { auto *req = image::CreateRequest::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 { diff --git a/src/librbd/image/CloneRequest.cc b/src/librbd/image/CloneRequest.cc index 0de9f78afa4dd..b69dc0cb2075f 100644 --- a/src/librbd/image/CloneRequest.cc +++ b/src/librbd/image/CloneRequest.cc @@ -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::create_child() { Context *ctx = create_context_callback< klass, &klass::handle_create_child>(this); - CreateRequest *req = CreateRequest::create( - m_config, m_ioctx, m_name, m_id, m_size, m_opts, true, + auto req = CreateRequest::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(); diff --git a/src/librbd/image/CreateRequest.cc b/src/librbd/image/CreateRequest.cc index 175565223c7e2..dbc03e7a221aa 100644 --- a/src/librbd/image/CreateRequest.cc +++ b/src/librbd/image/CreateRequest.cc @@ -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::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::handle_journal_create(int r) { template void CreateRequest::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; } diff --git a/src/librbd/image/CreateRequest.h b/src/librbd/image/CreateRequest.h index 5a7bdac03e891..632ba077ac964 100644 --- a/src/librbd/image/CreateRequest.h +++ b/src/librbd/image/CreateRequest.h @@ -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 index 0000000000000..44c66e227599c --- /dev/null +++ b/src/librbd/image/Types.h @@ -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 diff --git a/src/librbd/internal.cc b/src/librbd/internal.cc index a68405ae26e62..3dbbcd00918d8 100644 --- a/src/librbd/internal.cc +++ b/src/librbd/internal.cc @@ -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(); diff --git a/src/tools/rbd_mirror/image_replayer/CreateImageRequest.cc b/src/tools/rbd_mirror/image_replayer/CreateImageRequest.cc index c023902c20944..3cd57afc5f086 100644 --- a/src/tools/rbd_mirror/image_replayer/CreateImageRequest.cc +++ b/src/tools/rbd_mirror/image_replayer/CreateImageRequest.cc @@ -89,7 +89,7 @@ void CreateImageRequest::create_image() { auto req = librbd::image::CreateRequest::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(); -- 2.39.5