]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
osd: Reverse order of op_has_sufficient_caps and do_pg_op
authorBrad Hubbard <bhubbard@redhat.com>
Mon, 29 May 2017 09:25:43 +0000 (19:25 +1000)
committerBrad Hubbard <bhubbard@redhat.com>
Mon, 19 Jun 2017 05:23:17 +0000 (15:23 +1000)
Fixes: http://tracker.ceph.com/issues/19790
Signed-off-by: Brad Hubbard <bhubbard@redhat.com>
qa/suites/rados/singleton-nomsgr/all/pool-access.yaml [new file with mode: 0644]
qa/workunits/rados/test_pool_access.sh [new file with mode: 0755]
src/osd/PrimaryLogPG.cc

diff --git a/qa/suites/rados/singleton-nomsgr/all/pool-access.yaml b/qa/suites/rados/singleton-nomsgr/all/pool-access.yaml
new file mode 100644 (file)
index 0000000..d49a597
--- /dev/null
@@ -0,0 +1,9 @@
+roles:
+- [mon.a, mgr.x, osd.0, osd.1, client.0]
+tasks:
+- install:
+- ceph:
+- workunit:
+    clients:
+      all:
+        - rados/test_pool_access.sh
diff --git a/qa/workunits/rados/test_pool_access.sh b/qa/workunits/rados/test_pool_access.sh
new file mode 100755 (executable)
index 0000000..8597b71
--- /dev/null
@@ -0,0 +1,23 @@
+#!/bin/bash -x
+
+set -e
+
+expect_1()
+{
+  set -x
+  set +e
+  "$@"
+  if [ $? == 1 ]; then return 0; else return 1; fi
+}
+
+
+key=`ceph auth get-or-create-key client.poolaccess1 mon 'allow r' osd 'allow *'`
+rados --id poolaccess1 --key $key -p rbd ls
+
+key=`ceph auth get-or-create-key client.poolaccess2 mon 'allow r' osd 'allow * pool=nopool'`
+expect_1 rados --id poolaccess2 --key $key -p rbd ls
+
+key=`ceph auth get-or-create-key client.poolaccess3 mon 'allow r' osd 'allow rw pool=nopool'`
+expect_1 rados --id poolaccess3 --key $key -p rbd ls
+
+echo OK
index 3f5adc1f33d09b0d07da85b7d83ebcca97847fd8..b50624963a5c30fe6b3f297d4c2d8dc7da5e4008 100644 (file)
@@ -1877,15 +1877,15 @@ void PrimaryLogPG::do_op(OpRequestRef& op)
     }
   }
 
-  if (op->includes_pg_op()) {
-    return do_pg_op(op);
-  }
-
   if (!op_has_sufficient_caps(op)) {
     osd->reply_op_error(op, -EPERM);
     return;
   }
 
+  if (op->includes_pg_op()) {
+    return do_pg_op(op);
+  }
+
   // object name too long?
   if (m->get_oid().name.size() > cct->_conf->osd_max_object_name_len) {
     dout(4) << "do_op name is longer than "