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