#include <rbd/librbd.h>
#include "../fio.h"
+#include "../optgroup.h"
struct fio_rbd_iou {
struct io_u *io_u;
struct rbd_options {
void *pad;
+ char *cluster_name;
char *rbd_name;
char *pool_name;
char *client_name;
};
static struct fio_option options[] = {
+ {
+ .name = "clustername",
+ .lname = "ceph cluster name",
+ .type = FIO_OPT_STR_STORE,
+ .help = "Cluster name for ceph",
+ .off1 = offsetof(struct rbd_options, cluster_name),
+ .category = FIO_OPT_C_ENGINE,
+ .group = FIO_OPT_G_RBD,
+ },
{
.name = "rbdname",
.lname = "rbd engine rbdname",
struct rbd_options *o = td->eo;
int r;
- r = rados_create(&rbd->cluster, o->client_name);
+ if (o->cluster_name) {
+ char *client_name = NULL;
+
+ /*
+ * If we specify cluser name, the rados_creat2
+ * will not assume 'client.'. name is considered
+ * as a full type.id namestr
+ */
+ if (!index(o->client_name, '.')) {
+ client_name = calloc(1, strlen("client.") +
+ strlen(o->client_name) + 1);
+ strcat(client_name, "client.");
+ o->client_name = strcat(client_name, o->client_name);
+ }
+ r = rados_create2(&rbd->cluster, o->cluster_name,
+ o->client_name, 0);
+ } else
+ r = rados_create(&rbd->cluster, o->client_name);
+
if (r < 0) {
log_err("rados_create failed.\n");
goto failed_early;
* a specific error. So we have to assume that it can't do
* partial completions.
*/
- fri->io_complete = 1;
-
ret = rbd_aio_get_return_value(fri->completion);
if (ret < 0) {
io_u->error = ret;
io_u->resid = io_u->xfer_buflen;
} else
io_u->error = 0;
+
+ fri->io_complete = 1;
}
static struct io_u *fio_rbd_event(struct thread_data *td, int event)