From: Xuehan Xu Date: Wed, 24 Sep 2025 06:52:17 +0000 (+0800) Subject: crimson/os/seastore/object_data_handler: fiemap return laddr continuous X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=cfb94b4e11b7bf80d2e3c615c7ab23da7544df4d;p=ceph-ci.git crimson/os/seastore/object_data_handler: fiemap return laddr continuous mappings as a single region Signed-off-by: Xuehan Xu --- diff --git a/src/crimson/os/seastore/object_data_handler.cc b/src/crimson/os/seastore/object_data_handler.cc index b6fc0fb7476..0e582e80851 100644 --- a/src/crimson/os/seastore/object_data_handler.cc +++ b/src/crimson/os/seastore/object_data_handler.cc @@ -1620,6 +1620,7 @@ ObjectDataHandler::fiemap_ret ObjectDataHandler::fiemap( ).si_then([l_start, len, &object_data, &ret](auto &&pins) { ceph_assert(pins.size() >= 1); ceph_assert(pins.front().get_key() <= l_start); + auto off = l_start; for (auto &&i: pins) { if (!i.is_zero_reserved()) { laddr_offset_t ret_left = std::max(laddr_offset_t(i.get_key(), 0), l_start); @@ -1627,12 +1628,17 @@ ObjectDataHandler::fiemap_ret ObjectDataHandler::fiemap( i.get_key() + i.get_length(), l_start + len); assert(ret_right > ret_left); - ret.emplace( - std::make_pair( - ret_left.get_byte_distance( - object_data.get_reserved_data_base()), - ret_right.get_byte_distance(ret_left) - )); + if (off == ret_left && !ret.empty()) { + ret.rbegin()->second += ret_right.get_byte_distance(ret_left); + } else { + ret.emplace( + std::make_pair( + ret_left.get_byte_distance( + object_data.get_reserved_data_base()), + ret_right.get_byte_distance(ret_left) + )); + } + off = ret_right; } } });