]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
client: simplify remove_cap interface 12161/head
authorJohn Spray <john.spray@redhat.com>
Tue, 29 Nov 2016 17:13:29 +0000 (17:13 +0000)
committerJohn Spray <john.spray@redhat.com>
Tue, 29 Nov 2016 17:15:08 +0000 (17:15 +0000)
All this complexity only existed to handle the
case where trim wanted to iterate over an xlist
without getting disturbed by a deletion.  We
can simply increment the iterator before
maybe-deleting the Cap.

Signed-off-by: John Spray <john.spray@redhat.com>
src/client/Client.cc
src/client/MetaSession.h

index 790c51549983bacb2efc9bad7358f9e3a92424f1..b3808a2b9c8f6965cf8a6e50f66e3f026929d8ea 100644 (file)
@@ -3885,12 +3885,9 @@ void Client::remove_cap(Cap *cap, bool queue_release)
   assert(in->caps.count(mds));
   in->caps.erase(mds);
 
-  if (cap == session->s_cap_iterator) {
-    cap->inode = NULL;
-  } else {
-    cap->cap_item.remove_myself();
-    delete cap;
-  }
+  cap->cap_item.remove_myself();
+  delete cap;
+  cap = nullptr;
 
   if (!in->is_any_caps()) {
     ldout(cct, 15) << "remove_cap last one, closing snaprealm " << in->snaprealm << dendl;
@@ -3985,9 +3982,12 @@ void Client::trim_caps(MetaSession *s, int max)
   xlist<Cap*>::iterator p = s->caps.begin();
   while ((caps_size - trimmed) > max && !p.end()) {
     Cap *cap = *p;
-    s->s_cap_iterator = cap;
     Inode *in = cap->inode;
 
+    // Increment p early because it will be invalidated if cap
+    // is deleted inside remove_cap
+    ++p;
+
     if (in->caps.size() > 1 && cap != in->auth_cap) {
       int mine = cap->issued | cap->implemented;
       int oissued = in->auth_cap ? in->auth_cap->issued : 0;
@@ -4023,14 +4023,7 @@ void Client::trim_caps(MetaSession *s, int max)
        trimmed++;
       }
     }
-
-    ++p;
-    if (!cap->inode) {
-      cap->cap_item.remove_myself();
-      delete cap;
-    }
   }
-  s->s_cap_iterator = NULL;
 
   if (s->caps.size() > max)
     _invalidate_kernel_dcache();
index 0d8c15263557dcd20b4790b05f00e0ae2a823d91..af84615fc1d825d71821923b31d0192204d4ff92 100644 (file)
@@ -47,15 +47,13 @@ struct MetaSession {
   std::set<ceph_tid_t> flushing_caps_tids;
   std::set<Inode*> early_flushing_caps;
 
-  Cap *s_cap_iterator;
-
   MClientCapRelease *release;
   
   MetaSession()
     : mds_num(-1), con(NULL),
       seq(0), cap_gen(0), cap_renew_seq(0), num_caps(0),
       state(STATE_NEW), mds_state(0), readonly(false),
-      s_cap_iterator(NULL), release(NULL)
+      release(NULL)
   {}
   ~MetaSession();