X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=engines%2Fsg.c;h=f955c20a74ca770f3a69b6d06361e0ca0cb3c485;hp=d32007022aeb8388c6e0fcfef0d5f4ee50393acc;hb=755200a326a33e5e19b16dfd5e013dd98bcf1916;hpb=dc0deca2b89bea896e8eb8133961cec68c4ba8b9 diff --git a/engines/sg.c b/engines/sg.c index d3200702..f955c20a 100644 --- a/engines/sg.c +++ b/engines/sg.c @@ -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); break; } else if (!ret) continue; @@ -132,8 +117,8 @@ re_read: if (ret < 0) { if (errno == EAGAIN) continue; + r = -errno; td_verror(td, errno); - r = -1; 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) @@ -261,7 +252,12 @@ static int fio_sgio_queue(struct thread_data *td, struct io_u *io_u) io_u->error = EIO; } - return io_u->error; + if (io_u->error) { + td_verror(td, io_u->error); + return FIO_Q_COMPLETED; + } + + return ret; } static struct io_u *fio_sgio_event(struct thread_data *td, int event) @@ -364,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