]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
os/bluestore: _do_write: handle gap from eof to offset in wal path
authorSage Weil <sage@redhat.com>
Mon, 28 Mar 2016 19:36:23 +0000 (15:36 -0400)
committerSage Weil <sage@redhat.com>
Wed, 30 Mar 2016 15:23:15 +0000 (11:23 -0400)
Signed-off-by: Sage Weil <sage@redhat.com>
src/os/bluestore/BlueStore.cc

index b6d4ca0f0e6b765e7f49f6d5549163e65e6c3cf4..64d3a992dd57d635f4f335a51ebf69deea082633 100644 (file)
@@ -5618,9 +5618,24 @@ int BlueStore::_do_write(
       goto out;
     assert(bp->first <= offset);
     assert(offset + length <= bp->first + bp->second.length);
+    bool is_orig_offset = offset == orig_offset;
+    if (offset > o->onode.size &&
+       o->onode.size > bp->first) {
+      uint64_t zlen = offset - o->onode.size;
+      dout(20) << __func__ << " padding " << zlen << " zeroes from eof "
+              << o->onode.size << " to " << offset << dendl;
+      bufferlist z;
+      z.append_zero(zlen);
+      z.claim_append(bl);
+      bl.swap(z);
+      offset -= zlen;
+      length += zlen;
+      if (cow_rmw_head)
+       cow_rmw_head -= zlen;
+    }
     bluestore_wal_op_t *op = _get_wal_op(txc, o);
     op->op = bluestore_wal_op_t::OP_WRITE;
-    if (offset == orig_offset && cow_rmw_head) {
+    if (is_orig_offset && cow_rmw_head) {
       op->src_rmw_head = cow_rmw_head;
       dout(20) << __func__ << " src_rmw_head " << op->src_rmw_head << dendl;
     }