]> 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>
Mon, 21 Oct 2019 02:52:21 +0000 (10:52 +0800)
This avoids unnecessary cap message if cap is added by open/create
request reply.

Signed-off-by: "Yan, Zheng" <zyan@redhat.com>
(cherry picked from commit 314660a46a8a1af97f70b2bac05b2f6fa5d23bc4)

 Conflicts:
src/client/Client.h

src/client/Client.cc
src/client/Client.h

index b792f675cfdebd8e9df9c512c72b282b40dd6a21..426579a18de2146eedbdedc315994ee36245ba5e 100644 (file)
@@ -911,9 +911,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;
@@ -3920,8 +3920,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()) {
     assert(in->snaprealm == 0);
@@ -3981,6 +3981,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;
@@ -4845,8 +4849,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));
@@ -4895,7 +4899,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 182fd93536f8990c2ccdbe1ab8b3336a723bd1e4..622056bf2852f4f9957308d18a7de4fba925b569 100644 (file)
@@ -627,8 +627,8 @@ protected:
   // 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);