]> 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)
committerDeepika Upadhyay <dupadhya@redhat.com>
Fri, 5 Nov 2021 09:22:01 +0000 (14:52 +0530)
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>
(cherry picked from commit fe757401ada7bfd6784b6f9ca5556e1459df7a69)

src/librbd/cache/pwl/ssd/WriteLog.cc

index ff77dad1dc1e609354d696c934f43b4e9e63ae4d..d171c2b72a2b0d8dea68baa2d8d5c0dfb43d8acc 100644 (file)
@@ -761,7 +761,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;
   }
 
@@ -769,7 +769,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();
@@ -783,6 +782,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