]> Pileus Git - ~andy/linux/blob - include/linux/ceph/osdmap.h
ebb8ec285de6cd5394d8b080c288564712ef4901
[~andy/linux] / include / linux / ceph / osdmap.h
1 #ifndef _FS_CEPH_OSDMAP_H
2 #define _FS_CEPH_OSDMAP_H
3
4 #include <linux/rbtree.h>
5 #include <linux/ceph/types.h>
6 #include <linux/ceph/decode.h>
7 #include <linux/ceph/ceph_fs.h>
8 #include <linux/crush/crush.h>
9
10 /*
11  * The osd map describes the current membership of the osd cluster and
12  * specifies the mapping of objects to placement groups and placement
13  * groups to (sets of) osds.  That is, it completely specifies the
14  * (desired) distribution of all data objects in the system at some
15  * point in time.
16  *
17  * Each map version is identified by an epoch, which increases monotonically.
18  *
19  * The map can be updated either via an incremental map (diff) describing
20  * the change between two successive epochs, or as a fully encoded map.
21  */
22 struct ceph_pg {
23         uint64_t pool;
24         uint32_t seed;
25 };
26
27 #define CEPH_POOL_FLAG_HASHPSPOOL  1
28
29 struct ceph_pg_pool_info {
30         struct rb_node node;
31         s64 id;
32         u8 type;
33         u8 size;
34         u8 crush_ruleset;
35         u8 object_hash;
36         u32 pg_num, pgp_num;
37         int pg_num_mask, pgp_num_mask;
38         u64 flags;
39         char *name;
40 };
41
42 struct ceph_object_locator {
43         s64 pool;
44 };
45
46 /*
47  * Maximum supported by kernel client object name length
48  *
49  * (probably outdated: must be >= RBD_MAX_MD_NAME_LEN -- currently 100)
50  */
51 #define CEPH_MAX_OID_NAME_LEN 100
52
53 struct ceph_object_id {
54         char name[CEPH_MAX_OID_NAME_LEN];
55         int name_len;
56 };
57
58 struct ceph_pg_mapping {
59         struct rb_node node;
60         struct ceph_pg pgid;
61         int len;
62         int osds[];
63 };
64
65 struct ceph_osdmap {
66         struct ceph_fsid fsid;
67         u32 epoch;
68         u32 mkfs_epoch;
69         struct ceph_timespec created, modified;
70
71         u32 flags;         /* CEPH_OSDMAP_* */
72
73         u32 max_osd;       /* size of osd_state, _offload, _addr arrays */
74         u8 *osd_state;     /* CEPH_OSD_* */
75         u32 *osd_weight;   /* 0 = failed, 0x10000 = 100% normal */
76         struct ceph_entity_addr *osd_addr;
77
78         struct rb_root pg_temp;
79         struct rb_root pg_pools;
80         u32 pool_max;
81
82         /* the CRUSH map specifies the mapping of placement groups to
83          * the list of osds that store+replicate them. */
84         struct crush_map *crush;
85 };
86
87 static inline void ceph_oid_set_name(struct ceph_object_id *oid,
88                                      const char *name)
89 {
90         int len;
91
92         len = strlen(name);
93         if (len > sizeof(oid->name)) {
94                 WARN(1, "ceph_oid_set_name '%s' len %d vs %zu, truncating\n",
95                      name, len, sizeof(oid->name));
96                 len = sizeof(oid->name);
97         }
98
99         memcpy(oid->name, name, len);
100         oid->name_len = len;
101 }
102
103 static inline void ceph_oid_copy(struct ceph_object_id *dest,
104                                  struct ceph_object_id *src)
105 {
106         BUG_ON(src->name_len > sizeof(dest->name));
107         memcpy(dest->name, src->name, src->name_len);
108         dest->name_len = src->name_len;
109 }
110
111 static inline int ceph_osd_is_up(struct ceph_osdmap *map, int osd)
112 {
113         return (osd < map->max_osd) && (map->osd_state[osd] & CEPH_OSD_UP);
114 }
115
116 static inline bool ceph_osdmap_flag(struct ceph_osdmap *map, int flag)
117 {
118         return map && (map->flags & flag);
119 }
120
121 extern char *ceph_osdmap_state_str(char *str, int len, int state);
122
123 static inline struct ceph_entity_addr *ceph_osd_addr(struct ceph_osdmap *map,
124                                                      int osd)
125 {
126         if (osd >= map->max_osd)
127                 return NULL;
128         return &map->osd_addr[osd];
129 }
130
131 static inline int ceph_decode_pgid(void **p, void *end, struct ceph_pg *pgid)
132 {
133         __u8 version;
134
135         if (!ceph_has_room(p, end, 1 + 8 + 4 + 4)) {
136                 pr_warning("incomplete pg encoding");
137
138                 return -EINVAL;
139         }
140         version = ceph_decode_8(p);
141         if (version > 1) {
142                 pr_warning("do not understand pg encoding %d > 1",
143                         (int)version);
144                 return -EINVAL;
145         }
146
147         pgid->pool = ceph_decode_64(p);
148         pgid->seed = ceph_decode_32(p);
149         *p += 4;        /* skip deprecated preferred value */
150
151         return 0;
152 }
153
154 extern struct ceph_osdmap *osdmap_decode(void **p, void *end);
155 extern struct ceph_osdmap *osdmap_apply_incremental(void **p, void *end,
156                                             struct ceph_osdmap *map,
157                                             struct ceph_messenger *msgr);
158 extern void ceph_osdmap_destroy(struct ceph_osdmap *map);
159
160 /* calculate mapping of a file extent to an object */
161 extern int ceph_calc_file_object_mapping(struct ceph_file_layout *layout,
162                                          u64 off, u64 len,
163                                          u64 *bno, u64 *oxoff, u64 *oxlen);
164
165 /* calculate mapping of object to a placement group */
166 extern int ceph_oloc_oid_to_pg(struct ceph_osdmap *osdmap,
167                                struct ceph_object_locator *oloc,
168                                struct ceph_object_id *oid,
169                                struct ceph_pg *pg_out);
170
171 extern int ceph_calc_pg_acting(struct ceph_osdmap *osdmap,
172                                struct ceph_pg pgid,
173                                int *acting);
174 extern int ceph_calc_pg_primary(struct ceph_osdmap *osdmap,
175                                 struct ceph_pg pgid);
176
177 extern const char *ceph_pg_pool_name_by_id(struct ceph_osdmap *map, u64 id);
178 extern int ceph_pg_poolid_by_name(struct ceph_osdmap *map, const char *name);
179
180 #endif