]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd/cache/pwl/ssd: persist correct write_data_pos
authorIlya Dryomov <idryomov@gmail.com>
Thu, 13 May 2021 11:11:57 +0000 (13:11 +0200)
committerIlya Dryomov <idryomov@gmail.com>
Sat, 15 May 2021 16:48:22 +0000 (18:48 +0200)
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 <idryomov@gmail.com>
src/librbd/cache/pwl/ssd/WriteLog.cc

index 94eeae04f7c6e93700e431ad1e379bc80cc9a9be..7a5a26e319ee3500b75a61d4ba3f6e46c690acdc 100644 (file)
@@ -763,7 +763,7 @@ void WriteLog<I>::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<I>::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<WriteLogEntry>(log_entry);
       auto cache_bl = write_entry->get_cache_bl();
@@ -785,6 +784,8 @@ void WriteLog<I>::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