From: Ilya Dryomov Date: Sat, 31 Aug 2024 10:00:48 +0000 (+0200) Subject: librbd: factor out prune_extents() from prune_parent_extents() X-Git-Tag: v20.0.0~1134^2~2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=5d64c9c5cda5c1ca44c349cfb9e4f1e9eac21bd5;p=ceph.git librbd: factor out prune_extents() from prune_parent_extents() Signed-off-by: Ilya Dryomov --- diff --git a/src/librbd/ImageCtx.cc b/src/librbd/ImageCtx.cc index 347e8867fa231..7d3016abef1b4 100644 --- a/src/librbd/ImageCtx.cc +++ b/src/librbd/ImageCtx.cc @@ -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 diff --git a/src/librbd/io/Utils.cc b/src/librbd/io/Utils.cc index 86a48504fcf11..00a7ef6d99559 100644 --- a/src/librbd/io/Utils.cc +++ b/src/librbd/io/Utils.cc @@ -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) { diff --git a/src/librbd/io/Utils.h b/src/librbd/io/Utils.h index efb79b6a64da8..84bcd437abb7b 100644 --- a/src/librbd/io/Utils.h +++ b/src/librbd/io/Utils.h @@ -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);