{
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();
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);
// 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()
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;
}
// 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?
atomic_t nref;
int num_pg;
string name;
+ uint64_t auid;
pg_pool_t info;
SnapContext snapc; // the default pool snapc, ready to go.
interval_set<snapid_t> cached_removed_snaps; // current removed_snaps set
interval_set<snapid_t> 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() {