From: Ilya Dryomov Date: Fri, 16 Jan 2026 19:38:48 +0000 (+0100) Subject: librbd: tweak ReadResult's handler for SparseBufferlist type X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=aad028500fc7d308882e2d7ec105371209027871;p=ceph.git librbd: tweak ReadResult's handler for SparseBufferlist type It's similar in concept to the handler for the new ChildObject type. To highlight that, make comments and log messages consistent between the two. Signed-off-by: Ilya Dryomov --- diff --git a/src/librbd/io/ReadResult.cc b/src/librbd/io/ReadResult.cc index fc1d9bf361f8..bb522319483b 100644 --- a/src/librbd/io/ReadResult.cc +++ b/src/librbd/io/ReadResult.cc @@ -95,42 +95,51 @@ struct ReadResult::AssembleResultVisitor { auto buffer_extents_length = destriper.assemble_result( cct, &buffer_extent_map, sparse_bufferlist.bl); - ldout(cct, 20) << "image_extents=" - << sparse_bufferlist.image_extents << ", " - << "buffer_extent_map=" << buffer_extent_map << dendl; + ldout(cct, 20) << "buffer_extent_map=" << buffer_extent_map << dendl; sparse_bufferlist.extent_map->clear(); sparse_bufferlist.extent_map->reserve(buffer_extent_map.size()); - // The extent-map is logically addressed by buffer-extents not image- or - // object-extents. Translate this address mapping to image-extent - // logical addressing since it's tied to an image-extent read + // buffer_extent_map is logically addressed by buffer extents not + // image or object extents. Translate buffer offsets (always 0-based) + // into image offsets since the buffer is tied to an image read. uint64_t buffer_offset = 0; auto bem_it = buffer_extent_map.begin(); for (auto [image_offset, image_length] : sparse_bufferlist.image_extents) { + bool found_buffer_extent = false; while (bem_it != buffer_extent_map.end()) { auto [buffer_extent_offset, buffer_extent_length] = *bem_it; if (buffer_offset + image_length <= buffer_extent_offset) { - // skip any image extent that is not included in the results + // no more buffer extents for the current image extent, + // current buffer extent belongs to the next image extent break; } - // current buffer-extent should be within the current image-extent + // current buffer extent should be within the current image extent ceph_assert(buffer_offset <= buffer_extent_offset && buffer_offset + image_length >= buffer_extent_offset + buffer_extent_length); + found_buffer_extent = true; + auto image_extent_offset = image_offset + (buffer_extent_offset - buffer_offset); ldout(cct, 20) << "mapping buffer extent " << buffer_extent_offset << "~" << buffer_extent_length << " to image extent " << image_extent_offset << "~" << buffer_extent_length + << " for " << image_offset << "~" << image_length << dendl; sparse_bufferlist.extent_map->emplace_back( image_extent_offset, buffer_extent_length); ++bem_it; } + // skip any image extent that is not included in the results + if (!found_buffer_extent) { + ldout(cct, 20) << "no buffer extents for image extent " + << image_offset << "~" << image_length << dendl; + } + buffer_offset += image_length; } ceph_assert(buffer_offset == buffer_extents_length);