void expect_open(librbd::MockTestImageCtx &mock_image_ctx, int r) {
EXPECT_CALL(*mock_image_ctx.state, open(true, _))
- .WillOnce(WithArg<1>(Invoke([this, r](Context* ctx) {
+ .WillOnce(WithArg<1>(Invoke([this, &mock_image_ctx, r](Context* ctx) {
+ EXPECT_EQ(0U, mock_image_ctx.read_only_mask &
+ librbd::IMAGE_READ_ONLY_FLAG_NON_PRIMARY);
m_threads->work_queue->queue(ctx, r);
})));
}
void expect_open(librbd::MockTestImageCtx &mock_image_ctx, int r) {
EXPECT_CALL(*mock_image_ctx.state, open(true, _))
- .WillOnce(WithArg<1>(Invoke([this, r](Context* ctx) {
+ .WillOnce(WithArg<1>(Invoke([this, &mock_image_ctx, r](Context* ctx) {
+ EXPECT_EQ(0U, mock_image_ctx.read_only_mask &
+ librbd::IMAGE_READ_ONLY_FLAG_NON_PRIMARY);
m_threads->work_queue->queue(ctx, r);
})));
}
dout(10) << dendl;
m_image_ctx = I::create("", m_image_id, nullptr, m_io_ctx, false);
+ // ensure non-primary images can be modified
+ m_image_ctx->read_only_mask &= ~librbd::IMAGE_READ_ONLY_FLAG_NON_PRIMARY;
+
{
std::unique_lock image_locker{m_image_ctx->image_lock};
m_image_ctx->set_journal_policy(new JournalPolicy());
m_image_ctx = I::create("", m_image_id, nullptr, m_io_ctx, false);
+ // ensure non-primary images can be modified
+ m_image_ctx->read_only_mask &= ~librbd::IMAGE_READ_ONLY_FLAG_NON_PRIMARY;
+
{
// don't attempt to open the journal
std::unique_lock image_locker{m_image_ctx->image_lock};
*m_local_image_ctx = I::create("", m_local_image_id, nullptr,
m_local_io_ctx, false);
+
+ // ensure non-primary images can be modified
+ (*m_local_image_ctx)->read_only_mask =
+ ~librbd::IMAGE_READ_ONLY_FLAG_NON_PRIMARY;
+
{
std::scoped_lock locker{(*m_local_image_ctx)->owner_lock,
(*m_local_image_ctx)->image_lock};