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