From ca0893c4d9f54e3d80cf7ea90c8b4431d1f5a4f0 Mon Sep 17 00:00:00 2001 From: Mykola Golub Date: Thu, 10 May 2018 21:25:17 +0300 Subject: [PATCH] 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 --- src/librbd/deep_copy/SetHeadRequest.cc | 8 ++++++++ src/test/librbd/deep_copy/test_mock_SetHeadRequest.cc | 6 ++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/librbd/deep_copy/SetHeadRequest.cc b/src/librbd/deep_copy/SetHeadRequest.cc index 067c2979a57..cab319820c1 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 bebcddcd737..0c6659834b9 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) { -- 2.39.5