1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
4 #include "librbd/io/ObjectDispatch.h"
5 #include "common/dout.h"
6 #include "common/WorkQueue.h"
7 #include "librbd/ImageCtx.h"
8 #include "librbd/Utils.h"
9 #include "librbd/io/ObjectRequest.h"
11 #define dout_subsys ceph_subsys_rbd
13 #define dout_prefix *_dout << "librbd::io::ObjectDispatch: " << this \
14 << " " << __func__ << ": "
19 using librbd::util::data_object_name
;
22 ObjectDispatch
<I
>::ObjectDispatch(I
* image_ctx
)
23 : m_image_ctx(image_ctx
) {
27 void ObjectDispatch
<I
>::shut_down(Context
* on_finish
) {
28 auto cct
= m_image_ctx
->cct
;
29 ldout(cct
, 5) << dendl
;
31 m_image_ctx
->op_work_queue
->queue(on_finish
, 0);
35 bool ObjectDispatch
<I
>::read(
36 uint64_t object_no
, uint64_t object_off
, uint64_t object_len
,
37 librados::snap_t snap_id
, int op_flags
, const ZTracer::Trace
&parent_trace
,
38 ceph::bufferlist
* read_data
, ExtentMap
* extent_map
,
39 int* object_dispatch_flags
, DispatchResult
* dispatch_result
,
40 Context
** on_finish
, Context
* on_dispatched
) {
41 auto cct
= m_image_ctx
->cct
;
42 ldout(cct
, 20) << data_object_name(m_image_ctx
, object_no
) << " "
43 << object_off
<< "~" << object_len
<< dendl
;
45 *dispatch_result
= DISPATCH_RESULT_COMPLETE
;
46 auto req
= new ObjectReadRequest
<I
>(m_image_ctx
, object_no
, object_off
,
47 object_len
, snap_id
, op_flags
,
48 parent_trace
, read_data
, extent_map
,
55 bool ObjectDispatch
<I
>::discard(
56 uint64_t object_no
, uint64_t object_off
, uint64_t object_len
,
57 const ::SnapContext
&snapc
, int discard_flags
,
58 const ZTracer::Trace
&parent_trace
, int* object_dispatch_flags
,
59 uint64_t* journal_tid
, DispatchResult
* dispatch_result
,
60 Context
** on_finish
, Context
* on_dispatched
) {
61 auto cct
= m_image_ctx
->cct
;
62 ldout(cct
, 20) << data_object_name(m_image_ctx
, object_no
) << " "
63 << object_off
<< "~" << object_len
<< dendl
;
65 *dispatch_result
= DISPATCH_RESULT_COMPLETE
;
66 auto req
= new ObjectDiscardRequest
<I
>(m_image_ctx
, object_no
, object_off
,
67 object_len
, snapc
, discard_flags
,
68 parent_trace
, on_dispatched
);
74 bool ObjectDispatch
<I
>::write(
75 uint64_t object_no
, uint64_t object_off
, ceph::bufferlist
&& data
,
76 const ::SnapContext
&snapc
, int op_flags
,
77 const ZTracer::Trace
&parent_trace
, int* object_dispatch_flags
,
78 uint64_t* journal_tid
, DispatchResult
* dispatch_result
,
79 Context
** on_finish
, Context
* on_dispatched
) {
80 auto cct
= m_image_ctx
->cct
;
81 ldout(cct
, 20) << data_object_name(m_image_ctx
, object_no
) << " "
82 << object_off
<< "~" << data
.length() << dendl
;
84 *dispatch_result
= DISPATCH_RESULT_COMPLETE
;
85 auto req
= new ObjectWriteRequest
<I
>(m_image_ctx
, object_no
, object_off
,
86 std::move(data
), snapc
, op_flags
,
87 parent_trace
, on_dispatched
);
93 bool ObjectDispatch
<I
>::write_same(
94 uint64_t object_no
, uint64_t object_off
, uint64_t object_len
,
95 LightweightBufferExtents
&& buffer_extents
, ceph::bufferlist
&& data
,
96 const ::SnapContext
&snapc
, int op_flags
,
97 const ZTracer::Trace
&parent_trace
, int* object_dispatch_flags
,
98 uint64_t* journal_tid
, DispatchResult
* dispatch_result
,
99 Context
** on_finish
, Context
* on_dispatched
) {
100 auto cct
= m_image_ctx
->cct
;
101 ldout(cct
, 20) << data_object_name(m_image_ctx
, object_no
) << " "
102 << object_off
<< "~" << object_len
<< dendl
;
104 *dispatch_result
= DISPATCH_RESULT_COMPLETE
;
105 auto req
= new ObjectWriteSameRequest
<I
>(m_image_ctx
, object_no
,
106 object_off
, object_len
,
107 std::move(data
), snapc
, op_flags
,
108 parent_trace
, on_dispatched
);
113 template <typename I
>
114 bool ObjectDispatch
<I
>::compare_and_write(
115 uint64_t object_no
, uint64_t object_off
, ceph::bufferlist
&& cmp_data
,
116 ceph::bufferlist
&& write_data
, const ::SnapContext
&snapc
, int op_flags
,
117 const ZTracer::Trace
&parent_trace
, uint64_t* mismatch_offset
,
118 int* object_dispatch_flags
, uint64_t* journal_tid
,
119 DispatchResult
* dispatch_result
, Context
** on_finish
,
120 Context
* on_dispatched
) {
121 auto cct
= m_image_ctx
->cct
;
122 ldout(cct
, 20) << data_object_name(m_image_ctx
, object_no
) << " "
123 << object_off
<< "~" << write_data
.length() << dendl
;
125 *dispatch_result
= DISPATCH_RESULT_COMPLETE
;
126 auto req
= new ObjectCompareAndWriteRequest
<I
>(m_image_ctx
, object_no
,
129 std::move(write_data
), snapc
,
130 mismatch_offset
, op_flags
,
131 parent_trace
, on_dispatched
);
137 } // namespace librbd
139 template class librbd::io::ObjectDispatch
<librbd::ImageCtx
>;