at v3.2 8.8 kB view raw
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 13/* 14 * Maximum object name size 15 * (must be at least as big as RBD_MAX_MD_NAME_LEN -- currently 100) 16 */ 17#define MAX_OBJ_NAME_SIZE 100 18 19struct ceph_msg; 20struct ceph_snap_context; 21struct ceph_osd_request; 22struct ceph_osd_client; 23struct ceph_authorizer; 24struct ceph_pagelist; 25 26/* 27 * completion callback for async writepages 28 */ 29typedef void (*ceph_osdc_callback_t)(struct ceph_osd_request *, 30 struct ceph_msg *); 31 32/* a given osd we're communicating with */ 33struct ceph_osd { 34 atomic_t o_ref; 35 struct ceph_osd_client *o_osdc; 36 int o_osd; 37 int o_incarnation; 38 struct rb_node o_node; 39 struct ceph_connection o_con; 40 struct list_head o_requests; 41 struct list_head o_linger_requests; 42 struct list_head o_osd_lru; 43 struct ceph_authorizer *o_authorizer; 44 void *o_authorizer_buf, *o_authorizer_reply_buf; 45 size_t o_authorizer_buf_len, o_authorizer_reply_buf_len; 46 unsigned long lru_ttl; 47 int o_marked_for_keepalive; 48 struct list_head o_keepalive_item; 49}; 50 51/* an in-flight request */ 52struct ceph_osd_request { 53 u64 r_tid; /* unique for this client */ 54 struct rb_node r_node; 55 struct list_head r_req_lru_item; 56 struct list_head r_osd_item; 57 struct list_head r_linger_item; 58 struct list_head r_linger_osd; 59 struct ceph_osd *r_osd; 60 struct ceph_pg r_pgid; 61 int r_pg_osds[CEPH_PG_MAX_SIZE]; 62 int r_num_pg_osds; 63 64 struct ceph_connection *r_con_filling_msg; 65 66 struct ceph_msg *r_request, *r_reply; 67 int r_result; 68 int r_flags; /* any additional flags for the osd */ 69 u32 r_sent; /* >0 if r_request is sending/sent */ 70 int r_got_reply; 71 int r_linger; 72 73 struct ceph_osd_client *r_osdc; 74 struct kref r_kref; 75 bool r_mempool; 76 struct completion r_completion, r_safe_completion; 77 ceph_osdc_callback_t r_callback, r_safe_callback; 78 struct ceph_eversion r_reassert_version; 79 struct list_head r_unsafe_item; 80 81 struct inode *r_inode; /* for use by callbacks */ 82 void *r_priv; /* ditto */ 83 84 char r_oid[MAX_OBJ_NAME_SIZE]; /* object name */ 85 int r_oid_len; 86 unsigned long r_stamp; /* send OR check time */ 87 88 struct ceph_file_layout r_file_layout; 89 struct ceph_snap_context *r_snapc; /* snap context for writes */ 90 unsigned r_num_pages; /* size of page array (follows) */ 91 unsigned r_page_alignment; /* io offset in first page */ 92 struct page **r_pages; /* pages for data payload */ 93 int r_pages_from_pool; 94 int r_own_pages; /* if true, i own page list */ 95#ifdef CONFIG_BLOCK 96 struct bio *r_bio; /* instead of pages */ 97#endif 98 99 struct ceph_pagelist *r_trail; /* trailing part of the data */ 100}; 101 102struct ceph_osd_event { 103 u64 cookie; 104 int one_shot; 105 struct ceph_osd_client *osdc; 106 void (*cb)(u64, u64, u8, void *); 107 void *data; 108 struct rb_node node; 109 struct list_head osd_node; 110 struct kref kref; 111 struct completion completion; 112}; 113 114struct ceph_osd_event_work { 115 struct work_struct work; 116 struct ceph_osd_event *event; 117 u64 ver; 118 u64 notify_id; 119 u8 opcode; 120}; 121 122struct ceph_osd_client { 123 struct ceph_client *client; 124 125 struct ceph_osdmap *osdmap; /* current map */ 126 struct rw_semaphore map_sem; 127 struct completion map_waiters; 128 u64 last_requested_map; 129 130 struct mutex request_mutex; 131 struct rb_root osds; /* osds */ 132 struct list_head osd_lru; /* idle osds */ 133 u64 timeout_tid; /* tid of timeout triggering rq */ 134 u64 last_tid; /* tid of last request */ 135 struct rb_root requests; /* pending requests */ 136 struct list_head req_lru; /* in-flight lru */ 137 struct list_head req_unsent; /* unsent/need-resend queue */ 138 struct list_head req_notarget; /* map to no osd */ 139 struct list_head req_linger; /* lingering requests */ 140 int num_requests; 141 struct delayed_work timeout_work; 142 struct delayed_work osds_timeout_work; 143#ifdef CONFIG_DEBUG_FS 144 struct dentry *debugfs_file; 145#endif 146 147 mempool_t *req_mempool; 148 149 struct ceph_msgpool msgpool_op; 150 struct ceph_msgpool msgpool_op_reply; 151 152 spinlock_t event_lock; 153 struct rb_root event_tree; 154 u64 event_count; 155 156 struct workqueue_struct *notify_wq; 157}; 158 159struct ceph_osd_req_op { 160 u16 op; /* CEPH_OSD_OP_* */ 161 u32 flags; /* CEPH_OSD_FLAG_* */ 162 union { 163 struct { 164 u64 offset, length; 165 u64 truncate_size; 166 u32 truncate_seq; 167 } extent; 168 struct { 169 const char *name; 170 u32 name_len; 171 const char *val; 172 u32 value_len; 173 __u8 cmp_op; /* CEPH_OSD_CMPXATTR_OP_* */ 174 __u8 cmp_mode; /* CEPH_OSD_CMPXATTR_MODE_* */ 175 } xattr; 176 struct { 177 const char *class_name; 178 __u8 class_len; 179 const char *method_name; 180 __u8 method_len; 181 __u8 argc; 182 const char *indata; 183 u32 indata_len; 184 } cls; 185 struct { 186 u64 cookie, count; 187 } pgls; 188 struct { 189 u64 snapid; 190 } snap; 191 struct { 192 u64 cookie; 193 u64 ver; 194 __u8 flag; 195 u32 prot_ver; 196 u32 timeout; 197 } watch; 198 }; 199 u32 payload_len; 200}; 201 202extern int ceph_osdc_init(struct ceph_osd_client *osdc, 203 struct ceph_client *client); 204extern void ceph_osdc_stop(struct ceph_osd_client *osdc); 205 206extern void ceph_osdc_handle_reply(struct ceph_osd_client *osdc, 207 struct ceph_msg *msg); 208extern void ceph_osdc_handle_map(struct ceph_osd_client *osdc, 209 struct ceph_msg *msg); 210 211extern void ceph_calc_raw_layout(struct ceph_osd_client *osdc, 212 struct ceph_file_layout *layout, 213 u64 snapid, 214 u64 off, u64 *plen, u64 *bno, 215 struct ceph_osd_request *req, 216 struct ceph_osd_req_op *op); 217 218extern struct ceph_osd_request *ceph_osdc_alloc_request(struct ceph_osd_client *osdc, 219 int flags, 220 struct ceph_snap_context *snapc, 221 struct ceph_osd_req_op *ops, 222 bool use_mempool, 223 gfp_t gfp_flags, 224 struct page **pages, 225 struct bio *bio); 226 227extern void ceph_osdc_build_request(struct ceph_osd_request *req, 228 u64 off, u64 *plen, 229 struct ceph_osd_req_op *src_ops, 230 struct ceph_snap_context *snapc, 231 struct timespec *mtime, 232 const char *oid, 233 int oid_len); 234 235extern struct ceph_osd_request *ceph_osdc_new_request(struct ceph_osd_client *, 236 struct ceph_file_layout *layout, 237 struct ceph_vino vino, 238 u64 offset, u64 *len, int op, int flags, 239 struct ceph_snap_context *snapc, 240 int do_sync, u32 truncate_seq, 241 u64 truncate_size, 242 struct timespec *mtime, 243 bool use_mempool, int num_reply, 244 int page_align); 245 246extern void ceph_osdc_set_request_linger(struct ceph_osd_client *osdc, 247 struct ceph_osd_request *req); 248extern void ceph_osdc_unregister_linger_request(struct ceph_osd_client *osdc, 249 struct ceph_osd_request *req); 250 251static inline void ceph_osdc_get_request(struct ceph_osd_request *req) 252{ 253 kref_get(&req->r_kref); 254} 255extern void ceph_osdc_release_request(struct kref *kref); 256static inline void ceph_osdc_put_request(struct ceph_osd_request *req) 257{ 258 kref_put(&req->r_kref, ceph_osdc_release_request); 259} 260 261extern int ceph_osdc_start_request(struct ceph_osd_client *osdc, 262 struct ceph_osd_request *req, 263 bool nofail); 264extern int ceph_osdc_wait_request(struct ceph_osd_client *osdc, 265 struct ceph_osd_request *req); 266extern void ceph_osdc_sync(struct ceph_osd_client *osdc); 267 268extern int ceph_osdc_readpages(struct ceph_osd_client *osdc, 269 struct ceph_vino vino, 270 struct ceph_file_layout *layout, 271 u64 off, u64 *plen, 272 u32 truncate_seq, u64 truncate_size, 273 struct page **pages, int nr_pages, 274 int page_align); 275 276extern int ceph_osdc_writepages(struct ceph_osd_client *osdc, 277 struct ceph_vino vino, 278 struct ceph_file_layout *layout, 279 struct ceph_snap_context *sc, 280 u64 off, u64 len, 281 u32 truncate_seq, u64 truncate_size, 282 struct timespec *mtime, 283 struct page **pages, int nr_pages, 284 int flags, int do_sync, bool nofail); 285 286/* watch/notify events */ 287extern int ceph_osdc_create_event(struct ceph_osd_client *osdc, 288 void (*event_cb)(u64, u64, u8, void *), 289 int one_shot, void *data, 290 struct ceph_osd_event **pevent); 291extern void ceph_osdc_cancel_event(struct ceph_osd_event *event); 292extern int ceph_osdc_wait_event(struct ceph_osd_event *event, 293 unsigned long timeout); 294extern void ceph_osdc_put_event(struct ceph_osd_event *event); 295#endif 296