xref: /openbmc/linux/include/linux/ceph/osd_client.h (revision 922dab61)
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 
203d14c5d2SYehuda Sadeh /*
213d14c5d2SYehuda Sadeh  * completion callback for async writepages
223d14c5d2SYehuda Sadeh  */
2385e084feSIlya Dryomov typedef void (*ceph_osdc_callback_t)(struct ceph_osd_request *);
2426be8808SAlex Elder typedef void (*ceph_osdc_unsafe_callback_t)(struct ceph_osd_request *, bool);
253d14c5d2SYehuda Sadeh 
2663244fa1SIlya Dryomov #define CEPH_HOMELESS_OSD	-1
2763244fa1SIlya Dryomov 
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;
365aea3dcdSIlya Dryomov 	struct rb_root o_requests;
37922dab61SIlya Dryomov 	struct rb_root 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 	struct list_head o_keepalive_item;
425aea3dcdSIlya Dryomov 	struct mutex lock;
433d14c5d2SYehuda Sadeh };
443d14c5d2SYehuda Sadeh 
453f1af42aSIlya Dryomov #define CEPH_OSD_SLAB_OPS	2
463f1af42aSIlya Dryomov #define CEPH_OSD_MAX_OPS	16
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_* */
80de2aa102SIlya Dryomov 	u32 indata_len;   /* request */
817665d85bSYan, Zheng 	u32 outdata_len;  /* reply */
827665d85bSYan, Zheng 	s32 rval;
837665d85bSYan, Zheng 
8479528734SAlex Elder 	union {
8549719778SAlex Elder 		struct ceph_osd_data raw_data_in;
8679528734SAlex Elder 		struct {
8779528734SAlex Elder 			u64 offset, length;
8879528734SAlex Elder 			u64 truncate_size;
8979528734SAlex Elder 			u32 truncate_seq;
905476492fSAlex Elder 			struct ceph_osd_data osd_data;
9179528734SAlex Elder 		} extent;
9279528734SAlex Elder 		struct {
93d7d5a007SIlya Dryomov 			u32 name_len;
94d7d5a007SIlya Dryomov 			u32 value_len;
95d74b50beSYan, Zheng 			__u8 cmp_op;       /* CEPH_OSD_CMPXATTR_OP_* */
96d74b50beSYan, Zheng 			__u8 cmp_mode;     /* CEPH_OSD_CMPXATTR_MODE_* */
97d74b50beSYan, Zheng 			struct ceph_osd_data osd_data;
98d74b50beSYan, Zheng 		} xattr;
99d74b50beSYan, Zheng 		struct {
10079528734SAlex Elder 			const char *class_name;
10179528734SAlex Elder 			const char *method_name;
1025476492fSAlex Elder 			struct ceph_osd_data request_info;
10304017e29SAlex Elder 			struct ceph_osd_data request_data;
1045476492fSAlex Elder 			struct ceph_osd_data response_data;
10579528734SAlex Elder 			__u8 class_len;
10679528734SAlex Elder 			__u8 method_len;
107bb873b53SIlya Dryomov 			u32 indata_len;
10879528734SAlex Elder 		} cls;
10979528734SAlex Elder 		struct {
11079528734SAlex Elder 			u64 cookie;
111922dab61SIlya Dryomov 			__u8 op;           /* CEPH_OSD_WATCH_OP_ */
112922dab61SIlya Dryomov 			u32 gen;
11379528734SAlex Elder 		} watch;
114c647b8a8SIlya Dryomov 		struct {
115922dab61SIlya Dryomov 			struct ceph_osd_data request_data;
116922dab61SIlya Dryomov 		} notify_ack;
117922dab61SIlya Dryomov 		struct {
118c647b8a8SIlya Dryomov 			u64 expected_object_size;
119c647b8a8SIlya Dryomov 			u64 expected_write_size;
120c647b8a8SIlya Dryomov 		} alloc_hint;
12179528734SAlex Elder 	};
12279528734SAlex Elder };
12379528734SAlex Elder 
12463244fa1SIlya Dryomov struct ceph_osd_request_target {
12563244fa1SIlya Dryomov 	struct ceph_object_id base_oid;
12663244fa1SIlya Dryomov 	struct ceph_object_locator base_oloc;
12763244fa1SIlya Dryomov 	struct ceph_object_id target_oid;
12863244fa1SIlya Dryomov 	struct ceph_object_locator target_oloc;
12963244fa1SIlya Dryomov 
13063244fa1SIlya Dryomov 	struct ceph_pg pgid;
13163244fa1SIlya Dryomov 	u32 pg_num;
13263244fa1SIlya Dryomov 	u32 pg_num_mask;
13363244fa1SIlya Dryomov 	struct ceph_osds acting;
13463244fa1SIlya Dryomov 	struct ceph_osds up;
13563244fa1SIlya Dryomov 	int size;
13663244fa1SIlya Dryomov 	int min_size;
13763244fa1SIlya Dryomov 	bool sort_bitwise;
13863244fa1SIlya Dryomov 
13963244fa1SIlya Dryomov 	unsigned int flags;                /* CEPH_OSD_FLAG_* */
14063244fa1SIlya Dryomov 	bool paused;
14163244fa1SIlya Dryomov 
14263244fa1SIlya Dryomov 	int osd;
14363244fa1SIlya Dryomov };
14463244fa1SIlya Dryomov 
1453d14c5d2SYehuda Sadeh /* an in-flight request */
1463d14c5d2SYehuda Sadeh struct ceph_osd_request {
1473d14c5d2SYehuda Sadeh 	u64             r_tid;              /* unique for this client */
1483d14c5d2SYehuda Sadeh 	struct rb_node  r_node;
1493d14c5d2SYehuda Sadeh 	struct ceph_osd *r_osd;
150a66dd383SIlya Dryomov 
151a66dd383SIlya Dryomov 	struct ceph_osd_request_target r_t;
152a66dd383SIlya Dryomov #define r_base_oid	r_t.base_oid
153a66dd383SIlya Dryomov #define r_base_oloc	r_t.base_oloc
154a66dd383SIlya Dryomov #define r_flags		r_t.flags
1553d14c5d2SYehuda Sadeh 
1563d14c5d2SYehuda Sadeh 	struct ceph_msg  *r_request, *r_reply;
1573d14c5d2SYehuda Sadeh 	u32               r_sent;      /* >0 if r_request is sending/sent */
1581b83bef2SSage Weil 
15979528734SAlex Elder 	/* request osd ops array  */
16079528734SAlex Elder 	unsigned int		r_num_ops;
16179528734SAlex Elder 
1621b83bef2SSage Weil 	int               r_result;
163fe5da05eSIlya Dryomov 	bool              r_got_reply;
1643d14c5d2SYehuda Sadeh 
1653d14c5d2SYehuda Sadeh 	struct ceph_osd_client *r_osdc;
1663d14c5d2SYehuda Sadeh 	struct kref       r_kref;
1673d14c5d2SYehuda Sadeh 	bool              r_mempool;
168fe5da05eSIlya Dryomov 	struct completion r_completion;
169fe5da05eSIlya Dryomov 	struct completion r_safe_completion;  /* fsync waiter */
17026be8808SAlex Elder 	ceph_osdc_callback_t r_callback;
17126be8808SAlex Elder 	ceph_osdc_unsafe_callback_t r_unsafe_callback;
1723d14c5d2SYehuda Sadeh 	struct list_head  r_unsafe_item;
1733d14c5d2SYehuda Sadeh 
1743d14c5d2SYehuda Sadeh 	struct inode *r_inode;         	      /* for use by callbacks */
1753d14c5d2SYehuda Sadeh 	void *r_priv;			      /* ditto */
1763d14c5d2SYehuda Sadeh 
177bb873b53SIlya Dryomov 	/* set by submitter */
178bb873b53SIlya Dryomov 	u64 r_snapid;                         /* for reads, CEPH_NOSNAP o/w */
179bb873b53SIlya Dryomov 	struct ceph_snap_context *r_snapc;    /* for writes */
180bb873b53SIlya Dryomov 	struct timespec r_mtime;              /* ditto */
181bb873b53SIlya Dryomov 	u64 r_data_offset;                    /* ditto */
182922dab61SIlya Dryomov 	bool r_linger;                        /* don't resend on failure */
1833d14c5d2SYehuda Sadeh 
184bb873b53SIlya Dryomov 	/* internal */
185bb873b53SIlya Dryomov 	unsigned long r_stamp;                /* jiffies, send or check time */
186bb873b53SIlya Dryomov 	int r_attempts;
187bb873b53SIlya Dryomov 	struct ceph_eversion r_replay_version; /* aka reassert_version */
188bb873b53SIlya Dryomov 	u32 r_last_force_resend;
1893f1af42aSIlya Dryomov 
1903f1af42aSIlya Dryomov 	struct ceph_osd_req_op r_ops[];
1913d14c5d2SYehuda Sadeh };
1923d14c5d2SYehuda Sadeh 
193205ee118SIlya Dryomov struct ceph_request_redirect {
194205ee118SIlya Dryomov 	struct ceph_object_locator oloc;
195205ee118SIlya Dryomov };
196205ee118SIlya Dryomov 
197922dab61SIlya Dryomov typedef void (*rados_watchcb2_t)(void *arg, u64 notify_id, u64 cookie,
198922dab61SIlya Dryomov 				 u64 notifier_id, void *data, size_t data_len);
199922dab61SIlya Dryomov typedef void (*rados_watcherrcb_t)(void *arg, u64 cookie, int err);
200a40c4f10SYehuda Sadeh 
201922dab61SIlya Dryomov struct ceph_osd_linger_request {
202922dab61SIlya Dryomov 	struct ceph_osd_client *osdc;
203922dab61SIlya Dryomov 	u64 linger_id;
204922dab61SIlya Dryomov 	bool committed;
205922dab61SIlya Dryomov 
206922dab61SIlya Dryomov 	struct ceph_osd *osd;
207922dab61SIlya Dryomov 	struct ceph_osd_request *reg_req;
208922dab61SIlya Dryomov 	struct ceph_osd_request *ping_req;
209922dab61SIlya Dryomov 	unsigned long ping_sent;
210922dab61SIlya Dryomov 
211922dab61SIlya Dryomov 	struct ceph_osd_request_target t;
212922dab61SIlya Dryomov 	u32 last_force_resend;
213922dab61SIlya Dryomov 
214922dab61SIlya Dryomov 	struct timespec mtime;
215922dab61SIlya Dryomov 
216922dab61SIlya Dryomov 	struct kref kref;
217922dab61SIlya Dryomov 	struct mutex lock;
218922dab61SIlya Dryomov 	struct rb_node node;            /* osd */
219922dab61SIlya Dryomov 	struct rb_node osdc_node;       /* osdc */
220922dab61SIlya Dryomov 	struct list_head scan_item;
221922dab61SIlya Dryomov 
222922dab61SIlya Dryomov 	struct completion reg_commit_wait;
223922dab61SIlya Dryomov 	int reg_commit_error;
224922dab61SIlya Dryomov 	int last_error;
225922dab61SIlya Dryomov 
226922dab61SIlya Dryomov 	u32 register_gen;
227922dab61SIlya Dryomov 
228922dab61SIlya Dryomov 	rados_watchcb2_t wcb;
229922dab61SIlya Dryomov 	rados_watcherrcb_t errcb;
230922dab61SIlya Dryomov 	void *data;
231a40c4f10SYehuda Sadeh };
232a40c4f10SYehuda Sadeh 
2333d14c5d2SYehuda Sadeh struct ceph_osd_client {
2343d14c5d2SYehuda Sadeh 	struct ceph_client     *client;
2353d14c5d2SYehuda Sadeh 
2363d14c5d2SYehuda Sadeh 	struct ceph_osdmap     *osdmap;       /* current map */
2375aea3dcdSIlya Dryomov 	struct rw_semaphore    lock;
2383d14c5d2SYehuda Sadeh 
2393d14c5d2SYehuda Sadeh 	struct rb_root         osds;          /* osds */
2403d14c5d2SYehuda Sadeh 	struct list_head       osd_lru;       /* idle osds */
2419dd2845cSIlya Dryomov 	spinlock_t             osd_lru_lock;
2425aea3dcdSIlya Dryomov 	struct ceph_osd        homeless_osd;
2435aea3dcdSIlya Dryomov 	atomic64_t             last_tid;      /* tid of last request */
244922dab61SIlya Dryomov 	u64                    last_linger_id;
245922dab61SIlya Dryomov 	struct rb_root         linger_requests; /* lingering requests */
2465aea3dcdSIlya Dryomov 	atomic_t               num_requests;
2475aea3dcdSIlya Dryomov 	atomic_t               num_homeless;
2483d14c5d2SYehuda Sadeh 	struct delayed_work    timeout_work;
2493d14c5d2SYehuda Sadeh 	struct delayed_work    osds_timeout_work;
2503d14c5d2SYehuda Sadeh #ifdef CONFIG_DEBUG_FS
2513d14c5d2SYehuda Sadeh 	struct dentry 	       *debugfs_file;
2523d14c5d2SYehuda Sadeh #endif
2533d14c5d2SYehuda Sadeh 
2543d14c5d2SYehuda Sadeh 	mempool_t              *req_mempool;
2553d14c5d2SYehuda Sadeh 
2563d14c5d2SYehuda Sadeh 	struct ceph_msgpool	msgpool_op;
2573d14c5d2SYehuda Sadeh 	struct ceph_msgpool	msgpool_op_reply;
258a40c4f10SYehuda Sadeh 
259a40c4f10SYehuda Sadeh 	struct workqueue_struct	*notify_wq;
2603d14c5d2SYehuda Sadeh };
2613d14c5d2SYehuda Sadeh 
2625522ae0bSAlex Elder extern int ceph_osdc_setup(void);
2635522ae0bSAlex Elder extern void ceph_osdc_cleanup(void);
2645522ae0bSAlex Elder 
2653d14c5d2SYehuda Sadeh extern int ceph_osdc_init(struct ceph_osd_client *osdc,
2663d14c5d2SYehuda Sadeh 			  struct ceph_client *client);
2673d14c5d2SYehuda Sadeh extern void ceph_osdc_stop(struct ceph_osd_client *osdc);
2683d14c5d2SYehuda Sadeh 
2693d14c5d2SYehuda Sadeh extern void ceph_osdc_handle_reply(struct ceph_osd_client *osdc,
2703d14c5d2SYehuda Sadeh 				   struct ceph_msg *msg);
2713d14c5d2SYehuda Sadeh extern void ceph_osdc_handle_map(struct ceph_osd_client *osdc,
2723d14c5d2SYehuda Sadeh 				 struct ceph_msg *msg);
2733d14c5d2SYehuda Sadeh 
27449719778SAlex Elder extern void osd_req_op_init(struct ceph_osd_request *osd_req,
275144cba14SYan, Zheng 			    unsigned int which, u16 opcode, u32 flags);
27649719778SAlex Elder 
27749719778SAlex Elder extern void osd_req_op_raw_data_in_pages(struct ceph_osd_request *,
27849719778SAlex Elder 					unsigned int which,
27949719778SAlex Elder 					struct page **pages, u64 length,
28049719778SAlex Elder 					u32 alignment, bool pages_from_pool,
28149719778SAlex Elder 					bool own_pages);
28249719778SAlex Elder 
283c99d2d4aSAlex Elder extern void osd_req_op_extent_init(struct ceph_osd_request *osd_req,
284c99d2d4aSAlex Elder 					unsigned int which, u16 opcode,
28533803f33SAlex Elder 					u64 offset, u64 length,
28633803f33SAlex Elder 					u64 truncate_size, u32 truncate_seq);
287c99d2d4aSAlex Elder extern void osd_req_op_extent_update(struct ceph_osd_request *osd_req,
288c99d2d4aSAlex Elder 					unsigned int which, u64 length);
2892c63f49aSYan, Zheng extern void osd_req_op_extent_dup_last(struct ceph_osd_request *osd_req,
2902c63f49aSYan, Zheng 				       unsigned int which, u64 offset_inc);
291a4ce40a9SAlex Elder 
292a4ce40a9SAlex Elder extern struct ceph_osd_data *osd_req_op_extent_osd_data(
293a4ce40a9SAlex Elder 					struct ceph_osd_request *osd_req,
294406e2c9fSAlex Elder 					unsigned int which);
295a4ce40a9SAlex Elder 
296a4ce40a9SAlex Elder extern void osd_req_op_extent_osd_data_pages(struct ceph_osd_request *,
297406e2c9fSAlex 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 extern void osd_req_op_extent_osd_data_pagelist(struct ceph_osd_request *,
302406e2c9fSAlex Elder 					unsigned int which,
303a4ce40a9SAlex Elder 					struct ceph_pagelist *pagelist);
304a4ce40a9SAlex Elder #ifdef CONFIG_BLOCK
305a4ce40a9SAlex Elder extern void osd_req_op_extent_osd_data_bio(struct ceph_osd_request *,
306406e2c9fSAlex Elder 					unsigned int which,
307a4ce40a9SAlex Elder 					struct bio *bio, size_t bio_length);
308a4ce40a9SAlex Elder #endif /* CONFIG_BLOCK */
309a4ce40a9SAlex Elder 
31004017e29SAlex Elder extern void osd_req_op_cls_request_data_pagelist(struct ceph_osd_request *,
31104017e29SAlex Elder 					unsigned int which,
31204017e29SAlex Elder 					struct ceph_pagelist *pagelist);
3136c57b554SAlex Elder extern void osd_req_op_cls_request_data_pages(struct ceph_osd_request *,
3146c57b554SAlex Elder 					unsigned int which,
3156c57b554SAlex Elder 					struct page **pages, u64 length,
3166c57b554SAlex Elder 					u32 alignment, bool pages_from_pool,
3176c57b554SAlex Elder 					bool own_pages);
318a4ce40a9SAlex Elder extern void osd_req_op_cls_response_data_pages(struct ceph_osd_request *,
319c99d2d4aSAlex Elder 					unsigned int which,
320a4ce40a9SAlex Elder 					struct page **pages, u64 length,
321a4ce40a9SAlex Elder 					u32 alignment, bool pages_from_pool,
322a4ce40a9SAlex Elder 					bool own_pages);
323a4ce40a9SAlex Elder 
324c99d2d4aSAlex Elder extern void osd_req_op_cls_init(struct ceph_osd_request *osd_req,
325c99d2d4aSAlex Elder 					unsigned int which, u16 opcode,
32604017e29SAlex Elder 					const char *class, const char *method);
327d74b50beSYan, Zheng extern int osd_req_op_xattr_init(struct ceph_osd_request *osd_req, unsigned int which,
328d74b50beSYan, Zheng 				 u16 opcode, const char *name, const void *value,
329d74b50beSYan, Zheng 				 size_t size, u8 cmp_op, u8 cmp_mode);
330c647b8a8SIlya Dryomov extern void osd_req_op_alloc_hint_init(struct ceph_osd_request *osd_req,
331c647b8a8SIlya Dryomov 				       unsigned int which,
332c647b8a8SIlya Dryomov 				       u64 expected_object_size,
333c647b8a8SIlya Dryomov 				       u64 expected_write_size);
33433803f33SAlex Elder 
3353d14c5d2SYehuda Sadeh extern struct ceph_osd_request *ceph_osdc_alloc_request(struct ceph_osd_client *osdc,
3363d14c5d2SYehuda Sadeh 					       struct ceph_snap_context *snapc,
337acead002SAlex Elder 					       unsigned int num_ops,
3383d14c5d2SYehuda Sadeh 					       bool use_mempool,
33954a54007SAlex Elder 					       gfp_t gfp_flags);
34013d1ad16SIlya Dryomov int ceph_osdc_alloc_messages(struct ceph_osd_request *req, gfp_t gfp);
3413d14c5d2SYehuda Sadeh 
3423d14c5d2SYehuda Sadeh extern struct ceph_osd_request *ceph_osdc_new_request(struct ceph_osd_client *,
3433d14c5d2SYehuda Sadeh 				      struct ceph_file_layout *layout,
3443d14c5d2SYehuda Sadeh 				      struct ceph_vino vino,
345acead002SAlex Elder 				      u64 offset, u64 *len,
346715e4cd4SYan, Zheng 				      unsigned int which, int num_ops,
347715e4cd4SYan, Zheng 				      int opcode, int flags,
3483d14c5d2SYehuda Sadeh 				      struct ceph_snap_context *snapc,
349acead002SAlex Elder 				      u32 truncate_seq, u64 truncate_size,
350153e5167SAlex Elder 				      bool use_mempool);
3513d14c5d2SYehuda Sadeh 
3529e94af20SIlya Dryomov extern void ceph_osdc_get_request(struct ceph_osd_request *req);
3539e94af20SIlya Dryomov extern void ceph_osdc_put_request(struct ceph_osd_request *req);
3543d14c5d2SYehuda Sadeh 
3553d14c5d2SYehuda Sadeh extern int ceph_osdc_start_request(struct ceph_osd_client *osdc,
3563d14c5d2SYehuda Sadeh 				   struct ceph_osd_request *req,
3573d14c5d2SYehuda Sadeh 				   bool nofail);
358c9f9b93dSIlya Dryomov extern void ceph_osdc_cancel_request(struct ceph_osd_request *req);
3593d14c5d2SYehuda Sadeh extern int ceph_osdc_wait_request(struct ceph_osd_client *osdc,
3603d14c5d2SYehuda Sadeh 				  struct ceph_osd_request *req);
3613d14c5d2SYehuda Sadeh extern void ceph_osdc_sync(struct ceph_osd_client *osdc);
3623d14c5d2SYehuda Sadeh 
363dd935f44SJosh Durgin extern void ceph_osdc_flush_notifies(struct ceph_osd_client *osdc);
364dd935f44SJosh Durgin 
3653d14c5d2SYehuda Sadeh extern int ceph_osdc_readpages(struct ceph_osd_client *osdc,
3663d14c5d2SYehuda Sadeh 			       struct ceph_vino vino,
3673d14c5d2SYehuda Sadeh 			       struct ceph_file_layout *layout,
3683d14c5d2SYehuda Sadeh 			       u64 off, u64 *plen,
3693d14c5d2SYehuda Sadeh 			       u32 truncate_seq, u64 truncate_size,
370b7495fc2SSage Weil 			       struct page **pages, int nr_pages,
371b7495fc2SSage Weil 			       int page_align);
3723d14c5d2SYehuda Sadeh 
3733d14c5d2SYehuda Sadeh extern int ceph_osdc_writepages(struct ceph_osd_client *osdc,
3743d14c5d2SYehuda Sadeh 				struct ceph_vino vino,
3753d14c5d2SYehuda Sadeh 				struct ceph_file_layout *layout,
3763d14c5d2SYehuda Sadeh 				struct ceph_snap_context *sc,
3773d14c5d2SYehuda Sadeh 				u64 off, u64 len,
3783d14c5d2SYehuda Sadeh 				u32 truncate_seq, u64 truncate_size,
3793d14c5d2SYehuda Sadeh 				struct timespec *mtime,
38024808826SAlex Elder 				struct page **pages, int nr_pages);
3813d14c5d2SYehuda Sadeh 
382922dab61SIlya Dryomov /* watch/notify */
383922dab61SIlya Dryomov struct ceph_osd_linger_request *
384922dab61SIlya Dryomov ceph_osdc_watch(struct ceph_osd_client *osdc,
385922dab61SIlya Dryomov 		struct ceph_object_id *oid,
386922dab61SIlya Dryomov 		struct ceph_object_locator *oloc,
387922dab61SIlya Dryomov 		rados_watchcb2_t wcb,
388922dab61SIlya Dryomov 		rados_watcherrcb_t errcb,
389922dab61SIlya Dryomov 		void *data);
390922dab61SIlya Dryomov int ceph_osdc_unwatch(struct ceph_osd_client *osdc,
391922dab61SIlya Dryomov 		      struct ceph_osd_linger_request *lreq);
392922dab61SIlya Dryomov 
393922dab61SIlya Dryomov int ceph_osdc_notify_ack(struct ceph_osd_client *osdc,
394922dab61SIlya Dryomov 			 struct ceph_object_id *oid,
395922dab61SIlya Dryomov 			 struct ceph_object_locator *oloc,
396922dab61SIlya Dryomov 			 u64 notify_id,
397922dab61SIlya Dryomov 			 u64 cookie,
398922dab61SIlya Dryomov 			 void *payload,
399922dab61SIlya Dryomov 			 size_t payload_len);
4003d14c5d2SYehuda Sadeh #endif
4013d14c5d2SYehuda Sadeh 
402