|
@@ -830,15 +830,20 @@ struct ceph_osdmap *osdmap_apply_incremental(void **p, void *end,
|
|
|
map->osd_addr[osd] = addr;
|
|
|
}
|
|
|
|
|
|
- /* new_down */
|
|
|
+ /* new_state */
|
|
|
ceph_decode_32_safe(p, end, len, bad);
|
|
|
while (len--) {
|
|
|
u32 osd;
|
|
|
+ u8 xorstate;
|
|
|
ceph_decode_32_safe(p, end, osd, bad);
|
|
|
+ xorstate = **(u8 **)p;
|
|
|
(*p)++; /* clean flag */
|
|
|
- pr_info("osd%d down\n", osd);
|
|
|
+ if (xorstate == 0)
|
|
|
+ xorstate = CEPH_OSD_UP;
|
|
|
+ if (xorstate & CEPH_OSD_UP)
|
|
|
+ pr_info("osd%d down\n", osd);
|
|
|
if (osd < map->max_osd)
|
|
|
- map->osd_state[osd] &= ~CEPH_OSD_UP;
|
|
|
+ map->osd_state[osd] ^= xorstate;
|
|
|
}
|
|
|
|
|
|
/* new_weight */
|