assert(m_image_ctx.owner_lock.is_locked());
bool write_op = req->is_write_op();
- bool lock_required = (write_op && is_lock_required()) ||
- (!write_op && m_require_lock_on_read);
+ bool lock_required = (m_image_ctx.exclusive_lock != nullptr &&
+ ((write_op && is_lock_required()) ||
+ (!write_op && m_require_lock_on_read)));
if (lock_required && !m_image_ctx.get_exclusive_lock_policy()->may_auto_request_lock()) {
lderr(cct) << "op requires exclusive lock" << dendl;
{
RWLock::WLocker owner_locker(m_image_ctx.owner_lock);
+ m_image_ctx.aio_work_queue->clear_require_lock_on_read();
m_image_ctx.exclusive_lock = nullptr;
}
lderr(cct) << "failed to shut down exclusive lock: " << cpp_strerror(r)
<< dendl;
} else {
- m_image_ctx.aio_work_queue->clear_require_lock_on_read();
m_image_ctx.aio_work_queue->unblock_writes();
}
{
RWLock::WLocker owner_locker(m_image_ctx.owner_lock);
+ m_image_ctx.aio_work_queue->clear_require_lock_on_read();
m_image_ctx.exclusive_lock = nullptr;
}
- m_image_ctx.aio_work_queue->clear_require_lock_on_read();
m_image_ctx.aio_work_queue->unblock_writes();
m_image_ctx.image_watcher->flush(util::create_context_callback<
ExclusiveLock<I>, &ExclusiveLock<I>::complete_shutdown>(this));