rbd: remove duplicate _fio_rbd_connect
[fio.git] / engines / rbd.c
index aa50c801c3c831eec13a5c212fdc836c7f85e675..ee7a7cd4cbb4680a43eebee5c59535a27fdf593b 100644 (file)
@@ -36,6 +36,7 @@ struct rbd_data {
        struct io_u **aio_events;
        struct io_u **sort_events;
        int fd; /* add for poll */
+       bool connected;
 };
 
 struct rbd_options {
@@ -111,6 +112,8 @@ static int _fio_setup_rbd_data(struct thread_data *td,
        if (!rbd)
                goto failed;
 
+       rbd->connected = false;
+
        /* add for poll, init fd: -1 */
        rbd->fd = -1;
 
@@ -529,6 +532,10 @@ failed:
 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) {
@@ -589,13 +596,19 @@ static int fio_rbd_setup(struct thread_data *td)
                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,
@@ -613,7 +626,6 @@ static int fio_rbd_setup(struct thread_data *td)
        /* disconnect, then we were only connected to determine
         * the size of the RBD.
         */
-       _fio_rbd_disconnect(rbd);
        return 0;
 
 disconnect: