]> git.apps.os.sepia.ceph.com Git - ceph.git/commit
crimson/seastore: use DMA alignment for block size instead of stat 65869/head
authorKefu Chai <tchaikov@gmail.com>
Fri, 10 Oct 2025 03:04:50 +0000 (11:04 +0800)
committerKefu Chai <tchaikov@gmail.com>
Fri, 10 Oct 2025 03:18:18 +0000 (11:18 +0800)
commitc5ed7ce82886aa7d26b681aabf6ae949610e1c2a
tree804a338c26bdc2c5cba42d888f2207866b42c966
parente59cb2c4a015b565a500d8ad58068d623d525a62
crimson/seastore: use DMA alignment for block size instead of stat

Before this fix, BlockSegmentManager used stat.block_size (typically 512
bytes from file_stat()) as the alignment requirement for writes. However,
Seastar's DMA engine requires alignment to disk_write_dma_alignment()
(typically 4096 bytes, the logical block size) for performant writes.

This mismatch caused failures in BlockSegmentManager::segment_write():

1. Crimson believed block_size was 512 bytes (from file_stat())
2. Crimson prepared 512-byte aligned buffers for writing
3. Seastar's internal::sanitize_iovecs() trimmed the unaligned portions
   based on the actual 4096-byte DMA alignment requirement
4. This left an empty buffer (512 bytes trimmed from 512-byte buffer)
5. The write operation returned 0 bytes written
6. The assertion 'written != len' failed in do_writev()

The fix queries the actual DMA alignment requirement from Seastar via
file.disk_write_dma_alignment() and uses that as block_size throughout
the segment manager. This ensures all writes are properly aligned for
Seastar's DMA engine.

Signed-off-by: Kefu Chai <k.chai@proxmox.com>
src/crimson/os/seastore/segment_manager/block.cc