: m_image_ctx(image_ctx), m_size(size), m_parent_spec(spec),
m_parent_overlap(parent_overlap), m_on_finish(on_finish),
m_cct(image_ctx->cct) {
+ assert(m_parent_overlap <= m_size);
}
template <typename I>
{
// adjust in-memory image size now that it's updated on disk
RWLock::WLocker snap_locker(m_image_ctx->snap_lock);
+ if (m_image_ctx->size > m_size) {
+ RWLock::WLocker parent_locker(m_image_ctx->parent_lock);
+ if (m_image_ctx->parent_md.spec.pool_id != -1 &&
+ m_image_ctx->parent_md.overlap > m_size) {
+ m_image_ctx->parent_md.overlap = m_size;
+ }
+ }
m_image_ctx->size = m_size;
}
mock_image_ctx.exclusive_lock = &mock_exclusive_lock;
mock_image_ctx.parent_md.spec = {123, "test", 0};
+ mock_image_ctx.parent_md.overlap = m_image_ctx->size;
InSequence seq;
expect_start_op(mock_exclusive_lock);
- expect_set_parent(mock_image_ctx, 0);
+ expect_set_size(mock_image_ctx, 0);
C_SaferCond ctx;
- auto request = create_request(mock_image_ctx, m_image_ctx->size,
+ auto request = create_request(mock_image_ctx, 123,
mock_image_ctx.parent_md.spec, 123, &ctx);
request->send();
ASSERT_EQ(0, ctx.wait());
+ ASSERT_EQ(123, mock_image_ctx.parent_md.overlap);
}
TEST_F(TestMockDeepCopySetHeadRequest, SetParentError) {