#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"
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();
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);