153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe#include <unistd.h> 253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe#include <fcntl.h> 353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe#include <string.h> 453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe#include <assert.h> 5bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe#include <dirent.h> 6d74ac843d82345862070400cb5fe408524c613f3YAMAMOTO Takashi#include <libgen.h> 753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe#include <sys/stat.h> 853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe#include <sys/mman.h> 9bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe#include <sys/types.h> 1053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 1153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe#include "fio.h" 12f17c43928c202e557f2f325272c60d9050ee528eJens Axboe#include "smalloc.h" 134906e0b57f2b8cbad02ef2428522281cf6038bddJens Axboe#include "filehash.h" 14bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt#include "options.h" 15ecc314ba7c5f02b7e90ac1dfbce1a74cd4e6d6feBruce Cran#include "os/os.h" 162316296a514711bb388d87b34742c04bb561d986Jens Axboe#include "hash.h" 177ebd796f4e50c21d652e62bf1e112755b0f338a8Jens Axboe#include "lib/axmap.h" 1853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 1997ac992c99d89eed8cdf9249bb038ac4d7b709b9Jens Axboe#ifdef CONFIG_LINUX_FALLOCATE 20a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou#include <linux/falloc.h> 21a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou#endif 22a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou 237172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboestatic int root_warn; 247172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboe 25bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardtstatic FLIST_HEAD(filename_list); 26bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt 27eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes/* 28eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes * List entry for filename_list 29eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes */ 30eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughesstruct file_name { 31eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes struct flist_head list; 32eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes char *filename; 33eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes}; 34eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes 35c592b9fe12d4739d99d5bece517e304804876df6Jens Axboestatic inline void clear_error(struct thread_data *td) 36c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe{ 37c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe td->error = 0; 38c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe td->verror[0] = '\0'; 39c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe} 40c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe 413baddf2450d811be658fb47ef883ee84478dc352Jens Axboe/* 423baddf2450d811be658fb47ef883ee84478dc352Jens Axboe * Leaves f->fd open on success, caller must close 433baddf2450d811be658fb47ef883ee84478dc352Jens Axboe */ 447bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboestatic int extend_file(struct thread_data *td, struct fio_file *f) 4525205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe{ 46ea443657ce85860b7a0dd2f39f2572d4a09fc885Jens Axboe int r, new_layout = 0, unlink_file = 0, flags; 4725205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe unsigned long long left; 4825205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe unsigned int bs; 49f3e1eb23a6c900921caa58c6cad66d3b60b0b6d7Jens Axboe char *b = NULL; 50b2a151925a91f38aeb298d693687a47269ad4e94Jens Axboe 514241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe if (read_only) { 524241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe log_err("fio: refusing extend of file due to read-only\n"); 534241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe return 0; 544241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe } 554241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe 56507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe /* 57507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe * check if we need to lay the file out complete again. fio 58507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe * does that for operations involving reads, or for writes 59507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe * where overwrite is set 60507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe */ 611417daeb92c44632f2e1e376d736a0f198d7af8dJens Axboe if (td_read(td) || 621417daeb92c44632f2e1e376d736a0f198d7af8dJens Axboe (td_write(td) && td->o.overwrite && !td->o.file_append) || 63eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes (td_write(td) && td_ioengine_flagged(td, FIO_NOEXTEND))) 64507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe new_layout = 1; 651417daeb92c44632f2e1e376d736a0f198d7af8dJens Axboe if (td_write(td) && !td->o.overwrite && !td->o.file_append) 66ea443657ce85860b7a0dd2f39f2572d4a09fc885Jens Axboe unlink_file = 1; 67507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe 686ae1f57f2cb8661b97b770372eeb3694f6d5a744Jens Axboe if (unlink_file || new_layout) { 69eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes int ret; 70eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes 71bd199f2b98eeb9101795e40fdef5889c630178c1Jens Axboe dprint(FD_FILE, "layout unlink %s\n", f->file_name); 72eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes 73eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes ret = td_io_unlink_file(td, f); 74eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes if (ret != 0 && ret != ENOENT) { 757bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe td_verror(td, errno, "unlink"); 767bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe return 1; 777bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } 787bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } 797bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 80eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes flags = O_WRONLY; 81eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes if (td->o.allow_create) 82eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes flags |= O_CREAT; 83507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe if (new_layout) 84507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe flags |= O_TRUNC; 85507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe 869c0f3f3279985b724c2f1358bb05cc2c795f2265Bruce Cran#ifdef WIN32 879c0f3f3279985b724c2f1358bb05cc2c795f2265Bruce Cran flags |= _O_BINARY; 889c0f3f3279985b724c2f1358bb05cc2c795f2265Bruce Cran#endif 899c0f3f3279985b724c2f1358bb05cc2c795f2265Bruce Cran 90ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe dprint(FD_FILE, "open file %s, flags %x\n", f->file_name, flags); 91507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe f->fd = open(f->file_name, flags, 0644); 9253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (f->fd < 0) { 93eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes int err = errno; 94eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes 95eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes if (err == ENOENT && !td->o.allow_create) 96eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes log_err("fio: file creation disallowed by " 97eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes "allow_file_create=0\n"); 98eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes else 99eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes td_verror(td, err, "open"); 10053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 1; 10153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 10253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 10397ac992c99d89eed8cdf9249bb038ac4d7b709b9Jens Axboe#ifdef CONFIG_POSIX_FALLOCATE 104a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou if (!td->o.fill_device) { 105a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou switch (td->o.fallocate_mode) { 106a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou case FIO_FALLOCATE_NONE: 107a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou break; 108a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou case FIO_FALLOCATE_POSIX: 109a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou dprint(FD_FILE, "posix_fallocate file %s size %llu\n", 1104b91ee8fd12c72bd76ce9f5ff9116626b48566a0Jens Axboe f->file_name, 1114b91ee8fd12c72bd76ce9f5ff9116626b48566a0Jens Axboe (unsigned long long) f->real_file_size); 112a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou 113a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou r = posix_fallocate(f->fd, 0, f->real_file_size); 114a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou if (r > 0) { 115a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou log_err("fio: posix_fallocate fails: %s\n", 116a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou strerror(r)); 117a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou } 118a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou break; 11997ac992c99d89eed8cdf9249bb038ac4d7b709b9Jens Axboe#ifdef CONFIG_LINUX_FALLOCATE 120a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou case FIO_FALLOCATE_KEEP_SIZE: 121a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou dprint(FD_FILE, 122a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou "fallocate(FALLOC_FL_KEEP_SIZE) " 1234b91ee8fd12c72bd76ce9f5ff9116626b48566a0Jens Axboe "file %s size %llu\n", f->file_name, 1244b91ee8fd12c72bd76ce9f5ff9116626b48566a0Jens Axboe (unsigned long long) f->real_file_size); 1257bc8c2cf02fbd538ca388618ff2f4618787a86e0Jens Axboe 126a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou r = fallocate(f->fd, FALLOC_FL_KEEP_SIZE, 0, 127a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou f->real_file_size); 128888677a428eb6ae6b54195e99734d6d6b3ee55e7Jens Axboe if (r != 0) 129a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou td_verror(td, errno, "fallocate"); 130888677a428eb6ae6b54195e99734d6d6b3ee55e7Jens Axboe 131a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou break; 13297ac992c99d89eed8cdf9249bb038ac4d7b709b9Jens Axboe#endif /* CONFIG_LINUX_FALLOCATE */ 133a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou default: 134a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou log_err("fio: unknown fallocate mode: %d\n", 135a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou td->o.fallocate_mode); 136a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou assert(0); 1377bc8c2cf02fbd538ca388618ff2f4618787a86e0Jens Axboe } 1387bc8c2cf02fbd538ca388618ff2f4618787a86e0Jens Axboe } 13997ac992c99d89eed8cdf9249bb038ac4d7b709b9Jens Axboe#endif /* CONFIG_POSIX_FALLOCATE */ 1409b8365618309572d8fd2579c8ea3132db89f843fBruce Cran 141eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes /* 142eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes * If our jobs don't require regular files initially, we're done. 143eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes */ 144fc74ac1d749c977308016eb22c8658a9a5ac7989Shawn Lewis if (!new_layout) 145fc74ac1d749c977308016eb22c8658a9a5ac7989Shawn Lewis goto done; 146fc74ac1d749c977308016eb22c8658a9a5ac7989Shawn Lewis 1475e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe /* 1485e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe * The size will be -1ULL when fill_device is used, so don't truncate 1495e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe * or fallocate this file, just write it 1505e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe */ 1515e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe if (!td->o.fill_device) { 1525e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe dprint(FD_FILE, "truncate file %s, size %llu\n", f->file_name, 1534b91ee8fd12c72bd76ce9f5ff9116626b48566a0Jens Axboe (unsigned long long) f->real_file_size); 1545e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe if (ftruncate(f->fd, f->real_file_size) == -1) { 1553cd4c66f35fad0df64e4e6dfeddc5bdfd5206e0cJohn if (errno != EFBIG) { 1563cd4c66f35fad0df64e4e6dfeddc5bdfd5206e0cJohn td_verror(td, errno, "ftruncate"); 1573cd4c66f35fad0df64e4e6dfeddc5bdfd5206e0cJohn goto err; 1583cd4c66f35fad0df64e4e6dfeddc5bdfd5206e0cJohn } 1595e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe } 1605e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe } 16140f8298cd252157fa15d93f8eb470116a94069a0Jens Axboe 1627bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe left = f->real_file_size; 163eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes bs = td->o.max_bs[DDIR_WRITE]; 164eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes if (bs > left) 165eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes bs = left; 166eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes 167eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes b = malloc(bs); 168eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes if (!b) { 169eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes td_verror(td, errno, "malloc"); 170eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes goto err; 171eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes } 172eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes 17353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe while (left && !td->terminate) { 17453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (bs > left) 17553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe bs = left; 17653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 177cc86c395fd9dd2002ec1edc0967b7c9453debdfbJens Axboe fill_io_buffer(td, b, bs, bs); 178cc86c395fd9dd2002ec1edc0967b7c9453debdfbJens Axboe 17953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe r = write(f->fd, b, bs); 18053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 1815e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe if (r > 0) { 1825e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe left -= r; 18353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe continue; 18453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } else { 1855e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe if (r < 0) { 1865e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe int __e = errno; 1875e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe 1885e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe if (__e == ENOSPC) { 1895e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe if (td->o.fill_device) 1905e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe break; 1915e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe log_info("fio: ENOSPC on laying out " 1925e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe "file, stopping\n"); 1935e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe break; 1945e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe } 195e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe td_verror(td, errno, "write"); 1965e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe } else 197e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe td_verror(td, EIO, "write"); 19853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 19953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe break; 20053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 20153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 20253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 203ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe if (td->terminate) { 204ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe dprint(FD_FILE, "terminate unlink %s\n", f->file_name); 2059187a269bf4539fa4b5b97a9b7439ba408d6b872Castor Fu td_io_unlink_file(td, f); 206ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe } else if (td->o.create_fsync) { 20798e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe if (fsync(f->fd) < 0) { 20898e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe td_verror(td, errno, "fsync"); 20998e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe goto err; 21098e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe } 21198e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe } 2120d1cd207e409a36313784cb9596990c819775f77Jens Axboe if (td->o.fill_device && !td_write(td)) { 213d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe fio_file_clear_size_known(f); 2145e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe if (td_io_get_file_size(td, f)) 2155e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe goto err; 2165e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe if (f->io_size > f->real_file_size) 2175e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe f->io_size = f->real_file_size; 2185e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe } 21953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 22053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe free(b); 221507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboedone: 22253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 0; 22353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboeerr: 22453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe close(f->fd); 22553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe f->fd = -1; 226f3e1eb23a6c900921caa58c6cad66d3b60b0b6d7Jens Axboe if (b) 227f3e1eb23a6c900921caa58c6cad66d3b60b0b6d7Jens Axboe free(b); 22853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 1; 22953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe} 23053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 231afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanminstatic int pre_read_file(struct thread_data *td, struct fio_file *f) 232afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin{ 233ef799a64618cbd53adb50d615666cd7afe9f0a8fJens Axboe int ret = 0, r, did_open = 0, old_runstate; 234afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin unsigned long long left; 235afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin unsigned int bs; 236afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin char *b; 237afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin 238eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes if (td_ioengine_flagged(td, FIO_PIPEIO) || 239eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes td_ioengine_flagged(td, FIO_NOIO)) 240eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes return 0; 241eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes 242eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes if (f->filetype == FIO_TYPE_CHAR) 2439c0d224129b0c59698e4c77e7fed00dc8cbb50e1Jens Axboe return 0; 2449c0d224129b0c59698e4c77e7fed00dc8cbb50e1Jens Axboe 245d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe if (!fio_file_open(f)) { 246b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe if (td->io_ops->open_file(td, f)) { 247b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe log_err("fio: cannot pre-read, failed to open file\n"); 248b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe return 1; 249b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe } 250b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe did_open = 1; 251b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe } 252b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe 2538edd973d57a311d4c590d7385796bbdf111ed04cJens Axboe old_runstate = td_bump_runstate(td, TD_PRE_READING); 254b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe 255eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes left = f->io_size; 256afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin bs = td->o.max_bs[DDIR_READ]; 257eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes if (bs > left) 258eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes bs = left; 259eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes 260afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin b = malloc(bs); 261eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes if (!b) { 262eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes td_verror(td, errno, "malloc"); 263eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes ret = 1; 264eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes goto error; 265eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes } 266afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin memset(b, 0, bs); 267afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin 268ef799a64618cbd53adb50d615666cd7afe9f0a8fJens Axboe if (lseek(f->fd, f->file_offset, SEEK_SET) < 0) { 269ef799a64618cbd53adb50d615666cd7afe9f0a8fJens Axboe td_verror(td, errno, "lseek"); 270ef799a64618cbd53adb50d615666cd7afe9f0a8fJens Axboe log_err("fio: failed to lseek pre-read file\n"); 271ef799a64618cbd53adb50d615666cd7afe9f0a8fJens Axboe ret = 1; 272ef799a64618cbd53adb50d615666cd7afe9f0a8fJens Axboe goto error; 273ef799a64618cbd53adb50d615666cd7afe9f0a8fJens Axboe } 274ef799a64618cbd53adb50d615666cd7afe9f0a8fJens Axboe 275afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin while (left && !td->terminate) { 276afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin if (bs > left) 277afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin bs = left; 278afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin 279afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin r = read(f->fd, b, bs); 280afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin 281afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin if (r == (int) bs) { 282afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin left -= bs; 283afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin continue; 284afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin } else { 285afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin td_verror(td, EIO, "pre_read"); 286afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin break; 287afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin } 288afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin } 289afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin 290ef799a64618cbd53adb50d615666cd7afe9f0a8fJens Axboeerror: 2918edd973d57a311d4c590d7385796bbdf111ed04cJens Axboe td_restore_runstate(td, old_runstate); 292b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe 293b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe if (did_open) 294b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe td->io_ops->close_file(td, f); 295ef799a64618cbd53adb50d615666cd7afe9f0a8fJens Axboe 296afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin free(b); 297ef799a64618cbd53adb50d615666cd7afe9f0a8fJens Axboe return ret; 298afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin} 299afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin 300eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughesunsigned long long get_rand_file_size(struct thread_data *td) 3019c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe{ 302dc873b6f4a536c332b72cce268d5a7ccd356a891Jens Axboe unsigned long long ret, sized; 303eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes uint64_t frand_max; 3041294c3ec7a02d20a98b105c1c41b23358afc67e4Jens Axboe unsigned long r; 3059c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe 306eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes frand_max = rand_max(&td->file_size_state); 307f678701783f1c200ce574215feeb7ff801c4ff72Jens Axboe r = __rand(&td->file_size_state); 308559073f664a872f32632892c560667097b29e963Jens Axboe sized = td->o.file_size_high - td->o.file_size_low; 309eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes ret = (unsigned long long) ((double) sized * (r / (frand_max + 1.0))); 3105ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe ret += td->o.file_size_low; 3112dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe ret -= (ret % td->o.rw_min_bs); 3129c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe return ret; 3139c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe} 3149c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe 31553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboestatic int file_size(struct thread_data *td, struct fio_file *f) 31653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{ 31753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe struct stat st; 31853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 319df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe if (stat(f->file_name, &st) == -1) { 3207bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe td_verror(td, errno, "fstat"); 3217bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe return 1; 3227bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } 32353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 3247bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe f->real_file_size = st.st_size; 32553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 0; 32653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe} 32753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 32853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboestatic int bdev_size(struct thread_data *td, struct fio_file *f) 32953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{ 3309b8365618309572d8fd2579c8ea3132db89f843fBruce Cran unsigned long long bytes = 0; 33153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe int r; 33253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 333df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe if (td->io_ops->open_file(td, f)) { 334df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe log_err("fio: failed opening blockdev %s for size check\n", 335df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe f->file_name); 336df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe return 1; 337df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe } 338df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe 339ecc314ba7c5f02b7e90ac1dfbce1a74cd4e6d6feBruce Cran r = blockdev_size(f, &bytes); 34053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (r) { 341e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe td_verror(td, r, "blockdev_size"); 342df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe goto err; 34353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 34453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 3457ab077ab119fd28b6ccf5705ea8453e414f574c1Jens Axboe if (!bytes) { 3467ab077ab119fd28b6ccf5705ea8453e414f574c1Jens Axboe log_err("%s: zero sized block device?\n", f->file_name); 347df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe goto err; 3487ab077ab119fd28b6ccf5705ea8453e414f574c1Jens Axboe } 3497ab077ab119fd28b6ccf5705ea8453e414f574c1Jens Axboe 35053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe f->real_file_size = bytes; 35122a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe td->io_ops->close_file(td, f); 35253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 0; 353df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboeerr: 354df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe td->io_ops->close_file(td, f); 355df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe return 1; 35653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe} 35753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 3584ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboestatic int char_size(struct thread_data *td, struct fio_file *f) 3594ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe{ 3604ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe#ifdef FIO_HAVE_CHARDEV_SIZE 3619b8365618309572d8fd2579c8ea3132db89f843fBruce Cran unsigned long long bytes = 0; 3624ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe int r; 3634ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe 3644ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe if (td->io_ops->open_file(td, f)) { 365eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes log_err("fio: failed opening chardev %s for size check\n", 3664ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe f->file_name); 3674ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe return 1; 3684ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe } 3694ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe 370ecc314ba7c5f02b7e90ac1dfbce1a74cd4e6d6feBruce Cran r = chardev_size(f, &bytes); 3714ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe if (r) { 3724ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe td_verror(td, r, "chardev_size"); 3734ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe goto err; 3744ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe } 3754ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe 3764ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe if (!bytes) { 3774ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe log_err("%s: zero sized char device?\n", f->file_name); 3784ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe goto err; 3794ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe } 3804ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe 3814ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe f->real_file_size = bytes; 3824ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe td->io_ops->close_file(td, f); 3834ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe return 0; 3844ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboeerr: 3854ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe td->io_ops->close_file(td, f); 3864ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe return 1; 3874ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe#else 3884ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe f->real_file_size = -1ULL; 3894ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe return 0; 3904ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe#endif 3914ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe} 3924ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe 39353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboestatic int get_file_size(struct thread_data *td, struct fio_file *f) 39453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{ 39553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe int ret = 0; 39653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 397d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe if (fio_file_size_known(f)) 398409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe return 0; 399409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe 4007bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (f->filetype == FIO_TYPE_FILE) 4017bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe ret = file_size(td, f); 402eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes else if (f->filetype == FIO_TYPE_BLOCK) 40353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe ret = bdev_size(td, f); 4044ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe else if (f->filetype == FIO_TYPE_CHAR) 4054ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe ret = char_size(td, f); 40653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe else 407eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes f->real_file_size = -1ULL; 40853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 409eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes /* 410eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes * Leave ->real_file_size with 0 since it could be expectation 411eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes * of initial setup for regular files. 412eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes */ 41353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (ret) 41453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return ret; 41553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 416eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes /* 417eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes * If ->real_file_size is -1, a conditional for the message 418eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes * "offset extends end" is always true, but it makes no sense, 419eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes * so just return the same value here. 420eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes */ 421eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes if (f->real_file_size == -1ULL) { 422eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes log_info("%s: failed to get file size of %s\n", td->o.name, 423eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes f->file_name); 424eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes return 1; 425eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes } 426eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes 427eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes if (td->o.start_offset && f->file_offset == 0) 428eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes dprint(FD_FILE, "offset of file %s not initialized yet\n", 429eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes f->file_name); 430eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes /* 431eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes * ->file_offset normally hasn't been initialized yet, so this 432eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes * is basically always false. 433eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes */ 43453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (f->file_offset > f->real_file_size) { 4350f2152c19ed12fc2280c3d475973112f18e48cd5Bruce Cran log_err("%s: offset extends end (%llu > %llu)\n", td->o.name, 4364e0a8fa2593006505b7f4e18931a201d221b49e9Jens Axboe (unsigned long long) f->file_offset, 4374e0a8fa2593006505b7f4e18931a201d221b49e9Jens Axboe (unsigned long long) f->real_file_size); 43853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 1; 43953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 44053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 441d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe fio_file_set_size_known(f); 44253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 0; 44353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe} 44453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 4453baddf2450d811be658fb47ef883ee84478dc352Jens Axboestatic int __file_invalidate_cache(struct thread_data *td, struct fio_file *f, 4463baddf2450d811be658fb47ef883ee84478dc352Jens Axboe unsigned long long off, 4473baddf2450d811be658fb47ef883ee84478dc352Jens Axboe unsigned long long len) 448e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe{ 449eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes int errval = 0, ret = 0; 450e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe 451ef7035a9b2c7af1e745b7cd2448685527ef7eeb0Jens Axboe#ifdef CONFIG_ESX 452ef7035a9b2c7af1e745b7cd2448685527ef7eeb0Jens Axboe return 0; 453ef7035a9b2c7af1e745b7cd2448685527ef7eeb0Jens Axboe#endif 454ef7035a9b2c7af1e745b7cd2448685527ef7eeb0Jens Axboe 4555e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe if (len == -1ULL) 4563baddf2450d811be658fb47ef883ee84478dc352Jens Axboe len = f->io_size; 4573baddf2450d811be658fb47ef883ee84478dc352Jens Axboe if (off == -1ULL) 4583baddf2450d811be658fb47ef883ee84478dc352Jens Axboe off = f->file_offset; 459ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe 4600d1cd207e409a36313784cb9596990c819775f77Jens Axboe if (len == -1ULL || off == -1ULL) 4610d1cd207e409a36313784cb9596990c819775f77Jens Axboe return 0; 4620d1cd207e409a36313784cb9596990c819775f77Jens Axboe 463eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes if (td->io_ops->invalidate) { 464eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes dprint(FD_IO, "invalidate %s cache %s\n", td->io_ops->name, 465eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes f->file_name); 4661be9f219c5f7d218a6c5cced3ee93c7174a032daJens Axboe ret = td->io_ops->invalidate(td, f); 467eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes if (ret < 0) 468eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes errval = -ret; 469eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes } else if (f->filetype == FIO_TYPE_FILE) { 470eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes dprint(FD_IO, "declare unneeded cache %s: %llu/%llu\n", 471eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes f->file_name, off, len); 472ecc314ba7c5f02b7e90ac1dfbce1a74cd4e6d6feBruce Cran ret = posix_fadvise(f->fd, off, len, POSIX_FADV_DONTNEED); 473eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes if (ret) 474eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes errval = ret; 475eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes } else if (f->filetype == FIO_TYPE_BLOCK) { 476eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes int retry_count = 0; 477eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes 478eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes dprint(FD_IO, "drop page cache %s\n", f->file_name); 479ecc314ba7c5f02b7e90ac1dfbce1a74cd4e6d6feBruce Cran ret = blockdev_invalidate_cache(f); 480eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes while (ret < 0 && errno == EAGAIN && retry_count++ < 25) { 481eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes /* 482eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes * Linux multipath devices reject ioctl while 483eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes * the maps are being updated. That window can 484eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes * last tens of milliseconds; we'll try up to 485eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes * a quarter of a second. 486eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes */ 487eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes usleep(10000); 488eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes ret = blockdev_invalidate_cache(f); 489eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes } 4907e0e25c924d51f23196b3e0ea83b79178fc46823Jens Axboe if (ret < 0 && errno == EACCES && geteuid()) { 4917172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboe if (!root_warn) { 4925ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe log_err("fio: only root may flush block " 4935ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe "devices. Cache flush bypassed!\n"); 4947172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboe root_warn = 1; 4957172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboe } 4967e0e25c924d51f23196b3e0ea83b79178fc46823Jens Axboe ret = 0; 4977e0e25c924d51f23196b3e0ea83b79178fc46823Jens Axboe } 498eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes if (ret < 0) 499eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes errval = errno; 500eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes else if (ret) /* probably not supported */ 501eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes errval = ret; 502eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes } else if (f->filetype == FIO_TYPE_CHAR || 503eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes f->filetype == FIO_TYPE_PIPE) { 504eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes dprint(FD_IO, "invalidate not supported %s\n", f->file_name); 505e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe ret = 0; 506eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes } 507e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe 508dfe11fd1e8249a52c42f34c9e9e6b910ab6b05c5Jens Axboe /* 509dfe11fd1e8249a52c42f34c9e9e6b910ab6b05c5Jens Axboe * Cache flushing isn't a fatal condition, and we know it will 510dfe11fd1e8249a52c42f34c9e9e6b910ab6b05c5Jens Axboe * happen on some platforms where we don't have the proper 511dfe11fd1e8249a52c42f34c9e9e6b910ab6b05c5Jens Axboe * function to flush eg block device caches. So just warn and 512dfe11fd1e8249a52c42f34c9e9e6b910ab6b05c5Jens Axboe * continue on our way. 513dfe11fd1e8249a52c42f34c9e9e6b910ab6b05c5Jens Axboe */ 514eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes if (errval) 515eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes log_info("fio: cache invalidation of %s failed: %s\n", 516eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes f->file_name, strerror(errval)); 517e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe 518dfe11fd1e8249a52c42f34c9e9e6b910ab6b05c5Jens Axboe return 0; 5193baddf2450d811be658fb47ef883ee84478dc352Jens Axboe 5203baddf2450d811be658fb47ef883ee84478dc352Jens Axboe} 5213baddf2450d811be658fb47ef883ee84478dc352Jens Axboe 5223baddf2450d811be658fb47ef883ee84478dc352Jens Axboeint file_invalidate_cache(struct thread_data *td, struct fio_file *f) 5233baddf2450d811be658fb47ef883ee84478dc352Jens Axboe{ 524d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe if (!fio_file_open(f)) 525a5fb461fdff86c442daeebbd28e07984be9f3807Jens Axboe return 0; 526a5fb461fdff86c442daeebbd28e07984be9f3807Jens Axboe 5275e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe return __file_invalidate_cache(td, f, -1ULL, -1ULL); 528e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe} 529e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe 5306977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboeint generic_close_file(struct thread_data fio_unused *td, struct fio_file *f) 53153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{ 5326977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe int ret = 0; 5336977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe 534ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe dprint(FD_FILE, "fd close %s\n", f->file_name); 5354906e0b57f2b8cbad02ef2428522281cf6038bddJens Axboe 5364906e0b57f2b8cbad02ef2428522281cf6038bddJens Axboe remove_file_hash(f); 5374906e0b57f2b8cbad02ef2428522281cf6038bddJens Axboe 5386977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe if (close(f->fd) < 0) 5396977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe ret = errno; 5406977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe 541b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe f->fd = -1; 542e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe 543e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe if (f->shadow_fd != -1) { 544e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe close(f->shadow_fd); 545e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe f->shadow_fd = -1; 546e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe } 547e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe 548eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes f->engine_pos = 0; 5496977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe return ret; 55053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe} 55153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 5521ccc6dc75b28ef70cd7a8c39ac8c1cb68c720a65Dmitry Monakhovint file_lookup_open(struct fio_file *f, int flags) 55353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{ 55429c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe struct fio_file *__f; 5554d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe int from_hash; 5564d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe 5574d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe __f = lookup_file_hash(f->file_name); 5584d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe if (__f) { 5599efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe dprint(FD_FILE, "found file in hash %s\n", f->file_name); 5604d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe f->lock = __f->lock; 5614d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe from_hash = 1; 5624d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe } else { 5639efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe dprint(FD_FILE, "file not found in hash %s\n", f->file_name); 5644d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe from_hash = 0; 5654d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe } 5664d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe 5679c0f3f3279985b724c2f1358bb05cc2c795f2265Bruce Cran#ifdef WIN32 5689c0f3f3279985b724c2f1358bb05cc2c795f2265Bruce Cran flags |= _O_BINARY; 5699c0f3f3279985b724c2f1358bb05cc2c795f2265Bruce Cran#endif 5709c0f3f3279985b724c2f1358bb05cc2c795f2265Bruce Cran 571e8670ef8b26039573fbf835b4b95ba45a1039d83Jens Axboe f->fd = open(f->file_name, flags, 0600); 5724d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe return from_hash; 5734d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe} 5744d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe 575e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboestatic int file_close_shadow_fds(struct thread_data *td) 576e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe{ 577e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe struct fio_file *f; 578e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe int num_closed = 0; 579e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe unsigned int i; 580e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe 581e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe for_each_file(td, f, i) { 582e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe if (f->shadow_fd == -1) 583e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe continue; 584e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe 585e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe close(f->shadow_fd); 586e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe f->shadow_fd = -1; 587e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe num_closed++; 588e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe } 589e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe 590e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe return num_closed; 591e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe} 592e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe 5934d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboeint generic_open_file(struct thread_data *td, struct fio_file *f) 5944d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe{ 595661598287ecc3b8987f312cf8403936552ce686aJens Axboe int is_std = 0; 59653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe int flags = 0; 59729c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe int from_hash = 0; 59853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 599ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe dprint(FD_FILE, "fd open %s\n", f->file_name); 600ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe 601661598287ecc3b8987f312cf8403936552ce686aJens Axboe if (!strcmp(f->file_name, "-")) { 602661598287ecc3b8987f312cf8403936552ce686aJens Axboe if (td_rw(td)) { 603661598287ecc3b8987f312cf8403936552ce686aJens Axboe log_err("fio: can't read/write to stdin/out\n"); 604661598287ecc3b8987f312cf8403936552ce686aJens Axboe return 1; 605661598287ecc3b8987f312cf8403936552ce686aJens Axboe } 606661598287ecc3b8987f312cf8403936552ce686aJens Axboe is_std = 1; 607ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe 608ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe /* 609ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe * move output logging to stderr, if we are writing to stdout 610ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe */ 611ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe if (td_write(td)) 612ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe f_out = stderr; 613661598287ecc3b8987f312cf8403936552ce686aJens Axboe } 614661598287ecc3b8987f312cf8403936552ce686aJens Axboe 6156eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li if (td_trim(td)) 6166eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li goto skip_flags; 6172dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe if (td->o.odirect) 6182fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe flags |= OS_O_DIRECT; 619d01612f3ae2515eb035d0c4ce954d8cb167a0a61Chris Mason if (td->o.oatomic) { 620d01612f3ae2515eb035d0c4ce954d8cb167a0a61Chris Mason if (!FIO_O_ATOMIC) { 621d01612f3ae2515eb035d0c4ce954d8cb167a0a61Chris Mason td_verror(td, EINVAL, "OS does not support atomic IO"); 622d01612f3ae2515eb035d0c4ce954d8cb167a0a61Chris Mason return 1; 623d01612f3ae2515eb035d0c4ce954d8cb167a0a61Chris Mason } 624d01612f3ae2515eb035d0c4ce954d8cb167a0a61Chris Mason flags |= OS_O_DIRECT | FIO_O_ATOMIC; 625d01612f3ae2515eb035d0c4ce954d8cb167a0a61Chris Mason } 6262dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe if (td->o.sync_io) 6272fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe flags |= O_SYNC; 628eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes if (td->o.create_on_open && td->o.allow_create) 629814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe flags |= O_CREAT; 6306eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Liskip_flags: 6316eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li if (f->filetype != FIO_TYPE_FILE) 6326eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li flags |= FIO_O_NOATIME; 63353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 634056f3459149a7670257350d84b49858718e4a0e6Aaron Carrollopen_again: 635660a1cb5fb9843ec09a04337714e78d63cd557e7Jens Axboe if (td_write(td)) { 636173081581f94dc4f9f203eb7a7922fc843bfafdeJens Axboe if (!read_only) 637173081581f94dc4f9f203eb7a7922fc843bfafdeJens Axboe flags |= O_RDWR; 63853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 639eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes if (f->filetype == FIO_TYPE_FILE && td->o.allow_create) 6402fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe flags |= O_CREAT; 6412fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe 642661598287ecc3b8987f312cf8403936552ce686aJens Axboe if (is_std) 643661598287ecc3b8987f312cf8403936552ce686aJens Axboe f->fd = dup(STDOUT_FILENO); 6444d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe else 6454d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe from_hash = file_lookup_open(f, flags); 6466eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li } else if (td_read(td)) { 6474241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe if (f->filetype == FIO_TYPE_CHAR && !read_only) 6482fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe flags |= O_RDWR; 6492fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe else 6502fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe flags |= O_RDONLY; 6512fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe 652661598287ecc3b8987f312cf8403936552ce686aJens Axboe if (is_std) 653661598287ecc3b8987f312cf8403936552ce686aJens Axboe f->fd = dup(STDIN_FILENO); 6544d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe else 6554d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe from_hash = file_lookup_open(f, flags); 656eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes } else if (td_trim(td)) { 657eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes assert(!td_rw(td)); /* should have matched above */ 6586eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li flags |= O_RDWR; 6596eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li from_hash = file_lookup_open(f, flags); 66053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 66153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 66253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (f->fd == -1) { 663e4e33258637e55550a0fac59eb3350e8bf06f8e6Jens Axboe char buf[FIO_VERROR_SIZE]; 664e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe int __e = errno; 665e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe 666835d9b9ed0e5c2591b8a3eacbd5f4ab6bdab466cJens Axboe if (__e == EPERM && (flags & FIO_O_NOATIME)) { 6675921e80c5dfc9f96d2f21da6ae58f2b5d3a0b373Jens Axboe flags &= ~FIO_O_NOATIME; 668056f3459149a7670257350d84b49858718e4a0e6Aaron Carroll goto open_again; 669056f3459149a7670257350d84b49858718e4a0e6Aaron Carroll } 670e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe if (__e == EMFILE && file_close_shadow_fds(td)) 671e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe goto open_again; 672056f3459149a7670257350d84b49858718e4a0e6Aaron Carroll 67398ffb8f3ecebed9984d1744f142eb8be10c14dbdKen Raeburn snprintf(buf, sizeof(buf), "open(%s)", f->file_name); 674e4e33258637e55550a0fac59eb3350e8bf06f8e6Jens Axboe 675a93c5f049da63a60f9962177d8ada50094d234deJens Axboe if (__e == EINVAL && (flags & OS_O_DIRECT)) { 676a93c5f049da63a60f9962177d8ada50094d234deJens Axboe log_err("fio: looks like your file system does not " \ 677a93c5f049da63a60f9962177d8ada50094d234deJens Axboe "support direct=1/buffered=0\n"); 678a93c5f049da63a60f9962177d8ada50094d234deJens Axboe } 679a93c5f049da63a60f9962177d8ada50094d234deJens Axboe 680e4e33258637e55550a0fac59eb3350e8bf06f8e6Jens Axboe td_verror(td, __e, buf); 68134329ca61aaf3be246a4a9d69412a1f3cdccee42Andreas Gruenbacher return 1; 68253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 68353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 68429c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe if (!from_hash && f->fd != -1) { 68529c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe if (add_file_hash(f)) { 6863f0ca9b914e6d0db8c5c457713c277ce458cbc02Jens Axboe int fio_unused ret; 68729c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe 68829c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe /* 689e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe * Stash away descriptor for later close. This is to 690e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe * work-around a "feature" on Linux, where a close of 691e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe * an fd that has been opened for write will trigger 692e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe * udev to call blkid to check partitions, fs id, etc. 693de8f6de97438d5664cd8765e60102b9109a273e2Anatol Pomozov * That pollutes the device cache, which can slow down 694e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe * unbuffered accesses. 69529c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe */ 696e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe if (f->shadow_fd == -1) 697e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe f->shadow_fd = f->fd; 698e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe else { 699e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe /* 700e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe * OK to ignore, we haven't done anything 701e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe * with it 702e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe */ 703e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe ret = generic_close_file(td, f); 704e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe } 70529c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe goto open_again; 70629c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe } 70729c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe } 7084906e0b57f2b8cbad02ef2428522281cf6038bddJens Axboe 70953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 0; 710b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe} 711b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe 712eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes/* 713eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes * This function i.e. get_file_size() is the default .get_file_size 714eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes * implementation of majority of I/O engines. 715eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes */ 716df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboeint generic_get_file_size(struct thread_data *td, struct fio_file *f) 71721972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe{ 718df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe return get_file_size(td, f); 71921972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe} 72021972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe 7217bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe/* 7227bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * open/close all files, so that ->real_file_size gets set 7237bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */ 724bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboestatic int get_file_sizes(struct thread_data *td) 7257bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe{ 7267bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe struct fio_file *f; 7277bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe unsigned int i; 728bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe int err = 0; 7297bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 7307bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe for_each_file(td, f, i) { 731eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes dprint(FD_FILE, "get file size for %p/%d/%s\n", f, i, 7325ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe f->file_name); 7339efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe 73499a47c6905731e53dd4d8f7ea6501f36d9329e7bJens Axboe if (td_io_get_file_size(td, f)) { 73540b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe if (td->error != ENOENT) { 73640b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe log_err("%s\n", td->verror); 73740b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe err = 1; 73834329ca61aaf3be246a4a9d69412a1f3cdccee42Andreas Gruenbacher break; 73940b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe } 740541d66d70b8fbe9860b31307c0760e6d5f4c78a8Jens Axboe clear_error(td); 74107eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe } 742409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe 743eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes /* 744eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes * There are corner cases where we end up with -1 for 745eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes * ->real_file_size due to unsupported file type, etc. 746eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes * We then just set to size option value divided by number 747eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes * of files, similar to the way file ->io_size is set. 748eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes * stat(2) failure doesn't set ->real_file_size to -1. 749eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes */ 750409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe if (f->real_file_size == -1ULL && td->o.size) 751409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe f->real_file_size = td->o.size / td->o.nr_files; 7527bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } 753bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe 754bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe return err; 7557bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe} 7567bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 7572e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboestruct fio_mount { 7582e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe struct flist_head list; 7592e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe const char *base; 7602e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe char __base[256]; 7612e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe unsigned int key; 7622e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe}; 7632e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 7642e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe/* 7652e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe * Get free number of bytes for each file on each unique mount. 7662e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe */ 7672e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboestatic unsigned long long get_fs_free_counts(struct thread_data *td) 7682e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe{ 7692e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe struct flist_head *n, *tmp; 77068b0316f581c3c881d7dbf7c9dafef4a10100a66Jens Axboe unsigned long long ret = 0; 7712e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe struct fio_mount *fm; 7722e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe FLIST_HEAD(list); 7732e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe struct fio_file *f; 7742e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe unsigned int i; 7752e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 7762e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe for_each_file(td, f, i) { 7772e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe struct stat sb; 7782e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe char buf[256]; 7792e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 780eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes if (f->filetype == FIO_TYPE_BLOCK || f->filetype == FIO_TYPE_CHAR) { 7814ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe if (f->real_file_size != -1ULL) 7824ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe ret += f->real_file_size; 78368b0316f581c3c881d7dbf7c9dafef4a10100a66Jens Axboe continue; 78468b0316f581c3c881d7dbf7c9dafef4a10100a66Jens Axboe } else if (f->filetype != FIO_TYPE_FILE) 78568b0316f581c3c881d7dbf7c9dafef4a10100a66Jens Axboe continue; 78668b0316f581c3c881d7dbf7c9dafef4a10100a66Jens Axboe 787da27a4bf0f9753fcc9da7b63f1be482fc0349907Jens Axboe buf[255] = '\0'; 788da27a4bf0f9753fcc9da7b63f1be482fc0349907Jens Axboe strncpy(buf, f->file_name, 255); 7892e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 7902e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe if (stat(buf, &sb) < 0) { 7912e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe if (errno != ENOENT) 7922e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe break; 7932e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe strcpy(buf, "."); 7942e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe if (stat(buf, &sb) < 0) 7952e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe break; 7962e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe } 7972e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 7982e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe fm = NULL; 7992e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe flist_for_each(n, &list) { 8002e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe fm = flist_entry(n, struct fio_mount, list); 8012e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe if (fm->key == sb.st_dev) 8022e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe break; 8032e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 8042e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe fm = NULL; 8052e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe } 8062e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 8072e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe if (fm) 8082e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe continue; 8092e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 8103660ceae229f08b4086279be7c82e86926f0304bJens Axboe fm = calloc(1, sizeof(*fm)); 8113660ceae229f08b4086279be7c82e86926f0304bJens Axboe strncpy(fm->__base, buf, sizeof(fm->__base) - 1); 8122e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe fm->base = basename(fm->__base); 8132e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe fm->key = sb.st_dev; 8142e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe flist_add(&fm->list, &list); 8152e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe } 8162e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 8172e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe flist_for_each_safe(n, tmp, &list) { 8182e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe unsigned long long sz; 8192e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 8202e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe fm = flist_entry(n, struct fio_mount, list); 8212e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe flist_del(&fm->list); 8222e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 823eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes sz = get_fs_free_size(fm->base); 8242e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe if (sz && sz != -1ULL) 8252e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe ret += sz; 8262e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 8272e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe free(fm); 8282e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe } 8292e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 8302e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe return ret; 8312e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe} 8322e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 833bedc9dc24223bb33be4120f4a57718bc54888ca5Jens Axboeuint64_t get_start_offset(struct thread_data *td, struct fio_file *f) 834ce95d651568bd5494e4c4ddc95832715c6760d56Dan Ehrenberg{ 835bedc9dc24223bb33be4120f4a57718bc54888ca5Jens Axboe struct thread_options *o = &td->o; 836bedc9dc24223bb33be4120f4a57718bc54888ca5Jens Axboe 837bedc9dc24223bb33be4120f4a57718bc54888ca5Jens Axboe if (o->file_append && f->filetype == FIO_TYPE_FILE) 838bedc9dc24223bb33be4120f4a57718bc54888ca5Jens Axboe return f->real_file_size; 839bedc9dc24223bb33be4120f4a57718bc54888ca5Jens Axboe 840ce95d651568bd5494e4c4ddc95832715c6760d56Dan Ehrenberg return td->o.start_offset + 8415a65b4e4ce51be2144abaf47635e20a0ebf684ecJiri Horky td->subjob_number * td->o.offset_increment; 842ce95d651568bd5494e4c4ddc95832715c6760d56Dan Ehrenberg} 843ce95d651568bd5494e4c4ddc95832715c6760d56Dan Ehrenberg 8447bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe/* 8457bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * Open the files and setup files sizes, creating files if necessary. 8467bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */ 84753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboeint setup_files(struct thread_data *td) 84853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{ 8497bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe unsigned long long total_size, extend_size; 850de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe struct thread_options *o = &td->o; 85153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe struct fio_file *f; 852002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe unsigned int i, nr_fs_extra = 0; 853000b080395e45cbe0ce54e75f0e993addbdc8676Jens Axboe int err = 0, need_extend; 854e90391eb56d81a2cc175c50caf6b4e5abbdb6142Jens Axboe int old_state; 855002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe const unsigned int bs = td_min_bs(td); 856002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe uint64_t fs = 0; 85753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 858ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe dprint(FD_FILE, "setup files\n"); 859ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe 8608edd973d57a311d4c590d7385796bbdf111ed04cJens Axboe old_state = td_bump_runstate(td, TD_SETTING_UP); 861e90391eb56d81a2cc175c50caf6b4e5abbdb6142Jens Axboe 862de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe if (o->read_iolog_file) 86325460cf6350fb90b8a7943bb649a51d81bac13a4Jens Axboe goto done; 864691c8fb014da9dd82e999a90b5511423f4eee188Jens Axboe 86553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe /* 866eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes * Find out physical size of files or devices for this thread, 867eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes * before we determine I/O size and range of our targets. 868eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes * If ioengine defines a setup() method, it's responsible for 8697bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * opening the files and setting f->real_file_size to indicate 8707bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * the valid range for that file. 87153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe */ 87253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (td->io_ops->setup) 8737bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe err = td->io_ops->setup(td); 8747bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe else 875bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe err = get_file_sizes(td); 87653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 877f102706350093e60617cc271b128e56c57ab3ce7Jens Axboe if (err) 878e90391eb56d81a2cc175c50caf6b4e5abbdb6142Jens Axboe goto err_out; 879f102706350093e60617cc271b128e56c57ab3ce7Jens Axboe 8800a7eb121ecb2e4279e9eb8178aa1e554dda40191Jens Axboe /* 8817bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * check sizes. if the files/devices do not exist and the size 8827bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * isn't passed to fio, abort. 8830a7eb121ecb2e4279e9eb8178aa1e554dda40191Jens Axboe */ 8847bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe total_size = 0; 8857bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe for_each_file(td, f, i) { 886eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes f->fileno = i; 8877bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (f->real_file_size == -1ULL) 8887bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe total_size = -1ULL; 8897bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe else 8907bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe total_size += f->real_file_size; 8917bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } 8920a7eb121ecb2e4279e9eb8178aa1e554dda40191Jens Axboe 893de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe if (o->fill_device) 8942e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe td->fill_device_size = get_fs_free_counts(td); 8952e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 8967bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe /* 8977bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * device/file sizes are zero and no size given, punt 8987bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */ 899de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe if ((!total_size || total_size == -1ULL) && !o->size && 900eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes !td_ioengine_flagged(td, FIO_NOIO) && !o->fill_device && 901de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe !(o->nr_files && (o->file_size_low || o->file_size_high))) { 902de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe log_err("%s: you need to specify size=\n", o->name); 903e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe td_verror(td, EINVAL, "total_file_size"); 904e90391eb56d81a2cc175c50caf6b4e5abbdb6142Jens Axboe goto err_out; 90553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 90653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 9077bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe /* 908002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe * Calculate per-file size and potential extra size for the 909eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes * first files, if needed (i.e. if we don't have a fixed size). 910002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe */ 911d1e78e6b0429bac92794fb6f1c24b5078c68da6dJens Axboe if (!o->file_size_low && o->nr_files) { 912002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe uint64_t all_fs; 913002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe 914002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe fs = o->size / o->nr_files; 915002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe all_fs = fs * o->nr_files; 916002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe 917002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe if (all_fs < o->size) 918002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe nr_fs_extra = (o->size - all_fs) / bs; 919002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe } 920002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe 921002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe /* 9227bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * now file sizes are known, so we can set ->io_size. if size= is 9237bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * not given, ->io_size is just equal to ->real_file_size. if size 9247bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * is given, ->io_size is size / nr_files. 9257bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */ 9267bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe extend_size = total_size = 0; 9277bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe need_extend = 0; 9287bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe for_each_file(td, f, i) { 929bedc9dc24223bb33be4120f4a57718bc54888ca5Jens Axboe f->file_offset = get_start_offset(td, f); 930bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang 931eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes /* 932eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes * Update ->io_size depending on options specified. 933eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes * ->file_size_low being 0 means filesize option isn't set. 934eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes * Non zero ->file_size_low equals ->file_size_high means 935eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes * filesize option is set in a fixed size format. 936eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes * Non zero ->file_size_low not equals ->file_size_high means 937eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes * filesize option is set in a range format. 938eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes */ 939de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe if (!o->file_size_low) { 9407bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe /* 941eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes * no file size or range given, file size is equal to 942eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes * total size divided by number of files. If the size 943002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe * doesn't divide nicely with the min blocksize, 944002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe * make the first files bigger. 9457bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */ 946002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe f->io_size = fs; 947002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe if (nr_fs_extra) { 948002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe nr_fs_extra--; 949002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe f->io_size += bs; 950002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe } 951002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe 952eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes /* 953eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes * We normally don't come here for regular files, but 954eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes * if the result is 0 for a regular file, set it to the 955eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes * real file size. This could be size of the existing 956eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes * one if it already exists, but otherwise will be set 957eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes * to 0. A new file won't be created because 958eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes * ->io_size + ->file_offset equals ->real_file_size. 959eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes */ 960eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes if (!f->io_size) { 961eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes if (f->file_offset > f->real_file_size) 962eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes goto err_offset; 963273f8c912d981439049d9b21aa048aaeaa323c5dJens Axboe f->io_size = f->real_file_size - f->file_offset; 964eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes if (!f->io_size) 965eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes log_info("fio: file %s may be ignored\n", 966eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes f->file_name); 967eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes } 968de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe } else if (f->real_file_size < o->file_size_low || 969de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe f->real_file_size > o->file_size_high) { 970de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe if (f->file_offset > o->file_size_low) 971bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang goto err_offset; 9727bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe /* 9737bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * file size given. if it's fixed, use that. if it's a 9747bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * range, generate a random size in-between. 9757bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */ 976de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe if (o->file_size_low == o->file_size_high) 977de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe f->io_size = o->file_size_low - f->file_offset; 978de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe else { 9795ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe f->io_size = get_rand_file_size(td) 9805ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe - f->file_offset; 9815ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe } 98265bdb10a09222d8b5d213de74824be775772ea8fJens Axboe } else 983bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang f->io_size = f->real_file_size - f->file_offset; 98453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 9857bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (f->io_size == -1ULL) 9867bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe total_size = -1ULL; 9874d002569dc503474a53e824e3f72b10a09c9a2b5Shaohua Li else { 988eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes if (o->size_percent) { 989eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes f->io_size = (f->io_size * o->size_percent) / 100; 990eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes f->io_size -= (f->io_size % td_min_bs(td)); 991eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes } 9927bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe total_size += f->io_size; 9934d002569dc503474a53e824e3f72b10a09c9a2b5Shaohua Li } 9947bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 9957bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (f->filetype == FIO_TYPE_FILE && 996bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang (f->io_size + f->file_offset) > f->real_file_size && 997eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes !td_ioengine_flagged(td, FIO_DISKLESSIO)) { 998de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe if (!o->create_on_open) { 999814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe need_extend++; 1000814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe extend_size += (f->io_size + f->file_offset); 1001eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes fio_file_set_extend(f); 1002814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe } else 1003814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe f->real_file_size = f->io_size + f->file_offset; 10045ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe } 10057bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } 100653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 1007eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes if (td->o.block_error_hist) { 1008eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes int len; 1009eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes 1010eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes assert(td->o.nr_files == 1); /* checked in fixup_options */ 1011eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes f = td->files[0]; 1012eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes len = f->io_size / td->o.bs[DDIR_TRIM]; 1013eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes if (len > MAX_NR_BLOCK_INFOS || len <= 0) { 1014eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes log_err("fio: cannot calculate block histogram with " 1015eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes "%d trim blocks, maximum %d\n", 1016eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes len, MAX_NR_BLOCK_INFOS); 1017eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes td_verror(td, EINVAL, "block_error_hist"); 1018eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes goto err_out; 1019eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes } 1020eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes 1021eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes td->ts.nr_block_infos = len; 1022eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes for (i = 0; i < len; i++) 1023eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes td->ts.block_infos[i] = 1024eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes BLOCK_INFO(0, BLOCK_STATE_UNINIT); 1025eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes } else 1026eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes td->ts.nr_block_infos = 0; 1027eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes 1028a85066dcaf01cd3611b4c7c987357650cd7f08a6Jens Axboe if (!o->size || (total_size && o->size > total_size)) 1029de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe o->size = total_size; 103021972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe 1031d1faa06dc74fcdcae02e70260c90121502ef01cfJens Axboe if (o->size < td_min_bs(td)) { 1032d1faa06dc74fcdcae02e70260c90121502ef01cfJens Axboe log_err("fio: blocksize too large for data set\n"); 1033d1faa06dc74fcdcae02e70260c90121502ef01cfJens Axboe goto err_out; 1034d1faa06dc74fcdcae02e70260c90121502ef01cfJens Axboe } 1035d1faa06dc74fcdcae02e70260c90121502ef01cfJens Axboe 10367bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe /* 1037eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes * See if we need to extend some files, typically needed when our 1038eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes * target regular files don't exist yet, but our jobs require them 1039eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes * initially due to read I/Os. 10407bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */ 10417bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (need_extend) { 10427bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe temp_stall_ts = 1; 1043eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes if (output_format & FIO_OUTPUT_NORMAL) { 1044eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes log_info("%s: Laying out IO file%s (%u file%s / %s%lluMiB)\n", 1045eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes o->name, 1046eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes need_extend > 1 ? "s" : "", 1047eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes need_extend, 1048eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes need_extend > 1 ? "s" : "", 1049eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes need_extend > 1 ? "total " : "", 1050eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes extend_size >> 20); 1051eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes } 10527bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 10537bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe for_each_file(td, f, i) { 10545e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe unsigned long long old_len = -1ULL, extend_len = -1ULL; 10553baddf2450d811be658fb47ef883ee84478dc352Jens Axboe 1056d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe if (!fio_file_extend(f)) 10577bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe continue; 10587bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 1059409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe assert(f->filetype == FIO_TYPE_FILE); 1060d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe fio_file_clear_extend(f); 1061de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe if (!o->fill_device) { 10625e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe old_len = f->real_file_size; 10630b9d69ecb14045cf3b2622ae922756b9889b25e6Jens Axboe extend_len = f->io_size + f->file_offset - 10640b9d69ecb14045cf3b2622ae922756b9889b25e6Jens Axboe old_len; 10655e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe } 1066bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang f->real_file_size = (f->io_size + f->file_offset); 10677bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe err = extend_file(td, f); 10687bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (err) 10693baddf2450d811be658fb47ef883ee84478dc352Jens Axboe break; 10705e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe 10713baddf2450d811be658fb47ef883ee84478dc352Jens Axboe err = __file_invalidate_cache(td, f, old_len, 10723baddf2450d811be658fb47ef883ee84478dc352Jens Axboe extend_len); 10739824f73be5a03e683a236eb1ebe18f4656ac06b8Jens Axboe 10749824f73be5a03e683a236eb1ebe18f4656ac06b8Jens Axboe /* 10759824f73be5a03e683a236eb1ebe18f4656ac06b8Jens Axboe * Shut up static checker 10769824f73be5a03e683a236eb1ebe18f4656ac06b8Jens Axboe */ 10779824f73be5a03e683a236eb1ebe18f4656ac06b8Jens Axboe if (f->fd != -1) 10789824f73be5a03e683a236eb1ebe18f4656ac06b8Jens Axboe close(f->fd); 10799824f73be5a03e683a236eb1ebe18f4656ac06b8Jens Axboe 10803baddf2450d811be658fb47ef883ee84478dc352Jens Axboe f->fd = -1; 10813baddf2450d811be658fb47ef883ee84478dc352Jens Axboe if (err) 10827bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe break; 10837bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } 10847bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe temp_stall_ts = 0; 10857bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } 10867bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 10877bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (err) 1088e90391eb56d81a2cc175c50caf6b4e5abbdb6142Jens Axboe goto err_out; 10897bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 1090de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe if (!o->zone_size) 1091de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe o->zone_size = o->size; 10927bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 1093ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe /* 1094ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe * iolog already set the total io size, if we read back 1095ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe * stored entries. 1096ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe */ 109777731b29c35286a43ca6109ebf13389169ec20e9Jens Axboe if (!o->read_iolog_file) { 1098eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes if (o->io_size) 1099eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes td->total_io_size = o->io_size * o->loops; 110077731b29c35286a43ca6109ebf13389169ec20e9Jens Axboe else 110177731b29c35286a43ca6109ebf13389169ec20e9Jens Axboe td->total_io_size = o->size * o->loops; 110277731b29c35286a43ca6109ebf13389169ec20e9Jens Axboe } 110325460cf6350fb90b8a7943bb649a51d81bac13a4Jens Axboe 110425460cf6350fb90b8a7943bb649a51d81bac13a4Jens Axboedone: 1105de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe if (o->create_only) 110625460cf6350fb90b8a7943bb649a51d81bac13a4Jens Axboe td->done = 1; 110725460cf6350fb90b8a7943bb649a51d81bac13a4Jens Axboe 11088edd973d57a311d4c590d7385796bbdf111ed04cJens Axboe td_restore_runstate(td, old_state); 11097bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe return 0; 1110bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tangerr_offset: 1111de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe log_err("%s: you need to specify valid offset=\n", o->name); 1112e90391eb56d81a2cc175c50caf6b4e5abbdb6142Jens Axboeerr_out: 11138edd973d57a311d4c590d7385796bbdf111ed04cJens Axboe td_restore_runstate(td, old_state); 1114bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang return 1; 111553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe} 111653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 1117afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanminint pre_read_files(struct thread_data *td) 1118afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin{ 1119afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin struct fio_file *f; 1120afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin unsigned int i; 1121afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin 1122afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin dprint(FD_FILE, "pre_read files\n"); 1123afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin 1124afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin for_each_file(td, f, i) { 1125eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes if (pre_read_file(td, f)) 1126eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes return -1; 1127afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin } 1128afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin 1129eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes return 0; 1130afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin} 1131afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin 11329c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboestatic int __init_rand_distribution(struct thread_data *td, struct fio_file *f) 11339c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe{ 11342316296a514711bb388d87b34742c04bb561d986Jens Axboe unsigned int range_size, seed; 11359c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe unsigned long nranges; 11364d6922b77db7109369f0499506cf2cf7a62aba45Jens Axboe uint64_t fsize; 11379c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe 11389c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe range_size = min(td->o.min_bs[DDIR_READ], td->o.min_bs[DDIR_WRITE]); 11394d6922b77db7109369f0499506cf2cf7a62aba45Jens Axboe fsize = min(f->real_file_size, f->io_size); 11409c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe 11414d6922b77db7109369f0499506cf2cf7a62aba45Jens Axboe nranges = (fsize + range_size - 1) / range_size; 11429c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe 11432316296a514711bb388d87b34742c04bb561d986Jens Axboe seed = jhash(f->file_name, strlen(f->file_name), 0) * td->thread_number; 11448425687edef1b2961a17bd58341686f7b598cf28Jens Axboe if (!td->o.rand_repeatable) 11458425687edef1b2961a17bd58341686f7b598cf28Jens Axboe seed = td->rand_seeds[4]; 11468425687edef1b2961a17bd58341686f7b598cf28Jens Axboe 11479c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe if (td->o.random_distribution == FIO_RAND_DIST_ZIPF) 1148888677a428eb6ae6b54195e99734d6d6b3ee55e7Jens Axboe zipf_init(&f->zipf, nranges, td->o.zipf_theta.u.f, seed); 1149eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes else if (td->o.random_distribution == FIO_RAND_DIST_PARETO) 1150888677a428eb6ae6b54195e99734d6d6b3ee55e7Jens Axboe pareto_init(&f->zipf, nranges, td->o.pareto_h.u.f, seed); 1151eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes else if (td->o.random_distribution == FIO_RAND_DIST_GAUSS) 1152eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes gauss_init(&f->gauss, nranges, td->o.gauss_dev.u.f, seed); 11539c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe 11549c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe return 1; 11559c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe} 11569c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe 11579c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboestatic int init_rand_distribution(struct thread_data *td) 11589c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe{ 11599c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe struct fio_file *f; 11609c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe unsigned int i; 11619c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe int state; 11629c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe 11639c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe if (td->o.random_distribution == FIO_RAND_DIST_RANDOM) 11649c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe return 0; 11659c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe 11668edd973d57a311d4c590d7385796bbdf111ed04cJens Axboe state = td_bump_runstate(td, TD_SETTING_UP); 11678edd973d57a311d4c590d7385796bbdf111ed04cJens Axboe 11689c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe for_each_file(td, f, i) 11699c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe __init_rand_distribution(td, f); 11708edd973d57a311d4c590d7385796bbdf111ed04cJens Axboe 11718edd973d57a311d4c590d7385796bbdf111ed04cJens Axboe td_restore_runstate(td, state); 11729c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe 11739c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe return 1; 11749c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe} 11759c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe 1176eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes/* 1177eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes * Check if the number of blocks exceeds the randomness capability of 1178eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes * the selected generator. Tausworthe is 32-bit, the others are fullly 1179eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes * 64-bit capable. 1180eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes */ 1181eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughesstatic int check_rand_gen_limits(struct thread_data *td, struct fio_file *f, 1182eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes uint64_t blocks) 1183eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes{ 1184eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes if (blocks <= FRAND32_MAX) 1185eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes return 0; 1186eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes if (td->o.random_generator != FIO_RAND_GEN_TAUSWORTHE) 1187eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes return 0; 1188eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes 1189eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes /* 1190eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes * If the user hasn't specified a random generator, switch 1191eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes * to tausworthe64 with informational warning. If the user did 1192eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes * specify one, just warn. 1193eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes */ 1194eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes log_info("fio: file %s exceeds 32-bit tausworthe random generator.\n", 1195eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes f->file_name); 1196eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes 1197eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes if (!fio_option_is_set(&td->o, random_generator)) { 1198eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes log_info("fio: Switching to tausworthe64. Use the " 1199eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes "random_generator= option to get rid of this " 1200eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes "warning.\n"); 1201eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes td->o.random_generator = FIO_RAND_GEN_TAUSWORTHE64; 1202eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes return 0; 1203eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes } 1204eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes 1205eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes /* 1206eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes * Just make this information to avoid breaking scripts. 1207eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes */ 1208eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes log_info("fio: Use the random_generator= option to switch to lfsr or " 1209eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes "tausworthe64.\n"); 1210eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes return 0; 1211eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes} 1212eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes 1213687270767de17dbad53c50e03e5d73d52505405cJens Axboeint init_random_map(struct thread_data *td) 1214687270767de17dbad53c50e03e5d73d52505405cJens Axboe{ 121551ede0b1e9c9b570b942b50b44d0455183a0d5ecJens Axboe unsigned long long blocks; 1216687270767de17dbad53c50e03e5d73d52505405cJens Axboe struct fio_file *f; 1217687270767de17dbad53c50e03e5d73d52505405cJens Axboe unsigned int i; 1218687270767de17dbad53c50e03e5d73d52505405cJens Axboe 12199c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe if (init_rand_distribution(td)) 12209c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe return 0; 12213831a843c289ab6a42a19752733d0fca4250882aJens Axboe if (!td_random(td)) 1222687270767de17dbad53c50e03e5d73d52505405cJens Axboe return 0; 1223687270767de17dbad53c50e03e5d73d52505405cJens Axboe 1224687270767de17dbad53c50e03e5d73d52505405cJens Axboe for_each_file(td, f, i) { 12254d6922b77db7109369f0499506cf2cf7a62aba45Jens Axboe uint64_t fsize = min(f->real_file_size, f->io_size); 122638f30c81d8d194da047950cbbda3896bd35cd98cJens Axboe 12274d6922b77db7109369f0499506cf2cf7a62aba45Jens Axboe blocks = fsize / (unsigned long long) td->o.rw_min_bs; 122853737ae01ca65f88089d3b8639df7be5b2f7ef0eJens Axboe 1229eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes if (check_rand_gen_limits(td, f, blocks)) 1230eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes return 1; 1231eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes 12328055e41d0ecc54770a2653427532b3e2c5fabdadJens Axboe if (td->o.random_generator == FIO_RAND_GEN_LFSR) { 123382af46be1fa0c0e188bbb6723008fa33a510606fJens Axboe unsigned long seed; 123482af46be1fa0c0e188bbb6723008fa33a510606fJens Axboe 123582af46be1fa0c0e188bbb6723008fa33a510606fJens Axboe seed = td->rand_seeds[FIO_RAND_BLOCK_OFF]; 12369c0f3f3279985b724c2f1358bb05cc2c795f2265Bruce Cran 1237d55dd0413b5f2df5e637c9c6e752b4272e4a1e5fJens Axboe if (!lfsr_init(&f->lfsr, blocks, seed, 0)) { 1238d55dd0413b5f2df5e637c9c6e752b4272e4a1e5fJens Axboe fio_file_set_lfsr(f); 12398055e41d0ecc54770a2653427532b3e2c5fabdadJens Axboe continue; 1240d55dd0413b5f2df5e637c9c6e752b4272e4a1e5fJens Axboe } 12413831a843c289ab6a42a19752733d0fca4250882aJens Axboe } else if (!td->o.norandommap) { 12427ebd796f4e50c21d652e62bf1e112755b0f338a8Jens Axboe f->io_axmap = axmap_new(blocks); 1243d55dd0413b5f2df5e637c9c6e752b4272e4a1e5fJens Axboe if (f->io_axmap) { 1244d55dd0413b5f2df5e637c9c6e752b4272e4a1e5fJens Axboe fio_file_set_axmap(f); 12458055e41d0ecc54770a2653427532b3e2c5fabdadJens Axboe continue; 1246d55dd0413b5f2df5e637c9c6e752b4272e4a1e5fJens Axboe } 12471cad7121e8e6c59440ae43545be05fa302e4110dJens Axboe } else if (td->o.norandommap) 12481cad7121e8e6c59440ae43545be05fa302e4110dJens Axboe continue; 1249ceadd59ef93421001530aa765d928e9e8c26b32eJens Axboe 12502b386d2569c9078ca9790c4e6d318ec3835b8739Jens Axboe if (!td->o.softrandommap) { 12515ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe log_err("fio: failed allocating random map. If running" 12525ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe " a large number of jobs, try the 'norandommap'" 12532b386d2569c9078ca9790c4e6d318ec3835b8739Jens Axboe " option or set 'softrandommap'. Or give" 12542b386d2569c9078ca9790c4e6d318ec3835b8739Jens Axboe " a larger --alloc-size to fio.\n"); 1255687270767de17dbad53c50e03e5d73d52505405cJens Axboe return 1; 1256687270767de17dbad53c50e03e5d73d52505405cJens Axboe } 1257303032ae4e13c7ac10b8198c40df98d95a4524a6Jens Axboe 1258303032ae4e13c7ac10b8198c40df98d95a4524a6Jens Axboe log_info("fio: file %s failed allocating random map. Running " 1259303032ae4e13c7ac10b8198c40df98d95a4524a6Jens Axboe "job without.\n", f->file_name); 1260687270767de17dbad53c50e03e5d73d52505405cJens Axboe } 1261687270767de17dbad53c50e03e5d73d52505405cJens Axboe 1262687270767de17dbad53c50e03e5d73d52505405cJens Axboe return 0; 1263687270767de17dbad53c50e03e5d73d52505405cJens Axboe} 1264687270767de17dbad53c50e03e5d73d52505405cJens Axboe 126553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboevoid close_files(struct thread_data *td) 126653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{ 12670ab8db8943acc6b9ea778735563bfad2a79e8dddJens Axboe struct fio_file *f; 1268af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe unsigned int i; 126953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 12702be3eec330360e6735fb4e7d70907e11eaa346f8Jens Axboe for_each_file(td, f, i) { 12712be3eec330360e6735fb4e7d70907e11eaa346f8Jens Axboe if (fio_file_open(f)) 12722be3eec330360e6735fb4e7d70907e11eaa346f8Jens Axboe td_io_close_file(td, f); 12732be3eec330360e6735fb4e7d70907e11eaa346f8Jens Axboe } 127424ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe} 127524ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe 127624ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboevoid close_and_free_files(struct thread_data *td) 127724ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe{ 127824ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe struct fio_file *f; 127924ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe unsigned int i; 128024ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe 1281ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe dprint(FD_FILE, "close files\n"); 1282ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe 12830ab8db8943acc6b9ea778735563bfad2a79e8dddJens Axboe for_each_file(td, f, i) { 12849187a269bf4539fa4b5b97a9b7439ba408d6b872Castor Fu if (td->o.unlink && f->filetype == FIO_TYPE_FILE) { 12859187a269bf4539fa4b5b97a9b7439ba408d6b872Castor Fu dprint(FD_FILE, "free unlink %s\n", f->file_name); 12869187a269bf4539fa4b5b97a9b7439ba408d6b872Castor Fu td_io_unlink_file(td, f); 12879187a269bf4539fa4b5b97a9b7439ba408d6b872Castor Fu } 12889187a269bf4539fa4b5b97a9b7439ba408d6b872Castor Fu 128922a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe if (fio_file_open(f)) 129022a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe td_io_close_file(td, f); 129122a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe 1292b9fbcf2104ab79127825e0c23ba0a147ec076087Shaozhi Shawn Ye remove_file_hash(f); 1293b3dc7f075b85e004f8c681ebb8566475017696f3Jens Axboe 1294b5f4d8baefc6eb3e13235b7d9042b7ffecdb23ddJens Axboe if (td->o.unlink && f->filetype == FIO_TYPE_FILE) { 1295b5f4d8baefc6eb3e13235b7d9042b7ffecdb23ddJens Axboe dprint(FD_FILE, "free unlink %s\n", f->file_name); 12969187a269bf4539fa4b5b97a9b7439ba408d6b872Castor Fu td_io_unlink_file(td, f); 1297b5f4d8baefc6eb3e13235b7d9042b7ffecdb23ddJens Axboe } 1298b5f4d8baefc6eb3e13235b7d9042b7ffecdb23ddJens Axboe 1299f17c43928c202e557f2f325272c60d9050ee528eJens Axboe sfree(f->file_name); 1300fa1da8653e2177b3cc31a91e963c389f079d4172Jens Axboe f->file_name = NULL; 1301d55dd0413b5f2df5e637c9c6e752b4272e4a1e5fJens Axboe if (fio_file_axmap(f)) { 1302d55dd0413b5f2df5e637c9c6e752b4272e4a1e5fJens Axboe axmap_free(f->io_axmap); 1303d55dd0413b5f2df5e637c9c6e752b4272e4a1e5fJens Axboe f->io_axmap = NULL; 1304d55dd0413b5f2df5e637c9c6e752b4272e4a1e5fJens Axboe } 130578d99e6a2695d3a7936c5dd02f996f13a30309b1Jens Axboe sfree(f); 130653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 1307b4a6a59a939f0e6554632de311e7d1d1b7633ccfJens Axboe 13082dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe td->o.filename = NULL; 1309cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe free(td->files); 1310d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe free(td->file_locks); 13119efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe td->files_index = 0; 1312b4a6a59a939f0e6554632de311e7d1d1b7633ccfJens Axboe td->files = NULL; 1313d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe td->file_locks = NULL; 131427ddbfa09b22911d5cefb42a44f894e6eb48216eJens Axboe td->o.file_lock_mode = FILE_LOCK_NONE; 13152dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe td->o.nr_files = 0; 131653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe} 1317af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe 1318e3bab463d4397e3378d8c7437e31de8aaf861a4fJens Axboestatic void get_file_type(struct fio_file *f) 1319af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe{ 1320af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe struct stat sb; 1321af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe 1322661598287ecc3b8987f312cf8403936552ce686aJens Axboe if (!strcmp(f->file_name, "-")) 1323661598287ecc3b8987f312cf8403936552ce686aJens Axboe f->filetype = FIO_TYPE_PIPE; 1324661598287ecc3b8987f312cf8403936552ce686aJens Axboe else 1325661598287ecc3b8987f312cf8403936552ce686aJens Axboe f->filetype = FIO_TYPE_FILE; 1326af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe 1327eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes#ifdef WIN32 13283892182aff21486d9c38a346fe8681c9098ecb0cBruce Cran /* \\.\ is the device namespace in Windows, where every file is 13293892182aff21486d9c38a346fe8681c9098ecb0cBruce Cran * a block device */ 13303892182aff21486d9c38a346fe8681c9098ecb0cBruce Cran if (strncmp(f->file_name, "\\\\.\\", 4) == 0) 1331eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes f->filetype = FIO_TYPE_BLOCK; 1332eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes#endif 13333892182aff21486d9c38a346fe8681c9098ecb0cBruce Cran 1334b30d395ec288508f9c787af11d0f52e9df26e39fJens Axboe if (!stat(f->file_name, &sb)) { 13353892182aff21486d9c38a346fe8681c9098ecb0cBruce Cran if (S_ISBLK(sb.st_mode)) 1336eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes f->filetype = FIO_TYPE_BLOCK; 1337af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe else if (S_ISCHR(sb.st_mode)) 1338af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe f->filetype = FIO_TYPE_CHAR; 1339b5605e9ded4188ed91faae1a43ecd333a9856f62Jens Axboe else if (S_ISFIFO(sb.st_mode)) 1340b5605e9ded4188ed91faae1a43ecd333a9856f62Jens Axboe f->filetype = FIO_TYPE_PIPE; 1341af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe } 1342af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe} 1343af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe 1344eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughesstatic bool __is_already_allocated(const char *fname, bool set) 1345190b8f0c9c1c1a99ed26fd953f7af9023f9533eeCastor Fu{ 134690426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe struct flist_head *entry; 1347eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes bool ret; 1348bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt 1349eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes ret = file_bloom_exists(fname, set); 1350eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes if (!ret) 1351eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes return ret; 135290426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe 135390426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe flist_for_each(entry, &filename_list) { 1354eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes struct file_name *fn; 135590426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe 1356eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes fn = flist_entry(entry, struct file_name, list); 1357eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes 1358eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes if (!strcmp(fn->filename, fname)) 1359eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes return true; 136090426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe } 136190426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe 1362eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes return false; 1363bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt} 1364bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt 1365eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughesstatic bool is_already_allocated(const char *fname) 1366bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt{ 1367eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes bool ret; 1368bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt 136990426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe fio_file_hash_lock(); 1370eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes ret = __is_already_allocated(fname, false); 137190426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe fio_file_hash_unlock(); 1372eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes 137390426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe return ret; 137490426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe} 1375bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt 137690426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboestatic void set_already_allocated(const char *fname) 137790426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe{ 137890426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe struct file_name *fn; 137990426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe 138090426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe fn = malloc(sizeof(struct file_name)); 138190426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe fn->filename = strdup(fname); 138290426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe 138390426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe fio_file_hash_lock(); 1384eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes if (!__is_already_allocated(fname, true)) { 138590426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe flist_add_tail(&fn->list, &filename_list); 138690426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe fn = NULL; 1387bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt } 138890426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe fio_file_hash_unlock(); 1389bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt 139090426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe if (fn) { 139190426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe free(fn->filename); 139290426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe free(fn); 139390426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe } 1394bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt} 1395bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt 1396190b8f0c9c1c1a99ed26fd953f7af9023f9533eeCastor Fustatic void free_already_allocated(void) 1397190b8f0c9c1c1a99ed26fd953f7af9023f9533eeCastor Fu{ 1398bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt struct flist_head *entry, *tmp; 1399bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt struct file_name *fn; 1400bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt 140190426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe if (flist_empty(&filename_list)) 140290426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe return; 140390426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe 140490426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe fio_file_hash_lock(); 140590426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe flist_for_each_safe(entry, tmp, &filename_list) { 140690426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe fn = flist_entry(entry, struct file_name, list); 140790426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe free(fn->filename); 140890426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe flist_del(&fn->list); 140990426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe free(fn); 1410bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt } 141190426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe 141290426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe fio_file_hash_unlock(); 1413bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt} 1414bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt 14157b5cb700485518c2e7f2f49548319c89ba907195Jens Axboestatic struct fio_file *alloc_new_file(struct thread_data *td) 14167b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe{ 14177b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe struct fio_file *f; 14187b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe 14197b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe f = smalloc(sizeof(*f)); 14207b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe if (!f) { 14217b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe assert(0); 14227b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe return NULL; 14237b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe } 14247b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe 14257b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe f->fd = -1; 14267b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe f->shadow_fd = -1; 14277b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe fio_file_reset(td, f); 14287b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe return f; 14297b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe} 14307b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe 1431eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughesbool exists_and_not_regfile(const char *filename) 1432eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes{ 1433eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes struct stat sb; 1434eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes 1435eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes if (lstat(filename, &sb) == -1) 1436eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes return false; 1437eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes 1438eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes#ifndef WIN32 /* NOT Windows */ 1439eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes if (S_ISREG(sb.st_mode)) 1440eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes return false; 1441eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes#else 1442eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes /* \\.\ is the device namespace in Windows, where every file 1443eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes * is a device node */ 1444eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes if (S_ISREG(sb.st_mode) && strncmp(filename, "\\\\.\\", 4) != 0) 1445eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes return false; 1446eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes#endif 1447eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes 1448eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes return true; 1449eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes} 1450eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes 14515903e7b7907854014478b6febfc5645a203ff59eJens Axboeint add_file(struct thread_data *td, const char *fname, int numjob, int inc) 1452af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe{ 14537b4e4fe5e6fa26f82f9169c18ec70c08d0805ca9Jens Axboe int cur_files = td->files_index; 1454bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe char file_name[PATH_MAX]; 1455af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe struct fio_file *f; 1456bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe int len = 0; 1457af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe 1458ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe dprint(FD_FILE, "add file %s\n", fname); 1459ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe 1460bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt if (td->o.directory) 1461eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes len = set_name_idx(file_name, PATH_MAX, td->o.directory, numjob, 1462eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes td->o.unique_filename); 1463bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt 1464bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt sprintf(file_name + len, "%s", fname); 1465bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt 1466bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt /* clean cloned siblings using existing files */ 1467eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes if (numjob && is_already_allocated(file_name) && 1468eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes !exists_and_not_regfile(fname)) 1469bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt return 0; 1470bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt 14717b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe f = alloc_new_file(td); 1472bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe 1473fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe if (td->files_size <= td->files_index) { 14741983e3271c20a5dca84ac1ad872e44dd9e62e6b8Jianpeng Ma unsigned int new_size = td->o.nr_files + 1; 1475126d65c6fc97d6acdc568aa5a969c012018daf15Jens Axboe 1476fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe dprint(FD_FILE, "resize file array to %d files\n", new_size); 1477fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe 1478fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe td->files = realloc(td->files, new_size * sizeof(f)); 1479d537c08b0eacdeb05835ee8c5f269b872239713aJianpeng Ma if (td->files == NULL) { 1480d537c08b0eacdeb05835ee8c5f269b872239713aJianpeng Ma log_err("fio: realloc OOM\n"); 1481d537c08b0eacdeb05835ee8c5f269b872239713aJianpeng Ma assert(0); 1482d537c08b0eacdeb05835ee8c5f269b872239713aJianpeng Ma } 1483d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe if (td->o.file_lock_mode != FILE_LOCK_NONE) { 1484d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe td->file_locks = realloc(td->file_locks, new_size); 1485d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe if (!td->file_locks) { 1486d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe log_err("fio: realloc OOM\n"); 1487d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe assert(0); 1488d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe } 1489d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe td->file_locks[cur_files] = FILE_LOCK_NONE; 1490d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe } 1491fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe td->files_size = new_size; 1492fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe } 14938bb7679e73d3086a01b9d21a650b0d7a859412b6Jens Axboe td->files[cur_files] = f; 149489ac1d48971578ccb0645c292d4a058340aeb909Shaohua Li f->fileno = cur_files; 1495126d65c6fc97d6acdc568aa5a969c012018daf15Jens Axboe 149607eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe /* 149707eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe * init function, io engine may not be loaded yet 149807eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe */ 1499eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes if (td->io_ops && td_ioengine_flagged(td, FIO_DISKLESSIO)) 150007eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe f->real_file_size = -1ULL; 150107eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe 1502f17c43928c202e557f2f325272c60d9050ee528eJens Axboe f->file_name = smalloc_strdup(file_name); 1503eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes if (!f->file_name) 1504c48c0be79173897824d8f439c39374f2588931dcJens Axboe assert(0); 15050b9d69ecb14045cf3b2622ae922756b9889b25e6Jens Axboe 1506e3bab463d4397e3378d8c7437e31de8aaf861a4fJens Axboe get_file_type(f); 1507af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe 15084d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe switch (td->o.file_lock_mode) { 15094d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe case FILE_LOCK_NONE: 15104d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe break; 15114d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe case FILE_LOCK_READWRITE: 1512d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe f->rwlock = fio_rwlock_init(); 15134d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe break; 15144d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe case FILE_LOCK_EXCLUSIVE: 1515521da527743088a9bd2ab882f8b64799d49d5848Jens Axboe f->lock = fio_mutex_init(FIO_MUTEX_UNLOCKED); 15164d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe break; 15174d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe default: 15184d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe log_err("fio: unknown lock mode: %d\n", td->o.file_lock_mode); 15194d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe assert(0); 15204d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe } 152129c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe 15227b4e4fe5e6fa26f82f9169c18ec70c08d0805ca9Jens Axboe td->files_index++; 15231549441cdfecb2c1a4a8b8d494253859d67b4344Jens Axboe if (f->filetype == FIO_TYPE_FILE) 15241549441cdfecb2c1a4a8b8d494253859d67b4344Jens Axboe td->nr_normal_files++; 1525f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe 1526bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt set_already_allocated(file_name); 1527bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt 15285903e7b7907854014478b6febfc5645a203ff59eJens Axboe if (inc) 15295903e7b7907854014478b6febfc5645a203ff59eJens Axboe td->o.nr_files++; 15305903e7b7907854014478b6febfc5645a203ff59eJens Axboe 15315ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe dprint(FD_FILE, "file %p \"%s\" added at %d\n", f, f->file_name, 15325ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe cur_files); 15339efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe 1534f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe return cur_files; 1535af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe} 15360ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe 153749ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboeint add_file_exclusive(struct thread_data *td, const char *fname) 153849ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe{ 153949ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe struct fio_file *f; 154049ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe unsigned int i; 154149ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe 154249ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe for_each_file(td, f, i) { 154349ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe if (!strcmp(f->file_name, fname)) 154449ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe return i; 154549ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe } 154649ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe 15475903e7b7907854014478b6febfc5645a203ff59eJens Axboe return add_file(td, fname, 0, 1); 154849ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe} 154949ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe 15500ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboevoid get_file(struct fio_file *f) 15510ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe{ 15528172fe972f3a79d42f34d7f6e259ed3f7f800316Jens Axboe dprint(FD_FILE, "get file %s, ref=%d\n", f->file_name, f->references); 1553d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe assert(fio_file_open(f)); 15540ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe f->references++; 15550ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe} 15560ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe 15576977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboeint put_file(struct thread_data *td, struct fio_file *f) 15580ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe{ 155998e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe int f_ret = 0, ret = 0; 15606977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe 15618172fe972f3a79d42f34d7f6e259ed3f7f800316Jens Axboe dprint(FD_FILE, "put file %s, ref=%d\n", f->file_name, f->references); 1562ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe 156322a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe if (!fio_file_open(f)) { 156422a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe assert(f->fd == -1); 15656977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe return 0; 156622a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe } 15670ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe 15680ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe assert(f->references); 15690ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe if (--f->references) 15706977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe return 0; 15710ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe 157271b84caab6ef5ddbc7893e3268887b8ff0516f75Jens Axboe if (should_fsync(td) && td->o.fsync_on_close) { 157398e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe f_ret = fsync(f->fd); 157471b84caab6ef5ddbc7893e3268887b8ff0516f75Jens Axboe if (f_ret < 0) 157571b84caab6ef5ddbc7893e3268887b8ff0516f75Jens Axboe f_ret = errno; 157671b84caab6ef5ddbc7893e3268887b8ff0516f75Jens Axboe } 1577ebb1415f729c123b8a13bcbd667bf4b4cc95b4d4Jens Axboe 15780ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe if (td->io_ops->close_file) 15796977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe ret = td->io_ops->close_file(td, f); 15801020a139beff50faf1bb18f761b024b664a09e14Jens Axboe 158198e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe if (!ret) 1582a5fb461fdff86c442daeebbd28e07984be9f3807Jens Axboe ret = f_ret; 158398e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe 15840ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe td->nr_open_files--; 1585d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe fio_file_clear_open(f); 158622a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe assert(f->fd == -1); 15876977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe return ret; 15880ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe} 1589bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 15904d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboevoid lock_file(struct thread_data *td, struct fio_file *f, enum fio_ddir ddir) 1591b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe{ 15924d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe if (!f->lock || td->o.file_lock_mode == FILE_LOCK_NONE) 15934d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe return; 159429c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe 15954d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe if (td->o.file_lock_mode == FILE_LOCK_READWRITE) { 15964d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe if (ddir == DDIR_READ) 1597d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe fio_rwlock_read(f->rwlock); 15984d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe else 1599d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe fio_rwlock_write(f->rwlock); 16004d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe } else if (td->o.file_lock_mode == FILE_LOCK_EXCLUSIVE) 16014d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe fio_mutex_down(f->lock); 16024d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe 1603d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe td->file_locks[f->fileno] = td->o.file_lock_mode; 1604b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe} 1605b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe 16064d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboevoid unlock_file(struct thread_data *td, struct fio_file *f) 1607b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe{ 16084d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe if (!f->lock || td->o.file_lock_mode == FILE_LOCK_NONE) 16094d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe return; 16104d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe 1611d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe if (td->o.file_lock_mode == FILE_LOCK_READWRITE) 1612d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe fio_rwlock_unlock(f->rwlock); 1613d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe else if (td->o.file_lock_mode == FILE_LOCK_EXCLUSIVE) 16144d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe fio_mutex_up(f->lock); 1615d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe 1616d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe td->file_locks[f->fileno] = FILE_LOCK_NONE; 1617b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe} 1618b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe 16194d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboevoid unlock_file_all(struct thread_data *td, struct fio_file *f) 16204d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe{ 1621f2a2803a4982a1516eb75d9f98de68cf21d1ae7dJens Axboe if (td->o.file_lock_mode == FILE_LOCK_NONE || !td->file_locks) 162227ddbfa09b22911d5cefb42a44f894e6eb48216eJens Axboe return; 1623d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe if (td->file_locks[f->fileno] != FILE_LOCK_NONE) 1624d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe unlock_file(td, f); 16254d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe} 16264d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe 1627bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboestatic int recurse_dir(struct thread_data *td, const char *dirname) 1628bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe{ 1629bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe struct dirent *dir; 1630bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe int ret = 0; 1631bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe DIR *D; 1632bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 1633bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe D = opendir(dirname); 1634bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe if (!D) { 16350ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe char buf[FIO_VERROR_SIZE]; 16360ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe 163798ffb8f3ecebed9984d1744f142eb8be10c14dbdKen Raeburn snprintf(buf, FIO_VERROR_SIZE, "opendir(%s)", dirname); 16380ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe td_verror(td, errno, buf); 1639bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe return 1; 1640bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe } 1641bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 1642bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe while ((dir = readdir(D)) != NULL) { 1643bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe char full_path[PATH_MAX]; 1644bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe struct stat sb; 1645bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 1646e85b2b83e39b64ba5cb73fbfddbf3902b6e84925Jens Axboe if (!strcmp(dir->d_name, ".") || !strcmp(dir->d_name, "..")) 1647e85b2b83e39b64ba5cb73fbfddbf3902b6e84925Jens Axboe continue; 164896d32d518a0743a6c050057bc1562e4883e51c5dJens Axboe 1649b9fd788f0e8adacc33316107594e9eb0463743d7Bruce Cran sprintf(full_path, "%s%s%s", dirname, FIO_OS_PATH_SEPARATOR, dir->d_name); 1650bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 1651bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe if (lstat(full_path, &sb) == -1) { 1652bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe if (errno != ENOENT) { 1653bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe td_verror(td, errno, "stat"); 165468ace9e00ca481d101f9937461402b83e8895ba2Jens Axboe ret = 1; 165568ace9e00ca481d101f9937461402b83e8895ba2Jens Axboe break; 1656bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe } 1657bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe } 1658bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 1659bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe if (S_ISREG(sb.st_mode)) { 16605903e7b7907854014478b6febfc5645a203ff59eJens Axboe add_file(td, full_path, 0, 1); 1661bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe continue; 1662bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe } 16630ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe if (!S_ISDIR(sb.st_mode)) 16640ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe continue; 1665bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 16665ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe ret = recurse_dir(td, full_path); 16675ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe if (ret) 1668bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe break; 1669bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe } 1670bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 1671bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe closedir(D); 1672bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe return ret; 1673bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe} 1674bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 1675bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboeint add_dir_files(struct thread_data *td, const char *path) 1676bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe{ 16770ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe int ret = recurse_dir(td, path); 16780ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe 16790ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe if (!ret) 16800ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe log_info("fio: opendir added %d files\n", td->o.nr_files); 16810ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe 16820ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe return ret; 1683bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe} 1684cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe 1685cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboevoid dup_files(struct thread_data *td, struct thread_data *org) 1686cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe{ 1687cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe struct fio_file *f; 1688cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe unsigned int i; 16899efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe 16909efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe dprint(FD_FILE, "dup files: %d\n", org->files_index); 1691cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe 1692cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe if (!org->files) 1693cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe return; 1694cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe 16959efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe td->files = malloc(org->files_index * sizeof(f)); 1696cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe 1697d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe if (td->o.file_lock_mode != FILE_LOCK_NONE) 1698d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe td->file_locks = malloc(org->files_index); 1699d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe 17009efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe for_each_file(org, f, i) { 1701b0fe421a6a0487ff71f6f903908f666d9ca1b327Jens Axboe struct fio_file *__f; 1702b0fe421a6a0487ff71f6f903908f666d9ca1b327Jens Axboe 17037b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe __f = alloc_new_file(td); 17040b9d69ecb14045cf3b2622ae922756b9889b25e6Jens Axboe 1705bc3456fa06cc7777c4764da8c7b1c0fd0a3c3772Aaron Carroll if (f->file_name) { 1706f17c43928c202e557f2f325272c60d9050ee528eJens Axboe __f->file_name = smalloc_strdup(f->file_name); 1707eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes if (!__f->file_name) 1708c48c0be79173897824d8f439c39374f2588931dcJens Axboe assert(0); 17090b9d69ecb14045cf3b2622ae922756b9889b25e6Jens Axboe 1710bc3456fa06cc7777c4764da8c7b1c0fd0a3c3772Aaron Carroll __f->filetype = f->filetype; 1711bc3456fa06cc7777c4764da8c7b1c0fd0a3c3772Aaron Carroll } 1712b0fe421a6a0487ff71f6f903908f666d9ca1b327Jens Axboe 171367ad92428bb19008354ca20e614050241e9f17e7Jens Axboe if (td->o.file_lock_mode == FILE_LOCK_EXCLUSIVE) 171467ad92428bb19008354ca20e614050241e9f17e7Jens Axboe __f->lock = f->lock; 171567ad92428bb19008354ca20e614050241e9f17e7Jens Axboe else if (td->o.file_lock_mode == FILE_LOCK_READWRITE) 171667ad92428bb19008354ca20e614050241e9f17e7Jens Axboe __f->rwlock = f->rwlock; 171767ad92428bb19008354ca20e614050241e9f17e7Jens Axboe 1718b0fe421a6a0487ff71f6f903908f666d9ca1b327Jens Axboe td->files[i] = __f; 1719cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe } 1720cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe} 1721f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe 1722f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe/* 1723f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe * Returns the index that matches the filename, or -1 if not there 1724f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe */ 1725f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboeint get_fileno(struct thread_data *td, const char *fname) 1726f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe{ 1727f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe struct fio_file *f; 1728f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe unsigned int i; 1729f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe 1730f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe for_each_file(td, f, i) 1731f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe if (!strcmp(f->file_name, fname)) 1732f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe return i; 1733f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe 1734f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe return -1; 1735f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe} 1736f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe 1737f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe/* 1738f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe * For log usage, where we add/open/close files automatically 1739f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe */ 1740f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboevoid free_release_files(struct thread_data *td) 1741f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe{ 1742f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe close_files(td); 17434c8e9f3a32ad0a1bc8bbc85b0cfe43e73a120753Jens Axboe td->o.nr_files = 0; 17444c8e9f3a32ad0a1bc8bbc85b0cfe43e73a120753Jens Axboe td->o.open_files = 0; 1745f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe td->files_index = 0; 1746f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe td->nr_normal_files = 0; 1747f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe} 174833c48814e08cf961801bf37f759da2748eb3431bJens Axboe 174933c48814e08cf961801bf37f759da2748eb3431bJens Axboevoid fio_file_reset(struct thread_data *td, struct fio_file *f) 175033c48814e08cf961801bf37f759da2748eb3431bJens Axboe{ 175108a99bed133fdd5dd6ef87c8638b45b135b10a8eJens Axboe int i; 175208a99bed133fdd5dd6ef87c8638b45b135b10a8eJens Axboe 175308a99bed133fdd5dd6ef87c8638b45b135b10a8eJens Axboe for (i = 0; i < DDIR_RWDIR_CNT; i++) { 175408a99bed133fdd5dd6ef87c8638b45b135b10a8eJens Axboe f->last_pos[i] = f->file_offset; 175508a99bed133fdd5dd6ef87c8638b45b135b10a8eJens Axboe f->last_start[i] = -1ULL; 175608a99bed133fdd5dd6ef87c8638b45b135b10a8eJens Axboe } 175708a99bed133fdd5dd6ef87c8638b45b135b10a8eJens Axboe 1758d55dd0413b5f2df5e637c9c6e752b4272e4a1e5fJens Axboe if (fio_file_axmap(f)) 175933c48814e08cf961801bf37f759da2748eb3431bJens Axboe axmap_reset(f->io_axmap); 1760d55dd0413b5f2df5e637c9c6e752b4272e4a1e5fJens Axboe else if (fio_file_lfsr(f)) 176133c48814e08cf961801bf37f759da2748eb3431bJens Axboe lfsr_reset(&f->lfsr, td->rand_seeds[FIO_RAND_BLOCK_OFF]); 176233c48814e08cf961801bf37f759da2748eb3431bJens Axboe} 1763002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe 1764eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughesbool fio_files_done(struct thread_data *td) 1765002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe{ 1766002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe struct fio_file *f; 1767002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe unsigned int i; 1768002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe 1769002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe for_each_file(td, f, i) 1770002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe if (!fio_file_done(f)) 1771eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes return false; 1772002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe 1773eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes return true; 1774002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe} 1775bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt 1776bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt/* free memory used in initialization phase only */ 1777190b8f0c9c1c1a99ed26fd953f7af9023f9533eeCastor Fuvoid filesetup_mem_free(void) 1778190b8f0c9c1c1a99ed26fd953f7af9023f9533eeCastor Fu{ 1779bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt free_already_allocated(); 1780bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt} 1781