void expect_set_require_lock(MockTestImageCtx &mock_image_ctx,
MockImageDispatch &mock_image_dispatch,
bool init_shutdown, int r) {
+ expect_test_features(mock_image_ctx, RBD_FEATURE_EXCLUSIVE_LOCK, true);
expect_test_features(mock_image_ctx, RBD_FEATURE_JOURNALING,
((mock_image_ctx.features & RBD_FEATURE_JOURNALING) != 0));
if (mock_image_ctx.clone_copy_on_read ||
ASSERT_EQ(0, ctx.wait());
}
+TEST_F(TestMockExclusiveLockPreReleaseRequest, Disabled) {
+ REQUIRE_FEATURE(RBD_FEATURE_EXCLUSIVE_LOCK);
+
+ librbd::ImageCtx *ictx;
+ ASSERT_EQ(0, open_image(m_image_name, &ictx));
+
+ MockTestImageCtx mock_image_ctx(*ictx);
+ expect_op_work_queue(mock_image_ctx);
+
+ InSequence seq;
+
+ expect_cancel_op_requests(mock_image_ctx, 0);
+ MockImageDispatch mock_image_dispatch;
+
+ expect_test_features(mock_image_ctx, RBD_FEATURE_EXCLUSIVE_LOCK, false);
+
+ expect_prepare_lock(mock_image_ctx);
+
+ expect_close_image_cache(mock_image_ctx, 0);
+
+ expect_invalidate_cache(mock_image_ctx, 0);
+
+ expect_flush_io(mock_image_ctx, 0);
+
+ expect_flush_notifies(mock_image_ctx);
+
+ MockJournal mock_journal;
+ mock_image_ctx.journal = &mock_journal;
+ expect_close_journal(mock_image_ctx, mock_journal, -EINVAL);
+
+ MockObjectMap mock_object_map;
+ mock_image_ctx.object_map = &mock_object_map;
+ expect_close_object_map(mock_image_ctx, mock_object_map);
+
+ expect_handle_prepare_lock_complete(mock_image_ctx);
+
+ C_SaferCond ctx;
+ MockPreReleaseRequest *req = MockPreReleaseRequest::create(
+ mock_image_ctx, &mock_image_dispatch, false, m_async_op_tracker, &ctx);
+ req->send();
+ ASSERT_EQ(0, ctx.wait());
+}
+
} // namespace exclusive_lock
} // namespace librbd