From: Feng Hualong Date: Wed, 28 Jul 2021 03:42:44 +0000 (+0800) Subject: librbd/cache/pwl/ssd: remove correct m_blocks_to_log_entries entry X-Git-Tag: v17.1.0~897^2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=01bb75a1056d26ae43832d567087b3d67ab84261;p=ceph.git librbd/cache/pwl/ssd: remove correct m_blocks_to_log_entries entry When retiring, m_blocks_to_log_entries doesn't remove corresponding write_entry (should be `*it` not `entry`) that will be retired. It leads to read error. And there should also consider discard entries. Fixes: https://tracker.ceph.com/issues/52579 Signed-off-by: Feng Hualong --- diff --git a/src/librbd/cache/pwl/ssd/WriteLog.cc b/src/librbd/cache/pwl/ssd/WriteLog.cc index 05458d4f7573c..6e6ce2fbf79d5 100644 --- a/src/librbd/cache/pwl/ssd/WriteLog.cc +++ b/src/librbd/cache/pwl/ssd/WriteLog.cc @@ -623,8 +623,7 @@ bool WriteLog::retire_entries(const unsigned long int frees_per_tx) { first_valid_entry = m_first_valid_entry; while (retiring_entries.size() < frees_per_tx && !m_log_entries.empty()) { GenericLogEntriesVector retiring_subentries; - auto entry = m_log_entries.front(); - uint64_t control_block_pos = entry->log_entry_index; + uint64_t control_block_pos = m_log_entries.front()->log_entry_index; uint64_t data_length = 0; for (auto it = m_log_entries.begin(); it != m_log_entries.end(); ++it) { if (this->can_retire_entry(*it)) { @@ -661,9 +660,11 @@ bool WriteLog::retire_entries(const unsigned long int frees_per_tx) { it != retiring_subentries.end(); it++) { ceph_assert(m_log_entries.front() == *it); m_log_entries.pop_front(); - if (entry->is_write_entry()) { - auto write_entry = static_pointer_cast(entry); - this->m_blocks_to_log_entries.remove_log_entry(write_entry); + if ((*it)->write_bytes() > 0 || (*it)->bytes_dirty() > 0) { + auto gen_write_entry = static_pointer_cast(*it); + if (gen_write_entry) { + this->m_blocks_to_log_entries.remove_log_entry(gen_write_entry); + } } }