}
void BlueStore::_pad_zeros(
+ TransContext *txc,
OnodeRef o,
bufferlist *bl, uint64_t *offset, uint64_t *length,
uint64_t block_size)
o->tail_bl.clear();
o->tail_bl.append(tail, 0, back_copy);
o->tail_offset = end - back_copy;
+ o->tail_txc_seq = txc->seq;
dout(20) << __func__ << " cached "<< back_copy << " of tail block at "
<< o->tail_offset << dendl;
}
}
void BlueStore::_pad_zeros_tail(
+ TransContext *txc,
OnodeRef o,
bufferlist *bl, uint64_t offset, uint64_t *length,
uint64_t block_size)
o->tail_bl.clear();
o->tail_bl.append(tail, 0, back_copy);
o->tail_offset = end - back_copy;
+ o->tail_txc_seq = txc->seq;
dout(20) << __func__ << " cached "<< back_copy << " of tail block at "
<< o->tail_offset << dendl;
}
offset >= o->onode.size && // past eof +
(offset / block_size != (o->onode.size - 1) / block_size)) {// diff block
dout(20) << __func__ << " append" << dendl;
- _pad_zeros(o, &bl, &offset, &length, block_size);
+ _pad_zeros(txc, o, &bl, &offset, &length, block_size);
assert(offset % block_size == 0);
assert(length % block_size == 0);
uint64_t x_off = offset - bp->first;
offset == bp->first);
bp->second.clear_flag(bluestore_extent_t::FLAG_COW_HEAD);
bp->second.clear_flag(bluestore_extent_t::FLAG_UNWRITTEN);
- _pad_zeros(o, &bl, &offset, &length, block_size);
+ _pad_zeros(txc, o, &bl, &offset, &length, block_size);
uint64_t x_off = offset - bp->first;
dout(20) << __func__ << " write " << offset << "~" << length
<< " x_off " << x_off << dendl;
_pad_zeros_head(o, &bl, &offset, &length, block_size);
}
if (((offset + length) & ~block_mask) != 0 && !cow_rmw_tail) {
- _pad_zeros_tail(o, &bl, offset, &length, block_size);
+ _pad_zeros_tail(txc, o, &bl, offset, &length, block_size);
}
if ((offset & ~block_mask) == 0 && (length & ~block_mask) == 0) {
uint64_t x_off = offset - bp->first;
} else if (((offset + length) & ~block_mask) &&
offset + length > o->onode.size) {
dout(20) << __func__ << " past eof, padding out tail block" << dendl;
- _pad_zeros_tail(o, &bl, offset, &length, block_size);
+ _pad_zeros_tail(txc, o, &bl, offset, &length, block_size);
}
bp->second.clear_flag(bluestore_extent_t::FLAG_COW_HEAD);
bp->second.clear_flag(bluestore_extent_t::FLAG_COW_TAIL);
std::condition_variable flush_cond; ///< wait here for unapplied txns
set<TransContext*> flush_txns; ///< committing or wal txns
- uint64_t tail_offset;
+ uint64_t tail_offset = 0;
+ uint64_t tail_txc_seq = 0;
bufferlist tail_bl;
Onode(const ghobject_t& o, const string& k)
int _do_write_overlays(TransContext *txc, CollectionRef& c, OnodeRef o,
uint64_t offset, uint64_t length);
void _do_read_all_overlays(bluestore_wal_op_t& wo);
- void _pad_zeros(OnodeRef o, bufferlist *bl, uint64_t *offset, uint64_t *length,
+ void _pad_zeros(TransContext *txc,
+ OnodeRef o, bufferlist *bl, uint64_t *offset, uint64_t *length,
uint64_t block_size);
void _pad_zeros_head(OnodeRef o, bufferlist *bl,
uint64_t *offset, uint64_t *length,
uint64_t block_size);
- void _pad_zeros_tail(OnodeRef o, bufferlist *bl,
+ void _pad_zeros_tail(TransContext *txc,
+ OnodeRef o, bufferlist *bl,
uint64_t offset, uint64_t *length,
uint64_t block_size);
int _do_allocate(TransContext *txc,