sg engine: fix old comment
[fio.git] / engines / sg.c
index 3a6a2486b758df41ea749482c88efa91b2378ae4..8856c6f9dc6c98c874c0a51dcd90daf51fadfacf 100644 (file)
@@ -1,5 +1,7 @@
 /*
- * scsi generic sg v3 io engine
+ * sg engine
+ *
+ * IO engine that uses the Linux SG v3 interface to talk to SCSI devices
  *
  */
 #include <stdio.h>
@@ -63,14 +65,11 @@ static int pollin_events(struct pollfd *pfds, int fds)
 static int fio_sgio_getevents(struct thread_data *td, int min, int max,
                              struct timespec fio_unused *t)
 {
-       /*
-        * normally hard coding &td->files[0] is a bug that needs to be fixed,
-        * but it's ok here as all files should point to the same device.
-        */
-       struct fio_file *f = &td->files[0];
        struct sgio_data *sd = td->io_ops->data;
-       int left = max, ret, events, i, r = 0;
+       int left = max, ret, r = 0;
        void *buf = sd->sgbuf;
+       unsigned int i, events;
+       struct fio_file *f;
 
        /*
         * Fill in the file descriptors
@@ -94,7 +93,7 @@ static int fio_sgio_getevents(struct thread_data *td, int min, int max,
                        if (!min)
                                break;
 
-                       ret = poll(sd->pfds, td->nr_files, -1);
+                       ret = poll(sd->pfds, td->o.nr_files, -1);
                        if (ret < 0) {
                                if (!r)
                                        r = -errno;
@@ -103,7 +102,7 @@ static int fio_sgio_getevents(struct thread_data *td, int min, int max,
                        } else if (!ret)
                                continue;
 
-                       if (pollin_events(sd->pfds, td->nr_files))
+                       if (pollin_events(sd->pfds, td->o.nr_files))
                                break;
                } while (1);
 
@@ -163,7 +162,7 @@ static int fio_sgio_ioctl_doio(struct thread_data *td,
 
        ret = ioctl(f->fd, SG_IO, hdr);
        if (ret < 0)
-               return -errno;
+               return ret;
 
        return FIO_Q_COMPLETED;
 }
@@ -175,12 +174,12 @@ static int fio_sgio_rw_doio(struct fio_file *f, struct io_u *io_u, int sync)
 
        ret = write(f->fd, hdr, sizeof(*hdr));
        if (ret < 0)
-               return errno;
+               return ret;
 
        if (sync) {
                ret = read(f->fd, hdr, sizeof(*hdr));
                if (ret < 0)
-                       return -errno;
+                       return ret;
                return FIO_Q_COMPLETED;
        }
 
@@ -191,7 +190,7 @@ static int fio_sgio_doio(struct thread_data *td, struct io_u *io_u, int sync)
 {
        struct fio_file *f = io_u->file;
 
-       if (td->filetype == FIO_TYPE_BD)
+       if (f->filetype == FIO_TYPE_BD)
                return fio_sgio_ioctl_doio(td, f, io_u);
 
        return fio_sgio_rw_doio(f, io_u, sync);
@@ -322,23 +321,23 @@ static int fio_sgio_init(struct thread_data *td)
 
        sd = malloc(sizeof(*sd));
        memset(sd, 0, sizeof(*sd));
-       sd->cmds = malloc(td->iodepth * sizeof(struct sgio_cmd));
-       memset(sd->cmds, 0, td->iodepth * sizeof(struct sgio_cmd));
-       sd->events = malloc(td->iodepth * sizeof(struct io_u *));
-       memset(sd->events, 0, td->iodepth * sizeof(struct io_u *));
-       sd->pfds = malloc(sizeof(struct pollfd) * td->nr_files);
-       memset(sd->pfds, 0, sizeof(struct pollfd) * td->nr_files);
-       sd->fd_flags = malloc(sizeof(int) * td->nr_files);
-       memset(sd->fd_flags, 0, sizeof(int) * td->nr_files);
-       sd->sgbuf = malloc(sizeof(struct sg_io_hdr) * td->iodepth);
-       memset(sd->sgbuf, 0, sizeof(struct sg_io_hdr) * td->iodepth);
+       sd->cmds = malloc(td->o.iodepth * sizeof(struct sgio_cmd));
+       memset(sd->cmds, 0, td->o.iodepth * sizeof(struct sgio_cmd));
+       sd->events = malloc(td->o.iodepth * sizeof(struct io_u *));
+       memset(sd->events, 0, td->o.iodepth * sizeof(struct io_u *));
+       sd->pfds = malloc(sizeof(struct pollfd) * td->o.nr_files);
+       memset(sd->pfds, 0, sizeof(struct pollfd) * td->o.nr_files);
+       sd->fd_flags = malloc(sizeof(int) * td->o.nr_files);
+       memset(sd->fd_flags, 0, sizeof(int) * td->o.nr_files);
+       sd->sgbuf = malloc(sizeof(struct sg_io_hdr) * td->o.iodepth);
+       memset(sd->sgbuf, 0, sizeof(struct sg_io_hdr) * td->o.iodepth);
 
        td->io_ops->data = sd;
 
        /*
         * we want to do it, regardless of whether odirect is set or not
         */
-       td->override_sync = 1;
+       td->o.override_sync = 1;
        return 0;
 }
 
@@ -347,12 +346,12 @@ static int fio_sgio_type_check(struct thread_data *td, struct fio_file *f)
        struct sgio_data *sd = td->io_ops->data;
        unsigned int bs;
 
-       if (td->filetype == FIO_TYPE_BD) {
+       if (f->filetype == FIO_TYPE_BD) {
                if (ioctl(f->fd, BLKSSZGET, &bs) < 0) {
                        td_verror(td, errno, "ioctl");
                        return 1;
                }
-       } else if (td->filetype == FIO_TYPE_CHAR) {
+       } else if (f->filetype == FIO_TYPE_CHAR) {
                int version, ret;
 
                if (ioctl(f->fd, SG_GET_VERSION_NUM, &version) < 0) {
@@ -370,7 +369,7 @@ static int fio_sgio_type_check(struct thread_data *td, struct fio_file *f)
 
        sd->bs = bs;
 
-       if (td->filetype == FIO_TYPE_BD) {
+       if (f->filetype == FIO_TYPE_BD) {
                td->io_ops->getevents = NULL;
                td->io_ops->event = NULL;
        }
@@ -387,7 +386,7 @@ static int fio_sgio_open(struct thread_data *td, struct fio_file *f)
        if (ret)
                return ret;
 
-       if (!sd->type_checked && fio_sgio_type_check(td, f)) {
+       if (sd && !sd->type_checked && fio_sgio_type_check(td, f)) {
                generic_close_file(td, f);
                return 1;
        }