{
}
+shared_ptr<BtrfsIoctlLogicalInoArgs>
+BeesContext::logical_ino(const uint64_t logical, const bool all_refs)
+{
+ const auto rv = m_logical_ino_pool();
+ rv->set_logical(logical);
+ rv->set_flags(all_refs ? BTRFS_LOGICAL_INO_ARGS_IGNORE_OFFSET : 0);
+ return rv;
+}
+
BeesResolveAddrResult
BeesContext::resolve_addr_uncached(BeesAddress addr)
{
// transaction latency, competing threads, and freeze/SIGSTOP
// pausing the bees process.
- BtrfsIoctlLogicalInoArgs log_ino(addr.get_physical_or_zero());
+ const auto log_ino_ptr = logical_ino(addr.get_physical_or_zero(), false);
+ auto &log_ino = *log_ino_ptr;
// Time how long this takes
Timer resolve_timer;
m_tmpfile_pool.generator([=]() -> shared_ptr<BeesTempFile> {
return make_shared<BeesTempFile>(shared_from_this());
});
+ m_logical_ino_pool.generator([]() {
+ return make_shared<BtrfsIoctlLogicalInoArgs>(0);
+ });
m_tmpfile_pool.checkin([](const shared_ptr<BeesTempFile> &btf) {
catch_all([&](){
btf->reset();
shared_ptr<BeesHashTable> m_hash_table;
shared_ptr<BeesRoots> m_roots;
Pool<BeesTempFile> m_tmpfile_pool;
+ Pool<BtrfsIoctlLogicalInoArgs> m_logical_ino_pool;
LRUCache<BeesResolveAddrResult, BeesAddress> m_resolve_cache;
bool scan_forward(const BeesFileRange &bfr);
+ shared_ptr<BtrfsIoctlLogicalInoArgs> logical_ino(uint64_t bytenr, bool all_refs);
+
bool is_root_ro(uint64_t root);
BeesRangePair dup_extent(const BeesFileRange &src, const shared_ptr<BeesTempFile> &tmpfile);
bool dedup(const BeesRangePair &brp);