From d847a4fd3d3b94718cf9f44de51fcc88464eeafa Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Fri, 2 Jul 2010 11:00:49 -0700 Subject: [PATCH] osd: fix null pg deref, put auid in PGPool, cleanup. Signed-off-by: Sage Weil --- src/osd/OSD.cc | 36 +++++++++++++++++++----------------- src/osd/PG.h | 7 ++++++- 2 files changed, 25 insertions(+), 18 deletions(-) diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index 6991eef4cb8e5..06fffaddc2557 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -774,7 +774,8 @@ PGPool* OSD::_get_pool(int id) { PGPool *p = _lookup_pool(id); if (!p) { - p = new PGPool(id, osdmap->get_pool_name(id)); + p = new PGPool(id, osdmap->get_pool_name(id), + osdmap->get_pg_pool(id)->v.auid ); pool_map[id] = p; p->get(); @@ -2256,6 +2257,10 @@ void OSD::handle_osd_map(MOSDMap *m) continue; } PGPool *pool = p->second; + + // make sure auid stays up to date + pool->auid = pi->v.auid; + if (pi->get_snap_epoch() == cur+1) { pi->build_removed_snaps(pool->newly_removed_snaps); pool->newly_removed_snaps.subtract(pool->cached_removed_snaps); @@ -4200,12 +4205,17 @@ void OSD::handle_op(MOSDOp *op) // get and lock *pg. PG *pg = _have_pg(pgid) ? _lookup_lock_pg(pgid):0; + if (!pg) { + dout(7) << "hit non-existent pg " << pgid + << ", waiting" << dendl; + waiting_for_pg[pgid].push_back(op); + return; + } - string pool_name = pg->pool->name; - int perm = caps.get_pool_cap(pool_name, osdmap->get_pg_pool(pool)->v.auid); + int perm = caps.get_pool_cap(pg->pool->name, pg->pool->auid); - dout(10) << "request for pool=" << pool << " owner=" - << osdmap->get_pg_pool(pool)->v.auid + dout(10) << "request for pool=" << pool << " (" << pg->pool->name + << ") owner=" << pg->pool->auid << " perm=" << perm << " may_read=" << op->may_read() << " may_write=" << op->may_write() @@ -4214,11 +4224,11 @@ void OSD::handle_op(MOSDOp *op) int err = -EPERM; if (op->may_read() && !(perm & OSD_POOL_CAP_R)) { - dout(0) << "no READ permission to access pool " << pool_name << dendl; + dout(0) << "no READ permission to access pool " << pg->pool->name << dendl; } else if (op->may_write() && !(perm & OSD_POOL_CAP_W)) { - dout(0) << "no WRITE permission to access pool " << pool_name << dendl; + dout(0) << "no WRITE permission to access pool " << pg->pool->name << dendl; } else if (op->require_exec_caps() && !(perm & OSD_POOL_CAP_X)) { - dout(0) << "no EXEC permission to access pool " << pool_name << dendl; + dout(0) << "no EXEC permission to access pool " << pg->pool->name << dendl; } else { err = 0; } @@ -4245,15 +4255,7 @@ void OSD::handle_op(MOSDOp *op) // we don't need encoded payload anymore op->clear_payload(); - // have pg? - if (!pg) { - dout(7) << "hit non-existent pg " - << pgid - << ", waiting" << dendl; - waiting_for_pg[pgid].push_back(op); - return; - } - + // pg must be active. if (!pg->is_active()) { // replay? diff --git a/src/osd/PG.h b/src/osd/PG.h index b2c12c3436465..6157aee0f43d0 100644 --- a/src/osd/PG.h +++ b/src/osd/PG.h @@ -51,6 +51,7 @@ struct PGPool { atomic_t nref; int num_pg; string name; + uint64_t auid; pg_pool_t info; SnapContext snapc; // the default pool snapc, ready to go. @@ -58,7 +59,11 @@ struct PGPool { interval_set cached_removed_snaps; // current removed_snaps set interval_set newly_removed_snaps; // newly removed in the last epoch - PGPool(int i, const char *_name) : id(i), num_pg(0) { if (_name) name = _name; } + PGPool(int i, const char *_name, uint64_t au) : + id(i), num_pg(0), auid(au) { + if (_name) + name = _name; + } void get() { nref.inc(); } void put() { -- 2.39.5