1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
4 #ifndef CEPH_LIBRBD_IO_READ_RESULT_H
5 #define CEPH_LIBRBD_IO_READ_RESULT_H
7 #include "include/int_types.h"
8 #include "include/buffer_fwd.h"
9 #include "include/Context.h"
10 #include "librbd/io/Types.h"
11 #include "osdc/Striper.h"
13 #include <boost/variant/variant.hpp>
21 template <typename> struct ObjectReadRequest;
25 struct C_ReadRequest : public Context {
26 AioCompletion *aio_completion;
29 C_ReadRequest(AioCompletion *aio_completion);
31 void finish(int r) override;
36 struct C_ImageReadRequest : public C_ReadRequest {
37 Extents image_extents;
39 C_ImageReadRequest(AioCompletion *aio_completion,
40 const Extents image_extents)
41 : C_ReadRequest(aio_completion), image_extents(image_extents) {
44 void finish(int r) override;
47 struct C_SparseReadRequestBase : public C_ReadRequest {
48 C_SparseReadRequestBase(AioCompletion *aio_completion)
49 : C_ReadRequest(aio_completion) {
52 using C_ReadRequest::finish;
53 void finish(ExtentMap &extent_map, const Extents &buffer_extents,
54 uint64_t offset, size_t length, bufferlist &bl, int r);
57 template <typename ImageCtxT>
58 struct C_SparseReadRequest : public C_SparseReadRequestBase {
59 ObjectReadRequest<ImageCtxT> *request;
61 C_SparseReadRequest(AioCompletion *aio_completion)
62 : C_SparseReadRequestBase(aio_completion) {
65 void finish(int r) override {
66 C_SparseReadRequestBase::finish(request->get_extent_map(),
67 request->get_buffer_extents(),
68 request->get_offset(),
69 request->get_length(), request->data(),
75 ReadResult(char *buf, size_t buf_len);
76 ReadResult(const struct iovec *iov, int iov_count);
77 ReadResult(ceph::bufferlist *bl);
79 void set_clip_length(size_t length);
80 void assemble_result(CephContext *cct);
90 Linear(char *buf, size_t buf_len) : buf(buf), buf_len(buf_len) {
95 const struct iovec *iov;
98 Vector(const struct iovec *iov, int iov_count)
99 : iov(iov), iov_count(iov_count) {
104 ceph::bufferlist *bl;
106 Bufferlist(ceph::bufferlist *bl) : bl(bl) {
110 typedef boost::variant<Empty,
114 struct SetClipLengthVisitor;
115 struct AssembleResultVisitor;
118 Striper::StripedReadResult m_destriper;
123 } // namespace librbd
125 #endif // CEPH_LIBRBD_IO_READ_RESULT_H