osd_client.h 6.9 KB
Newer Older
S
Sage Weil 已提交
1 2 3 4
#ifndef _FS_CEPH_OSD_CLIENT_H
#define _FS_CEPH_OSD_CLIENT_H

#include <linux/completion.h>
S
Sage Weil 已提交
5
#include <linux/kref.h>
S
Sage Weil 已提交
6 7 8 9 10 11 12 13 14 15 16
#include <linux/mempool.h>
#include <linux/rbtree.h>

#include "types.h"
#include "osdmap.h"
#include "messenger.h"

struct ceph_msg;
struct ceph_snap_context;
struct ceph_osd_request;
struct ceph_osd_client;
17
struct ceph_authorizer;
18
struct ceph_pagelist;
S
Sage Weil 已提交
19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34

/*
 * completion callback for async writepages
 */
typedef void (*ceph_osdc_callback_t)(struct ceph_osd_request *,
				     struct ceph_msg *);

/* a given osd we're communicating with */
struct ceph_osd {
	atomic_t o_ref;
	struct ceph_osd_client *o_osdc;
	int o_osd;
	int o_incarnation;
	struct rb_node o_node;
	struct ceph_connection o_con;
	struct list_head o_requests;
35
	struct list_head o_osd_lru;
36 37 38
	struct ceph_authorizer *o_authorizer;
	void *o_authorizer_buf, *o_authorizer_reply_buf;
	size_t o_authorizer_buf_len, o_authorizer_reply_buf_len;
39
	unsigned long lru_ttl;
40 41
	int o_marked_for_keepalive;
	struct list_head o_keepalive_item;
S
Sage Weil 已提交
42 43 44 45 46 47
};

/* an in-flight request */
struct ceph_osd_request {
	u64             r_tid;              /* unique for this client */
	struct rb_node  r_node;
48
	struct list_head r_req_lru_item;
S
Sage Weil 已提交
49 50
	struct list_head r_osd_item;
	struct ceph_osd *r_osd;
51
	struct ceph_pg   r_pgid;
52 53
	int              r_pg_osds[CEPH_PG_MAX_SIZE];
	int              r_num_pg_osds;
S
Sage Weil 已提交
54

55
	struct ceph_connection *r_con_filling_msg;
56

S
Sage Weil 已提交
57 58 59 60
	struct ceph_msg  *r_request, *r_reply;
	int               r_result;
	int               r_flags;     /* any additional flags for the osd */
	u32               r_sent;      /* >0 if r_request is sending/sent */
61
	int               r_got_reply;
S
Sage Weil 已提交
62 63

	struct ceph_osd_client *r_osdc;
S
Sage Weil 已提交
64
	struct kref       r_kref;
S
Sage Weil 已提交
65 66 67 68 69 70 71
	bool              r_mempool;
	struct completion r_completion, r_safe_completion;
	ceph_osdc_callback_t r_callback, r_safe_callback;
	struct ceph_eversion r_reassert_version;
	struct list_head  r_unsafe_item;

	struct inode *r_inode;         	      /* for use by callbacks */
72
	void *r_priv;			      /* ditto */
S
Sage Weil 已提交
73 74 75

	char              r_oid[40];          /* object name */
	int               r_oid_len;
S
Sage Weil 已提交
76
	unsigned long     r_stamp;            /* send OR check time */
S
Sage Weil 已提交
77 78 79 80 81 82 83 84
	bool              r_resend;           /* msg send failed, needs retry */

	struct ceph_file_layout r_file_layout;
	struct ceph_snap_context *r_snapc;    /* snap context for writes */
	unsigned          r_num_pages;        /* size of page array (follows) */
	struct page     **r_pages;            /* pages for data payload */
	int               r_pages_from_pool;
	int               r_own_pages;        /* if true, i own page list */
85 86 87 88 89
#ifdef CONFIG_BLOCK
	struct bio       *r_bio;	      /* instead of pages */
#endif

	struct ceph_pagelist *r_trail;	      /* trailing part of the data */
S
Sage Weil 已提交
90 91 92 93 94 95 96 97 98 99 100 101
};

struct ceph_osd_client {
	struct ceph_client     *client;

	struct ceph_osdmap     *osdmap;       /* current map */
	struct rw_semaphore    map_sem;
	struct completion      map_waiters;
	u64                    last_requested_map;

	struct mutex           request_mutex;
	struct rb_root         osds;          /* osds */
102
	struct list_head       osd_lru;       /* idle osds */
S
Sage Weil 已提交
103 104 105
	u64                    timeout_tid;   /* tid of timeout triggering rq */
	u64                    last_tid;      /* tid of last request */
	struct rb_root         requests;      /* pending requests */
106
	struct list_head       req_lru;	      /* pending requests lru */
S
Sage Weil 已提交
107 108
	int                    num_requests;
	struct delayed_work    timeout_work;
109
	struct delayed_work    osds_timeout_work;
110
#ifdef CONFIG_DEBUG_FS
S
Sage Weil 已提交
111
	struct dentry 	       *debugfs_file;
112
#endif
S
Sage Weil 已提交
113 114 115

	mempool_t              *req_mempool;

116
	struct ceph_msgpool	msgpool_op;
S
Sage Weil 已提交
117
	struct ceph_msgpool	msgpool_op_reply;
S
Sage Weil 已提交
118 119
};

120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
struct ceph_osd_req_op {
	u16 op;           /* CEPH_OSD_OP_* */
	u32 flags;        /* CEPH_OSD_FLAG_* */
	union {
		struct {
			u64 offset, length;
			u64 truncate_size;
			u32 truncate_seq;
		} extent;
		struct {
			const char *name;
			u32 name_len;
			const char  *val;
			u32 value_len;
			__u8 cmp_op;       /* CEPH_OSD_CMPXATTR_OP_* */
			__u8 cmp_mode;     /* CEPH_OSD_CMPXATTR_MODE_* */
		} xattr;
		struct {
138
			const char *class_name;
139
			__u8 class_len;
140
			const char *method_name;
141 142
			__u8 method_len;
			__u8 argc;
143
			const char *indata;
144 145 146 147 148
			u32 indata_len;
		} cls;
		struct {
			u64 cookie, count;
		} pgls;
149 150 151
	        struct {
		        u64 snapid;
	        } snap;
152 153 154 155
	};
	u32 payload_len;
};

S
Sage Weil 已提交
156 157 158 159 160 161 162 163 164
extern int ceph_osdc_init(struct ceph_osd_client *osdc,
			  struct ceph_client *client);
extern void ceph_osdc_stop(struct ceph_osd_client *osdc);

extern void ceph_osdc_handle_reply(struct ceph_osd_client *osdc,
				   struct ceph_msg *msg);
extern void ceph_osdc_handle_map(struct ceph_osd_client *osdc,
				 struct ceph_msg *msg);

165 166 167
extern void ceph_calc_raw_layout(struct ceph_osd_client *osdc,
			struct ceph_file_layout *layout,
			u64 snapid,
168 169 170
			u64 off, u64 *plen, u64 *bno,
			struct ceph_osd_request *req,
			struct ceph_osd_req_op *op);
171 172 173 174

extern struct ceph_osd_request *ceph_osdc_alloc_request(struct ceph_osd_client *osdc,
					       int flags,
					       struct ceph_snap_context *snapc,
175
					       struct ceph_osd_req_op *ops,
176 177
					       bool use_mempool,
					       gfp_t gfp_flags,
178 179
					       struct page **pages,
					       struct bio *bio);
180 181

extern void ceph_osdc_build_request(struct ceph_osd_request *req,
182 183 184 185 186 187
				    u64 off, u64 *plen,
				    struct ceph_osd_req_op *src_ops,
				    struct ceph_snap_context *snapc,
				    struct timespec *mtime,
				    const char *oid,
				    int oid_len);
188

S
Sage Weil 已提交
189 190 191 192 193 194 195 196 197 198 199 200
extern struct ceph_osd_request *ceph_osdc_new_request(struct ceph_osd_client *,
				      struct ceph_file_layout *layout,
				      struct ceph_vino vino,
				      u64 offset, u64 *len, int op, int flags,
				      struct ceph_snap_context *snapc,
				      int do_sync, u32 truncate_seq,
				      u64 truncate_size,
				      struct timespec *mtime,
				      bool use_mempool, int num_reply);

static inline void ceph_osdc_get_request(struct ceph_osd_request *req)
{
S
Sage Weil 已提交
201 202 203 204 205 206
	kref_get(&req->r_kref);
}
extern void ceph_osdc_release_request(struct kref *kref);
static inline void ceph_osdc_put_request(struct ceph_osd_request *req)
{
	kref_put(&req->r_kref, ceph_osdc_release_request);
S
Sage Weil 已提交
207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234
}

extern int ceph_osdc_start_request(struct ceph_osd_client *osdc,
				   struct ceph_osd_request *req,
				   bool nofail);
extern int ceph_osdc_wait_request(struct ceph_osd_client *osdc,
				  struct ceph_osd_request *req);
extern void ceph_osdc_sync(struct ceph_osd_client *osdc);

extern int ceph_osdc_readpages(struct ceph_osd_client *osdc,
			       struct ceph_vino vino,
			       struct ceph_file_layout *layout,
			       u64 off, u64 *plen,
			       u32 truncate_seq, u64 truncate_size,
			       struct page **pages, int nr_pages);

extern int ceph_osdc_writepages(struct ceph_osd_client *osdc,
				struct ceph_vino vino,
				struct ceph_file_layout *layout,
				struct ceph_snap_context *sc,
				u64 off, u64 len,
				u32 truncate_seq, u64 truncate_size,
				struct timespec *mtime,
				struct page **pages, int nr_pages,
				int flags, int do_sync, bool nofail);

#endif