From 3a35845f7756a8a86b420650bff41267192dce22 Mon Sep 17 00:00:00 2001 From: Jens Axboe Date: Tue, 15 Apr 2014 09:07:44 -0600 Subject: [PATCH] sg/binject: only restore file flags if they have been set Signed-off-by: Jens Axboe --- engines/binject.c | 7 ++++++- engines/sg.c | 7 ++++++- fio.h | 2 +- libfio.c | 11 +++++++---- 4 files changed, 20 insertions(+), 7 deletions(-) diff --git a/engines/binject.c b/engines/binject.c index 812b3c42..43e31695 100644 --- a/engines/binject.c +++ b/engines/binject.c @@ -110,7 +110,9 @@ static int fio_binject_getevents(struct thread_data *td, unsigned int min, * don't block for min events == 0 */ if (!min) - fio_set_fd_nonblocking(bf->fd, "binject"); + bd->fd_flags[i] = fio_set_fd_nonblocking(bf->fd, "binject"); + else + bd->fd_flags[i] = -1; bd->pfds[i].fd = bf->fd; bd->pfds[i].events = POLLIN; @@ -154,6 +156,9 @@ static int fio_binject_getevents(struct thread_data *td, unsigned int min, for_each_file(td, f, i) { bf = (struct binject_file *) (uintptr_t) f->engine_data; + if (bd->fd_flags[i] == -1) + continue; + if (fcntl(bf->fd, F_SETFL, bd->fd_flags[i]) < 0) log_err("fio: binject failed to restore fcntl flags: %s\n", strerror(errno)); } diff --git a/engines/sg.c b/engines/sg.c index 87fe8835..1a027dae 100644 --- a/engines/sg.c +++ b/engines/sg.c @@ -78,7 +78,9 @@ static int fio_sgio_getevents(struct thread_data *td, unsigned int min, * don't block for min events == 0 */ if (!min) - fio_set_fd_nonblocking(f->fd, "sg"); + sd->fd_flags[i] = fio_set_fd_nonblocking(f->fd, "sg"); + else + sd->fd_flags[i] = -1; sd->pfds[i].fd = f->fd; sd->pfds[i].events = POLLIN; @@ -143,6 +145,9 @@ re_read: if (!min) { for_each_file(td, f, i) { + if (sd->fd_flags[i] == -1) + continue; + if (fcntl(f->fd, F_SETFL, sd->fd_flags[i]) < 0) log_err("fio: sg failed to restore fcntl flags: %s\n", strerror(errno)); } diff --git a/fio.h b/fio.h index 544916f2..9eecba36 100644 --- a/fio.h +++ b/fio.h @@ -441,7 +441,7 @@ extern char *num2str(unsigned long, int, int, int, int); extern int ioengine_load(struct thread_data *); extern int parse_dryrun(void); extern int fio_running_or_pending_io_threads(void); -extern void fio_set_fd_nonblocking(int, const char *); +extern int fio_set_fd_nonblocking(int, const char *); extern uintptr_t page_mask; extern uintptr_t page_size; diff --git a/libfio.c b/libfio.c index 5ed8c607..8af11297 100644 --- a/libfio.c +++ b/libfio.c @@ -234,7 +234,7 @@ int fio_running_or_pending_io_threads(void) return 0; } -void fio_set_fd_nonblocking(int fd, const char *who) +int fio_set_fd_nonblocking(int fd, const char *who) { int flags; @@ -242,11 +242,14 @@ void fio_set_fd_nonblocking(int fd, const char *who) if (flags < 0) log_err("fio: %s failed to get file flags: %s\n", who, strerror(errno)); else { - flags |= O_NONBLOCK; - flags = fcntl(fd, F_SETFL, flags); - if (flags < 0) + int new_flags = flags | O_NONBLOCK; + + new_flags = fcntl(fd, F_SETFL, new_flags); + if (new_flags < 0) log_err("fio: %s failed to get file flags: %s\n", who, strerror(errno)); } + + return flags; } static int endian_check(void) -- 2.25.1