From: Alexander Indenbaum Date: Sun, 23 Nov 2025 12:21:39 +0000 (+0200) Subject: librbd: store CRC32C with initial value -1 to match msgr2 validation X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=4c422a7aec215a352805cbf8dd7b951930b73326;p=ceph-ci.git librbd: store CRC32C with initial value -1 to match msgr2 validation Fix runtime error, using test command: sudo dd if=/dev/zero bs=32k of=/dev/nvme0n1 count=1 The error log: 2025-11-23T11:24:10.512+0000 7f30f4ec0640 1 --2- [v2:192.168.13.2:6802/3444906816,v1:192.168.13.2:6803/3444906816] >> 192.168.13.3:0/3916714748 conn(0x527d400 0x728f700 crc :-1 s=THROTTLE_DONE pgs=2038703 gs=2038723 cs=0 l=1 c_cookie=0 s_cookie=0 reconnecting=0 rev1=1 crypto rx=0 tx=0 comp rx=0 tx=0)._handle_read_frame_epilogue_main bad segment crc calculated=1136411986 expected=4294967295 Ceph msgr2 validation (ceph/src/msg/async/frames_v2.cc:47): uint32_t crc = segment_bl.crc32c(-1); // Uses initial value -1 Co-authored-by: Ilya Dryomov Signed-off-by: Alexander Indenbaum --- diff --git a/src/include/rbd/librbd.h b/src/include/rbd/librbd.h index 97576bb10d5..5b7bca13226 100644 --- a/src/include/rbd/librbd.h +++ b/src/include/rbd/librbd.h @@ -1281,8 +1281,11 @@ CEPH_RBD_API int rbd_aio_write2(rbd_image_t image, uint64_t off, size_t len, const char *buf, rbd_completion_t c, int op_flags); -/* - * @param precomputed_crc32c: CRC32C checksum that was precomputed (e.g., by SPDK NVMf) +/** + * @precomputed_crc32c: CRC32C checksum that was precomputed (e.g., by SPDK NVMf). + * Stores the raw value computed with init = -1 + * Validation: src/msg/async/frames_v2.cc:47 + * Ref: https://docs.ceph.com/en/latest/dev/msgr2/#frame-checksum */ CEPH_RBD_API int rbd_aio_write_with_crc32c(rbd_image_t image, uint64_t off, size_t len, const char *buf, diff --git a/src/librbd/librbd.cc b/src/librbd/librbd.cc index 872fdc991cd..fac2c5a2949 100644 --- a/src/librbd/librbd.cc +++ b/src/librbd/librbd.cc @@ -6418,8 +6418,9 @@ extern "C" int rbd_aio_write_with_crc32c(rbd_image_t image, uint64_t off, auto aio_completion = get_aio_completion(comp); auto raw = create_write_raw(ictx, buf, len, aio_completion); + // store with initial value -1 raw->set_crc(std::make_pair(0, len), - std::make_pair(0, precomputed_crc32c)); + std::make_pair(-1, precomputed_crc32c)); bufferlist bl; bl.push_back(std::move(raw)); librbd::api::Io<>::aio_write(