* rbtree of pg_mapping for handling pg_temp (explicit mapping of pgid
  * to a set of osds)
  */
-static int pgid_cmp(struct ceph_pg_v1 l, struct ceph_pg_v1 r)
+static int pgid_cmp(struct ceph_pg l, struct ceph_pg r)
 {
-       u64 a = *(u64 *)&l;
-       u64 b = *(u64 *)&r;
-
-       if (a < b)
+       if (l.pool < r.pool)
+               return -1;
+       if (l.pool > r.pool)
+               return 1;
+       if (l.seed < r.seed)
                return -1;
-       if (a > b)
+       if (l.seed > r.seed)
                return 1;
        return 0;
 }
 }
 
 static struct ceph_pg_mapping *__lookup_pg_mapping(struct rb_root *root,
-                                                  struct ceph_pg_v1 pgid)
+                                                  struct ceph_pg pgid)
 {
        struct rb_node *n = root->rb_node;
        struct ceph_pg_mapping *pg;
                } else if (c > 0) {
                        n = n->rb_right;
                } else {
-                       dout("__lookup_pg_mapping %llx got %p\n",
-                            *(u64 *)&pgid, pg);
+                       dout("__lookup_pg_mapping %lld.%x got %p\n",
+                            pgid.pool, pgid.seed, pg);
                        return pg;
                }
        }
        return NULL;
 }
 
-static int __remove_pg_mapping(struct rb_root *root, struct ceph_pg_v1 pgid)
+static int __remove_pg_mapping(struct rb_root *root, struct ceph_pg pgid)
 {
        struct ceph_pg_mapping *pg = __lookup_pg_mapping(root, pgid);
 
        if (pg) {
-               dout("__remove_pg_mapping %llx %p\n", *(u64 *)&pgid, pg);
+               dout("__remove_pg_mapping %lld.%x %p\n", pgid.pool, pgid.seed,
+                    pg);
                rb_erase(&pg->node, root);
                kfree(pg);
                return 0;
        }
-       dout("__remove_pg_mapping %llx dne\n", *(u64 *)&pgid);
+       dout("__remove_pg_mapping %lld.%x dne\n", pgid.pool, pgid.seed);
        return -ENOENT;
 }
 
        ceph_decode_32_safe(p, end, len, bad);
        for (i = 0; i < len; i++) {
                int n, j;
-               struct ceph_pg_v1 pgid;
+               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, sizeof(pgid));
+               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);
                n = ceph_decode_32(p);
                err = -EINVAL;
                if (n > (UINT_MAX - sizeof(*pg)) / sizeof(u32))
                err = __insert_pg_mapping(pg, &map->pg_temp);
                if (err)
                        goto bad;
-               dout(" added pg_temp %llx len %d\n", *(u64 *)&pgid, len);
+               dout(" added pg_temp %lld.%x len %d\n", pgid.pool, pgid.seed,
+                    len);
        }
 
        /* crush */
        while (len--) {
                struct ceph_pg_mapping *pg;
                int j;
-               struct ceph_pg_v1 pgid;
+               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, sizeof(pgid));
+               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);
 
                if (pglen) {
                                kfree(pg);
                                goto bad;
                        }
-                       dout(" added pg_temp %llx len %d\n", *(u64 *)&pgid,
-                            pglen);
+                       dout(" added pg_temp %lld.%x len %d\n", pgid.pool,
+                            pgid.seed, pglen);
                } else {
                        /* remove */
                        __remove_pg_mapping(&map->pg_temp, pgid);
                            struct ceph_osdmap *osdmap)
 {
        unsigned int num, num_mask;
-       struct ceph_pg_v1 pgid;
-       int poolid = le32_to_cpu(fl->fl_pg_pool);
+       struct ceph_pg pgid;
        struct ceph_pg_pool_info *pool;
-       unsigned int ps;
 
        BUG_ON(!osdmap);
 
-       pool = __lookup_pg_pool(&osdmap->pg_pools, poolid);
+       pgid.pool = le32_to_cpu(fl->fl_pg_pool);
+       pool = __lookup_pg_pool(&osdmap->pg_pools, pgid.pool);
        if (!pool)
                return -EIO;
-       ps = ceph_str_hash(pool->v.object_hash, oid, strlen(oid));
+       pgid.seed = ceph_str_hash(pool->v.object_hash, oid, strlen(oid));
        num = le32_to_cpu(pool->v.pg_num);
        num_mask = pool->pg_num_mask;
 
-       pgid.ps = cpu_to_le16(ps);
-       pgid.preferred = cpu_to_le16(-1);
-       pgid.pool = fl->fl_pg_pool;
-       dout("calc_object_layout '%s' pgid %d.%x\n", oid, poolid, ps);
+       dout("calc_object_layout '%s' pgid %lld.%x\n", oid, pgid.pool,
+            pgid.seed);
 
-       ol->ol_pgid = pgid;
+       ol->ol_pgid.ps = cpu_to_le16(pgid.seed);
+       ol->ol_pgid.pool = fl->fl_pg_pool;
+       ol->ol_pgid.preferred = cpu_to_le16(-1);
        ol->ol_stripe_unit = fl->fl_object_stripe_unit;
        return 0;
 }
  * Calculate raw osd vector for the given pgid.  Return pointer to osd
  * array, or NULL on failure.
  */
-static int *calc_pg_raw(struct ceph_osdmap *osdmap, struct ceph_pg_v1 pgid,
+static int *calc_pg_raw(struct ceph_osdmap *osdmap, struct ceph_pg pgid,
                        int *osds, int *num)
 {
        struct ceph_pg_mapping *pg;
        int ruleno;
        unsigned int poolid, ps, pps, t, r;
 
-       poolid = le32_to_cpu(pgid.pool);
-       ps = le16_to_cpu(pgid.ps);
+       poolid = pgid.pool;
+       ps = pgid.seed;
 
        pool = __lookup_pg_pool(&osdmap->pg_pools, poolid);
        if (!pool)
        /* pg_temp? */
        t = ceph_stable_mod(ps, le32_to_cpu(pool->v.pg_num),
                            pool->pgp_num_mask);
-       pgid.ps = cpu_to_le16(t);
+       pgid.seed = t;
        pg = __lookup_pg_mapping(&osdmap->pg_temp, pgid);
        if (pg) {
                *num = pg->len;
 /*
  * Return acting set for given pgid.
  */
-int ceph_calc_pg_acting(struct ceph_osdmap *osdmap, struct ceph_pg_v1 pgid,
+int ceph_calc_pg_acting(struct ceph_osdmap *osdmap, struct ceph_pg pgid,
                        int *acting)
 {
        int rawosds[CEPH_PG_MAX_SIZE], *osds;
 /*
  * Return primary osd for given pgid, or -1 if none.
  */
-int ceph_calc_pg_primary(struct ceph_osdmap *osdmap, struct ceph_pg_v1 pgid)
+int ceph_calc_pg_primary(struct ceph_osdmap *osdmap, struct ceph_pg pgid)
 {
        int rawosds[CEPH_PG_MAX_SIZE], *osds;
        int i, num = CEPH_PG_MAX_SIZE;