1
0
mirror of https://github.com/Zygo/bees.git synced 2025-05-17 21:35:45 +02:00

roots: avoid copying a BtrfsIoctlSearchKey

Although all the members of BtrfsExtentDataFetcher are theoretically
copiable, there's no need to actually make any such copy.

Signed-off-by: Zygo Blaxell <bees@furryterror.org>
This commit is contained in:
Zygo Blaxell 2024-12-03 16:51:24 -05:00
parent dc74766179
commit 3e89fe34ed

View File

@ -1303,8 +1303,6 @@ struct BeesFileCrawl {
BeesCrawlState m_state;
/// Currently processed offset in file
off_t m_offset;
/// Btrfs file fetcher
BtrfsExtentDataFetcher m_bedf;
/// Method that does one unit of work for the Task
bool crawl_one_extent();
@ -1316,10 +1314,15 @@ BeesFileCrawl::crawl_one_extent()
BEESNOTE("crawl_one_extent m_offset " << to_hex(m_offset) << " state " << m_state);
BEESTRACE("crawl_one_extent m_offset " << to_hex(m_offset) << " state " << m_state);
BtrfsExtentDataFetcher bedf(m_ctx->root_fd());
bedf.tree(m_state.m_root);
bedf.objectid(m_state.m_objectid);
bedf.transid(m_state.m_min_transid);
// Only one thread can dedupe a file. btrfs will lock others out.
// Inodes are usually full of shared extents, especially in the case of snapshots,
// so when we lock an inode, we'll lock the same inode number in all subvols at once.
auto inode_mutex = m_ctx->get_inode_mutex(m_bedf.objectid());
auto inode_mutex = m_ctx->get_inode_mutex(bedf.objectid());
auto inode_lock = inode_mutex->try_lock(Task::current_task());
if (!inode_lock) {
BEESCOUNT(crawl_deferred_inode);
@ -1331,12 +1334,12 @@ BeesFileCrawl::crawl_one_extent()
// It will mean the file or subvol was deleted or there's metadata corruption,
// and we should stop trying to scan the inode in that case.
// The calling Task will be aborted.
const auto bti = m_bedf.lower_bound(m_offset);
const auto bti = bedf.lower_bound(m_offset);
if (!bti) {
return false;
}
// Make sure we advance
m_offset = max(bti.offset() + m_bedf.block_size(), bti.offset());
m_offset = max(bti.offset() + bedf.block_size(), bti.offset());
// Check extent item generation is in range
const auto gen = bti.file_extent_generation();
if (gen < m_state.m_min_transid) {
@ -1446,11 +1449,7 @@ BeesRoots::crawl_batch(shared_ptr<BeesCrawl> this_crawl)
.m_hold = this_crawl->hold_state(this_state),
.m_state = this_state,
.m_offset = this_range.begin(),
.m_bedf = BtrfsExtentDataFetcher(m_ctx->root_fd()),
});
bfc->m_bedf.tree(subvol);
bfc->m_bedf.objectid(inode);
bfc->m_bedf.transid(this_state.m_min_transid);
BEESNOTE("Starting task " << this_range);
Task(task_title, [bfc]() {
BEESNOTE("crawl_batch " << bfc->m_hold->get());