On 04/01/2014 09:56 AM, Andrey Kuzmin wrote:
Thanks. On a separate (or may be related) note, shared files handling in dup_files seems to be broken (unless I'm missing the logic behind dropping non-shared files). The patch below has fixed it for me. diff --git a/init.c b/init.c index 9b0666d..99038b2 100644 --- a/init.c +++ b/init.c @@ -1160,17 +1161,20 @@ static int add_job(struct thread_data *td, const char *j td_new->o.new_group = 0; if (file_alloced) { - td_new->files_index = 0; - td_new->files_size = 0; if (td_new->files) { struct fio_file *f; for_each_file(td_new, f, i) { if (f->file_name) - free(f->file_name); - free(f); + sfree(f->file_name); + sfree(f); } + free(td_new->files); td_new->files = NULL; } + td_new->files_index = 0; + td_new->files_size = 0; if (td_new->o.filename) { free(td_new->o.filename); td_new->o.filename = NULL;
Thanks, I'll add this, definitely looks like a missing conversion at some point...
And while this isn't the bug, I think it's touching in the right area. Can you try with this one-liner and see if that fixes your issues with EBADF?
-- Jens Axboe
diff --git a/filesetup.c b/filesetup.c index db80a8b7e28b..ecbe3a5fb41b 100644 --- a/filesetup.c +++ b/filesetup.c @@ -1421,6 +1459,7 @@ void dup_files(struct thread_data *td, struct thread_data *org) assert(0); } __f->fd = -1; + __f->shadow_fd = -1; fio_file_reset(td, __f); if (f->file_name) {