}
}
-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;
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;
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;
{
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)
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)
io_u->error = EIO;
}
- return io_u->error;
+ if (io_u->error) {
+ td_verror(td, io_u->error, "xfer");
+ return FIO_Q_COMPLETED;
+ }
+
+ return ret;
}
static struct io_u *fio_sgio_event(struct thread_data *td, int event)
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;
}
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