Based on pr: https://github.com/ceph/ceph/pull/10019.
This drops the original writesame2 api.
Signed-off-by: Gui Hecheng <guihecheng@cmss.chinamobile.com>
Signed-off-by: Mingxin Liu <mingxin@xsky.com>
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);
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,
/* @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
*
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)
{
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;
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)
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;
)
)
+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,
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,