]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: fix CDir::take_waiting() on dentry waiters
authorSage Weil <sage.weil@dreamhost.com>
Wed, 23 Feb 2011 19:55:06 +0000 (11:55 -0800)
committerSage Weil <sage.weil@dreamhost.com>
Wed, 23 Feb 2011 19:55:06 +0000 (11:55 -0800)
Using take_dentry_waiting() means we double-put the DNWAITER pin.  It's
also way slower.

Signed-off-by: Sage Weil <sage.weil@dreamhost.com>
src/mds/CDir.cc

index 2c991885aaa70d640a828fad67bff60294d608b5..68616c4b1abd89a841972c595ff838b08bca0b52 100644 (file)
@@ -1001,14 +1001,13 @@ void CDir::add_waiter(uint64_t tag, Context *c)
 void CDir::take_waiting(uint64_t mask, list<Context*>& ls)
 {
   if ((mask & WAIT_DENTRY) && waiting_on_dentry.size()) {
-    // take each each dentry waiter
-    map<string_snap_t, list<Context*> >::iterator it = 
-      waiting_on_dentry.begin(); 
-    while (it != waiting_on_dentry.end()) {
-      string name = it->first.name;
-      snapid_t snap = it->first.snapid;
-      it++;
-      take_dentry_waiting(name, snap, snap, ls);
+    // take all dentry waiters
+    while (!waiting_on_dentry.empty()) {
+      map<string_snap_t, list<Context*> >::iterator p = waiting_on_dentry.begin(); 
+      dout(10) << "take_waiting dentry " << p->first.name
+              << " snap " << p->first.snapid << " on " << *this << dendl;
+      ls.splice(ls.end(), p->second);
+      waiting_on_dentry.erase(p);
     }
     put(PIN_DNWAITER);
   }