Fix race condition when using asynch verify
I discovered the race condition when using asynch verify with libaio engine.
The code assumes that because the td->cur_depth value is not 0 that
there is still I/O pending and issues io_getevents when the I/O was
actually being verified by the asynchronous verify thread. This causes
the code to hang.
(Updated by Jens to use a new io_u->flag bitfield instead of adding a new
integer to struct io_u).
Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
diff --git a/io_u.c b/io_u.c
index da9d950..232f6a6 100644
--- a/io_u.c
+++ b/io_u.c
@@ -421,9 +421,10 @@
put_file_log(td, io_u->file);
io_u->file = NULL;
+ if (io_u->flags & IO_U_F_IN_CUR_DEPTH)
+ td->cur_depth--;
flist_del_init(&io_u->list);
flist_add(&io_u->list, &td->io_u_freelist);
- td->cur_depth--;
td_io_u_unlock(td);
td_io_u_free_notify(td);
}
@@ -447,10 +448,10 @@
td->io_issues[__io_u->ddir]--;
__io_u->flags &= ~IO_U_F_FLIGHT;
-
+ if (__io_u->flags & IO_U_F_IN_CUR_DEPTH)
+ td->cur_depth--;
flist_del(&__io_u->list);
flist_add_tail(&__io_u->list, &td->io_u_requeues);
- td->cur_depth--;
td_io_u_unlock(td);
*io_u = NULL;
}
@@ -867,6 +868,7 @@
flist_del(&io_u->list);
flist_add(&io_u->list, &td->io_u_busylist);
td->cur_depth++;
+ io_u->flags |= IO_U_F_IN_CUR_DEPTH;
}
td_io_u_unlock(td);