struct io_u **aio_events;
struct io_u **sort_events;
int fd; /* add for poll */
+ bool connected;
};
struct rbd_options {
if (!rbd)
goto failed;
+ rbd->connected = false;
+
/* add for poll, init fd: -1 */
rbd->fd = -1;
static int fio_rbd_init(struct thread_data *td)
{
int r;
+ struct rbd_data *rbd = td->io_ops_data;
+
+ if (rbd->connected)
+ return 0;
r = _fio_rbd_connect(td);
if (r) {
log_err("fio_rbd_connect failed.\n");
goto cleanup;
}
+ rbd->connected = true;
/* get size of the RADOS block device */
r = rbd_stat(rbd->image, &info, sizeof(info));
if (r < 0) {
log_err("rbd_status failed.\n");
goto disconnect;
+ } else if (info.size == 0) {
+ log_err("image size should be larger than zero.\n");
+ r = -EINVAL;
+ goto disconnect;
}
+
dprint(FD_IO, "rbd-engine: image size: %lu\n", info.size);
/* taken from "net" engine. Pretend we deal with files,
/* disconnect, then we were only connected to determine
* the size of the RBD.
*/
- _fio_rbd_disconnect(rbd);
return 0;
disconnect: