xref: /openbmc/linux/include/linux/ceph/osd_client.h (revision d7d5a007)
13d14c5d2SYehuda Sadeh #ifndef _FS_CEPH_OSD_CLIENT_H
23d14c5d2SYehuda Sadeh #define _FS_CEPH_OSD_CLIENT_H
33d14c5d2SYehuda Sadeh 
43d14c5d2SYehuda Sadeh #include <linux/completion.h>
53d14c5d2SYehuda Sadeh #include <linux/kref.h>
63d14c5d2SYehuda Sadeh #include <linux/mempool.h>
73d14c5d2SYehuda Sadeh #include <linux/rbtree.h>
83d14c5d2SYehuda Sadeh 
96c4a1915SAlex Elder #include <linux/ceph/types.h>
106c4a1915SAlex Elder #include <linux/ceph/osdmap.h>
116c4a1915SAlex Elder #include <linux/ceph/messenger.h>
126c4a1915SAlex Elder #include <linux/ceph/auth.h>
13c885837fSAlex Elder #include <linux/ceph/pagelist.h>
143d14c5d2SYehuda Sadeh 
153d14c5d2SYehuda Sadeh struct ceph_msg;
163d14c5d2SYehuda Sadeh struct ceph_snap_context;
173d14c5d2SYehuda Sadeh struct ceph_osd_request;
183d14c5d2SYehuda Sadeh struct ceph_osd_client;
193d14c5d2SYehuda Sadeh struct ceph_authorizer;
203d14c5d2SYehuda Sadeh 
213d14c5d2SYehuda Sadeh /*
223d14c5d2SYehuda Sadeh  * completion callback for async writepages
233d14c5d2SYehuda Sadeh  */
243d14c5d2SYehuda Sadeh typedef void (*ceph_osdc_callback_t)(struct ceph_osd_request *,
253d14c5d2SYehuda Sadeh 				     struct ceph_msg *);
2626be8808SAlex Elder typedef void (*ceph_osdc_unsafe_callback_t)(struct ceph_osd_request *, bool);
273d14c5d2SYehuda Sadeh 
283d14c5d2SYehuda Sadeh /* a given osd we're communicating with */
293d14c5d2SYehuda Sadeh struct ceph_osd {
303d14c5d2SYehuda Sadeh 	atomic_t o_ref;
313d14c5d2SYehuda Sadeh 	struct ceph_osd_client *o_osdc;
323d14c5d2SYehuda Sadeh 	int o_osd;
333d14c5d2SYehuda Sadeh 	int o_incarnation;
343d14c5d2SYehuda Sadeh 	struct rb_node o_node;
353d14c5d2SYehuda Sadeh 	struct ceph_connection o_con;
363d14c5d2SYehuda Sadeh 	struct list_head o_requests;
37a40c4f10SYehuda Sadeh 	struct list_head o_linger_requests;
383d14c5d2SYehuda Sadeh 	struct list_head o_osd_lru;
396c4a1915SAlex Elder 	struct ceph_auth_handshake o_auth;
403d14c5d2SYehuda Sadeh 	unsigned long lru_ttl;
413d14c5d2SYehuda Sadeh 	int o_marked_for_keepalive;
423d14c5d2SYehuda Sadeh 	struct list_head o_keepalive_item;
433d14c5d2SYehuda Sadeh };
443d14c5d2SYehuda Sadeh 
451b83bef2SSage Weil 
467cc69d42SIlya Dryomov #define CEPH_OSD_MAX_OP	3
471b83bef2SSage Weil 
482ac2b7a6SAlex Elder enum ceph_osd_data_type {
49ec9123c5SAlex Elder 	CEPH_OSD_DATA_TYPE_NONE = 0,
502ac2b7a6SAlex Elder 	CEPH_OSD_DATA_TYPE_PAGES,
519a5e6d09SAlex Elder 	CEPH_OSD_DATA_TYPE_PAGELIST,
522ac2b7a6SAlex Elder #ifdef CONFIG_BLOCK
532ac2b7a6SAlex Elder 	CEPH_OSD_DATA_TYPE_BIO,
542ac2b7a6SAlex Elder #endif /* CONFIG_BLOCK */
552ac2b7a6SAlex Elder };
562ac2b7a6SAlex Elder 
572794a82aSAlex Elder struct ceph_osd_data {
582ac2b7a6SAlex Elder 	enum ceph_osd_data_type	type;
592ac2b7a6SAlex Elder 	union {
602794a82aSAlex Elder 		struct {
612794a82aSAlex Elder 			struct page	**pages;
62e0c59487SAlex Elder 			u64		length;
632794a82aSAlex Elder 			u32		alignment;
642794a82aSAlex Elder 			bool		pages_from_pool;
652794a82aSAlex Elder 			bool		own_pages;
662794a82aSAlex Elder 		};
679a5e6d09SAlex Elder 		struct ceph_pagelist	*pagelist;
682794a82aSAlex Elder #ifdef CONFIG_BLOCK
69fdce58ccSAlex Elder 		struct {
70fdce58ccSAlex Elder 			struct bio	*bio;		/* list of bios */
71fdce58ccSAlex Elder 			size_t		bio_length;	/* total in list */
72fdce58ccSAlex Elder 		};
732794a82aSAlex Elder #endif /* CONFIG_BLOCK */
742794a82aSAlex Elder 	};
752794a82aSAlex Elder };
762794a82aSAlex Elder 
7779528734SAlex Elder struct ceph_osd_req_op {
7879528734SAlex Elder 	u16 op;           /* CEPH_OSD_OP_* */
797b25bf5fSIlya Dryomov 	u32 flags;        /* CEPH_OSD_OP_FLAG_* */
8079528734SAlex Elder 	u32 payload_len;
8179528734SAlex Elder 	union {
8249719778SAlex Elder 		struct ceph_osd_data raw_data_in;
8379528734SAlex Elder 		struct {
8479528734SAlex Elder 			u64 offset, length;
8579528734SAlex Elder 			u64 truncate_size;
8679528734SAlex Elder 			u32 truncate_seq;
875476492fSAlex Elder 			struct ceph_osd_data osd_data;
8879528734SAlex Elder 		} extent;
8979528734SAlex Elder 		struct {
90d7d5a007SIlya Dryomov 			u32 name_len;
91d7d5a007SIlya Dryomov 			u32 value_len;
92d74b50beSYan, Zheng 			__u8 cmp_op;       /* CEPH_OSD_CMPXATTR_OP_* */
93d74b50beSYan, Zheng 			__u8 cmp_mode;     /* CEPH_OSD_CMPXATTR_MODE_* */
94d74b50beSYan, Zheng 			struct ceph_osd_data osd_data;
95d74b50beSYan, Zheng 		} xattr;
96d74b50beSYan, Zheng 		struct {
9779528734SAlex Elder 			const char *class_name;
9879528734SAlex Elder 			const char *method_name;
995476492fSAlex Elder 			struct ceph_osd_data request_info;
10004017e29SAlex Elder 			struct ceph_osd_data request_data;
1015476492fSAlex Elder 			struct ceph_osd_data response_data;
10279528734SAlex Elder 			__u8 class_len;
10379528734SAlex Elder 			__u8 method_len;
10479528734SAlex Elder 			__u8 argc;
10579528734SAlex Elder 		} cls;
10679528734SAlex Elder 		struct {
10779528734SAlex Elder 			u64 cookie;
10879528734SAlex Elder 			u64 ver;
10979528734SAlex Elder 			u32 prot_ver;
11079528734SAlex Elder 			u32 timeout;
11179528734SAlex Elder 			__u8 flag;
11279528734SAlex Elder 		} watch;
113c647b8a8SIlya Dryomov 		struct {
114c647b8a8SIlya Dryomov 			u64 expected_object_size;
115c647b8a8SIlya Dryomov 			u64 expected_write_size;
116c647b8a8SIlya Dryomov 		} alloc_hint;
11779528734SAlex Elder 	};
11879528734SAlex Elder };
11979528734SAlex Elder 
1203d14c5d2SYehuda Sadeh /* an in-flight request */
1213d14c5d2SYehuda Sadeh struct ceph_osd_request {
1223d14c5d2SYehuda Sadeh 	u64             r_tid;              /* unique for this client */
1233d14c5d2SYehuda Sadeh 	struct rb_node  r_node;
1243d14c5d2SYehuda Sadeh 	struct list_head r_req_lru_item;
1253d14c5d2SYehuda Sadeh 	struct list_head r_osd_item;
126a40c4f10SYehuda Sadeh 	struct list_head r_linger_item;
1271d0326b1SIlya Dryomov 	struct list_head r_linger_osd_item;
1283d14c5d2SYehuda Sadeh 	struct ceph_osd *r_osd;
1295b191d99SSage Weil 	struct ceph_pg   r_pgid;
1303d14c5d2SYehuda Sadeh 	int              r_pg_osds[CEPH_PG_MAX_SIZE];
1313d14c5d2SYehuda Sadeh 	int              r_num_pg_osds;
1323d14c5d2SYehuda Sadeh 
1333d14c5d2SYehuda Sadeh 	struct ceph_msg  *r_request, *r_reply;
1343d14c5d2SYehuda Sadeh 	int               r_flags;     /* any additional flags for the osd */
1353d14c5d2SYehuda Sadeh 	u32               r_sent;      /* >0 if r_request is sending/sent */
1361b83bef2SSage Weil 
13779528734SAlex Elder 	/* request osd ops array  */
13879528734SAlex Elder 	unsigned int		r_num_ops;
13979528734SAlex Elder 	struct ceph_osd_req_op	r_ops[CEPH_OSD_MAX_OP];
14079528734SAlex Elder 
1411b83bef2SSage Weil 	/* these are updated on each send */
1421b83bef2SSage Weil 	__le32           *r_request_osdmap_epoch;
1431b83bef2SSage Weil 	__le32           *r_request_flags;
1441b83bef2SSage Weil 	__le64           *r_request_pool;
1451b83bef2SSage Weil 	void             *r_request_pgid;
1461b83bef2SSage Weil 	__le32           *r_request_attempts;
147d29adb34SJosh Durgin 	bool              r_paused;
1481b83bef2SSage Weil 	struct ceph_eversion *r_request_reassert_version;
1491b83bef2SSage Weil 
1501b83bef2SSage Weil 	int               r_result;
1511b83bef2SSage Weil 	int               r_reply_op_len[CEPH_OSD_MAX_OP];
1521b83bef2SSage Weil 	s32               r_reply_op_result[CEPH_OSD_MAX_OP];
1533d14c5d2SYehuda Sadeh 	int               r_got_reply;
154a40c4f10SYehuda Sadeh 	int		  r_linger;
1553d14c5d2SYehuda Sadeh 
1563d14c5d2SYehuda Sadeh 	struct ceph_osd_client *r_osdc;
1573d14c5d2SYehuda Sadeh 	struct kref       r_kref;
1583d14c5d2SYehuda Sadeh 	bool              r_mempool;
1593d14c5d2SYehuda Sadeh 	struct completion r_completion, r_safe_completion;
16026be8808SAlex Elder 	ceph_osdc_callback_t r_callback;
16126be8808SAlex Elder 	ceph_osdc_unsafe_callback_t r_unsafe_callback;
1623d14c5d2SYehuda Sadeh 	struct ceph_eversion r_reassert_version;
1633d14c5d2SYehuda Sadeh 	struct list_head  r_unsafe_item;
1643d14c5d2SYehuda Sadeh 
1653d14c5d2SYehuda Sadeh 	struct inode *r_inode;         	      /* for use by callbacks */
1663d14c5d2SYehuda Sadeh 	void *r_priv;			      /* ditto */
1673d14c5d2SYehuda Sadeh 
1683c972c95SIlya Dryomov 	struct ceph_object_locator r_base_oloc;
1693c972c95SIlya Dryomov 	struct ceph_object_id r_base_oid;
170205ee118SIlya Dryomov 	struct ceph_object_locator r_target_oloc;
171205ee118SIlya Dryomov 	struct ceph_object_id r_target_oid;
17222116525SIlya Dryomov 
1732169aea6SSage Weil 	u64               r_snapid;
1743d14c5d2SYehuda Sadeh 	unsigned long     r_stamp;            /* send OR check time */
1753d14c5d2SYehuda Sadeh 
1763d14c5d2SYehuda Sadeh 	struct ceph_snap_context *r_snapc;    /* snap context for writes */
1773d14c5d2SYehuda Sadeh };
1783d14c5d2SYehuda Sadeh 
179205ee118SIlya Dryomov struct ceph_request_redirect {
180205ee118SIlya Dryomov 	struct ceph_object_locator oloc;
181205ee118SIlya Dryomov };
182205ee118SIlya Dryomov 
183a40c4f10SYehuda Sadeh struct ceph_osd_event {
184a40c4f10SYehuda Sadeh 	u64 cookie;
185a40c4f10SYehuda Sadeh 	int one_shot;
186a40c4f10SYehuda Sadeh 	struct ceph_osd_client *osdc;
187a40c4f10SYehuda Sadeh 	void (*cb)(u64, u64, u8, void *);
188a40c4f10SYehuda Sadeh 	void *data;
189a40c4f10SYehuda Sadeh 	struct rb_node node;
190a40c4f10SYehuda Sadeh 	struct list_head osd_node;
191a40c4f10SYehuda Sadeh 	struct kref kref;
192a40c4f10SYehuda Sadeh };
193a40c4f10SYehuda Sadeh 
194a40c4f10SYehuda Sadeh struct ceph_osd_event_work {
195a40c4f10SYehuda Sadeh 	struct work_struct work;
196a40c4f10SYehuda Sadeh 	struct ceph_osd_event *event;
197a40c4f10SYehuda Sadeh         u64 ver;
198a40c4f10SYehuda Sadeh         u64 notify_id;
199a40c4f10SYehuda Sadeh         u8 opcode;
200a40c4f10SYehuda Sadeh };
201a40c4f10SYehuda Sadeh 
2023d14c5d2SYehuda Sadeh struct ceph_osd_client {
2033d14c5d2SYehuda Sadeh 	struct ceph_client     *client;
2043d14c5d2SYehuda Sadeh 
2053d14c5d2SYehuda Sadeh 	struct ceph_osdmap     *osdmap;       /* current map */
2063d14c5d2SYehuda Sadeh 	struct rw_semaphore    map_sem;
2073d14c5d2SYehuda Sadeh 	struct completion      map_waiters;
2083d14c5d2SYehuda Sadeh 	u64                    last_requested_map;
2093d14c5d2SYehuda Sadeh 
2103d14c5d2SYehuda Sadeh 	struct mutex           request_mutex;
2113d14c5d2SYehuda Sadeh 	struct rb_root         osds;          /* osds */
2123d14c5d2SYehuda Sadeh 	struct list_head       osd_lru;       /* idle osds */
2133d14c5d2SYehuda Sadeh 	u64                    timeout_tid;   /* tid of timeout triggering rq */
2143d14c5d2SYehuda Sadeh 	u64                    last_tid;      /* tid of last request */
2153d14c5d2SYehuda Sadeh 	struct rb_root         requests;      /* pending requests */
2166f6c7006SSage Weil 	struct list_head       req_lru;	      /* in-flight lru */
2176f6c7006SSage Weil 	struct list_head       req_unsent;    /* unsent/need-resend queue */
2186f6c7006SSage Weil 	struct list_head       req_notarget;  /* map to no osd */
219a40c4f10SYehuda Sadeh 	struct list_head       req_linger;    /* lingering requests */
2203d14c5d2SYehuda Sadeh 	int                    num_requests;
2213d14c5d2SYehuda Sadeh 	struct delayed_work    timeout_work;
2223d14c5d2SYehuda Sadeh 	struct delayed_work    osds_timeout_work;
2233d14c5d2SYehuda Sadeh #ifdef CONFIG_DEBUG_FS
2243d14c5d2SYehuda Sadeh 	struct dentry 	       *debugfs_file;
2253d14c5d2SYehuda Sadeh #endif
2263d14c5d2SYehuda Sadeh 
2273d14c5d2SYehuda Sadeh 	mempool_t              *req_mempool;
2283d14c5d2SYehuda Sadeh 
2293d14c5d2SYehuda Sadeh 	struct ceph_msgpool	msgpool_op;
2303d14c5d2SYehuda Sadeh 	struct ceph_msgpool	msgpool_op_reply;
231a40c4f10SYehuda Sadeh 
232a40c4f10SYehuda Sadeh 	spinlock_t		event_lock;
233a40c4f10SYehuda Sadeh 	struct rb_root		event_tree;
234a40c4f10SYehuda Sadeh 	u64			event_count;
235a40c4f10SYehuda Sadeh 
236a40c4f10SYehuda Sadeh 	struct workqueue_struct	*notify_wq;
2373d14c5d2SYehuda Sadeh };
2383d14c5d2SYehuda Sadeh 
2395522ae0bSAlex Elder extern int ceph_osdc_setup(void);
2405522ae0bSAlex Elder extern void ceph_osdc_cleanup(void);
2415522ae0bSAlex Elder 
2423d14c5d2SYehuda Sadeh extern int ceph_osdc_init(struct ceph_osd_client *osdc,
2433d14c5d2SYehuda Sadeh 			  struct ceph_client *client);
2443d14c5d2SYehuda Sadeh extern void ceph_osdc_stop(struct ceph_osd_client *osdc);
2453d14c5d2SYehuda Sadeh 
2463d14c5d2SYehuda Sadeh extern void ceph_osdc_handle_reply(struct ceph_osd_client *osdc,
2473d14c5d2SYehuda Sadeh 				   struct ceph_msg *msg);
2483d14c5d2SYehuda Sadeh extern void ceph_osdc_handle_map(struct ceph_osd_client *osdc,
2493d14c5d2SYehuda Sadeh 				 struct ceph_msg *msg);
2503d14c5d2SYehuda Sadeh 
25149719778SAlex Elder extern void osd_req_op_init(struct ceph_osd_request *osd_req,
25249719778SAlex Elder 					unsigned int which, u16 opcode);
25349719778SAlex Elder 
25449719778SAlex Elder extern void osd_req_op_raw_data_in_pages(struct ceph_osd_request *,
25549719778SAlex Elder 					unsigned int which,
25649719778SAlex Elder 					struct page **pages, u64 length,
25749719778SAlex Elder 					u32 alignment, bool pages_from_pool,
25849719778SAlex Elder 					bool own_pages);
25949719778SAlex Elder 
260c99d2d4aSAlex Elder extern void osd_req_op_extent_init(struct ceph_osd_request *osd_req,
261c99d2d4aSAlex Elder 					unsigned int which, u16 opcode,
26233803f33SAlex Elder 					u64 offset, u64 length,
26333803f33SAlex Elder 					u64 truncate_size, u32 truncate_seq);
264c99d2d4aSAlex Elder extern void osd_req_op_extent_update(struct ceph_osd_request *osd_req,
265c99d2d4aSAlex Elder 					unsigned int which, u64 length);
266a4ce40a9SAlex Elder 
267a4ce40a9SAlex Elder extern struct ceph_osd_data *osd_req_op_extent_osd_data(
268a4ce40a9SAlex Elder 					struct ceph_osd_request *osd_req,
269406e2c9fSAlex Elder 					unsigned int which);
270a4ce40a9SAlex Elder extern struct ceph_osd_data *osd_req_op_cls_response_data(
271a4ce40a9SAlex Elder 					struct ceph_osd_request *osd_req,
272a4ce40a9SAlex Elder 					unsigned int which);
273a4ce40a9SAlex Elder 
274a4ce40a9SAlex Elder extern void osd_req_op_extent_osd_data_pages(struct ceph_osd_request *,
275406e2c9fSAlex Elder 					unsigned int which,
276a4ce40a9SAlex Elder 					struct page **pages, u64 length,
277a4ce40a9SAlex Elder 					u32 alignment, bool pages_from_pool,
278a4ce40a9SAlex Elder 					bool own_pages);
279a4ce40a9SAlex Elder extern void osd_req_op_extent_osd_data_pagelist(struct ceph_osd_request *,
280406e2c9fSAlex Elder 					unsigned int which,
281a4ce40a9SAlex Elder 					struct ceph_pagelist *pagelist);
282a4ce40a9SAlex Elder #ifdef CONFIG_BLOCK
283a4ce40a9SAlex Elder extern void osd_req_op_extent_osd_data_bio(struct ceph_osd_request *,
284406e2c9fSAlex Elder 					unsigned int which,
285a4ce40a9SAlex Elder 					struct bio *bio, size_t bio_length);
286a4ce40a9SAlex Elder #endif /* CONFIG_BLOCK */
287a4ce40a9SAlex Elder 
28804017e29SAlex Elder extern void osd_req_op_cls_request_data_pagelist(struct ceph_osd_request *,
28904017e29SAlex Elder 					unsigned int which,
29004017e29SAlex Elder 					struct ceph_pagelist *pagelist);
2916c57b554SAlex Elder extern void osd_req_op_cls_request_data_pages(struct ceph_osd_request *,
2926c57b554SAlex Elder 					unsigned int which,
2936c57b554SAlex Elder 					struct page **pages, u64 length,
2946c57b554SAlex Elder 					u32 alignment, bool pages_from_pool,
2956c57b554SAlex Elder 					bool own_pages);
296a4ce40a9SAlex Elder extern void osd_req_op_cls_response_data_pages(struct ceph_osd_request *,
297c99d2d4aSAlex Elder 					unsigned int which,
298a4ce40a9SAlex Elder 					struct page **pages, u64 length,
299a4ce40a9SAlex Elder 					u32 alignment, bool pages_from_pool,
300a4ce40a9SAlex Elder 					bool own_pages);
301a4ce40a9SAlex Elder 
302c99d2d4aSAlex Elder extern void osd_req_op_cls_init(struct ceph_osd_request *osd_req,
303c99d2d4aSAlex Elder 					unsigned int which, u16 opcode,
30404017e29SAlex Elder 					const char *class, const char *method);
305d74b50beSYan, Zheng extern int osd_req_op_xattr_init(struct ceph_osd_request *osd_req, unsigned int which,
306d74b50beSYan, Zheng 				 u16 opcode, const char *name, const void *value,
307d74b50beSYan, Zheng 				 size_t size, u8 cmp_op, u8 cmp_mode);
308c99d2d4aSAlex Elder extern void osd_req_op_watch_init(struct ceph_osd_request *osd_req,
309c99d2d4aSAlex Elder 					unsigned int which, u16 opcode,
31033803f33SAlex Elder 					u64 cookie, u64 version, int flag);
311c647b8a8SIlya Dryomov extern void osd_req_op_alloc_hint_init(struct ceph_osd_request *osd_req,
312c647b8a8SIlya Dryomov 				       unsigned int which,
313c647b8a8SIlya Dryomov 				       u64 expected_object_size,
314c647b8a8SIlya Dryomov 				       u64 expected_write_size);
31533803f33SAlex Elder 
3163d14c5d2SYehuda Sadeh extern struct ceph_osd_request *ceph_osdc_alloc_request(struct ceph_osd_client *osdc,
3173d14c5d2SYehuda Sadeh 					       struct ceph_snap_context *snapc,
318acead002SAlex Elder 					       unsigned int num_ops,
3193d14c5d2SYehuda Sadeh 					       bool use_mempool,
32054a54007SAlex Elder 					       gfp_t gfp_flags);
3213d14c5d2SYehuda Sadeh 
322175face2SAlex Elder extern void ceph_osdc_build_request(struct ceph_osd_request *req, u64 off,
3233d14c5d2SYehuda Sadeh 				    struct ceph_snap_context *snapc,
3244d6b250bSAlex Elder 				    u64 snap_id,
325af77f26cSAlex Elder 				    struct timespec *mtime);
3263d14c5d2SYehuda Sadeh 
3273d14c5d2SYehuda Sadeh extern struct ceph_osd_request *ceph_osdc_new_request(struct ceph_osd_client *,
3283d14c5d2SYehuda Sadeh 				      struct ceph_file_layout *layout,
3293d14c5d2SYehuda Sadeh 				      struct ceph_vino vino,
330acead002SAlex Elder 				      u64 offset, u64 *len,
331715e4cd4SYan, Zheng 				      unsigned int which, int num_ops,
332715e4cd4SYan, Zheng 				      int opcode, int flags,
3333d14c5d2SYehuda Sadeh 				      struct ceph_snap_context *snapc,
334acead002SAlex Elder 				      u32 truncate_seq, u64 truncate_size,
335153e5167SAlex Elder 				      bool use_mempool);
3363d14c5d2SYehuda Sadeh 
337a40c4f10SYehuda Sadeh extern void ceph_osdc_set_request_linger(struct ceph_osd_client *osdc,
338a40c4f10SYehuda Sadeh 					 struct ceph_osd_request *req);
339a40c4f10SYehuda Sadeh 
3409e94af20SIlya Dryomov extern void ceph_osdc_get_request(struct ceph_osd_request *req);
3419e94af20SIlya Dryomov extern void ceph_osdc_put_request(struct ceph_osd_request *req);
3423d14c5d2SYehuda Sadeh 
3433d14c5d2SYehuda Sadeh extern int ceph_osdc_start_request(struct ceph_osd_client *osdc,
3443d14c5d2SYehuda Sadeh 				   struct ceph_osd_request *req,
3453d14c5d2SYehuda Sadeh 				   bool nofail);
346c9f9b93dSIlya Dryomov extern void ceph_osdc_cancel_request(struct ceph_osd_request *req);
3473d14c5d2SYehuda Sadeh extern int ceph_osdc_wait_request(struct ceph_osd_client *osdc,
3483d14c5d2SYehuda Sadeh 				  struct ceph_osd_request *req);
3493d14c5d2SYehuda Sadeh extern void ceph_osdc_sync(struct ceph_osd_client *osdc);
3503d14c5d2SYehuda Sadeh 
351dd935f44SJosh Durgin extern void ceph_osdc_flush_notifies(struct ceph_osd_client *osdc);
352dd935f44SJosh Durgin 
3533d14c5d2SYehuda Sadeh extern int ceph_osdc_readpages(struct ceph_osd_client *osdc,
3543d14c5d2SYehuda Sadeh 			       struct ceph_vino vino,
3553d14c5d2SYehuda Sadeh 			       struct ceph_file_layout *layout,
3563d14c5d2SYehuda Sadeh 			       u64 off, u64 *plen,
3573d14c5d2SYehuda Sadeh 			       u32 truncate_seq, u64 truncate_size,
358b7495fc2SSage Weil 			       struct page **pages, int nr_pages,
359b7495fc2SSage Weil 			       int page_align);
3603d14c5d2SYehuda Sadeh 
3613d14c5d2SYehuda Sadeh extern int ceph_osdc_writepages(struct ceph_osd_client *osdc,
3623d14c5d2SYehuda Sadeh 				struct ceph_vino vino,
3633d14c5d2SYehuda Sadeh 				struct ceph_file_layout *layout,
3643d14c5d2SYehuda Sadeh 				struct ceph_snap_context *sc,
3653d14c5d2SYehuda Sadeh 				u64 off, u64 len,
3663d14c5d2SYehuda Sadeh 				u32 truncate_seq, u64 truncate_size,
3673d14c5d2SYehuda Sadeh 				struct timespec *mtime,
36824808826SAlex Elder 				struct page **pages, int nr_pages);
3693d14c5d2SYehuda Sadeh 
370a40c4f10SYehuda Sadeh /* watch/notify events */
371a40c4f10SYehuda Sadeh extern int ceph_osdc_create_event(struct ceph_osd_client *osdc,
372a40c4f10SYehuda Sadeh 				  void (*event_cb)(u64, u64, u8, void *),
3733c663bbdSAlex Elder 				  void *data, struct ceph_osd_event **pevent);
374a40c4f10SYehuda Sadeh extern void ceph_osdc_cancel_event(struct ceph_osd_event *event);
375a40c4f10SYehuda Sadeh extern void ceph_osdc_put_event(struct ceph_osd_event *event);
3763d14c5d2SYehuda Sadeh #endif
3773d14c5d2SYehuda Sadeh 
378