X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;f=engines%2Fsg.c;h=88d91258d22c89e78298c6084e7dd277b51aa23e;hb=93eee04aef9ed39070ce2e69bd1f661a95b1d50a;hp=a9ff93a30280a5b95ceeb68bf04d83ce21bff4fe;hpb=e7d2e61694c62b90a2fb84c012b4edcc1973d72c;p=fio.git diff --git a/engines/sg.c b/engines/sg.c index a9ff93a3..88d91258 100644 --- a/engines/sg.c +++ b/engines/sg.c @@ -166,7 +166,7 @@ static int fio_sgio_ioctl_doio(struct thread_data *td, return FIO_Q_COMPLETED; } -static int fio_sgio_rw_doio(struct fio_file *f, struct io_u *io_u, int sync) +static int fio_sgio_rw_doio(struct fio_file *f, struct io_u *io_u, int do_sync) { struct sg_io_hdr *hdr = &io_u->hdr; int ret; @@ -175,7 +175,7 @@ static int fio_sgio_rw_doio(struct fio_file *f, struct io_u *io_u, int sync) if (ret < 0) return ret; - if (sync) { + if (do_sync) { ret = read(f->fd, hdr, sizeof(*hdr)); if (ret < 0) return ret; @@ -185,14 +185,14 @@ static int fio_sgio_rw_doio(struct fio_file *f, struct io_u *io_u, int sync) return FIO_Q_QUEUED; } -static int fio_sgio_doio(struct thread_data *td, struct io_u *io_u, int sync) +static int fio_sgio_doio(struct thread_data *td, struct io_u *io_u, int do_sync) { struct fio_file *f = io_u->file; if (f->filetype == FIO_TYPE_BD) return fio_sgio_ioctl_doio(td, f, io_u); - return fio_sgio_rw_doio(f, io_u, sync); + return fio_sgio_rw_doio(f, io_u, do_sync); } static int fio_sgio_prep(struct thread_data *td, struct io_u *io_u) @@ -240,11 +240,14 @@ static int fio_sgio_prep(struct thread_data *td, struct io_u *io_u) static int fio_sgio_queue(struct thread_data *td, struct io_u *io_u) { struct sg_io_hdr *hdr = &io_u->hdr; - int ret; + int ret, do_sync = 0; fio_ro_check(td, io_u); - ret = fio_sgio_doio(td, io_u, io_u->ddir == DDIR_SYNC); + if (td->o.sync_io || td->o.odirect || ddir_sync(io_u->ddir)) + do_sync = 1; + + ret = fio_sgio_doio(td, io_u, do_sync); if (ret < 0) io_u->error = errno; @@ -271,17 +274,16 @@ static struct io_u *fio_sgio_event(struct thread_data *td, int event) static int fio_sgio_get_bs(struct thread_data *td, unsigned int *bs) { struct sgio_data *sd = td->io_ops->data; - struct io_u *io_u; + struct io_u io_u; struct sg_io_hdr *hdr; unsigned char buf[8]; int ret; - io_u = __get_io_u(td); - io_u->file = &td->files[0]; - assert(io_u); + memset(&io_u, 0, sizeof(io_u)); + io_u.file = td->files[0]; - hdr = &io_u->hdr; - sgio_hdr_init(sd, hdr, io_u, 0); + hdr = &io_u.hdr; + sgio_hdr_init(sd, hdr, &io_u, 0); memset(buf, 0, sizeof(buf)); hdr->cmdp[0] = 0x25; @@ -289,14 +291,11 @@ static int fio_sgio_get_bs(struct thread_data *td, unsigned int *bs) hdr->dxferp = buf; hdr->dxfer_len = sizeof(buf); - ret = fio_sgio_doio(td, io_u, 1); - if (ret) { - put_io_u(td, io_u); + ret = fio_sgio_doio(td, &io_u, 1); + if (ret) return ret; - } *bs = (buf[4] << 24) | (buf[5] << 16) | (buf[6] << 8) | buf[7]; - put_io_u(td, io_u); return 0; } @@ -311,8 +310,6 @@ static void fio_sgio_cleanup(struct thread_data *td) free(sd->pfds); free(sd->sgbuf); free(sd); - - td->io_ops->data = NULL; } } @@ -364,7 +361,7 @@ static int fio_sgio_type_check(struct thread_data *td, struct fio_file *f) if (ret) return 1; } else { - log_err("ioengine sgio only works on block devices\n"); + log_err("ioengine sg only works on block devices\n"); return 1; } @@ -388,7 +385,7 @@ static int fio_sgio_open(struct thread_data *td, struct fio_file *f) return ret; if (sd && !sd->type_checked && fio_sgio_type_check(td, f)) { - generic_close_file(td, f); + ret = generic_close_file(td, f); return 1; } @@ -406,6 +403,7 @@ static struct ioengine_ops ioengine = { .cleanup = fio_sgio_cleanup, .open_file = fio_sgio_open, .close_file = generic_close_file, + .get_file_size = generic_get_file_size, .flags = FIO_SYNCIO | FIO_RAWIO, }; @@ -418,12 +416,12 @@ static struct ioengine_ops ioengine = { */ static int fio_sgio_init(struct thread_data fio_unused *td) { - fprintf(stderr, "fio: sgio not available\n"); + log_err("fio: ioengine sg not available\n"); return 1; } static struct ioengine_ops ioengine = { - .name = "sgio", + .name = "sg", .version = FIO_IOOPS_VERSION, .init = fio_sgio_init, };