int rbd_create(rados_ioctx_t io, const char *name, uint64_t size, int *order);
int rbd_create2(rados_ioctx_t io, const char *name, uint64_t size,
uint64_t features, int *order);
+int rbd_create3(rados_ioctx_t io, const char *name, uint64_t size,
+ uint64_t features, int *order,
+ uint64_t stripe_unit, uint64_t stripe_count);
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 create(IoCtx& io_ctx, const char *name, uint64_t size, int *order);
int create2(IoCtx& io_ctx, const char *name, uint64_t size,
uint64_t features, int *order);
+ int create3(IoCtx& io_ctx, const char *name, uint64_t size,
+ uint64_t features, int *order,
+ uint64_t stripe_unit, uint64_t stripe_count);
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);
header_oid = old_header_name(name);
}
+ if (stripe_unit == 0 || stripe_count == 0) {
+ stripe_unit = 1ull << order;
+ stripe_count = 1;
+ }
+
return 0;
}
}
int create(IoCtx& io_ctx, const char *imgname, uint64_t size,
- bool old_format, uint64_t features, int *order)
+ bool old_format, uint64_t features, int *order,
+ uint64_t stripe_unit, uint64_t stripe_count)
{
CephContext *cct = (CephContext *)io_ctx.cct();
ldout(cct, 20) << "create " << &io_ctx << " name = " << imgname
<< " size = " << size << " old_format = " << old_format
<< " features = " << features << " order = " << *order
+ << " stripe_unit = " << stripe_unit
+ << " stripe_count = " << stripe_count
<< dendl;
if (!*order)
*order = RBD_DEFAULT_OBJ_ORDER;
+ // normalize for default striping
+ if (stripe_unit == (1ull << *order) && stripe_count == 1) {
+ stripe_unit = 0;
+ stripe_count = 0;
+ }
+ if ((stripe_unit || stripe_count) &&
+ (features & RBD_FEATURE_STRIPINGV2) == 0)
+ return -EINVAL;
+ if ((stripe_unit && !stripe_count) ||
+ (!stripe_unit && stripe_count))
+ return -EINVAL;
+
if (old_format) {
+ if (stripe_unit && stripe_unit != (1ull << *order))
+ return -EINVAL;
+ if (stripe_count && stripe_count != 1)
+ return -EINVAL;
+
ldout(cct, 2) << "adding rbd image to directory..." << dendl;
r = tmap_set(io_ctx, imgname);
if (r < 0) {
oss << RBD_DATA_PREFIX << id;
r = cls_client::create_image(&io_ctx, header_name(id), size, *order,
features, oss.str());
+ if (r == 0 &&
+ (stripe_unit || stripe_count) &&
+ (stripe_count != 1 || stripe_unit != (1ull<<*order))) {
+ r = cls_client::set_stripe_unit_count(&io_ctx, header_name(id), stripe_unit, stripe_count);
+ }
}
if (r < 0) {
if (!order)
order = p_imctx->order;
- r = create(c_ioctx, c_name, size, false, features, &order);
+ r = create(c_ioctx, c_name, size, false, features, &order, p_imctx->stripe_unit, p_imctx->stripe_count);
if (r < 0) {
lderr(cct) << "error creating child: " << cpp_strerror(r) << dendl;
goto err_close_parent;
int order = ictx->order;
r = create(dest_md_ctx, destname, src_size, ictx->old_format,
- ictx->features, &order);
+ ictx->features, &order, ictx->stripe_unit, ictx->stripe_count);
if (r < 0) {
lderr(cct) << "header creation failed" << dendl;
return r;
int list_children(ImageCtx *ictx,
std::set<pair<std::string, std::string> > & names);
int create(librados::IoCtx& io_ctx, const char *imgname, uint64_t size,
- bool old_format, uint64_t features, int *order);
+ bool old_format, uint64_t features, int *order,
+ 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);
int RBD::create(IoCtx& io_ctx, const char *name, uint64_t size, int *order)
{
- return librbd::create(io_ctx, name, size, true, 0, order);
+ return librbd::create(io_ctx, name, size, true, 0, order, 0, 0);
}
int RBD::create2(IoCtx& io_ctx, const char *name, uint64_t size,
uint64_t features, int *order)
{
- return librbd::create(io_ctx, name, size, false, features, order);
+ return librbd::create(io_ctx, name, size, false, features, order, 0, 0);
+ }
+
+ int RBD::create3(IoCtx& io_ctx, const char *name, uint64_t size,
+ uint64_t features, int *order, uint64_t stripe_unit,
+ uint64_t stripe_count)
+ {
+ return librbd::create(io_ctx, name, size, false, features, order, stripe_unit, stripe_count);
}
int RBD::clone(IoCtx& p_ioctx, const char *p_name, const char *p_snap_name,
{
librados::IoCtx io_ctx;
librados::IoCtx::from_rados_ioctx_t(p, io_ctx);
- return librbd::create(io_ctx, name, size, true, 0, order);
+ return librbd::create(io_ctx, name, size, true, 0, order, 0, 0);
}
extern "C" int rbd_create2(rados_ioctx_t p, const char *name,
{
librados::IoCtx io_ctx;
librados::IoCtx::from_rados_ioctx_t(p, io_ctx);
- return librbd::create(io_ctx, name, size, false, features, order);
+ return librbd::create(io_ctx, name, size, false, features, order, 0, 0);
+}
+
+extern "C" int rbd_create3(rados_ioctx_t p, const char *name,
+ uint64_t size, uint64_t features,
+ int *order,
+ uint64_t stripe_unit, uint64_t stripe_count)
+{
+ librados::IoCtx io_ctx;
+ librados::IoCtx::from_rados_ioctx_t(p, io_ctx);
+ return librbd::create(io_ctx, name, size, false, features, order, stripe_unit, stripe_count);
}
extern "C" int rbd_clone(rados_ioctx_t p_ioctx, const char *p_name,