]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
seastore : add the use case of write data protection 43530/head
authorJinyong Ha <jy200.ha@samsung.com>
Mon, 25 Oct 2021 05:23:33 +0000 (14:23 +0900)
committermyoungwon oh <ohmyoungwon@gmail.com>
Fri, 12 Nov 2021 04:32:37 +0000 (13:32 +0900)
Apply data protection to RandomBlockManager. It omits
generating CRC if the write protection is enabled

Signed-off-by: Jinyong Ha <jy200.ha@samsung.com>
src/crimson/os/seastore/random_block_manager/nvme_manager.cc

index 8f37dfb816920f8f03fc5e8c18393ce139d15e79..90103d37d8f365549740ac45919841bb62adc3ad 100644 (file)
@@ -54,7 +54,11 @@ NVMeManager::mkfs_ertr::future<> NVMeManager::initialize_blk_alloc_area() {
   for (uint64_t i = 0; i < start; i++) {
     b_block.set_bit(i);
   }
-  b_block.set_crc();
+
+  // CRC calculation is offloaded to NVMeDevice if data protection is enabled.
+  if (device->is_data_protection_enabled() == false) {
+    b_block.set_crc();
+  }
 
   return rbm_sync_block_bitmap(b_block,
     super.start_alloc_area / super.block_size
@@ -565,7 +569,15 @@ NVMeManager::write_ertr::future<> NVMeManager::write_rbm_header()
   bufferlist meta_b_header;
   super.crc = 0;
   encode(super, meta_b_header);
-  super.crc = meta_b_header.crc32c(-1);
+  // If NVMeDevice supports data protection, CRC for checksum is not required
+  // NVMeDevice is expected to generate and store checksum internally.
+  // CPU overhead for CRC might be saved.
+  if (device->is_data_protection_enabled()) {
+    super.crc = -1;
+  }
+  else {
+    super.crc = meta_b_header.crc32c(-1);
+  }
 
   bufferlist bl;
   encode(super, bl);
@@ -605,10 +617,14 @@ NVMeManager::read_ertr::future<rbm_metadata_header_t> NVMeManager::read_rbm_head
     bufferlist meta_b_header;
     super_block.crc = 0;
     encode(super_block, meta_b_header);
-    if (meta_b_header.crc32c(-1) != crc) {
-      logger().debug(" bad crc on super block, expected {} != actual {} ",
-                     meta_b_header.crc32c(-1), crc);
-      return crimson::ct_error::input_output_error::make();
+
+    // Do CRC verification only if data protection is not supported.
+    if (device->is_data_protection_enabled() == false) {
+      if (meta_b_header.crc32c(-1) != crc) {
+        logger().debug(" bad crc on super block, expected {} != actual {} ",
+                        meta_b_header.crc32c(-1), crc);
+        return crimson::ct_error::input_output_error::make();
+      }
     }
     logger().debug(" got {} ", super);
     return read_ertr::future<rbm_metadata_header_t>(