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 <linux/ceph/types.h> 10 #include <linux/ceph/osdmap.h> 11 #include <linux/ceph/messenger.h> 12 #include <linux/ceph/auth.h> 13 #include <linux/ceph/pagelist.h> 14 15 struct ceph_msg; 16 struct ceph_snap_context; 17 struct ceph_osd_request; 18 struct ceph_osd_client; 19 struct ceph_authorizer; 20 21 /* 22 * completion callback for async writepages 23 */ 24 typedef void (*ceph_osdc_callback_t)(struct ceph_osd_request *, 25 struct ceph_msg *); 26 typedef void (*ceph_osdc_unsafe_callback_t)(struct ceph_osd_request *, bool); 27 28 /* a given osd we're communicating with */ 29 struct ceph_osd { 30 atomic_t o_ref; 31 struct ceph_osd_client *o_osdc; 32 int o_osd; 33 int o_incarnation; 34 struct rb_node o_node; 35 struct ceph_connection o_con; 36 struct list_head o_requests; 37 struct list_head o_linger_requests; 38 struct list_head o_osd_lru; 39 struct ceph_auth_handshake o_auth; 40 unsigned long lru_ttl; 41 int o_marked_for_keepalive; 42 struct list_head o_keepalive_item; 43 }; 44 45 46 #define CEPH_OSD_SLAB_OPS 2 47 #define CEPH_OSD_MAX_OPS 16 48 49 enum ceph_osd_data_type { 50 CEPH_OSD_DATA_TYPE_NONE = 0, 51 CEPH_OSD_DATA_TYPE_PAGES, 52 CEPH_OSD_DATA_TYPE_PAGELIST, 53 #ifdef CONFIG_BLOCK 54 CEPH_OSD_DATA_TYPE_BIO, 55 #endif /* CONFIG_BLOCK */ 56 }; 57 58 struct ceph_osd_data { 59 enum ceph_osd_data_type type; 60 union { 61 struct { 62 struct page **pages; 63 u64 length; 64 u32 alignment; 65 bool pages_from_pool; 66 bool own_pages; 67 }; 68 struct ceph_pagelist *pagelist; 69 #ifdef CONFIG_BLOCK 70 struct { 71 struct bio *bio; /* list of bios */ 72 size_t bio_length; /* total in list */ 73 }; 74 #endif /* CONFIG_BLOCK */ 75 }; 76 }; 77 78 struct ceph_osd_req_op { 79 u16 op; /* CEPH_OSD_OP_* */ 80 u32 flags; /* CEPH_OSD_OP_FLAG_* */ 81 u32 indata_len; /* request */ 82 u32 outdata_len; /* reply */ 83 s32 rval; 84 85 union { 86 struct ceph_osd_data raw_data_in; 87 struct { 88 u64 offset, length; 89 u64 truncate_size; 90 u32 truncate_seq; 91 struct ceph_osd_data osd_data; 92 } extent; 93 struct { 94 u32 name_len; 95 u32 value_len; 96 __u8 cmp_op; /* CEPH_OSD_CMPXATTR_OP_* */ 97 __u8 cmp_mode; /* CEPH_OSD_CMPXATTR_MODE_* */ 98 struct ceph_osd_data osd_data; 99 } xattr; 100 struct { 101 const char *class_name; 102 const char *method_name; 103 struct ceph_osd_data request_info; 104 struct ceph_osd_data request_data; 105 struct ceph_osd_data response_data; 106 __u8 class_len; 107 __u8 method_len; 108 __u8 argc; 109 } cls; 110 struct { 111 u64 cookie; 112 u64 ver; 113 u32 prot_ver; 114 u32 timeout; 115 __u8 flag; 116 } watch; 117 struct { 118 u64 expected_object_size; 119 u64 expected_write_size; 120 } alloc_hint; 121 }; 122 }; 123 124 /* an in-flight request */ 125 struct ceph_osd_request { 126 u64 r_tid; /* unique for this client */ 127 struct rb_node r_node; 128 struct list_head r_req_lru_item; 129 struct list_head r_osd_item; 130 struct list_head r_linger_item; 131 struct list_head r_linger_osd_item; 132 struct ceph_osd *r_osd; 133 struct ceph_pg r_pgid; 134 int r_pg_osds[CEPH_PG_MAX_SIZE]; 135 int r_num_pg_osds; 136 137 struct ceph_msg *r_request, *r_reply; 138 int r_flags; /* any additional flags for the osd */ 139 u32 r_sent; /* >0 if r_request is sending/sent */ 140 141 /* request osd ops array */ 142 unsigned int r_num_ops; 143 144 /* these are updated on each send */ 145 __le32 *r_request_osdmap_epoch; 146 __le32 *r_request_flags; 147 __le64 *r_request_pool; 148 void *r_request_pgid; 149 __le32 *r_request_attempts; 150 bool r_paused; 151 struct ceph_eversion *r_request_reassert_version; 152 153 int r_result; 154 int r_got_reply; 155 int r_linger; 156 157 struct ceph_osd_client *r_osdc; 158 struct kref r_kref; 159 bool r_mempool; 160 struct completion r_completion, r_safe_completion; 161 ceph_osdc_callback_t r_callback; 162 ceph_osdc_unsafe_callback_t r_unsafe_callback; 163 struct ceph_eversion r_reassert_version; 164 struct list_head r_unsafe_item; 165 166 struct inode *r_inode; /* for use by callbacks */ 167 void *r_priv; /* ditto */ 168 169 struct ceph_object_locator r_base_oloc; 170 struct ceph_object_id r_base_oid; 171 struct ceph_object_locator r_target_oloc; 172 struct ceph_object_id r_target_oid; 173 174 u64 r_snapid; 175 unsigned long r_stamp; /* send OR check time */ 176 177 struct ceph_snap_context *r_snapc; /* snap context for writes */ 178 179 struct ceph_osd_req_op r_ops[]; 180 }; 181 182 struct ceph_request_redirect { 183 struct ceph_object_locator oloc; 184 }; 185 186 struct ceph_osd_event { 187 u64 cookie; 188 int one_shot; 189 struct ceph_osd_client *osdc; 190 void (*cb)(u64, u64, u8, void *); 191 void *data; 192 struct rb_node node; 193 struct list_head osd_node; 194 struct kref kref; 195 }; 196 197 struct ceph_osd_event_work { 198 struct work_struct work; 199 struct ceph_osd_event *event; 200 u64 ver; 201 u64 notify_id; 202 u8 opcode; 203 }; 204 205 struct ceph_osd_client { 206 struct ceph_client *client; 207 208 struct ceph_osdmap *osdmap; /* current map */ 209 struct rw_semaphore map_sem; 210 struct completion map_waiters; 211 u64 last_requested_map; 212 213 struct mutex request_mutex; 214 struct rb_root osds; /* osds */ 215 struct list_head osd_lru; /* idle osds */ 216 u64 timeout_tid; /* tid of timeout triggering rq */ 217 u64 last_tid; /* tid of last request */ 218 struct rb_root requests; /* pending requests */ 219 struct list_head req_lru; /* in-flight lru */ 220 struct list_head req_unsent; /* unsent/need-resend queue */ 221 struct list_head req_notarget; /* map to no osd */ 222 struct list_head req_linger; /* lingering requests */ 223 int num_requests; 224 struct delayed_work timeout_work; 225 struct delayed_work osds_timeout_work; 226 #ifdef CONFIG_DEBUG_FS 227 struct dentry *debugfs_file; 228 #endif 229 230 mempool_t *req_mempool; 231 232 struct ceph_msgpool msgpool_op; 233 struct ceph_msgpool msgpool_op_reply; 234 235 spinlock_t event_lock; 236 struct rb_root event_tree; 237 u64 event_count; 238 239 struct workqueue_struct *notify_wq; 240 }; 241 242 extern int ceph_osdc_setup(void); 243 extern void ceph_osdc_cleanup(void); 244 245 extern int ceph_osdc_init(struct ceph_osd_client *osdc, 246 struct ceph_client *client); 247 extern void ceph_osdc_stop(struct ceph_osd_client *osdc); 248 249 extern void ceph_osdc_handle_reply(struct ceph_osd_client *osdc, 250 struct ceph_msg *msg); 251 extern void ceph_osdc_handle_map(struct ceph_osd_client *osdc, 252 struct ceph_msg *msg); 253 254 extern void osd_req_op_init(struct ceph_osd_request *osd_req, 255 unsigned int which, u16 opcode, u32 flags); 256 257 extern void osd_req_op_raw_data_in_pages(struct ceph_osd_request *, 258 unsigned int which, 259 struct page **pages, u64 length, 260 u32 alignment, bool pages_from_pool, 261 bool own_pages); 262 263 extern void osd_req_op_extent_init(struct ceph_osd_request *osd_req, 264 unsigned int which, u16 opcode, 265 u64 offset, u64 length, 266 u64 truncate_size, u32 truncate_seq); 267 extern void osd_req_op_extent_update(struct ceph_osd_request *osd_req, 268 unsigned int which, u64 length); 269 extern void osd_req_op_extent_dup_last(struct ceph_osd_request *osd_req, 270 unsigned int which, u64 offset_inc); 271 272 extern struct ceph_osd_data *osd_req_op_extent_osd_data( 273 struct ceph_osd_request *osd_req, 274 unsigned int which); 275 extern struct ceph_osd_data *osd_req_op_cls_response_data( 276 struct ceph_osd_request *osd_req, 277 unsigned int which); 278 279 extern void osd_req_op_extent_osd_data_pages(struct ceph_osd_request *, 280 unsigned int which, 281 struct page **pages, u64 length, 282 u32 alignment, bool pages_from_pool, 283 bool own_pages); 284 extern void osd_req_op_extent_osd_data_pagelist(struct ceph_osd_request *, 285 unsigned int which, 286 struct ceph_pagelist *pagelist); 287 #ifdef CONFIG_BLOCK 288 extern void osd_req_op_extent_osd_data_bio(struct ceph_osd_request *, 289 unsigned int which, 290 struct bio *bio, size_t bio_length); 291 #endif /* CONFIG_BLOCK */ 292 293 extern void osd_req_op_cls_request_data_pagelist(struct ceph_osd_request *, 294 unsigned int which, 295 struct ceph_pagelist *pagelist); 296 extern void osd_req_op_cls_request_data_pages(struct ceph_osd_request *, 297 unsigned int which, 298 struct page **pages, u64 length, 299 u32 alignment, bool pages_from_pool, 300 bool own_pages); 301 extern void osd_req_op_cls_response_data_pages(struct ceph_osd_request *, 302 unsigned int which, 303 struct page **pages, u64 length, 304 u32 alignment, bool pages_from_pool, 305 bool own_pages); 306 307 extern void osd_req_op_cls_init(struct ceph_osd_request *osd_req, 308 unsigned int which, u16 opcode, 309 const char *class, const char *method); 310 extern int osd_req_op_xattr_init(struct ceph_osd_request *osd_req, unsigned int which, 311 u16 opcode, const char *name, const void *value, 312 size_t size, u8 cmp_op, u8 cmp_mode); 313 extern void osd_req_op_watch_init(struct ceph_osd_request *osd_req, 314 unsigned int which, u16 opcode, 315 u64 cookie, u64 version, int flag); 316 extern void osd_req_op_alloc_hint_init(struct ceph_osd_request *osd_req, 317 unsigned int which, 318 u64 expected_object_size, 319 u64 expected_write_size); 320 321 extern struct ceph_osd_request *ceph_osdc_alloc_request(struct ceph_osd_client *osdc, 322 struct ceph_snap_context *snapc, 323 unsigned int num_ops, 324 bool use_mempool, 325 gfp_t gfp_flags); 326 327 extern void ceph_osdc_build_request(struct ceph_osd_request *req, u64 off, 328 struct ceph_snap_context *snapc, 329 u64 snap_id, 330 struct timespec *mtime); 331 332 extern struct ceph_osd_request *ceph_osdc_new_request(struct ceph_osd_client *, 333 struct ceph_file_layout *layout, 334 struct ceph_vino vino, 335 u64 offset, u64 *len, 336 unsigned int which, int num_ops, 337 int opcode, int flags, 338 struct ceph_snap_context *snapc, 339 u32 truncate_seq, u64 truncate_size, 340 bool use_mempool); 341 342 extern void ceph_osdc_set_request_linger(struct ceph_osd_client *osdc, 343 struct ceph_osd_request *req); 344 345 extern void ceph_osdc_get_request(struct ceph_osd_request *req); 346 extern void ceph_osdc_put_request(struct ceph_osd_request *req); 347 348 extern int ceph_osdc_start_request(struct ceph_osd_client *osdc, 349 struct ceph_osd_request *req, 350 bool nofail); 351 extern void ceph_osdc_cancel_request(struct ceph_osd_request *req); 352 extern int ceph_osdc_wait_request(struct ceph_osd_client *osdc, 353 struct ceph_osd_request *req); 354 extern void ceph_osdc_sync(struct ceph_osd_client *osdc); 355 356 extern void ceph_osdc_flush_notifies(struct ceph_osd_client *osdc); 357 358 extern int ceph_osdc_readpages(struct ceph_osd_client *osdc, 359 struct ceph_vino vino, 360 struct ceph_file_layout *layout, 361 u64 off, u64 *plen, 362 u32 truncate_seq, u64 truncate_size, 363 struct page **pages, int nr_pages, 364 int page_align); 365 366 extern int ceph_osdc_writepages(struct ceph_osd_client *osdc, 367 struct ceph_vino vino, 368 struct ceph_file_layout *layout, 369 struct ceph_snap_context *sc, 370 u64 off, u64 len, 371 u32 truncate_seq, u64 truncate_size, 372 struct timespec *mtime, 373 struct page **pages, int nr_pages); 374 375 /* watch/notify events */ 376 extern int ceph_osdc_create_event(struct ceph_osd_client *osdc, 377 void (*event_cb)(u64, u64, u8, void *), 378 void *data, struct ceph_osd_event **pevent); 379 extern void ceph_osdc_cancel_event(struct ceph_osd_event *event); 380 extern void ceph_osdc_put_event(struct ceph_osd_event *event); 381 #endif 382 383