Add file locking hooks
[fio.git] / io_u.c
diff --git a/io_u.c b/io_u.c
index 7ac31a0d297872fe82168e74cff63cfce1880dcb..04d7dcbd2fc368397a5e4765e6e702d438cbbc80 100644 (file)
--- a/io_u.c
+++ b/io_u.c
@@ -328,8 +328,12 @@ void put_io_u(struct thread_data *td, struct io_u *io_u)
        assert((io_u->flags & IO_U_F_FREE) == 0);
        io_u->flags |= IO_U_F_FREE;
 
-       if (io_u->file)
-               put_file(td, io_u->file);
+       if (io_u->file) {
+               int ret = put_file(td, io_u->file);
+
+               if (ret)
+                       td_verror(td, ret, "file close");
+       }
 
        io_u->file = NULL;
        list_del(&io_u->list);
@@ -557,7 +561,7 @@ static struct fio_file *get_next_file_rand(struct thread_data *td, int goodf,
                long r = os_random_long(&td->next_file_state);
 
                fno = (unsigned int) ((double) td->o.nr_files * (r / (RAND_MAX + 1.0)));
-               f = &td->files[fno];
+               f = td->files[fno];
                if (f->flags & FIO_FILE_DONE)
                        continue;
 
@@ -578,7 +582,7 @@ static struct fio_file *get_next_file_rr(struct thread_data *td, int goodf,
        struct fio_file *f;
 
        do {
-               f = &td->files[td->next_file];
+               f = td->files[td->next_file];
 
                td->next_file++;
                if (td->next_file >= td->o.nr_files)
@@ -661,6 +665,7 @@ set_file:
                 * td_io_close() does a put_file() as well, so no need to
                 * do that here.
                 */
+               unlock_file(io_u->file);
                io_u->file = NULL;
                td_io_close_file(td, f);
                f->flags |= FIO_FILE_DONE;
@@ -764,10 +769,9 @@ struct io_u *get_io_u(struct thread_data *td)
         * Set io data pointers.
         */
        io_u->endpos = io_u->offset + io_u->buflen;
-out:
        io_u->xfer_buf = io_u->buf;
        io_u->xfer_buflen = io_u->buflen;
-
+out:
        if (!td_io_prep(td, io_u)) {
                fio_gettime(&io_u->start_time, NULL);
                return io_u;
@@ -821,8 +825,6 @@ static void io_completed(struct thread_data *td, struct io_u *io_u,
                td->io_bytes[idx] += bytes;
                td->this_io_bytes[idx] += bytes;
 
-               io_u->file->last_completed_pos = io_u->endpos;
-
                usec = utime_since(&io_u->issue_time, &icd->time);
 
                add_clat_sample(td, idx, usec);