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
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) {
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);