assert(in->caps.count(mds));
in->caps.erase(mds);
- if (cap == session->s_cap_iterator) {
- cap->inode = NULL;
- } else {
- cap->cap_item.remove_myself();
- delete cap;
- }
+ cap->cap_item.remove_myself();
+ delete cap;
+ cap = nullptr;
if (!in->is_any_caps()) {
ldout(cct, 15) << "remove_cap last one, closing snaprealm " << in->snaprealm << dendl;
xlist<Cap*>::iterator p = s->caps.begin();
while ((caps_size - trimmed) > max && !p.end()) {
Cap *cap = *p;
- s->s_cap_iterator = cap;
Inode *in = cap->inode;
+ // Increment p early because it will be invalidated if cap
+ // is deleted inside remove_cap
+ ++p;
+
if (in->caps.size() > 1 && cap != in->auth_cap) {
int mine = cap->issued | cap->implemented;
int oissued = in->auth_cap ? in->auth_cap->issued : 0;
trimmed++;
}
}
-
- ++p;
- if (!cap->inode) {
- cap->cap_item.remove_myself();
- delete cap;
- }
}
- s->s_cap_iterator = NULL;
if (s->caps.size() > max)
_invalidate_kernel_dcache();
std::set<ceph_tid_t> flushing_caps_tids;
std::set<Inode*> early_flushing_caps;
- Cap *s_cap_iterator;
-
MClientCapRelease *release;
MetaSession()
: mds_num(-1), con(NULL),
seq(0), cap_gen(0), cap_renew_seq(0), num_caps(0),
state(STATE_NEW), mds_state(0), readonly(false),
- s_cap_iterator(NULL), release(NULL)
+ release(NULL)
{}
~MetaSession();