Fix crash with file locking and dup'ed files
[fio.git] / filesetup.c
index c9b060b7e8aba6b8cad4c498d3ee6736caaa6dc0..d1702e29c75bf1b1f73dd0d2dc3ade1ac35f9e12 100644 (file)
@@ -121,8 +121,10 @@ static int extend_file(struct thread_data *td, struct fio_file *f)
                dprint(FD_FILE, "truncate file %s, size %llu\n", f->file_name,
                                        (unsigned long long) f->real_file_size);
                if (ftruncate(f->fd, f->real_file_size) == -1) {
-                       td_verror(td, errno, "ftruncate");
-                       goto err;
+                       if (errno != EFBIG) {
+                               td_verror(td, errno, "ftruncate");
+                               goto err;
+                       }
                }
        }
 
@@ -1048,6 +1050,7 @@ void close_and_free_files(struct thread_data *td)
        td->files_index = 0;
        td->files = NULL;
        td->file_locks = NULL;
+       td->o.file_lock_mode = FILE_LOCK_NONE;
        td->o.nr_files = 0;
 }
 
@@ -1240,6 +1243,8 @@ void unlock_file(struct thread_data *td, struct fio_file *f)
 
 void unlock_file_all(struct thread_data *td, struct fio_file *f)
 {
+       if (td->o.file_lock_mode == FILE_LOCK_NONE)
+               return;
        if (td->file_locks[f->fileno] != FILE_LOCK_NONE)
                unlock_file(td, f);
 }
@@ -1338,6 +1343,11 @@ void dup_files(struct thread_data *td, struct thread_data *org)
                        __f->filetype = f->filetype;
                }
 
+               if (td->o.file_lock_mode == FILE_LOCK_EXCLUSIVE)
+                       __f->lock = f->lock;
+               else if (td->o.file_lock_mode == FILE_LOCK_READWRITE)
+                       __f->rwlock = f->rwlock;
+
                td->files[i] = __f;
        }
 }