From: Jianpeng Ma Date: Thu, 18 Dec 2014 02:50:44 +0000 (+0800) Subject: librados: avoid memcopy for rados_getxattr. X-Git-Tag: v0.92~30^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=42dc93708a1cd6f43a4fb18947dfdb07d693720c;p=ceph.git librados: avoid memcopy for rados_getxattr. When call rados_getxattr, pass user buff to libardos to avoid memcopy. This operation like rados_read. Signed-off-by: Jianpeng Ma --- diff --git a/src/librados/IoCtxImpl.cc b/src/librados/IoCtxImpl.cc index bd410412618f..5cebf62aea9c 100644 --- a/src/librados/IoCtxImpl.cc +++ b/src/librados/IoCtxImpl.cc @@ -982,7 +982,7 @@ int librados::IoCtxImpl::getxattr(const object_t& oid, ::ObjectOperation rd; prepare_assert_ops(&rd); rd.getxattr(name, &bl, NULL); - int r = operate_read(oid, &rd, NULL); + int r = operate_read(oid, &rd, &bl); if (r < 0) return r; diff --git a/src/librados/librados.cc b/src/librados/librados.cc index 8a98bac61f75..93d41c843c96 100644 --- a/src/librados/librados.cc +++ b/src/librados/librados.cc @@ -3167,13 +3167,15 @@ extern "C" int rados_getxattr(rados_ioctx_t io, const char *o, const char *name, int ret; object_t oid(o); bufferlist bl; + bl.push_back(buffer::create_static(len, buf)); ret = ctx->getxattr(oid, name, bl); if (ret >= 0) { if (bl.length() > len) { tracepoint(librados, rados_getxattr_exit, -ERANGE, buf, 0); return -ERANGE; } - bl.copy(0, bl.length(), buf); + if (bl.c_str() != buf) + bl.copy(0, bl.length(), buf); ret = bl.length(); }