1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
4 #ifndef CEPH_RBD_UTILS_H
5 #define CEPH_RBD_UTILS_H
7 #include "include/int_types.h"
8 #include "include/rados/librados.hpp"
9 #include "include/rbd/librbd.hpp"
10 #include "tools/rbd/ArgumentTypes.h"
12 #include <boost/program_options.hpp>
19 template <typename T
, void(T::*MF
)(int)>
20 void aio_completion_callback(librbd::completion_t completion
,
22 librbd::RBD::AioCompletion
*aio_completion
=
23 reinterpret_cast<librbd::RBD::AioCompletion
*>(completion
);
25 // complete the AIO callback in separate thread context
26 T
*t
= reinterpret_cast<T
*>(arg
);
27 int r
= aio_completion
->get_return_value();
28 aio_completion
->release();
35 static const std::string
RBD_DIFF_BANNER ("rbd diff v1\n");
36 static const size_t RBD_DEFAULT_SPARSE_SIZE
= 4096;
38 static const std::string
RBD_IMAGE_BANNER_V2 ("rbd image v2\n");
39 static const std::string
RBD_IMAGE_DIFFS_BANNER_V2 ("rbd image diffs v2\n");
40 static const std::string
RBD_DIFF_BANNER_V2 ("rbd diff v2\n");
42 #define RBD_DIFF_FROM_SNAP 'f'
43 #define RBD_DIFF_TO_SNAP 't'
44 #define RBD_DIFF_IMAGE_SIZE 's'
45 #define RBD_DIFF_WRITE 'w'
46 #define RBD_DIFF_ZERO 'z'
47 #define RBD_DIFF_END 'e'
49 #define RBD_EXPORT_IMAGE_ORDER 'O'
50 #define RBD_EXPORT_IMAGE_FEATURES 'T'
51 #define RBD_EXPORT_IMAGE_STRIPE_UNIT 'U'
52 #define RBD_EXPORT_IMAGE_STRIPE_COUNT 'C'
53 #define RBD_EXPORT_IMAGE_END 'E'
55 enum SnapshotPresence
{
56 SNAPSHOT_PRESENCE_NONE
,
57 SNAPSHOT_PRESENCE_PERMITTED
,
58 SNAPSHOT_PRESENCE_REQUIRED
67 struct ProgressContext
: public librbd::ProgressContext
{
68 const char *operation
;
72 ProgressContext(const char *o
, bool no_progress
)
73 : operation(o
), progress(!no_progress
), last_pc(0) {
76 int update_progress(uint64_t offset
, uint64_t total
) override
;
81 template <typename T
, void(T::*MF
)(int)>
82 librbd::RBD::AioCompletion
*create_aio_completion(T
*t
) {
83 return new librbd::RBD::AioCompletion(
84 t
, &detail::aio_completion_callback
<T
, MF
>);
87 void aio_context_callback(librbd::completion_t completion
, void *arg
);
89 int read_string(int fd
, unsigned max
, std::string
*out
);
91 int extract_spec(const std::string
&spec
, std::string
*pool_name
,
92 std::string
*image_name
, std::string
*snap_name
,
93 SpecValidation spec_validation
);
95 int extract_group_spec(const std::string
&spec
,
96 std::string
*pool_name
,
97 std::string
*group_name
);
99 int extract_image_id_spec(const std::string
&spec
, std::string
*pool_name
,
100 std::string
*image_id
);
102 std::string
get_positional_argument(
103 const boost::program_options::variables_map
&vm
, size_t index
);
105 std::string
get_default_pool_name();
106 std::string
get_pool_name(const boost::program_options::variables_map
&vm
,
109 int get_pool_image_snapshot_names(
110 const boost::program_options::variables_map
&vm
,
111 argument_types::ArgumentModifier mod
, size_t *spec_arg_index
,
112 std::string
*pool_name
, std::string
*image_name
, std::string
*snap_name
,
113 SnapshotPresence snapshot_presence
, SpecValidation spec_validation
,
114 bool image_required
= true);
116 int get_pool_snapshot_names(const boost::program_options::variables_map
&vm
,
117 argument_types::ArgumentModifier mod
,
118 size_t *spec_arg_index
, std::string
*pool_name
,
119 std::string
*snap_name
,
120 SnapshotPresence snapshot_presence
,
121 SpecValidation spec_validation
);
123 int get_special_pool_group_names(const boost::program_options::variables_map
&vm
,
125 std::string
*group_pool_name
,
126 std::string
*group_name
);
128 int get_special_pool_image_names(const boost::program_options::variables_map
&vm
,
130 std::string
*image_pool_name
,
131 std::string
*image_name
);
133 int get_pool_image_id(const boost::program_options::variables_map
&vm
,
134 size_t *arg_index
, std::string
*image_pool_name
,
135 std::string
*image_id
);
137 int get_pool_group_names(const boost::program_options::variables_map
&vm
,
138 argument_types::ArgumentModifier mod
,
139 size_t *spec_arg_index
,
140 std::string
*pool_name
,
141 std::string
*group_name
);
143 int get_pool_journal_names(
144 const boost::program_options::variables_map
&vm
,
145 argument_types::ArgumentModifier mod
, size_t *spec_arg_index
,
146 std::string
*pool_name
, std::string
*journal_name
);
148 int validate_snapshot_name(argument_types::ArgumentModifier mod
,
149 const std::string
&snap_name
,
150 SnapshotPresence snapshot_presence
,
151 SpecValidation spec_validation
);
153 int get_image_options(const boost::program_options::variables_map
&vm
,
154 bool get_format
, librbd::ImageOptions
* opts
);
156 int get_journal_options(const boost::program_options::variables_map
&vm
,
157 librbd::ImageOptions
*opts
);
159 int get_image_size(const boost::program_options::variables_map
&vm
,
162 int get_path(const boost::program_options::variables_map
&vm
,
163 const std::string
&positional_path
, std::string
*path
);
165 int get_formatter(const boost::program_options::variables_map
&vm
,
166 argument_types::Format::Formatter
*formatter
);
170 int init(const std::string
&pool_name
, librados::Rados
*rados
,
171 librados::IoCtx
*io_ctx
);
173 int init_io_ctx(librados::Rados
&rados
, const std::string
&pool_name
,
174 librados::IoCtx
*io_ctx
);
176 int open_image(librados::IoCtx
&io_ctx
, const std::string
&image_name
,
177 bool read_only
, librbd::Image
*image
);
179 int open_image_by_id(librados::IoCtx
&io_ctx
, const std::string
&image_id
,
180 bool read_only
, librbd::Image
*image
);
182 int init_and_open_image(const std::string
&pool_name
,
183 const std::string
&image_name
,
184 const std::string
&image_id
,
185 const std::string
&snap_name
, bool read_only
,
186 librados::Rados
*rados
, librados::IoCtx
*io_ctx
,
187 librbd::Image
*image
);
189 int snap_set(librbd::Image
&image
, const std::string
&snap_name
);
191 void calc_sparse_extent(const bufferptr
&bp
,
193 size_t buffer_offset
,
195 size_t *write_length
,
198 bool check_if_image_spec_present(const boost::program_options::variables_map
&vm
,
199 argument_types::ArgumentModifier mod
,
200 size_t spec_arg_index
);
202 std::string
image_id(librbd::Image
& image
);
204 std::string
mirror_image_state(librbd::mirror_image_state_t mirror_image_state
);
205 std::string
mirror_image_status_state(librbd::mirror_image_status_state_t state
);
206 std::string
mirror_image_status_state(librbd::mirror_image_status_t status
);
208 std::string
timestr(time_t t
);
210 // duplicate here to not include librbd_internal lib
211 uint64_t get_rbd_default_features(CephContext
* cct
);
216 #endif // CEPH_RBD_UTILS_H