ceph: add uid field to ceph_pg_pool
authorSage Weil <sage@newdream.net>
Fri, 5 Feb 2010 00:18:10 +0000 (16:18 -0800)
committerSage Weil <sage@newdream.net>
Thu, 11 Feb 2010 19:48:49 +0000 (11:48 -0800)
Also verify encoding version as we go.

Signed-off-by: Sage Weil <sage@newdream.net>
fs/ceph/osdmap.c
fs/ceph/rados.h

index a143c51..a6afe38 100644 (file)
@@ -426,6 +426,11 @@ struct ceph_osdmap *osdmap_decode(void **p, void *end)
        map->pg_temp = RB_ROOT;
 
        ceph_decode_16_safe(p, end, version, bad);
+       if (version > CEPH_OSDMAP_VERSION) {
+               pr_warning("got unknown v %d > %d of osdmap\n", version,
+                          CEPH_OSDMAP_VERSION);
+               goto bad;
+       }
 
        ceph_decode_need(p, end, 2*sizeof(u64)+6*sizeof(u32), bad);
        ceph_decode_copy(p, &map->fsid, sizeof(map->fsid));
@@ -447,6 +452,11 @@ struct ceph_osdmap *osdmap_decode(void **p, void *end)
                if (i >= map->num_pools)
                        goto bad;
                ev = ceph_decode_8(p); /* encoding version */
+               if (ev > CEPH_PG_POOL_VERSION) {
+                       pr_warning("got unknown v %d > %d of ceph_pg_pool\n",
+                                  ev, CEPH_PG_POOL_VERSION);
+                       goto bad;
+               }
                ceph_decode_copy(p, &map->pg_pool[i].v,
                                 sizeof(map->pg_pool->v));
                calc_pg_masks(&map->pg_pool[i]);
@@ -552,6 +562,11 @@ struct ceph_osdmap *osdmap_apply_incremental(void **p, void *end,
        struct rb_node *rbp;
 
        ceph_decode_16_safe(p, end, version, bad);
+       if (version > CEPH_OSDMAP_INC_VERSION) {
+               pr_warning("got unknown v %d > %d of inc osdmap\n", version,
+                          CEPH_OSDMAP_INC_VERSION);
+               goto bad;
+       }
 
        ceph_decode_need(p, end, sizeof(fsid)+sizeof(modified)+2*sizeof(u32),
                         bad);
@@ -624,6 +639,11 @@ struct ceph_osdmap *osdmap_apply_incremental(void **p, void *end,
                }
                ceph_decode_need(p, end, 1 + sizeof(map->pg_pool->v), bad);
                ev = ceph_decode_8(p);  /* encoding version */
+               if (ev > CEPH_PG_POOL_VERSION) {
+                       pr_warning("got unknown v %d > %d of ceph_pg_pool\n",
+                                  ev, CEPH_PG_POOL_VERSION);
+                       goto bad;
+               }
                ceph_decode_copy(p, &map->pg_pool[pool].v,
                                 sizeof(map->pg_pool->v));
                calc_pg_masks(&map->pg_pool[pool]);
index 123fd84..1f4c786 100644 (file)
@@ -9,6 +9,12 @@
 #include "msgr.h"
 
 /*
+ * osdmap encoding versions
+ */
+#define CEPH_OSDMAP_INC_VERSION 3
+#define CEPH_OSDMAP_VERSION     3
+
+/*
  * fs id
  */
 struct ceph_fsid {
@@ -80,6 +86,7 @@ struct ceph_pg {
  */
 #define CEPH_PG_TYPE_REP     1
 #define CEPH_PG_TYPE_RAID4   2
+#define CEPH_PG_POOL_VERSION 2
 struct ceph_pg_pool {
        __u8 type;                /* CEPH_PG_TYPE_* */
        __u8 size;                /* number of osds in each pg */
@@ -92,6 +99,7 @@ struct ceph_pg_pool {
        __le32 snap_epoch;        /* epoch of last snap */
        __le32 num_snaps;
        __le32 num_removed_snap_intervals;
+       __le64 uid;
 } __attribute__ ((packed));
 
 /*