]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: fix eval_gather on capless inode locks
authorSage Weil <sage@newdream.net>
Thu, 12 Mar 2009 18:28:26 +0000 (11:28 -0700)
committerSage Weil <sage@newdream.net>
Thu, 12 Mar 2009 21:20:05 +0000 (14:20 -0700)
There are inode locks without caps (e.g. INEST).

src/mds/Locker.cc

index 5cc57ca70cf9f5e03feb32b3167f4fb59b7a65fa..0e28cb8a73119b3eab3dad3bceb8f71d36da4f3f 100644 (file)
@@ -383,11 +383,12 @@ void Locker::eval_gather(SimpleLock *lock)
   int next = lock->get_next_state();
 
   CInode *in = 0;
-  if (lock->get_cap_shift())
+  bool caps = lock->get_cap_shift();
+  if (lock->get_type() != CEPH_LOCK_DN)
     in = (CInode *)lock->get_parent();
 
   int loner_issued = 0, other_issued = 0;
-  if (in) {
+  if (caps) {
     in->get_caps_issued(&loner_issued, &other_issued, lock->get_cap_shift(), 3);
     dout(10) << " next state is " << lock->get_state_name(next) 
             << " issued/allows loner " << gcap_string(loner_issued)
@@ -495,13 +496,13 @@ void Locker::eval_gather(SimpleLock *lock)
       lock->get_parent()->auth_unpin(lock);
     }
 
-    if (in)
+    if (caps)
       in->try_drop_loner();
 
     lock->set_state(next);
     lock->finish_waiters(SimpleLock::WAIT_STABLE|SimpleLock::WAIT_WR|SimpleLock::WAIT_RD|SimpleLock::WAIT_XLOCK);
     
-    if (in)
+    if (caps)
       issue_caps(in);
 
     if (lock->get_parent()->is_auth() &&