]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
fixed memory leak in path_traverse
authorsageweil <sageweil@29311d96-e01e-0410-9327-a35deaab8ce9>
Wed, 10 Oct 2007 18:12:38 +0000 (18:12 +0000)
committersageweil <sageweil@29311d96-e01e-0410-9327-a35deaab8ce9>
Wed, 10 Oct 2007 18:12:38 +0000 (18:12 +0000)
git-svn-id: https://ceph.svn.sf.net/svnroot/ceph@1911 29311d96-e01e-0410-9327-a35deaab8ce9

branches/sage/mds/mds/Locker.cc
branches/sage/mds/mds/MDCache.cc

index 2ce9017dc7cab78d62d7543e4d9854842931eefa..0e6156cb80cc3e2060947e8a34c8590f00455a22 100644 (file)
@@ -1109,7 +1109,7 @@ bool Locker::simple_rdlock_try(SimpleLock *lock, Context *con)
 
   // wait!
   dout(7) << "simple_rdlock_try waiting on " << *lock << " on " << *lock->get_parent() << dendl;
-  lock->add_waiter(SimpleLock::WAIT_RD, con);
+  if (con) lock->add_waiter(SimpleLock::WAIT_RD, con);
   return false;
 }
 
index 4c4783470157b47feca1d4c2d54fdebee09ebf5f..9dbbbb0a011355244a7591e25ff4faa4fd17c13e 100644 (file)
@@ -3754,10 +3754,13 @@ void MDCache::dispatch(Message *m)
 
 Context *MDCache::_get_waiter(MDRequest *mdr, Message *req)
 {
-  if (mdr)
+  if (mdr) {
+    dout(20) << "_get_waiter retryrequest" << dendl;
     return new C_MDS_RetryRequest(this, mdr);
-  else
+  } else {
+    dout(20) << "_get_waiter retrymessage" << dendl;
     return new C_MDS_RetryMessage(mds, req);
+  }
 }
 
 int MDCache::path_traverse(MDRequest *mdr, Message *req,     // who
@@ -3840,8 +3843,11 @@ int MDCache::path_traverse(MDRequest *mdr, Message *req,     // who
 
     // must read directory hard data (permissions, x bit) to traverse
     if (!noperm && 
-       !mds->locker->simple_rdlock_try(&cur->authlock, _get_waiter(mdr, req))) 
+       !mds->locker->simple_rdlock_try(&cur->authlock, 0)) {
+      dout(7) << "traverse: waiting on authlock rdlock on " << *cur << dendl;
+      cur->authlock.add_waiter(SimpleLock::WAIT_RD, _get_waiter(mdr, req));
       return 1;
+    }
     
     // check permissions?
     // XXX