]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
client: don't send cap release when removing exported cap
authorYan, Zheng <zheng.z.yan@intel.com>
Fri, 21 Feb 2014 02:06:29 +0000 (10:06 +0800)
committerYan, Zheng <zheng.z.yan@intel.com>
Sat, 1 Mar 2014 05:04:05 +0000 (13:04 +0800)
Signed-off-by: Yan, Zheng <zheng.z.yan@intel.com>
src/client/Client.cc
src/client/Client.h

index 1335b584a5b1f8e2711859d76bb2012cd80124f0..cc3a34651623c7644ed00f317a63da1be434bc9f 100644 (file)
@@ -2961,7 +2961,7 @@ void Client::add_update_cap(Inode *in, MetaSession *mds_session, uint64_t cap_id
     signal_cond_list(in->waitfor_caps);
 }
 
-void Client::remove_cap(Cap *cap)
+void Client::remove_cap(Cap *cap, bool queue_release)
 {
   Inode *in = cap->inode;
   MetaSession *session = cap->session;
@@ -2969,14 +2969,16 @@ void Client::remove_cap(Cap *cap)
 
   ldout(cct, 10) << "remove_cap mds." << mds << " on " << *in << dendl;
   
-  if (!session->release)
-    session->release = new MClientCapRelease;
-  ceph_mds_cap_item i;
-  i.ino = in->ino;
-  i.cap_id = cap->cap_id;
-  i.seq = cap->issue_seq;
-  i.migrate_seq = cap->mseq;
-  session->release->caps.push_back(i);
+  if (queue_release) {
+    if (!session->release)
+      session->release = new MClientCapRelease;
+    ceph_mds_cap_item i;
+    i.ino = in->ino;
+    i.cap_id = cap->cap_id;
+    i.seq = cap->issue_seq;
+    i.migrate_seq = cap->mseq;
+    session->release->caps.push_back(i);
+  }
 
   if (in->auth_cap == cap) {
     if (in->flushing_cap_item.is_on_list()) {
@@ -3006,14 +3008,14 @@ void Client::remove_cap(Cap *cap)
 void Client::remove_all_caps(Inode *in)
 {
   while (!in->caps.empty())
-    remove_cap(in->caps.begin()->second);
+    remove_cap(in->caps.begin()->second, true);
 }
 
 void Client::remove_session_caps(MetaSession *mds) 
 {
   while (mds->caps.size()) {
     Cap *cap = *mds->caps.begin();
-    remove_cap(cap);
+    remove_cap(cap, false);
   }
 }
 
@@ -3036,7 +3038,7 @@ void Client::trim_caps(MetaSession *s, int max)
        continue;
       }
       ldout(cct, 20) << " removing unused, unneeded non-auth cap on " << *in << dendl;
-      remove_cap(cap);
+      remove_cap(cap, true);
       trimmed++;
     } else {
       ldout(cct, 20) << " trying to trim dentries for " << *in << dendl;
@@ -3557,7 +3559,7 @@ void Client::handle_cap_export(MetaSession *session, Inode *in, MClientCaps *m)
              << " EXPORT from mds." << mds
              << ", just removing old cap" << dendl;
 
-    remove_cap(cap);
+    remove_cap(cap, false);
   }
   // else we already released it
 
index bd30c09492f415e4d0da572a3b27333a5c2f6933..fb5be31be75512a549529d12f0186e8aaba4e51f 100644 (file)
@@ -445,7 +445,7 @@ protected:
   void add_update_cap(Inode *in, MetaSession *session, uint64_t cap_id,
                      unsigned issued, unsigned seq, unsigned mseq, inodeno_t realm,
                      int flags);
-  void remove_cap(Cap *cap);
+  void remove_cap(Cap *cap, bool queue_release);
   void remove_all_caps(Inode *in);
   void remove_session_caps(MetaSession *session);
   void mark_caps_dirty(Inode *in, int caps);