From: Ilya Dryomov Date: Thu, 13 May 2021 11:11:57 +0000 (+0200) Subject: librbd/cache/pwl/ssd: persist correct write_data_pos X-Git-Tag: v17.1.0~1943^2~2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=fe757401ada7bfd6784b6f9ca5556e1459df7a69;p=ceph.git 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 --- diff --git a/src/librbd/cache/pwl/ssd/WriteLog.cc b/src/librbd/cache/pwl/ssd/WriteLog.cc index 94eeae04f7c6e..7a5a26e319ee3 100644 --- a/src/librbd/cache/pwl/ssd/WriteLog.cc +++ b/src/librbd/cache/pwl/ssd/WriteLog.cc @@ -763,7 +763,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; } @@ -771,7 +771,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(); @@ -785,6 +784,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