]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: factor out prune_extents() from prune_parent_extents()
authorIlya Dryomov <idryomov@gmail.com>
Sat, 31 Aug 2024 10:00:48 +0000 (12:00 +0200)
committerIlya Dryomov <idryomov@gmail.com>
Sun, 1 Sep 2024 13:53:51 +0000 (15:53 +0200)
Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
src/librbd/ImageCtx.cc
src/librbd/io/Utils.cc
src/librbd/io/Utils.h

index 347e8867fa2316f7cf817d090a29ad4115050e4e..7d3016abef1b4e94c68f82e527f14fb5aa91d37b 100644 (file)
@@ -736,18 +736,7 @@ librados::IoCtx duplicate_io_ctx(librados::IoCtx& io_ctx) {
 
     auto overlap = reduce_parent_overlap(raw_overlap, migration_write);
     if (area == overlap.second) {
-      // drop extents completely beyond the overlap
-      while (!image_extents.empty() &&
-             image_extents.back().first >= overlap.first) {
-        image_extents.pop_back();
-      }
-      if (!image_extents.empty()) {
-        // trim final overlapping extent
-        auto& last_extent = image_extents.back();
-        if (last_extent.first + last_extent.second > overlap.first) {
-          last_extent.second = overlap.first - last_extent.first;
-        }
-      }
+      io::util::prune_extents(image_extents, overlap.first);
     } else if (area == io::ImageArea::DATA &&
                overlap.second == io::ImageArea::CRYPTO_HEADER) {
       // all extents completely beyond the overlap
index 86a48504fcf11f6000aa82190bfce1332ca395b5..00a7ef6d995592c580ec7e1e5641b0d576583018 100644 (file)
@@ -155,6 +155,21 @@ int clip_request(I* image_ctx, Extents* image_extents, ImageArea area) {
   return 0;
 }
 
+void prune_extents(Extents& extents, uint64_t size) {
+  // drop extents completely beyond size
+  while (!extents.empty() && extents.back().first >= size) {
+    extents.pop_back();
+  }
+
+  if (!extents.empty()) {
+    // trim final overlapping extent
+    auto& last_extent = extents.back();
+    if (last_extent.first + last_extent.second > size) {
+      last_extent.second = size - last_extent.first;
+    }
+  }
+}
+
 void unsparsify(CephContext* cct, ceph::bufferlist* bl,
                 const Extents& extent_map, uint64_t bl_off,
                 uint64_t out_bl_len) {
index efb79b6a64da86d089f2b30cf5b959a9b6e8f2c6..84bcd437abb7bfb013602c0d4cfbb91231a200b1 100644 (file)
@@ -46,6 +46,7 @@ inline uint64_t get_extents_length(const Extents &extents) {
   return total_bytes;
 }
 
+void prune_extents(Extents& extents, uint64_t size);
 void unsparsify(CephContext* cct, ceph::bufferlist* bl,
                 const Extents& extent_map, uint64_t bl_off,
                 uint64_t out_bl_len);