]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mon: don't require OSD W for MRemoveSnaps
authorJohn Spray <john.spray@redhat.com>
Mon, 16 Nov 2015 10:57:56 +0000 (10:57 +0000)
committerAbhishek Varshney <abhishek.varshney@flipkart.com>
Fri, 29 Jan 2016 10:19:34 +0000 (15:49 +0530)
Use ability to execute "osd pool rmsnap" command
as a signal that the client should be permitted
to send MRemoveSnaps too.

Note that we don't also require the W ability,
unlike Monitor::_allowed_command -- this is slightly
more permissive handling, but anyone crafting caps
that explicitly permit "osd pool rmsnap" needs to
know what they are doing.

Fixes: #13777
Signed-off-by: John Spray <john.spray@redhat.com>
(cherry picked from commit 0b474c52abd3d528c041544f73b1d27d7d1b1320)

src/mon/MonCap.cc
src/mon/OSDMonitor.cc

index 989893b20269ac66a6669b728eefb04c18df7a89..a2540b56411c304c0bd22fffd6a1372ca2a2b9c3 100644 (file)
@@ -134,6 +134,8 @@ void MonCapGrant::expand_profile(EntityName name) const
     profile_grants.push_back(MonCapGrant("mds", MON_CAP_ALL));
     profile_grants.push_back(MonCapGrant("mon", MON_CAP_R));
     profile_grants.push_back(MonCapGrant("osd", MON_CAP_R));
+    // This command grant is checked explicitly in MRemoveSnaps handling
+    profile_grants.push_back(MonCapGrant("osd pool rmsnap"));
     profile_grants.push_back(MonCapGrant("log", MON_CAP_W));
   }
   if (profile == "osd" || profile == "mds" || profile == "mon") {
index 9ebb34960f495e46d05c0db58e53ee6c015a285a..bb7f9b622180fdf2a2e19f65c68ddc3c893b24f1 100644 (file)
@@ -2271,7 +2271,8 @@ bool OSDMonitor::preprocess_remove_snaps(MonOpRequestRef op)
   MonSession *session = m->get_session();
   if (!session)
     goto ignore;
-  if (!session->is_capable("osd", MON_CAP_R | MON_CAP_W)) {
+  if (!session->caps.is_capable(g_ceph_context, session->entity_name,
+        "osd", "osd pool rmsnap", {}, true, true, false)) {
     dout(0) << "got preprocess_remove_snaps from entity with insufficient caps "
            << session->caps << dendl;
     goto ignore;