From: Jason Dillaman Date: Thu, 8 Sep 2016 13:59:37 +0000 (-0400) Subject: librbd: invalidate cache before trimming image X-Git-Tag: v11.0.1~277^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=3f93a1917437ba7b69b306e4ff971b79e8b79c89;p=ceph.git librbd: invalidate cache before trimming image Any potential writeback outside the extents of a shrunk image would result in orphaned objects. Signed-off-by: Jason Dillaman --- diff --git a/src/librbd/operation/ResizeRequest.cc b/src/librbd/operation/ResizeRequest.cc index 6fb50ae6f15a..86cb8a85d3bf 100644 --- a/src/librbd/operation/ResizeRequest.cc +++ b/src/librbd/operation/ResizeRequest.cc @@ -175,7 +175,7 @@ Context *ResizeRequest::handle_trim_image(int *result) { return this->create_context_finisher(*result); } - send_invalidate_cache(); + send_post_block_writes(); return nullptr; } @@ -205,7 +205,7 @@ Context *ResizeRequest::handle_invalidate_cache(int *result) { return this->create_context_finisher(*result); } - send_post_block_writes(); + send_trim_image(); return nullptr; } @@ -222,7 +222,7 @@ Context *ResizeRequest::send_grow_object_map() { if (m_original_size == m_new_size) { return this->create_context_finisher(0); } else if (m_new_size < m_original_size) { - send_trim_image(); + send_invalidate_cache(); return nullptr; } diff --git a/src/librbd/operation/ResizeRequest.h b/src/librbd/operation/ResizeRequest.h index 069718e0889e..394a89e3ed87 100644 --- a/src/librbd/operation/ResizeRequest.h +++ b/src/librbd/operation/ResizeRequest.h @@ -80,10 +80,10 @@ private: * | STATE_UPDATE_HEADER ----------------------------\ * | | * | (shrink) | - * |\--------> STATE_TRIM_IMAGE | + * |\--------> STATE_INVALIDATE_CACHE | * | | | * | v | - * | STATE_INVALIDATE_CACHE | + * | STATE_TRIM_IMAGE | * | | | * | v | * | STATE_POST_BLOCK_WRITES | diff --git a/src/test/librbd/operation/test_mock_ResizeRequest.cc b/src/test/librbd/operation/test_mock_ResizeRequest.cc index b7cf365eae01..4f3777bce85d 100644 --- a/src/test/librbd/operation/test_mock_ResizeRequest.cc +++ b/src/test/librbd/operation/test_mock_ResizeRequest.cc @@ -203,8 +203,8 @@ TEST_F(TestMockOperationResizeRequest, ShrinkSuccess) { expect_unblock_writes(mock_image_ctx); MockTrimRequest mock_trim_request; - expect_trim(mock_image_ctx, mock_trim_request, 0); expect_invalidate_cache(mock_image_ctx, 0); + expect_trim(mock_image_ctx, mock_trim_request, 0); expect_block_writes(mock_image_ctx, 0); expect_update_header(mock_image_ctx, 0); expect_shrink_object_map(mock_image_ctx); @@ -264,6 +264,7 @@ TEST_F(TestMockOperationResizeRequest, TrimError) { expect_unblock_writes(mock_image_ctx); MockTrimRequest mock_trim_request; + expect_invalidate_cache(mock_image_ctx, 0); expect_trim(mock_image_ctx, mock_trim_request, -EINVAL); expect_commit_op_event(mock_image_ctx, -EINVAL); ASSERT_EQ(-EINVAL, when_resize(mock_image_ctx, ictx->size / 2, true, 0, false)); @@ -286,7 +287,6 @@ TEST_F(TestMockOperationResizeRequest, InvalidateCacheError) { expect_unblock_writes(mock_image_ctx); MockTrimRequest mock_trim_request; - expect_trim(mock_image_ctx, mock_trim_request, 0); expect_invalidate_cache(mock_image_ctx, -EINVAL); expect_commit_op_event(mock_image_ctx, -EINVAL); ASSERT_EQ(-EINVAL, when_resize(mock_image_ctx, ictx->size / 2, true, 0, false));