From bb987178c1ed4833f4540d819d7203ded18966cf Mon Sep 17 00:00:00 2001 From: Or Ozeri Date: Thu, 19 Nov 2020 08:26:51 +0200 Subject: [PATCH] librbd: fix crypto prepare_copyup to use new remap_extents api This commit changes the crypto prepare_copyup implementation to correctly translate object extents to image extents, via the remap_extents api. Additionally, we fix relevant unit tests that call this api to correctly expect these calls. Signed-off-by: Or Ozeri --- src/librbd/crypto/CryptoObjectDispatch.cc | 5 ++--- .../crypto/test_mock_CryptoObjectDispatch.cc | 15 +++++++++++++++ 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/librbd/crypto/CryptoObjectDispatch.cc b/src/librbd/crypto/CryptoObjectDispatch.cc index 5adb688131bfc..b82cd679f7649 100644 --- a/src/librbd/crypto/CryptoObjectDispatch.cc +++ b/src/librbd/crypto/CryptoObjectDispatch.cc @@ -616,9 +616,8 @@ int CryptoObjectDispatch::prepare_copyup( extent.get_off(), extent.get_len()); io::Extents image_extents; - Striper::extent_to_file( - m_image_ctx->cct, &m_image_ctx->layout, object_no, aligned_off, - aligned_len, image_extents); + io::util::extent_to_file( + m_image_ctx, object_no, aligned_off, aligned_len, image_extents); ceph::bufferlist encrypted_bl; uint64_t position = 0; diff --git a/src/test/librbd/crypto/test_mock_CryptoObjectDispatch.cc b/src/test/librbd/crypto/test_mock_CryptoObjectDispatch.cc index 104b44a159540..f3b9aef834053 100644 --- a/src/test/librbd/crypto/test_mock_CryptoObjectDispatch.cc +++ b/src/test/librbd/crypto/test_mock_CryptoObjectDispatch.cc @@ -101,6 +101,7 @@ namespace crypto { using ::testing::_; using ::testing::ElementsAre; using ::testing::Invoke; +using ::testing::InSequence; using ::testing::Pair; using ::testing::Return; using ::testing::WithArg; @@ -223,6 +224,12 @@ struct TestMockCryptoCryptoObjectDispatch : public TestMockFixture { mock_image_ctx->layout.object_size)); } + void expect_remap_extents(uint64_t offset, uint64_t length) { + EXPECT_CALL(*mock_image_ctx->io_image_dispatcher, remap_extents( + ElementsAre(Pair(offset, length)), + io::IMAGE_EXTENTS_MAP_TYPE_PHYSICAL_TO_LOGICAL)); + } + void expect_get_parent_overlap(uint64_t overlap) { EXPECT_CALL(*mock_image_ctx, get_parent_overlap(_, _)) .WillOnce(WithArg<1>(Invoke([overlap](uint64_t *o) { @@ -510,6 +517,7 @@ TEST_F(TestMockCryptoCryptoObjectDispatch, UnalignedWriteCopyup) { expect_get_object_size(); expect_get_parent_overlap(mock_image_ctx->layout.object_size); + expect_remap_extents(0, mock_image_ctx->layout.object_size); expect_prune_parent_extents(mock_image_ctx->layout.object_size); EXPECT_CALL(mock_exclusive_lock, is_lock_owner()).WillRepeatedly( Return(true)); @@ -698,6 +706,13 @@ TEST_F(TestMockCryptoCryptoObjectDispatch, PrepareCopyup) { expect_get_object_size(); expect_encrypt(6); + InSequence seq; + expect_remap_extents(0, 4096); + expect_remap_extents(4096, 4096); + expect_remap_extents(8192, 4096); + expect_remap_extents(0, 4096); + expect_remap_extents(4096, 8192); + expect_remap_extents(16384, 4096); ASSERT_EQ(0, mock_crypto_object_dispatch->prepare_copyup( 0, &snapshot_sparse_bufferlist)); -- 2.39.5