]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
librados: avoid memcopy for rados_getxattr.
authorJianpeng Ma <jianpeng.ma@intel.com>
Thu, 18 Dec 2014 02:50:44 +0000 (10:50 +0800)
committerJianpeng Ma <jianpeng.ma@intel.com>
Thu, 18 Dec 2014 02:50:44 +0000 (10:50 +0800)
When call rados_getxattr, pass user buff to libardos to avoid memcopy.
This operation like rados_read.
Signed-off-by: Jianpeng Ma <jianpeng.ma@intel.com>
src/librados/IoCtxImpl.cc
src/librados/librados.cc

index bd410412618f22e5b1a528101b5d21d05168fa95..5cebf62aea9c81962cbbdbd5d62e7921923e8e52 100644 (file)
@@ -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;
 
index 8a98bac61f75c0f41e5ca0d71caa17f63ecbbf29..93d41c843c96a76006e9ee9426129743f36800eb 100644 (file)
@@ -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();
   }