From: Sage Weil Date: Tue, 11 Aug 2009 17:59:20 +0000 (-0700) Subject: mds: fix multiclient RD+WR loner logic X-Git-Tag: v0.13~82 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=26f6a8e48ae575f17c850e28e969d55bceefbc0f;p=ceph.git mds: fix multiclient RD+WR loner logic We want to go mix if there is a mix of RD and WR wanted, not just multiple writers. --- diff --git a/src/mds/CInode.h b/src/mds/CInode.h index a51070bcf0df..e09b239b2c10 100644 --- a/src/mds/CInode.h +++ b/src/mds/CInode.h @@ -549,7 +549,8 @@ public: it != client_caps.end(); it++) if (!it->second->is_stale() && - ((it->second->wanted() & CEPH_CAP_ANY_WR) || inode.is_dir())) { + ((it->second->wanted() & (CEPH_CAP_ANY_WR|CEPH_CAP_FILE_WR|CEPH_CAP_FILE_RD)) + || inode.is_dir())) { if (n) return false; n++; diff --git a/src/mds/Locker.cc b/src/mds/Locker.cc index 810c8c0ca7e0..ddf117d657b6 100644 --- a/src/mds/Locker.cc +++ b/src/mds/Locker.cc @@ -3095,7 +3095,7 @@ void Locker::file_eval(ScatterLock *lock, bool *need_issue) (in->inode.is_dir() && in->multiple_nonstale_caps())) { // FIXME.. :/ dout(20) << " should lose it" << dendl; // we should lose it. - if ((other_wanted & CEPH_CAP_GWR) || + if ((other_wanted & (CEPH_CAP_GRD|CEPH_CAP_GWR)) || lock->is_waiter_for(SimpleLock::WAIT_WR)) file_mixed(lock, need_issue); else if (!lock->is_wrlocked()) // let excl wrlocks drain first