]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: invalidate cache before trimming image
authorJason Dillaman <dillaman@redhat.com>
Thu, 8 Sep 2016 13:59:37 +0000 (09:59 -0400)
committerLoic Dachary <ldachary@redhat.com>
Fri, 21 Oct 2016 10:16:44 +0000 (12:16 +0200)
Any potential writeback outside the extents of a shrunk image
would result in orphaned objects.

Signed-off-by: Jason Dillaman <dillaman@redhat.com>
(cherry picked from commit 3f93a1917437ba7b69b306e4ff971b79e8b79c89)

src/librbd/operation/ResizeRequest.cc
src/librbd/operation/ResizeRequest.h
src/test/librbd/operation/test_mock_ResizeRequest.cc

index 1c3dee7bf825c6028fb7521c485430b0ae8dceae..79fae3930a155a5bf8cd94338a6fc829b43d32b4 100644 (file)
@@ -168,7 +168,7 @@ Context *ResizeRequest<I>::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<I>::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<I>::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;
   }
 
index bd5019f80475e7eefe65b5b0db189c7510cf12de..400bde33316ffa71f5902d80685f7f359b371dae 100644 (file)
@@ -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                         |
index e3a34bec2a653be64acfe5d462d27ddd52c916e8..c7733cf5565be5a7cd60ec41c060675c2454f43d 100644 (file)
@@ -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));