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 27c592b9fe12d4739d99d5bece517e304804876df6Jens Axboestatic inline void clear_error(struct thread_data *td) 28c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe{ 29c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe td->error = 0; 30c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe td->verror[0] = '\0'; 31c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe} 32c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe 333baddf2450d811be658fb47ef883ee84478dc352Jens Axboe/* 343baddf2450d811be658fb47ef883ee84478dc352Jens Axboe * Leaves f->fd open on success, caller must close 353baddf2450d811be658fb47ef883ee84478dc352Jens Axboe */ 367bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboestatic int extend_file(struct thread_data *td, struct fio_file *f) 3725205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe{ 38ea443657ce85860b7a0dd2f39f2572d4a09fc885Jens Axboe int r, new_layout = 0, unlink_file = 0, flags; 3925205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe unsigned long long left; 4025205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe unsigned int bs; 41f3e1eb23a6c900921caa58c6cad66d3b60b0b6d7Jens Axboe char *b = NULL; 42b2a151925a91f38aeb298d693687a47269ad4e94Jens Axboe 434241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe if (read_only) { 444241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe log_err("fio: refusing extend of file due to read-only\n"); 454241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe return 0; 464241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe } 474241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe 48507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe /* 49507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe * check if we need to lay the file out complete again. fio 50507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe * does that for operations involving reads, or for writes 51507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe * where overwrite is set 52507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe */ 531417daeb92c44632f2e1e376d736a0f198d7af8dJens Axboe if (td_read(td) || 541417daeb92c44632f2e1e376d736a0f198d7af8dJens Axboe (td_write(td) && td->o.overwrite && !td->o.file_append) || 55ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe (td_write(td) && td->io_ops->flags & FIO_NOEXTEND)) 56507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe new_layout = 1; 571417daeb92c44632f2e1e376d736a0f198d7af8dJens Axboe if (td_write(td) && !td->o.overwrite && !td->o.file_append) 58ea443657ce85860b7a0dd2f39f2572d4a09fc885Jens Axboe unlink_file = 1; 59507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe 606ae1f57f2cb8661b97b770372eeb3694f6d5a744Jens Axboe if (unlink_file || new_layout) { 61bd199f2b98eeb9101795e40fdef5889c630178c1Jens Axboe dprint(FD_FILE, "layout unlink %s\n", f->file_name); 629187a269bf4539fa4b5b97a9b7439ba408d6b872Castor Fu if ((td_io_unlink_file(td, f) < 0) && (errno != ENOENT)) { 637bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe td_verror(td, errno, "unlink"); 647bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe return 1; 657bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } 667bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } 677bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 68507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe flags = O_WRONLY | O_CREAT; 69507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe if (new_layout) 70507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe flags |= O_TRUNC; 71507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe 729c0f3f3279985b724c2f1358bb05cc2c795f2265Bruce Cran#ifdef WIN32 739c0f3f3279985b724c2f1358bb05cc2c795f2265Bruce Cran flags |= _O_BINARY; 749c0f3f3279985b724c2f1358bb05cc2c795f2265Bruce Cran#endif 759c0f3f3279985b724c2f1358bb05cc2c795f2265Bruce Cran 76ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe dprint(FD_FILE, "open file %s, flags %x\n", f->file_name, flags); 77507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe f->fd = open(f->file_name, flags, 0644); 7853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (f->fd < 0) { 79e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe td_verror(td, errno, "open"); 8053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 1; 8153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 8253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 8397ac992c99d89eed8cdf9249bb038ac4d7b709b9Jens Axboe#ifdef CONFIG_POSIX_FALLOCATE 84a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou if (!td->o.fill_device) { 85a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou switch (td->o.fallocate_mode) { 86a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou case FIO_FALLOCATE_NONE: 87a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou break; 88a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou case FIO_FALLOCATE_POSIX: 89a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou dprint(FD_FILE, "posix_fallocate file %s size %llu\n", 904b91ee8fd12c72bd76ce9f5ff9116626b48566a0Jens Axboe f->file_name, 914b91ee8fd12c72bd76ce9f5ff9116626b48566a0Jens Axboe (unsigned long long) f->real_file_size); 92a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou 93a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou r = posix_fallocate(f->fd, 0, f->real_file_size); 94a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou if (r > 0) { 95a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou log_err("fio: posix_fallocate fails: %s\n", 96a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou strerror(r)); 97a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou } 98a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou break; 9997ac992c99d89eed8cdf9249bb038ac4d7b709b9Jens Axboe#ifdef CONFIG_LINUX_FALLOCATE 100a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou case FIO_FALLOCATE_KEEP_SIZE: 101a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou dprint(FD_FILE, 102a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou "fallocate(FALLOC_FL_KEEP_SIZE) " 1034b91ee8fd12c72bd76ce9f5ff9116626b48566a0Jens Axboe "file %s size %llu\n", f->file_name, 1044b91ee8fd12c72bd76ce9f5ff9116626b48566a0Jens Axboe (unsigned long long) f->real_file_size); 1057bc8c2cf02fbd538ca388618ff2f4618787a86e0Jens Axboe 106a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou r = fallocate(f->fd, FALLOC_FL_KEEP_SIZE, 0, 107a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou f->real_file_size); 108888677a428eb6ae6b54195e99734d6d6b3ee55e7Jens Axboe if (r != 0) 109a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou td_verror(td, errno, "fallocate"); 110888677a428eb6ae6b54195e99734d6d6b3ee55e7Jens Axboe 111a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou break; 11297ac992c99d89eed8cdf9249bb038ac4d7b709b9Jens Axboe#endif /* CONFIG_LINUX_FALLOCATE */ 113a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou default: 114a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou log_err("fio: unknown fallocate mode: %d\n", 115a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou td->o.fallocate_mode); 116a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou assert(0); 1177bc8c2cf02fbd538ca388618ff2f4618787a86e0Jens Axboe } 1187bc8c2cf02fbd538ca388618ff2f4618787a86e0Jens Axboe } 11997ac992c99d89eed8cdf9249bb038ac4d7b709b9Jens Axboe#endif /* CONFIG_POSIX_FALLOCATE */ 1209b8365618309572d8fd2579c8ea3132db89f843fBruce Cran 121fc74ac1d749c977308016eb22c8658a9a5ac7989Shawn Lewis if (!new_layout) 122fc74ac1d749c977308016eb22c8658a9a5ac7989Shawn Lewis goto done; 123fc74ac1d749c977308016eb22c8658a9a5ac7989Shawn Lewis 1245e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe /* 1255e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe * The size will be -1ULL when fill_device is used, so don't truncate 1265e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe * or fallocate this file, just write it 1275e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe */ 1285e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe if (!td->o.fill_device) { 1295e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe dprint(FD_FILE, "truncate file %s, size %llu\n", f->file_name, 1304b91ee8fd12c72bd76ce9f5ff9116626b48566a0Jens Axboe (unsigned long long) f->real_file_size); 1315e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe if (ftruncate(f->fd, f->real_file_size) == -1) { 1323cd4c66f35fad0df64e4e6dfeddc5bdfd5206e0cJohn if (errno != EFBIG) { 1333cd4c66f35fad0df64e4e6dfeddc5bdfd5206e0cJohn td_verror(td, errno, "ftruncate"); 1343cd4c66f35fad0df64e4e6dfeddc5bdfd5206e0cJohn goto err; 1353cd4c66f35fad0df64e4e6dfeddc5bdfd5206e0cJohn } 1365e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe } 1375e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe } 13840f8298cd252157fa15d93f8eb470116a94069a0Jens Axboe 1392dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe b = malloc(td->o.max_bs[DDIR_WRITE]); 14053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 1417bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe left = f->real_file_size; 14253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe while (left && !td->terminate) { 1432dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe bs = td->o.max_bs[DDIR_WRITE]; 14453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (bs > left) 14553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe bs = left; 14653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 147cc86c395fd9dd2002ec1edc0967b7c9453debdfbJens Axboe fill_io_buffer(td, b, bs, bs); 148cc86c395fd9dd2002ec1edc0967b7c9453debdfbJens Axboe 14953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe r = write(f->fd, b, bs); 15053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 1515e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe if (r > 0) { 1525e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe left -= r; 15353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe continue; 15453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } else { 1555e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe if (r < 0) { 1565e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe int __e = errno; 1575e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe 1585e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe if (__e == ENOSPC) { 1595e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe if (td->o.fill_device) 1605e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe break; 1615e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe log_info("fio: ENOSPC on laying out " 1625e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe "file, stopping\n"); 1635e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe break; 1645e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe } 165e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe td_verror(td, errno, "write"); 1665e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe } else 167e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe td_verror(td, EIO, "write"); 16853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 16953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe break; 17053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 17153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 17253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 173ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe if (td->terminate) { 174ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe dprint(FD_FILE, "terminate unlink %s\n", f->file_name); 1759187a269bf4539fa4b5b97a9b7439ba408d6b872Castor Fu td_io_unlink_file(td, f); 176ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe } else if (td->o.create_fsync) { 17798e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe if (fsync(f->fd) < 0) { 17898e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe td_verror(td, errno, "fsync"); 17998e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe goto err; 18098e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe } 18198e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe } 1820d1cd207e409a36313784cb9596990c819775f77Jens Axboe if (td->o.fill_device && !td_write(td)) { 183d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe fio_file_clear_size_known(f); 1845e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe if (td_io_get_file_size(td, f)) 1855e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe goto err; 1865e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe if (f->io_size > f->real_file_size) 1875e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe f->io_size = f->real_file_size; 1885e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe } 18953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 19053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe free(b); 191507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboedone: 19253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 0; 19353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboeerr: 19453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe close(f->fd); 19553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe f->fd = -1; 196f3e1eb23a6c900921caa58c6cad66d3b60b0b6d7Jens Axboe if (b) 197f3e1eb23a6c900921caa58c6cad66d3b60b0b6d7Jens Axboe free(b); 19853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 1; 19953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe} 20053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 201afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanminstatic int pre_read_file(struct thread_data *td, struct fio_file *f) 202afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin{ 203ef799a64618cbd53adb50d615666cd7afe9f0a8fJens Axboe int ret = 0, r, did_open = 0, old_runstate; 204afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin unsigned long long left; 205afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin unsigned int bs; 206afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin char *b; 207afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin 2089c0d224129b0c59698e4c77e7fed00dc8cbb50e1Jens Axboe if (td->io_ops->flags & FIO_PIPEIO) 2099c0d224129b0c59698e4c77e7fed00dc8cbb50e1Jens Axboe return 0; 2109c0d224129b0c59698e4c77e7fed00dc8cbb50e1Jens Axboe 211d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe if (!fio_file_open(f)) { 212b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe if (td->io_ops->open_file(td, f)) { 213b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe log_err("fio: cannot pre-read, failed to open file\n"); 214b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe return 1; 215b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe } 216b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe did_open = 1; 217b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe } 218b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe 2198edd973d57a311d4c590d7385796bbdf111ed04cJens Axboe old_runstate = td_bump_runstate(td, TD_PRE_READING); 220b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe 221afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin bs = td->o.max_bs[DDIR_READ]; 222afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin b = malloc(bs); 223afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin memset(b, 0, bs); 224afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin 225ef799a64618cbd53adb50d615666cd7afe9f0a8fJens Axboe if (lseek(f->fd, f->file_offset, SEEK_SET) < 0) { 226ef799a64618cbd53adb50d615666cd7afe9f0a8fJens Axboe td_verror(td, errno, "lseek"); 227ef799a64618cbd53adb50d615666cd7afe9f0a8fJens Axboe log_err("fio: failed to lseek pre-read file\n"); 228ef799a64618cbd53adb50d615666cd7afe9f0a8fJens Axboe ret = 1; 229ef799a64618cbd53adb50d615666cd7afe9f0a8fJens Axboe goto error; 230ef799a64618cbd53adb50d615666cd7afe9f0a8fJens Axboe } 231ef799a64618cbd53adb50d615666cd7afe9f0a8fJens Axboe 232afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin left = f->io_size; 233afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin 234afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin while (left && !td->terminate) { 235afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin if (bs > left) 236afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin bs = left; 237afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin 238afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin r = read(f->fd, b, bs); 239afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin 240afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin if (r == (int) bs) { 241afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin left -= bs; 242afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin continue; 243afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin } else { 244afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin td_verror(td, EIO, "pre_read"); 245afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin break; 246afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin } 247afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin } 248afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin 249ef799a64618cbd53adb50d615666cd7afe9f0a8fJens Axboeerror: 2508edd973d57a311d4c590d7385796bbdf111ed04cJens Axboe td_restore_runstate(td, old_runstate); 251b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe 252b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe if (did_open) 253b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe td->io_ops->close_file(td, f); 254ef799a64618cbd53adb50d615666cd7afe9f0a8fJens Axboe 255afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin free(b); 256ef799a64618cbd53adb50d615666cd7afe9f0a8fJens Axboe return ret; 257afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin} 258afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin 2597bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboestatic unsigned long long get_rand_file_size(struct thread_data *td) 2609c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe{ 261dc873b6f4a536c332b72cce268d5a7ccd356a891Jens Axboe unsigned long long ret, sized; 2621294c3ec7a02d20a98b105c1c41b23358afc67e4Jens Axboe unsigned long r; 2639c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe 264f678701783f1c200ce574215feeb7ff801c4ff72Jens Axboe r = __rand(&td->file_size_state); 265559073f664a872f32632892c560667097b29e963Jens Axboe sized = td->o.file_size_high - td->o.file_size_low; 266559073f664a872f32632892c560667097b29e963Jens Axboe ret = (unsigned long long) ((double) sized * (r / (FRAND_MAX + 1.0))); 2675ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe ret += td->o.file_size_low; 2682dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe ret -= (ret % td->o.rw_min_bs); 2699c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe return ret; 2709c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe} 2719c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe 27253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboestatic int file_size(struct thread_data *td, struct fio_file *f) 27353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{ 27453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe struct stat st; 27553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 276df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe if (stat(f->file_name, &st) == -1) { 2777bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe td_verror(td, errno, "fstat"); 2787bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe return 1; 2797bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } 28053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 2817bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe f->real_file_size = st.st_size; 28253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 0; 28353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe} 28453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 28553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboestatic int bdev_size(struct thread_data *td, struct fio_file *f) 28653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{ 2879b8365618309572d8fd2579c8ea3132db89f843fBruce Cran unsigned long long bytes = 0; 28853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe int r; 28953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 290df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe if (td->io_ops->open_file(td, f)) { 291df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe log_err("fio: failed opening blockdev %s for size check\n", 292df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe f->file_name); 293df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe return 1; 294df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe } 295df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe 296ecc314ba7c5f02b7e90ac1dfbce1a74cd4e6d6feBruce Cran r = blockdev_size(f, &bytes); 29753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (r) { 298e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe td_verror(td, r, "blockdev_size"); 299df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe goto err; 30053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 30153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 3027ab077ab119fd28b6ccf5705ea8453e414f574c1Jens Axboe if (!bytes) { 3037ab077ab119fd28b6ccf5705ea8453e414f574c1Jens Axboe log_err("%s: zero sized block device?\n", f->file_name); 304df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe goto err; 3057ab077ab119fd28b6ccf5705ea8453e414f574c1Jens Axboe } 3067ab077ab119fd28b6ccf5705ea8453e414f574c1Jens Axboe 30753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe f->real_file_size = bytes; 30822a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe td->io_ops->close_file(td, f); 30953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 0; 310df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboeerr: 311df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe td->io_ops->close_file(td, f); 312df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe return 1; 31353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe} 31453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 3154ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboestatic int char_size(struct thread_data *td, struct fio_file *f) 3164ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe{ 3174ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe#ifdef FIO_HAVE_CHARDEV_SIZE 3189b8365618309572d8fd2579c8ea3132db89f843fBruce Cran unsigned long long bytes = 0; 3194ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe int r; 3204ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe 3214ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe if (td->io_ops->open_file(td, f)) { 3224ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe log_err("fio: failed opening blockdev %s for size check\n", 3234ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe f->file_name); 3244ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe return 1; 3254ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe } 3264ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe 327ecc314ba7c5f02b7e90ac1dfbce1a74cd4e6d6feBruce Cran r = chardev_size(f, &bytes); 3284ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe if (r) { 3294ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe td_verror(td, r, "chardev_size"); 3304ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe goto err; 3314ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe } 3324ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe 3334ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe if (!bytes) { 3344ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe log_err("%s: zero sized char device?\n", f->file_name); 3354ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe goto err; 3364ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe } 3374ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe 3384ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe f->real_file_size = bytes; 3394ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe td->io_ops->close_file(td, f); 3404ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe return 0; 3414ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboeerr: 3424ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe td->io_ops->close_file(td, f); 3434ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe return 1; 3444ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe#else 3454ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe f->real_file_size = -1ULL; 3464ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe return 0; 3474ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe#endif 3484ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe} 3494ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe 35053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboestatic int get_file_size(struct thread_data *td, struct fio_file *f) 35153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{ 35253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe int ret = 0; 35353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 354d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe if (fio_file_size_known(f)) 355409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe return 0; 356409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe 3577bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (f->filetype == FIO_TYPE_FILE) 3587bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe ret = file_size(td, f); 3597bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe else if (f->filetype == FIO_TYPE_BD) 36053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe ret = bdev_size(td, f); 3614ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe else if (f->filetype == FIO_TYPE_CHAR) 3624ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe ret = char_size(td, f); 36353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe else 36453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe f->real_file_size = -1; 36553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 36653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (ret) 36753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return ret; 36853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 36953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (f->file_offset > f->real_file_size) { 3700f2152c19ed12fc2280c3d475973112f18e48cd5Bruce Cran log_err("%s: offset extends end (%llu > %llu)\n", td->o.name, 3714e0a8fa2593006505b7f4e18931a201d221b49e9Jens Axboe (unsigned long long) f->file_offset, 3724e0a8fa2593006505b7f4e18931a201d221b49e9Jens Axboe (unsigned long long) f->real_file_size); 37353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 1; 37453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 37553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 376d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe fio_file_set_size_known(f); 37753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 0; 37853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe} 37953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 3803baddf2450d811be658fb47ef883ee84478dc352Jens Axboestatic int __file_invalidate_cache(struct thread_data *td, struct fio_file *f, 3813baddf2450d811be658fb47ef883ee84478dc352Jens Axboe unsigned long long off, 3823baddf2450d811be658fb47ef883ee84478dc352Jens Axboe unsigned long long len) 383e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe{ 384e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe int ret = 0; 385e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe 386ef7035a9b2c7af1e745b7cd2448685527ef7eeb0Jens Axboe#ifdef CONFIG_ESX 387ef7035a9b2c7af1e745b7cd2448685527ef7eeb0Jens Axboe return 0; 388ef7035a9b2c7af1e745b7cd2448685527ef7eeb0Jens Axboe#endif 389ef7035a9b2c7af1e745b7cd2448685527ef7eeb0Jens Axboe 3905e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe if (len == -1ULL) 3913baddf2450d811be658fb47ef883ee84478dc352Jens Axboe len = f->io_size; 3923baddf2450d811be658fb47ef883ee84478dc352Jens Axboe if (off == -1ULL) 3933baddf2450d811be658fb47ef883ee84478dc352Jens Axboe off = f->file_offset; 394ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe 3950d1cd207e409a36313784cb9596990c819775f77Jens Axboe if (len == -1ULL || off == -1ULL) 3960d1cd207e409a36313784cb9596990c819775f77Jens Axboe return 0; 3970d1cd207e409a36313784cb9596990c819775f77Jens Axboe 3983baddf2450d811be658fb47ef883ee84478dc352Jens Axboe dprint(FD_IO, "invalidate cache %s: %llu/%llu\n", f->file_name, off, 3993baddf2450d811be658fb47ef883ee84478dc352Jens Axboe len); 400b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe 4011be9f219c5f7d218a6c5cced3ee93c7174a032daJens Axboe if (td->io_ops->invalidate) 4021be9f219c5f7d218a6c5cced3ee93c7174a032daJens Axboe ret = td->io_ops->invalidate(td, f); 403eea6bedef6357ff84b878f989f758f9a8e441839Jens Axboe else if (f->filetype == FIO_TYPE_FILE) 404ecc314ba7c5f02b7e90ac1dfbce1a74cd4e6d6feBruce Cran ret = posix_fadvise(f->fd, off, len, POSIX_FADV_DONTNEED); 405eea6bedef6357ff84b878f989f758f9a8e441839Jens Axboe else if (f->filetype == FIO_TYPE_BD) { 406ecc314ba7c5f02b7e90ac1dfbce1a74cd4e6d6feBruce Cran ret = blockdev_invalidate_cache(f); 4077e0e25c924d51f23196b3e0ea83b79178fc46823Jens Axboe if (ret < 0 && errno == EACCES && geteuid()) { 4087172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboe if (!root_warn) { 4095ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe log_err("fio: only root may flush block " 4105ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe "devices. Cache flush bypassed!\n"); 4117172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboe root_warn = 1; 4127172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboe } 4137e0e25c924d51f23196b3e0ea83b79178fc46823Jens Axboe ret = 0; 4147e0e25c924d51f23196b3e0ea83b79178fc46823Jens Axboe } 415b5605e9ded4188ed91faae1a43ecd333a9856f62Jens Axboe } else if (f->filetype == FIO_TYPE_CHAR || f->filetype == FIO_TYPE_PIPE) 416e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe ret = 0; 417e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe 418dfe11fd1e8249a52c42f34c9e9e6b910ab6b05c5Jens Axboe /* 419dfe11fd1e8249a52c42f34c9e9e6b910ab6b05c5Jens Axboe * Cache flushing isn't a fatal condition, and we know it will 420dfe11fd1e8249a52c42f34c9e9e6b910ab6b05c5Jens Axboe * happen on some platforms where we don't have the proper 421dfe11fd1e8249a52c42f34c9e9e6b910ab6b05c5Jens Axboe * function to flush eg block device caches. So just warn and 422dfe11fd1e8249a52c42f34c9e9e6b910ab6b05c5Jens Axboe * continue on our way. 423dfe11fd1e8249a52c42f34c9e9e6b910ab6b05c5Jens Axboe */ 424dfe11fd1e8249a52c42f34c9e9e6b910ab6b05c5Jens Axboe if (ret) { 425dfe11fd1e8249a52c42f34c9e9e6b910ab6b05c5Jens Axboe log_info("fio: cache invalidation of %s failed: %s\n", f->file_name, strerror(errno)); 426dfe11fd1e8249a52c42f34c9e9e6b910ab6b05c5Jens Axboe ret = 0; 427e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe } 428e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe 429dfe11fd1e8249a52c42f34c9e9e6b910ab6b05c5Jens Axboe return 0; 4303baddf2450d811be658fb47ef883ee84478dc352Jens Axboe 4313baddf2450d811be658fb47ef883ee84478dc352Jens Axboe} 4323baddf2450d811be658fb47ef883ee84478dc352Jens Axboe 4333baddf2450d811be658fb47ef883ee84478dc352Jens Axboeint file_invalidate_cache(struct thread_data *td, struct fio_file *f) 4343baddf2450d811be658fb47ef883ee84478dc352Jens Axboe{ 435d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe if (!fio_file_open(f)) 436a5fb461fdff86c442daeebbd28e07984be9f3807Jens Axboe return 0; 437a5fb461fdff86c442daeebbd28e07984be9f3807Jens Axboe 4385e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe return __file_invalidate_cache(td, f, -1ULL, -1ULL); 439e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe} 440e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe 4416977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboeint generic_close_file(struct thread_data fio_unused *td, struct fio_file *f) 44253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{ 4436977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe int ret = 0; 4446977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe 445ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe dprint(FD_FILE, "fd close %s\n", f->file_name); 4464906e0b57f2b8cbad02ef2428522281cf6038bddJens Axboe 4474906e0b57f2b8cbad02ef2428522281cf6038bddJens Axboe remove_file_hash(f); 4484906e0b57f2b8cbad02ef2428522281cf6038bddJens Axboe 4496977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe if (close(f->fd) < 0) 4506977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe ret = errno; 4516977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe 452b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe f->fd = -1; 453e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe 454e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe if (f->shadow_fd != -1) { 455e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe close(f->shadow_fd); 456e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe f->shadow_fd = -1; 457e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe } 458e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe 45957e54e087e051186d18cdedad20a2460463d4d30Juan Casse f->engine_data = 0; 4606977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe return ret; 46153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe} 46253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 4631ccc6dc75b28ef70cd7a8c39ac8c1cb68c720a65Dmitry Monakhovint file_lookup_open(struct fio_file *f, int flags) 46453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{ 46529c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe struct fio_file *__f; 4664d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe int from_hash; 4674d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe 4684d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe __f = lookup_file_hash(f->file_name); 4694d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe if (__f) { 4709efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe dprint(FD_FILE, "found file in hash %s\n", f->file_name); 4714d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe /* 4724d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe * racy, need the __f->lock locked 4734d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe */ 4744d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe f->lock = __f->lock; 4754d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe from_hash = 1; 4764d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe } else { 4779efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe dprint(FD_FILE, "file not found in hash %s\n", f->file_name); 4784d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe from_hash = 0; 4794d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe } 4804d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe 4819c0f3f3279985b724c2f1358bb05cc2c795f2265Bruce Cran#ifdef WIN32 4829c0f3f3279985b724c2f1358bb05cc2c795f2265Bruce Cran flags |= _O_BINARY; 4839c0f3f3279985b724c2f1358bb05cc2c795f2265Bruce Cran#endif 4849c0f3f3279985b724c2f1358bb05cc2c795f2265Bruce Cran 485e8670ef8b26039573fbf835b4b95ba45a1039d83Jens Axboe f->fd = open(f->file_name, flags, 0600); 4864d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe return from_hash; 4874d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe} 4884d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe 489e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboestatic int file_close_shadow_fds(struct thread_data *td) 490e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe{ 491e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe struct fio_file *f; 492e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe int num_closed = 0; 493e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe unsigned int i; 494e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe 495e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe for_each_file(td, f, i) { 496e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe if (f->shadow_fd == -1) 497e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe continue; 498e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe 499e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe close(f->shadow_fd); 500e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe f->shadow_fd = -1; 501e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe num_closed++; 502e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe } 503e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe 504e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe return num_closed; 505e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe} 506e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe 5074d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboeint generic_open_file(struct thread_data *td, struct fio_file *f) 5084d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe{ 509661598287ecc3b8987f312cf8403936552ce686aJens Axboe int is_std = 0; 51053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe int flags = 0; 51129c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe int from_hash = 0; 51253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 513ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe dprint(FD_FILE, "fd open %s\n", f->file_name); 514ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe 5156eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li if (td_trim(td) && f->filetype != FIO_TYPE_BD) { 5166eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li log_err("fio: trim only applies to block device\n"); 5176eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li return 1; 5186eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li } 5196eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li 520661598287ecc3b8987f312cf8403936552ce686aJens Axboe if (!strcmp(f->file_name, "-")) { 521661598287ecc3b8987f312cf8403936552ce686aJens Axboe if (td_rw(td)) { 522661598287ecc3b8987f312cf8403936552ce686aJens Axboe log_err("fio: can't read/write to stdin/out\n"); 523661598287ecc3b8987f312cf8403936552ce686aJens Axboe return 1; 524661598287ecc3b8987f312cf8403936552ce686aJens Axboe } 525661598287ecc3b8987f312cf8403936552ce686aJens Axboe is_std = 1; 526ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe 527ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe /* 528ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe * move output logging to stderr, if we are writing to stdout 529ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe */ 530ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe if (td_write(td)) 531ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe f_out = stderr; 532661598287ecc3b8987f312cf8403936552ce686aJens Axboe } 533661598287ecc3b8987f312cf8403936552ce686aJens Axboe 5346eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li if (td_trim(td)) 5356eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li goto skip_flags; 5362dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe if (td->o.odirect) 5372fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe flags |= OS_O_DIRECT; 538d01612f3ae2515eb035d0c4ce954d8cb167a0a61Chris Mason if (td->o.oatomic) { 539d01612f3ae2515eb035d0c4ce954d8cb167a0a61Chris Mason if (!FIO_O_ATOMIC) { 540d01612f3ae2515eb035d0c4ce954d8cb167a0a61Chris Mason td_verror(td, EINVAL, "OS does not support atomic IO"); 541d01612f3ae2515eb035d0c4ce954d8cb167a0a61Chris Mason return 1; 542d01612f3ae2515eb035d0c4ce954d8cb167a0a61Chris Mason } 543d01612f3ae2515eb035d0c4ce954d8cb167a0a61Chris Mason flags |= OS_O_DIRECT | FIO_O_ATOMIC; 544d01612f3ae2515eb035d0c4ce954d8cb167a0a61Chris Mason } 5452dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe if (td->o.sync_io) 5462fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe flags |= O_SYNC; 547814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe if (td->o.create_on_open) 548814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe flags |= O_CREAT; 5496eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Liskip_flags: 5506eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li if (f->filetype != FIO_TYPE_FILE) 5516eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li flags |= FIO_O_NOATIME; 55253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 553056f3459149a7670257350d84b49858718e4a0e6Aaron Carrollopen_again: 554660a1cb5fb9843ec09a04337714e78d63cd557e7Jens Axboe if (td_write(td)) { 555173081581f94dc4f9f203eb7a7922fc843bfafdeJens Axboe if (!read_only) 556173081581f94dc4f9f203eb7a7922fc843bfafdeJens Axboe flags |= O_RDWR; 55753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 558af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe if (f->filetype == FIO_TYPE_FILE) 5592fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe flags |= O_CREAT; 5602fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe 561661598287ecc3b8987f312cf8403936552ce686aJens Axboe if (is_std) 562661598287ecc3b8987f312cf8403936552ce686aJens Axboe f->fd = dup(STDOUT_FILENO); 5634d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe else 5644d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe from_hash = file_lookup_open(f, flags); 5656eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li } else if (td_read(td)) { 5664241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe if (f->filetype == FIO_TYPE_CHAR && !read_only) 5672fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe flags |= O_RDWR; 5682fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe else 5692fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe flags |= O_RDONLY; 5702fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe 571661598287ecc3b8987f312cf8403936552ce686aJens Axboe if (is_std) 572661598287ecc3b8987f312cf8403936552ce686aJens Axboe f->fd = dup(STDIN_FILENO); 5734d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe else 5744d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe from_hash = file_lookup_open(f, flags); 5756eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li } else { //td trim 5766eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li flags |= O_RDWR; 5776eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li from_hash = file_lookup_open(f, flags); 57853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 57953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 58053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (f->fd == -1) { 581e4e33258637e55550a0fac59eb3350e8bf06f8e6Jens Axboe char buf[FIO_VERROR_SIZE]; 582e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe int __e = errno; 583e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe 584835d9b9ed0e5c2591b8a3eacbd5f4ab6bdab466cJens Axboe if (__e == EPERM && (flags & FIO_O_NOATIME)) { 5855921e80c5dfc9f96d2f21da6ae58f2b5d3a0b373Jens Axboe flags &= ~FIO_O_NOATIME; 586056f3459149a7670257350d84b49858718e4a0e6Aaron Carroll goto open_again; 587056f3459149a7670257350d84b49858718e4a0e6Aaron Carroll } 588e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe if (__e == EMFILE && file_close_shadow_fds(td)) 589e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe goto open_again; 590056f3459149a7670257350d84b49858718e4a0e6Aaron Carroll 59198ffb8f3ecebed9984d1744f142eb8be10c14dbdKen Raeburn snprintf(buf, sizeof(buf), "open(%s)", f->file_name); 592e4e33258637e55550a0fac59eb3350e8bf06f8e6Jens Axboe 593a93c5f049da63a60f9962177d8ada50094d234deJens Axboe if (__e == EINVAL && (flags & OS_O_DIRECT)) { 594a93c5f049da63a60f9962177d8ada50094d234deJens Axboe log_err("fio: looks like your file system does not " \ 595a93c5f049da63a60f9962177d8ada50094d234deJens Axboe "support direct=1/buffered=0\n"); 596a93c5f049da63a60f9962177d8ada50094d234deJens Axboe } 597a93c5f049da63a60f9962177d8ada50094d234deJens Axboe 598e4e33258637e55550a0fac59eb3350e8bf06f8e6Jens Axboe td_verror(td, __e, buf); 59934329ca61aaf3be246a4a9d69412a1f3cdccee42Andreas Gruenbacher return 1; 60053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 60153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 60229c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe if (!from_hash && f->fd != -1) { 60329c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe if (add_file_hash(f)) { 6043f0ca9b914e6d0db8c5c457713c277ce458cbc02Jens Axboe int fio_unused ret; 60529c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe 60629c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe /* 607e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe * Stash away descriptor for later close. This is to 608e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe * work-around a "feature" on Linux, where a close of 609e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe * an fd that has been opened for write will trigger 610e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe * udev to call blkid to check partitions, fs id, etc. 611de8f6de97438d5664cd8765e60102b9109a273e2Anatol Pomozov * That pollutes the device cache, which can slow down 612e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe * unbuffered accesses. 61329c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe */ 614e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe if (f->shadow_fd == -1) 615e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe f->shadow_fd = f->fd; 616e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe else { 617e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe /* 618e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe * OK to ignore, we haven't done anything 619e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe * with it 620e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe */ 621e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe ret = generic_close_file(td, f); 622e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe } 62329c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe goto open_again; 62429c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe } 62529c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe } 6264906e0b57f2b8cbad02ef2428522281cf6038bddJens Axboe 62753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 0; 628b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe} 629b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe 630df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboeint generic_get_file_size(struct thread_data *td, struct fio_file *f) 63121972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe{ 632df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe return get_file_size(td, f); 63321972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe} 63421972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe 6357bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe/* 6367bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * open/close all files, so that ->real_file_size gets set 6377bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */ 638bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboestatic int get_file_sizes(struct thread_data *td) 6397bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe{ 6407bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe struct fio_file *f; 6417bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe unsigned int i; 642bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe int err = 0; 6437bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 6447bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe for_each_file(td, f, i) { 6455ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe dprint(FD_FILE, "get file size for %p/%d/%p\n", f, i, 6465ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe f->file_name); 6479efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe 64899a47c6905731e53dd4d8f7ea6501f36d9329e7bJens Axboe if (td_io_get_file_size(td, f)) { 64940b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe if (td->error != ENOENT) { 65040b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe log_err("%s\n", td->verror); 65140b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe err = 1; 65234329ca61aaf3be246a4a9d69412a1f3cdccee42Andreas Gruenbacher break; 65340b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe } 654541d66d70b8fbe9860b31307c0760e6d5f4c78a8Jens Axboe clear_error(td); 65507eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe } 656409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe 657409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe if (f->real_file_size == -1ULL && td->o.size) 658409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe f->real_file_size = td->o.size / td->o.nr_files; 6597bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } 660bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe 661bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe return err; 6627bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe} 6637bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 6642e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboestruct fio_mount { 6652e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe struct flist_head list; 6662e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe const char *base; 6672e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe char __base[256]; 6682e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe unsigned int key; 6692e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe}; 6702e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 6712e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe/* 6722e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe * Get free number of bytes for each file on each unique mount. 6732e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe */ 6742e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboestatic unsigned long long get_fs_free_counts(struct thread_data *td) 6752e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe{ 6762e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe struct flist_head *n, *tmp; 67768b0316f581c3c881d7dbf7c9dafef4a10100a66Jens Axboe unsigned long long ret = 0; 6782e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe struct fio_mount *fm; 6792e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe FLIST_HEAD(list); 6802e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe struct fio_file *f; 6812e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe unsigned int i; 6822e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 6832e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe for_each_file(td, f, i) { 6842e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe struct stat sb; 6852e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe char buf[256]; 6862e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 6874ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe if (f->filetype == FIO_TYPE_BD || f->filetype == FIO_TYPE_CHAR) { 6884ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe if (f->real_file_size != -1ULL) 6894ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe ret += f->real_file_size; 69068b0316f581c3c881d7dbf7c9dafef4a10100a66Jens Axboe continue; 69168b0316f581c3c881d7dbf7c9dafef4a10100a66Jens Axboe } else if (f->filetype != FIO_TYPE_FILE) 69268b0316f581c3c881d7dbf7c9dafef4a10100a66Jens Axboe continue; 69368b0316f581c3c881d7dbf7c9dafef4a10100a66Jens Axboe 694da27a4bf0f9753fcc9da7b63f1be482fc0349907Jens Axboe buf[255] = '\0'; 695da27a4bf0f9753fcc9da7b63f1be482fc0349907Jens Axboe strncpy(buf, f->file_name, 255); 6962e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 6972e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe if (stat(buf, &sb) < 0) { 6982e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe if (errno != ENOENT) 6992e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe break; 7002e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe strcpy(buf, "."); 7012e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe if (stat(buf, &sb) < 0) 7022e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe break; 7032e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe } 7042e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 7052e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe fm = NULL; 7062e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe flist_for_each(n, &list) { 7072e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe fm = flist_entry(n, struct fio_mount, list); 7082e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe if (fm->key == sb.st_dev) 7092e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe break; 7102e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 7112e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe fm = NULL; 7122e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe } 7132e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 7142e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe if (fm) 7152e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe continue; 7162e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 7173660ceae229f08b4086279be7c82e86926f0304bJens Axboe fm = calloc(1, sizeof(*fm)); 7183660ceae229f08b4086279be7c82e86926f0304bJens Axboe strncpy(fm->__base, buf, sizeof(fm->__base) - 1); 7192e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe fm->base = basename(fm->__base); 7202e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe fm->key = sb.st_dev; 7212e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe flist_add(&fm->list, &list); 7222e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe } 7232e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 7242e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe flist_for_each_safe(n, tmp, &list) { 7252e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe unsigned long long sz; 7262e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 7272e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe fm = flist_entry(n, struct fio_mount, list); 7282e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe flist_del(&fm->list); 7292e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 7302e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe sz = get_fs_size(fm->base); 7312e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe if (sz && sz != -1ULL) 7322e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe ret += sz; 7332e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 7342e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe free(fm); 7352e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe } 7362e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 7372e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe return ret; 7382e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe} 7392e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 740bedc9dc24223bb33be4120f4a57718bc54888ca5Jens Axboeuint64_t get_start_offset(struct thread_data *td, struct fio_file *f) 741ce95d651568bd5494e4c4ddc95832715c6760d56Dan Ehrenberg{ 742bedc9dc24223bb33be4120f4a57718bc54888ca5Jens Axboe struct thread_options *o = &td->o; 743bedc9dc24223bb33be4120f4a57718bc54888ca5Jens Axboe 744bedc9dc24223bb33be4120f4a57718bc54888ca5Jens Axboe if (o->file_append && f->filetype == FIO_TYPE_FILE) 745bedc9dc24223bb33be4120f4a57718bc54888ca5Jens Axboe return f->real_file_size; 746bedc9dc24223bb33be4120f4a57718bc54888ca5Jens Axboe 747ce95d651568bd5494e4c4ddc95832715c6760d56Dan Ehrenberg return td->o.start_offset + 7485a65b4e4ce51be2144abaf47635e20a0ebf684ecJiri Horky td->subjob_number * td->o.offset_increment; 749ce95d651568bd5494e4c4ddc95832715c6760d56Dan Ehrenberg} 750ce95d651568bd5494e4c4ddc95832715c6760d56Dan Ehrenberg 7517bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe/* 7527bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * Open the files and setup files sizes, creating files if necessary. 7537bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */ 75453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboeint setup_files(struct thread_data *td) 75553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{ 7567bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe unsigned long long total_size, extend_size; 757de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe struct thread_options *o = &td->o; 75853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe struct fio_file *f; 759002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe unsigned int i, nr_fs_extra = 0; 760000b080395e45cbe0ce54e75f0e993addbdc8676Jens Axboe int err = 0, need_extend; 761e90391eb56d81a2cc175c50caf6b4e5abbdb6142Jens Axboe int old_state; 762002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe const unsigned int bs = td_min_bs(td); 763002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe uint64_t fs = 0; 76453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 765ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe dprint(FD_FILE, "setup files\n"); 766ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe 7678edd973d57a311d4c590d7385796bbdf111ed04cJens Axboe old_state = td_bump_runstate(td, TD_SETTING_UP); 768e90391eb56d81a2cc175c50caf6b4e5abbdb6142Jens Axboe 769de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe if (o->read_iolog_file) 77025460cf6350fb90b8a7943bb649a51d81bac13a4Jens Axboe goto done; 771691c8fb014da9dd82e999a90b5511423f4eee188Jens Axboe 77253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe /* 77353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe * if ioengine defines a setup() method, it's responsible for 7747bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * opening the files and setting f->real_file_size to indicate 7757bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * the valid range for that file. 77653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe */ 77753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (td->io_ops->setup) 7787bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe err = td->io_ops->setup(td); 7797bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe else 780bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe err = get_file_sizes(td); 78153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 782f102706350093e60617cc271b128e56c57ab3ce7Jens Axboe if (err) 783e90391eb56d81a2cc175c50caf6b4e5abbdb6142Jens Axboe goto err_out; 784f102706350093e60617cc271b128e56c57ab3ce7Jens Axboe 7850a7eb121ecb2e4279e9eb8178aa1e554dda40191Jens Axboe /* 7867bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * check sizes. if the files/devices do not exist and the size 7877bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * isn't passed to fio, abort. 7880a7eb121ecb2e4279e9eb8178aa1e554dda40191Jens Axboe */ 7897bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe total_size = 0; 7907bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe for_each_file(td, f, i) { 7917bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (f->real_file_size == -1ULL) 7927bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe total_size = -1ULL; 7937bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe else 7947bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe total_size += f->real_file_size; 7957bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } 7960a7eb121ecb2e4279e9eb8178aa1e554dda40191Jens Axboe 797de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe if (o->fill_device) 7982e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe td->fill_device_size = get_fs_free_counts(td); 7992e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 8007bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe /* 8017bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * device/file sizes are zero and no size given, punt 8027bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */ 803de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe if ((!total_size || total_size == -1ULL) && !o->size && 804de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe !(td->io_ops->flags & FIO_NOIO) && !o->fill_device && 805de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe !(o->nr_files && (o->file_size_low || o->file_size_high))) { 806de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe log_err("%s: you need to specify size=\n", o->name); 807e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe td_verror(td, EINVAL, "total_file_size"); 808e90391eb56d81a2cc175c50caf6b4e5abbdb6142Jens Axboe goto err_out; 80953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 81053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 8117bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe /* 812002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe * Calculate per-file size and potential extra size for the 813002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe * first files, if needed. 814002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe */ 815d1e78e6b0429bac92794fb6f1c24b5078c68da6dJens Axboe if (!o->file_size_low && o->nr_files) { 816002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe uint64_t all_fs; 817002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe 818002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe fs = o->size / o->nr_files; 819002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe all_fs = fs * o->nr_files; 820002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe 821002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe if (all_fs < o->size) 822002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe nr_fs_extra = (o->size - all_fs) / bs; 823002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe } 824002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe 825002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe /* 8267bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * now file sizes are known, so we can set ->io_size. if size= is 8277bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * not given, ->io_size is just equal to ->real_file_size. if size 8287bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * is given, ->io_size is size / nr_files. 8297bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */ 8307bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe extend_size = total_size = 0; 8317bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe need_extend = 0; 8327bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe for_each_file(td, f, i) { 833bedc9dc24223bb33be4120f4a57718bc54888ca5Jens Axboe f->file_offset = get_start_offset(td, f); 834bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang 835de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe if (!o->file_size_low) { 8367bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe /* 8377bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * no file size range given, file size is equal to 838002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe * total size divided by number of files. If that is 839002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe * zero, set it to the real file size. If the size 840002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe * doesn't divide nicely with the min blocksize, 841002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe * make the first files bigger. 8427bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */ 843002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe f->io_size = fs; 844002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe if (nr_fs_extra) { 845002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe nr_fs_extra--; 846002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe f->io_size += bs; 847002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe } 848002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe 84965bdb10a09222d8b5d213de74824be775772ea8fJens Axboe if (!f->io_size) 850273f8c912d981439049d9b21aa048aaeaa323c5dJens Axboe f->io_size = f->real_file_size - f->file_offset; 851de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe } else if (f->real_file_size < o->file_size_low || 852de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe f->real_file_size > o->file_size_high) { 853de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe if (f->file_offset > o->file_size_low) 854bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang goto err_offset; 8557bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe /* 8567bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * file size given. if it's fixed, use that. if it's a 8577bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * range, generate a random size in-between. 8587bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */ 859de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe if (o->file_size_low == o->file_size_high) 860de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe f->io_size = o->file_size_low - f->file_offset; 861de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe else { 8625ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe f->io_size = get_rand_file_size(td) 8635ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe - f->file_offset; 8645ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe } 86565bdb10a09222d8b5d213de74824be775772ea8fJens Axboe } else 866bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang f->io_size = f->real_file_size - f->file_offset; 86753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 8687bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (f->io_size == -1ULL) 8697bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe total_size = -1ULL; 8704d002569dc503474a53e824e3f72b10a09c9a2b5Shaohua Li else { 871de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe if (o->size_percent) 872de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe f->io_size = (f->io_size * o->size_percent) / 100; 8737bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe total_size += f->io_size; 8744d002569dc503474a53e824e3f72b10a09c9a2b5Shaohua Li } 8757bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 8767bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (f->filetype == FIO_TYPE_FILE && 877bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang (f->io_size + f->file_offset) > f->real_file_size && 8787bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe !(td->io_ops->flags & FIO_DISKLESSIO)) { 879de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe if (!o->create_on_open) { 880814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe need_extend++; 881814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe extend_size += (f->io_size + f->file_offset); 882814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe } else 883814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe f->real_file_size = f->io_size + f->file_offset; 884d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe fio_file_set_extend(f); 8855ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe } 8867bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } 88753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 888a85066dcaf01cd3611b4c7c987357650cd7f08a6Jens Axboe if (!o->size || (total_size && o->size > total_size)) 889de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe o->size = total_size; 89021972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe 891d1faa06dc74fcdcae02e70260c90121502ef01cfJens Axboe if (o->size < td_min_bs(td)) { 892d1faa06dc74fcdcae02e70260c90121502ef01cfJens Axboe log_err("fio: blocksize too large for data set\n"); 893d1faa06dc74fcdcae02e70260c90121502ef01cfJens Axboe goto err_out; 894d1faa06dc74fcdcae02e70260c90121502ef01cfJens Axboe } 895d1faa06dc74fcdcae02e70260c90121502ef01cfJens Axboe 8967bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe /* 8977bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * See if we need to extend some files 8987bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */ 8997bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (need_extend) { 9007bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe temp_stall_ts = 1; 901f3afa57e36550288340f1b6c694f354ae72654b9Jens Axboe if (output_format == FIO_OUTPUT_NORMAL) 902a7ba8c5f4c0f9fe117d529c1ad6686b2070bae51Shaozhi Shawn Ye log_info("%s: Laying out IO file(s) (%u file(s) /" 903de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe " %lluMB)\n", o->name, need_extend, 904a7ba8c5f4c0f9fe117d529c1ad6686b2070bae51Shaozhi Shawn Ye extend_size >> 20); 9057bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 9067bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe for_each_file(td, f, i) { 9075e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe unsigned long long old_len = -1ULL, extend_len = -1ULL; 9083baddf2450d811be658fb47ef883ee84478dc352Jens Axboe 909d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe if (!fio_file_extend(f)) 9107bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe continue; 9117bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 912409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe assert(f->filetype == FIO_TYPE_FILE); 913d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe fio_file_clear_extend(f); 914de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe if (!o->fill_device) { 9155e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe old_len = f->real_file_size; 9160b9d69ecb14045cf3b2622ae922756b9889b25e6Jens Axboe extend_len = f->io_size + f->file_offset - 9170b9d69ecb14045cf3b2622ae922756b9889b25e6Jens Axboe old_len; 9185e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe } 919bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang f->real_file_size = (f->io_size + f->file_offset); 9207bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe err = extend_file(td, f); 9217bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (err) 9223baddf2450d811be658fb47ef883ee84478dc352Jens Axboe break; 9235e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe 9243baddf2450d811be658fb47ef883ee84478dc352Jens Axboe err = __file_invalidate_cache(td, f, old_len, 9253baddf2450d811be658fb47ef883ee84478dc352Jens Axboe extend_len); 9269824f73be5a03e683a236eb1ebe18f4656ac06b8Jens Axboe 9279824f73be5a03e683a236eb1ebe18f4656ac06b8Jens Axboe /* 9289824f73be5a03e683a236eb1ebe18f4656ac06b8Jens Axboe * Shut up static checker 9299824f73be5a03e683a236eb1ebe18f4656ac06b8Jens Axboe */ 9309824f73be5a03e683a236eb1ebe18f4656ac06b8Jens Axboe if (f->fd != -1) 9319824f73be5a03e683a236eb1ebe18f4656ac06b8Jens Axboe close(f->fd); 9329824f73be5a03e683a236eb1ebe18f4656ac06b8Jens Axboe 9333baddf2450d811be658fb47ef883ee84478dc352Jens Axboe f->fd = -1; 9343baddf2450d811be658fb47ef883ee84478dc352Jens Axboe if (err) 9357bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe break; 9367bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } 9377bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe temp_stall_ts = 0; 9387bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } 9397bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 9407bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (err) 941e90391eb56d81a2cc175c50caf6b4e5abbdb6142Jens Axboe goto err_out; 9427bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 943de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe if (!o->zone_size) 944de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe o->zone_size = o->size; 9457bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 946ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe /* 947ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe * iolog already set the total io size, if we read back 948ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe * stored entries. 949ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe */ 95077731b29c35286a43ca6109ebf13389169ec20e9Jens Axboe if (!o->read_iolog_file) { 95177731b29c35286a43ca6109ebf13389169ec20e9Jens Axboe if (o->io_limit) 95277731b29c35286a43ca6109ebf13389169ec20e9Jens Axboe td->total_io_size = o->io_limit * o->loops; 95377731b29c35286a43ca6109ebf13389169ec20e9Jens Axboe else 95477731b29c35286a43ca6109ebf13389169ec20e9Jens Axboe td->total_io_size = o->size * o->loops; 95577731b29c35286a43ca6109ebf13389169ec20e9Jens Axboe } 95625460cf6350fb90b8a7943bb649a51d81bac13a4Jens Axboe 95725460cf6350fb90b8a7943bb649a51d81bac13a4Jens Axboedone: 958de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe if (o->create_only) 95925460cf6350fb90b8a7943bb649a51d81bac13a4Jens Axboe td->done = 1; 96025460cf6350fb90b8a7943bb649a51d81bac13a4Jens Axboe 9618edd973d57a311d4c590d7385796bbdf111ed04cJens Axboe td_restore_runstate(td, old_state); 9627bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe return 0; 963bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tangerr_offset: 964de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe log_err("%s: you need to specify valid offset=\n", o->name); 965e90391eb56d81a2cc175c50caf6b4e5abbdb6142Jens Axboeerr_out: 9668edd973d57a311d4c590d7385796bbdf111ed04cJens Axboe td_restore_runstate(td, old_state); 967bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang return 1; 96853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe} 96953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 970afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanminint pre_read_files(struct thread_data *td) 971afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin{ 972afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin struct fio_file *f; 973afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin unsigned int i; 974afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin 975afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin dprint(FD_FILE, "pre_read files\n"); 976afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin 977afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin for_each_file(td, f, i) { 978afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin pre_read_file(td, f); 979afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin } 980afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin 981afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin return 1; 982afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin} 983afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin 9849c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboestatic int __init_rand_distribution(struct thread_data *td, struct fio_file *f) 9859c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe{ 9862316296a514711bb388d87b34742c04bb561d986Jens Axboe unsigned int range_size, seed; 9879c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe unsigned long nranges; 9884d6922b77db7109369f0499506cf2cf7a62aba45Jens Axboe uint64_t fsize; 9899c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe 9909c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe range_size = min(td->o.min_bs[DDIR_READ], td->o.min_bs[DDIR_WRITE]); 9914d6922b77db7109369f0499506cf2cf7a62aba45Jens Axboe fsize = min(f->real_file_size, f->io_size); 9929c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe 9934d6922b77db7109369f0499506cf2cf7a62aba45Jens Axboe nranges = (fsize + range_size - 1) / range_size; 9949c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe 9952316296a514711bb388d87b34742c04bb561d986Jens Axboe seed = jhash(f->file_name, strlen(f->file_name), 0) * td->thread_number; 9968425687edef1b2961a17bd58341686f7b598cf28Jens Axboe if (!td->o.rand_repeatable) 9978425687edef1b2961a17bd58341686f7b598cf28Jens Axboe seed = td->rand_seeds[4]; 9988425687edef1b2961a17bd58341686f7b598cf28Jens Axboe 9999c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe if (td->o.random_distribution == FIO_RAND_DIST_ZIPF) 1000888677a428eb6ae6b54195e99734d6d6b3ee55e7Jens Axboe zipf_init(&f->zipf, nranges, td->o.zipf_theta.u.f, seed); 10019c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe else 1002888677a428eb6ae6b54195e99734d6d6b3ee55e7Jens Axboe pareto_init(&f->zipf, nranges, td->o.pareto_h.u.f, seed); 10039c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe 10049c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe return 1; 10059c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe} 10069c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe 10079c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboestatic int init_rand_distribution(struct thread_data *td) 10089c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe{ 10099c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe struct fio_file *f; 10109c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe unsigned int i; 10119c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe int state; 10129c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe 10139c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe if (td->o.random_distribution == FIO_RAND_DIST_RANDOM) 10149c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe return 0; 10159c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe 10168edd973d57a311d4c590d7385796bbdf111ed04cJens Axboe state = td_bump_runstate(td, TD_SETTING_UP); 10178edd973d57a311d4c590d7385796bbdf111ed04cJens Axboe 10189c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe for_each_file(td, f, i) 10199c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe __init_rand_distribution(td, f); 10208edd973d57a311d4c590d7385796bbdf111ed04cJens Axboe 10218edd973d57a311d4c590d7385796bbdf111ed04cJens Axboe td_restore_runstate(td, state); 10229c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe 10239c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe return 1; 10249c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe} 10259c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe 1026687270767de17dbad53c50e03e5d73d52505405cJens Axboeint init_random_map(struct thread_data *td) 1027687270767de17dbad53c50e03e5d73d52505405cJens Axboe{ 102851ede0b1e9c9b570b942b50b44d0455183a0d5ecJens Axboe unsigned long long blocks; 1029687270767de17dbad53c50e03e5d73d52505405cJens Axboe struct fio_file *f; 1030687270767de17dbad53c50e03e5d73d52505405cJens Axboe unsigned int i; 1031687270767de17dbad53c50e03e5d73d52505405cJens Axboe 10329c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe if (init_rand_distribution(td)) 10339c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe return 0; 10343831a843c289ab6a42a19752733d0fca4250882aJens Axboe if (!td_random(td)) 1035687270767de17dbad53c50e03e5d73d52505405cJens Axboe return 0; 1036687270767de17dbad53c50e03e5d73d52505405cJens Axboe 1037687270767de17dbad53c50e03e5d73d52505405cJens Axboe for_each_file(td, f, i) { 10384d6922b77db7109369f0499506cf2cf7a62aba45Jens Axboe uint64_t fsize = min(f->real_file_size, f->io_size); 103938f30c81d8d194da047950cbbda3896bd35cd98cJens Axboe 10404d6922b77db7109369f0499506cf2cf7a62aba45Jens Axboe blocks = fsize / (unsigned long long) td->o.rw_min_bs; 104153737ae01ca65f88089d3b8639df7be5b2f7ef0eJens Axboe 10428055e41d0ecc54770a2653427532b3e2c5fabdadJens Axboe if (td->o.random_generator == FIO_RAND_GEN_LFSR) { 104382af46be1fa0c0e188bbb6723008fa33a510606fJens Axboe unsigned long seed; 104482af46be1fa0c0e188bbb6723008fa33a510606fJens Axboe 104582af46be1fa0c0e188bbb6723008fa33a510606fJens Axboe seed = td->rand_seeds[FIO_RAND_BLOCK_OFF]; 10469c0f3f3279985b724c2f1358bb05cc2c795f2265Bruce Cran 1047d55dd0413b5f2df5e637c9c6e752b4272e4a1e5fJens Axboe if (!lfsr_init(&f->lfsr, blocks, seed, 0)) { 1048d55dd0413b5f2df5e637c9c6e752b4272e4a1e5fJens Axboe fio_file_set_lfsr(f); 10498055e41d0ecc54770a2653427532b3e2c5fabdadJens Axboe continue; 1050d55dd0413b5f2df5e637c9c6e752b4272e4a1e5fJens Axboe } 10513831a843c289ab6a42a19752733d0fca4250882aJens Axboe } else if (!td->o.norandommap) { 10527ebd796f4e50c21d652e62bf1e112755b0f338a8Jens Axboe f->io_axmap = axmap_new(blocks); 1053d55dd0413b5f2df5e637c9c6e752b4272e4a1e5fJens Axboe if (f->io_axmap) { 1054d55dd0413b5f2df5e637c9c6e752b4272e4a1e5fJens Axboe fio_file_set_axmap(f); 10558055e41d0ecc54770a2653427532b3e2c5fabdadJens Axboe continue; 1056d55dd0413b5f2df5e637c9c6e752b4272e4a1e5fJens Axboe } 10571cad7121e8e6c59440ae43545be05fa302e4110dJens Axboe } else if (td->o.norandommap) 10581cad7121e8e6c59440ae43545be05fa302e4110dJens Axboe continue; 1059ceadd59ef93421001530aa765d928e9e8c26b32eJens Axboe 10602b386d2569c9078ca9790c4e6d318ec3835b8739Jens Axboe if (!td->o.softrandommap) { 10615ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe log_err("fio: failed allocating random map. If running" 10625ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe " a large number of jobs, try the 'norandommap'" 10632b386d2569c9078ca9790c4e6d318ec3835b8739Jens Axboe " option or set 'softrandommap'. Or give" 10642b386d2569c9078ca9790c4e6d318ec3835b8739Jens Axboe " a larger --alloc-size to fio.\n"); 1065687270767de17dbad53c50e03e5d73d52505405cJens Axboe return 1; 1066687270767de17dbad53c50e03e5d73d52505405cJens Axboe } 1067303032ae4e13c7ac10b8198c40df98d95a4524a6Jens Axboe 1068303032ae4e13c7ac10b8198c40df98d95a4524a6Jens Axboe log_info("fio: file %s failed allocating random map. Running " 1069303032ae4e13c7ac10b8198c40df98d95a4524a6Jens Axboe "job without.\n", f->file_name); 1070687270767de17dbad53c50e03e5d73d52505405cJens Axboe } 1071687270767de17dbad53c50e03e5d73d52505405cJens Axboe 1072687270767de17dbad53c50e03e5d73d52505405cJens Axboe return 0; 1073687270767de17dbad53c50e03e5d73d52505405cJens Axboe} 1074687270767de17dbad53c50e03e5d73d52505405cJens Axboe 107553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboevoid close_files(struct thread_data *td) 107653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{ 10770ab8db8943acc6b9ea778735563bfad2a79e8dddJens Axboe struct fio_file *f; 1078af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe unsigned int i; 107953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 10802be3eec330360e6735fb4e7d70907e11eaa346f8Jens Axboe for_each_file(td, f, i) { 10812be3eec330360e6735fb4e7d70907e11eaa346f8Jens Axboe if (fio_file_open(f)) 10822be3eec330360e6735fb4e7d70907e11eaa346f8Jens Axboe td_io_close_file(td, f); 10832be3eec330360e6735fb4e7d70907e11eaa346f8Jens Axboe } 108424ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe} 108524ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe 108624ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboevoid close_and_free_files(struct thread_data *td) 108724ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe{ 108824ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe struct fio_file *f; 108924ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe unsigned int i; 109024ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe 1091ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe dprint(FD_FILE, "close files\n"); 1092ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe 10930ab8db8943acc6b9ea778735563bfad2a79e8dddJens Axboe for_each_file(td, f, i) { 10949187a269bf4539fa4b5b97a9b7439ba408d6b872Castor Fu if (td->o.unlink && f->filetype == FIO_TYPE_FILE) { 10959187a269bf4539fa4b5b97a9b7439ba408d6b872Castor Fu dprint(FD_FILE, "free unlink %s\n", f->file_name); 10969187a269bf4539fa4b5b97a9b7439ba408d6b872Castor Fu td_io_unlink_file(td, f); 10979187a269bf4539fa4b5b97a9b7439ba408d6b872Castor Fu } 10989187a269bf4539fa4b5b97a9b7439ba408d6b872Castor Fu 109922a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe if (fio_file_open(f)) 110022a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe td_io_close_file(td, f); 110122a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe 1102b9fbcf2104ab79127825e0c23ba0a147ec076087Shaozhi Shawn Ye remove_file_hash(f); 1103b3dc7f075b85e004f8c681ebb8566475017696f3Jens Axboe 1104b5f4d8baefc6eb3e13235b7d9042b7ffecdb23ddJens Axboe if (td->o.unlink && f->filetype == FIO_TYPE_FILE) { 1105b5f4d8baefc6eb3e13235b7d9042b7ffecdb23ddJens Axboe dprint(FD_FILE, "free unlink %s\n", f->file_name); 11069187a269bf4539fa4b5b97a9b7439ba408d6b872Castor Fu td_io_unlink_file(td, f); 1107b5f4d8baefc6eb3e13235b7d9042b7ffecdb23ddJens Axboe } 1108b5f4d8baefc6eb3e13235b7d9042b7ffecdb23ddJens Axboe 1109f17c43928c202e557f2f325272c60d9050ee528eJens Axboe sfree(f->file_name); 1110fa1da8653e2177b3cc31a91e963c389f079d4172Jens Axboe f->file_name = NULL; 1111d55dd0413b5f2df5e637c9c6e752b4272e4a1e5fJens Axboe if (fio_file_axmap(f)) { 1112d55dd0413b5f2df5e637c9c6e752b4272e4a1e5fJens Axboe axmap_free(f->io_axmap); 1113d55dd0413b5f2df5e637c9c6e752b4272e4a1e5fJens Axboe f->io_axmap = NULL; 1114d55dd0413b5f2df5e637c9c6e752b4272e4a1e5fJens Axboe } 111578d99e6a2695d3a7936c5dd02f996f13a30309b1Jens Axboe sfree(f); 111653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 1117b4a6a59a939f0e6554632de311e7d1d1b7633ccfJens Axboe 11182dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe td->o.filename = NULL; 1119cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe free(td->files); 1120d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe free(td->file_locks); 11219efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe td->files_index = 0; 1122b4a6a59a939f0e6554632de311e7d1d1b7633ccfJens Axboe td->files = NULL; 1123d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe td->file_locks = NULL; 112427ddbfa09b22911d5cefb42a44f894e6eb48216eJens Axboe td->o.file_lock_mode = FILE_LOCK_NONE; 11252dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe td->o.nr_files = 0; 112653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe} 1127af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe 1128e3bab463d4397e3378d8c7437e31de8aaf861a4fJens Axboestatic void get_file_type(struct fio_file *f) 1129af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe{ 1130af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe struct stat sb; 1131af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe 1132661598287ecc3b8987f312cf8403936552ce686aJens Axboe if (!strcmp(f->file_name, "-")) 1133661598287ecc3b8987f312cf8403936552ce686aJens Axboe f->filetype = FIO_TYPE_PIPE; 1134661598287ecc3b8987f312cf8403936552ce686aJens Axboe else 1135661598287ecc3b8987f312cf8403936552ce686aJens Axboe f->filetype = FIO_TYPE_FILE; 1136af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe 11373892182aff21486d9c38a346fe8681c9098ecb0cBruce Cran /* \\.\ is the device namespace in Windows, where every file is 11383892182aff21486d9c38a346fe8681c9098ecb0cBruce Cran * a block device */ 11393892182aff21486d9c38a346fe8681c9098ecb0cBruce Cran if (strncmp(f->file_name, "\\\\.\\", 4) == 0) 11403892182aff21486d9c38a346fe8681c9098ecb0cBruce Cran f->filetype = FIO_TYPE_BD; 11413892182aff21486d9c38a346fe8681c9098ecb0cBruce Cran 1142b30d395ec288508f9c787af11d0f52e9df26e39fJens Axboe if (!stat(f->file_name, &sb)) { 11433892182aff21486d9c38a346fe8681c9098ecb0cBruce Cran if (S_ISBLK(sb.st_mode)) 1144af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe f->filetype = FIO_TYPE_BD; 1145af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe else if (S_ISCHR(sb.st_mode)) 1146af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe f->filetype = FIO_TYPE_CHAR; 1147b5605e9ded4188ed91faae1a43ecd333a9856f62Jens Axboe else if (S_ISFIFO(sb.st_mode)) 1148b5605e9ded4188ed91faae1a43ecd333a9856f62Jens Axboe f->filetype = FIO_TYPE_PIPE; 1149af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe } 1150af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe} 1151af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe 115290426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboestatic int __is_already_allocated(const char *fname) 1153190b8f0c9c1c1a99ed26fd953f7af9023f9533eeCastor Fu{ 115490426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe struct flist_head *entry; 115590426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe char *filename; 1156bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt 115790426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe if (flist_empty(&filename_list)) 115890426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe return 0; 115990426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe 116090426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe flist_for_each(entry, &filename_list) { 116190426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe filename = flist_entry(entry, struct file_name, list)->filename; 116290426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe 116390426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe if (strcmp(filename, fname) == 0) 116490426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe return 1; 116590426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe } 116690426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe 116790426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe return 0; 1168bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt} 1169bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt 1170bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardtstatic int is_already_allocated(const char *fname) 1171bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt{ 117290426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe int ret; 1173bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt 117490426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe fio_file_hash_lock(); 117590426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe ret = __is_already_allocated(fname); 117690426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe fio_file_hash_unlock(); 117790426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe return ret; 117890426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe} 1179bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt 118090426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboestatic void set_already_allocated(const char *fname) 118190426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe{ 118290426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe struct file_name *fn; 118390426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe 118490426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe fn = malloc(sizeof(struct file_name)); 118590426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe fn->filename = strdup(fname); 118690426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe 118790426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe fio_file_hash_lock(); 118890426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe if (!__is_already_allocated(fname)) { 118990426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe flist_add_tail(&fn->list, &filename_list); 119090426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe fn = NULL; 1191bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt } 119290426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe fio_file_hash_unlock(); 1193bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt 119490426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe if (fn) { 119590426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe free(fn->filename); 119690426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe free(fn); 119790426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe } 1198bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt} 1199bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt 120090426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe 1201190b8f0c9c1c1a99ed26fd953f7af9023f9533eeCastor Fustatic void free_already_allocated(void) 1202190b8f0c9c1c1a99ed26fd953f7af9023f9533eeCastor Fu{ 1203bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt struct flist_head *entry, *tmp; 1204bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt struct file_name *fn; 1205bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt 120690426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe if (flist_empty(&filename_list)) 120790426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe return; 120890426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe 120990426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe fio_file_hash_lock(); 121090426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe flist_for_each_safe(entry, tmp, &filename_list) { 121190426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe fn = flist_entry(entry, struct file_name, list); 121290426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe free(fn->filename); 121390426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe flist_del(&fn->list); 121490426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe free(fn); 1215bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt } 121690426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe 121790426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe fio_file_hash_unlock(); 1218bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt} 1219bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt 12207b5cb700485518c2e7f2f49548319c89ba907195Jens Axboestatic struct fio_file *alloc_new_file(struct thread_data *td) 12217b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe{ 12227b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe struct fio_file *f; 12237b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe 12247b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe f = smalloc(sizeof(*f)); 12257b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe if (!f) { 12267b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe log_err("fio: smalloc OOM\n"); 12277b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe assert(0); 12287b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe return NULL; 12297b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe } 12307b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe 12317b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe f->fd = -1; 12327b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe f->shadow_fd = -1; 12337b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe fio_file_reset(td, f); 12347b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe return f; 12357b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe} 12367b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe 12375903e7b7907854014478b6febfc5645a203ff59eJens Axboeint add_file(struct thread_data *td, const char *fname, int numjob, int inc) 1238af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe{ 12397b4e4fe5e6fa26f82f9169c18ec70c08d0805ca9Jens Axboe int cur_files = td->files_index; 1240bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe char file_name[PATH_MAX]; 1241af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe struct fio_file *f; 1242bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe int len = 0; 1243af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe 1244ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe dprint(FD_FILE, "add file %s\n", fname); 1245ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe 1246bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt if (td->o.directory) 1247bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt len = set_name_idx(file_name, td->o.directory, numjob); 1248bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt 1249bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt sprintf(file_name + len, "%s", fname); 1250bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt 1251bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt /* clean cloned siblings using existing files */ 1252bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt if (numjob && is_already_allocated(file_name)) 1253bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt return 0; 1254bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt 12557b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe f = alloc_new_file(td); 1256bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe 1257fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe if (td->files_size <= td->files_index) { 12581983e3271c20a5dca84ac1ad872e44dd9e62e6b8Jianpeng Ma unsigned int new_size = td->o.nr_files + 1; 1259126d65c6fc97d6acdc568aa5a969c012018daf15Jens Axboe 1260fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe dprint(FD_FILE, "resize file array to %d files\n", new_size); 1261fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe 1262fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe td->files = realloc(td->files, new_size * sizeof(f)); 1263d537c08b0eacdeb05835ee8c5f269b872239713aJianpeng Ma if (td->files == NULL) { 1264d537c08b0eacdeb05835ee8c5f269b872239713aJianpeng Ma log_err("fio: realloc OOM\n"); 1265d537c08b0eacdeb05835ee8c5f269b872239713aJianpeng Ma assert(0); 1266d537c08b0eacdeb05835ee8c5f269b872239713aJianpeng Ma } 1267d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe if (td->o.file_lock_mode != FILE_LOCK_NONE) { 1268d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe td->file_locks = realloc(td->file_locks, new_size); 1269d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe if (!td->file_locks) { 1270d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe log_err("fio: realloc OOM\n"); 1271d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe assert(0); 1272d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe } 1273d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe td->file_locks[cur_files] = FILE_LOCK_NONE; 1274d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe } 1275fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe td->files_size = new_size; 1276fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe } 12778bb7679e73d3086a01b9d21a650b0d7a859412b6Jens Axboe td->files[cur_files] = f; 127889ac1d48971578ccb0645c292d4a058340aeb909Shaohua Li f->fileno = cur_files; 1279126d65c6fc97d6acdc568aa5a969c012018daf15Jens Axboe 128007eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe /* 128107eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe * init function, io engine may not be loaded yet 128207eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe */ 128307eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe if (td->io_ops && (td->io_ops->flags & FIO_DISKLESSIO)) 128407eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe f->real_file_size = -1ULL; 128507eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe 1286f17c43928c202e557f2f325272c60d9050ee528eJens Axboe f->file_name = smalloc_strdup(file_name); 1287c48c0be79173897824d8f439c39374f2588931dcJens Axboe if (!f->file_name) { 1288c48c0be79173897824d8f439c39374f2588931dcJens Axboe log_err("fio: smalloc OOM\n"); 1289c48c0be79173897824d8f439c39374f2588931dcJens Axboe assert(0); 1290c48c0be79173897824d8f439c39374f2588931dcJens Axboe } 12910b9d69ecb14045cf3b2622ae922756b9889b25e6Jens Axboe 1292e3bab463d4397e3378d8c7437e31de8aaf861a4fJens Axboe get_file_type(f); 1293af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe 12944d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe switch (td->o.file_lock_mode) { 12954d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe case FILE_LOCK_NONE: 12964d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe break; 12974d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe case FILE_LOCK_READWRITE: 1298d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe f->rwlock = fio_rwlock_init(); 12994d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe break; 13004d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe case FILE_LOCK_EXCLUSIVE: 1301521da527743088a9bd2ab882f8b64799d49d5848Jens Axboe f->lock = fio_mutex_init(FIO_MUTEX_UNLOCKED); 13024d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe break; 13034d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe default: 13044d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe log_err("fio: unknown lock mode: %d\n", td->o.file_lock_mode); 13054d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe assert(0); 13064d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe } 130729c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe 13087b4e4fe5e6fa26f82f9169c18ec70c08d0805ca9Jens Axboe td->files_index++; 13091549441cdfecb2c1a4a8b8d494253859d67b4344Jens Axboe if (f->filetype == FIO_TYPE_FILE) 13101549441cdfecb2c1a4a8b8d494253859d67b4344Jens Axboe td->nr_normal_files++; 1311f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe 1312bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt set_already_allocated(file_name); 1313bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt 13145903e7b7907854014478b6febfc5645a203ff59eJens Axboe if (inc) 13155903e7b7907854014478b6febfc5645a203ff59eJens Axboe td->o.nr_files++; 13165903e7b7907854014478b6febfc5645a203ff59eJens Axboe 13175ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe dprint(FD_FILE, "file %p \"%s\" added at %d\n", f, f->file_name, 13185ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe cur_files); 13199efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe 1320f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe return cur_files; 1321af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe} 13220ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe 132349ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboeint add_file_exclusive(struct thread_data *td, const char *fname) 132449ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe{ 132549ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe struct fio_file *f; 132649ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe unsigned int i; 132749ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe 132849ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe for_each_file(td, f, i) { 132949ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe if (!strcmp(f->file_name, fname)) 133049ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe return i; 133149ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe } 133249ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe 13335903e7b7907854014478b6febfc5645a203ff59eJens Axboe return add_file(td, fname, 0, 1); 133449ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe} 133549ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe 13360ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboevoid get_file(struct fio_file *f) 13370ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe{ 13388172fe972f3a79d42f34d7f6e259ed3f7f800316Jens Axboe dprint(FD_FILE, "get file %s, ref=%d\n", f->file_name, f->references); 1339d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe assert(fio_file_open(f)); 13400ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe f->references++; 13410ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe} 13420ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe 13436977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboeint put_file(struct thread_data *td, struct fio_file *f) 13440ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe{ 134598e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe int f_ret = 0, ret = 0; 13466977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe 13478172fe972f3a79d42f34d7f6e259ed3f7f800316Jens Axboe dprint(FD_FILE, "put file %s, ref=%d\n", f->file_name, f->references); 1348ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe 134922a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe if (!fio_file_open(f)) { 135022a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe assert(f->fd == -1); 13516977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe return 0; 135222a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe } 13530ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe 13540ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe assert(f->references); 13550ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe if (--f->references) 13566977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe return 0; 13570ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe 135871b84caab6ef5ddbc7893e3268887b8ff0516f75Jens Axboe if (should_fsync(td) && td->o.fsync_on_close) { 135998e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe f_ret = fsync(f->fd); 136071b84caab6ef5ddbc7893e3268887b8ff0516f75Jens Axboe if (f_ret < 0) 136171b84caab6ef5ddbc7893e3268887b8ff0516f75Jens Axboe f_ret = errno; 136271b84caab6ef5ddbc7893e3268887b8ff0516f75Jens Axboe } 1363ebb1415f729c123b8a13bcbd667bf4b4cc95b4d4Jens Axboe 13640ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe if (td->io_ops->close_file) 13656977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe ret = td->io_ops->close_file(td, f); 13661020a139beff50faf1bb18f761b024b664a09e14Jens Axboe 136798e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe if (!ret) 1368a5fb461fdff86c442daeebbd28e07984be9f3807Jens Axboe ret = f_ret; 136998e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe 13700ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe td->nr_open_files--; 1371d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe fio_file_clear_open(f); 137222a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe assert(f->fd == -1); 13736977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe return ret; 13740ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe} 1375bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 13764d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboevoid lock_file(struct thread_data *td, struct fio_file *f, enum fio_ddir ddir) 1377b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe{ 13784d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe if (!f->lock || td->o.file_lock_mode == FILE_LOCK_NONE) 13794d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe return; 138029c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe 13814d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe if (td->o.file_lock_mode == FILE_LOCK_READWRITE) { 13824d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe if (ddir == DDIR_READ) 1383d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe fio_rwlock_read(f->rwlock); 13844d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe else 1385d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe fio_rwlock_write(f->rwlock); 13864d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe } else if (td->o.file_lock_mode == FILE_LOCK_EXCLUSIVE) 13874d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe fio_mutex_down(f->lock); 13884d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe 1389d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe td->file_locks[f->fileno] = td->o.file_lock_mode; 1390b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe} 1391b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe 13924d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboevoid unlock_file(struct thread_data *td, struct fio_file *f) 1393b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe{ 13944d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe if (!f->lock || td->o.file_lock_mode == FILE_LOCK_NONE) 13954d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe return; 13964d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe 1397d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe if (td->o.file_lock_mode == FILE_LOCK_READWRITE) 1398d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe fio_rwlock_unlock(f->rwlock); 1399d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe else if (td->o.file_lock_mode == FILE_LOCK_EXCLUSIVE) 14004d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe fio_mutex_up(f->lock); 1401d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe 1402d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe td->file_locks[f->fileno] = FILE_LOCK_NONE; 1403b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe} 1404b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe 14054d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboevoid unlock_file_all(struct thread_data *td, struct fio_file *f) 14064d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe{ 1407f2a2803a4982a1516eb75d9f98de68cf21d1ae7dJens Axboe if (td->o.file_lock_mode == FILE_LOCK_NONE || !td->file_locks) 140827ddbfa09b22911d5cefb42a44f894e6eb48216eJens Axboe return; 1409d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe if (td->file_locks[f->fileno] != FILE_LOCK_NONE) 1410d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe unlock_file(td, f); 14114d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe} 14124d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe 1413bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboestatic int recurse_dir(struct thread_data *td, const char *dirname) 1414bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe{ 1415bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe struct dirent *dir; 1416bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe int ret = 0; 1417bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe DIR *D; 1418bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 1419bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe D = opendir(dirname); 1420bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe if (!D) { 14210ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe char buf[FIO_VERROR_SIZE]; 14220ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe 142398ffb8f3ecebed9984d1744f142eb8be10c14dbdKen Raeburn snprintf(buf, FIO_VERROR_SIZE, "opendir(%s)", dirname); 14240ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe td_verror(td, errno, buf); 1425bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe return 1; 1426bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe } 1427bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 1428bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe while ((dir = readdir(D)) != NULL) { 1429bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe char full_path[PATH_MAX]; 1430bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe struct stat sb; 1431bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 1432e85b2b83e39b64ba5cb73fbfddbf3902b6e84925Jens Axboe if (!strcmp(dir->d_name, ".") || !strcmp(dir->d_name, "..")) 1433e85b2b83e39b64ba5cb73fbfddbf3902b6e84925Jens Axboe continue; 143496d32d518a0743a6c050057bc1562e4883e51c5dJens Axboe 1435b9fd788f0e8adacc33316107594e9eb0463743d7Bruce Cran sprintf(full_path, "%s%s%s", dirname, FIO_OS_PATH_SEPARATOR, dir->d_name); 1436bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 1437bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe if (lstat(full_path, &sb) == -1) { 1438bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe if (errno != ENOENT) { 1439bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe td_verror(td, errno, "stat"); 144068ace9e00ca481d101f9937461402b83e8895ba2Jens Axboe ret = 1; 144168ace9e00ca481d101f9937461402b83e8895ba2Jens Axboe break; 1442bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe } 1443bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe } 1444bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 1445bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe if (S_ISREG(sb.st_mode)) { 14465903e7b7907854014478b6febfc5645a203ff59eJens Axboe add_file(td, full_path, 0, 1); 1447bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe continue; 1448bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe } 14490ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe if (!S_ISDIR(sb.st_mode)) 14500ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe continue; 1451bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 14525ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe ret = recurse_dir(td, full_path); 14535ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe if (ret) 1454bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe break; 1455bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe } 1456bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 1457bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe closedir(D); 1458bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe return ret; 1459bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe} 1460bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 1461bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboeint add_dir_files(struct thread_data *td, const char *path) 1462bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe{ 14630ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe int ret = recurse_dir(td, path); 14640ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe 14650ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe if (!ret) 14660ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe log_info("fio: opendir added %d files\n", td->o.nr_files); 14670ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe 14680ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe return ret; 1469bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe} 1470cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe 1471cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboevoid dup_files(struct thread_data *td, struct thread_data *org) 1472cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe{ 1473cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe struct fio_file *f; 1474cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe unsigned int i; 14759efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe 14769efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe dprint(FD_FILE, "dup files: %d\n", org->files_index); 1477cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe 1478cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe if (!org->files) 1479cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe return; 1480cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe 14819efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe td->files = malloc(org->files_index * sizeof(f)); 1482cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe 1483d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe if (td->o.file_lock_mode != FILE_LOCK_NONE) 1484d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe td->file_locks = malloc(org->files_index); 1485d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe 14869efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe for_each_file(org, f, i) { 1487b0fe421a6a0487ff71f6f903908f666d9ca1b327Jens Axboe struct fio_file *__f; 1488b0fe421a6a0487ff71f6f903908f666d9ca1b327Jens Axboe 14897b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe __f = alloc_new_file(td); 14900b9d69ecb14045cf3b2622ae922756b9889b25e6Jens Axboe 1491bc3456fa06cc7777c4764da8c7b1c0fd0a3c3772Aaron Carroll if (f->file_name) { 1492f17c43928c202e557f2f325272c60d9050ee528eJens Axboe __f->file_name = smalloc_strdup(f->file_name); 1493c48c0be79173897824d8f439c39374f2588931dcJens Axboe if (!__f->file_name) { 1494c48c0be79173897824d8f439c39374f2588931dcJens Axboe log_err("fio: smalloc OOM\n"); 1495c48c0be79173897824d8f439c39374f2588931dcJens Axboe assert(0); 1496c48c0be79173897824d8f439c39374f2588931dcJens Axboe } 14970b9d69ecb14045cf3b2622ae922756b9889b25e6Jens Axboe 1498bc3456fa06cc7777c4764da8c7b1c0fd0a3c3772Aaron Carroll __f->filetype = f->filetype; 1499bc3456fa06cc7777c4764da8c7b1c0fd0a3c3772Aaron Carroll } 1500b0fe421a6a0487ff71f6f903908f666d9ca1b327Jens Axboe 150167ad92428bb19008354ca20e614050241e9f17e7Jens Axboe if (td->o.file_lock_mode == FILE_LOCK_EXCLUSIVE) 150267ad92428bb19008354ca20e614050241e9f17e7Jens Axboe __f->lock = f->lock; 150367ad92428bb19008354ca20e614050241e9f17e7Jens Axboe else if (td->o.file_lock_mode == FILE_LOCK_READWRITE) 150467ad92428bb19008354ca20e614050241e9f17e7Jens Axboe __f->rwlock = f->rwlock; 150567ad92428bb19008354ca20e614050241e9f17e7Jens Axboe 1506b0fe421a6a0487ff71f6f903908f666d9ca1b327Jens Axboe td->files[i] = __f; 1507cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe } 1508cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe} 1509f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe 1510f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe/* 1511f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe * Returns the index that matches the filename, or -1 if not there 1512f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe */ 1513f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboeint get_fileno(struct thread_data *td, const char *fname) 1514f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe{ 1515f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe struct fio_file *f; 1516f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe unsigned int i; 1517f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe 1518f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe for_each_file(td, f, i) 1519f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe if (!strcmp(f->file_name, fname)) 1520f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe return i; 1521f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe 1522f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe return -1; 1523f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe} 1524f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe 1525f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe/* 1526f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe * For log usage, where we add/open/close files automatically 1527f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe */ 1528f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboevoid free_release_files(struct thread_data *td) 1529f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe{ 1530f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe close_files(td); 15314c8e9f3a32ad0a1bc8bbc85b0cfe43e73a120753Jens Axboe td->o.nr_files = 0; 15324c8e9f3a32ad0a1bc8bbc85b0cfe43e73a120753Jens Axboe td->o.open_files = 0; 1533f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe td->files_index = 0; 1534f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe td->nr_normal_files = 0; 1535f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe} 153633c48814e08cf961801bf37f759da2748eb3431bJens Axboe 153733c48814e08cf961801bf37f759da2748eb3431bJens Axboevoid fio_file_reset(struct thread_data *td, struct fio_file *f) 153833c48814e08cf961801bf37f759da2748eb3431bJens Axboe{ 153908a99bed133fdd5dd6ef87c8638b45b135b10a8eJens Axboe int i; 154008a99bed133fdd5dd6ef87c8638b45b135b10a8eJens Axboe 154108a99bed133fdd5dd6ef87c8638b45b135b10a8eJens Axboe for (i = 0; i < DDIR_RWDIR_CNT; i++) { 154208a99bed133fdd5dd6ef87c8638b45b135b10a8eJens Axboe f->last_pos[i] = f->file_offset; 154308a99bed133fdd5dd6ef87c8638b45b135b10a8eJens Axboe f->last_start[i] = -1ULL; 154408a99bed133fdd5dd6ef87c8638b45b135b10a8eJens Axboe } 154508a99bed133fdd5dd6ef87c8638b45b135b10a8eJens Axboe 1546d55dd0413b5f2df5e637c9c6e752b4272e4a1e5fJens Axboe if (fio_file_axmap(f)) 154733c48814e08cf961801bf37f759da2748eb3431bJens Axboe axmap_reset(f->io_axmap); 1548d55dd0413b5f2df5e637c9c6e752b4272e4a1e5fJens Axboe else if (fio_file_lfsr(f)) 154933c48814e08cf961801bf37f759da2748eb3431bJens Axboe lfsr_reset(&f->lfsr, td->rand_seeds[FIO_RAND_BLOCK_OFF]); 155033c48814e08cf961801bf37f759da2748eb3431bJens Axboe} 1551002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe 1552002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboeint fio_files_done(struct thread_data *td) 1553002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe{ 1554002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe struct fio_file *f; 1555002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe unsigned int i; 1556002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe 1557002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe for_each_file(td, f, i) 1558002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe if (!fio_file_done(f)) 1559002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe return 0; 1560002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe 1561002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe return 1; 1562002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe} 1563bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt 1564bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt/* free memory used in initialization phase only */ 1565190b8f0c9c1c1a99ed26fd953f7af9023f9533eeCastor Fuvoid filesetup_mem_free(void) 1566190b8f0c9c1c1a99ed26fd953f7af9023f9533eeCastor Fu{ 1567bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt free_already_allocated(); 1568bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt} 1569