From: Mykola Golub Date: Thu, 10 May 2018 18:25:17 +0000 (+0300) Subject: librbd/deep_copy: adjust in-memory overlap if set_size updated it on disk X-Git-Tag: v14.0.0~95^2~12 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=f73c7ba0b27ec1dfb16bf4be97c32530d2e18208;p=ceph.git librbd/deep_copy: adjust in-memory overlap if set_size updated it on disk so set_parent won't be called when overlap is changed due to image size change. Signed-off-by: Mykola Golub --- diff --git a/src/librbd/deep_copy/SetHeadRequest.cc b/src/librbd/deep_copy/SetHeadRequest.cc index 067c2979a57d..cab319820c15 100644 --- a/src/librbd/deep_copy/SetHeadRequest.cc +++ b/src/librbd/deep_copy/SetHeadRequest.cc @@ -27,6 +27,7 @@ SetHeadRequest::SetHeadRequest(I *image_ctx, uint64_t size, : m_image_ctx(image_ctx), m_size(size), m_parent_spec(spec), m_parent_overlap(parent_overlap), m_on_finish(on_finish), m_cct(image_ctx->cct) { + assert(m_parent_overlap <= m_size); } template @@ -84,6 +85,13 @@ void SetHeadRequest::handle_set_size(int r) { { // adjust in-memory image size now that it's updated on disk RWLock::WLocker snap_locker(m_image_ctx->snap_lock); + if (m_image_ctx->size > m_size) { + RWLock::WLocker parent_locker(m_image_ctx->parent_lock); + if (m_image_ctx->parent_md.spec.pool_id != -1 && + m_image_ctx->parent_md.overlap > m_size) { + m_image_ctx->parent_md.overlap = m_size; + } + } m_image_ctx->size = m_size; } diff --git a/src/test/librbd/deep_copy/test_mock_SetHeadRequest.cc b/src/test/librbd/deep_copy/test_mock_SetHeadRequest.cc index bebcddcd737d..0c6659834b9f 100644 --- a/src/test/librbd/deep_copy/test_mock_SetHeadRequest.cc +++ b/src/test/librbd/deep_copy/test_mock_SetHeadRequest.cc @@ -201,16 +201,18 @@ TEST_F(TestMockDeepCopySetHeadRequest, SetParentOverlap) { mock_image_ctx.exclusive_lock = &mock_exclusive_lock; mock_image_ctx.parent_md.spec = {123, "test", 0}; + mock_image_ctx.parent_md.overlap = m_image_ctx->size; InSequence seq; expect_start_op(mock_exclusive_lock); - expect_set_parent(mock_image_ctx, 0); + expect_set_size(mock_image_ctx, 0); C_SaferCond ctx; - auto request = create_request(mock_image_ctx, m_image_ctx->size, + auto request = create_request(mock_image_ctx, 123, mock_image_ctx.parent_md.spec, 123, &ctx); request->send(); ASSERT_EQ(0, ctx.wait()); + ASSERT_EQ(123, mock_image_ctx.parent_md.overlap); } TEST_F(TestMockDeepCopySetHeadRequest, SetParentError) {