filesetup.c revision d1faa06dc74fcdcae02e70260c90121502ef01cf
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); 62982016d689dc7fedbb09646ba0df7e72a781b164Zhang, Yanmin if ((unlink(f->file_name) < 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 72ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe dprint(FD_FILE, "open file %s, flags %x\n", f->file_name, flags); 73507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe f->fd = open(f->file_name, flags, 0644); 7453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (f->fd < 0) { 75e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe td_verror(td, errno, "open"); 7653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 1; 7753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 7853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 7997ac992c99d89eed8cdf9249bb038ac4d7b709b9Jens Axboe#ifdef CONFIG_POSIX_FALLOCATE 80a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou if (!td->o.fill_device) { 81a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou switch (td->o.fallocate_mode) { 82a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou case FIO_FALLOCATE_NONE: 83a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou break; 84a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou case FIO_FALLOCATE_POSIX: 85a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou dprint(FD_FILE, "posix_fallocate file %s size %llu\n", 864b91ee8fd12c72bd76ce9f5ff9116626b48566a0Jens Axboe f->file_name, 874b91ee8fd12c72bd76ce9f5ff9116626b48566a0Jens Axboe (unsigned long long) f->real_file_size); 88a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou 89a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou r = posix_fallocate(f->fd, 0, f->real_file_size); 90a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou if (r > 0) { 91a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou log_err("fio: posix_fallocate fails: %s\n", 92a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou strerror(r)); 93a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou } 94a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou break; 9597ac992c99d89eed8cdf9249bb038ac4d7b709b9Jens Axboe#ifdef CONFIG_LINUX_FALLOCATE 96a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou case FIO_FALLOCATE_KEEP_SIZE: 97a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou dprint(FD_FILE, 98a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou "fallocate(FALLOC_FL_KEEP_SIZE) " 994b91ee8fd12c72bd76ce9f5ff9116626b48566a0Jens Axboe "file %s size %llu\n", f->file_name, 1004b91ee8fd12c72bd76ce9f5ff9116626b48566a0Jens Axboe (unsigned long long) f->real_file_size); 1017bc8c2cf02fbd538ca388618ff2f4618787a86e0Jens Axboe 102a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou r = fallocate(f->fd, FALLOC_FL_KEEP_SIZE, 0, 103a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou f->real_file_size); 104888677a428eb6ae6b54195e99734d6d6b3ee55e7Jens Axboe if (r != 0) 105a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou td_verror(td, errno, "fallocate"); 106888677a428eb6ae6b54195e99734d6d6b3ee55e7Jens Axboe 107a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou break; 10897ac992c99d89eed8cdf9249bb038ac4d7b709b9Jens Axboe#endif /* CONFIG_LINUX_FALLOCATE */ 109a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou default: 110a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou log_err("fio: unknown fallocate mode: %d\n", 111a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou td->o.fallocate_mode); 112a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou assert(0); 1137bc8c2cf02fbd538ca388618ff2f4618787a86e0Jens Axboe } 1147bc8c2cf02fbd538ca388618ff2f4618787a86e0Jens Axboe } 11597ac992c99d89eed8cdf9249bb038ac4d7b709b9Jens Axboe#endif /* CONFIG_POSIX_FALLOCATE */ 1169b8365618309572d8fd2579c8ea3132db89f843fBruce Cran 117fc74ac1d749c977308016eb22c8658a9a5ac7989Shawn Lewis if (!new_layout) 118fc74ac1d749c977308016eb22c8658a9a5ac7989Shawn Lewis goto done; 119fc74ac1d749c977308016eb22c8658a9a5ac7989Shawn Lewis 1205e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe /* 1215e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe * The size will be -1ULL when fill_device is used, so don't truncate 1225e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe * or fallocate this file, just write it 1235e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe */ 1245e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe if (!td->o.fill_device) { 1255e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe dprint(FD_FILE, "truncate file %s, size %llu\n", f->file_name, 1264b91ee8fd12c72bd76ce9f5ff9116626b48566a0Jens Axboe (unsigned long long) f->real_file_size); 1275e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe if (ftruncate(f->fd, f->real_file_size) == -1) { 1283cd4c66f35fad0df64e4e6dfeddc5bdfd5206e0cJohn if (errno != EFBIG) { 1293cd4c66f35fad0df64e4e6dfeddc5bdfd5206e0cJohn td_verror(td, errno, "ftruncate"); 1303cd4c66f35fad0df64e4e6dfeddc5bdfd5206e0cJohn goto err; 1313cd4c66f35fad0df64e4e6dfeddc5bdfd5206e0cJohn } 1325e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe } 1335e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe } 13440f8298cd252157fa15d93f8eb470116a94069a0Jens Axboe 1352dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe b = malloc(td->o.max_bs[DDIR_WRITE]); 13653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 1377bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe left = f->real_file_size; 13853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe while (left && !td->terminate) { 1392dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe bs = td->o.max_bs[DDIR_WRITE]; 14053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (bs > left) 14153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe bs = left; 14253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 143cc86c395fd9dd2002ec1edc0967b7c9453debdfbJens Axboe fill_io_buffer(td, b, bs, bs); 144cc86c395fd9dd2002ec1edc0967b7c9453debdfbJens Axboe 14553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe r = write(f->fd, b, bs); 14653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 1475e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe if (r > 0) { 1485e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe left -= r; 14953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe continue; 15053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } else { 1515e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe if (r < 0) { 1525e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe int __e = errno; 1535e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe 1545e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe if (__e == ENOSPC) { 1555e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe if (td->o.fill_device) 1565e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe break; 1575e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe log_info("fio: ENOSPC on laying out " 1585e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe "file, stopping\n"); 1595e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe break; 1605e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe } 161e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe td_verror(td, errno, "write"); 1625e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe } else 163e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe td_verror(td, EIO, "write"); 16453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 16553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe break; 16653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 16753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 16853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 169ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe if (td->terminate) { 170ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe dprint(FD_FILE, "terminate unlink %s\n", f->file_name); 17153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe unlink(f->file_name); 172ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe } else if (td->o.create_fsync) { 17398e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe if (fsync(f->fd) < 0) { 17498e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe td_verror(td, errno, "fsync"); 17598e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe goto err; 17698e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe } 17798e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe } 1780d1cd207e409a36313784cb9596990c819775f77Jens Axboe if (td->o.fill_device && !td_write(td)) { 179d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe fio_file_clear_size_known(f); 1805e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe if (td_io_get_file_size(td, f)) 1815e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe goto err; 1825e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe if (f->io_size > f->real_file_size) 1835e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe f->io_size = f->real_file_size; 1845e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe } 18553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 18653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe free(b); 187507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboedone: 18853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 0; 18953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboeerr: 19053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe close(f->fd); 19153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe f->fd = -1; 192f3e1eb23a6c900921caa58c6cad66d3b60b0b6d7Jens Axboe if (b) 193f3e1eb23a6c900921caa58c6cad66d3b60b0b6d7Jens Axboe free(b); 19453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 1; 19553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe} 19653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 197afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanminstatic int pre_read_file(struct thread_data *td, struct fio_file *f) 198afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin{ 199ef799a64618cbd53adb50d615666cd7afe9f0a8fJens Axboe int ret = 0, r, did_open = 0, old_runstate; 200afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin unsigned long long left; 201afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin unsigned int bs; 202afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin char *b; 203afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin 2049c0d224129b0c59698e4c77e7fed00dc8cbb50e1Jens Axboe if (td->io_ops->flags & FIO_PIPEIO) 2059c0d224129b0c59698e4c77e7fed00dc8cbb50e1Jens Axboe return 0; 2069c0d224129b0c59698e4c77e7fed00dc8cbb50e1Jens Axboe 207d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe if (!fio_file_open(f)) { 208b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe if (td->io_ops->open_file(td, f)) { 209b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe log_err("fio: cannot pre-read, failed to open file\n"); 210b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe return 1; 211b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe } 212b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe did_open = 1; 213b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe } 214b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe 2158edd973d57a311d4c590d7385796bbdf111ed04cJens Axboe old_runstate = td_bump_runstate(td, TD_PRE_READING); 216b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe 217afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin bs = td->o.max_bs[DDIR_READ]; 218afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin b = malloc(bs); 219afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin memset(b, 0, bs); 220afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin 221ef799a64618cbd53adb50d615666cd7afe9f0a8fJens Axboe if (lseek(f->fd, f->file_offset, SEEK_SET) < 0) { 222ef799a64618cbd53adb50d615666cd7afe9f0a8fJens Axboe td_verror(td, errno, "lseek"); 223ef799a64618cbd53adb50d615666cd7afe9f0a8fJens Axboe log_err("fio: failed to lseek pre-read file\n"); 224ef799a64618cbd53adb50d615666cd7afe9f0a8fJens Axboe ret = 1; 225ef799a64618cbd53adb50d615666cd7afe9f0a8fJens Axboe goto error; 226ef799a64618cbd53adb50d615666cd7afe9f0a8fJens Axboe } 227ef799a64618cbd53adb50d615666cd7afe9f0a8fJens Axboe 228afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin left = f->io_size; 229afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin 230afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin while (left && !td->terminate) { 231afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin if (bs > left) 232afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin bs = left; 233afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin 234afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin r = read(f->fd, b, bs); 235afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin 236afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin if (r == (int) bs) { 237afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin left -= bs; 238afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin continue; 239afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin } else { 240afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin td_verror(td, EIO, "pre_read"); 241afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin break; 242afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin } 243afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin } 244afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin 245ef799a64618cbd53adb50d615666cd7afe9f0a8fJens Axboeerror: 2468edd973d57a311d4c590d7385796bbdf111ed04cJens Axboe td_restore_runstate(td, old_runstate); 247b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe 248b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe if (did_open) 249b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe td->io_ops->close_file(td, f); 250ef799a64618cbd53adb50d615666cd7afe9f0a8fJens Axboe 251afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin free(b); 252ef799a64618cbd53adb50d615666cd7afe9f0a8fJens Axboe return ret; 253afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin} 254afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin 2557bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboestatic unsigned long long get_rand_file_size(struct thread_data *td) 2569c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe{ 257dc873b6f4a536c332b72cce268d5a7ccd356a891Jens Axboe unsigned long long ret, sized; 2581294c3ec7a02d20a98b105c1c41b23358afc67e4Jens Axboe unsigned long r; 2599c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe 2604c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe if (td->o.use_os_rand) { 2614c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe r = os_random_long(&td->file_size_state); 2624c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe sized = td->o.file_size_high - td->o.file_size_low; 2634c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe ret = (unsigned long long) ((double) sized * (r / (OS_RAND_MAX + 1.0))); 2644c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe } else { 2654c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe r = __rand(&td->__file_size_state); 2664c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe sized = td->o.file_size_high - td->o.file_size_low; 2674c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe ret = (unsigned long long) ((double) sized * (r / (FRAND_MAX + 1.0))); 2684c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe } 2694c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe 2705ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe ret += td->o.file_size_low; 2712dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe ret -= (ret % td->o.rw_min_bs); 2729c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe return ret; 2739c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe} 2749c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe 27553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboestatic int file_size(struct thread_data *td, struct fio_file *f) 27653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{ 27753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe struct stat st; 27853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 279df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe if (stat(f->file_name, &st) == -1) { 2807bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe td_verror(td, errno, "fstat"); 2817bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe return 1; 2827bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } 28353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 2847bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe f->real_file_size = st.st_size; 28553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 0; 28653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe} 28753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 28853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboestatic int bdev_size(struct thread_data *td, struct fio_file *f) 28953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{ 2909b8365618309572d8fd2579c8ea3132db89f843fBruce Cran unsigned long long bytes = 0; 29153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe int r; 29253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 293df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe if (td->io_ops->open_file(td, f)) { 294df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe log_err("fio: failed opening blockdev %s for size check\n", 295df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe f->file_name); 296df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe return 1; 297df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe } 298df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe 299ecc314ba7c5f02b7e90ac1dfbce1a74cd4e6d6feBruce Cran r = blockdev_size(f, &bytes); 30053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (r) { 301e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe td_verror(td, r, "blockdev_size"); 302df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe goto err; 30353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 30453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 3057ab077ab119fd28b6ccf5705ea8453e414f574c1Jens Axboe if (!bytes) { 3067ab077ab119fd28b6ccf5705ea8453e414f574c1Jens Axboe log_err("%s: zero sized block device?\n", f->file_name); 307df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe goto err; 3087ab077ab119fd28b6ccf5705ea8453e414f574c1Jens Axboe } 3097ab077ab119fd28b6ccf5705ea8453e414f574c1Jens Axboe 31053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe f->real_file_size = bytes; 31122a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe td->io_ops->close_file(td, f); 31253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 0; 313df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboeerr: 314df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe td->io_ops->close_file(td, f); 315df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe return 1; 31653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe} 31753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 3184ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboestatic int char_size(struct thread_data *td, struct fio_file *f) 3194ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe{ 3204ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe#ifdef FIO_HAVE_CHARDEV_SIZE 3219b8365618309572d8fd2579c8ea3132db89f843fBruce Cran unsigned long long bytes = 0; 3224ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe int r; 3234ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe 3244ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe if (td->io_ops->open_file(td, f)) { 3254ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe log_err("fio: failed opening blockdev %s for size check\n", 3264ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe f->file_name); 3274ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe return 1; 3284ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe } 3294ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe 330ecc314ba7c5f02b7e90ac1dfbce1a74cd4e6d6feBruce Cran r = chardev_size(f, &bytes); 3314ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe if (r) { 3324ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe td_verror(td, r, "chardev_size"); 3334ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe goto err; 3344ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe } 3354ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe 3364ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe if (!bytes) { 3374ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe log_err("%s: zero sized char device?\n", f->file_name); 3384ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe goto err; 3394ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe } 3404ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe 3414ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe f->real_file_size = bytes; 3424ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe td->io_ops->close_file(td, f); 3434ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe return 0; 3444ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboeerr: 3454ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe td->io_ops->close_file(td, f); 3464ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe return 1; 3474ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe#else 3484ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe f->real_file_size = -1ULL; 3494ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe return 0; 3504ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe#endif 3514ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe} 3524ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe 35353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboestatic int get_file_size(struct thread_data *td, struct fio_file *f) 35453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{ 35553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe int ret = 0; 35653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 357d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe if (fio_file_size_known(f)) 358409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe return 0; 359409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe 3607bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (f->filetype == FIO_TYPE_FILE) 3617bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe ret = file_size(td, f); 3627bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe else if (f->filetype == FIO_TYPE_BD) 36353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe ret = bdev_size(td, f); 3644ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe else if (f->filetype == FIO_TYPE_CHAR) 3654ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe ret = char_size(td, f); 36653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe else 36753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe f->real_file_size = -1; 36853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 36953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (ret) 37053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return ret; 37153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 37253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (f->file_offset > f->real_file_size) { 3730f2152c19ed12fc2280c3d475973112f18e48cd5Bruce Cran log_err("%s: offset extends end (%llu > %llu)\n", td->o.name, 3744e0a8fa2593006505b7f4e18931a201d221b49e9Jens Axboe (unsigned long long) f->file_offset, 3754e0a8fa2593006505b7f4e18931a201d221b49e9Jens Axboe (unsigned long long) f->real_file_size); 37653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 1; 37753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 37853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 379d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe fio_file_set_size_known(f); 38053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 0; 38153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe} 38253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 3833baddf2450d811be658fb47ef883ee84478dc352Jens Axboestatic int __file_invalidate_cache(struct thread_data *td, struct fio_file *f, 3843baddf2450d811be658fb47ef883ee84478dc352Jens Axboe unsigned long long off, 3853baddf2450d811be658fb47ef883ee84478dc352Jens Axboe unsigned long long len) 386e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe{ 387e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe int ret = 0; 388e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe 3895e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe if (len == -1ULL) 3903baddf2450d811be658fb47ef883ee84478dc352Jens Axboe len = f->io_size; 3913baddf2450d811be658fb47ef883ee84478dc352Jens Axboe if (off == -1ULL) 3923baddf2450d811be658fb47ef883ee84478dc352Jens Axboe off = f->file_offset; 393ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe 3940d1cd207e409a36313784cb9596990c819775f77Jens Axboe if (len == -1ULL || off == -1ULL) 3950d1cd207e409a36313784cb9596990c819775f77Jens Axboe return 0; 3960d1cd207e409a36313784cb9596990c819775f77Jens Axboe 3973baddf2450d811be658fb47ef883ee84478dc352Jens Axboe dprint(FD_IO, "invalidate cache %s: %llu/%llu\n", f->file_name, off, 3983baddf2450d811be658fb47ef883ee84478dc352Jens Axboe len); 399b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe 400a1c58075279454a91ec43366846b93e8dcf9753cJens Axboe if (f->mmap_ptr) { 40103e20d687566753b90383571e5e152c5142bdffdBruce Cran ret = posix_madvise(f->mmap_ptr, f->mmap_sz, POSIX_MADV_DONTNEED); 402a1c58075279454a91ec43366846b93e8dcf9753cJens Axboe#ifdef FIO_MADV_FREE 4033e10fb832645e3ab3ef006f589f0459dc567cb53Jens Axboe if (f->filetype == FIO_TYPE_BD) 4043e10fb832645e3ab3ef006f589f0459dc567cb53Jens Axboe (void) posix_madvise(f->mmap_ptr, f->mmap_sz, FIO_MADV_FREE); 405a1c58075279454a91ec43366846b93e8dcf9753cJens Axboe#endif 406a1c58075279454a91ec43366846b93e8dcf9753cJens Axboe } else if (f->filetype == FIO_TYPE_FILE) { 407ecc314ba7c5f02b7e90ac1dfbce1a74cd4e6d6feBruce Cran ret = posix_fadvise(f->fd, off, len, POSIX_FADV_DONTNEED); 4085ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe } else if (f->filetype == FIO_TYPE_BD) { 409ecc314ba7c5f02b7e90ac1dfbce1a74cd4e6d6feBruce Cran ret = blockdev_invalidate_cache(f); 4107e0e25c924d51f23196b3e0ea83b79178fc46823Jens Axboe if (ret < 0 && errno == EACCES && geteuid()) { 4117172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboe if (!root_warn) { 4125ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe log_err("fio: only root may flush block " 4135ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe "devices. Cache flush bypassed!\n"); 4147172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboe root_warn = 1; 4157172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboe } 4167e0e25c924d51f23196b3e0ea83b79178fc46823Jens Axboe ret = 0; 4177e0e25c924d51f23196b3e0ea83b79178fc46823Jens Axboe } 418b5605e9ded4188ed91faae1a43ecd333a9856f62Jens Axboe } else if (f->filetype == FIO_TYPE_CHAR || f->filetype == FIO_TYPE_PIPE) 419e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe ret = 0; 420e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe 421dfe11fd1e8249a52c42f34c9e9e6b910ab6b05c5Jens Axboe /* 422dfe11fd1e8249a52c42f34c9e9e6b910ab6b05c5Jens Axboe * Cache flushing isn't a fatal condition, and we know it will 423dfe11fd1e8249a52c42f34c9e9e6b910ab6b05c5Jens Axboe * happen on some platforms where we don't have the proper 424dfe11fd1e8249a52c42f34c9e9e6b910ab6b05c5Jens Axboe * function to flush eg block device caches. So just warn and 425dfe11fd1e8249a52c42f34c9e9e6b910ab6b05c5Jens Axboe * continue on our way. 426dfe11fd1e8249a52c42f34c9e9e6b910ab6b05c5Jens Axboe */ 427dfe11fd1e8249a52c42f34c9e9e6b910ab6b05c5Jens Axboe if (ret) { 428dfe11fd1e8249a52c42f34c9e9e6b910ab6b05c5Jens Axboe log_info("fio: cache invalidation of %s failed: %s\n", f->file_name, strerror(errno)); 429dfe11fd1e8249a52c42f34c9e9e6b910ab6b05c5Jens Axboe ret = 0; 430e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe } 431e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe 432dfe11fd1e8249a52c42f34c9e9e6b910ab6b05c5Jens Axboe return 0; 4333baddf2450d811be658fb47ef883ee84478dc352Jens Axboe 4343baddf2450d811be658fb47ef883ee84478dc352Jens Axboe} 4353baddf2450d811be658fb47ef883ee84478dc352Jens Axboe 4363baddf2450d811be658fb47ef883ee84478dc352Jens Axboeint file_invalidate_cache(struct thread_data *td, struct fio_file *f) 4373baddf2450d811be658fb47ef883ee84478dc352Jens Axboe{ 438d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe if (!fio_file_open(f)) 439a5fb461fdff86c442daeebbd28e07984be9f3807Jens Axboe return 0; 440a5fb461fdff86c442daeebbd28e07984be9f3807Jens Axboe 4415e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe return __file_invalidate_cache(td, f, -1ULL, -1ULL); 442e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe} 443e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe 4446977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboeint generic_close_file(struct thread_data fio_unused *td, struct fio_file *f) 44553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{ 4466977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe int ret = 0; 4476977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe 448ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe dprint(FD_FILE, "fd close %s\n", f->file_name); 4494906e0b57f2b8cbad02ef2428522281cf6038bddJens Axboe 4504906e0b57f2b8cbad02ef2428522281cf6038bddJens Axboe remove_file_hash(f); 4514906e0b57f2b8cbad02ef2428522281cf6038bddJens Axboe 4526977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe if (close(f->fd) < 0) 4536977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe ret = errno; 4546977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe 455b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe f->fd = -1; 456e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe 457e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe if (f->shadow_fd != -1) { 458e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe close(f->shadow_fd); 459e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe f->shadow_fd = -1; 460e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe } 461e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe 46257e54e087e051186d18cdedad20a2460463d4d30Juan Casse f->engine_data = 0; 4636977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe return ret; 46453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe} 46553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 4661ccc6dc75b28ef70cd7a8c39ac8c1cb68c720a65Dmitry Monakhovint file_lookup_open(struct fio_file *f, int flags) 46753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{ 46829c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe struct fio_file *__f; 4694d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe int from_hash; 4704d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe 4714d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe __f = lookup_file_hash(f->file_name); 4724d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe if (__f) { 4739efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe dprint(FD_FILE, "found file in hash %s\n", f->file_name); 4744d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe /* 4754d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe * racy, need the __f->lock locked 4764d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe */ 4774d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe f->lock = __f->lock; 4784d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe from_hash = 1; 4794d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe } else { 4809efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe dprint(FD_FILE, "file not found in hash %s\n", f->file_name); 4814d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe from_hash = 0; 4824d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe } 4834d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe 484e8670ef8b26039573fbf835b4b95ba45a1039d83Jens Axboe f->fd = open(f->file_name, flags, 0600); 4854d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe return from_hash; 4864d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe} 4874d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe 488e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboestatic int file_close_shadow_fds(struct thread_data *td) 489e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe{ 490e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe struct fio_file *f; 491e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe int num_closed = 0; 492e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe unsigned int i; 493e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe 494e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe for_each_file(td, f, i) { 495e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe if (f->shadow_fd == -1) 496e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe continue; 497e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe 498e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe close(f->shadow_fd); 499e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe f->shadow_fd = -1; 500e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe num_closed++; 501e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe } 502e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe 503e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe return num_closed; 504e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe} 505e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe 5064d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboeint generic_open_file(struct thread_data *td, struct fio_file *f) 5074d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe{ 508661598287ecc3b8987f312cf8403936552ce686aJens Axboe int is_std = 0; 50953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe int flags = 0; 51029c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe int from_hash = 0; 51153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 512ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe dprint(FD_FILE, "fd open %s\n", f->file_name); 513ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe 5146eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li if (td_trim(td) && f->filetype != FIO_TYPE_BD) { 5156eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li log_err("fio: trim only applies to block device\n"); 5166eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li return 1; 5176eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li } 5186eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li 519661598287ecc3b8987f312cf8403936552ce686aJens Axboe if (!strcmp(f->file_name, "-")) { 520661598287ecc3b8987f312cf8403936552ce686aJens Axboe if (td_rw(td)) { 521661598287ecc3b8987f312cf8403936552ce686aJens Axboe log_err("fio: can't read/write to stdin/out\n"); 522661598287ecc3b8987f312cf8403936552ce686aJens Axboe return 1; 523661598287ecc3b8987f312cf8403936552ce686aJens Axboe } 524661598287ecc3b8987f312cf8403936552ce686aJens Axboe is_std = 1; 525ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe 526ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe /* 527ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe * move output logging to stderr, if we are writing to stdout 528ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe */ 529ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe if (td_write(td)) 530ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe f_out = stderr; 531661598287ecc3b8987f312cf8403936552ce686aJens Axboe } 532661598287ecc3b8987f312cf8403936552ce686aJens Axboe 5336eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li if (td_trim(td)) 5346eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li goto skip_flags; 5352dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe if (td->o.odirect) 5362fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe flags |= OS_O_DIRECT; 537d01612f3ae2515eb035d0c4ce954d8cb167a0a61Chris Mason if (td->o.oatomic) { 538d01612f3ae2515eb035d0c4ce954d8cb167a0a61Chris Mason if (!FIO_O_ATOMIC) { 539d01612f3ae2515eb035d0c4ce954d8cb167a0a61Chris Mason td_verror(td, EINVAL, "OS does not support atomic IO"); 540d01612f3ae2515eb035d0c4ce954d8cb167a0a61Chris Mason return 1; 541d01612f3ae2515eb035d0c4ce954d8cb167a0a61Chris Mason } 542d01612f3ae2515eb035d0c4ce954d8cb167a0a61Chris Mason flags |= OS_O_DIRECT | FIO_O_ATOMIC; 543d01612f3ae2515eb035d0c4ce954d8cb167a0a61Chris Mason } 5442dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe if (td->o.sync_io) 5452fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe flags |= O_SYNC; 546814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe if (td->o.create_on_open) 547814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe flags |= O_CREAT; 5486eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Liskip_flags: 5496eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li if (f->filetype != FIO_TYPE_FILE) 5506eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li flags |= FIO_O_NOATIME; 55153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 552056f3459149a7670257350d84b49858718e4a0e6Aaron Carrollopen_again: 553660a1cb5fb9843ec09a04337714e78d63cd557e7Jens Axboe if (td_write(td)) { 554173081581f94dc4f9f203eb7a7922fc843bfafdeJens Axboe if (!read_only) 555173081581f94dc4f9f203eb7a7922fc843bfafdeJens Axboe flags |= O_RDWR; 55653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 557af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe if (f->filetype == FIO_TYPE_FILE) 5582fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe flags |= O_CREAT; 5592fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe 560661598287ecc3b8987f312cf8403936552ce686aJens Axboe if (is_std) 561661598287ecc3b8987f312cf8403936552ce686aJens Axboe f->fd = dup(STDOUT_FILENO); 5624d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe else 5634d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe from_hash = file_lookup_open(f, flags); 5646eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li } else if (td_read(td)) { 5654241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe if (f->filetype == FIO_TYPE_CHAR && !read_only) 5662fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe flags |= O_RDWR; 5672fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe else 5682fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe flags |= O_RDONLY; 5692fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe 570661598287ecc3b8987f312cf8403936552ce686aJens Axboe if (is_std) 571661598287ecc3b8987f312cf8403936552ce686aJens Axboe f->fd = dup(STDIN_FILENO); 5724d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe else 5734d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe from_hash = file_lookup_open(f, flags); 5746eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li } else { //td trim 5756eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li flags |= O_RDWR; 5766eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li from_hash = file_lookup_open(f, flags); 57753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 57853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 57953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (f->fd == -1) { 580e4e33258637e55550a0fac59eb3350e8bf06f8e6Jens Axboe char buf[FIO_VERROR_SIZE]; 581e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe int __e = errno; 582e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe 583835d9b9ed0e5c2591b8a3eacbd5f4ab6bdab466cJens Axboe if (__e == EPERM && (flags & FIO_O_NOATIME)) { 5845921e80c5dfc9f96d2f21da6ae58f2b5d3a0b373Jens Axboe flags &= ~FIO_O_NOATIME; 585056f3459149a7670257350d84b49858718e4a0e6Aaron Carroll goto open_again; 586056f3459149a7670257350d84b49858718e4a0e6Aaron Carroll } 587e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe if (__e == EMFILE && file_close_shadow_fds(td)) 588e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe goto open_again; 589056f3459149a7670257350d84b49858718e4a0e6Aaron Carroll 59098ffb8f3ecebed9984d1744f142eb8be10c14dbdKen Raeburn snprintf(buf, sizeof(buf), "open(%s)", f->file_name); 591e4e33258637e55550a0fac59eb3350e8bf06f8e6Jens Axboe 592a93c5f049da63a60f9962177d8ada50094d234deJens Axboe if (__e == EINVAL && (flags & OS_O_DIRECT)) { 593a93c5f049da63a60f9962177d8ada50094d234deJens Axboe log_err("fio: looks like your file system does not " \ 594a93c5f049da63a60f9962177d8ada50094d234deJens Axboe "support direct=1/buffered=0\n"); 595a93c5f049da63a60f9962177d8ada50094d234deJens Axboe } 596a93c5f049da63a60f9962177d8ada50094d234deJens Axboe 597e4e33258637e55550a0fac59eb3350e8bf06f8e6Jens Axboe td_verror(td, __e, buf); 59853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 59953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 60029c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe if (!from_hash && f->fd != -1) { 60129c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe if (add_file_hash(f)) { 6023f0ca9b914e6d0db8c5c457713c277ce458cbc02Jens Axboe int fio_unused ret; 60329c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe 60429c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe /* 605e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe * Stash away descriptor for later close. This is to 606e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe * work-around a "feature" on Linux, where a close of 607e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe * an fd that has been opened for write will trigger 608e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe * udev to call blkid to check partitions, fs id, etc. 609de8f6de97438d5664cd8765e60102b9109a273e2Anatol Pomozov * That pollutes the device cache, which can slow down 610e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe * unbuffered accesses. 61129c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe */ 612e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe if (f->shadow_fd == -1) 613e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe f->shadow_fd = f->fd; 614e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe else { 615e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe /* 616e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe * OK to ignore, we haven't done anything 617e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe * with it 618e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe */ 619e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe ret = generic_close_file(td, f); 620e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe } 62129c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe goto open_again; 62229c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe } 62329c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe } 6244906e0b57f2b8cbad02ef2428522281cf6038bddJens Axboe 62553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 0; 626b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe} 627b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe 628df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboeint generic_get_file_size(struct thread_data *td, struct fio_file *f) 62921972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe{ 630df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe return get_file_size(td, f); 63121972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe} 63221972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe 6337bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe/* 6347bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * open/close all files, so that ->real_file_size gets set 6357bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */ 636bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboestatic int get_file_sizes(struct thread_data *td) 6377bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe{ 6387bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe struct fio_file *f; 6397bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe unsigned int i; 640bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe int err = 0; 6417bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 6427bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe for_each_file(td, f, i) { 6435ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe dprint(FD_FILE, "get file size for %p/%d/%p\n", f, i, 6445ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe f->file_name); 6459efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe 64699a47c6905731e53dd4d8f7ea6501f36d9329e7bJens Axboe if (td_io_get_file_size(td, f)) { 64740b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe if (td->error != ENOENT) { 64840b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe log_err("%s\n", td->verror); 64940b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe err = 1; 65040b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe } 651541d66d70b8fbe9860b31307c0760e6d5f4c78a8Jens Axboe clear_error(td); 65207eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe } 653409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe 654409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe if (f->real_file_size == -1ULL && td->o.size) 655409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe f->real_file_size = td->o.size / td->o.nr_files; 6567bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } 657bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe 658bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe return err; 6597bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe} 6607bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 6612e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboestruct fio_mount { 6622e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe struct flist_head list; 6632e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe const char *base; 6642e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe char __base[256]; 6652e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe unsigned int key; 6662e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe}; 6672e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 6682e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe/* 6692e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe * Get free number of bytes for each file on each unique mount. 6702e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe */ 6712e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboestatic unsigned long long get_fs_free_counts(struct thread_data *td) 6722e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe{ 6732e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe struct flist_head *n, *tmp; 67468b0316f581c3c881d7dbf7c9dafef4a10100a66Jens Axboe unsigned long long ret = 0; 6752e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe struct fio_mount *fm; 6762e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe FLIST_HEAD(list); 6772e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe struct fio_file *f; 6782e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe unsigned int i; 6792e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 6802e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe for_each_file(td, f, i) { 6812e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe struct stat sb; 6822e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe char buf[256]; 6832e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 6844ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe if (f->filetype == FIO_TYPE_BD || f->filetype == FIO_TYPE_CHAR) { 6854ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe if (f->real_file_size != -1ULL) 6864ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe ret += f->real_file_size; 68768b0316f581c3c881d7dbf7c9dafef4a10100a66Jens Axboe continue; 68868b0316f581c3c881d7dbf7c9dafef4a10100a66Jens Axboe } else if (f->filetype != FIO_TYPE_FILE) 68968b0316f581c3c881d7dbf7c9dafef4a10100a66Jens Axboe continue; 69068b0316f581c3c881d7dbf7c9dafef4a10100a66Jens Axboe 691da27a4bf0f9753fcc9da7b63f1be482fc0349907Jens Axboe buf[255] = '\0'; 692da27a4bf0f9753fcc9da7b63f1be482fc0349907Jens Axboe strncpy(buf, f->file_name, 255); 6932e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 6942e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe if (stat(buf, &sb) < 0) { 6952e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe if (errno != ENOENT) 6962e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe break; 6972e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe strcpy(buf, "."); 6982e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe if (stat(buf, &sb) < 0) 6992e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe break; 7002e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe } 7012e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 7022e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe fm = NULL; 7032e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe flist_for_each(n, &list) { 7042e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe fm = flist_entry(n, struct fio_mount, list); 7052e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe if (fm->key == sb.st_dev) 7062e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe break; 7072e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 7082e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe fm = NULL; 7092e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe } 7102e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 7112e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe if (fm) 7122e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe continue; 7132e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 7143660ceae229f08b4086279be7c82e86926f0304bJens Axboe fm = calloc(1, sizeof(*fm)); 7153660ceae229f08b4086279be7c82e86926f0304bJens Axboe strncpy(fm->__base, buf, sizeof(fm->__base) - 1); 7162e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe fm->base = basename(fm->__base); 7172e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe fm->key = sb.st_dev; 7182e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe flist_add(&fm->list, &list); 7192e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe } 7202e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 7212e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe flist_for_each_safe(n, tmp, &list) { 7222e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe unsigned long long sz; 7232e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 7242e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe fm = flist_entry(n, struct fio_mount, list); 7252e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe flist_del(&fm->list); 7262e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 7272e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe sz = get_fs_size(fm->base); 7282e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe if (sz && sz != -1ULL) 7292e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe ret += sz; 7302e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 7312e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe free(fm); 7322e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe } 7332e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 7342e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe return ret; 7352e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe} 7362e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 737bedc9dc24223bb33be4120f4a57718bc54888ca5Jens Axboeuint64_t get_start_offset(struct thread_data *td, struct fio_file *f) 738ce95d651568bd5494e4c4ddc95832715c6760d56Dan Ehrenberg{ 739bedc9dc24223bb33be4120f4a57718bc54888ca5Jens Axboe struct thread_options *o = &td->o; 740bedc9dc24223bb33be4120f4a57718bc54888ca5Jens Axboe 741bedc9dc24223bb33be4120f4a57718bc54888ca5Jens Axboe if (o->file_append && f->filetype == FIO_TYPE_FILE) 742bedc9dc24223bb33be4120f4a57718bc54888ca5Jens Axboe return f->real_file_size; 743bedc9dc24223bb33be4120f4a57718bc54888ca5Jens Axboe 744ce95d651568bd5494e4c4ddc95832715c6760d56Dan Ehrenberg return td->o.start_offset + 745ce95d651568bd5494e4c4ddc95832715c6760d56Dan Ehrenberg (td->thread_number - 1) * td->o.offset_increment; 746ce95d651568bd5494e4c4ddc95832715c6760d56Dan Ehrenberg} 747ce95d651568bd5494e4c4ddc95832715c6760d56Dan Ehrenberg 7487bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe/* 7497bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * Open the files and setup files sizes, creating files if necessary. 7507bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */ 75153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboeint setup_files(struct thread_data *td) 75253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{ 7537bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe unsigned long long total_size, extend_size; 754de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe struct thread_options *o = &td->o; 75553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe struct fio_file *f; 756002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe unsigned int i, nr_fs_extra = 0; 757000b080395e45cbe0ce54e75f0e993addbdc8676Jens Axboe int err = 0, need_extend; 758e90391eb56d81a2cc175c50caf6b4e5abbdb6142Jens Axboe int old_state; 759002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe const unsigned int bs = td_min_bs(td); 760002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe uint64_t fs = 0; 76153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 762ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe dprint(FD_FILE, "setup files\n"); 763ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe 7648edd973d57a311d4c590d7385796bbdf111ed04cJens Axboe old_state = td_bump_runstate(td, TD_SETTING_UP); 765e90391eb56d81a2cc175c50caf6b4e5abbdb6142Jens Axboe 766de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe if (o->read_iolog_file) 76725460cf6350fb90b8a7943bb649a51d81bac13a4Jens Axboe goto done; 768691c8fb014da9dd82e999a90b5511423f4eee188Jens Axboe 76953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe /* 77053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe * if ioengine defines a setup() method, it's responsible for 7717bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * opening the files and setting f->real_file_size to indicate 7727bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * the valid range for that file. 77353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe */ 77453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (td->io_ops->setup) 7757bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe err = td->io_ops->setup(td); 7767bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe else 777bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe err = get_file_sizes(td); 77853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 779f102706350093e60617cc271b128e56c57ab3ce7Jens Axboe if (err) 780e90391eb56d81a2cc175c50caf6b4e5abbdb6142Jens Axboe goto err_out; 781f102706350093e60617cc271b128e56c57ab3ce7Jens Axboe 7820a7eb121ecb2e4279e9eb8178aa1e554dda40191Jens Axboe /* 7837bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * check sizes. if the files/devices do not exist and the size 7847bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * isn't passed to fio, abort. 7850a7eb121ecb2e4279e9eb8178aa1e554dda40191Jens Axboe */ 7867bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe total_size = 0; 7877bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe for_each_file(td, f, i) { 7887bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (f->real_file_size == -1ULL) 7897bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe total_size = -1ULL; 7907bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe else 7917bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe total_size += f->real_file_size; 7927bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } 7930a7eb121ecb2e4279e9eb8178aa1e554dda40191Jens Axboe 794de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe if (o->fill_device) 7952e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe td->fill_device_size = get_fs_free_counts(td); 7962e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 7977bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe /* 7987bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * device/file sizes are zero and no size given, punt 7997bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */ 800de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe if ((!total_size || total_size == -1ULL) && !o->size && 801de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe !(td->io_ops->flags & FIO_NOIO) && !o->fill_device && 802de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe !(o->nr_files && (o->file_size_low || o->file_size_high))) { 803de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe log_err("%s: you need to specify size=\n", o->name); 804e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe td_verror(td, EINVAL, "total_file_size"); 805e90391eb56d81a2cc175c50caf6b4e5abbdb6142Jens Axboe goto err_out; 80653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 80753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 8087bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe /* 809002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe * Calculate per-file size and potential extra size for the 810002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe * first files, if needed. 811002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe */ 812d1e78e6b0429bac92794fb6f1c24b5078c68da6dJens Axboe if (!o->file_size_low && o->nr_files) { 813002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe uint64_t all_fs; 814002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe 815002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe fs = o->size / o->nr_files; 816002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe all_fs = fs * o->nr_files; 817002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe 818002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe if (all_fs < o->size) 819002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe nr_fs_extra = (o->size - all_fs) / bs; 820002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe } 821002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe 822002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe /* 8237bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * now file sizes are known, so we can set ->io_size. if size= is 8247bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * not given, ->io_size is just equal to ->real_file_size. if size 8257bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * is given, ->io_size is size / nr_files. 8267bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */ 8277bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe extend_size = total_size = 0; 8287bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe need_extend = 0; 8297bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe for_each_file(td, f, i) { 830bedc9dc24223bb33be4120f4a57718bc54888ca5Jens Axboe f->file_offset = get_start_offset(td, f); 831bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang 832de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe if (!o->file_size_low) { 8337bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe /* 8347bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * no file size range given, file size is equal to 835002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe * total size divided by number of files. If that is 836002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe * zero, set it to the real file size. If the size 837002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe * doesn't divide nicely with the min blocksize, 838002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe * make the first files bigger. 8397bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */ 840002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe f->io_size = fs; 841002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe if (nr_fs_extra) { 842002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe nr_fs_extra--; 843002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe f->io_size += bs; 844002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe } 845002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe 84665bdb10a09222d8b5d213de74824be775772ea8fJens Axboe if (!f->io_size) 847273f8c912d981439049d9b21aa048aaeaa323c5dJens Axboe f->io_size = f->real_file_size - f->file_offset; 848de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe } else if (f->real_file_size < o->file_size_low || 849de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe f->real_file_size > o->file_size_high) { 850de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe if (f->file_offset > o->file_size_low) 851bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang goto err_offset; 8527bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe /* 8537bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * file size given. if it's fixed, use that. if it's a 8547bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * range, generate a random size in-between. 8557bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */ 856de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe if (o->file_size_low == o->file_size_high) 857de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe f->io_size = o->file_size_low - f->file_offset; 858de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe else { 8595ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe f->io_size = get_rand_file_size(td) 8605ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe - f->file_offset; 8615ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe } 86265bdb10a09222d8b5d213de74824be775772ea8fJens Axboe } else 863bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang f->io_size = f->real_file_size - f->file_offset; 86453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 8657bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (f->io_size == -1ULL) 8667bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe total_size = -1ULL; 8674d002569dc503474a53e824e3f72b10a09c9a2b5Shaohua Li else { 868de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe if (o->size_percent) 869de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe f->io_size = (f->io_size * o->size_percent) / 100; 8707bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe total_size += f->io_size; 8714d002569dc503474a53e824e3f72b10a09c9a2b5Shaohua Li } 8727bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 8737bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (f->filetype == FIO_TYPE_FILE && 874bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang (f->io_size + f->file_offset) > f->real_file_size && 8757bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe !(td->io_ops->flags & FIO_DISKLESSIO)) { 876de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe if (!o->create_on_open) { 877814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe need_extend++; 878814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe extend_size += (f->io_size + f->file_offset); 879814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe } else 880814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe f->real_file_size = f->io_size + f->file_offset; 881d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe fio_file_set_extend(f); 8825ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe } 8837bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } 88453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 885de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe if (!o->size || o->size > total_size) 886de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe o->size = total_size; 88721972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe 888d1faa06dc74fcdcae02e70260c90121502ef01cfJens Axboe if (o->size < td_min_bs(td)) { 889d1faa06dc74fcdcae02e70260c90121502ef01cfJens Axboe log_err("fio: blocksize too large for data set\n"); 890d1faa06dc74fcdcae02e70260c90121502ef01cfJens Axboe goto err_out; 891d1faa06dc74fcdcae02e70260c90121502ef01cfJens Axboe } 892d1faa06dc74fcdcae02e70260c90121502ef01cfJens Axboe 8937bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe /* 8947bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * See if we need to extend some files 8957bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */ 8967bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (need_extend) { 8977bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe temp_stall_ts = 1; 898f3afa57e36550288340f1b6c694f354ae72654b9Jens Axboe if (output_format == FIO_OUTPUT_NORMAL) 899a7ba8c5f4c0f9fe117d529c1ad6686b2070bae51Shaozhi Shawn Ye log_info("%s: Laying out IO file(s) (%u file(s) /" 900de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe " %lluMB)\n", o->name, need_extend, 901a7ba8c5f4c0f9fe117d529c1ad6686b2070bae51Shaozhi Shawn Ye extend_size >> 20); 9027bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 9037bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe for_each_file(td, f, i) { 9045e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe unsigned long long old_len = -1ULL, extend_len = -1ULL; 9053baddf2450d811be658fb47ef883ee84478dc352Jens Axboe 906d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe if (!fio_file_extend(f)) 9077bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe continue; 9087bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 909409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe assert(f->filetype == FIO_TYPE_FILE); 910d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe fio_file_clear_extend(f); 911de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe if (!o->fill_device) { 9125e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe old_len = f->real_file_size; 9130b9d69ecb14045cf3b2622ae922756b9889b25e6Jens Axboe extend_len = f->io_size + f->file_offset - 9140b9d69ecb14045cf3b2622ae922756b9889b25e6Jens Axboe old_len; 9155e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe } 916bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang f->real_file_size = (f->io_size + f->file_offset); 9177bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe err = extend_file(td, f); 9187bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (err) 9193baddf2450d811be658fb47ef883ee84478dc352Jens Axboe break; 9205e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe 9213baddf2450d811be658fb47ef883ee84478dc352Jens Axboe err = __file_invalidate_cache(td, f, old_len, 9223baddf2450d811be658fb47ef883ee84478dc352Jens Axboe extend_len); 9239824f73be5a03e683a236eb1ebe18f4656ac06b8Jens Axboe 9249824f73be5a03e683a236eb1ebe18f4656ac06b8Jens Axboe /* 9259824f73be5a03e683a236eb1ebe18f4656ac06b8Jens Axboe * Shut up static checker 9269824f73be5a03e683a236eb1ebe18f4656ac06b8Jens Axboe */ 9279824f73be5a03e683a236eb1ebe18f4656ac06b8Jens Axboe if (f->fd != -1) 9289824f73be5a03e683a236eb1ebe18f4656ac06b8Jens Axboe close(f->fd); 9299824f73be5a03e683a236eb1ebe18f4656ac06b8Jens Axboe 9303baddf2450d811be658fb47ef883ee84478dc352Jens Axboe f->fd = -1; 9313baddf2450d811be658fb47ef883ee84478dc352Jens Axboe if (err) 9327bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe break; 9337bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } 9347bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe temp_stall_ts = 0; 9357bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } 9367bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 9377bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (err) 938e90391eb56d81a2cc175c50caf6b4e5abbdb6142Jens Axboe goto err_out; 9397bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 940de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe if (!o->zone_size) 941de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe o->zone_size = o->size; 9427bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 943ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe /* 944ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe * iolog already set the total io size, if we read back 945ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe * stored entries. 946ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe */ 947de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe if (!o->read_iolog_file) 948de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe td->total_io_size = o->size * o->loops; 94925460cf6350fb90b8a7943bb649a51d81bac13a4Jens Axboe 95025460cf6350fb90b8a7943bb649a51d81bac13a4Jens Axboedone: 951de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe if (o->create_only) 95225460cf6350fb90b8a7943bb649a51d81bac13a4Jens Axboe td->done = 1; 95325460cf6350fb90b8a7943bb649a51d81bac13a4Jens Axboe 9548edd973d57a311d4c590d7385796bbdf111ed04cJens Axboe td_restore_runstate(td, old_state); 9557bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe return 0; 956bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tangerr_offset: 957de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe log_err("%s: you need to specify valid offset=\n", o->name); 958e90391eb56d81a2cc175c50caf6b4e5abbdb6142Jens Axboeerr_out: 9598edd973d57a311d4c590d7385796bbdf111ed04cJens Axboe td_restore_runstate(td, old_state); 960bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang return 1; 96153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe} 96253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 963afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanminint pre_read_files(struct thread_data *td) 964afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin{ 965afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin struct fio_file *f; 966afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin unsigned int i; 967afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin 968afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin dprint(FD_FILE, "pre_read files\n"); 969afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin 970afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin for_each_file(td, f, i) { 971afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin pre_read_file(td, f); 972afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin } 973afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin 974afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin return 1; 975afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin} 976afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin 9779c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboestatic int __init_rand_distribution(struct thread_data *td, struct fio_file *f) 9789c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe{ 9792316296a514711bb388d87b34742c04bb561d986Jens Axboe unsigned int range_size, seed; 9809c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe unsigned long nranges; 98121415db9f1689a5c47fda5e710879c4739707442Jens Axboe uint64_t file_size; 9829c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe 9839c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe range_size = min(td->o.min_bs[DDIR_READ], td->o.min_bs[DDIR_WRITE]); 98421415db9f1689a5c47fda5e710879c4739707442Jens Axboe file_size = min(f->real_file_size, f->io_size); 9859c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe 98621415db9f1689a5c47fda5e710879c4739707442Jens Axboe nranges = (file_size + range_size - 1) / range_size; 9879c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe 9882316296a514711bb388d87b34742c04bb561d986Jens Axboe seed = jhash(f->file_name, strlen(f->file_name), 0) * td->thread_number; 9898425687edef1b2961a17bd58341686f7b598cf28Jens Axboe if (!td->o.rand_repeatable) 9908425687edef1b2961a17bd58341686f7b598cf28Jens Axboe seed = td->rand_seeds[4]; 9918425687edef1b2961a17bd58341686f7b598cf28Jens Axboe 9929c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe if (td->o.random_distribution == FIO_RAND_DIST_ZIPF) 993888677a428eb6ae6b54195e99734d6d6b3ee55e7Jens Axboe zipf_init(&f->zipf, nranges, td->o.zipf_theta.u.f, seed); 9949c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe else 995888677a428eb6ae6b54195e99734d6d6b3ee55e7Jens Axboe pareto_init(&f->zipf, nranges, td->o.pareto_h.u.f, seed); 9969c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe 9979c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe return 1; 9989c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe} 9999c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe 10009c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboestatic int init_rand_distribution(struct thread_data *td) 10019c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe{ 10029c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe struct fio_file *f; 10039c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe unsigned int i; 10049c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe int state; 10059c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe 10069c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe if (td->o.random_distribution == FIO_RAND_DIST_RANDOM) 10079c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe return 0; 10089c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe 10098edd973d57a311d4c590d7385796bbdf111ed04cJens Axboe state = td_bump_runstate(td, TD_SETTING_UP); 10108edd973d57a311d4c590d7385796bbdf111ed04cJens Axboe 10119c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe for_each_file(td, f, i) 10129c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe __init_rand_distribution(td, f); 10138edd973d57a311d4c590d7385796bbdf111ed04cJens Axboe 10148edd973d57a311d4c590d7385796bbdf111ed04cJens Axboe td_restore_runstate(td, state); 10159c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe 10169c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe return 1; 10179c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe} 10189c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe 1019687270767de17dbad53c50e03e5d73d52505405cJens Axboeint init_random_map(struct thread_data *td) 1020687270767de17dbad53c50e03e5d73d52505405cJens Axboe{ 102151ede0b1e9c9b570b942b50b44d0455183a0d5ecJens Axboe unsigned long long blocks; 1022687270767de17dbad53c50e03e5d73d52505405cJens Axboe struct fio_file *f; 1023687270767de17dbad53c50e03e5d73d52505405cJens Axboe unsigned int i; 1024687270767de17dbad53c50e03e5d73d52505405cJens Axboe 10259c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe if (init_rand_distribution(td)) 10269c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe return 0; 10273831a843c289ab6a42a19752733d0fca4250882aJens Axboe if (!td_random(td)) 1028687270767de17dbad53c50e03e5d73d52505405cJens Axboe return 0; 1029687270767de17dbad53c50e03e5d73d52505405cJens Axboe 1030687270767de17dbad53c50e03e5d73d52505405cJens Axboe for_each_file(td, f, i) { 103138f30c81d8d194da047950cbbda3896bd35cd98cJens Axboe uint64_t file_size = min(f->real_file_size, f->io_size); 103238f30c81d8d194da047950cbbda3896bd35cd98cJens Axboe 103353737ae01ca65f88089d3b8639df7be5b2f7ef0eJens Axboe blocks = file_size / (unsigned long long) td->o.rw_min_bs; 103453737ae01ca65f88089d3b8639df7be5b2f7ef0eJens Axboe 10358055e41d0ecc54770a2653427532b3e2c5fabdadJens Axboe if (td->o.random_generator == FIO_RAND_GEN_LFSR) { 103682af46be1fa0c0e188bbb6723008fa33a510606fJens Axboe unsigned long seed; 103782af46be1fa0c0e188bbb6723008fa33a510606fJens Axboe 103882af46be1fa0c0e188bbb6723008fa33a510606fJens Axboe seed = td->rand_seeds[FIO_RAND_BLOCK_OFF]; 103982af46be1fa0c0e188bbb6723008fa33a510606fJens Axboe 1040225ba9e3433cf27d8ff7b213d9f78b7ef2776c70Jens Axboe if (!lfsr_init(&f->lfsr, blocks, seed, 0)) 10418055e41d0ecc54770a2653427532b3e2c5fabdadJens Axboe continue; 10423831a843c289ab6a42a19752733d0fca4250882aJens Axboe } else if (!td->o.norandommap) { 10437ebd796f4e50c21d652e62bf1e112755b0f338a8Jens Axboe f->io_axmap = axmap_new(blocks); 10447ebd796f4e50c21d652e62bf1e112755b0f338a8Jens Axboe if (f->io_axmap) 10458055e41d0ecc54770a2653427532b3e2c5fabdadJens Axboe continue; 10461cad7121e8e6c59440ae43545be05fa302e4110dJens Axboe } else if (td->o.norandommap) 10471cad7121e8e6c59440ae43545be05fa302e4110dJens Axboe continue; 1048ceadd59ef93421001530aa765d928e9e8c26b32eJens Axboe 10492b386d2569c9078ca9790c4e6d318ec3835b8739Jens Axboe if (!td->o.softrandommap) { 10505ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe log_err("fio: failed allocating random map. If running" 10515ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe " a large number of jobs, try the 'norandommap'" 10522b386d2569c9078ca9790c4e6d318ec3835b8739Jens Axboe " option or set 'softrandommap'. Or give" 10532b386d2569c9078ca9790c4e6d318ec3835b8739Jens Axboe " a larger --alloc-size to fio.\n"); 1054687270767de17dbad53c50e03e5d73d52505405cJens Axboe return 1; 1055687270767de17dbad53c50e03e5d73d52505405cJens Axboe } 1056303032ae4e13c7ac10b8198c40df98d95a4524a6Jens Axboe 1057303032ae4e13c7ac10b8198c40df98d95a4524a6Jens Axboe log_info("fio: file %s failed allocating random map. Running " 1058303032ae4e13c7ac10b8198c40df98d95a4524a6Jens Axboe "job without.\n", f->file_name); 1059687270767de17dbad53c50e03e5d73d52505405cJens Axboe } 1060687270767de17dbad53c50e03e5d73d52505405cJens Axboe 1061687270767de17dbad53c50e03e5d73d52505405cJens Axboe return 0; 1062687270767de17dbad53c50e03e5d73d52505405cJens Axboe} 1063687270767de17dbad53c50e03e5d73d52505405cJens Axboe 106453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboevoid close_files(struct thread_data *td) 106553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{ 10660ab8db8943acc6b9ea778735563bfad2a79e8dddJens Axboe struct fio_file *f; 1067af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe unsigned int i; 106853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 10692be3eec330360e6735fb4e7d70907e11eaa346f8Jens Axboe for_each_file(td, f, i) { 10702be3eec330360e6735fb4e7d70907e11eaa346f8Jens Axboe if (fio_file_open(f)) 10712be3eec330360e6735fb4e7d70907e11eaa346f8Jens Axboe td_io_close_file(td, f); 10722be3eec330360e6735fb4e7d70907e11eaa346f8Jens Axboe } 107324ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe} 107424ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe 107524ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboevoid close_and_free_files(struct thread_data *td) 107624ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe{ 107724ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe struct fio_file *f; 107824ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe unsigned int i; 107924ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe 1080ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe dprint(FD_FILE, "close files\n"); 1081ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe 10820ab8db8943acc6b9ea778735563bfad2a79e8dddJens Axboe for_each_file(td, f, i) { 108322a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe if (fio_file_open(f)) 108422a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe td_io_close_file(td, f); 108522a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe 1086b9fbcf2104ab79127825e0c23ba0a147ec076087Shaozhi Shawn Ye remove_file_hash(f); 1087b3dc7f075b85e004f8c681ebb8566475017696f3Jens Axboe 1088b5f4d8baefc6eb3e13235b7d9042b7ffecdb23ddJens Axboe if (td->o.unlink && f->filetype == FIO_TYPE_FILE) { 1089b5f4d8baefc6eb3e13235b7d9042b7ffecdb23ddJens Axboe dprint(FD_FILE, "free unlink %s\n", f->file_name); 1090b5f4d8baefc6eb3e13235b7d9042b7ffecdb23ddJens Axboe unlink(f->file_name); 1091b5f4d8baefc6eb3e13235b7d9042b7ffecdb23ddJens Axboe } 1092b5f4d8baefc6eb3e13235b7d9042b7ffecdb23ddJens Axboe 1093f17c43928c202e557f2f325272c60d9050ee528eJens Axboe sfree(f->file_name); 1094fa1da8653e2177b3cc31a91e963c389f079d4172Jens Axboe f->file_name = NULL; 10957ebd796f4e50c21d652e62bf1e112755b0f338a8Jens Axboe axmap_free(f->io_axmap); 10967ebd796f4e50c21d652e62bf1e112755b0f338a8Jens Axboe f->io_axmap = NULL; 109778d99e6a2695d3a7936c5dd02f996f13a30309b1Jens Axboe sfree(f); 109853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 1099b4a6a59a939f0e6554632de311e7d1d1b7633ccfJens Axboe 11002dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe td->o.filename = NULL; 1101cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe free(td->files); 1102d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe free(td->file_locks); 11039efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe td->files_index = 0; 1104b4a6a59a939f0e6554632de311e7d1d1b7633ccfJens Axboe td->files = NULL; 1105d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe td->file_locks = NULL; 110627ddbfa09b22911d5cefb42a44f894e6eb48216eJens Axboe td->o.file_lock_mode = FILE_LOCK_NONE; 11072dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe td->o.nr_files = 0; 110853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe} 1109af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe 1110e3bab463d4397e3378d8c7437e31de8aaf861a4fJens Axboestatic void get_file_type(struct fio_file *f) 1111af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe{ 1112af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe struct stat sb; 1113af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe 1114661598287ecc3b8987f312cf8403936552ce686aJens Axboe if (!strcmp(f->file_name, "-")) 1115661598287ecc3b8987f312cf8403936552ce686aJens Axboe f->filetype = FIO_TYPE_PIPE; 1116661598287ecc3b8987f312cf8403936552ce686aJens Axboe else 1117661598287ecc3b8987f312cf8403936552ce686aJens Axboe f->filetype = FIO_TYPE_FILE; 1118af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe 11193892182aff21486d9c38a346fe8681c9098ecb0cBruce Cran /* \\.\ is the device namespace in Windows, where every file is 11203892182aff21486d9c38a346fe8681c9098ecb0cBruce Cran * a block device */ 11213892182aff21486d9c38a346fe8681c9098ecb0cBruce Cran if (strncmp(f->file_name, "\\\\.\\", 4) == 0) 11223892182aff21486d9c38a346fe8681c9098ecb0cBruce Cran f->filetype = FIO_TYPE_BD; 11233892182aff21486d9c38a346fe8681c9098ecb0cBruce Cran 1124b30d395ec288508f9c787af11d0f52e9df26e39fJens Axboe if (!stat(f->file_name, &sb)) { 11253892182aff21486d9c38a346fe8681c9098ecb0cBruce Cran if (S_ISBLK(sb.st_mode)) 1126af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe f->filetype = FIO_TYPE_BD; 1127af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe else if (S_ISCHR(sb.st_mode)) 1128af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe f->filetype = FIO_TYPE_CHAR; 1129b5605e9ded4188ed91faae1a43ecd333a9856f62Jens Axboe else if (S_ISFIFO(sb.st_mode)) 1130b5605e9ded4188ed91faae1a43ecd333a9856f62Jens Axboe f->filetype = FIO_TYPE_PIPE; 1131af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe } 1132af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe} 1133af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe 113490426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboestatic int __is_already_allocated(const char *fname) 1135190b8f0c9c1c1a99ed26fd953f7af9023f9533eeCastor Fu{ 113690426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe struct flist_head *entry; 113790426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe char *filename; 1138bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt 113990426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe if (flist_empty(&filename_list)) 114090426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe return 0; 114190426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe 114290426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe flist_for_each(entry, &filename_list) { 114390426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe filename = flist_entry(entry, struct file_name, list)->filename; 114490426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe 114590426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe if (strcmp(filename, fname) == 0) 114690426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe return 1; 114790426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe } 114890426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe 114990426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe return 0; 1150bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt} 1151bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt 1152bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardtstatic int is_already_allocated(const char *fname) 1153bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt{ 115490426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe int ret; 1155bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt 115690426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe fio_file_hash_lock(); 115790426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe ret = __is_already_allocated(fname); 115890426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe fio_file_hash_unlock(); 115990426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe return ret; 116090426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe} 1161bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt 116290426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboestatic void set_already_allocated(const char *fname) 116390426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe{ 116490426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe struct file_name *fn; 116590426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe 116690426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe fn = malloc(sizeof(struct file_name)); 116790426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe fn->filename = strdup(fname); 116890426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe 116990426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe fio_file_hash_lock(); 117090426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe if (!__is_already_allocated(fname)) { 117190426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe flist_add_tail(&fn->list, &filename_list); 117290426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe fn = NULL; 1173bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt } 117490426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe fio_file_hash_unlock(); 1175bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt 117690426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe if (fn) { 117790426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe free(fn->filename); 117890426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe free(fn); 117990426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe } 1180bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt} 1181bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt 118290426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe 1183190b8f0c9c1c1a99ed26fd953f7af9023f9533eeCastor Fustatic void free_already_allocated(void) 1184190b8f0c9c1c1a99ed26fd953f7af9023f9533eeCastor Fu{ 1185bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt struct flist_head *entry, *tmp; 1186bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt struct file_name *fn; 1187bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt 118890426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe if (flist_empty(&filename_list)) 118990426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe return; 119090426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe 119190426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe fio_file_hash_lock(); 119290426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe flist_for_each_safe(entry, tmp, &filename_list) { 119390426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe fn = flist_entry(entry, struct file_name, list); 119490426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe free(fn->filename); 119590426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe flist_del(&fn->list); 119690426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe free(fn); 1197bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt } 119890426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe 119990426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe fio_file_hash_unlock(); 1200bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt} 1201bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt 12027b5cb700485518c2e7f2f49548319c89ba907195Jens Axboestatic struct fio_file *alloc_new_file(struct thread_data *td) 12037b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe{ 12047b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe struct fio_file *f; 12057b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe 12067b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe f = smalloc(sizeof(*f)); 12077b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe if (!f) { 12087b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe log_err("fio: smalloc OOM\n"); 12097b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe assert(0); 12107b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe return NULL; 12117b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe } 12127b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe 12137b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe f->fd = -1; 12147b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe f->shadow_fd = -1; 12157b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe fio_file_reset(td, f); 12167b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe return f; 12177b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe} 12187b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe 12195903e7b7907854014478b6febfc5645a203ff59eJens Axboeint add_file(struct thread_data *td, const char *fname, int numjob, int inc) 1220af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe{ 12217b4e4fe5e6fa26f82f9169c18ec70c08d0805ca9Jens Axboe int cur_files = td->files_index; 1222bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe char file_name[PATH_MAX]; 1223af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe struct fio_file *f; 1224bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe int len = 0; 1225af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe 1226ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe dprint(FD_FILE, "add file %s\n", fname); 1227ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe 1228bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt if (td->o.directory) 1229bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt len = set_name_idx(file_name, td->o.directory, numjob); 1230bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt 1231bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt sprintf(file_name + len, "%s", fname); 1232bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt 1233bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt /* clean cloned siblings using existing files */ 1234bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt if (numjob && is_already_allocated(file_name)) 1235bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt return 0; 1236bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt 12377b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe f = alloc_new_file(td); 1238bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe 1239fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe if (td->files_size <= td->files_index) { 12401983e3271c20a5dca84ac1ad872e44dd9e62e6b8Jianpeng Ma unsigned int new_size = td->o.nr_files + 1; 1241126d65c6fc97d6acdc568aa5a969c012018daf15Jens Axboe 1242fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe dprint(FD_FILE, "resize file array to %d files\n", new_size); 1243fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe 1244fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe td->files = realloc(td->files, new_size * sizeof(f)); 1245d537c08b0eacdeb05835ee8c5f269b872239713aJianpeng Ma if (td->files == NULL) { 1246d537c08b0eacdeb05835ee8c5f269b872239713aJianpeng Ma log_err("fio: realloc OOM\n"); 1247d537c08b0eacdeb05835ee8c5f269b872239713aJianpeng Ma assert(0); 1248d537c08b0eacdeb05835ee8c5f269b872239713aJianpeng Ma } 1249d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe if (td->o.file_lock_mode != FILE_LOCK_NONE) { 1250d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe td->file_locks = realloc(td->file_locks, new_size); 1251d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe if (!td->file_locks) { 1252d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe log_err("fio: realloc OOM\n"); 1253d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe assert(0); 1254d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe } 1255d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe td->file_locks[cur_files] = FILE_LOCK_NONE; 1256d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe } 1257fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe td->files_size = new_size; 1258fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe } 12598bb7679e73d3086a01b9d21a650b0d7a859412b6Jens Axboe td->files[cur_files] = f; 126089ac1d48971578ccb0645c292d4a058340aeb909Shaohua Li f->fileno = cur_files; 1261126d65c6fc97d6acdc568aa5a969c012018daf15Jens Axboe 126207eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe /* 126307eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe * init function, io engine may not be loaded yet 126407eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe */ 126507eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe if (td->io_ops && (td->io_ops->flags & FIO_DISKLESSIO)) 126607eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe f->real_file_size = -1ULL; 126707eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe 1268f17c43928c202e557f2f325272c60d9050ee528eJens Axboe f->file_name = smalloc_strdup(file_name); 1269c48c0be79173897824d8f439c39374f2588931dcJens Axboe if (!f->file_name) { 1270c48c0be79173897824d8f439c39374f2588931dcJens Axboe log_err("fio: smalloc OOM\n"); 1271c48c0be79173897824d8f439c39374f2588931dcJens Axboe assert(0); 1272c48c0be79173897824d8f439c39374f2588931dcJens Axboe } 12730b9d69ecb14045cf3b2622ae922756b9889b25e6Jens Axboe 1274e3bab463d4397e3378d8c7437e31de8aaf861a4fJens Axboe get_file_type(f); 1275af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe 12764d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe switch (td->o.file_lock_mode) { 12774d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe case FILE_LOCK_NONE: 12784d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe break; 12794d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe case FILE_LOCK_READWRITE: 1280d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe f->rwlock = fio_rwlock_init(); 12814d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe break; 12824d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe case FILE_LOCK_EXCLUSIVE: 1283521da527743088a9bd2ab882f8b64799d49d5848Jens Axboe f->lock = fio_mutex_init(FIO_MUTEX_UNLOCKED); 12844d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe break; 12854d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe default: 12864d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe log_err("fio: unknown lock mode: %d\n", td->o.file_lock_mode); 12874d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe assert(0); 12884d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe } 128929c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe 12907b4e4fe5e6fa26f82f9169c18ec70c08d0805ca9Jens Axboe td->files_index++; 12911549441cdfecb2c1a4a8b8d494253859d67b4344Jens Axboe if (f->filetype == FIO_TYPE_FILE) 12921549441cdfecb2c1a4a8b8d494253859d67b4344Jens Axboe td->nr_normal_files++; 1293f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe 1294bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt set_already_allocated(file_name); 1295bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt 12965903e7b7907854014478b6febfc5645a203ff59eJens Axboe if (inc) 12975903e7b7907854014478b6febfc5645a203ff59eJens Axboe td->o.nr_files++; 12985903e7b7907854014478b6febfc5645a203ff59eJens Axboe 12995ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe dprint(FD_FILE, "file %p \"%s\" added at %d\n", f, f->file_name, 13005ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe cur_files); 13019efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe 1302f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe return cur_files; 1303af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe} 13040ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe 130549ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboeint add_file_exclusive(struct thread_data *td, const char *fname) 130649ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe{ 130749ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe struct fio_file *f; 130849ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe unsigned int i; 130949ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe 131049ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe for_each_file(td, f, i) { 131149ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe if (!strcmp(f->file_name, fname)) 131249ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe return i; 131349ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe } 131449ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe 13155903e7b7907854014478b6febfc5645a203ff59eJens Axboe return add_file(td, fname, 0, 1); 131649ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe} 131749ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe 13180ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboevoid get_file(struct fio_file *f) 13190ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe{ 13208172fe972f3a79d42f34d7f6e259ed3f7f800316Jens Axboe dprint(FD_FILE, "get file %s, ref=%d\n", f->file_name, f->references); 1321d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe assert(fio_file_open(f)); 13220ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe f->references++; 13230ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe} 13240ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe 13256977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboeint put_file(struct thread_data *td, struct fio_file *f) 13260ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe{ 132798e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe int f_ret = 0, ret = 0; 13286977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe 13298172fe972f3a79d42f34d7f6e259ed3f7f800316Jens Axboe dprint(FD_FILE, "put file %s, ref=%d\n", f->file_name, f->references); 1330ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe 133122a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe if (!fio_file_open(f)) { 133222a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe assert(f->fd == -1); 13336977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe return 0; 133422a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe } 13350ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe 13360ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe assert(f->references); 13370ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe if (--f->references) 13386977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe return 0; 13390ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe 134071b84caab6ef5ddbc7893e3268887b8ff0516f75Jens Axboe if (should_fsync(td) && td->o.fsync_on_close) { 134198e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe f_ret = fsync(f->fd); 134271b84caab6ef5ddbc7893e3268887b8ff0516f75Jens Axboe if (f_ret < 0) 134371b84caab6ef5ddbc7893e3268887b8ff0516f75Jens Axboe f_ret = errno; 134471b84caab6ef5ddbc7893e3268887b8ff0516f75Jens Axboe } 1345ebb1415f729c123b8a13bcbd667bf4b4cc95b4d4Jens Axboe 13460ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe if (td->io_ops->close_file) 13476977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe ret = td->io_ops->close_file(td, f); 13481020a139beff50faf1bb18f761b024b664a09e14Jens Axboe 134998e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe if (!ret) 1350a5fb461fdff86c442daeebbd28e07984be9f3807Jens Axboe ret = f_ret; 135198e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe 13520ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe td->nr_open_files--; 1353d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe fio_file_clear_open(f); 135422a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe assert(f->fd == -1); 13556977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe return ret; 13560ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe} 1357bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 13584d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboevoid lock_file(struct thread_data *td, struct fio_file *f, enum fio_ddir ddir) 1359b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe{ 13604d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe if (!f->lock || td->o.file_lock_mode == FILE_LOCK_NONE) 13614d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe return; 136229c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe 13634d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe if (td->o.file_lock_mode == FILE_LOCK_READWRITE) { 13644d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe if (ddir == DDIR_READ) 1365d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe fio_rwlock_read(f->rwlock); 13664d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe else 1367d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe fio_rwlock_write(f->rwlock); 13684d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe } else if (td->o.file_lock_mode == FILE_LOCK_EXCLUSIVE) 13694d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe fio_mutex_down(f->lock); 13704d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe 1371d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe td->file_locks[f->fileno] = td->o.file_lock_mode; 1372b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe} 1373b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe 13744d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboevoid unlock_file(struct thread_data *td, struct fio_file *f) 1375b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe{ 13764d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe if (!f->lock || td->o.file_lock_mode == FILE_LOCK_NONE) 13774d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe return; 13784d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe 1379d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe if (td->o.file_lock_mode == FILE_LOCK_READWRITE) 1380d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe fio_rwlock_unlock(f->rwlock); 1381d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe else if (td->o.file_lock_mode == FILE_LOCK_EXCLUSIVE) 13824d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe fio_mutex_up(f->lock); 1383d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe 1384d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe td->file_locks[f->fileno] = FILE_LOCK_NONE; 1385b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe} 1386b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe 13874d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboevoid unlock_file_all(struct thread_data *td, struct fio_file *f) 13884d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe{ 1389f2a2803a4982a1516eb75d9f98de68cf21d1ae7dJens Axboe if (td->o.file_lock_mode == FILE_LOCK_NONE || !td->file_locks) 139027ddbfa09b22911d5cefb42a44f894e6eb48216eJens Axboe return; 1391d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe if (td->file_locks[f->fileno] != FILE_LOCK_NONE) 1392d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe unlock_file(td, f); 13934d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe} 13944d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe 1395bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboestatic int recurse_dir(struct thread_data *td, const char *dirname) 1396bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe{ 1397bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe struct dirent *dir; 1398bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe int ret = 0; 1399bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe DIR *D; 1400bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 1401bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe D = opendir(dirname); 1402bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe if (!D) { 14030ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe char buf[FIO_VERROR_SIZE]; 14040ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe 140598ffb8f3ecebed9984d1744f142eb8be10c14dbdKen Raeburn snprintf(buf, FIO_VERROR_SIZE, "opendir(%s)", dirname); 14060ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe td_verror(td, errno, buf); 1407bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe return 1; 1408bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe } 1409bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 1410bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe while ((dir = readdir(D)) != NULL) { 1411bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe char full_path[PATH_MAX]; 1412bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe struct stat sb; 1413bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 1414e85b2b83e39b64ba5cb73fbfddbf3902b6e84925Jens Axboe if (!strcmp(dir->d_name, ".") || !strcmp(dir->d_name, "..")) 1415e85b2b83e39b64ba5cb73fbfddbf3902b6e84925Jens Axboe continue; 141696d32d518a0743a6c050057bc1562e4883e51c5dJens Axboe 1417b9fd788f0e8adacc33316107594e9eb0463743d7Bruce Cran sprintf(full_path, "%s%s%s", dirname, FIO_OS_PATH_SEPARATOR, dir->d_name); 1418bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 1419bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe if (lstat(full_path, &sb) == -1) { 1420bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe if (errno != ENOENT) { 1421bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe td_verror(td, errno, "stat"); 142268ace9e00ca481d101f9937461402b83e8895ba2Jens Axboe ret = 1; 142368ace9e00ca481d101f9937461402b83e8895ba2Jens Axboe break; 1424bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe } 1425bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe } 1426bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 1427bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe if (S_ISREG(sb.st_mode)) { 14285903e7b7907854014478b6febfc5645a203ff59eJens Axboe add_file(td, full_path, 0, 1); 1429bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe continue; 1430bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe } 14310ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe if (!S_ISDIR(sb.st_mode)) 14320ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe continue; 1433bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 14345ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe ret = recurse_dir(td, full_path); 14355ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe if (ret) 1436bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe break; 1437bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe } 1438bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 1439bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe closedir(D); 1440bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe return ret; 1441bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe} 1442bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 1443bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboeint add_dir_files(struct thread_data *td, const char *path) 1444bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe{ 14450ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe int ret = recurse_dir(td, path); 14460ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe 14470ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe if (!ret) 14480ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe log_info("fio: opendir added %d files\n", td->o.nr_files); 14490ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe 14500ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe return ret; 1451bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe} 1452cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe 1453cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboevoid dup_files(struct thread_data *td, struct thread_data *org) 1454cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe{ 1455cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe struct fio_file *f; 1456cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe unsigned int i; 14579efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe 14589efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe dprint(FD_FILE, "dup files: %d\n", org->files_index); 1459cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe 1460cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe if (!org->files) 1461cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe return; 1462cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe 14639efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe td->files = malloc(org->files_index * sizeof(f)); 1464cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe 1465d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe if (td->o.file_lock_mode != FILE_LOCK_NONE) 1466d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe td->file_locks = malloc(org->files_index); 1467d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe 14689efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe for_each_file(org, f, i) { 1469b0fe421a6a0487ff71f6f903908f666d9ca1b327Jens Axboe struct fio_file *__f; 1470b0fe421a6a0487ff71f6f903908f666d9ca1b327Jens Axboe 14717b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe __f = alloc_new_file(td); 14720b9d69ecb14045cf3b2622ae922756b9889b25e6Jens Axboe 1473bc3456fa06cc7777c4764da8c7b1c0fd0a3c3772Aaron Carroll if (f->file_name) { 1474f17c43928c202e557f2f325272c60d9050ee528eJens Axboe __f->file_name = smalloc_strdup(f->file_name); 1475c48c0be79173897824d8f439c39374f2588931dcJens Axboe if (!__f->file_name) { 1476c48c0be79173897824d8f439c39374f2588931dcJens Axboe log_err("fio: smalloc OOM\n"); 1477c48c0be79173897824d8f439c39374f2588931dcJens Axboe assert(0); 1478c48c0be79173897824d8f439c39374f2588931dcJens Axboe } 14790b9d69ecb14045cf3b2622ae922756b9889b25e6Jens Axboe 1480bc3456fa06cc7777c4764da8c7b1c0fd0a3c3772Aaron Carroll __f->filetype = f->filetype; 1481bc3456fa06cc7777c4764da8c7b1c0fd0a3c3772Aaron Carroll } 1482b0fe421a6a0487ff71f6f903908f666d9ca1b327Jens Axboe 148367ad92428bb19008354ca20e614050241e9f17e7Jens Axboe if (td->o.file_lock_mode == FILE_LOCK_EXCLUSIVE) 148467ad92428bb19008354ca20e614050241e9f17e7Jens Axboe __f->lock = f->lock; 148567ad92428bb19008354ca20e614050241e9f17e7Jens Axboe else if (td->o.file_lock_mode == FILE_LOCK_READWRITE) 148667ad92428bb19008354ca20e614050241e9f17e7Jens Axboe __f->rwlock = f->rwlock; 148767ad92428bb19008354ca20e614050241e9f17e7Jens Axboe 1488b0fe421a6a0487ff71f6f903908f666d9ca1b327Jens Axboe td->files[i] = __f; 1489cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe } 1490cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe} 1491f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe 1492f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe/* 1493f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe * Returns the index that matches the filename, or -1 if not there 1494f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe */ 1495f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboeint get_fileno(struct thread_data *td, const char *fname) 1496f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe{ 1497f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe struct fio_file *f; 1498f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe unsigned int i; 1499f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe 1500f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe for_each_file(td, f, i) 1501f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe if (!strcmp(f->file_name, fname)) 1502f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe return i; 1503f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe 1504f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe return -1; 1505f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe} 1506f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe 1507f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe/* 1508f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe * For log usage, where we add/open/close files automatically 1509f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe */ 1510f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboevoid free_release_files(struct thread_data *td) 1511f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe{ 1512f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe close_files(td); 1513f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe td->files_index = 0; 1514f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe td->nr_normal_files = 0; 1515f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe} 151633c48814e08cf961801bf37f759da2748eb3431bJens Axboe 151733c48814e08cf961801bf37f759da2748eb3431bJens Axboevoid fio_file_reset(struct thread_data *td, struct fio_file *f) 151833c48814e08cf961801bf37f759da2748eb3431bJens Axboe{ 151933c48814e08cf961801bf37f759da2748eb3431bJens Axboe f->last_pos = f->file_offset; 152033c48814e08cf961801bf37f759da2748eb3431bJens Axboe f->last_start = -1ULL; 152133c48814e08cf961801bf37f759da2748eb3431bJens Axboe if (f->io_axmap) 152233c48814e08cf961801bf37f759da2748eb3431bJens Axboe axmap_reset(f->io_axmap); 152333c48814e08cf961801bf37f759da2748eb3431bJens Axboe if (td->o.random_generator == FIO_RAND_GEN_LFSR) 152433c48814e08cf961801bf37f759da2748eb3431bJens Axboe lfsr_reset(&f->lfsr, td->rand_seeds[FIO_RAND_BLOCK_OFF]); 152533c48814e08cf961801bf37f759da2748eb3431bJens Axboe} 1526002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe 1527002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboeint fio_files_done(struct thread_data *td) 1528002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe{ 1529002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe struct fio_file *f; 1530002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe unsigned int i; 1531002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe 1532002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe for_each_file(td, f, i) 1533002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe if (!fio_file_done(f)) 1534002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe return 0; 1535002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe 1536002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe return 1; 1537002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe} 1538bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt 1539bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt/* free memory used in initialization phase only */ 1540190b8f0c9c1c1a99ed26fd953f7af9023f9533eeCastor Fuvoid filesetup_mem_free(void) 1541190b8f0c9c1c1a99ed26fd953f7af9023f9533eeCastor Fu{ 1542bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt free_already_allocated(); 1543bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt} 1544