int rados_write(rados_ioctx_t io, const char *oid, const char *buf, size_t len, uint64_t off);
int rados_write_full(rados_ioctx_t io, const char *oid, const char *buf, size_t len, uint64_t off);
+int rados_clone_range(rados_ioctx_t io, const char *dst, uint64_t dst_off,
+ const char *src, uint64_t src_off, size_t len);
int rados_append(rados_ioctx_t io, const char *oid, const char *buf, size_t len);
int rados_read(rados_ioctx_t io, const char *oid, char *buf, size_t len, uint64_t off);
int rados_remove(rados_ioctx_t io, const char *oid);
int write(const std::string& oid, bufferlist& bl, size_t len, uint64_t off);
int append(const std::string& oid, bufferlist& bl, size_t len);
int write_full(const std::string& oid, bufferlist& bl);
+ int clone_range(const std::string& dst_oid, uint64_t dst_off,
+ const std::string& src_oid, uint64_t src_off,
+ size_t len);
int read(const std::string& oid, bufferlist& bl, size_t len, uint64_t off);
int remove(const std::string& oid);
int trunc(const std::string& oid, uint64_t size);
-
-
librados::WatchCtx::
~WatchCtx()
{
int write(IoCtxImpl& io, const object_t& oid, bufferlist& bl, size_t len, uint64_t off);
int append(IoCtxImpl& io, const object_t& oid, bufferlist& bl, size_t len);
int write_full(IoCtxImpl& io, const object_t& oid, bufferlist& bl);
+ int clone_range(IoCtxImpl& io, const object_t& dst_oid, uint64_t dst_offset,
+ const object_t& src_oid, uint64_t src_offset, uint64_t len);
int read(IoCtxImpl& io, const object_t& oid, bufferlist& bl, size_t len, uint64_t off);
int mapext(IoCtxImpl& io, const object_t& oid, uint64_t off, size_t len, std::map<uint64_t,uint64_t>& m);
int sparse_read(IoCtxImpl& io, const object_t& oid, std::map<uint64_t,uint64_t>& m, bufferlist& bl,
return r;
}
+int librados::RadosClient::
+clone_range(IoCtxImpl& io, const object_t& dst_oid, uint64_t dst_offset, const object_t& src_oid, uint64_t src_offset, uint64_t len)
+{
+ utime_t ut = g_clock.now();
+
+ /* can't write to a snapshot */
+ if (io.snap_seq != CEPH_NOSNAP)
+ return -EROFS;
+
+ Mutex mylock("RadosClient::clone_range::mylock");
+ Cond cond;
+ bool done;
+ int r;
+ Context *onack = new C_SafeCond(&mylock, &cond, &done, &r);
+ eversion_t ver;
+
+ bufferlist outbl;
+
+ lock.Lock();
+ ::SnapContext snapc;
+ ::ObjectOperation wr;
+ if (io.assert_ver) {
+ wr.assert_version(io.assert_ver);
+ io.assert_ver = 0;
+ }
+ wr.clone_range(src_oid, src_offset, len, dst_offset);
+ objecter->mutate(dst_oid, io.oloc, wr, snapc, ut, 0, onack, NULL, &ver);
+ lock.Unlock();
+
+ mylock.Lock();
+ while (!done)
+ cond.Wait(mylock);
+ mylock.Unlock();
+
+ set_sync_op_version(io, ver);
+
+ return r;
+}
+
int librados::RadosClient::
operate(IoCtxImpl& io, const object_t& oid, ::ObjectOperation *o, bufferlist *pbl)
{
return io_ctx_impl->client->write_full(*io_ctx_impl, obj, bl);
}
+int librados::IoCtx::
+clone_range(const std::string& dst_oid, uint64_t dst_off,
+ const std::string& src_oid, uint64_t src_off,
+ size_t len)
+{
+ object_t src(src_oid), dst(dst_oid);
+ return io_ctx_impl->client->clone_range(*io_ctx_impl, dst, dst_off, src, src_off, len);
+}
+
int librados::IoCtx::
read(const std::string& oid, bufferlist& bl, size_t len, uint64_t off)
{
return ctx->client->write_full(*ctx, oid, bl);
}
+extern "C" int rados_clone_range(rados_ioctx_t io, const char *dst, uint64_t dst_off,
+ const char *src, uint64_t src_off, size_t len)
+{
+ librados::IoCtxImpl *ctx = (librados::IoCtxImpl *)io;
+ object_t dst_oid(dst), src_oid(src);
+ return ctx->client->clone_range(*ctx, dst_oid, dst_off, src_oid, src_off, len);
+}
+
extern "C" int rados_trunc(rados_ioctx_t io, const char *o, uint64_t size)
{
librados::IoCtxImpl *ctx = (librados::IoCtxImpl *)io;