This simplifies/fixes endian conversions.
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();
* 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));
/*
* 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));
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()) {
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];
// 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;
}
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();
// 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);
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);
}
*/
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;
}