ceph: tidy ceph_mdsmap_decode() a little
[deliverable/linux.git] / fs / ceph / mdsmap.c
index 9278dec9e9400aa222c6e73fcaa144405644c056..132b64eeecd494b01d224d1d58394db498ed70a9 100644 (file)
@@ -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,24 +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);
-                               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;
                }
        }
 
@@ -170,7 +174,7 @@ bad:
                       DUMP_PREFIX_OFFSET, 16, 1,
                       start, end - start, true);
        ceph_mdsmap_destroy(m);
-       return ERR_PTR(-EINVAL);
+       return ERR_PTR(err);
 }
 
 void ceph_mdsmap_destroy(struct ceph_mdsmap *m)
This page took 0.026829 seconds and 5 git commands to generate.