Accept -foo as well as --foo for options
[fio.git] / engines / sg.c
index 8d086bffe6cad7431cd9243932538d735e133cfa..b9033b8f7c2a0c8528b35d28f776ef62062028ad 100644 (file)
@@ -48,21 +48,6 @@ static void sgio_hdr_init(struct sgio_data *sd, struct sg_io_hdr *hdr,
        }
 }
 
-static int fio_sgio_ioctl_getevents(struct thread_data *td, int fio_unused min,
-                                   int max, struct timespec fio_unused *t)
-{
-       assert(max <= 1);
-
-       /*
-        * we can only have one finished io_u for sync io, since the depth
-        * is always 1
-        */
-       if (list_empty(&td->io_u_busylist))
-               return 0;
-
-       return 1;
-}
-
 static int pollin_events(struct pollfd *pfds, int fds)
 {
        int i;
@@ -110,9 +95,9 @@ static int fio_sgio_getevents(struct thread_data *td, int min, int max,
 
                        ret = poll(sd->pfds, td->nr_files, -1);
                        if (ret < 0) {
-                               td_verror(td, errno);
                                if (!r)
-                                       r = -1;
+                                       r = -errno;
+                               td_verror(td, errno, "poll");
                                break;
                        } else if (!ret)
                                continue;
@@ -132,8 +117,8 @@ re_read:
                        if (ret < 0) {
                                if (errno == EAGAIN)
                                        continue;
-                               td_verror(td, errno);
-                               r = -1;
+                               r = -errno;
+                               td_verror(td, errno, "read");
                                break;
                        } else if (ret) {
                                p += ret;
@@ -171,10 +156,15 @@ static int fio_sgio_ioctl_doio(struct thread_data *td,
 {
        struct sgio_data *sd = td->io_ops->data;
        struct sg_io_hdr *hdr = &io_u->hdr;
+       int ret;
 
        sd->events[0] = io_u;
 
-       return ioctl(f->fd, SG_IO, hdr);
+       ret = ioctl(f->fd, SG_IO, hdr);
+       if (ret < 0)
+               return -errno;
+
+       return FIO_Q_COMPLETED;
 }
 
 static int fio_sgio_rw_doio(struct fio_file *f, struct io_u *io_u, int sync)
@@ -189,10 +179,11 @@ static int fio_sgio_rw_doio(struct fio_file *f, struct io_u *io_u, int sync)
        if (sync) {
                ret = read(f->fd, hdr, sizeof(*hdr));
                if (ret < 0)
-                       return errno;
+                       return -errno;
+               return FIO_Q_COMPLETED;
        }
 
-       return 0;
+       return FIO_Q_QUEUED;
 }
 
 static int fio_sgio_doio(struct thread_data *td, struct io_u *io_u, int sync)
@@ -262,11 +253,11 @@ static int fio_sgio_queue(struct thread_data *td, struct io_u *io_u)
        }
 
        if (io_u->error) {
-               td_verror(td, io_u->error);
-               return io_u->error;
+               td_verror(td, io_u->error, "xfer");
+               return FIO_Q_COMPLETED;
        }
 
-       return 0;
+       return ret;
 }
 
 static struct io_u *fio_sgio_event(struct thread_data *td, int event)
@@ -348,14 +339,14 @@ static int fio_sgio_init(struct thread_data *td)
 
        if (td->filetype == FIO_TYPE_BD) {
                if (ioctl(f->fd, BLKSSZGET, &bs) < 0) {
-                       td_verror(td, errno);
+                       td_verror(td, errno, "ioctl");
                        goto err;
                }
        } else if (td->filetype == FIO_TYPE_CHAR) {
                int version;
 
                if (ioctl(f->fd, SG_GET_VERSION_NUM, &version) < 0) {
-                       td_verror(td, errno);
+                       td_verror(td, errno, "ioctl");
                        goto err;
                }
 
@@ -369,10 +360,10 @@ static int fio_sgio_init(struct thread_data *td)
 
        sd->bs = bs;
 
-       if (td->filetype == FIO_TYPE_BD)
-               td->io_ops->getevents = fio_sgio_ioctl_getevents;
-       else
-               td->io_ops->getevents = fio_sgio_getevents;
+       if (td->filetype == FIO_TYPE_BD) {
+               td->io_ops->getevents = NULL;
+               td->io_ops->event = NULL;
+       }
 
        /*
         * we want to do it, regardless of whether odirect is set or not