]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore/object_data_handler: fiemap return laddr continuous
authorXuehan Xu <xuxuehan@qianxin.com>
Wed, 24 Sep 2025 06:52:17 +0000 (14:52 +0800)
committerXuehan Xu <xuxuehan@qianxin.com>
Mon, 30 Mar 2026 10:09:24 +0000 (18:09 +0800)
mappings as a single region

Signed-off-by: Xuehan Xu <xuxuehan@qianxin.com>
src/crimson/os/seastore/object_data_handler.cc

index 2d8c97a352dac5cfe109ebd1dc600bb9f51f81fa..574b864402753fc88279daa599439b5b80f97c55 100644 (file)
@@ -1623,6 +1623,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);
@@ -1630,12 +1631,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<uint64_t>(
-                 object_data.get_reserved_data_base()),
-               ret_right.get_byte_distance<uint64_t>(ret_left)
-             ));
+           if (off == ret_left && !ret.empty()) {
+             ret.rbegin()->second += ret_right.get_byte_distance<uint64_t>(ret_left);
+           } else {
+             ret.emplace(
+               std::make_pair(
+                 ret_left.get_byte_distance<uint64_t>(
+                   object_data.get_reserved_data_base()),
+                 ret_right.get_byte_distance<uint64_t>(ret_left)
+               ));
+           }
+           off = ret_right;
          }
        }
       });