From: Gui Hecheng Date: Tue, 21 Feb 2017 06:18:08 +0000 (+0800) Subject: librbd: implement writesame API X-Git-Tag: v12.0.1~250^2~9 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=4014bae7bf63bfb75e1c8a9b54743a4e2a34dabc;p=ceph.git librbd: implement writesame API Based on pr: https://github.com/ceph/ceph/pull/10019. This drops the original writesame2 api. Signed-off-by: Gui Hecheng Signed-off-by: Mingxin Liu --- diff --git a/src/include/rbd/librbd.h b/src/include/rbd/librbd.h index c003c414b6e2..460c1d2debf0 100644 --- a/src/include/rbd/librbd.h +++ b/src/include/rbd/librbd.h @@ -638,6 +638,8 @@ CEPH_RBD_API ssize_t rbd_write(rbd_image_t image, uint64_t ofs, size_t len, CEPH_RBD_API ssize_t rbd_write2(rbd_image_t image, uint64_t ofs, size_t len, const char *buf, int op_flags); CEPH_RBD_API int rbd_discard(rbd_image_t image, uint64_t ofs, uint64_t len); +CEPH_RBD_API ssize_t rbd_writesame(rbd_image_t image, uint64_t ofs, size_t len, + const char *buf, size_t data_len, int op_flags); CEPH_RBD_API int rbd_aio_write(rbd_image_t image, uint64_t off, size_t len, const char *buf, rbd_completion_t c); @@ -660,6 +662,9 @@ CEPH_RBD_API int rbd_aio_readv(rbd_image_t image, const struct iovec *iov, int iovcnt, uint64_t off, rbd_completion_t c); CEPH_RBD_API int rbd_aio_discard(rbd_image_t image, uint64_t off, uint64_t len, rbd_completion_t c); +CEPH_RBD_API int rbd_aio_writesame(rbd_image_t image, uint64_t off, size_t len, + const char *buf, size_t data_len, + rbd_completion_t c, int op_flags); CEPH_RBD_API int rbd_aio_create_completion(void *cb_arg, rbd_callback_t complete_cb, diff --git a/src/include/rbd/librbd.hpp b/src/include/rbd/librbd.hpp index 66b62fd5cb66..44f741fd6244 100644 --- a/src/include/rbd/librbd.hpp +++ b/src/include/rbd/librbd.hpp @@ -339,11 +339,14 @@ public: /* @param op_flags see librados.h constants beginning with LIBRADOS_OP_FLAG */ ssize_t write2(uint64_t ofs, size_t len, ceph::bufferlist& bl, int op_flags); int discard(uint64_t ofs, uint64_t len); + ssize_t writesame(uint64_t ofs, size_t len, ceph::bufferlist &bl, int op_flags); int aio_write(uint64_t off, size_t len, ceph::bufferlist& bl, RBD::AioCompletion *c); /* @param op_flags see librados.h constants beginning with LIBRADOS_OP_FLAG */ int aio_write2(uint64_t off, size_t len, ceph::bufferlist& bl, RBD::AioCompletion *c, int op_flags); + int aio_writesame(uint64_t off, size_t len, ceph::bufferlist& bl, + RBD::AioCompletion *c, int op_flags); /** * read async from image * diff --git a/src/librbd/librbd.cc b/src/librbd/librbd.cc index 4b8cb47fe846..9c7c6182500f 100644 --- a/src/librbd/librbd.cc +++ b/src/librbd/librbd.cc @@ -1336,6 +1336,21 @@ namespace librbd { return r; } + ssize_t Image::writesame(uint64_t ofs, size_t len, bufferlist& bl, int op_flags) + { + ImageCtx *ictx = (ImageCtx *)ctx; + tracepoint(librbd, writesame_enter, ictx, ictx->name.c_str(), ictx->snap_name.c_str(), + ictx->read_only, ofs, len, bl.length() <= 0 ? NULL : bl.c_str(), bl.length(), + op_flags); + if (bl.length() <= 0 || len % bl.length()) { + tracepoint(librbd, writesame_exit, -EINVAL); + return -EINVAL; + } + int r = ictx->io_work_queue->writesame(ofs, len, bufferlist{bl}, op_flags); + tracepoint(librbd, writesame_exit, r); + return r; + } + int Image::aio_write(uint64_t off, size_t len, bufferlist& bl, RBD::AioCompletion *c) { @@ -1421,6 +1436,24 @@ namespace librbd { return 0; } + int Image::aio_writesame(uint64_t off, size_t len, bufferlist& bl, + RBD::AioCompletion *c, int op_flags) + { + ImageCtx *ictx = (ImageCtx *)ctx; + tracepoint(librbd, aio_writesame_enter, ictx, ictx->name.c_str(), ictx->snap_name.c_str(), + ictx->read_only, off, len, bl.length() <= len ? NULL : bl.c_str(), bl.length(), + c->pc, op_flags); + if (bl.length() <= 0 || len % bl.length()) { + tracepoint(librbd, aio_writesame_exit, -EINVAL); + return -EINVAL; + } + ictx->io_work_queue->aio_writesame(get_aio_completion(c), off, len, + bufferlist{bl}, op_flags); + tracepoint(librbd, aio_writesame_exit, 0); + return 0; + } + + int Image::invalidate_cache() { ImageCtx *ictx = (ImageCtx *)ctx; @@ -2902,6 +2935,25 @@ extern "C" int rbd_discard(rbd_image_t image, uint64_t ofs, uint64_t len) return r; } +extern "C" ssize_t rbd_writesame(rbd_image_t image, uint64_t ofs, size_t len, + const char *buf, size_t data_len, int op_flags) +{ + librbd::ImageCtx *ictx = (librbd::ImageCtx *)image; + tracepoint(librbd, writesame_enter, ictx, ictx->name.c_str(), ictx->snap_name.c_str(), + ictx->read_only, ofs, len, data_len <= 0 ? NULL : buf, data_len, op_flags); + + if (data_len <= 0 || len % data_len) { + tracepoint(librbd, writesame_exit, -EINVAL); + return -EINVAL; + } + + bufferlist bl; + bl.push_back(create_write_raw(ictx, buf, data_len)); + int r = ictx->io_work_queue->writesame(ofs, len, std::move(bl), op_flags); + tracepoint(librbd, writesame_exit, r); + return r; +} + extern "C" int rbd_aio_create_completion(void *cb_arg, rbd_callback_t complete_cb, rbd_completion_t *c) @@ -3071,6 +3123,29 @@ extern "C" int rbd_aio_flush(rbd_image_t image, rbd_completion_t c) return 0; } +extern "C" int rbd_aio_writesame(rbd_image_t image, uint64_t off, size_t len, + const char *buf, size_t data_len, rbd_completion_t c, + int op_flags) +{ + librbd::ImageCtx *ictx = (librbd::ImageCtx *)image; + librbd::RBD::AioCompletion *comp = (librbd::RBD::AioCompletion *)c; + tracepoint(librbd, aio_writesame_enter, ictx, ictx->name.c_str(), ictx->snap_name.c_str(), + ictx->read_only, off, len, data_len <= 0 ? NULL : buf, data_len, comp->pc, + op_flags); + + if (data_len <= 0 || len % data_len) { + tracepoint(librbd, aio_writesame_exit, -EINVAL); + return -EINVAL; + } + + bufferlist bl; + bl.push_back(create_write_raw(ictx, buf, data_len)); + ictx->io_work_queue->aio_writesame(get_aio_completion(comp), off, len, + std::move(bl), op_flags); + tracepoint(librbd, aio_writesame_exit, 0); + return 0; +} + extern "C" int rbd_invalidate_cache(rbd_image_t image) { librbd::ImageCtx *ictx = (librbd::ImageCtx *)image; diff --git a/src/tracing/librbd.tp b/src/tracing/librbd.tp index 0652210076eb..b3e1bd3740ca 100644 --- a/src/tracing/librbd.tp +++ b/src/tracing/librbd.tp @@ -172,6 +172,38 @@ TRACEPOINT_EVENT(librbd, open_image_exit, ) ) +TRACEPOINT_EVENT(librbd, writesame_enter, + TP_ARGS( + void*, imagectx, + const char*, name, + const char*, snap_name, + char, read_only, + uint64_t, off, + size_t, len, + const char*, buf, + size_t, data_len, + int, op_flags), + TP_FIELDS( + ctf_integer_hex(void*, imagectx, imagectx) + ctf_string(name, name) + ctf_string(snap_name, snap_name) + ctf_integer(char, read_only, read_only) + ctf_integer(uint64_t, off, off) + ctf_integer(size_t, len, len) + ctf_integer(size_t, data_len, data_len) + ceph_ctf_sequence(unsigned char, buf, buf, size_t, data_len) + ctf_integer(int, op_flags, op_flags) + ) +) + +TRACEPOINT_EVENT(librbd, writesame_exit, + TP_ARGS( + ssize_t, retval), + TP_FIELDS( + ctf_integer(ssize_t, retval, retval) + ) +) + TRACEPOINT_EVENT(librbd, aio_open_image_enter, TP_ARGS( void*, imagectx, @@ -923,6 +955,40 @@ TRACEPOINT_EVENT(librbd, aio_complete_exit, TP_FIELDS() ) +TRACEPOINT_EVENT(librbd, aio_writesame_enter, + TP_ARGS( + void*, imagectx, + const char*, name, + const char*, snap_name, + char, read_only, + uint64_t, off, + size_t, len, + const char*, buf, + size_t, data_len, + const void*, completion, + int, op_flags), + TP_FIELDS( + ctf_integer_hex(void*, imagectx, imagectx) + ctf_string(name, name) + ctf_string(snap_name, snap_name) + ctf_integer(char, read_only, read_only) + ctf_integer(uint64_t, off, off) + ctf_integer(size_t, len, len) + ctf_integer(size_t, data_len, data_len) + ceph_ctf_sequence(unsigned char, buf, buf, size_t, data_len) + ctf_integer_hex(const void*, completion, completion) + ctf_integer(int, op_flags, op_flags) + ) +) + +TRACEPOINT_EVENT(librbd, aio_writesame_exit, + TP_ARGS( + ssize_t, retval), + TP_FIELDS( + ctf_integer(ssize_t, retval, retval) + ) +) + TRACEPOINT_EVENT(librbd, clone_enter, TP_ARGS( const char*, parent_pool_name,