]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
client: set cap->wanted when adding new cap
authorYan, Zheng <zyan@redhat.com>
Thu, 6 Dec 2018 07:30:44 +0000 (15:30 +0800)
committerYan, Zheng <zyan@redhat.com>
Tue, 15 Jan 2019 08:35:55 +0000 (16:35 +0800)
This avoids unnecessary cap message if cap is added by open/create
request reply.

Signed-off-by: "Yan, Zheng" <zyan@redhat.com>
src/client/Client.cc
src/client/Client.h

index 33ab8f198e442931ccb4bb177c59e883ed0e20a0..e69c001530b51930b2550820d22a1b89d82638d5 100644 (file)
@@ -925,9 +925,9 @@ Inode * Client::add_update_inode(InodeStat *st, utime_t from,
     return in;   // as with readdir returning indoes in different snaprealms (no caps!)
 
   if (in->snapid == CEPH_NOSNAP) {
-    add_update_cap(in, session, st->cap.cap_id, st->cap.caps, st->cap.seq,
-                  st->cap.mseq, inodeno_t(st->cap.realm), st->cap.flags,
-                  request_perms);
+    add_update_cap(in, session, st->cap.cap_id, st->cap.caps, st->cap.wanted,
+                  st->cap.seq, st->cap.mseq, inodeno_t(st->cap.realm),
+                  st->cap.flags, request_perms);
     if (in->auth_cap && in->auth_cap->session == session) {
       in->max_size = st->max_size;
       in->rstat = st->rstat;
@@ -3946,8 +3946,8 @@ void Client::check_cap_issue(Inode *in, Cap *cap, unsigned issued)
 }
 
 void Client::add_update_cap(Inode *in, MetaSession *mds_session, uint64_t cap_id,
-                           unsigned issued, unsigned seq, unsigned mseq, inodeno_t realm,
-                           int flags, const UserPerm& cap_perms)
+                           unsigned issued, unsigned wanted, unsigned seq, unsigned mseq,
+                           inodeno_t realm, int flags, const UserPerm& cap_perms)
 {
   if (!in->is_any_caps()) {
     ceph_assert(in->snaprealm == 0);
@@ -4007,6 +4007,10 @@ void Client::add_update_cap(Inode *in, MetaSession *mds_session, uint64_t cap_id
   cap.cap_id = cap_id;
   cap.issued = issued;
   cap.implemented |= issued;
+  if (ceph_seq_cmp(mseq, cap.mseq) > 0)
+    cap.wanted = wanted;
+  else
+    cap.wanted |= wanted;
   cap.seq = seq;
   cap.issue_seq = seq;
   cap.mseq = mseq;
@@ -4859,8 +4863,8 @@ void Client::handle_cap_import(MetaSession *session, Inode *in, MClientCaps *m)
   update_snap_trace(m->snapbl, &realm);
 
   add_update_cap(in, session, m->get_cap_id(),
-                m->get_caps(), m->get_seq(), m->get_mseq(), m->get_realm(),
-                CEPH_CAP_FLAG_AUTH, cap_perms);
+                m->get_caps(), m->get_wanted(), m->get_seq(), m->get_mseq(),
+                m->get_realm(), CEPH_CAP_FLAG_AUTH, cap_perms);
   
   if (cap && cap->cap_id == m->peer.cap_id) {
       remove_cap(cap, (m->peer.flags & CEPH_CAP_FLAG_RELEASE));
@@ -4909,7 +4913,7 @@ void Client::handle_cap_export(MetaSession *session, Inode *in, MClientCaps *m)
              adjust_session_flushing_caps(in, session, tsession);
          }
         } else {
-         add_update_cap(in, tsession, m->peer.cap_id, cap.issued,
+         add_update_cap(in, tsession, m->peer.cap_id, cap.issued, 0,
                         m->peer.seq - 1, m->peer.mseq, (uint64_t)-1,
                         &cap == in->auth_cap ? CEPH_CAP_FLAG_AUTH : 0,
                         cap.latest_perms);
index 5c7e480e8490c72af8b2ba807ffe26da1845b597..4282f42e2d7a47cef53558d4ef575afcf4ec244a 100644 (file)
@@ -651,8 +651,8 @@ public:
   // file caps
   void check_cap_issue(Inode *in, Cap *cap, unsigned issued);
   void add_update_cap(Inode *in, MetaSession *session, uint64_t cap_id,
-                     unsigned issued, unsigned seq, unsigned mseq, inodeno_t realm,
-                     int flags, const UserPerm& perms);
+                     unsigned issued, unsigned wanted, unsigned seq, unsigned mseq,
+                     inodeno_t realm, int flags, const UserPerm& perms);
   void remove_cap(Cap *cap, bool queue_release);
   void remove_all_caps(Inode *in);
   void remove_session_caps(MetaSession *session);