extern const char *ceph_cap_op_name(int op);
+/* extra info for cap import/export */
+struct ceph_mds_cap_peer {
+ __le64 cap_id;
+ __le32 seq;
+ __le32 mseq;
+ __le32 mds;
+ __u8 flags;
+} __attribute__ ((packed));
+
/*
* caps message, used for capability callbacks, acks, requests, etc.
*/
__le32 xattr_len;
__le64 xattr_version;
- /* filelock */
- __le64 size, max_size, truncate_size;
- __le32 truncate_seq;
- struct ceph_timespec mtime, atime, ctime;
- struct ceph_file_layout layout;
- __le32 time_warp_seq;
-} __attribute__ ((packed));
-
-/* extra info for cap import/export */
-struct ceph_mds_cap_peer {
- __le64 cap_id;
- __le32 seq;
- __le32 mseq;
- __le32 mds;
- __u8 flags;
+ union {
+ /* all except export */
+ struct {
+ /* filelock */
+ __le64 size, max_size, truncate_size;
+ __le32 truncate_seq;
+ struct ceph_timespec mtime, atime, ctime;
+ struct ceph_file_layout layout;
+ __le32 time_warp_seq;
+ };
+ /* export message */
+ struct ceph_mds_cap_peer peer;
+ };
} __attribute__ ((packed));
/* cap release msg head */
p != rejoin_slave_exports.end();
++p) {
CInode *in = get_inode(p->first);
+ assert(in);
for (map<client_t,Capability::Export>::iterator q = p->second.second.begin();
q != p->second.second.end();
++q) {
q != p->second.end();
++q) {
Capability *cap = in->get_client_cap(q->first);
+ assert(cap);
if (cap->is_new())
in->remove_client_cap(q->first);
}
p != stat.client_map.end();
++p) {
Session *session = mds->sessionmap.get_session(entity_name_t::CLIENT(p->first.v));
+ assert(session);
session->dec_importing();
}
}
p != it->second.client_map.end();
++p) {
Session *session = mds->sessionmap.get_session(entity_name_t::CLIENT(p->first.v));
+ assert(session);
session->dec_importing();
}
}
p != client_reconnect_gather.end();
++p) {
Session *session = mds->sessionmap.get_session(entity_name_t::CLIENT(p->v));
+ assert(session);
dout(1) << "reconnect gave up on " << session->info.inst << dendl;
kill_session(session);
failed_reconnects++;
if (head.op == CEPH_CAP_OP_IMPORT)
::decode(peer, p);
else if (head.op == CEPH_CAP_OP_EXPORT)
- memcpy(&peer, &head.size, sizeof(peer));
+ memcpy(&peer, &head.peer, sizeof(peer));
}
}
void encode_payload(uint64_t features) {
// record peer in unused fields of cap export message
if ((features & CEPH_FEATURE_EXPORT_PEER) && head.op == CEPH_CAP_OP_EXPORT)
- memcpy(&head.size, &peer, sizeof(peer));
+ memcpy(&head.peer, &peer, sizeof(peer));
::encode(head, payload);
::encode_nohead(snapbl, payload);