[PATCH 2/2] filesetup: Extend file size for 'null' and 'filecreate' ioengines

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



It was reported the fio command with following options fails because of
file access beyond the file size specified with size option.

./fio --name=test --rw=randread --runtime=10s --offset=90% --time_based --ioengine=null --size=1T --norandommap --randrepeat=0

One of the options specifies null ioengine which has FIO_DISKLESSIO and
FIO_FAKEIO flags. When FIO_DISKLESSIO flag is set, current fio code does
not extend the file size even when io_size + file_offset is larger than
real_file_size. With this, random offsets are generated within io_size +
file_offset range and fail comparison with real_file_size. This failure
does not happen with other engines such as libaio since the target file
is extended to ensure real_file_size is larger than io_size +
file_offset.

To avoid the failure, extend file size for ioengines with FIO_DISKLESSIO
and FIO_FAKEIO. This changes behavior of two ioengines only: null
ioengine and filecreate engine. It does not change behavior of all other
ioengines including 12 ioengines with FIO_DISKLESSIO flag, such as nbd,
glusterfs, pmemblk, etc.

Signed-off-by: Masato Suzuki <masato.suzuki@xxxxxxx>
Signed-off-by: Shin'ichiro Kawasaki <shinichiro.kawasaki@xxxxxxx>
---
 filesetup.c | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/filesetup.c b/filesetup.c
index 7904d187..a439b6d6 100644
--- a/filesetup.c
+++ b/filesetup.c
@@ -1104,13 +1104,15 @@ int setup_files(struct thread_data *td)
 		}
 
 		if (f->filetype == FIO_TYPE_FILE &&
-		    (f->io_size + f->file_offset) > f->real_file_size &&
-		    !td_ioengine_flagged(td, FIO_DISKLESSIO)) {
-			if (!o->create_on_open) {
+		    (f->io_size + f->file_offset) > f->real_file_size) {
+			if (!td_ioengine_flagged(td, FIO_DISKLESSIO) &&
+			    !o->create_on_open) {
 				need_extend++;
 				extend_size += (f->io_size + f->file_offset);
 				fio_file_set_extend(f);
-			} else
+			} else if (!td_ioengine_flagged(td, FIO_DISKLESSIO) ||
+				   (td_ioengine_flagged(td, FIO_DISKLESSIO) &&
+				    td_ioengine_flagged(td, FIO_FAKEIO)))
 				f->real_file_size = f->io_size + f->file_offset;
 		}
 	}
-- 
2.21.0




[Index of Archives]     [Linux Kernel]     [Linux SCSI]     [Linux IDE]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux SCSI]

  Powered by Linux