X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=ceph%2Fsrc%2Fmessages%2FMClientCaps.h;h=77e8db1d0992bd201b693dab77e9ae2b531bbc24;hb=39ae355f72b1d71f2212a99f2bd9f6c1e0d35528;hp=01f5746c4394e841e9ec152705fc665a91b8b462;hpb=28e407b858acd3bddc89f68583571f771bb42e46;p=ceph.git diff --git a/ceph/src/messages/MClientCaps.h b/ceph/src/messages/MClientCaps.h index 01f5746c4..77e8db1d0 100644 --- a/ceph/src/messages/MClientCaps.h +++ b/ceph/src/messages/MClientCaps.h @@ -16,15 +16,20 @@ #define CEPH_MCLIENTCAPS_H #include "msg/Message.h" +#include "mds/mdstypes.h" #include "include/ceph_features.h" -#define CLIENT_CAPS_SYNC (0x1) +class MClientCaps final : public SafeMessage { +private: -class MClientCaps : public Message { - static const int HEAD_VERSION = 11; - static const int COMPAT_VERSION = 1; + static constexpr int HEAD_VERSION = 11; + static constexpr int COMPAT_VERSION = 1; public: + static constexpr unsigned FLAG_SYNC = (1<<0); + static constexpr unsigned FLAG_NO_CAPSNAP = (1<<1); // unused + static constexpr unsigned FLAG_PENDING_CAPSNAP = (1<<2); + struct ceph_mds_caps_head head; uint64_t size = 0; @@ -39,11 +44,11 @@ class MClientCaps : public Message { struct ceph_mds_cap_peer peer; - bufferlist snapbl; - bufferlist xattrbl; - bufferlist flockbl; + ceph::buffer::list snapbl; + ceph::buffer::list xattrbl; + ceph::buffer::list flockbl; version_t inline_version = 0; - bufferlist inline_data; + ceph::buffer::list inline_data; // Receivers may not use their new caps until they have this OSD map epoch_t osd_epoch_barrier = 0; @@ -54,32 +59,32 @@ class MClientCaps : public Message { /* advisory CLIENT_CAPS_* flags to send to mds */ unsigned flags = 0; - int get_caps() { return head.caps; } - int get_wanted() { return head.wanted; } - int get_dirty() { return head.dirty; } - ceph_seq_t get_seq() { return head.seq; } - ceph_seq_t get_issue_seq() { return head.issue_seq; } - ceph_seq_t get_mseq() { return head.migrate_seq; } - - inodeno_t get_ino() { return inodeno_t(head.ino); } - inodeno_t get_realm() { return inodeno_t(head.realm); } - uint64_t get_cap_id() { return head.cap_id; } - - uint64_t get_size() { return size; } - uint64_t get_max_size() { return max_size; } - __u32 get_truncate_seq() { return truncate_seq; } - uint64_t get_truncate_size() { return truncate_size; } - utime_t get_ctime() { return ctime; } - utime_t get_btime() { return btime; } - utime_t get_mtime() { return mtime; } - utime_t get_atime() { return atime; } - __u64 get_change_attr() { return change_attr; } - __u32 get_time_warp_seq() { return time_warp_seq; } - uint64_t get_nfiles() { return nfiles; } - uint64_t get_nsubdirs() { return nsubdirs; } + int get_caps() const { return head.caps; } + int get_wanted() const { return head.wanted; } + int get_dirty() const { return head.dirty; } + ceph_seq_t get_seq() const { return head.seq; } + ceph_seq_t get_issue_seq() const { return head.issue_seq; } + ceph_seq_t get_mseq() const { return head.migrate_seq; } + + inodeno_t get_ino() const { return inodeno_t(head.ino); } + inodeno_t get_realm() const { return inodeno_t(head.realm); } + uint64_t get_cap_id() const { return head.cap_id; } + + uint64_t get_size() const { return size; } + uint64_t get_max_size() const { return max_size; } + __u32 get_truncate_seq() const { return truncate_seq; } + uint64_t get_truncate_size() const { return truncate_size; } + utime_t get_ctime() const { return ctime; } + utime_t get_btime() const { return btime; } + utime_t get_mtime() const { return mtime; } + utime_t get_atime() const { return atime; } + __u64 get_change_attr() const { return change_attr; } + __u32 get_time_warp_seq() const { return time_warp_seq; } + uint64_t get_nfiles() const { return nfiles; } + uint64_t get_nsubdirs() const { return nsubdirs; } bool dirstat_is_valid() const { return nfiles != -1 || nsubdirs != -1; } - const file_layout_t& get_layout() { + const file_layout_t& get_layout() const { return layout; } @@ -87,13 +92,13 @@ class MClientCaps : public Message { layout = l; } - int get_migrate_seq() { return head.migrate_seq; } - int get_op() { return head.op; } + int get_migrate_seq() const { return head.migrate_seq; } + int get_op() const { return head.op; } - uint64_t get_client_tid() { return get_tid(); } + uint64_t get_client_tid() const { return get_tid(); } void set_client_tid(uint64_t s) { set_tid(s); } - snapid_t get_snap_follows() { return snapid_t(head.snap_follows); } + snapid_t get_snap_follows() const { return snapid_t(head.snap_follows); } void set_snap_follows(snapid_t s) { head.snap_follows = s; } void set_caps(int c) { head.caps = c; } @@ -118,12 +123,13 @@ class MClientCaps : public Message { } void set_oldest_flush_tid(ceph_tid_t tid) { oldest_flush_tid = tid; } - ceph_tid_t get_oldest_flush_tid() { return oldest_flush_tid; } + ceph_tid_t get_oldest_flush_tid() const { return oldest_flush_tid; } void clear_dirty() { head.dirty = 0; } +protected: MClientCaps() - : Message(CEPH_MSG_CLIENT_CAPS, HEAD_VERSION, COMPAT_VERSION) {} + : SafeMessage{CEPH_MSG_CLIENT_CAPS, HEAD_VERSION, COMPAT_VERSION} {} MClientCaps(int op, inodeno_t ino, inodeno_t realm, @@ -134,7 +140,7 @@ class MClientCaps : public Message { int dirty, int mseq, epoch_t oeb) - : Message(CEPH_MSG_CLIENT_CAPS, HEAD_VERSION, COMPAT_VERSION), + : SafeMessage{CEPH_MSG_CLIENT_CAPS, HEAD_VERSION, COMPAT_VERSION}, osd_epoch_barrier(oeb) { memset(&head, 0, sizeof(head)); head.op = op; @@ -151,7 +157,7 @@ class MClientCaps : public Message { MClientCaps(int op, inodeno_t ino, inodeno_t realm, uint64_t id, int mseq, epoch_t oeb) - : Message(CEPH_MSG_CLIENT_CAPS, HEAD_VERSION, COMPAT_VERSION), + : SafeMessage{CEPH_MSG_CLIENT_CAPS, HEAD_VERSION, COMPAT_VERSION}, osd_epoch_barrier(oeb) { memset(&head, 0, sizeof(head)); head.op = op; @@ -161,14 +167,14 @@ class MClientCaps : public Message { head.migrate_seq = mseq; memset(&peer, 0, sizeof(peer)); } + ~MClientCaps() final {} + private: file_layout_t layout; - ~MClientCaps() override {} - public: - const char *get_type_name() const override { return "Cfcap";} - void print(ostream& out) const override { + std::string_view get_type_name() const override { return "Cfcap";} + void print(std::ostream& out) const override { out << "client_caps(" << ceph_cap_op_name(head.op) << " ino " << inodeno_t(head.ino) << " " << head.cap_id @@ -185,7 +191,9 @@ public: out << " size " << size << "/" << max_size; if (truncate_seq) out << " ts " << truncate_seq << "/" << truncate_size; - out << " mtime " << mtime; + out << " mtime " << mtime + << " ctime " << ctime + << " change_attr " << change_attr; if (time_warp_seq) out << " tws " << time_warp_seq; @@ -194,15 +202,20 @@ public: out << ")"; } - + void decode_payload() override { - bufferlist::iterator p = payload.begin(); - ::decode(head, p); - ceph_mds_caps_body_legacy body; - ::decode(body, p); + using ceph::decode; + auto p = payload.cbegin(); + decode(head, 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; @@ -213,47 +226,47 @@ public: layout.from_legacy(body.layout); time_warp_seq = body.time_warp_seq; } - ::decode_nohead(head.snap_trace_len, snapbl, p); + ceph::decode_nohead(head.snap_trace_len, snapbl, p); - assert(middle.length() == head.xattr_len); + ceph_assert(middle.length() == head.xattr_len); if (head.xattr_len) xattrbl = middle; // conditionally decode flock metadata if (header.version >= 2) - ::decode(flockbl, p); + decode(flockbl, p); if (header.version >= 3) { if (head.op == CEPH_CAP_OP_IMPORT) - ::decode(peer, p); + decode(peer, p); } if (header.version >= 4) { - ::decode(inline_version, p); - ::decode(inline_data, p); + decode(inline_version, p); + decode(inline_data, p); } else { inline_version = CEPH_INLINE_NONE; } if (header.version >= 5) { - ::decode(osd_epoch_barrier, p); + decode(osd_epoch_barrier, p); } if (header.version >= 6) { - ::decode(oldest_flush_tid, p); + decode(oldest_flush_tid, p); } if (header.version >= 7) { - ::decode(caller_uid, p); - ::decode(caller_gid, p); + decode(caller_uid, p); + decode(caller_gid, p); } if (header.version >= 8) { - ::decode(layout.pool_ns, p); + decode(layout.pool_ns, p); } if (header.version >= 9) { - ::decode(btime, p); - ::decode(change_attr, p); + decode(btime, p); + decode(change_attr, p); } if (header.version >= 10) { - ::decode(flags, p); + decode(flags, p); } if (header.version >= 11) { decode(nfiles, p); @@ -261,16 +274,22 @@ public: } } void encode_payload(uint64_t features) override { + using ceph::encode; header.version = HEAD_VERSION; head.snap_trace_len = snapbl.length(); head.xattr_len = xattrbl.length(); - ::encode(head, payload); - ceph_mds_caps_body_legacy body; + encode(head, payload); + 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; @@ -280,15 +299,15 @@ public: ctime.encode_timeval(&body.ctime); layout.to_legacy(&body.layout); body.time_warp_seq = time_warp_seq; + encode(body, payload); } - ::encode(body, payload); - ::encode_nohead(snapbl, payload); + ceph::encode_nohead(snapbl, payload); middle = xattrbl; // conditionally include flock metadata if (features & CEPH_FEATURE_FLOCK) { - ::encode(flockbl, payload); + encode(flockbl, payload); } else { header.version = 1; return; @@ -296,32 +315,37 @@ public: if (features & CEPH_FEATURE_EXPORT_PEER) { if (head.op == CEPH_CAP_OP_IMPORT) - ::encode(peer, payload); + encode(peer, payload); } else { header.version = 2; return; } if (features & CEPH_FEATURE_MDS_INLINE_DATA) { - ::encode(inline_version, payload); - ::encode(inline_data, payload); + encode(inline_version, payload); + encode(inline_data, payload); } else { - ::encode(inline_version, payload); - ::encode(bufferlist(), payload); + encode(inline_version, payload); + encode(ceph::buffer::list(), payload); } - ::encode(osd_epoch_barrier, payload); - ::encode(oldest_flush_tid, payload); - ::encode(caller_uid, payload); - ::encode(caller_gid, payload); - - ::encode(layout.pool_ns, payload); - ::encode(btime, payload); - ::encode(change_attr, payload); - ::encode(flags, payload); - ::encode(nfiles, payload); - ::encode(nsubdirs, payload); + encode(osd_epoch_barrier, payload); + encode(oldest_flush_tid, payload); + encode(caller_uid, payload); + encode(caller_gid, payload); + + encode(layout.pool_ns, payload); + encode(btime, payload); + encode(change_attr, payload); + encode(flags, payload); + encode(nfiles, payload); + encode(nsubdirs, payload); } +private: + template + friend boost::intrusive_ptr ceph::make_message(Args&&... args); + template + friend MURef crimson::make_message(Args&&... args); }; #endif