From: Yan, Zheng Date: Thu, 6 Dec 2018 07:30:44 +0000 (+0800) Subject: client: set cap->wanted when adding new cap X-Git-Tag: v14.1.0~293^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=314660a46a8a1af97f70b2bac05b2f6fa5d23bc4;p=ceph.git client: set cap->wanted when adding new cap This avoids unnecessary cap message if cap is added by open/create request reply. Signed-off-by: "Yan, Zheng" --- diff --git a/src/client/Client.cc b/src/client/Client.cc index 33ab8f198e4..e69c001530b 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -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); diff --git a/src/client/Client.h b/src/client/Client.h index 5c7e480e849..4282f42e2d7 100644 --- a/src/client/Client.h +++ b/src/client/Client.h @@ -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);