]> 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, 8 Sep 2024 20:03:57 +0000 (22:03 +0200)
Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
(cherry picked from commit 5d64c9c5cda5c1ca44c349cfb9e4f1e9eac21bd5)

Conflicts:
src/librbd/ImageCtx.cc [ ImageArea support not in quincy ]

src/librbd/ImageCtx.cc
src/librbd/io/Utils.cc
src/librbd/io/Utils.h

index 7d41376325e6d1f3ed3e3a60600a532d90b8a4c4..7a1d2a0fd14e5934b862e99f4c1762f383fdc779 100644 (file)
@@ -35,6 +35,7 @@
 #include "librbd/io/ObjectDispatcher.h"
 #include "librbd/io/QosImageDispatch.h"
 #include "librbd/io/IoOperations.h"
+#include "librbd/io/Utils.h"
 #include "librbd/journal/StandardPolicy.h"
 #include "librbd/operation/ResizeRequest.h"
 
@@ -692,13 +693,7 @@ librados::IoCtx duplicate_io_ctx(librados::IoCtx& io_ctx) {
   uint64_t ImageCtx::prune_parent_extents(vector<pair<uint64_t,uint64_t> >& objectx,
                                          uint64_t overlap)
   {
-    // drop extents completely beyond the overlap
-    while (!objectx.empty() && objectx.back().first >= overlap)
-      objectx.pop_back();
-
-    // trim final overlapping extent
-    if (!objectx.empty() && objectx.back().first + objectx.back().second > overlap)
-      objectx.back().second = overlap - objectx.back().first;
+    io::util::prune_extents(objectx, overlap);
 
     uint64_t len = 0;
     for (vector<pair<uint64_t,uint64_t> >::iterator p = objectx.begin();
index 2ce9dd11fc67f8cc0286c6cf74f873cb8bbc8443..0156309cd8db98c946c30ca03c952397652b09e4 100644 (file)
@@ -153,6 +153,21 @@ int clip_request(I *image_ctx, Extents *image_extents) {
   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 9f7e0b94668bad13062cfbd88119a6a7c5b3978d..fbe19e8e42997aa83433c2317429553dafded925 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);