From: Mykola Golub Date: Tue, 23 Feb 2016 09:28:00 +0000 (+0200) Subject: librbd: get image name on open if it is opened by id X-Git-Tag: v10.1.0~315^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=80656b11311e22fe352b6af4f1e880daa0c606c6;p=ceph.git librbd: get image name on open if it is opened by id Signed-off-by: Mykola Golub --- diff --git a/src/librbd/image/OpenRequest.cc b/src/librbd/image/OpenRequest.cc index cb0979aec6a1..68abbba620ab 100644 --- a/src/librbd/image/OpenRequest.cc +++ b/src/librbd/image/OpenRequest.cc @@ -102,7 +102,7 @@ void OpenRequest::send_v2_detect_header() { comp, &op, &m_out_bl); comp->release(); } else { - send_v2_get_immutable_metadata(); + send_v2_get_name(); } } @@ -141,7 +141,7 @@ void OpenRequest::send_v2_get_id() { comp, &op, &m_out_bl); comp->release(); } else { - send_v2_get_immutable_metadata(); + send_v2_get_name(); } } @@ -164,6 +164,42 @@ Context *OpenRequest::handle_v2_get_id(int *result) { return nullptr; } +template +void OpenRequest::send_v2_get_name() { + CephContext *cct = m_image_ctx->cct; + ldout(cct, 10) << this << " " << __func__ << dendl; + + librados::ObjectReadOperation op; + cls_client::dir_get_name_start(&op, m_image_ctx->id); + + using klass = OpenRequest; + librados::AioCompletion *comp = create_rados_ack_callback< + klass, &klass::handle_v2_get_name>(this); + m_out_bl.clear(); + m_image_ctx->md_ctx.aio_operate(RBD_DIRECTORY, comp, &op, &m_out_bl); + comp->release(); +} + +template +Context *OpenRequest::handle_v2_get_name(int *result) { + CephContext *cct = m_image_ctx->cct; + ldout(cct, 10) << __func__ << ": r=" << *result << dendl; + + if (*result == 0) { + bufferlist::iterator it = m_out_bl.begin(); + *result = cls_client::dir_get_name_finish(&it, &m_image_ctx->name); + } + if (*result < 0) { + lderr(cct) << "failed to retreive name: " + << cpp_strerror(*result) << dendl; + send_close_image(*result); + } else { + send_v2_get_immutable_metadata(); + } + + return nullptr; +} + template void OpenRequest::send_v2_get_immutable_metadata() { CephContext *cct = m_image_ctx->cct; diff --git a/src/librbd/image/OpenRequest.h b/src/librbd/image/OpenRequest.h index 599fdcefdd22..48aed3787ee7 100644 --- a/src/librbd/image/OpenRequest.h +++ b/src/librbd/image/OpenRequest.h @@ -38,7 +38,7 @@ private: * \-----> V2_DETECT_HEADER | . * | | . * v | . - * V2_GET_ID | . + * V2_GET_ID|NAME | . * | | . * v | . * V2_GET_IMMUTABLE_METADATA | . @@ -78,6 +78,9 @@ private: void send_v2_get_id(); Context *handle_v2_get_id(int *result); + void send_v2_get_name(); + Context *handle_v2_get_name(int *result); + void send_v2_get_immutable_metadata(); Context *handle_v2_get_immutable_metadata(int *result); diff --git a/src/test/librbd/test_internal.cc b/src/test/librbd/test_internal.cc index 7c2f759999aa..c1121da7db4f 100644 --- a/src/test/librbd/test_internal.cc +++ b/src/test/librbd/test_internal.cc @@ -6,6 +6,7 @@ #include "librbd/AioImageRequest.h" #include "librbd/AioImageRequestWQ.h" #include "librbd/ExclusiveLock.h" +#include "librbd/ImageState.h" #include "librbd/ImageWatcher.h" #include "librbd/internal.h" #include "librbd/ObjectMap.h" @@ -71,6 +72,20 @@ public: } }; +TEST_F(TestInternal, OpenByID) { + REQUIRE_FORMAT_V2(); + + librbd::ImageCtx *ictx; + ASSERT_EQ(0, open_image(m_image_name, &ictx)); + std::string id = ictx->id; + close_image(ictx); + + ictx = new librbd::ImageCtx("", id, nullptr, m_ioctx, true); + ASSERT_EQ(0, ictx->state->open()); + ASSERT_EQ(ictx->name, m_image_name); + close_image(ictx); +} + TEST_F(TestInternal, IsExclusiveLockOwner) { REQUIRE_FEATURE(RBD_FEATURE_EXCLUSIVE_LOCK);