MCPcopy Create free account
hub / github.com/ceph/ceph / handle_cap_grant

Method handle_cap_grant

src/client/Client.cc:6038–6204  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

6036}
6037
6038void Client::handle_cap_grant(MetaSession *session, Inode *in, Cap *cap, const MConstRef<MClientCaps>& m)
6039{
6040 mds_rank_t mds = session->mds_num;
6041 int used = get_caps_used(in);
6042 int wanted = in->caps_wanted();
6043 int flags = 0;
6044
6045 const unsigned new_caps = m->get_caps();
6046 const bool was_stale = session->cap_gen > cap->gen;
6047 ldout(cct, 5) << __func__ << " on in " << m->get_ino()
6048 << " mds." << mds << " seq " << m->get_seq()
6049 << " caps now " << ccap_string(new_caps)
6050 << " was " << ccap_string(cap->issued)
6051 << (was_stale ? " (stale)" : "") << dendl;
6052
6053 if (was_stale)
6054 cap->issued = cap->implemented = CEPH_CAP_PIN;
6055 cap->seq = m->get_seq();
6056 cap->gen = session->cap_gen;
6057
6058 check_cap_issue(in, new_caps);
6059
6060 // update inode
6061 int issued;
6062 in->caps_issued(&issued);
6063 issued |= in->caps_dirty();
6064
6065 if ((new_caps & CEPH_CAP_AUTH_SHARED) &&
6066 !(issued & CEPH_CAP_AUTH_EXCL)) {
6067 in->mode = m->head.mode;
6068 in->uid = m->head.uid;
6069 in->gid = m->head.gid;
6070 in->btime = m->btime;
6071 }
6072 bool deleted_inode = false;
6073 if ((new_caps & CEPH_CAP_LINK_SHARED) &&
6074 !(issued & CEPH_CAP_LINK_EXCL)) {
6075 in->nlink = m->head.nlink;
6076 if (in->nlink == 0)
6077 deleted_inode = true;
6078 }
6079 if (!(issued & CEPH_CAP_XATTR_EXCL) &&
6080 m->xattrbl.length() &&
6081 m->head.xattr_version > in->xattr_version) {
6082 auto p = m->xattrbl.cbegin();
6083 decode(in->xattrs, p);
6084 in->xattr_version = m->head.xattr_version;
6085 }
6086
6087 if ((new_caps & CEPH_CAP_FILE_SHARED) && m->dirstat_is_valid()) {
6088 in->dirstat.nfiles = m->get_nfiles();
6089 in->dirstat.nsubdirs = m->get_nsubdirs();
6090 }
6091
6092 if (new_caps & CEPH_CAP_ANY_RD) {
6093 update_inode_file_time(in, issued, m->get_time_warp_seq(),
6094 m->get_ctime(), m->get_mtime(), m->get_atime());
6095 }

Callers

nothing calls this directly

Calls 15

ccap_stringFunction · 0.85
ceph_deleg_caps_for_typeFunction · 0.85
caps_wantedMethod · 0.80
caps_issuedMethod · 0.80
caps_dirtyMethod · 0.80
dirstat_is_validMethod · 0.80
get_nfilesMethod · 0.80
get_nsubdirsMethod · 0.80
get_time_warp_seqMethod · 0.80
get_atimeMethod · 0.80
get_layoutMethod · 0.80

Tested by

no test coverage detected