From 4daddf0564dcd548ecc7c214ab9a41fc12ba71c0 Mon Sep 17 00:00:00 2001 From: Ilya Dryomov Date: Tue, 19 Feb 2019 16:07:22 +0100 Subject: [PATCH] librados: don't claim ObjectOperation::cmpext() buffer 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 --- src/include/rados/librados.hpp | 2 +- src/librados/librados_cxx.cc | 5 +++-- src/test/librados_test_stub/LibradosTestStub.cc | 3 ++- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/include/rados/librados.hpp b/src/include/rados/librados.hpp index c4a87aa2697e..081ccb3e1c24 100644 --- a/src/include/rados/librados.hpp +++ b/src/include/rados/librados.hpp @@ -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); diff --git a/src/librados/librados_cxx.cc b/src/librados/librados_cxx.cc index 601141670871..c174c7d58a79 100644 --- a/src/librados/librados_cxx.cc +++ b/src/librados/librados_cxx.cc @@ -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) diff --git a/src/test/librados_test_stub/LibradosTestStub.cc b/src/test/librados_test_stub/LibradosTestStub.cc index 78a290a3ac5e..bd9a8f1860dc 100644 --- a/src/test/librados_test_stub/LibradosTestStub.cc +++ b/src/test/librados_test_stub/LibradosTestStub.cc @@ -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(impl); ObjectOperationTestImpl op = boost::bind(&TestIoCtxImpl::cmpext, _1, _2, off, cmp_bl); if (prval != NULL) { -- 2.47.3