]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librados: don't claim ObjectOperation::cmpext() buffer
authorIlya Dryomov <idryomov@gmail.com>
Tue, 19 Feb 2019 15:07:22 +0000 (16:07 +0100)
committerIlya Dryomov <idryomov@gmail.com>
Tue, 19 Feb 2019 19:06:02 +0000 (20:06 +0100)
This is counter-intuitive and doesn't match the behavior of either
other compare ops (cmpxattr, omap_cmp) or write ops.

Fixes: http://tracker.ceph.com/issues/38383
Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
src/include/rados/librados.hpp
src/librados/librados_cxx.cc
src/test/librados_test_stub/LibradosTestStub.cc

index c4a87aa2697e24eaacd997062a10e607b5c6f86d..081ccb3e1c247b95229e2572ab9d8d529cf7da69 100644 (file)
@@ -303,7 +303,7 @@ namespace librados
     //flag mean ObjectOperationFlags
     void set_op_flags2(int flags);
 
-    void cmpext(uint64_t off, bufferlist& cmp_bl, int *prval);
+    void cmpext(uint64_t off, const bufferlist& cmp_bl, int *prval);
     void cmpxattr(const char *name, uint8_t op, const bufferlist& val);
     void cmpxattr(const char *name, uint8_t op, uint64_t v);
     void exec(const char *cls, const char *method, bufferlist& inbl);
index 601141670871f3eb317175e91695bdd8bea37200..c174c7d58a79669e76b1962f3bb92b7af3a0178d 100644 (file)
@@ -115,11 +115,12 @@ void librados::ObjectOperation::set_op_flags2(int flags)
 }
 
 void librados::ObjectOperation::cmpext(uint64_t off,
-                                       bufferlist &cmp_bl,
+                                       const bufferlist &cmp_bl,
                                        int *prval)
 {
   ::ObjectOperation *o = &impl->o;
-  o->cmpext(off, cmp_bl, prval);
+  bufferlist c = cmp_bl;
+  o->cmpext(off, c, prval);
 }
 
 void librados::ObjectOperation::cmpxattr(const char *name, uint8_t op, const bufferlist& v)
index 78a290a3ac5e9d45040d45d1441cd080c4dcd5f9..bd9a8f1860dc29b5662023c3a52c065f5ea75075 100644 (file)
@@ -811,7 +811,8 @@ size_t ObjectOperation::size() {
   return o->ops.size();
 }
 
-void ObjectOperation::cmpext(uint64_t off, bufferlist& cmp_bl, int *prval) {
+void ObjectOperation::cmpext(uint64_t off, const bufferlist& cmp_bl,
+                             int *prval) {
   TestObjectOperationImpl *o = reinterpret_cast<TestObjectOperationImpl*>(impl);
   ObjectOperationTestImpl op = boost::bind(&TestIoCtxImpl::cmpext, _1, _2, off, cmp_bl);
   if (prval != NULL) {