xref: /openbmc/linux/include/linux/ceph/osd_client.h (revision 58eb7932)
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>
802113a0fSElena Reshetova #include <linux/refcount.h>
93d14c5d2SYehuda Sadeh 
106c4a1915SAlex Elder #include <linux/ceph/types.h>
116c4a1915SAlex Elder #include <linux/ceph/osdmap.h>
126c4a1915SAlex Elder #include <linux/ceph/messenger.h>
13b2aa5d0bSIlya Dryomov #include <linux/ceph/msgpool.h>
146c4a1915SAlex Elder #include <linux/ceph/auth.h>
15c885837fSAlex Elder #include <linux/ceph/pagelist.h>
163d14c5d2SYehuda Sadeh 
173d14c5d2SYehuda Sadeh struct ceph_msg;
183d14c5d2SYehuda Sadeh struct ceph_snap_context;
193d14c5d2SYehuda Sadeh struct ceph_osd_request;
203d14c5d2SYehuda Sadeh struct ceph_osd_client;
213d14c5d2SYehuda Sadeh 
223d14c5d2SYehuda Sadeh /*
233d14c5d2SYehuda Sadeh  * completion callback for async writepages
243d14c5d2SYehuda Sadeh  */
2585e084feSIlya Dryomov typedef void (*ceph_osdc_callback_t)(struct ceph_osd_request *);
263d14c5d2SYehuda Sadeh 
2763244fa1SIlya Dryomov #define CEPH_HOMELESS_OSD	-1
2863244fa1SIlya Dryomov 
293d14c5d2SYehuda Sadeh /* a given osd we're communicating with */
303d14c5d2SYehuda Sadeh struct ceph_osd {
3102113a0fSElena Reshetova 	refcount_t o_ref;
323d14c5d2SYehuda Sadeh 	struct ceph_osd_client *o_osdc;
333d14c5d2SYehuda Sadeh 	int o_osd;
343d14c5d2SYehuda Sadeh 	int o_incarnation;
353d14c5d2SYehuda Sadeh 	struct rb_node o_node;
363d14c5d2SYehuda Sadeh 	struct ceph_connection o_con;
375aea3dcdSIlya Dryomov 	struct rb_root o_requests;
38922dab61SIlya Dryomov 	struct rb_root o_linger_requests;
393d14c5d2SYehuda Sadeh 	struct list_head o_osd_lru;
406c4a1915SAlex Elder 	struct ceph_auth_handshake o_auth;
413d14c5d2SYehuda Sadeh 	unsigned long lru_ttl;
423d14c5d2SYehuda Sadeh 	struct list_head o_keepalive_item;
435aea3dcdSIlya Dryomov 	struct mutex lock;
443d14c5d2SYehuda Sadeh };
453d14c5d2SYehuda Sadeh 
463f1af42aSIlya Dryomov #define CEPH_OSD_SLAB_OPS	2
473f1af42aSIlya Dryomov #define CEPH_OSD_MAX_OPS	16
481b83bef2SSage Weil 
492ac2b7a6SAlex Elder enum ceph_osd_data_type {
50ec9123c5SAlex Elder 	CEPH_OSD_DATA_TYPE_NONE = 0,
512ac2b7a6SAlex Elder 	CEPH_OSD_DATA_TYPE_PAGES,
529a5e6d09SAlex Elder 	CEPH_OSD_DATA_TYPE_PAGELIST,
532ac2b7a6SAlex Elder #ifdef CONFIG_BLOCK
542ac2b7a6SAlex Elder 	CEPH_OSD_DATA_TYPE_BIO,
552ac2b7a6SAlex Elder #endif /* CONFIG_BLOCK */
562ac2b7a6SAlex Elder };
572ac2b7a6SAlex Elder 
582794a82aSAlex Elder struct ceph_osd_data {
592ac2b7a6SAlex Elder 	enum ceph_osd_data_type	type;
602ac2b7a6SAlex Elder 	union {
612794a82aSAlex Elder 		struct {
622794a82aSAlex Elder 			struct page	**pages;
63e0c59487SAlex Elder 			u64		length;
642794a82aSAlex Elder 			u32		alignment;
652794a82aSAlex Elder 			bool		pages_from_pool;
662794a82aSAlex Elder 			bool		own_pages;
672794a82aSAlex Elder 		};
689a5e6d09SAlex Elder 		struct ceph_pagelist	*pagelist;
692794a82aSAlex Elder #ifdef CONFIG_BLOCK
70fdce58ccSAlex Elder 		struct {
71fdce58ccSAlex Elder 			struct bio	*bio;		/* list of bios */
72fdce58ccSAlex Elder 			size_t		bio_length;	/* total in list */
73fdce58ccSAlex Elder 		};
742794a82aSAlex Elder #endif /* CONFIG_BLOCK */
752794a82aSAlex Elder 	};
762794a82aSAlex Elder };
772794a82aSAlex Elder 
7879528734SAlex Elder struct ceph_osd_req_op {
7979528734SAlex Elder 	u16 op;           /* CEPH_OSD_OP_* */
807b25bf5fSIlya Dryomov 	u32 flags;        /* CEPH_OSD_OP_FLAG_* */
81de2aa102SIlya Dryomov 	u32 indata_len;   /* request */
827665d85bSYan, Zheng 	u32 outdata_len;  /* reply */
837665d85bSYan, Zheng 	s32 rval;
847665d85bSYan, Zheng 
8579528734SAlex Elder 	union {
8649719778SAlex Elder 		struct ceph_osd_data raw_data_in;
8779528734SAlex Elder 		struct {
8879528734SAlex Elder 			u64 offset, length;
8979528734SAlex Elder 			u64 truncate_size;
9079528734SAlex Elder 			u32 truncate_seq;
915476492fSAlex Elder 			struct ceph_osd_data osd_data;
9279528734SAlex Elder 		} extent;
9379528734SAlex Elder 		struct {
94d7d5a007SIlya Dryomov 			u32 name_len;
95d7d5a007SIlya Dryomov 			u32 value_len;
96d74b50beSYan, Zheng 			__u8 cmp_op;       /* CEPH_OSD_CMPXATTR_OP_* */
97d74b50beSYan, Zheng 			__u8 cmp_mode;     /* CEPH_OSD_CMPXATTR_MODE_* */
98d74b50beSYan, Zheng 			struct ceph_osd_data osd_data;
99d74b50beSYan, Zheng 		} xattr;
100d74b50beSYan, Zheng 		struct {
10179528734SAlex Elder 			const char *class_name;
10279528734SAlex Elder 			const char *method_name;
1035476492fSAlex Elder 			struct ceph_osd_data request_info;
10404017e29SAlex Elder 			struct ceph_osd_data request_data;
1055476492fSAlex Elder 			struct ceph_osd_data response_data;
10679528734SAlex Elder 			__u8 class_len;
10779528734SAlex Elder 			__u8 method_len;
108bb873b53SIlya Dryomov 			u32 indata_len;
10979528734SAlex Elder 		} cls;
11079528734SAlex Elder 		struct {
11179528734SAlex Elder 			u64 cookie;
112922dab61SIlya Dryomov 			__u8 op;           /* CEPH_OSD_WATCH_OP_ */
113922dab61SIlya Dryomov 			u32 gen;
11479528734SAlex Elder 		} watch;
115c647b8a8SIlya Dryomov 		struct {
116922dab61SIlya Dryomov 			struct ceph_osd_data request_data;
117922dab61SIlya Dryomov 		} notify_ack;
118922dab61SIlya Dryomov 		struct {
11919079203SIlya Dryomov 			u64 cookie;
12019079203SIlya Dryomov 			struct ceph_osd_data request_data;
12119079203SIlya Dryomov 			struct ceph_osd_data response_data;
12219079203SIlya Dryomov 		} notify;
12319079203SIlya Dryomov 		struct {
124a4ed38d7SDouglas Fuller 			struct ceph_osd_data response_data;
125a4ed38d7SDouglas Fuller 		} list_watchers;
126a4ed38d7SDouglas Fuller 		struct {
127c647b8a8SIlya Dryomov 			u64 expected_object_size;
128c647b8a8SIlya Dryomov 			u64 expected_write_size;
129c647b8a8SIlya Dryomov 		} alloc_hint;
13079528734SAlex Elder 	};
13179528734SAlex Elder };
13279528734SAlex Elder 
13363244fa1SIlya Dryomov struct ceph_osd_request_target {
13463244fa1SIlya Dryomov 	struct ceph_object_id base_oid;
13563244fa1SIlya Dryomov 	struct ceph_object_locator base_oloc;
13663244fa1SIlya Dryomov 	struct ceph_object_id target_oid;
13763244fa1SIlya Dryomov 	struct ceph_object_locator target_oloc;
13863244fa1SIlya Dryomov 
13963244fa1SIlya Dryomov 	struct ceph_pg pgid;
14063244fa1SIlya Dryomov 	u32 pg_num;
14163244fa1SIlya Dryomov 	u32 pg_num_mask;
14263244fa1SIlya Dryomov 	struct ceph_osds acting;
14363244fa1SIlya Dryomov 	struct ceph_osds up;
14463244fa1SIlya Dryomov 	int size;
14563244fa1SIlya Dryomov 	int min_size;
14663244fa1SIlya Dryomov 	bool sort_bitwise;
14763244fa1SIlya Dryomov 
14863244fa1SIlya Dryomov 	unsigned int flags;                /* CEPH_OSD_FLAG_* */
14963244fa1SIlya Dryomov 	bool paused;
15063244fa1SIlya Dryomov 
15163244fa1SIlya Dryomov 	int osd;
15263244fa1SIlya Dryomov };
15363244fa1SIlya Dryomov 
1543d14c5d2SYehuda Sadeh /* an in-flight request */
1553d14c5d2SYehuda Sadeh struct ceph_osd_request {
1563d14c5d2SYehuda Sadeh 	u64             r_tid;              /* unique for this client */
1573d14c5d2SYehuda Sadeh 	struct rb_node  r_node;
1584609245eSIlya Dryomov 	struct rb_node  r_mc_node;          /* map check */
1593d14c5d2SYehuda Sadeh 	struct ceph_osd *r_osd;
160a66dd383SIlya Dryomov 
161a66dd383SIlya Dryomov 	struct ceph_osd_request_target r_t;
162a66dd383SIlya Dryomov #define r_base_oid	r_t.base_oid
163a66dd383SIlya Dryomov #define r_base_oloc	r_t.base_oloc
164a66dd383SIlya Dryomov #define r_flags		r_t.flags
1653d14c5d2SYehuda Sadeh 
1663d14c5d2SYehuda Sadeh 	struct ceph_msg  *r_request, *r_reply;
1673d14c5d2SYehuda Sadeh 	u32               r_sent;      /* >0 if r_request is sending/sent */
1681b83bef2SSage Weil 
16979528734SAlex Elder 	/* request osd ops array  */
17079528734SAlex Elder 	unsigned int		r_num_ops;
17179528734SAlex Elder 
1721b83bef2SSage Weil 	int               r_result;
1733d14c5d2SYehuda Sadeh 
1743d14c5d2SYehuda Sadeh 	struct ceph_osd_client *r_osdc;
1753d14c5d2SYehuda Sadeh 	struct kref       r_kref;
1763d14c5d2SYehuda Sadeh 	bool              r_mempool;
177b18b9550SIlya Dryomov 	struct completion r_completion;       /* private to osd_client.c */
17826be8808SAlex Elder 	ceph_osdc_callback_t r_callback;
1793d14c5d2SYehuda Sadeh 	struct list_head  r_unsafe_item;
1803d14c5d2SYehuda Sadeh 
1813d14c5d2SYehuda Sadeh 	struct inode *r_inode;         	      /* for use by callbacks */
1823d14c5d2SYehuda Sadeh 	void *r_priv;			      /* ditto */
1833d14c5d2SYehuda Sadeh 
184bb873b53SIlya Dryomov 	/* set by submitter */
185bb873b53SIlya Dryomov 	u64 r_snapid;                         /* for reads, CEPH_NOSNAP o/w */
186bb873b53SIlya Dryomov 	struct ceph_snap_context *r_snapc;    /* for writes */
187bb873b53SIlya Dryomov 	struct timespec r_mtime;              /* ditto */
188bb873b53SIlya Dryomov 	u64 r_data_offset;                    /* ditto */
189922dab61SIlya Dryomov 	bool r_linger;                        /* don't resend on failure */
190a1f4020aSJeff Layton 	bool r_abort_on_full;		      /* return ENOSPC when full */
1913d14c5d2SYehuda Sadeh 
192bb873b53SIlya Dryomov 	/* internal */
193bb873b53SIlya Dryomov 	unsigned long r_stamp;                /* jiffies, send or check time */
1947cc5e38fSIlya Dryomov 	unsigned long r_start_stamp;          /* jiffies */
195bb873b53SIlya Dryomov 	int r_attempts;
196bb873b53SIlya Dryomov 	u32 r_last_force_resend;
1974609245eSIlya Dryomov 	u32 r_map_dne_bound;
1983f1af42aSIlya Dryomov 
1993f1af42aSIlya Dryomov 	struct ceph_osd_req_op r_ops[];
2003d14c5d2SYehuda Sadeh };
2013d14c5d2SYehuda Sadeh 
202205ee118SIlya Dryomov struct ceph_request_redirect {
203205ee118SIlya Dryomov 	struct ceph_object_locator oloc;
204205ee118SIlya Dryomov };
205205ee118SIlya Dryomov 
206922dab61SIlya Dryomov typedef void (*rados_watchcb2_t)(void *arg, u64 notify_id, u64 cookie,
207922dab61SIlya Dryomov 				 u64 notifier_id, void *data, size_t data_len);
208922dab61SIlya Dryomov typedef void (*rados_watcherrcb_t)(void *arg, u64 cookie, int err);
209a40c4f10SYehuda Sadeh 
210922dab61SIlya Dryomov struct ceph_osd_linger_request {
211922dab61SIlya Dryomov 	struct ceph_osd_client *osdc;
212922dab61SIlya Dryomov 	u64 linger_id;
213922dab61SIlya Dryomov 	bool committed;
21419079203SIlya Dryomov 	bool is_watch;                  /* watch or notify */
215922dab61SIlya Dryomov 
216922dab61SIlya Dryomov 	struct ceph_osd *osd;
217922dab61SIlya Dryomov 	struct ceph_osd_request *reg_req;
218922dab61SIlya Dryomov 	struct ceph_osd_request *ping_req;
219922dab61SIlya Dryomov 	unsigned long ping_sent;
220b07d3c4bSIlya Dryomov 	unsigned long watch_valid_thru;
221b07d3c4bSIlya Dryomov 	struct list_head pending_lworks;
222922dab61SIlya Dryomov 
223922dab61SIlya Dryomov 	struct ceph_osd_request_target t;
224922dab61SIlya Dryomov 	u32 last_force_resend;
2254609245eSIlya Dryomov 	u32 map_dne_bound;
226922dab61SIlya Dryomov 
227922dab61SIlya Dryomov 	struct timespec mtime;
228922dab61SIlya Dryomov 
229922dab61SIlya Dryomov 	struct kref kref;
230922dab61SIlya Dryomov 	struct mutex lock;
231922dab61SIlya Dryomov 	struct rb_node node;            /* osd */
232922dab61SIlya Dryomov 	struct rb_node osdc_node;       /* osdc */
2334609245eSIlya Dryomov 	struct rb_node mc_node;         /* map check */
234922dab61SIlya Dryomov 	struct list_head scan_item;
235922dab61SIlya Dryomov 
236922dab61SIlya Dryomov 	struct completion reg_commit_wait;
23719079203SIlya Dryomov 	struct completion notify_finish_wait;
238922dab61SIlya Dryomov 	int reg_commit_error;
23919079203SIlya Dryomov 	int notify_finish_error;
240922dab61SIlya Dryomov 	int last_error;
241922dab61SIlya Dryomov 
242922dab61SIlya Dryomov 	u32 register_gen;
24319079203SIlya Dryomov 	u64 notify_id;
244922dab61SIlya Dryomov 
245922dab61SIlya Dryomov 	rados_watchcb2_t wcb;
246922dab61SIlya Dryomov 	rados_watcherrcb_t errcb;
247922dab61SIlya Dryomov 	void *data;
24819079203SIlya Dryomov 
24919079203SIlya Dryomov 	struct page ***preply_pages;
25019079203SIlya Dryomov 	size_t *preply_len;
251a40c4f10SYehuda Sadeh };
252a40c4f10SYehuda Sadeh 
253a4ed38d7SDouglas Fuller struct ceph_watch_item {
254a4ed38d7SDouglas Fuller 	struct ceph_entity_name name;
255a4ed38d7SDouglas Fuller 	u64 cookie;
256a4ed38d7SDouglas Fuller 	struct ceph_entity_addr addr;
257a4ed38d7SDouglas Fuller };
258a4ed38d7SDouglas Fuller 
259264048afSIlya Dryomov #define CEPH_LINGER_ID_START	0xffff000000000000ULL
260264048afSIlya Dryomov 
2613d14c5d2SYehuda Sadeh struct ceph_osd_client {
2623d14c5d2SYehuda Sadeh 	struct ceph_client     *client;
2633d14c5d2SYehuda Sadeh 
2643d14c5d2SYehuda Sadeh 	struct ceph_osdmap     *osdmap;       /* current map */
2655aea3dcdSIlya Dryomov 	struct rw_semaphore    lock;
2663d14c5d2SYehuda Sadeh 
2673d14c5d2SYehuda Sadeh 	struct rb_root         osds;          /* osds */
2683d14c5d2SYehuda Sadeh 	struct list_head       osd_lru;       /* idle osds */
2699dd2845cSIlya Dryomov 	spinlock_t             osd_lru_lock;
27058eb7932SJeff Layton 	u32		       epoch_barrier;
2715aea3dcdSIlya Dryomov 	struct ceph_osd        homeless_osd;
2725aea3dcdSIlya Dryomov 	atomic64_t             last_tid;      /* tid of last request */
273922dab61SIlya Dryomov 	u64                    last_linger_id;
274922dab61SIlya Dryomov 	struct rb_root         linger_requests; /* lingering requests */
2754609245eSIlya Dryomov 	struct rb_root         map_checks;
2764609245eSIlya Dryomov 	struct rb_root         linger_map_checks;
2775aea3dcdSIlya Dryomov 	atomic_t               num_requests;
2785aea3dcdSIlya Dryomov 	atomic_t               num_homeless;
2793d14c5d2SYehuda Sadeh 	struct delayed_work    timeout_work;
2803d14c5d2SYehuda Sadeh 	struct delayed_work    osds_timeout_work;
2813d14c5d2SYehuda Sadeh #ifdef CONFIG_DEBUG_FS
2823d14c5d2SYehuda Sadeh 	struct dentry 	       *debugfs_file;
2833d14c5d2SYehuda Sadeh #endif
2843d14c5d2SYehuda Sadeh 
2853d14c5d2SYehuda Sadeh 	mempool_t              *req_mempool;
2863d14c5d2SYehuda Sadeh 
2873d14c5d2SYehuda Sadeh 	struct ceph_msgpool	msgpool_op;
2883d14c5d2SYehuda Sadeh 	struct ceph_msgpool	msgpool_op_reply;
289a40c4f10SYehuda Sadeh 
290a40c4f10SYehuda Sadeh 	struct workqueue_struct	*notify_wq;
2913d14c5d2SYehuda Sadeh };
2923d14c5d2SYehuda Sadeh 
293b7ec35b3SIlya Dryomov static inline bool ceph_osdmap_flag(struct ceph_osd_client *osdc, int flag)
294b7ec35b3SIlya Dryomov {
295b7ec35b3SIlya Dryomov 	return osdc->osdmap->flags & flag;
296b7ec35b3SIlya Dryomov }
297b7ec35b3SIlya Dryomov 
2985522ae0bSAlex Elder extern int ceph_osdc_setup(void);
2995522ae0bSAlex Elder extern void ceph_osdc_cleanup(void);
3005522ae0bSAlex Elder 
3013d14c5d2SYehuda Sadeh extern int ceph_osdc_init(struct ceph_osd_client *osdc,
3023d14c5d2SYehuda Sadeh 			  struct ceph_client *client);
3033d14c5d2SYehuda Sadeh extern void ceph_osdc_stop(struct ceph_osd_client *osdc);
3043d14c5d2SYehuda Sadeh 
3053d14c5d2SYehuda Sadeh extern void ceph_osdc_handle_reply(struct ceph_osd_client *osdc,
3063d14c5d2SYehuda Sadeh 				   struct ceph_msg *msg);
3073d14c5d2SYehuda Sadeh extern void ceph_osdc_handle_map(struct ceph_osd_client *osdc,
3083d14c5d2SYehuda Sadeh 				 struct ceph_msg *msg);
30958eb7932SJeff Layton void ceph_osdc_update_epoch_barrier(struct ceph_osd_client *osdc, u32 eb);
3103d14c5d2SYehuda Sadeh 
31149719778SAlex Elder extern void osd_req_op_init(struct ceph_osd_request *osd_req,
312144cba14SYan, Zheng 			    unsigned int which, u16 opcode, u32 flags);
31349719778SAlex Elder 
31449719778SAlex Elder extern void osd_req_op_raw_data_in_pages(struct ceph_osd_request *,
31549719778SAlex Elder 					unsigned int which,
31649719778SAlex Elder 					struct page **pages, u64 length,
31749719778SAlex Elder 					u32 alignment, bool pages_from_pool,
31849719778SAlex Elder 					bool own_pages);
31949719778SAlex Elder 
320c99d2d4aSAlex Elder extern void osd_req_op_extent_init(struct ceph_osd_request *osd_req,
321c99d2d4aSAlex Elder 					unsigned int which, u16 opcode,
32233803f33SAlex Elder 					u64 offset, u64 length,
32333803f33SAlex Elder 					u64 truncate_size, u32 truncate_seq);
324c99d2d4aSAlex Elder extern void osd_req_op_extent_update(struct ceph_osd_request *osd_req,
325c99d2d4aSAlex Elder 					unsigned int which, u64 length);
3262c63f49aSYan, Zheng extern void osd_req_op_extent_dup_last(struct ceph_osd_request *osd_req,
3272c63f49aSYan, Zheng 				       unsigned int which, u64 offset_inc);
328a4ce40a9SAlex Elder 
329a4ce40a9SAlex Elder extern struct ceph_osd_data *osd_req_op_extent_osd_data(
330a4ce40a9SAlex Elder 					struct ceph_osd_request *osd_req,
331406e2c9fSAlex Elder 					unsigned int which);
332a4ce40a9SAlex Elder 
333a4ce40a9SAlex Elder extern void osd_req_op_extent_osd_data_pages(struct ceph_osd_request *,
334406e2c9fSAlex Elder 					unsigned int which,
335a4ce40a9SAlex Elder 					struct page **pages, u64 length,
336a4ce40a9SAlex Elder 					u32 alignment, bool pages_from_pool,
337a4ce40a9SAlex Elder 					bool own_pages);
338a4ce40a9SAlex Elder extern void osd_req_op_extent_osd_data_pagelist(struct ceph_osd_request *,
339406e2c9fSAlex Elder 					unsigned int which,
340a4ce40a9SAlex Elder 					struct ceph_pagelist *pagelist);
341a4ce40a9SAlex Elder #ifdef CONFIG_BLOCK
342a4ce40a9SAlex Elder extern void osd_req_op_extent_osd_data_bio(struct ceph_osd_request *,
343406e2c9fSAlex Elder 					unsigned int which,
344a4ce40a9SAlex Elder 					struct bio *bio, size_t bio_length);
345a4ce40a9SAlex Elder #endif /* CONFIG_BLOCK */
346a4ce40a9SAlex Elder 
34704017e29SAlex Elder extern void osd_req_op_cls_request_data_pagelist(struct ceph_osd_request *,
34804017e29SAlex Elder 					unsigned int which,
34904017e29SAlex Elder 					struct ceph_pagelist *pagelist);
3506c57b554SAlex Elder extern void osd_req_op_cls_request_data_pages(struct ceph_osd_request *,
3516c57b554SAlex Elder 					unsigned int which,
3526c57b554SAlex Elder 					struct page **pages, u64 length,
3536c57b554SAlex Elder 					u32 alignment, bool pages_from_pool,
3546c57b554SAlex Elder 					bool own_pages);
355a4ce40a9SAlex Elder extern void osd_req_op_cls_response_data_pages(struct ceph_osd_request *,
356c99d2d4aSAlex Elder 					unsigned int which,
357a4ce40a9SAlex Elder 					struct page **pages, u64 length,
358a4ce40a9SAlex Elder 					u32 alignment, bool pages_from_pool,
359a4ce40a9SAlex Elder 					bool own_pages);
360c99d2d4aSAlex Elder extern void osd_req_op_cls_init(struct ceph_osd_request *osd_req,
361c99d2d4aSAlex Elder 					unsigned int which, u16 opcode,
36204017e29SAlex Elder 					const char *class, const char *method);
363d74b50beSYan, Zheng extern int osd_req_op_xattr_init(struct ceph_osd_request *osd_req, unsigned int which,
364d74b50beSYan, Zheng 				 u16 opcode, const char *name, const void *value,
365d74b50beSYan, Zheng 				 size_t size, u8 cmp_op, u8 cmp_mode);
366c647b8a8SIlya Dryomov extern void osd_req_op_alloc_hint_init(struct ceph_osd_request *osd_req,
367c647b8a8SIlya Dryomov 				       unsigned int which,
368c647b8a8SIlya Dryomov 				       u64 expected_object_size,
369c647b8a8SIlya Dryomov 				       u64 expected_write_size);
37033803f33SAlex Elder 
3713d14c5d2SYehuda Sadeh extern struct ceph_osd_request *ceph_osdc_alloc_request(struct ceph_osd_client *osdc,
3723d14c5d2SYehuda Sadeh 					       struct ceph_snap_context *snapc,
373acead002SAlex Elder 					       unsigned int num_ops,
3743d14c5d2SYehuda Sadeh 					       bool use_mempool,
37554a54007SAlex Elder 					       gfp_t gfp_flags);
37613d1ad16SIlya Dryomov int ceph_osdc_alloc_messages(struct ceph_osd_request *req, gfp_t gfp);
3773d14c5d2SYehuda Sadeh 
3783d14c5d2SYehuda Sadeh extern struct ceph_osd_request *ceph_osdc_new_request(struct ceph_osd_client *,
3793d14c5d2SYehuda Sadeh 				      struct ceph_file_layout *layout,
3803d14c5d2SYehuda Sadeh 				      struct ceph_vino vino,
381acead002SAlex Elder 				      u64 offset, u64 *len,
382715e4cd4SYan, Zheng 				      unsigned int which, int num_ops,
383715e4cd4SYan, Zheng 				      int opcode, int flags,
3843d14c5d2SYehuda Sadeh 				      struct ceph_snap_context *snapc,
385acead002SAlex Elder 				      u32 truncate_seq, u64 truncate_size,
386153e5167SAlex Elder 				      bool use_mempool);
3873d14c5d2SYehuda Sadeh 
3889e94af20SIlya Dryomov extern void ceph_osdc_get_request(struct ceph_osd_request *req);
3899e94af20SIlya Dryomov extern void ceph_osdc_put_request(struct ceph_osd_request *req);
3903d14c5d2SYehuda Sadeh 
3913d14c5d2SYehuda Sadeh extern int ceph_osdc_start_request(struct ceph_osd_client *osdc,
3923d14c5d2SYehuda Sadeh 				   struct ceph_osd_request *req,
3933d14c5d2SYehuda Sadeh 				   bool nofail);
394c9f9b93dSIlya Dryomov extern void ceph_osdc_cancel_request(struct ceph_osd_request *req);
3953d14c5d2SYehuda Sadeh extern int ceph_osdc_wait_request(struct ceph_osd_client *osdc,
3963d14c5d2SYehuda Sadeh 				  struct ceph_osd_request *req);
3973d14c5d2SYehuda Sadeh extern void ceph_osdc_sync(struct ceph_osd_client *osdc);
3983d14c5d2SYehuda Sadeh 
399dd935f44SJosh Durgin extern void ceph_osdc_flush_notifies(struct ceph_osd_client *osdc);
4007cca78c9SIlya Dryomov void ceph_osdc_maybe_request_map(struct ceph_osd_client *osdc);
401dd935f44SJosh Durgin 
402428a7158SDouglas Fuller int ceph_osdc_call(struct ceph_osd_client *osdc,
403428a7158SDouglas Fuller 		   struct ceph_object_id *oid,
404428a7158SDouglas Fuller 		   struct ceph_object_locator *oloc,
405428a7158SDouglas Fuller 		   const char *class, const char *method,
406428a7158SDouglas Fuller 		   unsigned int flags,
407428a7158SDouglas Fuller 		   struct page *req_page, size_t req_len,
408428a7158SDouglas Fuller 		   struct page *resp_page, size_t *resp_len);
409428a7158SDouglas Fuller 
4103d14c5d2SYehuda Sadeh extern int ceph_osdc_readpages(struct ceph_osd_client *osdc,
4113d14c5d2SYehuda Sadeh 			       struct ceph_vino vino,
4123d14c5d2SYehuda Sadeh 			       struct ceph_file_layout *layout,
4133d14c5d2SYehuda Sadeh 			       u64 off, u64 *plen,
4143d14c5d2SYehuda Sadeh 			       u32 truncate_seq, u64 truncate_size,
415b7495fc2SSage Weil 			       struct page **pages, int nr_pages,
416b7495fc2SSage Weil 			       int page_align);
4173d14c5d2SYehuda Sadeh 
4183d14c5d2SYehuda Sadeh extern int ceph_osdc_writepages(struct ceph_osd_client *osdc,
4193d14c5d2SYehuda Sadeh 				struct ceph_vino vino,
4203d14c5d2SYehuda Sadeh 				struct ceph_file_layout *layout,
4213d14c5d2SYehuda Sadeh 				struct ceph_snap_context *sc,
4223d14c5d2SYehuda Sadeh 				u64 off, u64 len,
4233d14c5d2SYehuda Sadeh 				u32 truncate_seq, u64 truncate_size,
4243d14c5d2SYehuda Sadeh 				struct timespec *mtime,
42524808826SAlex Elder 				struct page **pages, int nr_pages);
4263d14c5d2SYehuda Sadeh 
427922dab61SIlya Dryomov /* watch/notify */
428922dab61SIlya Dryomov struct ceph_osd_linger_request *
429922dab61SIlya Dryomov ceph_osdc_watch(struct ceph_osd_client *osdc,
430922dab61SIlya Dryomov 		struct ceph_object_id *oid,
431922dab61SIlya Dryomov 		struct ceph_object_locator *oloc,
432922dab61SIlya Dryomov 		rados_watchcb2_t wcb,
433922dab61SIlya Dryomov 		rados_watcherrcb_t errcb,
434922dab61SIlya Dryomov 		void *data);
435922dab61SIlya Dryomov int ceph_osdc_unwatch(struct ceph_osd_client *osdc,
436922dab61SIlya Dryomov 		      struct ceph_osd_linger_request *lreq);
437922dab61SIlya Dryomov 
438922dab61SIlya Dryomov int ceph_osdc_notify_ack(struct ceph_osd_client *osdc,
439922dab61SIlya Dryomov 			 struct ceph_object_id *oid,
440922dab61SIlya Dryomov 			 struct ceph_object_locator *oloc,
441922dab61SIlya Dryomov 			 u64 notify_id,
442922dab61SIlya Dryomov 			 u64 cookie,
443922dab61SIlya Dryomov 			 void *payload,
444922dab61SIlya Dryomov 			 size_t payload_len);
44519079203SIlya Dryomov int ceph_osdc_notify(struct ceph_osd_client *osdc,
44619079203SIlya Dryomov 		     struct ceph_object_id *oid,
44719079203SIlya Dryomov 		     struct ceph_object_locator *oloc,
44819079203SIlya Dryomov 		     void *payload,
44919079203SIlya Dryomov 		     size_t payload_len,
45019079203SIlya Dryomov 		     u32 timeout,
45119079203SIlya Dryomov 		     struct page ***preply_pages,
45219079203SIlya Dryomov 		     size_t *preply_len);
453b07d3c4bSIlya Dryomov int ceph_osdc_watch_check(struct ceph_osd_client *osdc,
454b07d3c4bSIlya Dryomov 			  struct ceph_osd_linger_request *lreq);
455a4ed38d7SDouglas Fuller int ceph_osdc_list_watchers(struct ceph_osd_client *osdc,
456a4ed38d7SDouglas Fuller 			    struct ceph_object_id *oid,
457a4ed38d7SDouglas Fuller 			    struct ceph_object_locator *oloc,
458a4ed38d7SDouglas Fuller 			    struct ceph_watch_item **watchers,
459a4ed38d7SDouglas Fuller 			    u32 *num_watchers);
4603d14c5d2SYehuda Sadeh #endif
4613d14c5d2SYehuda Sadeh 
462