From: Greg Farnum Date: Thu, 29 Apr 2010 23:00:10 +0000 (-0700) Subject: mds: implement look_for_lock, for fcntl F_GETLK-style things X-Git-Tag: v0.22~346^2~26 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=0dbcdd848628e7222895cff1688d98d88067622a;p=ceph.git mds: implement look_for_lock, for fcntl F_GETLK-style things --- diff --git a/src/mds/Server.cc b/src/mds/Server.cc index f6f10d2f48d..32a136e3702 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -2660,7 +2660,7 @@ void Server::handle_client_file_readlock(MDRequest *mdr) << ", dropping request!" << dendl; return; } - lock_state->add_lock(checking_lock, false, false); + lock_state->look_for_lock(checking_lock); bufferlist lock_bl; ::encode(lock_state, lock_bl); diff --git a/src/mds/mdstypes.h b/src/mds/mdstypes.h index 8f29b1c5596..112d5f0b6e4 100644 --- a/src/mds/mdstypes.h +++ b/src/mds/mdstypes.h @@ -385,6 +385,28 @@ struct ceph_lock_state_t { return false; } + void look_for_lock(ceph_filelock& testing_lock) { + list overlapping_locks, self_overlapping_locks; + if (get_overlapping_locks(testing_lock, overlapping_locks)) { + split_by_owner(testing_lock, overlapping_locks, self_overlapping_locks); + } + if (!overlapping_locks.empty()) { //somebody else owns overlapping lock + if (CEPH_LOCK_EXCL == testing_lock.type) { //any lock blocks it + testing_lock = *(*overlapping_locks.begin()); + } else { + ceph_filelock *blocking_lock; + if ((blocking_lock = contains_exclusive_lock(overlapping_locks))) { + testing_lock = *blocking_lock; + } else { //nothing blocking! + testing_lock.type = CEPH_LOCK_UNLOCK; + } + } + return; + } + //if we get here, only our own locks block + testing_lock.type = CEPH_LOCK_UNLOCK; + } + /* * Remove lock(s) described in old_lock. This may involve splitting a * previous lock or making a previous lock smaller. @@ -659,13 +681,13 @@ private: } } - bool contains_exclusive_lock(list& locks) { + ceph_filelock *contains_exclusive_lock(list& locks) { for (list::iterator iter = locks.begin(); iter != locks.end(); ++iter) { - if (CEPH_LOCK_EXCL == (*iter)->type) return true; + if (CEPH_LOCK_EXCL == (*iter)->type) return *iter; } - return false; + return NULL; } public: