From: Greg Farnum Date: Sat, 29 Jan 2011 00:44:50 +0000 (-0800) Subject: Locker: Drop loner correctly! X-Git-Tag: v0.25~231^2~45 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=9b42e8ebc3dba8c534024f73912048b7b84cb459;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 1427040a2cbb..a58d1392ebd9 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;