X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=engines%2Fsg.c;h=790019e1d57fa48e7a635cecdc47dd5b6835cba3;hp=84c2afe6c354158f6edbbf98fb12f0e0de09d55c;hb=7101d9c24abec4be58a086d85d6d92ec6e6492e9;hpb=da751ca9665bcdeca56d2eec5b629a0953c07662 diff --git a/engines/sg.c b/engines/sg.c index 84c2afe6..790019e1 100644 --- a/engines/sg.c +++ b/engines/sg.c @@ -12,7 +12,6 @@ #include #include "../fio.h" -#include "../os.h" #ifdef FIO_HAVE_SGIO @@ -65,15 +64,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, r = 0; void *buf = sd->sgbuf; unsigned int i, events; + struct fio_file *f; /* * Fill in the file descriptors @@ -97,7 +92,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; @@ -106,7 +101,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); @@ -166,7 +161,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; } @@ -178,12 +173,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; } @@ -247,6 +242,8 @@ static int fio_sgio_queue(struct thread_data *td, struct io_u *io_u) struct sg_io_hdr *hdr = &io_u->hdr; int ret; + fio_ro_check(td, io_u); + ret = fio_sgio_doio(td, io_u, io_u->ddir == DDIR_SYNC); if (ret < 0) @@ -325,23 +322,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; } @@ -390,7 +387,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; }