}
void BlueStore::_txc_release(
- TransContext *txc, CollectionRef& c, EnodeRef& e, uint32_t hash,
+ TransContext *txc, CollectionRef& c, OnodeRef& o,
uint64_t offset, uint64_t length,
bool shared)
{
if (shared) {
vector<bluestore_extent_t> release;
- if (!e)
- e = c->get_enode(hash);
- e->ref_map.put(offset, length, &release);
+ if (!o->enode)
+ o->enode = c->get_enode(o->oid.hobj.get_hash());
+ o->enode->ref_map.put(offset, length, &release);
dout(10) << __func__ << " " << offset << "~" << length
- << " shared: ref_map now " << e->ref_map
+ << " shared: ref_map now " << o->enode->ref_map
<< " releasing " << release << dendl;
- txc->write_enode(e);
+ txc->write_enode(o->enode);
for (auto& p : release) {
txc->released.insert(p.offset, p.length);
}
}
// deallocate existing extents
- EnodeRef enode;
bp = o->onode.seek_extent(offset);
while (bp != o->onode.block_map.end() &&
bp->first < offset + length &&
if (bp->first + bp->second.length <= offset + length) {
dout(20) << " trim tail " << bp->first << ": " << bp->second << dendl;
_txc_release(
- txc, c, enode, o->oid.hobj.get_hash(),
+ txc, c, o,
bp->second.offset + left,
bp->second.length - left,
bp->second.has_flag(bluestore_extent_t::FLAG_SHARED));
} else {
dout(20) << " split " << bp->first << ": " << bp->second << dendl;
_txc_release(
- txc, c, enode, o->oid.hobj.get_hash(),
+ txc, c, o,
bp->second.offset + left, length,
bp->second.has_flag(bluestore_extent_t::FLAG_SHARED));
o->onode.block_map[offset + length] =
dout(20) << " trim head " << bp->first << ": " << bp->second
<< " (overlap " << overlap << ")" << dendl;
_txc_release(
- txc, c, enode, o->oid.hobj.get_hash(),
+ txc, c, o,
bp->second.offset, overlap,
bp->second.has_flag(bluestore_extent_t::FLAG_SHARED));
o->onode.block_map[bp->first + overlap] =
} else {
dout(20) << " dealloc " << bp->first << ": " << bp->second << dendl;
_txc_release(
- txc, c, enode, o->oid.hobj.get_hash(),
+ txc, c, o,
bp->second.offset, bp->second.length,
bp->second.has_flag(bluestore_extent_t::FLAG_SHARED));
hint = bp->first + bp->second.length;
int r = 0;
o->exists = true;
- EnodeRef enode;
_dump_onode(o);
_assign_nid(txc, o);
dout(20) << __func__ << " dealloc " << bp->first << ": "
<< bp->second << dendl;
_txc_release(
- txc, c, enode, o->oid.hobj.get_hash(),
+ txc, c, o,
bp->second.offset, bp->second.length,
bp->second.has_flag(bluestore_extent_t::FLAG_SHARED));
o->onode.block_map.erase(bp++);
uint64_t block_size = bdev->get_block_size();
uint64_t min_alloc_size = g_conf->bluestore_min_alloc_size;
uint64_t alloc_end = ROUND_UP_TO(offset, min_alloc_size);
- EnodeRef enode;
// ensure any wal IO has completed before we truncate off any extents
// they may touch.
dout(20) << __func__ << " dealloc " << bp->first << ": "
<< bp->second << dendl;
_txc_release(
- txc, c, enode, o->oid.hobj.get_hash(),
+ txc, c, o,
bp->second.offset, bp->second.length,
bp->second.has_flag(bluestore_extent_t::FLAG_SHARED));
if (bp != o->onode.block_map.begin()) {
dout(20) << __func__ << " trunc " << bp->first << ": " << bp->second
<< " to " << newlen << dendl;
_txc_release(
- txc, c, enode, o->oid.hobj.get_hash(),
+ txc, c, o,
bp->second.offset + newlen, bp->second.length - newlen,
bp->second.has_flag(bluestore_extent_t::FLAG_SHARED));
bp->second.length = newlen;
<< e->ref_map << dendl;
newo->onode.block_map = oldo->onode.block_map;
newo->onode.size = oldo->onode.size;
+ newo->enode = e;
dout(20) << __func__ << " block_map " << newo->onode.block_map << dendl;
txc->write_enode(e);
if (marked)