From: Patrick Donnelly Date: Fri, 1 Nov 2019 20:35:41 +0000 (-0700) Subject: messages: protect MClientCapRelease cons X-Git-Tag: v15.1.0~1046^2~1 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=4fc68320f8687ef07bc52d9ed3fc1ac6aeaa361d;p=ceph.git messages: protect MClientCapRelease cons This should only be constructed via make_message. Signed-off-by: Patrick Donnelly --- diff --git a/src/client/MetaSession.cc b/src/client/MetaSession.cc index b721fb105d081..177be19399208 100644 --- a/src/client/MetaSession.cc +++ b/src/client/MetaSession.cc @@ -38,7 +38,7 @@ void MetaSession::enqueue_cap_release(inodeno_t ino, uint64_t cap_id, ceph_seq_t ceph_seq_t mseq, epoch_t osd_barrier) { if (!release) { - release.reset(new MClientCapRelease, false); + release = ceph::make_message(); } if (osd_barrier > release->osd_epoch_barrier) { diff --git a/src/messages/MClientCapRelease.h b/src/messages/MClientCapRelease.h index a5427bb74ce71..10ff58f8ef3c1 100644 --- a/src/messages/MClientCapRelease.h +++ b/src/messages/MClientCapRelease.h @@ -19,28 +19,7 @@ class MClientCapRelease : public Message { -private: - static constexpr int HEAD_VERSION = 2; - static constexpr int COMPAT_VERSION = 1; public: - - struct ceph_mds_cap_release head; - vector caps; - - // The message receiver must wait for this OSD epoch - // before actioning this cap release. - epoch_t osd_epoch_barrier; - - MClientCapRelease() : - Message{CEPH_MSG_CLIENT_CAPRELEASE, HEAD_VERSION, COMPAT_VERSION}, - osd_epoch_barrier(0) - { - memset(&head, 0, sizeof(head)); - } -private: - ~MClientCapRelease() override {} - -public: std::string_view get_type_name() const override { return "client_cap_release";} void print(ostream& out) const override { out << "client_cap_release(" << caps.size() << ")"; @@ -61,6 +40,27 @@ public: encode_nohead(caps, payload); encode(osd_epoch_barrier, payload); } + + struct ceph_mds_cap_release head; + vector caps; + + // The message receiver must wait for this OSD epoch + // before actioning this cap release. + epoch_t osd_epoch_barrier = 0; + +private: + template + friend boost::intrusive_ptr ceph::make_message(Args&&... args); + + static constexpr int HEAD_VERSION = 2; + static constexpr int COMPAT_VERSION = 1; + + MClientCapRelease() : + Message{CEPH_MSG_CLIENT_CAPRELEASE, HEAD_VERSION, COMPAT_VERSION} + { + memset(&head, 0, sizeof(head)); + } + ~MClientCapRelease() override {} }; #endif