at v3.2 3.9 kB view raw
1#ifndef _FS_CEPH_OSDMAP_H 2#define _FS_CEPH_OSDMAP_H 3 4#include <linux/rbtree.h> 5#include "types.h" 6#include "ceph_fs.h" 7#include <linux/crush/crush.h> 8 9/* 10 * The osd map describes the current membership of the osd cluster and 11 * specifies the mapping of objects to placement groups and placement 12 * groups to (sets of) osds. That is, it completely specifies the 13 * (desired) distribution of all data objects in the system at some 14 * point in time. 15 * 16 * Each map version is identified by an epoch, which increases monotonically. 17 * 18 * The map can be updated either via an incremental map (diff) describing 19 * the change between two successive epochs, or as a fully encoded map. 20 */ 21struct ceph_pg_pool_info { 22 struct rb_node node; 23 int id; 24 struct ceph_pg_pool v; 25 int pg_num_mask, pgp_num_mask, lpg_num_mask, lpgp_num_mask; 26 char *name; 27}; 28 29struct ceph_pg_mapping { 30 struct rb_node node; 31 struct ceph_pg pgid; 32 int len; 33 int osds[]; 34}; 35 36struct ceph_osdmap { 37 struct ceph_fsid fsid; 38 u32 epoch; 39 u32 mkfs_epoch; 40 struct ceph_timespec created, modified; 41 42 u32 flags; /* CEPH_OSDMAP_* */ 43 44 u32 max_osd; /* size of osd_state, _offload, _addr arrays */ 45 u8 *osd_state; /* CEPH_OSD_* */ 46 u32 *osd_weight; /* 0 = failed, 0x10000 = 100% normal */ 47 struct ceph_entity_addr *osd_addr; 48 49 struct rb_root pg_temp; 50 struct rb_root pg_pools; 51 u32 pool_max; 52 53 /* the CRUSH map specifies the mapping of placement groups to 54 * the list of osds that store+replicate them. */ 55 struct crush_map *crush; 56}; 57 58/* 59 * file layout helpers 60 */ 61#define ceph_file_layout_su(l) ((__s32)le32_to_cpu((l).fl_stripe_unit)) 62#define ceph_file_layout_stripe_count(l) \ 63 ((__s32)le32_to_cpu((l).fl_stripe_count)) 64#define ceph_file_layout_object_size(l) ((__s32)le32_to_cpu((l).fl_object_size)) 65#define ceph_file_layout_cas_hash(l) ((__s32)le32_to_cpu((l).fl_cas_hash)) 66#define ceph_file_layout_object_su(l) \ 67 ((__s32)le32_to_cpu((l).fl_object_stripe_unit)) 68#define ceph_file_layout_pg_preferred(l) \ 69 ((__s32)le32_to_cpu((l).fl_pg_preferred)) 70#define ceph_file_layout_pg_pool(l) \ 71 ((__s32)le32_to_cpu((l).fl_pg_pool)) 72 73static inline unsigned ceph_file_layout_stripe_width(struct ceph_file_layout *l) 74{ 75 return le32_to_cpu(l->fl_stripe_unit) * 76 le32_to_cpu(l->fl_stripe_count); 77} 78 79/* "period" == bytes before i start on a new set of objects */ 80static inline unsigned ceph_file_layout_period(struct ceph_file_layout *l) 81{ 82 return le32_to_cpu(l->fl_object_size) * 83 le32_to_cpu(l->fl_stripe_count); 84} 85 86 87static inline int ceph_osd_is_up(struct ceph_osdmap *map, int osd) 88{ 89 return (osd < map->max_osd) && (map->osd_state[osd] & CEPH_OSD_UP); 90} 91 92static inline bool ceph_osdmap_flag(struct ceph_osdmap *map, int flag) 93{ 94 return map && (map->flags & flag); 95} 96 97extern char *ceph_osdmap_state_str(char *str, int len, int state); 98 99static inline struct ceph_entity_addr *ceph_osd_addr(struct ceph_osdmap *map, 100 int osd) 101{ 102 if (osd >= map->max_osd) 103 return NULL; 104 return &map->osd_addr[osd]; 105} 106 107extern struct ceph_osdmap *osdmap_decode(void **p, void *end); 108extern struct ceph_osdmap *osdmap_apply_incremental(void **p, void *end, 109 struct ceph_osdmap *map, 110 struct ceph_messenger *msgr); 111extern void ceph_osdmap_destroy(struct ceph_osdmap *map); 112 113/* calculate mapping of a file extent to an object */ 114extern void ceph_calc_file_object_mapping(struct ceph_file_layout *layout, 115 u64 off, u64 *plen, 116 u64 *bno, u64 *oxoff, u64 *oxlen); 117 118/* calculate mapping of object to a placement group */ 119extern int ceph_calc_object_layout(struct ceph_object_layout *ol, 120 const char *oid, 121 struct ceph_file_layout *fl, 122 struct ceph_osdmap *osdmap); 123extern int ceph_calc_pg_acting(struct ceph_osdmap *osdmap, struct ceph_pg pgid, 124 int *acting); 125extern int ceph_calc_pg_primary(struct ceph_osdmap *osdmap, 126 struct ceph_pg pgid); 127 128extern int ceph_pg_poolid_by_name(struct ceph_osdmap *map, const char *name); 129 130#endif