From: Jinyong Ha Date: Mon, 25 Oct 2021 05:23:33 +0000 (+0900) Subject: seastore : add the use case of write data protection X-Git-Tag: v17.1.0~359^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=08ccbc1d26e81d54278ab10d53450e810694df50;p=ceph.git seastore : add the use case of write data protection Apply data protection to RandomBlockManager. It omits generating CRC if the write protection is enabled Signed-off-by: Jinyong Ha --- diff --git a/src/crimson/os/seastore/random_block_manager/nvme_manager.cc b/src/crimson/os/seastore/random_block_manager/nvme_manager.cc index 8f37dfb816920..90103d37d8f36 100644 --- a/src/crimson/os/seastore/random_block_manager/nvme_manager.cc +++ b/src/crimson/os/seastore/random_block_manager/nvme_manager.cc @@ -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 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(