From: Greg Farnum Date: Wed, 12 May 2010 21:08:33 +0000 (-0700) Subject: mds: handle file locking in MClientCaps on a reconnect. X-Git-Tag: v0.22~346^2~12 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=fa058c414c11aa8345ee29126ccf265470b30e2f;p=ceph.git mds: handle file locking in MClientCaps on a reconnect. --- diff --git a/src/mds/Locker.cc b/src/mds/Locker.cc index 01e5e6292d6..aef61c6a42d 100644 --- a/src/mds/Locker.cc +++ b/src/mds/Locker.cc @@ -1985,6 +1985,28 @@ bool Locker::_do_cap_update(CInode *in, Capability *cap, } } + if (dirty & CEPH_CAP_FLOCK_EXCL) { + int num_locks; + bufferlist::iterator bli = m->flockbl.begin(); + ::decode(num_locks, bli); + for ( int i=0; i < num_locks; ++i) { + ceph_filelock decoded_lock; + ::decode(decoded_lock, bli); + in->fcntl_locks.held_locks. + insert(pair<__u64, ceph_filelock>(decoded_lock.start, decoded_lock)); + ++in->fcntl_locks.client_held_lock_counts[decoded_lock.client]; + } + ::decode(num_locks, bli); + for ( int i=0; i < num_locks; ++i) { + ceph_filelock decoded_lock; + ::decode(decoded_lock, bli); + in->flock_locks.held_locks. + insert(pair<__u64, ceph_filelock>(decoded_lock.start, decoded_lock)); + ++in->flock_locks.client_held_lock_counts[decoded_lock.client]; + } + } + dirty &= ~(CEPH_CAP_FLOCK_SHARED|CEPH_CAP_FLOCK_EXCL); + if (!dirty && !change_max) return false;