| 6036 | } |
| 6037 | |
| 6038 | void 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 | } |
nothing calls this directly
no test coverage detected