]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
common: proliferate ptr_node in the bufferlist implementation.
authorRadoslaw Zarzynski <rzarzyns@redhat.com>
Mon, 8 Oct 2018 23:16:32 +0000 (01:16 +0200)
committerRadoslaw Zarzynski <rzarzyns@redhat.com>
Sun, 2 Dec 2018 23:49:33 +0000 (00:49 +0100)
Signed-off-by: Radoslaw Zarzynski <rzarzyns@redhat.com>
src/common/buffer.cc
src/include/buffer.h
src/librbd/internal.cc

index 5c4a43b74adff6aa00415ac2447ee4ee12bbefd5..4634f14f7a5026b37aeaac8a6ac80f90de409891 100644 (file)
@@ -1325,15 +1325,13 @@ using namespace ceph;
       _buffers.clear_and_dispose(ptr_node::disposer());
       return;
     }
-    ptr nb;
     if ((_len & ~CEPH_PAGE_MASK) == 0)
-      nb = buffer::create_page_aligned(_len);
+      rebuild(ptr_node::create(buffer::create_page_aligned(_len)));
     else
-      nb = buffer::create(_len);
-    rebuild(nb);
+      rebuild(ptr_node::create(buffer::create(_len)));
   }
 
-  void buffer::list::rebuild(ptr& nb)
+  void buffer::list::rebuild(ptr_node& nb)
   {
     unsigned pos = 0;
     for (auto& node : _buffers) {
@@ -1342,8 +1340,11 @@ using namespace ceph;
     }
     _memcopy_count += pos;
     _buffers.clear_and_dispose(ptr_node::disposer());
-    if (nb.length())
-      _buffers.push_back(ptr_node::create(nb));
+    if (likely(nb.length())) {
+      _buffers.push_back(nb);
+    } else {
+      ptr_node::disposer()(&nb);
+    }
     invalidate_crc();
     last_p = begin();
   }
@@ -1397,8 +1398,9 @@ using namespace ceph;
              !p->is_n_align_sized(align_size) ||
              (offset % align_size)));
       if (!(unaligned.is_contiguous() && unaligned._buffers.front().is_aligned(align_memory))) {
-        ptr nb(buffer::create_aligned(unaligned._len, align_memory));
-        unaligned.rebuild(nb);
+        unaligned.rebuild(
+          ptr_node::create(
+            buffer::create_aligned(unaligned._len, align_memory)));
         _memcopy_count += unaligned._len;
       }
       _buffers.insert(p, ptr_node::create(unaligned._buffers.front()));
@@ -1556,7 +1558,7 @@ using namespace ceph;
       }
     }
     // add new item to list
-    push_back(ptr(bp, off, len));
+    push_back(ptr_node::create(bp, off, len));
   }
 
   void buffer::list::append(const list& bl)
@@ -1852,11 +1854,11 @@ int buffer::list::read_file(const char *fn, std::string *error)
 
 ssize_t buffer::list::read_fd(int fd, size_t len)
 {
-  bufferptr bp = buffer::create(len);
+  auto& bp = ptr_node::create(buffer::create(len));
   ssize_t ret = safe_read(fd, (void*)bp.c_str(), len);
   if (ret >= 0) {
     bp.set_length(ret);
-    append(std::move(bp));
+    push_back(bp);
   }
   return ret;
 }
@@ -2165,7 +2167,7 @@ void buffer::list::hexdump(std::ostream &out, bool trailing_newline) const
 
 buffer::list buffer::list::static_from_mem(char* c, size_t l) {
   list bl;
-  bl.push_back(ptr(create_static(l, c)));
+  bl.push_back(ptr_node::create(create_static(l, c)));
   return bl;
 }
 
index d89ce2a2a26ce980984b787f3dc76461ddf66f1f..b5922556674944c7db1227506ffe901de0a7ed55 100644 (file)
@@ -828,6 +828,12 @@ namespace buffer CEPH_BUFFER_API {
       _len += bp.length();
       _buffers.push_back(ptr_node::create(std::move(bp)));
     }
+    void push_back(ptr_node& bp) {
+      if (bp.length() == 0)
+       return;
+      _len += bp.length();
+      _buffers.push_back(bp);
+    }
     void push_back(raw *r) {
       _buffers.push_back(ptr_node::create(r));
       _len += _buffers.back().length();
@@ -838,7 +844,7 @@ namespace buffer CEPH_BUFFER_API {
 
     bool is_contiguous() const;
     void rebuild();
-    void rebuild(ptr& nb);
+    void rebuild(ptr_node& nb);
     bool rebuild_aligned(unsigned align);
     // max_buffers = 0 mean don't care _buffers.size(), other
     // must make _buffers.size() <= max_buffers after rebuilding.
index 52a3ae9cc1a1ce6bce8e3e5f90149db2febd9dda..74898772a5256efa3bb3ca8a1f1f84f3fe7152fb 100644 (file)
@@ -1427,7 +1427,7 @@ int validate_pool(IoCtx &io_ctx, CephContext *cct) {
       });
       auto gather_ctx = new C_Gather(m_dest->cct, end_op_ctx);
 
-      bufferptr m_ptr(m_bl->length());
+      auto& m_ptr = buffer::ptr_node::create(m_bl->length());
       m_bl->rebuild(m_ptr);
       size_t write_offset = 0;
       size_t write_length = 0;
@@ -1440,7 +1440,8 @@ int validate_pool(IoCtx &io_ctx, CephContext *cct) {
                                     &write_offset,
                                     &write_length,
                                     &offset)) {
-         bufferptr write_ptr(m_ptr, write_offset, write_length);
+         auto& write_ptr = \
+           buffer::ptr_node::create(m_ptr, write_offset, write_length);
          bufferlist *write_bl = new bufferlist();
          write_bl->push_back(write_ptr);
          Context *ctx = new C_CopyWrite(write_bl, gather_ctx->new_sub());