From: Igor Fedotov Date: Fri, 4 Nov 2022 18:43:25 +0000 (+0300) Subject: mds: do not acquire xlock in xlockdone state X-Git-Tag: v17.2.6~168^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=bfb46664ba5db34432d1b0b30e1e2e594f921ec5;p=ceph.git 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) --- diff --git a/src/mds/Locker.cc b/src/mds/Locker.cc index a73c4225cbf2..409185f7398f 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) {