From: Sage Weil Date: Sat, 6 Oct 2012 00:59:09 +0000 (-0700) Subject: librbd: allow striping to be specified for clones X-Git-Tag: v0.55~250^2~14 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=a736cb028e6bd39ce83eaa3c508a42d452bc9a5a;p=ceph.git librbd: allow striping to be specified for clones Signed-off-by: Sage Weil --- diff --git a/src/include/rbd/librbd.h b/src/include/rbd/librbd.h index 551184d4c4f0..732c25682de1 100644 --- a/src/include/rbd/librbd.h +++ b/src/include/rbd/librbd.h @@ -93,6 +93,10 @@ int rbd_create3(rados_ioctx_t io, const char *name, uint64_t size, int rbd_clone(rados_ioctx_t p_ioctx, const char *p_name, const char *p_snapname, rados_ioctx_t c_ioctx, const char *c_name, uint64_t features, int *c_order); +int rbd_clone2(rados_ioctx_t p_ioctx, const char *p_name, + const char *p_snapname, rados_ioctx_t c_ioctx, + const char *c_name, uint64_t features, int *c_order, + uint64_t stripe_unit, int stripe_count); int rbd_remove(rados_ioctx_t io, const char *name); int rbd_remove_with_progress(rados_ioctx_t io, const char *name, librbd_progress_fn_t cb, void *cbdata); diff --git a/src/include/rbd/librbd.hpp b/src/include/rbd/librbd.hpp index fe6bd92d4428..202ed628a38b 100644 --- a/src/include/rbd/librbd.hpp +++ b/src/include/rbd/librbd.hpp @@ -82,6 +82,9 @@ public: int clone(IoCtx& p_ioctx, const char *p_name, const char *p_snapname, IoCtx& c_ioctx, const char *c_name, uint64_t features, int *c_order); + int clone2(IoCtx& p_ioctx, const char *p_name, const char *p_snapname, + IoCtx& c_ioctx, const char *c_name, uint64_t features, + int *c_order, uint64_t stripe_unit, int stripe_count); int remove(IoCtx& io_ctx, const char *name); int remove_with_progress(IoCtx& io_ctx, const char *name, ProgressContext& pctx); int rename(IoCtx& src_io_ctx, const char *srcname, const char *destname); diff --git a/src/librbd/internal.cc b/src/librbd/internal.cc index c97eeac0a8d0..7dc55e837c4a 100644 --- a/src/librbd/internal.cc +++ b/src/librbd/internal.cc @@ -777,13 +777,17 @@ reprotect_and_return_err: */ int clone(IoCtx& p_ioctx, const char *p_name, const char *p_snap_name, IoCtx& c_ioctx, const char *c_name, - uint64_t features, int *c_order) + uint64_t features, int *c_order, + uint64_t stripe_unit, int stripe_count) { CephContext *cct = (CephContext *)p_ioctx.cct(); ldout(cct, 20) << "clone " << &p_ioctx << " name " << p_name << " snap " << p_snap_name << "to child " << &c_ioctx << " name " << c_name << " features = " << features << " order = " - << *c_order << dendl; + << *c_order + << " stripe_unit = " << stripe_unit + << " stripe_count = " << stripe_count + << dendl; if (features & ~RBD_FEATURES_ALL) { lderr(cct) << "librbd does not support requested features" << dendl; @@ -851,7 +855,7 @@ reprotect_and_return_err: if (!order) order = p_imctx->order; - r = create(c_ioctx, c_name, size, false, features, &order, p_imctx->stripe_unit, p_imctx->stripe_count); + r = create(c_ioctx, c_name, size, false, features, &order, stripe_unit, stripe_count); if (r < 0) { lderr(cct) << "error creating child: " << cpp_strerror(r) << dendl; goto err_close_parent; diff --git a/src/librbd/internal.h b/src/librbd/internal.h index 51a76a4fa267..55f6dfb2e8f2 100644 --- a/src/librbd/internal.h +++ b/src/librbd/internal.h @@ -83,7 +83,8 @@ namespace librbd { uint64_t stripe_unit, uint64_t stripe_count); int clone(IoCtx& p_ioctx, const char *p_name, const char *p_snap_name, IoCtx& c_ioctx, const char *c_name, - uint64_t features, int *c_order); + uint64_t features, int *c_order, + uint64_t stripe_unit, int stripe_count); int rename(librados::IoCtx& io_ctx, const char *srcname, const char *dstname); int info(ImageCtx *ictx, image_info_t& info, size_t image_size); int get_old_format(ImageCtx *ictx, uint8_t *old); diff --git a/src/librbd/librbd.cc b/src/librbd/librbd.cc index f37eadfea400..46b29ad5cdb2 100644 --- a/src/librbd/librbd.cc +++ b/src/librbd/librbd.cc @@ -123,7 +123,15 @@ namespace librbd { int *c_order) { return librbd::clone(p_ioctx, p_name, p_snap_name, c_ioctx, c_name, - features, c_order); + features, c_order, 0, 0); + } + + int RBD::clone2(IoCtx& p_ioctx, const char *p_name, const char *p_snap_name, + IoCtx& c_ioctx, const char *c_name, uint64_t features, + int *c_order, uint64_t stripe_unit, int stripe_count) + { + return librbd::clone(p_ioctx, p_name, p_snap_name, c_ioctx, c_name, + features, c_order, stripe_unit, stripe_count); } int RBD::remove(IoCtx& io_ctx, const char *name) @@ -515,7 +523,19 @@ extern "C" int rbd_clone(rados_ioctx_t p_ioctx, const char *p_name, librados::IoCtx::from_rados_ioctx_t(p_ioctx, p_ioc); librados::IoCtx::from_rados_ioctx_t(c_ioctx, c_ioc); return librbd::clone(p_ioc, p_name, p_snap_name, c_ioc, c_name, - features, c_order); + features, c_order, 0, 0); +} + +extern "C" int rbd_clone2(rados_ioctx_t p_ioctx, const char *p_name, + const char *p_snap_name, rados_ioctx_t c_ioctx, + const char *c_name, uint64_t features, int *c_order, + uint64_t stripe_unit, int stripe_count) +{ + librados::IoCtx p_ioc, c_ioc; + librados::IoCtx::from_rados_ioctx_t(p_ioctx, p_ioc); + librados::IoCtx::from_rados_ioctx_t(c_ioctx, c_ioc); + return librbd::clone(p_ioc, p_name, p_snap_name, c_ioc, c_name, + features, c_order, stripe_unit, stripe_count); } extern "C" int rbd_remove(rados_ioctx_t p, const char *name)