]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: convert ceph_pg union to struct
authorSage Weil <sage@newdream.net>
Wed, 4 Nov 2009 19:37:41 +0000 (11:37 -0800)
committerSage Weil <sage@newdream.net>
Wed, 4 Nov 2009 19:37:41 +0000 (11:37 -0800)
This simplifies/fixes endian conversions.

src/client/SyntheticClient.cc
src/include/rados.h
src/mon/PGMonitor.cc
src/osd/OSD.cc
src/osd/OSDMap.h
src/osd/osd_types.h

index e3fbf6a3f165cab65e3568a1739722a994020468..726310f81ae8260776d885d17e5f39344d7f849d 100644 (file)
@@ -1631,7 +1631,7 @@ int SyntheticClient::dump_placement(string& fn) {
   for (vector<ObjectExtent>::iterator i = extents.begin(); 
        i != extents.end(); ++i) {
     
-    int osd = client->osdmap->get_pg_primary(pg_t(i->layout.ol_pgid.v));
+    int osd = client->osdmap->get_pg_primary(pg_t(i->layout.ol_pgid));
 
     // run through all the buffer extents
     for (map<__u32,__u32>::iterator j = i ->buffer_extents.begin();
index a48cf4ae391e6078df09cc7cb2a697bd42e0977b..85bdef78d142d0452d5cd62a94f11c5c500307a6 100644 (file)
@@ -55,13 +55,10 @@ struct ceph_timespec {
  * placement group.
  * we encode this into one __le64.
  */
-union ceph_pg {
-       __u64 pg64;
-       struct {
-               __s16 preferred; /* preferred primary osd */
-               __u16 ps;        /* placement seed */
-               __u32 pool;      /* object pool */
-       } __attribute__ ((packed)) pg;
+struct ceph_pg {
+       __le16 preferred; /* preferred primary osd */
+       __le16 ps;        /* placement seed */
+       __le32 pool;      /* object pool */
 } __attribute__ ((packed));
 
 /*
@@ -117,7 +114,7 @@ static inline int ceph_stable_mod(int x, int b, int bmask)
  * object layout - how a given object should be stored.
  */
 struct ceph_object_layout {
-       __le64 ol_pgid;           /* raw pg, with _full_ ps precision. */
+       struct ceph_pg ol_pgid;   /* raw pg, with _full_ ps precision. */
        __le32 ol_stripe_unit;    /* for per-object parity, if any */
 } __attribute__ ((packed));
 
index 2da9b67592fde7203f964622261c324e2013ae70..5cc7d197621ebc70c6a4b412e19629d00e304590 100644 (file)
@@ -472,9 +472,9 @@ void PGMonitor::register_pg(pg_pool_t& pool, pg_t pgid, epoch_t epoch, bool new_
     parent = pgid;
     while (1) {
       // remove most significant bit
-      int msb = pool.calc_bits_of(parent.u.pg.ps);
+      int msb = pool.calc_bits_of(parent.v.ps);
       if (!msb) break;
-      parent.u.pg.ps &= ~(1<<(msb-1));
+      parent.v.ps = parent.v.ps & ~(1<<(msb-1));
       split_bits++;
       dout(10) << " is " << pgid << " parent " << parent << " ?" << dendl;
       //if (parent.u.pg.ps < mon->osdmon->osdmap.get_pgp_num()) {
index 897f100f2b62e096ab377ae54b128963f25b3787..ba208fe62285ae21b07f50e615afb7afcd940cf1 100644 (file)
@@ -2562,7 +2562,7 @@ void OSD::split_pg(PG *parent, map<pg_t,PG*>& children, ObjectStore::Transaction
   for (vector<sobject_t>::iterator p = olist.begin(); p != olist.end(); p++) {
     sobject_t poid = *p;
     ceph_object_layout l = osdmap->make_object_layout(poid.oid, parentid.pool(), parentid.preferred());
-    pg_t pgid = osdmap->raw_pg_to_pg(pg_t(le64_to_cpu(l.ol_pgid)));
+    pg_t pgid = osdmap->raw_pg_to_pg(pg_t(l.ol_pgid));
     if (pgid != parentid) {
       dout(20) << "  moving " << poid << " from " << parentid << " -> " << pgid << dendl;
       PG *child = children[pgid];
index 637a57ac14d49ef458af5490d375b363d42b154a..9a0cf99a4de0962f5d4d2365a7606eb30f556a19 100644 (file)
@@ -673,7 +673,7 @@ private:
     // construct object layout
     pg_t pgid = pg_t(ps, pg_pool, preferred);
     ceph_object_layout layout;
-    layout.ol_pgid = pgid.u.pg64;
+    layout.ol_pgid = pgid.v;
     layout.ol_stripe_unit = object_stripe_unit;
     return layout;
   }
@@ -688,7 +688,7 @@ private:
     pg_pool_t pool = get_pg_pool(pg_pool);
 
     pg_t pgid = pg_t(seed, pg_pool, -1);
-    layout.ol_pgid = pgid.u.pg64;
+    layout.ol_pgid = pgid.v;
     layout.ol_stripe_unit = 0;
 
     return pool.get_pg_num();
index 2886314cafac4f3eb3f4aafbc4c9680da1c479b4..5c6757dc4b092a8c622ab07037e497391fc1b7fb 100644 (file)
@@ -109,27 +109,25 @@ enum {
 
 // placement group id
 struct pg_t {
-  union ceph_pg u;
+  struct ceph_pg v;
 
-  pg_t() { u.pg64 = 0; }
-  pg_t(const pg_t& o) { u.pg64 = o.u.pg64; }
+  pg_t() { memset(&v, 0, sizeof(v)); }
+  pg_t(const pg_t& o) { v = o.v; }
   pg_t(ps_t seed, int pool, int pref) {
-    u.pg64 = 0;
-    u.pg.ps = seed;
-    u.pg.pool = pool;
-    u.pg.preferred = pref;   // hack: avoid negative.
-    assert(sizeof(u.pg) == sizeof(u.pg64));
+    v.ps = seed;
+    v.pool = pool;
+    v.preferred = pref;   // hack: avoid negative.
   }
-  pg_t(uint64_t v) { u.pg64 = v; }
+  pg_t(uint64_t n) { *(__le64*)&v = n; }
   pg_t(const ceph_pg& cpg) {
-    u = cpg;
+    v = cpg;
   }
 
-  ps_t ps() { return u.pg.ps; }
-  int pool() { return u.pg.pool; }
-  int preferred() { return u.pg.preferred; }   // hack: avoid negative.
+  ps_t ps() { return v.ps; }
+  int pool() { return v.pool; }
+  int preferred() { return (__s16)v.preferred; }   // hack: avoid negative.
   
-  operator uint64_t() const { return u.pg64; }
+  operator uint64_t() const { return *(__le64*)&v; }
 
   /*coll_t to_coll() const {
     return coll_t(u.pg64, 0); 
@@ -151,22 +149,20 @@ struct pg_t {
     int r = sscanf(s, "%d.%xp%d", &pool, &ps, &preferred);
     if (r < 2)
       return false;
-    u.pg.pool = pool;
-    u.pg.ps = ps;
+    v.pool = pool;
+    v.ps = ps;
     if (r == 3)
-      u.pg.preferred = preferred;
+      v.preferred = preferred;
     else
-      u.pg.preferred = -1;
+      v.preferred = -1;
     return true;
   }
 
 } __attribute__ ((packed));
 
-inline void encode(pg_t pgid, bufferlist& bl) { encode_raw(pgid.u.pg64, bl); }
+inline void encode(pg_t pgid, bufferlist& bl) { encode_raw(pgid.v, bl); }
 inline void decode(pg_t &pgid, bufferlist::iterator& p) { 
-  __u64 v;
-  decode_raw(v, p); 
-  pgid.u.pg64 = v;
+  decode_raw(pgid.v, p); 
 }
 
 
@@ -628,9 +624,9 @@ struct pg_pool_t {
    */
   pg_t raw_pg_to_pg(pg_t pg) const {
     if (pg.preferred() >= 0 && v.lpg_num)
-      pg.u.pg.ps = ceph_stable_mod(pg.ps(), v.lpg_num, lpg_num_mask);
+      pg.v.ps = ceph_stable_mod(pg.ps(), v.lpg_num, lpg_num_mask);
     else
-      pg.u.pg.ps = ceph_stable_mod(pg.ps(), v.pg_num, pg_num_mask);
+      pg.v.ps = ceph_stable_mod(pg.ps(), v.pg_num, pg_num_mask);
     return pg;
   }