]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
messages: protect MClientCapRelease cons
authorPatrick Donnelly <pdonnell@redhat.com>
Fri, 1 Nov 2019 20:35:41 +0000 (13:35 -0700)
committerPatrick Donnelly <pdonnell@redhat.com>
Mon, 4 Nov 2019 05:34:13 +0000 (21:34 -0800)
This should only be constructed via make_message.

Signed-off-by: Patrick Donnelly <pdonnell@redhat.com>
src/client/MetaSession.cc
src/messages/MClientCapRelease.h

index b721fb105d0819958edd5641f0f7f1ba4ab5a090..177be19399208c66d5424b075eeb035e7a7b7fa9 100644 (file)
@@ -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<MClientCapRelease>();
   }
 
   if (osd_barrier > release->osd_epoch_barrier) {
index a5427bb74ce716a080aefc2d67320146a26a41c4..10ff58f8ef3c1044043885d32de1c06730ee5145 100644 (file)
 
 
 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<ceph_mds_cap_item> 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<ceph_mds_cap_item> caps;
+
+  // The message receiver must wait for this OSD epoch
+  // before actioning this cap release.
+  epoch_t osd_epoch_barrier = 0;
+
+private:
+  template<class T, typename... Args>
+  friend boost::intrusive_ptr<T> 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