From bfb46664ba5db34432d1b0b30e1e2e594f921ec5 Mon Sep 17 00:00:00 2001 From: Igor Fedotov Date: Fri, 4 Nov 2022 21:43:25 +0300 Subject: [PATCH] mds: do not acquire xlock in xlockdone state Fixes: https://tracker.ceph.com/issues/49132 Signed-off-by: Igor Fedotov (cherry picked from commit 2e37d1e3c4af071d4e09df603c141f38cadda69f) --- src/mds/Locker.cc | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/mds/Locker.cc b/src/mds/Locker.cc index a73c4225cbf..409185f7398 100644 --- a/src/mds/Locker.cc +++ b/src/mds/Locker.cc @@ -1925,8 +1925,13 @@ bool Locker::xlock_start(SimpleLock *lock, MDRequestRef& mut) } if (!lock->is_stable() && (lock->get_state() != LOCK_XLOCKDONE || - lock->get_xlock_by_client() != client || - lock->is_waiter_for(SimpleLock::WAIT_STABLE))) + lock->get_xlock_by_client() != client || + lock->is_waiter_for(SimpleLock::WAIT_STABLE))) + break; + // Avoid unstable XLOCKDONE state reset, + // see: https://tracker.ceph.com/issues/49132 + if (lock->get_state() == LOCK_XLOCKDONE && + lock->get_type() == CEPH_LOCK_IFILE) break; if (lock->get_state() == LOCK_LOCK || lock->get_state() == LOCK_XLOCKDONE) { -- 2.47.3