1#ifndef _FS_CEPH_OSD_CLIENT_H 2#define _FS_CEPH_OSD_CLIENT_H 3 4#include <linux/completion.h> 5#include <linux/kref.h> 6#include <linux/mempool.h> 7#include <linux/rbtree.h> 8 9#include "types.h" 10#include "osdmap.h" 11#include "messenger.h" 12 13struct ceph_msg; 14struct ceph_snap_context; 15struct ceph_osd_request; 16struct ceph_osd_client; 17struct ceph_authorizer; 18 19/* 20 * completion callback for async writepages 21 */ 22typedef void (*ceph_osdc_callback_t)(struct ceph_osd_request *, 23 struct ceph_msg *); 24 25/* a given osd we're communicating with */ 26struct ceph_osd { 27 atomic_t o_ref; 28 struct ceph_osd_client *o_osdc; 29 int o_osd; 30 int o_incarnation; 31 struct rb_node o_node; 32 struct ceph_connection o_con; 33 struct list_head o_requests; 34 struct list_head o_osd_lru; 35 struct ceph_authorizer *o_authorizer; 36 void *o_authorizer_buf, *o_authorizer_reply_buf; 37 size_t o_authorizer_buf_len, o_authorizer_reply_buf_len; 38 unsigned long lru_ttl; 39 int o_marked_for_keepalive; 40 struct list_head o_keepalive_item; 41}; 42 43/* an in-flight request */ 44struct ceph_osd_request { 45 u64 r_tid; /* unique for this client */ 46 struct rb_node r_node; 47 struct list_head r_req_lru_item; 48 struct list_head r_osd_item; 49 struct ceph_osd *r_osd; 50 struct ceph_pg r_pgid; 51 int r_pg_osds[CEPH_PG_MAX_SIZE]; 52 int r_num_pg_osds; 53 54 struct ceph_connection *r_con_filling_msg; 55 56 struct ceph_msg *r_request, *r_reply; 57 int r_result; 58 int r_flags; /* any additional flags for the osd */ 59 u32 r_sent; /* >0 if r_request is sending/sent */ 60 int r_got_reply; 61 62 struct ceph_osd_client *r_osdc; 63 struct kref r_kref; 64 bool r_mempool; 65 struct completion r_completion, r_safe_completion; 66 ceph_osdc_callback_t r_callback, r_safe_callback; 67 struct ceph_eversion r_reassert_version; 68 struct list_head r_unsafe_item; 69 70 struct inode *r_inode; /* for use by callbacks */ 71 72 char r_oid[40]; /* object name */ 73 int r_oid_len; 74 unsigned long r_stamp; /* send OR check time */ 75 bool r_resend; /* msg send failed, needs retry */ 76 77 struct ceph_file_layout r_file_layout; 78 struct ceph_snap_context *r_snapc; /* snap context for writes */ 79 unsigned r_num_pages; /* size of page array (follows) */ 80 struct page **r_pages; /* pages for data payload */ 81 int r_pages_from_pool; 82 int r_own_pages; /* if true, i own page list */ 83}; 84 85struct ceph_osd_client { 86 struct ceph_client *client; 87 88 struct ceph_osdmap *osdmap; /* current map */ 89 struct rw_semaphore map_sem; 90 struct completion map_waiters; 91 u64 last_requested_map; 92 93 struct mutex request_mutex; 94 struct rb_root osds; /* osds */ 95 struct list_head osd_lru; /* idle osds */ 96 u64 timeout_tid; /* tid of timeout triggering rq */ 97 u64 last_tid; /* tid of last request */ 98 struct rb_root requests; /* pending requests */ 99 struct list_head req_lru; /* pending requests lru */ 100 int num_requests; 101 struct delayed_work timeout_work; 102 struct delayed_work osds_timeout_work; 103#ifdef CONFIG_DEBUG_FS 104 struct dentry *debugfs_file; 105#endif 106 107 mempool_t *req_mempool; 108 109 struct ceph_msgpool msgpool_op; 110 struct ceph_msgpool msgpool_op_reply; 111}; 112 113extern int ceph_osdc_init(struct ceph_osd_client *osdc, 114 struct ceph_client *client); 115extern void ceph_osdc_stop(struct ceph_osd_client *osdc); 116 117extern void ceph_osdc_handle_reply(struct ceph_osd_client *osdc, 118 struct ceph_msg *msg); 119extern void ceph_osdc_handle_map(struct ceph_osd_client *osdc, 120 struct ceph_msg *msg); 121 122extern struct ceph_osd_request *ceph_osdc_new_request(struct ceph_osd_client *, 123 struct ceph_file_layout *layout, 124 struct ceph_vino vino, 125 u64 offset, u64 *len, int op, int flags, 126 struct ceph_snap_context *snapc, 127 int do_sync, u32 truncate_seq, 128 u64 truncate_size, 129 struct timespec *mtime, 130 bool use_mempool, int num_reply); 131 132static inline void ceph_osdc_get_request(struct ceph_osd_request *req) 133{ 134 kref_get(&req->r_kref); 135} 136extern void ceph_osdc_release_request(struct kref *kref); 137static inline void ceph_osdc_put_request(struct ceph_osd_request *req) 138{ 139 kref_put(&req->r_kref, ceph_osdc_release_request); 140} 141 142extern int ceph_osdc_start_request(struct ceph_osd_client *osdc, 143 struct ceph_osd_request *req, 144 bool nofail); 145extern int ceph_osdc_wait_request(struct ceph_osd_client *osdc, 146 struct ceph_osd_request *req); 147extern void ceph_osdc_sync(struct ceph_osd_client *osdc); 148 149extern int ceph_osdc_readpages(struct ceph_osd_client *osdc, 150 struct ceph_vino vino, 151 struct ceph_file_layout *layout, 152 u64 off, u64 *plen, 153 u32 truncate_seq, u64 truncate_size, 154 struct page **pages, int nr_pages); 155 156extern int ceph_osdc_writepages(struct ceph_osd_client *osdc, 157 struct ceph_vino vino, 158 struct ceph_file_layout *layout, 159 struct ceph_snap_context *sc, 160 u64 off, u64 len, 161 u32 truncate_seq, u64 truncate_size, 162 struct timespec *mtime, 163 struct page **pages, int nr_pages, 164 int flags, int do_sync, bool nofail); 165 166#endif 167