reply_command((MMonCommand *)m, -EACCES, rs, 0);
EXIT_NOT_ADMIN;
}
+ fill_caps(m);
handle_command((MMonCommand*)m);
break;
case MSG_OSD_PGTEMP:
ALLOW_MESSAGES_FROM(CEPH_ENTITY_TYPE_OSD);
ALLOW_CAPS(PAXOS_OSDMAP, MON_CAP_R);
+ fill_caps(m);
paxos_service[PAXOS_OSDMAP]->dispatch((PaxosServiceMessage*)m);
break;
case MSG_REMOVE_SNAPS:
ALLOW_CAPS(PAXOS_OSDMAP, MON_CAP_RW);
+ fill_caps(m);
paxos_service[PAXOS_OSDMAP]->dispatch((PaxosServiceMessage*)m);
break;
case MSG_MDS_BEACON:
case MSG_MDS_OFFLOAD_TARGETS:
ALLOW_CAPS(PAXOS_MDSMAP, MON_CAP_RW);
+ fill_caps(m);
paxos_service[PAXOS_MDSMAP]->dispatch((PaxosServiceMessage*)m);
break;
case MSG_MON_GLOBAL_ID:
case CEPH_MSG_AUTH:
/* no need to check caps here */
+ fill_caps(m);
paxos_service[PAXOS_AUTH]->dispatch((PaxosServiceMessage*)m);
break;
case MSG_PGSTATS:
case MSG_GETPOOLSTATS:
ALLOW_CAPS(PAXOS_PGMAP, MON_CAP_R);
+ fill_caps(m);
paxos_service[PAXOS_PGMAP]->dispatch((PaxosServiceMessage*)m);
break;
case MSG_POOLOP:
ALLOW_CAPS(PAXOS_OSDMAP, MON_CAP_RX);
+ fill_caps(m);
paxos_service[PAXOS_OSDMAP]->dispatch((PaxosServiceMessage*)m);
break;
// log
case MSG_LOG:
ALLOW_CAPS(PAXOS_LOG, MON_CAP_RW);
+ fill_caps(m);
paxos_service[PAXOS_LOG]->dispatch((PaxosServiceMessage*)m);
break;
if (IS_NOT_ADMIN) {
EXIT_NOT_ADMIN;
}
+ fill_caps(m);
handle_observe((MMonObserve *)m);
break;
return ret;
}
+//if we can, fill in the PaxosServiceMessage's caps field.
+void Monitor::fill_caps(Message *m)
+{
+ PaxosServiceMessage *msg = (PaxosServiceMessage *) m;
+ if (msg->caps) return; //already filled in!
+ Session *s = NULL;
+ if (m->get_connection()) {
+ s = (Session *) m->get_connection()->get_priv();
+ }
+ if (s) msg->caps = &s->caps;
+}
+
void Monitor::handle_subscribe(MMonSubscribe *m)
{
dout(10) << "handle_subscribe " << *m << dendl;
//ms_dispatch handles a lot of logic and we want to reuse it
//on forwarded messages, so we let it be non-locking as well
bool ms_dispatch(Message *m, bool do_lock=true);
- bool ms_dispatch(Message *m) { ms_dispatch(m, true); }
+ bool ms_dispatch(Message *m) { return ms_dispatch(m, true); }
+ //fill in caps field if possible
+ void fill_caps(Message *m);
bool ms_get_authorizer(int dest_type, AuthAuthorizer **authorizer, bool force_new);
bool ms_verify_authorizer(Connection *con, int peer_type,
int protocol, bufferlist& authorizer_data, bufferlist& authorizer_reply,