]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: handle file locking in MClientCaps on a reconnect.
authorGreg Farnum <gregf@hq.newdream.net>
Wed, 12 May 2010 21:08:33 +0000 (14:08 -0700)
committerGreg Farnum <gregf@hq.newdream.net>
Mon, 2 Aug 2010 17:39:56 +0000 (10:39 -0700)
src/mds/Locker.cc

index 01e5e6292d6129d8577662b55ab0346ff4fd8116..aef61c6a42d733140e9662d8b136c41f153afabc 100644 (file)
@@ -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;