// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- // vim: ts=8 sw=2 smarttab #include "test/librbd/test_support.h" #include "include/rbd_types.h" #include bool get_features(uint64_t *features) { const char *c = getenv("RBD_FEATURES"); if (c == NULL) { return false; } std::stringstream ss(c); if (!(ss >> *features)) { return false; } return true; } bool is_feature_enabled(uint64_t feature) { uint64_t features; return (get_features(&features) && (features & feature) == feature); } int create_image_full_pp(librbd::RBD &rbd, librados::IoCtx &ioctx, const std::string &name, uint64_t size, uint64_t features, bool old_format, int *order) { if (old_format) { librados::Rados rados(ioctx); int r = rados.conf_set("rbd_default_format", "1"); if (r < 0) { return r; } return rbd.create(ioctx, name.c_str(), size, order); } else if ((features & RBD_FEATURE_STRIPINGV2) != 0) { uint64_t stripe_unit = IMAGE_STRIPE_UNIT; if (*order) { // use a conservative stripe_unit for non default order stripe_unit = (1ull << (*order-1)); } printf("creating image with stripe unit: %" PRIu64 ", stripe count: %" PRIu64 "\n", stripe_unit, IMAGE_STRIPE_COUNT); return rbd.create3(ioctx, name.c_str(), size, features, order, stripe_unit, IMAGE_STRIPE_COUNT); } else { return rbd.create2(ioctx, name.c_str(), size, features, order); } } int create_image_pp(librbd::RBD &rbd, librados::IoCtx &ioctx, const std::string &name, uint64_t size) { int order = 0; uint64_t features = 0; if (!get_features(&features)) { // ensure old-format tests actually use the old format librados::Rados rados(ioctx); int r = rados.conf_set("rbd_default_format", "1"); if (r < 0) { return r; } return rbd.create(ioctx, name.c_str(), size, &order); } else { return rbd.create2(ioctx, name.c_str(), size, features, &order); } } int clone_image_pp(librbd::RBD &rbd, librbd::Image &p_image, librados::IoCtx &p_ioctx, const char *p_name, const char *p_snap_name, librados::IoCtx &c_ioctx, const char *c_name, uint64_t features) { uint64_t stripe_unit = p_image.get_stripe_unit(); uint64_t stripe_count = p_image.get_stripe_count(); librbd::image_info_t p_info; int r = p_image.stat(p_info, sizeof(p_info)); if (r < 0) { return r; } int c_order = p_info.order; return rbd.clone2(p_ioctx, p_name, p_snap_name, c_ioctx, c_name, features, &c_order, stripe_unit, stripe_count); } int get_image_id(librbd::Image &image, std::string *image_id) { int r = image.get_id(image_id); if (r < 0) { return r; } return 0; } int create_image_data_pool(librados::Rados &rados, std::string &data_pool, bool *created) { std::string pool; int r = rados.conf_get("rbd_default_data_pool", pool); if (r != 0) { return r; } else if (pool.empty()) { return 0; } r = rados.pool_create(pool.c_str()); if ((r == 0) || (r == -EEXIST)) { data_pool = pool; *created = (r == 0); return 0; } librados::IoCtx ioctx; r = rados.ioctx_create(pool.c_str(), ioctx); if (r < 0) { return r; } ioctx.application_enable("rbd", true); return r; }