diff options
author | Ilya Dryomov <idryomov@gmail.com> | 2017-06-22 13:44:06 -0400 |
---|---|---|
committer | Ilya Dryomov <idryomov@gmail.com> | 2017-07-07 11:25:19 -0400 |
commit | 0bb05da2ec57163b7a25efef001ed8f52b18b070 (patch) | |
tree | e89ca7499993711e32a6ea0bb3205ae431bc98e4 | |
parent | 9eebe45c091e2dff22d4bd87360a624303148ed1 (diff) |
libceph: osd_state is 32 bits wide in luminous
Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
-rw-r--r-- | include/linux/ceph/osdmap.h | 4 | ||||
-rw-r--r-- | net/ceph/debugfs.c | 2 | ||||
-rw-r--r-- | net/ceph/osdmap.c | 29 |
3 files changed, 23 insertions, 12 deletions
diff --git a/include/linux/ceph/osdmap.h b/include/linux/ceph/osdmap.h index c612cff81f5c..a0996cb9faed 100644 --- a/include/linux/ceph/osdmap.h +++ b/include/linux/ceph/osdmap.h | |||
@@ -162,7 +162,7 @@ struct ceph_osdmap { | |||
162 | u32 flags; /* CEPH_OSDMAP_* */ | 162 | u32 flags; /* CEPH_OSDMAP_* */ |
163 | 163 | ||
164 | u32 max_osd; /* size of osd_state, _offload, _addr arrays */ | 164 | u32 max_osd; /* size of osd_state, _offload, _addr arrays */ |
165 | u8 *osd_state; /* CEPH_OSD_* */ | 165 | u32 *osd_state; /* CEPH_OSD_* */ |
166 | u32 *osd_weight; /* 0 = failed, 0x10000 = 100% normal */ | 166 | u32 *osd_weight; /* 0 = failed, 0x10000 = 100% normal */ |
167 | struct ceph_entity_addr *osd_addr; | 167 | struct ceph_entity_addr *osd_addr; |
168 | 168 | ||
@@ -203,7 +203,7 @@ static inline bool ceph_osd_is_down(struct ceph_osdmap *map, int osd) | |||
203 | return !ceph_osd_is_up(map, osd); | 203 | return !ceph_osd_is_up(map, osd); |
204 | } | 204 | } |
205 | 205 | ||
206 | extern char *ceph_osdmap_state_str(char *str, int len, int state); | 206 | char *ceph_osdmap_state_str(char *str, int len, u32 state); |
207 | extern u32 ceph_get_primary_affinity(struct ceph_osdmap *map, int osd); | 207 | extern u32 ceph_get_primary_affinity(struct ceph_osdmap *map, int osd); |
208 | 208 | ||
209 | static inline struct ceph_entity_addr *ceph_osd_addr(struct ceph_osdmap *map, | 209 | static inline struct ceph_entity_addr *ceph_osd_addr(struct ceph_osdmap *map, |
diff --git a/net/ceph/debugfs.c b/net/ceph/debugfs.c index 4f57d5bcaba2..fa5233e0d01c 100644 --- a/net/ceph/debugfs.c +++ b/net/ceph/debugfs.c | |||
@@ -77,7 +77,7 @@ static int osdmap_show(struct seq_file *s, void *p) | |||
77 | } | 77 | } |
78 | for (i = 0; i < map->max_osd; i++) { | 78 | for (i = 0; i < map->max_osd; i++) { |
79 | struct ceph_entity_addr *addr = &map->osd_addr[i]; | 79 | struct ceph_entity_addr *addr = &map->osd_addr[i]; |
80 | int state = map->osd_state[i]; | 80 | u32 state = map->osd_state[i]; |
81 | char sb[64]; | 81 | char sb[64]; |
82 | 82 | ||
83 | seq_printf(s, "osd%d\t%s\t%3d%%\t(%s)\t%3d%%\n", | 83 | seq_printf(s, "osd%d\t%s\t%3d%%\t(%s)\t%3d%%\n", |
diff --git a/net/ceph/osdmap.c b/net/ceph/osdmap.c index f630d1072299..864789c5974e 100644 --- a/net/ceph/osdmap.c +++ b/net/ceph/osdmap.c | |||
@@ -11,7 +11,7 @@ | |||
11 | #include <linux/crush/hash.h> | 11 | #include <linux/crush/hash.h> |
12 | #include <linux/crush/mapper.h> | 12 | #include <linux/crush/mapper.h> |
13 | 13 | ||
14 | char *ceph_osdmap_state_str(char *str, int len, int state) | 14 | char *ceph_osdmap_state_str(char *str, int len, u32 state) |
15 | { | 15 | { |
16 | if (!len) | 16 | if (!len) |
17 | return str; | 17 | return str; |
@@ -984,7 +984,7 @@ void ceph_osdmap_destroy(struct ceph_osdmap *map) | |||
984 | */ | 984 | */ |
985 | static int osdmap_set_max_osd(struct ceph_osdmap *map, int max) | 985 | static int osdmap_set_max_osd(struct ceph_osdmap *map, int max) |
986 | { | 986 | { |
987 | u8 *state; | 987 | u32 *state; |
988 | u32 *weight; | 988 | u32 *weight; |
989 | struct ceph_entity_addr *addr; | 989 | struct ceph_entity_addr *addr; |
990 | int i; | 990 | int i; |
@@ -1484,13 +1484,21 @@ static int osdmap_decode(void **p, void *end, struct ceph_osdmap *map) | |||
1484 | 1484 | ||
1485 | /* osd_state, osd_weight, osd_addrs->client_addr */ | 1485 | /* osd_state, osd_weight, osd_addrs->client_addr */ |
1486 | ceph_decode_need(p, end, 3*sizeof(u32) + | 1486 | ceph_decode_need(p, end, 3*sizeof(u32) + |
1487 | map->max_osd*(1 + sizeof(*map->osd_weight) + | 1487 | map->max_osd*((struct_v >= 5 ? sizeof(u32) : |
1488 | sizeof(u8)) + | ||
1489 | sizeof(*map->osd_weight) + | ||
1488 | sizeof(*map->osd_addr)), e_inval); | 1490 | sizeof(*map->osd_addr)), e_inval); |
1489 | 1491 | ||
1490 | if (ceph_decode_32(p) != map->max_osd) | 1492 | if (ceph_decode_32(p) != map->max_osd) |
1491 | goto e_inval; | 1493 | goto e_inval; |
1492 | 1494 | ||
1493 | ceph_decode_copy(p, map->osd_state, map->max_osd); | 1495 | if (struct_v >= 5) { |
1496 | for (i = 0; i < map->max_osd; i++) | ||
1497 | map->osd_state[i] = ceph_decode_32(p); | ||
1498 | } else { | ||
1499 | for (i = 0; i < map->max_osd; i++) | ||
1500 | map->osd_state[i] = ceph_decode_8(p); | ||
1501 | } | ||
1494 | 1502 | ||
1495 | if (ceph_decode_32(p) != map->max_osd) | 1503 | if (ceph_decode_32(p) != map->max_osd) |
1496 | goto e_inval; | 1504 | goto e_inval; |
@@ -1598,7 +1606,7 @@ struct ceph_osdmap *ceph_osdmap_decode(void **p, void *end) | |||
1598 | * new_up_client: { osd=6, addr=... } # set osd_state and addr | 1606 | * new_up_client: { osd=6, addr=... } # set osd_state and addr |
1599 | * new_state: { osd=6, xorstate=EXISTS } # clear osd_state | 1607 | * new_state: { osd=6, xorstate=EXISTS } # clear osd_state |
1600 | */ | 1608 | */ |
1601 | static int decode_new_up_state_weight(void **p, void *end, | 1609 | static int decode_new_up_state_weight(void **p, void *end, u8 struct_v, |
1602 | struct ceph_osdmap *map) | 1610 | struct ceph_osdmap *map) |
1603 | { | 1611 | { |
1604 | void *new_up_client; | 1612 | void *new_up_client; |
@@ -1614,7 +1622,7 @@ static int decode_new_up_state_weight(void **p, void *end, | |||
1614 | 1622 | ||
1615 | new_state = *p; | 1623 | new_state = *p; |
1616 | ceph_decode_32_safe(p, end, len, e_inval); | 1624 | ceph_decode_32_safe(p, end, len, e_inval); |
1617 | len *= sizeof(u32) + sizeof(u8); | 1625 | len *= sizeof(u32) + (struct_v >= 5 ? sizeof(u32) : sizeof(u8)); |
1618 | ceph_decode_need(p, end, len, e_inval); | 1626 | ceph_decode_need(p, end, len, e_inval); |
1619 | *p += len; | 1627 | *p += len; |
1620 | 1628 | ||
@@ -1650,11 +1658,14 @@ static int decode_new_up_state_weight(void **p, void *end, | |||
1650 | len = ceph_decode_32(p); | 1658 | len = ceph_decode_32(p); |
1651 | while (len--) { | 1659 | while (len--) { |
1652 | s32 osd; | 1660 | s32 osd; |
1653 | u8 xorstate; | 1661 | u32 xorstate; |
1654 | int ret; | 1662 | int ret; |
1655 | 1663 | ||
1656 | osd = ceph_decode_32(p); | 1664 | osd = ceph_decode_32(p); |
1657 | xorstate = ceph_decode_8(p); | 1665 | if (struct_v >= 5) |
1666 | xorstate = ceph_decode_32(p); | ||
1667 | else | ||
1668 | xorstate = ceph_decode_8(p); | ||
1658 | if (xorstate == 0) | 1669 | if (xorstate == 0) |
1659 | xorstate = CEPH_OSD_UP; | 1670 | xorstate = CEPH_OSD_UP; |
1660 | BUG_ON(osd >= map->max_osd); | 1671 | BUG_ON(osd >= map->max_osd); |
@@ -1788,7 +1799,7 @@ struct ceph_osdmap *osdmap_apply_incremental(void **p, void *end, | |||
1788 | } | 1799 | } |
1789 | 1800 | ||
1790 | /* new_up_client, new_state, new_weight */ | 1801 | /* new_up_client, new_state, new_weight */ |
1791 | err = decode_new_up_state_weight(p, end, map); | 1802 | err = decode_new_up_state_weight(p, end, struct_v, map); |
1792 | if (err) | 1803 | if (err) |
1793 | goto bad; | 1804 | goto bad; |
1794 | 1805 | ||