ldout(cct, 10) << " features 0x" << hex << features << dec << dendl;
// snap trace
+ SnapRealm *realm = NULL;
if (reply->snapbl.length())
- update_snap_trace(reply->snapbl);
+ update_snap_trace(reply->snapbl, &realm);
ldout(cct, 10) << " hrm "
<< " is_target=" << (int)reply->head.is_target
}
}
+ if (realm)
+ put_snap_realm(realm);
+
request->target = in;
return in;
}
}
-inodeno_t Client::update_snap_trace(bufferlist& bl, bool flush)
+void Client::update_snap_trace(bufferlist& bl, SnapRealm **realm_ret, bool flush)
{
- inodeno_t first_realm = 0;
+ SnapRealm *first_realm = NULL;
ldout(cct, 10) << "update_snap_trace len " << bl.length() << dendl;
map<SnapRealm*, SnapContext> dirty_realms;
while (!p.end()) {
SnapRealmInfo info;
::decode(info, p);
- if (first_realm == 0)
- first_realm = info.ino();
SnapRealm *realm = get_snap_realm(info.ino());
bool invalidate = false;
<< " <= " << realm->seq << " and same parent, SKIPPING" << dendl;
}
- put_snap_realm(realm);
+ if (!first_realm)
+ first_realm = realm;
+ else
+ put_snap_realm(realm);
}
for (map<SnapRealm*, SnapContext>::iterator q = dirty_realms.begin();
put_snap_realm(realm);
}
- return first_realm;
+ if (realm_ret)
+ *realm_ret = first_realm;
+ else
+ put_snap_realm(first_realm);
}
void Client::handle_snap(MClientSnap *m)
}
}
- update_snap_trace(m->bl, m->head.op != CEPH_SNAP_OP_DESTROY);
+ update_snap_trace(m->bl, NULL, m->head.op != CEPH_SNAP_OP_DESTROY);
if (realm) {
for (auto p = to_move.begin(); p != to_move.end(); ++p) {
}
// add/update it
- update_snap_trace(m->snapbl);
+ SnapRealm *realm = NULL;
+ 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);
if (cap && cap->cap_id == m->peer.cap_id) {
remove_cap(cap, (m->peer.flags & CEPH_CAP_FLAG_RELEASE));
}
+
+ if (realm)
+ put_snap_realm(realm);
if (in->auth_cap && in->auth_cap->session->mds_num == mds) {
// reflush any/all caps (if we are now the auth_cap)
SnapRealm *get_snap_realm_maybe(inodeno_t r);
void put_snap_realm(SnapRealm *realm);
bool adjust_realm_parent(SnapRealm *realm, inodeno_t parent);
- inodeno_t update_snap_trace(bufferlist& bl, bool must_flush=true);
- inodeno_t _update_snap_trace(vector<SnapRealmInfo>& trace);
+ void update_snap_trace(bufferlist& bl, SnapRealm **realm_ret, bool must_flush=true);
void invalidate_snaprealm_and_children(SnapRealm *realm);
Inode *open_snapdir(Inode *diri);