From c5697d3c69388466aaff628e1cd2a6b459d1b6ae Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Mon, 20 Aug 2018 16:33:20 -0400 Subject: [PATCH] librbd: permit cross-namespace when using clone v2 Signed-off-by: Jason Dillaman --- src/librbd/image/CloneRequest.cc | 7 +++++++ src/tools/rbd/action/Clone.cc | 12 +++++------- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/librbd/image/CloneRequest.cc b/src/librbd/image/CloneRequest.cc index 936d002592932..97fd849f5d055 100644 --- a/src/librbd/image/CloneRequest.cc +++ b/src/librbd/image/CloneRequest.cc @@ -112,6 +112,13 @@ void CloneRequest::validate_options() { } } + if (m_clone_format == 1 && + m_parent_io_ctx.get_namespace() != m_ioctx.get_namespace()) { + ldout(m_cct, 1) << "clone v2 required for cross-namespace clones" << dendl; + complete(-EXDEV); + return; + } + open_parent(); } diff --git a/src/tools/rbd/action/Clone.cc b/src/tools/rbd/action/Clone.cc index e668590725b3a..6406c957e4980 100644 --- a/src/tools/rbd/action/Clone.cc +++ b/src/tools/rbd/action/Clone.cc @@ -63,12 +63,6 @@ int execute(const po::variables_map &vm, } opts.set(RBD_IMAGE_OPTION_FORMAT, static_cast(2)); - // TODO clones across namespaces not yet supported - if (namespace_name != dst_namespace_name) { - std::cerr << "rbd: clones across namespaces is not supported." << std::endl; - return -EINVAL; - } - librados::Rados rados; librados::IoCtx io_ctx; r = utils::init(pool_name, namespace_name, &rados, &io_ctx); @@ -85,7 +79,11 @@ int execute(const po::variables_map &vm, librbd::RBD rbd; r = do_clone(rbd, io_ctx, image_name.c_str(), snap_name.c_str(), dst_io_ctx, dst_image_name.c_str(), opts); - if (r < 0) { + if (r == -EXDEV) { + std::cerr << "rbd: clone v2 required for cross-namespace clones." + << std::endl; + return r; + } else if (r < 0) { std::cerr << "rbd: clone error: " << cpp_strerror(r) << std::endl; return r; } -- 2.39.5