]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
os/bluestore/BlueStore: wal_op_t::OP_COPY
authorSage Weil <sage@redhat.com>
Mon, 14 Dec 2015 20:53:41 +0000 (15:53 -0500)
committerSage Weil <sage@redhat.com>
Fri, 1 Jan 2016 18:07:24 +0000 (13:07 -0500)
Assume block-aligned.

Signed-off-by: Sage Weil <sage@redhat.com>
src/os/bluestore/BlueStore.cc
src/os/bluestore/bluestore_types.cc
src/os/bluestore/bluestore_types.h

index da190ae486e67c24dd49411f1a2d447f03ac78ae..c832716936f4e77369affc4f640c45e166403692 100644 (file)
@@ -3503,6 +3503,23 @@ int BlueStore::_do_wal_op(bluestore_wal_op_t& wo, IOContext *ioc)
   }
   break;
 
+  case bluestore_wal_op_t::OP_COPY:
+  {
+    dout(20) << __func__ << " copy " << wo.extent << " from " << wo.src_extent
+            << dendl;
+    assert((wo.extent.offset & ~block_mask) == 0);
+    assert((wo.extent.length & ~block_mask) == 0);
+    assert(wo.extent.length == wo.src_extent.length);
+    assert((wo.src_extent.offset & ~block_mask) == 0);
+    bufferlist bl;
+    int r = bdev->read(wo.src_extent.offset, wo.src_extent.length, &bl, ioc,
+                      true);
+    assert(r >= 0);
+    assert(bl.length() == wo.extent.length);
+    bdev->aio_write(wo.extent.offset, bl, ioc, true);
+  }
+  break;
+
   case bluestore_wal_op_t::OP_ZERO:
   {
     dout(20) << __func__ << " zero " << wo.extent << dendl;
index eef544f763dd15205d9affcc4b6db0eadbf73c0b..d8c854d112294b79e12af245eb719928e63b8754 100644 (file)
@@ -107,6 +107,11 @@ string bluestore_extent_t::get_flags_string(unsigned flags)
       s += '+';
     s += "unwritten";
   }
+  if (flags & FLAG_SHARED) {
+    if (s.length())
+      s += '+';
+    s += "shared";
+  }
   return s;
 }
 
@@ -444,6 +449,7 @@ void bluestore_wal_op_t::encode(bufferlist& bl) const
   ENCODE_START(1, 1, bl);
   ::encode(op, bl);
   ::encode(extent, bl);
+  ::encode(src_extent, bl);
   ::encode(nid, bl);
   ::encode(overlays, bl);
   if (!overlays.size()) {
@@ -458,6 +464,7 @@ void bluestore_wal_op_t::decode(bufferlist::iterator& p)
   DECODE_START(1, p);
   ::decode(op, p);
   ::decode(extent, p);
+  ::decode(src_extent, p);
   ::decode(nid, p);
   ::decode(overlays, p);
   if (!overlays.size()) {
@@ -471,6 +478,7 @@ void bluestore_wal_op_t::dump(Formatter *f) const
 {
   f->dump_unsigned("op", (int)op);
   f->dump_object("extent", extent);
+  f->dump_object("src_extent", src_extent);
   f->dump_unsigned("nid", nid);
   f->open_array_section("overlays");
   for (vector<bluestore_overlay_t>::const_iterator p = overlays.begin();
@@ -493,6 +501,8 @@ void bluestore_wal_op_t::generate_test_instances(list<bluestore_wal_op_t*>& o)
   o.back()->op = OP_WRITE;
   o.back()->extent.offset = 1;
   o.back()->extent.length = 2;
+  o.back()->src_extent.offset = 10000;
+  o.back()->src_extent.length = 2;
   o.back()->data.append("my data");
   o.back()->nid = 3;
   o.back()->overlays.push_back(bluestore_overlay_t());
index b9ade50ee4dec599b286356a8877837740fff6eb..329e1db223a9815a3ec84d33e9ace6b2ddebabb8 100644 (file)
@@ -233,10 +233,12 @@ WRITE_CLASS_ENCODER(bluestore_onode_t)
 struct bluestore_wal_op_t {
   typedef enum {
     OP_WRITE = 1,
+    OP_COPY = 2,
     OP_ZERO = 4,
   } type_t;
   __u8 op;
   bluestore_extent_t extent;
+  bluestore_extent_t src_extent;
   bufferlist data;
   uint64_t nid;
   vector<bluestore_overlay_t> overlays;