blob: d5a3ecea578d3e5f34eb1efba9d027811cc68557 [file] [log] [blame]
Sage Weilba75bb92009-10-06 11:31:11 -07001#ifndef _FS_CEPH_MON_CLIENT_H
2#define _FS_CEPH_MON_CLIENT_H
3
4#include <linux/completion.h>
Sage Weil3143edd2010-03-24 21:43:33 -07005#include <linux/kref.h>
Sage Weil85ff03f2010-02-15 14:47:28 -08006#include <linux/rbtree.h>
Sage Weilba75bb92009-10-06 11:31:11 -07007
David Howellsa1ce3922012-10-02 18:01:25 +01008#include <linux/ceph/messenger.h>
Sage Weilba75bb92009-10-06 11:31:11 -07009
10struct ceph_client;
11struct ceph_mount_args;
Sage Weil4e7a5dc2009-11-18 16:19:57 -080012struct ceph_auth_client;
Sage Weilba75bb92009-10-06 11:31:11 -070013
14/*
15 * The monitor map enumerates the set of all monitors.
16 */
17struct ceph_monmap {
18 struct ceph_fsid fsid;
19 u32 epoch;
20 u32 num_mon;
21 struct ceph_entity_inst mon_inst[0];
22};
23
24struct ceph_mon_client;
Yehuda Sadehf8c76f62010-04-22 15:40:37 -070025struct ceph_mon_generic_request;
Sage Weilba75bb92009-10-06 11:31:11 -070026
27
28/*
29 * Generic mechanism for resending monitor requests.
30 */
31typedef void (*ceph_monc_request_func_t)(struct ceph_mon_client *monc,
32 int newmon);
33
34/* a pending monitor request */
35struct ceph_mon_request {
36 struct ceph_mon_client *monc;
37 struct delayed_work delayed_work;
38 unsigned long delay;
39 ceph_monc_request_func_t do_request;
40};
41
Ilya Dryomovd0b19702016-04-28 16:07:27 +020042typedef void (*ceph_monc_callback_t)(struct ceph_mon_generic_request *);
43
Sage Weilba75bb92009-10-06 11:31:11 -070044/*
Ilya Dryomov7a6fdeb2014-12-22 19:14:26 +030045 * ceph_mon_generic_request is being used for the statfs and
Ilya Dryomov513a8242014-05-13 11:19:26 +040046 * mon_get_version requests which are being done a bit differently
47 * because we need to get data back to the caller
Sage Weilba75bb92009-10-06 11:31:11 -070048 */
Yehuda Sadehf8c76f62010-04-22 15:40:37 -070049struct ceph_mon_generic_request {
Ilya Dryomovd0b19702016-04-28 16:07:27 +020050 struct ceph_mon_client *monc;
Sage Weil3143edd2010-03-24 21:43:33 -070051 struct kref kref;
Sage Weilba75bb92009-10-06 11:31:11 -070052 u64 tid;
Sage Weil85ff03f2010-02-15 14:47:28 -080053 struct rb_node node;
Sage Weilba75bb92009-10-06 11:31:11 -070054 int result;
Ilya Dryomovd0b19702016-04-28 16:07:27 +020055
Sage Weilba75bb92009-10-06 11:31:11 -070056 struct completion completion;
Ilya Dryomovd0b19702016-04-28 16:07:27 +020057 ceph_monc_callback_t complete_cb;
58 u64 private_data; /* r_tid/linger_id */
59
Sage Weilba75bb92009-10-06 11:31:11 -070060 struct ceph_msg *request; /* original request */
Sage Weil3143edd2010-03-24 21:43:33 -070061 struct ceph_msg *reply; /* and reply */
Ilya Dryomovd0b19702016-04-28 16:07:27 +020062
63 union {
64 struct ceph_statfs *st;
65 u64 newest;
66 } u;
Sage Weilba75bb92009-10-06 11:31:11 -070067};
68
69struct ceph_mon_client {
70 struct ceph_client *client;
71 struct ceph_monmap *monmap;
72
73 struct mutex mutex;
74 struct delayed_work delayed_work;
75
Sage Weil4e7a5dc2009-11-18 16:19:57 -080076 struct ceph_auth_client *auth;
Sage Weil240ed682010-05-21 14:57:25 -070077 struct ceph_msg *m_auth, *m_auth_reply, *m_subscribe, *m_subscribe_ack;
Sage Weil9bd2e6f2010-02-02 16:21:06 -080078 int pending_auth;
Sage Weil4e7a5dc2009-11-18 16:19:57 -080079
Sage Weilba75bb92009-10-06 11:31:11 -070080 bool hunting;
81 int cur_mon; /* last monitor i contacted */
Ilya Dryomov82dcaba2016-01-19 16:19:06 +010082 unsigned long sub_renew_after;
83 unsigned long sub_renew_sent;
Alex Elder67130932012-05-26 23:26:43 -050084 struct ceph_connection con;
Sage Weilba75bb92009-10-06 11:31:11 -070085
Ilya Dryomov168b9092016-01-21 16:33:19 +010086 bool had_a_connection;
87 int hunt_mult; /* [1..CEPH_MONC_HUNT_MAX_MULT] */
88
Yehuda Sadehf8c76f62010-04-22 15:40:37 -070089 /* pending generic requests */
90 struct rb_root generic_request_tree;
Sage Weilba75bb92009-10-06 11:31:11 -070091 u64 last_tid;
92
Ilya Dryomov82dcaba2016-01-19 16:19:06 +010093 /* subs, indexed with CEPH_SUB_* */
94 struct {
95 struct ceph_mon_subscribe_item item;
96 bool want;
97 u32 have; /* epoch */
Yan, Zheng0cabbd92016-04-07 11:34:43 +080098 } subs[4];
Ilya Dryomov737cc81e2016-05-26 00:05:01 +020099 int fs_cluster_id; /* "mdsmap.<id>" sub */
Sage Weilba75bb92009-10-06 11:31:11 -0700100
Sage Weil039934b2009-11-12 15:05:52 -0800101#ifdef CONFIG_DEBUG_FS
Sage Weilba75bb92009-10-06 11:31:11 -0700102 struct dentry *debugfs_file;
Sage Weil039934b2009-11-12 15:05:52 -0800103#endif
Sage Weilba75bb92009-10-06 11:31:11 -0700104};
105
106extern struct ceph_monmap *ceph_monmap_decode(void *p, void *end);
107extern int ceph_monmap_contains(struct ceph_monmap *m,
108 struct ceph_entity_addr *addr);
109
110extern int ceph_monc_init(struct ceph_mon_client *monc, struct ceph_client *cl);
111extern void ceph_monc_stop(struct ceph_mon_client *monc);
112
Ilya Dryomov82dcaba2016-01-19 16:19:06 +0100113enum {
Yan, Zheng0cabbd92016-04-07 11:34:43 +0800114 CEPH_SUB_MONMAP = 0,
Ilya Dryomov82dcaba2016-01-19 16:19:06 +0100115 CEPH_SUB_OSDMAP,
Yan, Zheng0cabbd92016-04-07 11:34:43 +0800116 CEPH_SUB_FSMAP,
117 CEPH_SUB_MDSMAP,
Ilya Dryomov82dcaba2016-01-19 16:19:06 +0100118};
119
120extern const char *ceph_sub_str[];
121
Sage Weilba75bb92009-10-06 11:31:11 -0700122/*
123 * The model here is to indicate that we need a new map of at least
Ilya Dryomov82dcaba2016-01-19 16:19:06 +0100124 * epoch @epoch, and also call in when we receive a map. We will
Sage Weilba75bb92009-10-06 11:31:11 -0700125 * periodically rerequest the map from the monitor cluster until we
126 * get what we want.
127 */
Ilya Dryomov82dcaba2016-01-19 16:19:06 +0100128bool ceph_monc_want_map(struct ceph_mon_client *monc, int sub, u32 epoch,
129 bool continuous);
130void ceph_monc_got_map(struct ceph_mon_client *monc, int sub, u32 epoch);
Ilya Dryomov42c1b122016-04-28 16:07:25 +0200131void ceph_monc_renew_subs(struct ceph_mon_client *monc);
Sage Weilba75bb92009-10-06 11:31:11 -0700132
Ilya Dryomov6044cde2014-05-13 11:19:27 +0400133extern int ceph_monc_wait_osdmap(struct ceph_mon_client *monc, u32 epoch,
134 unsigned long timeout);
Sage Weilba75bb92009-10-06 11:31:11 -0700135
Sage Weilba75bb92009-10-06 11:31:11 -0700136extern int ceph_monc_do_statfs(struct ceph_mon_client *monc,
137 struct ceph_statfs *buf);
138
Ilya Dryomovd0b19702016-04-28 16:07:27 +0200139int ceph_monc_get_version(struct ceph_mon_client *monc, const char *what,
140 u64 *newest);
141int ceph_monc_get_version_async(struct ceph_mon_client *monc, const char *what,
142 ceph_monc_callback_t cb, u64 private_data);
Ilya Dryomov513a8242014-05-13 11:19:26 +0400143
Douglas Fuller6305a3b2015-07-22 20:59:52 -0400144int ceph_monc_blacklist_add(struct ceph_mon_client *monc,
145 struct ceph_entity_addr *client_addr);
146
Sage Weil4e7a5dc2009-11-18 16:19:57 -0800147extern int ceph_monc_open_session(struct ceph_mon_client *monc);
148
Sage Weil9bd2e6f2010-02-02 16:21:06 -0800149extern int ceph_monc_validate_auth(struct ceph_mon_client *monc);
150
Sage Weilba75bb92009-10-06 11:31:11 -0700151#endif