}
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;
s += '+';
s += "unwritten";
}
+ if (flags & FLAG_SHARED) {
+ if (s.length())
+ s += '+';
+ s += "shared";
+ }
return s;
}
ENCODE_START(1, 1, bl);
::encode(op, bl);
::encode(extent, bl);
+ ::encode(src_extent, bl);
::encode(nid, bl);
::encode(overlays, bl);
if (!overlays.size()) {
DECODE_START(1, p);
::decode(op, p);
::decode(extent, p);
+ ::decode(src_extent, p);
::decode(nid, p);
::decode(overlays, p);
if (!overlays.size()) {
{
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();
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());
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;