From 24a30a83491b2002914806a29a2a26448d1e4a4e Mon Sep 17 00:00:00 2001 From: Ilya Dryomov Date: Thu, 13 May 2021 13:11:57 +0200 Subject: [PATCH] librbd/cache/pwl/ssd: persist correct write_data_pos WriteLogCacheEntry gets appended to persist_log_entries before write_data_pos is updated with the actual media offset. Because push_back() makes a copy, the updated write_data_pos value never makes it to media, making recovery impossible. Fixes: https://tracker.ceph.com/issues/50669 Signed-off-by: Ilya Dryomov (cherry picked from commit fe757401ada7bfd6784b6f9ca5556e1459df7a69) --- src/librbd/cache/pwl/ssd/WriteLog.cc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/librbd/cache/pwl/ssd/WriteLog.cc b/src/librbd/cache/pwl/ssd/WriteLog.cc index ff77dad1dc1e6..d171c2b72a2b0 100644 --- a/src/librbd/cache/pwl/ssd/WriteLog.cc +++ b/src/librbd/cache/pwl/ssd/WriteLog.cc @@ -761,7 +761,7 @@ void WriteLog::write_log_entries(GenericLogEntriesVector log_entries, // The first block is for log entries uint64_t data_pos = pool_root.first_free_entry + MIN_WRITE_ALLOC_SSD_SIZE; ldout(m_image_ctx.cct, 20) << "data_pos: " << data_pos << dendl; - if (data_pos == pool_root.pool_size ) { + if (data_pos == pool_root.pool_size) { data_pos = data_pos % pool_root.pool_size + DATA_RING_BUFFER_OFFSET; } @@ -769,7 +769,6 @@ void WriteLog::write_log_entries(GenericLogEntriesVector log_entries, for (auto &log_entry : log_entries) { log_entry->log_entry_index = pool_root.first_free_entry; // Append data buffer for write operations - persist_log_entries.push_back(log_entry->ram_entry); if (log_entry->is_write_entry()) { auto write_entry = static_pointer_cast(log_entry); auto cache_bl = write_entry->get_cache_bl(); @@ -783,6 +782,8 @@ void WriteLog::write_log_entries(GenericLogEntriesVector log_entries, data_pos = data_pos % pool_root.pool_size + DATA_RING_BUFFER_OFFSET; } } + // push_back _after_ setting write_data_pos + persist_log_entries.push_back(log_entry->ram_entry); } //aio write -- 2.39.5