xref: /linux/include/linux/ceph/mon_client.h (revision 3d14c5d2b6e15c21d8e5467dc62d33127c23a644)
1*3d14c5d2SYehuda Sadeh #ifndef _FS_CEPH_MON_CLIENT_H
2*3d14c5d2SYehuda Sadeh #define _FS_CEPH_MON_CLIENT_H
3*3d14c5d2SYehuda Sadeh 
4*3d14c5d2SYehuda Sadeh #include <linux/completion.h>
5*3d14c5d2SYehuda Sadeh #include <linux/kref.h>
6*3d14c5d2SYehuda Sadeh #include <linux/rbtree.h>
7*3d14c5d2SYehuda Sadeh 
8*3d14c5d2SYehuda Sadeh #include "messenger.h"
9*3d14c5d2SYehuda Sadeh 
10*3d14c5d2SYehuda Sadeh struct ceph_client;
11*3d14c5d2SYehuda Sadeh struct ceph_mount_args;
12*3d14c5d2SYehuda Sadeh struct ceph_auth_client;
13*3d14c5d2SYehuda Sadeh 
14*3d14c5d2SYehuda Sadeh /*
15*3d14c5d2SYehuda Sadeh  * The monitor map enumerates the set of all monitors.
16*3d14c5d2SYehuda Sadeh  */
17*3d14c5d2SYehuda Sadeh struct ceph_monmap {
18*3d14c5d2SYehuda Sadeh 	struct ceph_fsid fsid;
19*3d14c5d2SYehuda Sadeh 	u32 epoch;
20*3d14c5d2SYehuda Sadeh 	u32 num_mon;
21*3d14c5d2SYehuda Sadeh 	struct ceph_entity_inst mon_inst[0];
22*3d14c5d2SYehuda Sadeh };
23*3d14c5d2SYehuda Sadeh 
24*3d14c5d2SYehuda Sadeh struct ceph_mon_client;
25*3d14c5d2SYehuda Sadeh struct ceph_mon_generic_request;
26*3d14c5d2SYehuda Sadeh 
27*3d14c5d2SYehuda Sadeh 
28*3d14c5d2SYehuda Sadeh /*
29*3d14c5d2SYehuda Sadeh  * Generic mechanism for resending monitor requests.
30*3d14c5d2SYehuda Sadeh  */
31*3d14c5d2SYehuda Sadeh typedef void (*ceph_monc_request_func_t)(struct ceph_mon_client *monc,
32*3d14c5d2SYehuda Sadeh 					 int newmon);
33*3d14c5d2SYehuda Sadeh 
34*3d14c5d2SYehuda Sadeh /* a pending monitor request */
35*3d14c5d2SYehuda Sadeh struct ceph_mon_request {
36*3d14c5d2SYehuda Sadeh 	struct ceph_mon_client *monc;
37*3d14c5d2SYehuda Sadeh 	struct delayed_work delayed_work;
38*3d14c5d2SYehuda Sadeh 	unsigned long delay;
39*3d14c5d2SYehuda Sadeh 	ceph_monc_request_func_t do_request;
40*3d14c5d2SYehuda Sadeh };
41*3d14c5d2SYehuda Sadeh 
42*3d14c5d2SYehuda Sadeh /*
43*3d14c5d2SYehuda Sadeh  * ceph_mon_generic_request is being used for the statfs and poolop requests
44*3d14c5d2SYehuda Sadeh  * which are bening done a bit differently because we need to get data back
45*3d14c5d2SYehuda Sadeh  * to the caller
46*3d14c5d2SYehuda Sadeh  */
47*3d14c5d2SYehuda Sadeh struct ceph_mon_generic_request {
48*3d14c5d2SYehuda Sadeh 	struct kref kref;
49*3d14c5d2SYehuda Sadeh 	u64 tid;
50*3d14c5d2SYehuda Sadeh 	struct rb_node node;
51*3d14c5d2SYehuda Sadeh 	int result;
52*3d14c5d2SYehuda Sadeh 	void *buf;
53*3d14c5d2SYehuda Sadeh 	int buf_len;
54*3d14c5d2SYehuda Sadeh 	struct completion completion;
55*3d14c5d2SYehuda Sadeh 	struct ceph_msg *request;  /* original request */
56*3d14c5d2SYehuda Sadeh 	struct ceph_msg *reply;    /* and reply */
57*3d14c5d2SYehuda Sadeh };
58*3d14c5d2SYehuda Sadeh 
59*3d14c5d2SYehuda Sadeh struct ceph_mon_client {
60*3d14c5d2SYehuda Sadeh 	struct ceph_client *client;
61*3d14c5d2SYehuda Sadeh 	struct ceph_monmap *monmap;
62*3d14c5d2SYehuda Sadeh 
63*3d14c5d2SYehuda Sadeh 	struct mutex mutex;
64*3d14c5d2SYehuda Sadeh 	struct delayed_work delayed_work;
65*3d14c5d2SYehuda Sadeh 
66*3d14c5d2SYehuda Sadeh 	struct ceph_auth_client *auth;
67*3d14c5d2SYehuda Sadeh 	struct ceph_msg *m_auth, *m_auth_reply, *m_subscribe, *m_subscribe_ack;
68*3d14c5d2SYehuda Sadeh 	int pending_auth;
69*3d14c5d2SYehuda Sadeh 
70*3d14c5d2SYehuda Sadeh 	bool hunting;
71*3d14c5d2SYehuda Sadeh 	int cur_mon;                       /* last monitor i contacted */
72*3d14c5d2SYehuda Sadeh 	unsigned long sub_sent, sub_renew_after;
73*3d14c5d2SYehuda Sadeh 	struct ceph_connection *con;
74*3d14c5d2SYehuda Sadeh 	bool have_fsid;
75*3d14c5d2SYehuda Sadeh 
76*3d14c5d2SYehuda Sadeh 	/* pending generic requests */
77*3d14c5d2SYehuda Sadeh 	struct rb_root generic_request_tree;
78*3d14c5d2SYehuda Sadeh 	int num_generic_requests;
79*3d14c5d2SYehuda Sadeh 	u64 last_tid;
80*3d14c5d2SYehuda Sadeh 
81*3d14c5d2SYehuda Sadeh 	/* mds/osd map */
82*3d14c5d2SYehuda Sadeh 	int want_mdsmap;
83*3d14c5d2SYehuda Sadeh 	int want_next_osdmap; /* 1 = want, 2 = want+asked */
84*3d14c5d2SYehuda Sadeh 	u32 have_osdmap, have_mdsmap;
85*3d14c5d2SYehuda Sadeh 
86*3d14c5d2SYehuda Sadeh #ifdef CONFIG_DEBUG_FS
87*3d14c5d2SYehuda Sadeh 	struct dentry *debugfs_file;
88*3d14c5d2SYehuda Sadeh #endif
89*3d14c5d2SYehuda Sadeh };
90*3d14c5d2SYehuda Sadeh 
91*3d14c5d2SYehuda Sadeh extern struct ceph_monmap *ceph_monmap_decode(void *p, void *end);
92*3d14c5d2SYehuda Sadeh extern int ceph_monmap_contains(struct ceph_monmap *m,
93*3d14c5d2SYehuda Sadeh 				struct ceph_entity_addr *addr);
94*3d14c5d2SYehuda Sadeh 
95*3d14c5d2SYehuda Sadeh extern int ceph_monc_init(struct ceph_mon_client *monc, struct ceph_client *cl);
96*3d14c5d2SYehuda Sadeh extern void ceph_monc_stop(struct ceph_mon_client *monc);
97*3d14c5d2SYehuda Sadeh 
98*3d14c5d2SYehuda Sadeh /*
99*3d14c5d2SYehuda Sadeh  * The model here is to indicate that we need a new map of at least
100*3d14c5d2SYehuda Sadeh  * epoch @want, and also call in when we receive a map.  We will
101*3d14c5d2SYehuda Sadeh  * periodically rerequest the map from the monitor cluster until we
102*3d14c5d2SYehuda Sadeh  * get what we want.
103*3d14c5d2SYehuda Sadeh  */
104*3d14c5d2SYehuda Sadeh extern int ceph_monc_got_mdsmap(struct ceph_mon_client *monc, u32 have);
105*3d14c5d2SYehuda Sadeh extern int ceph_monc_got_osdmap(struct ceph_mon_client *monc, u32 have);
106*3d14c5d2SYehuda Sadeh 
107*3d14c5d2SYehuda Sadeh extern void ceph_monc_request_next_osdmap(struct ceph_mon_client *monc);
108*3d14c5d2SYehuda Sadeh 
109*3d14c5d2SYehuda Sadeh extern int ceph_monc_do_statfs(struct ceph_mon_client *monc,
110*3d14c5d2SYehuda Sadeh 			       struct ceph_statfs *buf);
111*3d14c5d2SYehuda Sadeh 
112*3d14c5d2SYehuda Sadeh extern int ceph_monc_open_session(struct ceph_mon_client *monc);
113*3d14c5d2SYehuda Sadeh 
114*3d14c5d2SYehuda Sadeh extern int ceph_monc_validate_auth(struct ceph_mon_client *monc);
115*3d14c5d2SYehuda Sadeh 
116*3d14c5d2SYehuda Sadeh extern int ceph_monc_create_snapid(struct ceph_mon_client *monc,
117*3d14c5d2SYehuda Sadeh 				   u32 pool, u64 *snapid);
118*3d14c5d2SYehuda Sadeh 
119*3d14c5d2SYehuda Sadeh extern int ceph_monc_delete_snapid(struct ceph_mon_client *monc,
120*3d14c5d2SYehuda Sadeh 				   u32 pool, u64 snapid);
121*3d14c5d2SYehuda Sadeh 
122*3d14c5d2SYehuda Sadeh #endif
123