__le64 xattr_version;
} __attribute__ ((packed));
-struct ceph_mds_caps_body_legacy {
- 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;
- } __attribute__ ((packed));
- /* export message */
- struct ceph_mds_cap_peer peer;
- } __attribute__ ((packed));
+struct ceph_mds_caps_non_export_body {
+ /* all except export */
+ /* 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));
+
+struct ceph_mds_caps_export_body {
+ /* export message */
+ struct ceph_mds_cap_peer peer;
} __attribute__ ((packed));
/* cap release msg head */
WRITE_RAW_ENCODER(ceph_mds_request_release)
WRITE_RAW_ENCODER(ceph_filelock)
WRITE_RAW_ENCODER(ceph_mds_caps_head)
-WRITE_RAW_ENCODER(ceph_mds_caps_body_legacy)
+WRITE_RAW_ENCODER(ceph_mds_caps_export_body)
+WRITE_RAW_ENCODER(ceph_mds_caps_non_export_body)
WRITE_RAW_ENCODER(ceph_mds_cap_peer)
WRITE_RAW_ENCODER(ceph_mds_cap_release)
WRITE_RAW_ENCODER(ceph_mds_cap_item)
using ceph::decode;
auto p = payload.cbegin();
decode(head, p);
- ceph_mds_caps_body_legacy body;
- decode(body, p);
if (head.op == CEPH_CAP_OP_EXPORT) {
+ ceph_mds_caps_export_body body;
+ decode(body, p);
peer = body.peer;
+ p += (sizeof(ceph_mds_caps_non_export_body) -
+ sizeof(ceph_mds_caps_export_body));
} else {
+ ceph_mds_caps_non_export_body body;
+ decode(body, p);
size = body.size;
max_size = body.max_size;
truncate_size = body.truncate_size;
head.xattr_len = xattrbl.length();
encode(head, payload);
- ceph_mds_caps_body_legacy body;
+ static_assert(sizeof(ceph_mds_caps_non_export_body) >
+ sizeof(ceph_mds_caps_export_body));
if (head.op == CEPH_CAP_OP_EXPORT) {
- memset(&body, 0, sizeof(body));
+ ceph_mds_caps_export_body body;
body.peer = peer;
+ encode(body, payload);
+ payload.append_zero(sizeof(ceph_mds_caps_non_export_body) -
+ sizeof(ceph_mds_caps_export_body));
} else {
+ ceph_mds_caps_non_export_body body;
body.size = size;
body.max_size = max_size;
body.truncate_size = truncate_size;
ctime.encode_timeval(&body.ctime);
layout.to_legacy(&body.layout);
body.time_warp_seq = time_warp_seq;
+ encode(body, payload);
}
- encode(body, payload);
ceph::encode_nohead(snapbl, payload);
middle = xattrbl;