|
@@ -135,6 +135,21 @@ bad:
|
|
|
return -EINVAL;
|
|
|
}
|
|
|
|
|
|
+static int skip_name_map(void **p, void *end)
|
|
|
+{
|
|
|
+ int len;
|
|
|
+ ceph_decode_32_safe(p, end, len ,bad);
|
|
|
+ while (len--) {
|
|
|
+ int strlen;
|
|
|
+ *p += sizeof(u32);
|
|
|
+ ceph_decode_32_safe(p, end, strlen, bad);
|
|
|
+ *p += strlen;
|
|
|
+}
|
|
|
+ return 0;
|
|
|
+bad:
|
|
|
+ return -EINVAL;
|
|
|
+}
|
|
|
+
|
|
|
static struct crush_map *crush_decode(void *pbyval, void *end)
|
|
|
{
|
|
|
struct crush_map *c;
|
|
@@ -143,6 +158,7 @@ static struct crush_map *crush_decode(void *pbyval, void *end)
|
|
|
void **p = &pbyval;
|
|
|
void *start = pbyval;
|
|
|
u32 magic;
|
|
|
+ u32 num_name_maps;
|
|
|
|
|
|
dout("crush_decode %p to %p len %d\n", *p, end, (int)(end - *p));
|
|
|
|
|
@@ -150,6 +166,11 @@ static struct crush_map *crush_decode(void *pbyval, void *end)
|
|
|
if (c == NULL)
|
|
|
return ERR_PTR(-ENOMEM);
|
|
|
|
|
|
+ /* set tunables to default values */
|
|
|
+ c->choose_local_tries = 2;
|
|
|
+ c->choose_local_fallback_tries = 5;
|
|
|
+ c->choose_total_tries = 19;
|
|
|
+
|
|
|
ceph_decode_need(p, end, 4*sizeof(u32), bad);
|
|
|
magic = ceph_decode_32(p);
|
|
|
if (magic != CRUSH_MAGIC) {
|
|
@@ -297,7 +318,25 @@ static struct crush_map *crush_decode(void *pbyval, void *end)
|
|
|
}
|
|
|
|
|
|
/* ignore trailing name maps. */
|
|
|
+ for (num_name_maps = 0; num_name_maps < 3; num_name_maps++) {
|
|
|
+ err = skip_name_map(p, end);
|
|
|
+ if (err < 0)
|
|
|
+ goto done;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* tunables */
|
|
|
+ ceph_decode_need(p, end, 3*sizeof(u32), done);
|
|
|
+ c->choose_local_tries = ceph_decode_32(p);
|
|
|
+ c->choose_local_fallback_tries = ceph_decode_32(p);
|
|
|
+ c->choose_total_tries = ceph_decode_32(p);
|
|
|
+ dout("crush decode tunable choose_local_tries = %d",
|
|
|
+ c->choose_local_tries);
|
|
|
+ dout("crush decode tunable choose_local_fallback_tries = %d",
|
|
|
+ c->choose_local_fallback_tries);
|
|
|
+ dout("crush decode tunable choose_total_tries = %d",
|
|
|
+ c->choose_total_tries);
|
|
|
|
|
|
+done:
|
|
|
dout("crush_decode success\n");
|
|
|
return c;
|
|
|
|