i->get_length(),
i->get_type(),
seq));
+ } else if (is_backref_node(i->get_type())) {
+ add_backref_extent(i->get_paddr(), i->get_type());
+ } else {
+ ERRORT("{}", t, *i);
+ ceph_abort("not possible");
}
}
});
i->get_length(),
i->get_type(),
seq));
+ } else if (is_backref_node(i->get_type())) {
+ remove_backref_extent(i->get_paddr());
+ } else {
+ ERRORT("{}", t, *i);
+ ceph_abort("not possible");
}
}
if (!backref_list.empty())
intrusive_ptr_release(ptr);
}
backref_bufs_to_flush.clear();
+ backref_extents.clear();
backref_buffer.reset();
assert(stats.dirty_bytes == 0);
lru.clear();
}
}
+ struct backref_extent_buf_entry_t {
+ backref_extent_buf_entry_t(
+ paddr_t paddr,
+ extent_types_t type)
+ : paddr(paddr), type(type) {}
+ paddr_t paddr = P_ADDR_NULL;
+ extent_types_t type = extent_types_t::ROOT;
+ struct cmp_t {
+ using is_transparent = paddr_t;
+ bool operator()(
+ const backref_extent_buf_entry_t &l,
+ const backref_extent_buf_entry_t &r) const {
+ return l.paddr < r.paddr;
+ }
+ bool operator()(
+ const paddr_t &l,
+ const backref_extent_buf_entry_t &r) const {
+ return l < r.paddr;
+ }
+ bool operator()(
+ const backref_extent_buf_entry_t &l,
+ const paddr_t &r) const {
+ return l.paddr < r;
+ }
+ };
+ };
+
+ void add_backref_extent(paddr_t paddr, extent_types_t type) {
+ assert(!paddr.is_relative());
+ auto [iter, inserted] = backref_extents.emplace(paddr, type);
+ assert(inserted);
+ }
+
+ void remove_backref_extent(paddr_t paddr) {
+ auto iter = backref_extents.find(paddr);
+ if (iter != backref_extents.end())
+ backref_extents.erase(iter);
+ }
+
+ std::set<
+ backref_extent_buf_entry_t,
+ backref_extent_buf_entry_t::cmp_t> get_backref_extents_in_range(
+ paddr_t start,
+ paddr_t end) {
+ auto start_iter = backref_extents.lower_bound(start);
+ auto end_iter = backref_extents.upper_bound(end);
+ std::set<
+ backref_extent_buf_entry_t,
+ backref_extent_buf_entry_t::cmp_t> res;
+ res.insert(start_iter, end_iter);
+ return res;
+ }
+
private:
ExtentPlacementManager& epm;
RootBlockRef root; ///< ref to current root
*/
CachedExtent::list dirty;
+ std::set<
+ backref_extent_buf_entry_t,
+ backref_extent_buf_entry_t::cmp_t> backref_extents;
+
/**
* lru
*