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