1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun #ifndef _FS_CEPH_MDSMAP_H 3*4882a593Smuzhiyun #define _FS_CEPH_MDSMAP_H 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun #include <linux/bug.h> 6*4882a593Smuzhiyun #include <linux/ceph/types.h> 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun /* 9*4882a593Smuzhiyun * mds map - describe servers in the mds cluster. 10*4882a593Smuzhiyun * 11*4882a593Smuzhiyun * we limit fields to those the client actually xcares about 12*4882a593Smuzhiyun */ 13*4882a593Smuzhiyun struct ceph_mds_info { 14*4882a593Smuzhiyun u64 global_id; 15*4882a593Smuzhiyun struct ceph_entity_addr addr; 16*4882a593Smuzhiyun s32 state; 17*4882a593Smuzhiyun int num_export_targets; 18*4882a593Smuzhiyun bool laggy; 19*4882a593Smuzhiyun u32 *export_targets; 20*4882a593Smuzhiyun }; 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun struct ceph_mdsmap { 23*4882a593Smuzhiyun u32 m_epoch, m_client_epoch, m_last_failure; 24*4882a593Smuzhiyun u32 m_root; 25*4882a593Smuzhiyun u32 m_session_timeout; /* seconds */ 26*4882a593Smuzhiyun u32 m_session_autoclose; /* seconds */ 27*4882a593Smuzhiyun u64 m_max_file_size; 28*4882a593Smuzhiyun u32 m_max_mds; /* expected up:active mds number */ 29*4882a593Smuzhiyun u32 m_num_active_mds; /* actual up:active mds number */ 30*4882a593Smuzhiyun u32 possible_max_rank; /* possible max rank index */ 31*4882a593Smuzhiyun struct ceph_mds_info *m_info; 32*4882a593Smuzhiyun 33*4882a593Smuzhiyun /* which object pools file data can be stored in */ 34*4882a593Smuzhiyun int m_num_data_pg_pools; 35*4882a593Smuzhiyun u64 *m_data_pg_pools; 36*4882a593Smuzhiyun u64 m_cas_pg_pool; 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun bool m_enabled; 39*4882a593Smuzhiyun bool m_damaged; 40*4882a593Smuzhiyun int m_num_laggy; 41*4882a593Smuzhiyun }; 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun static inline struct ceph_entity_addr * ceph_mdsmap_get_addr(struct ceph_mdsmap * m,int w)44*4882a593Smuzhiyunceph_mdsmap_get_addr(struct ceph_mdsmap *m, int w) 45*4882a593Smuzhiyun { 46*4882a593Smuzhiyun if (w >= m->possible_max_rank) 47*4882a593Smuzhiyun return NULL; 48*4882a593Smuzhiyun return &m->m_info[w].addr; 49*4882a593Smuzhiyun } 50*4882a593Smuzhiyun ceph_mdsmap_get_state(struct ceph_mdsmap * m,int w)51*4882a593Smuzhiyunstatic inline int ceph_mdsmap_get_state(struct ceph_mdsmap *m, int w) 52*4882a593Smuzhiyun { 53*4882a593Smuzhiyun BUG_ON(w < 0); 54*4882a593Smuzhiyun if (w >= m->possible_max_rank) 55*4882a593Smuzhiyun return CEPH_MDS_STATE_DNE; 56*4882a593Smuzhiyun return m->m_info[w].state; 57*4882a593Smuzhiyun } 58*4882a593Smuzhiyun ceph_mdsmap_is_laggy(struct ceph_mdsmap * m,int w)59*4882a593Smuzhiyunstatic inline bool ceph_mdsmap_is_laggy(struct ceph_mdsmap *m, int w) 60*4882a593Smuzhiyun { 61*4882a593Smuzhiyun if (w >= 0 && w < m->possible_max_rank) 62*4882a593Smuzhiyun return m->m_info[w].laggy; 63*4882a593Smuzhiyun return false; 64*4882a593Smuzhiyun } 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun extern int ceph_mdsmap_get_random_mds(struct ceph_mdsmap *m); 67*4882a593Smuzhiyun extern struct ceph_mdsmap *ceph_mdsmap_decode(void **p, void *end); 68*4882a593Smuzhiyun extern void ceph_mdsmap_destroy(struct ceph_mdsmap *m); 69*4882a593Smuzhiyun extern bool ceph_mdsmap_is_cluster_available(struct ceph_mdsmap *m); 70*4882a593Smuzhiyun 71*4882a593Smuzhiyun #endif 72