From: Mykola Golub Date: Tue, 20 Sep 2016 13:45:41 +0000 (+0300) Subject: librbd: use counter to track exclusive lock block/unblock requests X-Git-Tag: v11.0.1~77^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=5a68e334d8b3fc3a3654e2d000d79f26a2c8219c;p=ceph.git librbd: use counter to track exclusive lock block/unblock requests It's possible the watch/notify message is duplicated resulting in two concurrent block_requests() call. Signed-off-by: Mykola Golub --- diff --git a/src/librbd/ExclusiveLock.cc b/src/librbd/ExclusiveLock.cc index 6b3013c58224..1d6b44bf8e11 100644 --- a/src/librbd/ExclusiveLock.cc +++ b/src/librbd/ExclusiveLock.cc @@ -82,7 +82,7 @@ bool ExclusiveLock::accept_requests(int *ret_val) const { Mutex::Locker locker(m_lock); bool accept_requests = (!is_shutdown() && m_state == STATE_LOCKED && - !m_request_blocked); + m_request_blocked_count == 0); *ret_val = m_request_blocked_ret_val; ldout(m_image_ctx.cct, 20) << this << " " << __func__ << "=" @@ -93,9 +93,10 @@ bool ExclusiveLock::accept_requests(int *ret_val) const { template void ExclusiveLock::block_requests(int r) { Mutex::Locker locker(m_lock); - assert(!m_request_blocked); - m_request_blocked = true; - m_request_blocked_ret_val = r; + m_request_blocked_count++; + if (m_request_blocked_ret_val == 0) { + m_request_blocked_ret_val = r; + } ldout(m_image_ctx.cct, 20) << this << " " << __func__ << dendl; } @@ -103,9 +104,11 @@ void ExclusiveLock::block_requests(int r) { template void ExclusiveLock::unblock_requests() { Mutex::Locker locker(m_lock); - assert(m_request_blocked); - m_request_blocked = false; - m_request_blocked_ret_val = 0; + assert(m_request_blocked_count > 0); + m_request_blocked_count--; + if (m_request_blocked_count == 0) { + m_request_blocked_ret_val = 0; + } ldout(m_image_ctx.cct, 20) << this << " " << __func__ << dendl; } diff --git a/src/librbd/ExclusiveLock.h b/src/librbd/ExclusiveLock.h index 5543bbb01f57..93ddd903e101 100644 --- a/src/librbd/ExclusiveLock.h +++ b/src/librbd/ExclusiveLock.h @@ -151,7 +151,7 @@ private: ActionsContexts m_actions_contexts; - bool m_request_blocked = false; + uint32_t m_request_blocked_count = 0; int m_request_blocked_ret_val = 0; std::string encode_lock_cookie() const;