aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/ceph/osd_client.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/linux/ceph/osd_client.h')
-rw-r--r--include/linux/ceph/osd_client.h204
1 files changed, 135 insertions, 69 deletions
diff --git a/include/linux/ceph/osd_client.h b/include/linux/ceph/osd_client.h
index 1dd5d466b6f9..186db0bf4951 100644
--- a/include/linux/ceph/osd_client.h
+++ b/include/linux/ceph/osd_client.h
@@ -29,6 +29,7 @@ struct ceph_authorizer;
29 */ 29 */
30typedef void (*ceph_osdc_callback_t)(struct ceph_osd_request *, 30typedef void (*ceph_osdc_callback_t)(struct ceph_osd_request *,
31 struct ceph_msg *); 31 struct ceph_msg *);
32typedef void (*ceph_osdc_unsafe_callback_t)(struct ceph_osd_request *, bool);
32 33
33/* a given osd we're communicating with */ 34/* a given osd we're communicating with */
34struct ceph_osd { 35struct ceph_osd {
@@ -48,7 +49,67 @@ struct ceph_osd {
48}; 49};
49 50
50 51
51#define CEPH_OSD_MAX_OP 10 52#define CEPH_OSD_MAX_OP 2
53
54enum ceph_osd_data_type {
55 CEPH_OSD_DATA_TYPE_NONE = 0,
56 CEPH_OSD_DATA_TYPE_PAGES,
57 CEPH_OSD_DATA_TYPE_PAGELIST,
58#ifdef CONFIG_BLOCK
59 CEPH_OSD_DATA_TYPE_BIO,
60#endif /* CONFIG_BLOCK */
61};
62
63struct ceph_osd_data {
64 enum ceph_osd_data_type type;
65 union {
66 struct {
67 struct page **pages;
68 u64 length;
69 u32 alignment;
70 bool pages_from_pool;
71 bool own_pages;
72 };
73 struct ceph_pagelist *pagelist;
74#ifdef CONFIG_BLOCK
75 struct {
76 struct bio *bio; /* list of bios */
77 size_t bio_length; /* total in list */
78 };
79#endif /* CONFIG_BLOCK */
80 };
81};
82
83struct ceph_osd_req_op {
84 u16 op; /* CEPH_OSD_OP_* */
85 u32 payload_len;
86 union {
87 struct ceph_osd_data raw_data_in;
88 struct {
89 u64 offset, length;
90 u64 truncate_size;
91 u32 truncate_seq;
92 struct ceph_osd_data osd_data;
93 } extent;
94 struct {
95 const char *class_name;
96 const char *method_name;
97 struct ceph_osd_data request_info;
98 struct ceph_osd_data request_data;
99 struct ceph_osd_data response_data;
100 __u8 class_len;
101 __u8 method_len;
102 __u8 argc;
103 } cls;
104 struct {
105 u64 cookie;
106 u64 ver;
107 u32 prot_ver;
108 u32 timeout;
109 __u8 flag;
110 } watch;
111 };
112};
52 113
53/* an in-flight request */ 114/* an in-flight request */
54struct ceph_osd_request { 115struct ceph_osd_request {
@@ -63,15 +124,14 @@ struct ceph_osd_request {
63 int r_pg_osds[CEPH_PG_MAX_SIZE]; 124 int r_pg_osds[CEPH_PG_MAX_SIZE];
64 int r_num_pg_osds; 125 int r_num_pg_osds;
65 126
66 struct ceph_connection *r_con_filling_msg;
67
68 struct ceph_msg *r_request, *r_reply; 127 struct ceph_msg *r_request, *r_reply;
69 int r_flags; /* any additional flags for the osd */ 128 int r_flags; /* any additional flags for the osd */
70 u32 r_sent; /* >0 if r_request is sending/sent */ 129 u32 r_sent; /* >0 if r_request is sending/sent */
71 int r_num_ops;
72 130
73 /* encoded message content */ 131 /* request osd ops array */
74 struct ceph_osd_op *r_request_ops; 132 unsigned int r_num_ops;
133 struct ceph_osd_req_op r_ops[CEPH_OSD_MAX_OP];
134
75 /* these are updated on each send */ 135 /* these are updated on each send */
76 __le32 *r_request_osdmap_epoch; 136 __le32 *r_request_osdmap_epoch;
77 __le32 *r_request_flags; 137 __le32 *r_request_flags;
@@ -85,12 +145,14 @@ struct ceph_osd_request {
85 s32 r_reply_op_result[CEPH_OSD_MAX_OP]; 145 s32 r_reply_op_result[CEPH_OSD_MAX_OP];
86 int r_got_reply; 146 int r_got_reply;
87 int r_linger; 147 int r_linger;
148 int r_completed;
88 149
89 struct ceph_osd_client *r_osdc; 150 struct ceph_osd_client *r_osdc;
90 struct kref r_kref; 151 struct kref r_kref;
91 bool r_mempool; 152 bool r_mempool;
92 struct completion r_completion, r_safe_completion; 153 struct completion r_completion, r_safe_completion;
93 ceph_osdc_callback_t r_callback, r_safe_callback; 154 ceph_osdc_callback_t r_callback;
155 ceph_osdc_unsafe_callback_t r_unsafe_callback;
94 struct ceph_eversion r_reassert_version; 156 struct ceph_eversion r_reassert_version;
95 struct list_head r_unsafe_item; 157 struct list_head r_unsafe_item;
96 158
@@ -104,16 +166,6 @@ struct ceph_osd_request {
104 166
105 struct ceph_file_layout r_file_layout; 167 struct ceph_file_layout r_file_layout;
106 struct ceph_snap_context *r_snapc; /* snap context for writes */ 168 struct ceph_snap_context *r_snapc; /* snap context for writes */
107 unsigned r_num_pages; /* size of page array (follows) */
108 unsigned r_page_alignment; /* io offset in first page */
109 struct page **r_pages; /* pages for data payload */
110 int r_pages_from_pool;
111 int r_own_pages; /* if true, i own page list */
112#ifdef CONFIG_BLOCK
113 struct bio *r_bio; /* instead of pages */
114#endif
115
116 struct ceph_pagelist r_trail; /* trailing part of the data */
117}; 169};
118 170
119struct ceph_osd_event { 171struct ceph_osd_event {
@@ -172,48 +224,8 @@ struct ceph_osd_client {
172 struct workqueue_struct *notify_wq; 224 struct workqueue_struct *notify_wq;
173}; 225};
174 226
175struct ceph_osd_req_op { 227extern int ceph_osdc_setup(void);
176 u16 op; /* CEPH_OSD_OP_* */ 228extern void ceph_osdc_cleanup(void);
177 u32 payload_len;
178 union {
179 struct {
180 u64 offset, length;
181 u64 truncate_size;
182 u32 truncate_seq;
183 } extent;
184 struct {
185 const char *name;
186 const char *val;
187 u32 name_len;
188 u32 value_len;
189 __u8 cmp_op; /* CEPH_OSD_CMPXATTR_OP_* */
190 __u8 cmp_mode; /* CEPH_OSD_CMPXATTR_MODE_* */
191 } xattr;
192 struct {
193 const char *class_name;
194 const char *method_name;
195 const char *indata;
196 u32 indata_len;
197 __u8 class_len;
198 __u8 method_len;
199 __u8 argc;
200 } cls;
201 struct {
202 u64 cookie;
203 u64 count;
204 } pgls;
205 struct {
206 u64 snapid;
207 } snap;
208 struct {
209 u64 cookie;
210 u64 ver;
211 u32 prot_ver;
212 u32 timeout;
213 __u8 flag;
214 } watch;
215 };
216};
217 229
218extern int ceph_osdc_init(struct ceph_osd_client *osdc, 230extern int ceph_osdc_init(struct ceph_osd_client *osdc,
219 struct ceph_client *client); 231 struct ceph_client *client);
@@ -224,16 +236,71 @@ extern void ceph_osdc_handle_reply(struct ceph_osd_client *osdc,
224extern void ceph_osdc_handle_map(struct ceph_osd_client *osdc, 236extern void ceph_osdc_handle_map(struct ceph_osd_client *osdc,
225 struct ceph_msg *msg); 237 struct ceph_msg *msg);
226 238
239extern void osd_req_op_init(struct ceph_osd_request *osd_req,
240 unsigned int which, u16 opcode);
241
242extern void osd_req_op_raw_data_in_pages(struct ceph_osd_request *,
243 unsigned int which,
244 struct page **pages, u64 length,
245 u32 alignment, bool pages_from_pool,
246 bool own_pages);
247
248extern void osd_req_op_extent_init(struct ceph_osd_request *osd_req,
249 unsigned int which, u16 opcode,
250 u64 offset, u64 length,
251 u64 truncate_size, u32 truncate_seq);
252extern void osd_req_op_extent_update(struct ceph_osd_request *osd_req,
253 unsigned int which, u64 length);
254
255extern struct ceph_osd_data *osd_req_op_extent_osd_data(
256 struct ceph_osd_request *osd_req,
257 unsigned int which);
258extern struct ceph_osd_data *osd_req_op_cls_response_data(
259 struct ceph_osd_request *osd_req,
260 unsigned int which);
261
262extern void osd_req_op_extent_osd_data_pages(struct ceph_osd_request *,
263 unsigned int which,
264 struct page **pages, u64 length,
265 u32 alignment, bool pages_from_pool,
266 bool own_pages);
267extern void osd_req_op_extent_osd_data_pagelist(struct ceph_osd_request *,
268 unsigned int which,
269 struct ceph_pagelist *pagelist);
270#ifdef CONFIG_BLOCK
271extern void osd_req_op_extent_osd_data_bio(struct ceph_osd_request *,
272 unsigned int which,
273 struct bio *bio, size_t bio_length);
274#endif /* CONFIG_BLOCK */
275
276extern void osd_req_op_cls_request_data_pagelist(struct ceph_osd_request *,
277 unsigned int which,
278 struct ceph_pagelist *pagelist);
279extern void osd_req_op_cls_request_data_pages(struct ceph_osd_request *,
280 unsigned int which,
281 struct page **pages, u64 length,
282 u32 alignment, bool pages_from_pool,
283 bool own_pages);
284extern void osd_req_op_cls_response_data_pages(struct ceph_osd_request *,
285 unsigned int which,
286 struct page **pages, u64 length,
287 u32 alignment, bool pages_from_pool,
288 bool own_pages);
289
290extern void osd_req_op_cls_init(struct ceph_osd_request *osd_req,
291 unsigned int which, u16 opcode,
292 const char *class, const char *method);
293extern void osd_req_op_watch_init(struct ceph_osd_request *osd_req,
294 unsigned int which, u16 opcode,
295 u64 cookie, u64 version, int flag);
296
227extern struct ceph_osd_request *ceph_osdc_alloc_request(struct ceph_osd_client *osdc, 297extern struct ceph_osd_request *ceph_osdc_alloc_request(struct ceph_osd_client *osdc,
228 struct ceph_snap_context *snapc, 298 struct ceph_snap_context *snapc,
229 unsigned int num_op, 299 unsigned int num_ops,
230 bool use_mempool, 300 bool use_mempool,
231 gfp_t gfp_flags); 301 gfp_t gfp_flags);
232 302
233extern void ceph_osdc_build_request(struct ceph_osd_request *req, 303extern void ceph_osdc_build_request(struct ceph_osd_request *req, u64 off,
234 u64 off, u64 len,
235 unsigned int num_op,
236 struct ceph_osd_req_op *src_ops,
237 struct ceph_snap_context *snapc, 304 struct ceph_snap_context *snapc,
238 u64 snap_id, 305 u64 snap_id,
239 struct timespec *mtime); 306 struct timespec *mtime);
@@ -241,12 +308,11 @@ extern void ceph_osdc_build_request(struct ceph_osd_request *req,
241extern struct ceph_osd_request *ceph_osdc_new_request(struct ceph_osd_client *, 308extern struct ceph_osd_request *ceph_osdc_new_request(struct ceph_osd_client *,
242 struct ceph_file_layout *layout, 309 struct ceph_file_layout *layout,
243 struct ceph_vino vino, 310 struct ceph_vino vino,
244 u64 offset, u64 *len, int op, int flags, 311 u64 offset, u64 *len,
312 int num_ops, int opcode, int flags,
245 struct ceph_snap_context *snapc, 313 struct ceph_snap_context *snapc,
246 int do_sync, u32 truncate_seq, 314 u32 truncate_seq, u64 truncate_size,
247 u64 truncate_size, 315 bool use_mempool);
248 struct timespec *mtime,
249 bool use_mempool, int page_align);
250 316
251extern void ceph_osdc_set_request_linger(struct ceph_osd_client *osdc, 317extern void ceph_osdc_set_request_linger(struct ceph_osd_client *osdc,
252 struct ceph_osd_request *req); 318 struct ceph_osd_request *req);