aio_comp->set_request_count(1);
aio_comp->read_result = std::move(read_result);
- uint64_t length = io::util::extents_length(image_extents);
- aio_comp->read_result.set_clip_length(length);
+ aio_comp->read_result.set_image_extents(image_extents);
auto *req_comp = new io::ReadResult::C_ImageReadRequest(
aio_comp, image_extents);
template <typename I>
bool WriteLogImageDispatch<I>::preprocess_length(
io::AioCompletion* aio_comp, io::Extents &image_extents) const {
- auto total_bytes = io::util::extents_length(image_extents);
+ auto total_bytes = io::util::get_extents_length(image_extents);
if (total_bytes == 0) {
aio_comp->set_request_count(0);
return true;
}
AioCompletion *aio_comp = this->m_aio_comp;
- aio_comp->read_result.set_clip_length(buffer_ofs);
aio_comp->read_result.set_image_extents(image_extents);
// issue the requests
#include "include/buffer.h"
#include "common/dout.h"
#include "librbd/io/AioCompletion.h"
+#include "librbd/io/Utils.h"
#include <boost/variant/apply_visitor.hpp>
#include <boost/variant/static_visitor.hpp>
namespace librbd {
namespace io {
-struct ReadResult::SetClipLengthVisitor : public boost::static_visitor<void> {
- size_t length;
+struct ReadResult::SetImageExtentsVisitor : public boost::static_visitor<void> {
+ Extents image_extents;
- explicit SetClipLengthVisitor(size_t length) : length(length) {
+ explicit SetImageExtentsVisitor(const Extents& image_extents)
+ : image_extents(image_extents) {
}
void operator()(Linear &linear) const {
+ uint64_t length = util::get_extents_length(image_extents);
+
ceph_assert(length <= linear.buf_len);
linear.buf_len = length;
}
- template <typename T>
- void operator()(T &t) const {
- }
-};
-
-struct ReadResult::SetImageExtentsVisitor : public boost::static_visitor<void> {
- Extents image_extents;
-
- explicit SetImageExtentsVisitor(const Extents& image_extents)
- : image_extents(image_extents) {
- }
-
void operator()(SparseBufferlist &sbl) const {
sbl.image_extents = image_extents;
}
: m_buffer(SparseBufferlist(extent_map, bl)) {
}
-void ReadResult::set_clip_length(size_t length) {
- boost::apply_visitor(SetClipLengthVisitor(length), m_buffer);
-}
-
void ReadResult::set_image_extents(const Extents& image_extents) {
boost::apply_visitor(SetImageExtentsVisitor(image_extents), m_buffer);
}
ReadResult(ceph::bufferlist *bl);
ReadResult(Extents* extent_map, ceph::bufferlist* bl);
- void set_clip_length(size_t length);
void set_image_extents(const Extents& image_extents);
void assemble_result(CephContext *cct);
Vector,
Bufferlist,
SparseBufferlist> Buffer;
- struct SetClipLengthVisitor;
struct SetImageExtentsVisitor;
struct AssembleResultVisitor;
return 0;
}
-uint64_t extents_length(Extents &extents) {
- uint64_t total_bytes = 0;
- for (auto& image_extent : extents) {
- total_bytes += image_extent.second;
- }
- return total_bytes;
-}
-
void unsparsify(CephContext* cct, ceph::bufferlist* bl,
const Extents& extent_map, uint64_t bl_off,
uint64_t out_bl_len) {
template <typename ImageCtxT = librbd::ImageCtx>
int clip_request(ImageCtxT *image_ctx, Extents *image_extents);
-uint64_t extents_length(Extents &extents);
+inline uint64_t get_extents_length(const Extents &extents) {
+ uint64_t total_bytes = 0;
+ for (auto [_, extent_length] : extents) {
+ total_bytes += extent_length;
+ }
+ return total_bytes;
+}
void unsparsify(CephContext* cct, ceph::bufferlist* bl,
const Extents& extent_map, uint64_t bl_off,