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=36d99e37cdb3609e5b7a5b7ae0a45673bce5bc35;p=ceph.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..58fba47f0da 100644 --- a/src/include/rbd/librbd.h +++ b/src/include/rbd/librbd.h @@ -1280,9 +1280,11 @@ CEPH_RBD_API int rbd_aio_write(rbd_image_t image, uint64_t off, size_t len, 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) + * @param precomputed_crc32c: CRC32C checksum that was precomputed with -1 + * as the initial value (i.e. with the CRC "register" initialized to + * 0xFFFFFFFF) + * @param op_flags: see librados.h constants beginning with LIBRADOS_OP_FLAG */ 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(