|
@@ -92,6 +92,7 @@ struct ceph_mdsmap *ceph_mdsmap_decode(void **p, void *end)
|
|
|
u32 num_export_targets;
|
|
|
void *pexport_targets = NULL;
|
|
|
struct ceph_timespec laggy_since;
|
|
|
+ struct ceph_mds_info *info;
|
|
|
|
|
|
ceph_decode_need(p, end, sizeof(u64)*2 + 1 + sizeof(u32), bad);
|
|
|
global_id = ceph_decode_64(p);
|
|
@@ -126,26 +127,27 @@ struct ceph_mdsmap *ceph_mdsmap_decode(void **p, void *end)
|
|
|
i+1, n, global_id, mds, inc,
|
|
|
ceph_pr_addr(&addr.in_addr),
|
|
|
ceph_mds_state_name(state));
|
|
|
- if (mds >= 0 && mds < m->m_max_mds && state > 0) {
|
|
|
- m->m_info[mds].global_id = global_id;
|
|
|
- m->m_info[mds].state = state;
|
|
|
- m->m_info[mds].addr = addr;
|
|
|
- m->m_info[mds].laggy =
|
|
|
- (laggy_since.tv_sec != 0 ||
|
|
|
- laggy_since.tv_nsec != 0);
|
|
|
- m->m_info[mds].num_export_targets = num_export_targets;
|
|
|
- if (num_export_targets) {
|
|
|
- m->m_info[mds].export_targets =
|
|
|
- kcalloc(num_export_targets, sizeof(u32),
|
|
|
- GFP_NOFS);
|
|
|
- if (m->m_info[mds].export_targets == NULL)
|
|
|
- goto badmem;
|
|
|
- for (j = 0; j < num_export_targets; j++)
|
|
|
- m->m_info[mds].export_targets[j] =
|
|
|
- ceph_decode_32(&pexport_targets);
|
|
|
- } else {
|
|
|
- m->m_info[mds].export_targets = NULL;
|
|
|
- }
|
|
|
+
|
|
|
+ if (mds < 0 || mds >= m->m_max_mds || state <= 0)
|
|
|
+ continue;
|
|
|
+
|
|
|
+ info = &m->m_info[mds];
|
|
|
+ info->global_id = global_id;
|
|
|
+ info->state = state;
|
|
|
+ info->addr = addr;
|
|
|
+ info->laggy = (laggy_since.tv_sec != 0 ||
|
|
|
+ laggy_since.tv_nsec != 0);
|
|
|
+ info->num_export_targets = num_export_targets;
|
|
|
+ if (num_export_targets) {
|
|
|
+ info->export_targets = kcalloc(num_export_targets,
|
|
|
+ sizeof(u32), GFP_NOFS);
|
|
|
+ if (info->export_targets == NULL)
|
|
|
+ goto badmem;
|
|
|
+ for (j = 0; j < num_export_targets; j++)
|
|
|
+ info->export_targets[j] =
|
|
|
+ ceph_decode_32(&pexport_targets);
|
|
|
+ } else {
|
|
|
+ info->export_targets = NULL;
|
|
|
}
|
|
|
}
|
|
|
|