X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=engines%2Fsg.c;h=3a6a2486b758df41ea749482c88efa91b2378ae4;hp=27139760ba5bd14354c0e8a6e8c5bec666938463;hb=b5af82930ccfd7dda6a1b11794efb452eb76d8dc;hpb=36167d82e5f49dee91c6d2cd426068edee90e36f diff --git a/engines/sg.c b/engines/sg.c index 27139760..3a6a2486 100644 --- a/engines/sg.c +++ b/engines/sg.c @@ -26,6 +26,7 @@ struct sgio_data { int *fd_flags; void *sgbuf; unsigned int bs; + int type_checked; }; static void sgio_hdr_init(struct sgio_data *sd, struct sg_io_hdr *hdr, @@ -95,9 +96,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; @@ -117,8 +118,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; @@ -162,7 +163,7 @@ static int fio_sgio_ioctl_doio(struct thread_data *td, ret = ioctl(f->fd, SG_IO, hdr); if (ret < 0) - return ret; + return -errno; return FIO_Q_COMPLETED; } @@ -179,7 +180,7 @@ 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; } @@ -253,7 +254,7 @@ static int fio_sgio_queue(struct thread_data *td, struct io_u *io_u) } if (io_u->error) { - td_verror(td, io_u->error); + td_verror(td, io_u->error, "xfer"); return FIO_Q_COMPLETED; } @@ -317,10 +318,7 @@ static void fio_sgio_cleanup(struct thread_data *td) static int fio_sgio_init(struct thread_data *td) { - struct fio_file *f = &td->files[0]; struct sgio_data *sd; - unsigned int bs; - int ret; sd = malloc(sizeof(*sd)); memset(sd, 0, sizeof(*sd)); @@ -337,25 +335,37 @@ static int fio_sgio_init(struct thread_data *td) td->io_ops->data = sd; + /* + * we want to do it, regardless of whether odirect is set or not + */ + td->override_sync = 1; + return 0; +} + +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 (ioctl(f->fd, BLKSSZGET, &bs) < 0) { - td_verror(td, errno); - goto err; + td_verror(td, errno, "ioctl"); + return 1; } } else if (td->filetype == FIO_TYPE_CHAR) { - int version; + int version, ret; if (ioctl(f->fd, SG_GET_VERSION_NUM, &version) < 0) { - td_verror(td, errno); - goto err; + td_verror(td, errno, "ioctl"); + return 1; } ret = fio_sgio_get_bs(td, &bs); if (ret) - goto err; + return 1; } else { log_err("ioengine sgio only works on block devices\n"); - goto err; + return 1; } sd->bs = bs; @@ -365,20 +375,24 @@ static int fio_sgio_init(struct thread_data *td) td->io_ops->event = NULL; } - /* - * we want to do it, regardless of whether odirect is set or not - */ - td->override_sync = 1; return 0; -err: - free(sd->events); - free(sd->cmds); - free(sd->fd_flags); - free(sd->pfds); - free(sd->sgbuf); - free(sd); - td->io_ops->data = NULL; - return 1; +} + +static int fio_sgio_open(struct thread_data *td, struct fio_file *f) +{ + struct sgio_data *sd = td->io_ops->data; + int ret; + + ret = generic_open_file(td, f); + if (ret) + return ret; + + if (!sd->type_checked && fio_sgio_type_check(td, f)) { + generic_close_file(td, f); + return 1; + } + + return 0; } static struct ioengine_ops ioengine = { @@ -390,6 +404,8 @@ static struct ioengine_ops ioengine = { .getevents = fio_sgio_getevents, .event = fio_sgio_event, .cleanup = fio_sgio_cleanup, + .open_file = fio_sgio_open, + .close_file = generic_close_file, .flags = FIO_SYNCIO | FIO_RAWIO, };