On Wed, Mar 6, 2013 at 2:15 PM, Sage Weil <s...@inktank.com> wrote: > In 4f6a7e5ee1393ec4b243b39dac9f36992d161540 we effectively dropped support > for the legacy encoding for the OSDMap and incremental. However, we didn't > fix the decoding for the pgid. > > Signed-off-by: Sage Weil <s...@inktank.com> > --- > net/ceph/osdmap.c | 40 +++++++++++++++++++++++++++------------- > 1 file changed, 27 insertions(+), 13 deletions(-) > > diff --git a/net/ceph/osdmap.c b/net/ceph/osdmap.c > index a47ee06..6975102 100644 > --- a/net/ceph/osdmap.c > +++ b/net/ceph/osdmap.c > @@ -654,6 +654,24 @@ static int osdmap_set_max_osd(struct ceph_osdmap *map, > int max) > return 0; > } > > +static int __decode_pgid(void **p, void *end, struct ceph_pg *pg) > +{ > + u8 v; > + > + ceph_decode_need(p, end, 1+8+4+4, bad); > + v = ceph_decode_8(p); > + if (v != 1) > + goto bad; > + pg->pool = ceph_decode_64(p); > + pg->seed = ceph_decode_32(p); > + *p += 4; /* skip preferred */ > + return 0; > + > +bad: > + dout("error decoding pgid\n"); > + return -EINVAL; > +} > + > /* > * decode a full map. > */ > @@ -745,13 +763,11 @@ struct ceph_osdmap *osdmap_decode(void **p, void *end) > for (i = 0; i < len; i++) { > int n, j; > struct ceph_pg pgid; > - struct ceph_pg_v1 pgid_v1; > struct ceph_pg_mapping *pg; > > - ceph_decode_need(p, end, sizeof(u32) + sizeof(u64), bad); > - ceph_decode_copy(p, &pgid_v1, sizeof(pgid_v1)); > - pgid.pool = le32_to_cpu(pgid_v1.pool); > - pgid.seed = le16_to_cpu(pgid_v1.ps); > + err = __decode_pgid(p, end, &pgid); > + if (err) > + goto bad; > n = ceph_decode_32(p); > err = -EINVAL; > if (n > (UINT_MAX - sizeof(*pg)) / sizeof(u32)) > @@ -818,8 +834,8 @@ struct ceph_osdmap *osdmap_apply_incremental(void **p, > void *end, > u16 version; > > ceph_decode_16_safe(p, end, version, bad); > - if (version > 6) { > - pr_warning("got unknown v %d > %d of inc osdmap\n", version, > 6); > + if (version != 6) { > + pr_warning("got unknown v %d != 6 of inc osdmap\n", version); > goto bad; > } > > @@ -963,15 +979,13 @@ struct ceph_osdmap *osdmap_apply_incremental(void **p, > void *end, > while (len--) { > struct ceph_pg_mapping *pg; > int j; > - struct ceph_pg_v1 pgid_v1; > struct ceph_pg pgid; > u32 pglen; > - ceph_decode_need(p, end, sizeof(u64) + sizeof(u32), bad); > - ceph_decode_copy(p, &pgid_v1, sizeof(pgid_v1)); > - pgid.pool = le32_to_cpu(pgid_v1.pool); > - pgid.seed = le16_to_cpu(pgid_v1.ps); > - pglen = ceph_decode_32(p); > > + err = __decode_pgid(p, end, &pgid); > + if (err) > + goto bad;
maybe missing? ceph_decode_need(p, end, sizeof(u32), bad); > + pglen = ceph_decode_32(p); > if (pglen) { > ceph_decode_need(p, end, pglen*sizeof(u32), bad); > > -- > 1.7.9.5 > > -- > To unsubscribe from this list: send the line "unsubscribe ceph-devel" in > the body of a message to majord...@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe ceph-devel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html