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