From c055b5680965a223ac2231fd12223035085d8e4b Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Wed, 25 Mar 2009 11:41:48 -0700 Subject: [PATCH] mds: fix auth_pin vs xlocks Look at lock->is_stable() to determine whether auth_pin should be taken or dropped in xlock_start() and eval_gather(). --- src/mds/Locker.cc | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/mds/Locker.cc b/src/mds/Locker.cc index 50b1bf00c0c83..858c39b258575 100644 --- a/src/mds/Locker.cc +++ b/src/mds/Locker.cc @@ -510,13 +510,17 @@ void Locker::eval_gather(SimpleLock *lock, bool first) break; } - lock->get_parent()->auth_unpin(lock); } + lock->set_state(next); + + if (lock->get_parent()->is_auth() && + lock->is_stable()) + lock->get_parent()->auth_unpin(lock); + if (caps) in->try_drop_loner(); - lock->set_state(next); lock->finish_waiters(SimpleLock::WAIT_STABLE|SimpleLock::WAIT_WR|SimpleLock::WAIT_RD|SimpleLock::WAIT_XLOCK); if (caps) @@ -2309,11 +2313,12 @@ void Locker::simple_xlock(SimpleLock *lock) if (lock->get_cap_shift()) in = (CInode *)lock->get_parent(); + if (lock->is_stable()) + lock->get_parent()->auth_pin(lock); + switch (lock->get_state()) { case LOCK_LOCK: - lock->get_parent()->auth_pin(lock); - case LOCK_XLOCKDONE: - lock->set_state(LOCK_LOCK_XLOCK); break; + case LOCK_XLOCKDONE: lock->set_state(LOCK_LOCK_XLOCK); break; default: assert(0); } -- 2.39.5