]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
Locker: Drop loner correctly!
authorGreg Farnum <gregory.farnum@dreamhost.com>
Sat, 29 Jan 2011 00:44:50 +0000 (16:44 -0800)
committerGreg Farnum <gregory.farnum@dreamhost.com>
Sat, 29 Jan 2011 00:48:02 +0000 (16:48 -0800)
Our previous check for if we want to drop the loner was incorrect.
Now, it's fixed. Resolves a serious bug with inode write access.

Reported-by: Jim Schutt <jaschut@sandia.gov>
Signed-off-by: Greg Farnum <gregory.farnum@dreamhost.com>
src/mds/Locker.cc

index 9bc6e6357a7c25e1b9ff049cb1df296db80016ba..90e8110e484ac944da0fd241712cc2a583cdd799 100644 (file)
@@ -596,7 +596,7 @@ void Locker::eval_gather(SimpleLock *lock, bool first, bool *pneed_issue, list<C
 
     // drop loner before doing waiters
     if (caps &&
-       in->is_auth() && in->get_loner() >= 0 && in->get_wanted_loner() < 0) {
+       in->is_auth() && in->get_wanted_loner() != in->get_loner()) {
       dout(10) << "  trying to drop loner" << dendl;
       if (in->try_drop_loner()) {
        dout(10) << "  dropped loner" << dendl;
@@ -662,7 +662,7 @@ bool Locker::eval(CInode *in, int mask)
     eval_any(&in->policylock, &need_issue);
 
   // drop loner?
-  if (in->is_auth() && in->get_loner() >= 0 && in->get_wanted_loner() < 0) {
+  if (in->is_auth() && in->get_wanted_loner() != in->get_loner()) {
     dout(10) << "  trying to drop loner" << dendl;
     if (in->try_drop_loner()) {
       dout(10) << "  dropped loner" << dendl;