From: Greg Farnum Date: Sat, 29 Jan 2011 00:44:50 +0000 (-0800) Subject: Locker: Drop loner correctly! X-Git-Tag: v0.24.3~14 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=14c669c3f61dcb05fd3bc3418d740d4f12c8d285;p=ceph.git Locker: Drop loner correctly! 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 Signed-off-by: Greg Farnum --- diff --git a/src/mds/Locker.cc b/src/mds/Locker.cc index 9bc6e6357a7c..90e8110e484a 100644 --- a/src/mds/Locker.cc +++ b/src/mds/Locker.cc @@ -596,7 +596,7 @@ void Locker::eval_gather(SimpleLock *lock, bool first, bool *pneed_issue, listis_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;