1 #ifndef _FS_CEPH_OSD_CLIENT_H
2 #define _FS_CEPH_OSD_CLIENT_H
4 #include <linux/completion.h>
5 #include <linux/kref.h>
6 #include <linux/mempool.h>
7 #include <linux/rbtree.h>
9 #include <linux/ceph/types.h>
10 #include <linux/ceph/osdmap.h>
11 #include <linux/ceph/messenger.h>
12 #include <linux/ceph/auth.h>
13 #include <linux/ceph/pagelist.h>
16 struct ceph_snap_context
;
17 struct ceph_osd_request
;
18 struct ceph_osd_client
;
19 struct ceph_authorizer
;
22 * completion callback for async writepages
24 typedef void (*ceph_osdc_callback_t
)(struct ceph_osd_request
*,
26 typedef void (*ceph_osdc_unsafe_callback_t
)(struct ceph_osd_request
*, bool);
28 /* a given osd we're communicating with */
31 struct ceph_osd_client
*o_osdc
;
34 struct rb_node o_node
;
35 struct ceph_connection o_con
;
36 struct list_head o_requests
;
37 struct list_head o_linger_requests
;
38 struct list_head o_osd_lru
;
39 struct ceph_auth_handshake o_auth
;
40 unsigned long lru_ttl
;
41 int o_marked_for_keepalive
;
42 struct list_head o_keepalive_item
;
46 #define CEPH_OSD_MAX_OP 3
48 enum ceph_osd_data_type
{
49 CEPH_OSD_DATA_TYPE_NONE
= 0,
50 CEPH_OSD_DATA_TYPE_PAGES
,
51 CEPH_OSD_DATA_TYPE_PAGELIST
,
53 CEPH_OSD_DATA_TYPE_BIO
,
54 #endif /* CONFIG_BLOCK */
57 struct ceph_osd_data
{
58 enum ceph_osd_data_type type
;
67 struct ceph_pagelist
*pagelist
;
70 struct bio
*bio
; /* list of bios */
71 size_t bio_length
; /* total in list */
73 #endif /* CONFIG_BLOCK */
77 struct ceph_osd_req_op
{
78 u16 op
; /* CEPH_OSD_OP_* */
79 u32 flags
; /* CEPH_OSD_OP_FLAG_* */
82 struct ceph_osd_data raw_data_in
;
87 struct ceph_osd_data osd_data
;
92 __u8 cmp_op
; /* CEPH_OSD_CMPXATTR_OP_* */
93 __u8 cmp_mode
; /* CEPH_OSD_CMPXATTR_MODE_* */
94 struct ceph_osd_data osd_data
;
97 const char *class_name
;
98 const char *method_name
;
99 struct ceph_osd_data request_info
;
100 struct ceph_osd_data request_data
;
101 struct ceph_osd_data response_data
;
114 u64 expected_object_size
;
115 u64 expected_write_size
;
120 /* an in-flight request */
121 struct ceph_osd_request
{
122 u64 r_tid
; /* unique for this client */
123 struct rb_node r_node
;
124 struct list_head r_req_lru_item
;
125 struct list_head r_osd_item
;
126 struct list_head r_linger_item
;
127 struct list_head r_linger_osd_item
;
128 struct ceph_osd
*r_osd
;
129 struct ceph_pg r_pgid
;
130 int r_pg_osds
[CEPH_PG_MAX_SIZE
];
133 struct ceph_msg
*r_request
, *r_reply
;
134 int r_flags
; /* any additional flags for the osd */
135 u32 r_sent
; /* >0 if r_request is sending/sent */
137 /* request osd ops array */
138 unsigned int r_num_ops
;
139 struct ceph_osd_req_op r_ops
[CEPH_OSD_MAX_OP
];
141 /* these are updated on each send */
142 __le32
*r_request_osdmap_epoch
;
143 __le32
*r_request_flags
;
144 __le64
*r_request_pool
;
145 void *r_request_pgid
;
146 __le32
*r_request_attempts
;
148 struct ceph_eversion
*r_request_reassert_version
;
151 int r_reply_op_len
[CEPH_OSD_MAX_OP
];
152 s32 r_reply_op_result
[CEPH_OSD_MAX_OP
];
156 struct ceph_osd_client
*r_osdc
;
159 struct completion r_completion
, r_safe_completion
;
160 ceph_osdc_callback_t r_callback
;
161 ceph_osdc_unsafe_callback_t r_unsafe_callback
;
162 struct ceph_eversion r_reassert_version
;
163 struct list_head r_unsafe_item
;
165 struct inode
*r_inode
; /* for use by callbacks */
166 void *r_priv
; /* ditto */
168 struct ceph_object_locator r_base_oloc
;
169 struct ceph_object_id r_base_oid
;
170 struct ceph_object_locator r_target_oloc
;
171 struct ceph_object_id r_target_oid
;
174 unsigned long r_stamp
; /* send OR check time */
176 struct ceph_snap_context
*r_snapc
; /* snap context for writes */
179 struct ceph_request_redirect
{
180 struct ceph_object_locator oloc
;
183 struct ceph_osd_event
{
186 struct ceph_osd_client
*osdc
;
187 void (*cb
)(u64
, u64
, u8
, void *);
190 struct list_head osd_node
;
194 struct ceph_osd_event_work
{
195 struct work_struct work
;
196 struct ceph_osd_event
*event
;
202 struct ceph_osd_client
{
203 struct ceph_client
*client
;
205 struct ceph_osdmap
*osdmap
; /* current map */
206 struct rw_semaphore map_sem
;
207 struct completion map_waiters
;
208 u64 last_requested_map
;
210 struct mutex request_mutex
;
211 struct rb_root osds
; /* osds */
212 struct list_head osd_lru
; /* idle osds */
213 u64 timeout_tid
; /* tid of timeout triggering rq */
214 u64 last_tid
; /* tid of last request */
215 struct rb_root requests
; /* pending requests */
216 struct list_head req_lru
; /* in-flight lru */
217 struct list_head req_unsent
; /* unsent/need-resend queue */
218 struct list_head req_notarget
; /* map to no osd */
219 struct list_head req_linger
; /* lingering requests */
221 struct delayed_work timeout_work
;
222 struct delayed_work osds_timeout_work
;
223 #ifdef CONFIG_DEBUG_FS
224 struct dentry
*debugfs_file
;
227 mempool_t
*req_mempool
;
229 struct ceph_msgpool msgpool_op
;
230 struct ceph_msgpool msgpool_op_reply
;
232 spinlock_t event_lock
;
233 struct rb_root event_tree
;
236 struct workqueue_struct
*notify_wq
;
239 extern int ceph_osdc_setup(void);
240 extern void ceph_osdc_cleanup(void);
242 extern int ceph_osdc_init(struct ceph_osd_client
*osdc
,
243 struct ceph_client
*client
);
244 extern void ceph_osdc_stop(struct ceph_osd_client
*osdc
);
246 extern void ceph_osdc_handle_reply(struct ceph_osd_client
*osdc
,
247 struct ceph_msg
*msg
);
248 extern void ceph_osdc_handle_map(struct ceph_osd_client
*osdc
,
249 struct ceph_msg
*msg
);
251 extern void osd_req_op_init(struct ceph_osd_request
*osd_req
,
252 unsigned int which
, u16 opcode
);
254 extern void osd_req_op_raw_data_in_pages(struct ceph_osd_request
*,
256 struct page
**pages
, u64 length
,
257 u32 alignment
, bool pages_from_pool
,
260 extern void osd_req_op_extent_init(struct ceph_osd_request
*osd_req
,
261 unsigned int which
, u16 opcode
,
262 u64 offset
, u64 length
,
263 u64 truncate_size
, u32 truncate_seq
);
264 extern void osd_req_op_extent_update(struct ceph_osd_request
*osd_req
,
265 unsigned int which
, u64 length
);
267 extern struct ceph_osd_data
*osd_req_op_extent_osd_data(
268 struct ceph_osd_request
*osd_req
,
270 extern struct ceph_osd_data
*osd_req_op_cls_response_data(
271 struct ceph_osd_request
*osd_req
,
274 extern void osd_req_op_extent_osd_data_pages(struct ceph_osd_request
*,
276 struct page
**pages
, u64 length
,
277 u32 alignment
, bool pages_from_pool
,
279 extern void osd_req_op_extent_osd_data_pagelist(struct ceph_osd_request
*,
281 struct ceph_pagelist
*pagelist
);
283 extern void osd_req_op_extent_osd_data_bio(struct ceph_osd_request
*,
285 struct bio
*bio
, size_t bio_length
);
286 #endif /* CONFIG_BLOCK */
288 extern void osd_req_op_cls_request_data_pagelist(struct ceph_osd_request
*,
290 struct ceph_pagelist
*pagelist
);
291 extern void osd_req_op_cls_request_data_pages(struct ceph_osd_request
*,
293 struct page
**pages
, u64 length
,
294 u32 alignment
, bool pages_from_pool
,
296 extern void osd_req_op_cls_response_data_pages(struct ceph_osd_request
*,
298 struct page
**pages
, u64 length
,
299 u32 alignment
, bool pages_from_pool
,
302 extern void osd_req_op_cls_init(struct ceph_osd_request
*osd_req
,
303 unsigned int which
, u16 opcode
,
304 const char *class, const char *method
);
305 extern int osd_req_op_xattr_init(struct ceph_osd_request
*osd_req
, unsigned int which
,
306 u16 opcode
, const char *name
, const void *value
,
307 size_t size
, u8 cmp_op
, u8 cmp_mode
);
308 extern void osd_req_op_watch_init(struct ceph_osd_request
*osd_req
,
309 unsigned int which
, u16 opcode
,
310 u64 cookie
, u64 version
, int flag
);
311 extern void osd_req_op_alloc_hint_init(struct ceph_osd_request
*osd_req
,
313 u64 expected_object_size
,
314 u64 expected_write_size
);
316 extern struct ceph_osd_request
*ceph_osdc_alloc_request(struct ceph_osd_client
*osdc
,
317 struct ceph_snap_context
*snapc
,
318 unsigned int num_ops
,
322 extern void ceph_osdc_build_request(struct ceph_osd_request
*req
, u64 off
,
323 struct ceph_snap_context
*snapc
,
325 struct timespec
*mtime
);
327 extern struct ceph_osd_request
*ceph_osdc_new_request(struct ceph_osd_client
*,
328 struct ceph_file_layout
*layout
,
329 struct ceph_vino vino
,
330 u64 offset
, u64
*len
,
331 unsigned int which
, int num_ops
,
332 int opcode
, int flags
,
333 struct ceph_snap_context
*snapc
,
334 u32 truncate_seq
, u64 truncate_size
,
337 extern void ceph_osdc_set_request_linger(struct ceph_osd_client
*osdc
,
338 struct ceph_osd_request
*req
);
340 extern void ceph_osdc_get_request(struct ceph_osd_request
*req
);
341 extern void ceph_osdc_put_request(struct ceph_osd_request
*req
);
343 extern int ceph_osdc_start_request(struct ceph_osd_client
*osdc
,
344 struct ceph_osd_request
*req
,
346 extern void ceph_osdc_cancel_request(struct ceph_osd_request
*req
);
347 extern int ceph_osdc_wait_request(struct ceph_osd_client
*osdc
,
348 struct ceph_osd_request
*req
);
349 extern void ceph_osdc_sync(struct ceph_osd_client
*osdc
);
351 extern void ceph_osdc_flush_notifies(struct ceph_osd_client
*osdc
);
353 extern int ceph_osdc_readpages(struct ceph_osd_client
*osdc
,
354 struct ceph_vino vino
,
355 struct ceph_file_layout
*layout
,
357 u32 truncate_seq
, u64 truncate_size
,
358 struct page
**pages
, int nr_pages
,
361 extern int ceph_osdc_writepages(struct ceph_osd_client
*osdc
,
362 struct ceph_vino vino
,
363 struct ceph_file_layout
*layout
,
364 struct ceph_snap_context
*sc
,
366 u32 truncate_seq
, u64 truncate_size
,
367 struct timespec
*mtime
,
368 struct page
**pages
, int nr_pages
);
370 /* watch/notify events */
371 extern int ceph_osdc_create_event(struct ceph_osd_client
*osdc
,
372 void (*event_cb
)(u64
, u64
, u8
, void *),
373 void *data
, struct ceph_osd_event
**pevent
);
374 extern void ceph_osdc_cancel_event(struct ceph_osd_event
*event
);
375 extern void ceph_osdc_put_event(struct ceph_osd_event
*event
);