1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
3 #ifndef CEPH_LIBRBD_INTERNAL_H
4 #define CEPH_LIBRBD_INTERNAL_H
6 #include "include/int_types.h"
13 #include "include/buffer_fwd.h"
14 #include "include/rbd/librbd.hpp"
15 #include "include/rbd_types.h"
16 #include "cls/rbd/cls_rbd_types.h"
17 #include "common/WorkQueue.h"
18 #include "librbd/Types.h"
21 l_librbd_first
= 26000,
23 l_librbd_rd
, // read ops
24 l_librbd_rd_bytes
, // bytes read
25 l_librbd_rd_latency
, // average latency
30 l_librbd_discard_bytes
,
31 l_librbd_discard_latency
,
35 l_librbd_aio_flush_latency
,
42 l_librbd_snap_rollback
,
49 l_librbd_readahead_bytes
,
51 l_librbd_invalidate_cache
,
59 namespace io
{ struct AioCompletion
; }
61 class NoOpProgressContext
: public ProgressContext
67 int update_progress(uint64_t offset
, uint64_t src_size
) override
73 int detect_format(librados::IoCtx
&io_ctx
, const std::string
&name
,
74 bool *old_format
, uint64_t *size
);
76 bool has_parent(int64_t parent_pool_id
, uint64_t off
, uint64_t overlap
);
78 std::string
image_option_name(int optname
);
79 void image_options_create(rbd_image_options_t
* opts
);
80 void image_options_create_ref(rbd_image_options_t
* opts
,
81 rbd_image_options_t orig
);
82 void image_options_copy(rbd_image_options_t
*opts
,
83 const ImageOptions
&orig
);
84 void image_options_destroy(rbd_image_options_t opts
);
85 int image_options_set(rbd_image_options_t opts
, int optname
,
86 const std::string
& optval
);
87 int image_options_set(rbd_image_options_t opts
, int optname
, uint64_t optval
);
88 int image_options_get(rbd_image_options_t opts
, int optname
,
90 int image_options_get(rbd_image_options_t opts
, int optname
,
92 int image_options_is_set(rbd_image_options_t opts
, int optname
,
94 int image_options_unset(rbd_image_options_t opts
, int optname
);
95 void image_options_clear(rbd_image_options_t opts
);
96 bool image_options_is_empty(rbd_image_options_t opts
);
98 int snap_set(ImageCtx
*ictx
, const cls::rbd::SnapshotNamespace
&snap_namespace
,
99 const char *snap_name
);
101 int list(librados::IoCtx
& io_ctx
, std::vector
<std::string
>& names
);
102 int list_children(ImageCtx
*ictx
,
103 std::set
<std::pair
<std::string
, std::string
> > & names
);
104 int create(librados::IoCtx
& io_ctx
, const char *imgname
, uint64_t size
,
106 int create(librados::IoCtx
& io_ctx
, const char *imgname
, uint64_t size
,
107 bool old_format
, uint64_t features
, int *order
,
108 uint64_t stripe_unit
, uint64_t stripe_count
);
109 int create(IoCtx
& io_ctx
, const std::string
&image_name
,
110 const std::string
&image_id
, uint64_t size
, ImageOptions
& opts
,
111 const std::string
&non_primary_global_image_id
,
112 const std::string
&primary_mirror_uuid
,
113 bool skip_mirror_enable
);
114 int clone(IoCtx
& p_ioctx
, const char *p_name
, const char *p_snap_name
,
115 IoCtx
& c_ioctx
, const char *c_name
,
116 uint64_t features
, int *c_order
,
117 uint64_t stripe_unit
, int stripe_count
);
118 int clone(IoCtx
& p_ioctx
, const char *p_name
, const char *p_snap_name
,
119 IoCtx
& c_ioctx
, const char *c_name
, ImageOptions
& c_opts
);
120 int clone(ImageCtx
*p_imctx
, IoCtx
& c_ioctx
, const std::string
&c_name
,
121 const std::string
&c_id
, ImageOptions
& c_opts
,
122 const std::string
&non_primary_global_image_id
,
123 const std::string
&primary_mirror_uuid
);
124 int rename(librados::IoCtx
& io_ctx
, const char *srcname
, const char *dstname
);
125 int info(ImageCtx
*ictx
, image_info_t
& info
, size_t image_size
);
126 int get_old_format(ImageCtx
*ictx
, uint8_t *old
);
127 int get_size(ImageCtx
*ictx
, uint64_t *size
);
128 int get_features(ImageCtx
*ictx
, uint64_t *features
);
129 int get_overlap(ImageCtx
*ictx
, uint64_t *overlap
);
130 int get_parent_info(ImageCtx
*ictx
, std::string
*parent_pool_name
,
131 std::string
*parent_name
, std::string
*parent_id
,
132 std::string
*parent_snap_name
);
133 int get_flags(ImageCtx
*ictx
, uint64_t *flags
);
134 int set_image_notification(ImageCtx
*ictx
, int fd
, int type
);
135 int is_exclusive_lock_owner(ImageCtx
*ictx
, bool *is_owner
);
136 int lock_acquire(ImageCtx
*ictx
, rbd_lock_mode_t lock_mode
);
137 int lock_release(ImageCtx
*ictx
);
138 int lock_get_owners(ImageCtx
*ictx
, rbd_lock_mode_t
*lock_mode
,
139 std::list
<std::string
> *lock_owners
);
140 int lock_break(ImageCtx
*ictx
, rbd_lock_mode_t lock_mode
,
141 const std::string
&lock_owner
);
143 int remove(librados::IoCtx
& io_ctx
, const std::string
&image_name
,
144 const std::string
&image_id
, ProgressContext
& prog_ctx
,
145 bool force
=false, bool from_trash_remove
=false);
147 int trash_move(librados::IoCtx
&io_ctx
, rbd_trash_image_source_t source
,
148 const std::string
&image_name
, uint64_t delay
);
149 int trash_get(IoCtx
&io_ctx
, const std::string
&id
, trash_image_info_t
*info
);
150 int trash_list(librados::IoCtx
&io_ctx
,
151 std::vector
<trash_image_info_t
> &entries
);
152 int trash_remove(librados::IoCtx
&io_ctx
, const std::string
&image_id
,
153 bool force
, ProgressContext
& prog_ctx
);
154 int trash_restore(librados::IoCtx
&io_ctx
, const std::string
&image_id
,
155 const std::string
&image_new_name
);
157 int snap_list(ImageCtx
*ictx
, std::vector
<snap_info_t
>& snaps
);
158 int snap_exists(ImageCtx
*ictx
, const cls::rbd::SnapshotNamespace
& snap_namespace
,
159 const char *snap_name
, bool *exists
);
160 int snap_get_limit(ImageCtx
*ictx
, uint64_t *limit
);
161 int snap_set_limit(ImageCtx
*ictx
, uint64_t limit
);
162 int snap_get_timestamp(ImageCtx
*ictx
, uint64_t snap_id
, struct timespec
*timestamp
);
163 int snap_remove(ImageCtx
*ictx
, const char *snap_name
, uint32_t flags
, ProgressContext
& pctx
);
164 int snap_is_protected(ImageCtx
*ictx
, const char *snap_name
,
166 int copy(ImageCtx
*ictx
, IoCtx
& dest_md_ctx
, const char *destname
,
167 ImageOptions
& opts
, ProgressContext
&prog_ctx
, size_t sparse_size
);
168 int copy(ImageCtx
*src
, ImageCtx
*dest
, ProgressContext
&prog_ctx
, size_t sparse_size
);
170 /* cooperative locking */
171 int list_lockers(ImageCtx
*ictx
,
172 std::list
<locker_t
> *locks
,
175 int lock(ImageCtx
*ictx
, bool exclusive
, const std::string
& cookie
,
176 const std::string
& tag
);
177 int lock_shared(ImageCtx
*ictx
, const std::string
& cookie
,
178 const std::string
& tag
);
179 int unlock(ImageCtx
*ictx
, const std::string
& cookie
);
180 int break_lock(ImageCtx
*ictx
, const std::string
& client
,
181 const std::string
& cookie
);
183 void trim_image(ImageCtx
*ictx
, uint64_t newsize
, ProgressContext
& prog_ctx
);
185 int read_header_bl(librados::IoCtx
& io_ctx
, const std::string
& md_oid
,
186 ceph::bufferlist
& header
, uint64_t *ver
);
187 int read_header(librados::IoCtx
& io_ctx
, const std::string
& md_oid
,
188 struct rbd_obj_header_ondisk
*header
, uint64_t *ver
);
189 int tmap_set(librados::IoCtx
& io_ctx
, const std::string
& imgname
);
190 int tmap_rm(librados::IoCtx
& io_ctx
, const std::string
& imgname
);
191 void image_info(const ImageCtx
*ictx
, image_info_t
& info
, size_t info_size
);
192 uint64_t oid_to_object_no(const std::string
& oid
,
193 const std::string
& object_prefix
);
194 int clip_io(ImageCtx
*ictx
, uint64_t off
, uint64_t *len
);
195 void init_rbd_header(struct rbd_obj_header_ondisk
& ondisk
,
196 uint64_t size
, int order
, uint64_t bid
);
198 int64_t read_iterate(ImageCtx
*ictx
, uint64_t off
, uint64_t len
,
199 int (*cb
)(uint64_t, size_t, const char *, void *),
201 void readahead(ImageCtx
*ictx
,
202 const vector
<pair
<uint64_t,uint64_t> >& image_extents
);
204 int flush(ImageCtx
*ictx
);
205 int invalidate_cache(ImageCtx
*ictx
);
206 int poll_io_events(ImageCtx
*ictx
, io::AioCompletion
**comps
, int numcomp
);
207 int metadata_list(ImageCtx
*ictx
, const string
&last
, uint64_t max
, map
<string
, bufferlist
> *pairs
);
208 int metadata_get(ImageCtx
*ictx
, const std::string
&key
, std::string
*value
);