void Client::wake_inode_waiters(MetaSession *s)
{
- xlist<Cap*>::iterator iter = s->caps.begin();
- while (!iter.end()){
- signal_cond_list((*iter)->inode->waitfor_caps);
- ++iter;
+ for (const auto &cap : s->caps) {
+ signal_cond_list(cap->inode.waitfor_caps);
}
}
}
mds_rank_t mds = mds_session->mds_num;
- const auto &capem = in->caps.emplace(std::piecewise_construct, std::forward_as_tuple(mds), std::forward_as_tuple(in, mds_session));
+ const auto &capem = in->caps.emplace(std::piecewise_construct, std::forward_as_tuple(mds), std::forward_as_tuple(*in, mds_session));
Cap &cap = capem.first->second;
if (!capem.second) {
/*
void Client::remove_cap(Cap *cap, bool queue_release)
{
- Inode *in = cap->inode;
+ auto &in = cap->inode;
MetaSession *session = cap->session;
mds_rank_t mds = cap->session->mds_num;
- ldout(cct, 10) << __func__ << " mds." << mds << " on " << *in << dendl;
+ ldout(cct, 10) << __func__ << " mds." << mds << " on " << in << dendl;
if (queue_release) {
session->enqueue_cap_release(
- in->ino,
+ in.ino,
cap->cap_id,
cap->issue_seq,
cap->mseq,
cap_epoch_barrier);
}
- if (in->auth_cap == cap) {
- if (in->flushing_cap_item.is_on_list()) {
+ if (in.auth_cap == cap) {
+ if (in.flushing_cap_item.is_on_list()) {
ldout(cct, 10) << " removing myself from flushing_cap list" << dendl;
- in->flushing_cap_item.remove_myself();
+ in.flushing_cap_item.remove_myself();
}
- in->auth_cap = NULL;
+ in.auth_cap = NULL;
}
- size_t n = in->caps.erase(mds);
+ size_t n = in.caps.erase(mds);
assert(n == 1);
cap = nullptr;
- if (!in->is_any_caps()) {
- ldout(cct, 15) << __func__ << " last one, closing snaprealm " << in->snaprealm << dendl;
- in->snaprealm_item.remove_myself();
- put_snap_realm(in->snaprealm);
- in->snaprealm = 0;
+ if (!in.is_any_caps()) {
+ ldout(cct, 15) << __func__ << " last one, closing snaprealm " << in.snaprealm << dendl;
+ in.snaprealm_item.remove_myself();
+ put_snap_realm(in.snaprealm);
+ in.snaprealm = 0;
}
}
while (s->caps.size()) {
Cap *cap = *s->caps.begin();
- Inode *in = cap->inode;
+ InodeRef in(&cap->inode);
bool dirty_caps = false, cap_snaps = false;
if (in->auth_cap == cap) {
cap_snaps = !in->cap_snaps.empty();
remove_cap(cap, false);
signal_cond_list(in->waitfor_caps);
if (cap_snaps) {
- InodeRef tmp_ref(in);
in->cap_snaps.clear();
}
if (dirty_caps) {
}
in->flushing_caps = 0;
in->mark_caps_clean();
- put_inode(in);
+ put_inode(in.get());
}
}
s->flushing_caps_tids.clear();
std::set<InodeRef> anchor; /* prevent put_inode from deleting all caps during traversal */
while ((caps_size - trimmed) > max && !p.end()) {
Cap *cap = *p;
- InodeRef in(cap->inode);
+ InodeRef in(&cap->inode);
// Increment p early because it will be invalidated if cap
// is deleted inside remove_cap
{
s->readonly = true;
for (xlist<Cap*>::iterator p = s->caps.begin(); !p.end(); ++p) {
- Inode *in = (*p)->inode;
- if (in->caps_wanted() & CEPH_CAP_FILE_WR)
- signal_cond_list(in->waitfor_caps);
+ auto &in = (*p)->inode;
+ if (in.caps_wanted() & CEPH_CAP_FILE_WR)
+ signal_cond_list(in.waitfor_caps);
}
}
void Client::kick_maxsize_requests(MetaSession *session)
{
- xlist<Cap*>::iterator iter = session->caps.begin();
- while (!iter.end()){
- (*iter)->inode->requested_max_size = 0;
- (*iter)->inode->wanted_max_size = 0;
- signal_cond_list((*iter)->inode->waitfor_caps);
- ++iter;
+ for (const auto &cap : session->caps) {
+ auto &in = cap->inode;
+ in.requested_max_size = 0;
+ in.wanted_max_size = 0;
+ signal_cond_list(in.waitfor_caps);
}
}
class Cap {
public:
Cap() = delete;
- Cap(Inode *i, MetaSession *s) :
- session(s), inode(i), cap_id(0), issued(0),
- implemented(0), wanted(0), seq(0), issue_seq(0), mseq(0), gen(s->cap_gen),
- latest_perms(), cap_item(this) {
+ Cap(Inode &i, MetaSession *s) : inode(i),
+ session(s),
+ gen(s->cap_gen),
+ cap_item(this)
+ {
s->caps.push_back(&cap_item);
}
~Cap() {
void dump(Formatter *f) const;
+ Inode &inode;
MetaSession *session;
- Inode *inode;
- uint64_t cap_id;
- unsigned issued;
- unsigned implemented;
- unsigned wanted; // as known to mds.
- uint64_t seq, issue_seq;
- __u32 mseq; // migration seq
+ uint64_t cap_id = 0;
+ unsigned issued = 0;
+ unsigned implemented = 0;
+ unsigned wanted = 0; // as known to mds.
+ uint64_t seq = 0;
+ uint64_t issue_seq = 0;
+ __u32 mseq = 0; // migration seq
__u32 gen;
UserPerm latest_perms;