From: Jason Dillaman Date: Thu, 8 Sep 2016 13:59:37 +0000 (-0400) Subject: librbd: invalidate cache before trimming image X-Git-Tag: v10.2.4~21^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=ba2e87e0443069b0552b698cc7a508898a3f585d;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 (cherry picked from commit 3f93a1917437ba7b69b306e4ff971b79e8b79c89) --- diff --git a/src/librbd/operation/ResizeRequest.cc b/src/librbd/operation/ResizeRequest.cc index 1c3dee7bf825..79fae3930a15 100644 --- a/src/librbd/operation/ResizeRequest.cc +++ b/src/librbd/operation/ResizeRequest.cc @@ -168,7 +168,7 @@ Context *ResizeRequest::handle_trim_image(int *result) { return this->create_context_finisher(*result); } - send_invalidate_cache(); + send_post_block_writes(); return nullptr; } @@ -198,7 +198,7 @@ Context *ResizeRequest::handle_invalidate_cache(int *result) { return this->create_context_finisher(*result); } - send_post_block_writes(); + send_trim_image(); return nullptr; } @@ -215,7 +215,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 bd5019f80475..400bde33316f 100644 --- a/src/librbd/operation/ResizeRequest.h +++ b/src/librbd/operation/ResizeRequest.h @@ -79,10 +79,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 e3a34bec2a65..c7733cf5565b 100644 --- a/src/test/librbd/operation/test_mock_ResizeRequest.cc +++ b/src/test/librbd/operation/test_mock_ResizeRequest.cc @@ -202,8 +202,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); @@ -263,6 +263,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, 0, false)); @@ -285,7 +286,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, 0, false));