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