From: Sage Weil Date: Mon, 14 Dec 2015 20:53:41 +0000 (-0500) Subject: os/bluestore/BlueStore: wal_op_t::OP_COPY X-Git-Tag: v10.0.3~154^2~76 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=97bf343552dba1175aa5f4f165fa40f21104af62;p=ceph.git os/bluestore/BlueStore: wal_op_t::OP_COPY Assume block-aligned. Signed-off-by: Sage Weil --- diff --git a/src/os/bluestore/BlueStore.cc b/src/os/bluestore/BlueStore.cc index da190ae486e..c832716936f 100644 --- a/src/os/bluestore/BlueStore.cc +++ b/src/os/bluestore/BlueStore.cc @@ -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; diff --git a/src/os/bluestore/bluestore_types.cc b/src/os/bluestore/bluestore_types.cc index eef544f763d..d8c854d1122 100644 --- a/src/os/bluestore/bluestore_types.cc +++ b/src/os/bluestore/bluestore_types.cc @@ -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::const_iterator p = overlays.begin(); @@ -493,6 +501,8 @@ void bluestore_wal_op_t::generate_test_instances(list& 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()); diff --git a/src/os/bluestore/bluestore_types.h b/src/os/bluestore/bluestore_types.h index b9ade50ee4d..329e1db223a 100644 --- a/src/os/bluestore/bluestore_types.h +++ b/src/os/bluestore/bluestore_types.h @@ -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 overlays;