on_finish->complete(r);
}
+template <typename I>
+int ManagedLock<I>::assert_header_locked() {
+ ldout(m_cct, 10) << dendl;
+
+ librados::ObjectReadOperation op;
+ {
+ Mutex::Locker locker(m_lock);
+ rados::cls::lock::assert_locked(&op, RBD_LOCK_NAME,
+ (m_mode == EXCLUSIVE ? LOCK_EXCLUSIVE :
+ LOCK_SHARED),
+ m_cookie,
+ managed_lock::util::get_watcher_lock_tag());
+ }
+
+ int r = m_ioctx.operate(m_oid, &op, nullptr);
+ if (r < 0) {
+ if (r == -EBLACKLISTED) {
+ ldout(m_cct, 5) << "client is not lock owner -- client blacklisted"
+ << dendl;
+ } else if (r == -ENOENT) {
+ ldout(m_cct, 5) << "client is not lock owner -- no lock detected"
+ << dendl;
+ } else if (r == -EBUSY) {
+ ldout(m_cct, 5) << "client is not lock owner -- owned by different client"
+ << dendl;
+ } else {
+ lderr(m_cct) << "failed to verify lock ownership: " << cpp_strerror(r)
+ << dendl;
+ }
+
+ return r;
+ }
+
+ return 0;
+}
+
template <typename I>
void ManagedLock<I>::shutdown_handler(int r, Context *on_finish) {
on_finish->complete(r);
void break_lock(const managed_lock::Locker &locker, bool force_break_lock,
Context *on_finish);
+ int assert_header_locked();
+
bool is_shutdown() const {
Mutex::Locker l(m_lock);
return is_state_shutdown();
int is_exclusive_lock_owner(ImageCtx *ictx, bool *is_owner)
{
- RWLock::RLocker l(ictx->owner_lock);
- *is_owner = (ictx->exclusive_lock != nullptr &&
- ictx->exclusive_lock->is_lock_owner());
+ *is_owner = false;
+
+ RWLock::RLocker owner_locker(ictx->owner_lock);
+ if (ictx->exclusive_lock == nullptr ||
+ !ictx->exclusive_lock->is_lock_owner()) {
+ return 0;
+ }
+
+ // might have been blacklisted by peer -- ensure we still own
+ // the lock by pinging the OSD
+ int r = ictx->exclusive_lock->assert_header_locked();
+ if (r < 0) {
+ return r;
+ }
+
+ *is_owner = true;
return 0;
}
image.lock_break(RBD_LOCK_MODE_EXCLUSIVE,
lock_owners[0]['owner'])
+ assert_raises(ConnectionShutdown,
+ blacklist_image.is_exclusive_lock_owner)
+
blacklist_rados.wait_for_latest_osdmap()
data = rand_data(256)
assert_raises(ConnectionShutdown,