filesetup.c revision 3e10fb832645e3ab3ef006f589f0459dc567cb53
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" 14ecc314ba7c5f02b7e90ac1dfbce1a74cd4e6d6feBruce Cran#include "os/os.h" 152316296a514711bb388d87b34742c04bb561d986Jens Axboe#include "hash.h" 167ebd796f4e50c21d652e62bf1e112755b0f338a8Jens Axboe#include "lib/axmap.h" 1753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 1897ac992c99d89eed8cdf9249bb038ac4d7b709b9Jens Axboe#ifdef CONFIG_LINUX_FALLOCATE 19a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou#include <linux/falloc.h> 20a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou#endif 21a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou 227172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboestatic int root_warn; 237172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboe 24c592b9fe12d4739d99d5bece517e304804876df6Jens Axboestatic inline void clear_error(struct thread_data *td) 25c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe{ 26c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe td->error = 0; 27c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe td->verror[0] = '\0'; 28c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe} 29c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe 303baddf2450d811be658fb47ef883ee84478dc352Jens Axboe/* 313baddf2450d811be658fb47ef883ee84478dc352Jens Axboe * Leaves f->fd open on success, caller must close 323baddf2450d811be658fb47ef883ee84478dc352Jens Axboe */ 337bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboestatic int extend_file(struct thread_data *td, struct fio_file *f) 3425205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe{ 35ea443657ce85860b7a0dd2f39f2572d4a09fc885Jens Axboe int r, new_layout = 0, unlink_file = 0, flags; 3625205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe unsigned long long left; 3725205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe unsigned int bs; 3825205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe char *b; 39b2a151925a91f38aeb298d693687a47269ad4e94Jens Axboe 404241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe if (read_only) { 414241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe log_err("fio: refusing extend of file due to read-only\n"); 424241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe return 0; 434241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe } 444241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe 45507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe /* 46507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe * check if we need to lay the file out complete again. fio 47507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe * does that for operations involving reads, or for writes 48507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe * where overwrite is set 49507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe */ 50ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe if (td_read(td) || (td_write(td) && td->o.overwrite) || 51ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe (td_write(td) && td->io_ops->flags & FIO_NOEXTEND)) 52507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe new_layout = 1; 53ea443657ce85860b7a0dd2f39f2572d4a09fc885Jens Axboe if (td_write(td) && !td->o.overwrite) 54ea443657ce85860b7a0dd2f39f2572d4a09fc885Jens Axboe unlink_file = 1; 55507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe 566ae1f57f2cb8661b97b770372eeb3694f6d5a744Jens Axboe if (unlink_file || new_layout) { 57bd199f2b98eeb9101795e40fdef5889c630178c1Jens Axboe dprint(FD_FILE, "layout unlink %s\n", f->file_name); 58982016d689dc7fedbb09646ba0df7e72a781b164Zhang, Yanmin if ((unlink(f->file_name) < 0) && (errno != ENOENT)) { 597bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe td_verror(td, errno, "unlink"); 607bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe return 1; 617bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } 627bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } 637bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 64507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe flags = O_WRONLY | O_CREAT; 65507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe if (new_layout) 66507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe flags |= O_TRUNC; 67507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe 68ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe dprint(FD_FILE, "open file %s, flags %x\n", f->file_name, flags); 69507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe f->fd = open(f->file_name, flags, 0644); 7053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (f->fd < 0) { 71e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe td_verror(td, errno, "open"); 7253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 1; 7353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 7453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 7597ac992c99d89eed8cdf9249bb038ac4d7b709b9Jens Axboe#ifdef CONFIG_POSIX_FALLOCATE 76a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou if (!td->o.fill_device) { 77a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou switch (td->o.fallocate_mode) { 78a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou case FIO_FALLOCATE_NONE: 79a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou break; 80a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou case FIO_FALLOCATE_POSIX: 81a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou dprint(FD_FILE, "posix_fallocate file %s size %llu\n", 824b91ee8fd12c72bd76ce9f5ff9116626b48566a0Jens Axboe f->file_name, 834b91ee8fd12c72bd76ce9f5ff9116626b48566a0Jens Axboe (unsigned long long) f->real_file_size); 84a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou 85a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou r = posix_fallocate(f->fd, 0, f->real_file_size); 86a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou if (r > 0) { 87a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou log_err("fio: posix_fallocate fails: %s\n", 88a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou strerror(r)); 89a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou } 90a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou break; 9197ac992c99d89eed8cdf9249bb038ac4d7b709b9Jens Axboe#ifdef CONFIG_LINUX_FALLOCATE 92a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou case FIO_FALLOCATE_KEEP_SIZE: 93a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou dprint(FD_FILE, 94a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou "fallocate(FALLOC_FL_KEEP_SIZE) " 954b91ee8fd12c72bd76ce9f5ff9116626b48566a0Jens Axboe "file %s size %llu\n", f->file_name, 964b91ee8fd12c72bd76ce9f5ff9116626b48566a0Jens Axboe (unsigned long long) f->real_file_size); 977bc8c2cf02fbd538ca388618ff2f4618787a86e0Jens Axboe 98a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou r = fallocate(f->fd, FALLOC_FL_KEEP_SIZE, 0, 99a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou f->real_file_size); 100888677a428eb6ae6b54195e99734d6d6b3ee55e7Jens Axboe if (r != 0) 101a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou td_verror(td, errno, "fallocate"); 102888677a428eb6ae6b54195e99734d6d6b3ee55e7Jens Axboe 103a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou break; 10497ac992c99d89eed8cdf9249bb038ac4d7b709b9Jens Axboe#endif /* CONFIG_LINUX_FALLOCATE */ 105a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou default: 106a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou log_err("fio: unknown fallocate mode: %d\n", 107a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou td->o.fallocate_mode); 108a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou assert(0); 1097bc8c2cf02fbd538ca388618ff2f4618787a86e0Jens Axboe } 1107bc8c2cf02fbd538ca388618ff2f4618787a86e0Jens Axboe } 11197ac992c99d89eed8cdf9249bb038ac4d7b709b9Jens Axboe#endif /* CONFIG_POSIX_FALLOCATE */ 1129b8365618309572d8fd2579c8ea3132db89f843fBruce Cran 113fc74ac1d749c977308016eb22c8658a9a5ac7989Shawn Lewis if (!new_layout) 114fc74ac1d749c977308016eb22c8658a9a5ac7989Shawn Lewis goto done; 115fc74ac1d749c977308016eb22c8658a9a5ac7989Shawn Lewis 1165e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe /* 1175e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe * The size will be -1ULL when fill_device is used, so don't truncate 1185e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe * or fallocate this file, just write it 1195e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe */ 1205e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe if (!td->o.fill_device) { 1215e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe dprint(FD_FILE, "truncate file %s, size %llu\n", f->file_name, 1224b91ee8fd12c72bd76ce9f5ff9116626b48566a0Jens Axboe (unsigned long long) f->real_file_size); 1235e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe if (ftruncate(f->fd, f->real_file_size) == -1) { 1245e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe td_verror(td, errno, "ftruncate"); 1255e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe goto err; 1265e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe } 1275e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe } 12840f8298cd252157fa15d93f8eb470116a94069a0Jens Axboe 1292dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe b = malloc(td->o.max_bs[DDIR_WRITE]); 13053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 1317bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe left = f->real_file_size; 13253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe while (left && !td->terminate) { 1332dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe bs = td->o.max_bs[DDIR_WRITE]; 13453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (bs > left) 13553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe bs = left; 13653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 137cc86c395fd9dd2002ec1edc0967b7c9453debdfbJens Axboe fill_io_buffer(td, b, bs, bs); 138cc86c395fd9dd2002ec1edc0967b7c9453debdfbJens Axboe 13953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe r = write(f->fd, b, bs); 14053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 1415e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe if (r > 0) { 1425e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe left -= r; 14353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe continue; 14453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } else { 1455e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe if (r < 0) { 1465e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe int __e = errno; 1475e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe 1485e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe if (__e == ENOSPC) { 1495e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe if (td->o.fill_device) 1505e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe break; 1515e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe log_info("fio: ENOSPC on laying out " 1525e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe "file, stopping\n"); 1535e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe break; 1545e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe } 155e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe td_verror(td, errno, "write"); 1565e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe } else 157e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe td_verror(td, EIO, "write"); 15853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 15953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe break; 16053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 16153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 16253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 163ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe if (td->terminate) { 164ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe dprint(FD_FILE, "terminate unlink %s\n", f->file_name); 16553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe unlink(f->file_name); 166ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe } else if (td->o.create_fsync) { 16798e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe if (fsync(f->fd) < 0) { 16898e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe td_verror(td, errno, "fsync"); 16998e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe goto err; 17098e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe } 17198e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe } 1720d1cd207e409a36313784cb9596990c819775f77Jens Axboe if (td->o.fill_device && !td_write(td)) { 173d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe fio_file_clear_size_known(f); 1745e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe if (td_io_get_file_size(td, f)) 1755e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe goto err; 1765e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe if (f->io_size > f->real_file_size) 1775e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe f->io_size = f->real_file_size; 1785e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe } 17953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 18053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe free(b); 181507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboedone: 18253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 0; 18353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboeerr: 18453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe close(f->fd); 18553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe f->fd = -1; 18653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 1; 18753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe} 18853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 189afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanminstatic int pre_read_file(struct thread_data *td, struct fio_file *f) 190afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin{ 191b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe int r, did_open = 0, old_runstate; 192afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin unsigned long long left; 193afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin unsigned int bs; 194afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin char *b; 195afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin 1969c0d224129b0c59698e4c77e7fed00dc8cbb50e1Jens Axboe if (td->io_ops->flags & FIO_PIPEIO) 1979c0d224129b0c59698e4c77e7fed00dc8cbb50e1Jens Axboe return 0; 1989c0d224129b0c59698e4c77e7fed00dc8cbb50e1Jens Axboe 199d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe if (!fio_file_open(f)) { 200b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe if (td->io_ops->open_file(td, f)) { 201b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe log_err("fio: cannot pre-read, failed to open file\n"); 202b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe return 1; 203b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe } 204b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe did_open = 1; 205b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe } 206b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe 207b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe old_runstate = td->runstate; 208b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe td_set_runstate(td, TD_PRE_READING); 209b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe 210afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin bs = td->o.max_bs[DDIR_READ]; 211afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin b = malloc(bs); 212afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin memset(b, 0, bs); 213afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin 214afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin lseek(f->fd, f->file_offset, SEEK_SET); 215afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin left = f->io_size; 216afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin 217afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin while (left && !td->terminate) { 218afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin if (bs > left) 219afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin bs = left; 220afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin 221afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin r = read(f->fd, b, bs); 222afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin 223afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin if (r == (int) bs) { 224afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin left -= bs; 225afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin continue; 226afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin } else { 227afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin td_verror(td, EIO, "pre_read"); 228afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin break; 229afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin } 230afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin } 231afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin 232b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe td_set_runstate(td, old_runstate); 233b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe 234b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe if (did_open) 235b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe td->io_ops->close_file(td, f); 236afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin free(b); 237afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin return 0; 238afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin} 239afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin 2407bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboestatic unsigned long long get_rand_file_size(struct thread_data *td) 2419c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe{ 242dc873b6f4a536c332b72cce268d5a7ccd356a891Jens Axboe unsigned long long ret, sized; 2431294c3ec7a02d20a98b105c1c41b23358afc67e4Jens Axboe unsigned long r; 2449c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe 2454c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe if (td->o.use_os_rand) { 2464c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe r = os_random_long(&td->file_size_state); 2474c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe sized = td->o.file_size_high - td->o.file_size_low; 2484c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe ret = (unsigned long long) ((double) sized * (r / (OS_RAND_MAX + 1.0))); 2494c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe } else { 2504c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe r = __rand(&td->__file_size_state); 2514c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe sized = td->o.file_size_high - td->o.file_size_low; 2524c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe ret = (unsigned long long) ((double) sized * (r / (FRAND_MAX + 1.0))); 2534c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe } 2544c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe 2555ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe ret += td->o.file_size_low; 2562dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe ret -= (ret % td->o.rw_min_bs); 2579c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe return ret; 2589c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe} 2599c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe 26053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboestatic int file_size(struct thread_data *td, struct fio_file *f) 26153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{ 26253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe struct stat st; 26353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 264df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe if (stat(f->file_name, &st) == -1) { 2657bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe td_verror(td, errno, "fstat"); 2667bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe return 1; 2677bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } 26853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 2697bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe f->real_file_size = st.st_size; 27053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 0; 27153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe} 27253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 27353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboestatic int bdev_size(struct thread_data *td, struct fio_file *f) 27453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{ 2759b8365618309572d8fd2579c8ea3132db89f843fBruce Cran unsigned long long bytes = 0; 27653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe int r; 27753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 278df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe if (td->io_ops->open_file(td, f)) { 279df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe log_err("fio: failed opening blockdev %s for size check\n", 280df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe f->file_name); 281df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe return 1; 282df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe } 283df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe 284ecc314ba7c5f02b7e90ac1dfbce1a74cd4e6d6feBruce Cran r = blockdev_size(f, &bytes); 28553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (r) { 286e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe td_verror(td, r, "blockdev_size"); 287df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe goto err; 28853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 28953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 2907ab077ab119fd28b6ccf5705ea8453e414f574c1Jens Axboe if (!bytes) { 2917ab077ab119fd28b6ccf5705ea8453e414f574c1Jens Axboe log_err("%s: zero sized block device?\n", f->file_name); 292df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe goto err; 2937ab077ab119fd28b6ccf5705ea8453e414f574c1Jens Axboe } 2947ab077ab119fd28b6ccf5705ea8453e414f574c1Jens Axboe 29553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe f->real_file_size = bytes; 29622a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe td->io_ops->close_file(td, f); 29753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 0; 298df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboeerr: 299df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe td->io_ops->close_file(td, f); 300df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe return 1; 30153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe} 30253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 3034ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboestatic int char_size(struct thread_data *td, struct fio_file *f) 3044ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe{ 3054ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe#ifdef FIO_HAVE_CHARDEV_SIZE 3069b8365618309572d8fd2579c8ea3132db89f843fBruce Cran unsigned long long bytes = 0; 3074ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe int r; 3084ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe 3094ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe if (td->io_ops->open_file(td, f)) { 3104ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe log_err("fio: failed opening blockdev %s for size check\n", 3114ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe f->file_name); 3124ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe return 1; 3134ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe } 3144ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe 315ecc314ba7c5f02b7e90ac1dfbce1a74cd4e6d6feBruce Cran r = chardev_size(f, &bytes); 3164ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe if (r) { 3174ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe td_verror(td, r, "chardev_size"); 3184ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe goto err; 3194ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe } 3204ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe 3214ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe if (!bytes) { 3224ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe log_err("%s: zero sized char device?\n", f->file_name); 3234ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe goto err; 3244ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe } 3254ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe 3264ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe f->real_file_size = bytes; 3274ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe td->io_ops->close_file(td, f); 3284ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe return 0; 3294ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboeerr: 3304ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe td->io_ops->close_file(td, f); 3314ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe return 1; 3324ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe#else 3334ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe f->real_file_size = -1ULL; 3344ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe return 0; 3354ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe#endif 3364ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe} 3374ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe 33853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboestatic int get_file_size(struct thread_data *td, struct fio_file *f) 33953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{ 34053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe int ret = 0; 34153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 342d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe if (fio_file_size_known(f)) 343409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe return 0; 344409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe 3457bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (f->filetype == FIO_TYPE_FILE) 3467bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe ret = file_size(td, f); 3477bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe else if (f->filetype == FIO_TYPE_BD) 34853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe ret = bdev_size(td, f); 3494ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe else if (f->filetype == FIO_TYPE_CHAR) 3504ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe ret = char_size(td, f); 35153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe else 35253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe f->real_file_size = -1; 35353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 35453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (ret) 35553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return ret; 35653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 35753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (f->file_offset > f->real_file_size) { 3580f2152c19ed12fc2280c3d475973112f18e48cd5Bruce Cran log_err("%s: offset extends end (%llu > %llu)\n", td->o.name, 3594e0a8fa2593006505b7f4e18931a201d221b49e9Jens Axboe (unsigned long long) f->file_offset, 3604e0a8fa2593006505b7f4e18931a201d221b49e9Jens Axboe (unsigned long long) f->real_file_size); 36153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 1; 36253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 36353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 364d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe fio_file_set_size_known(f); 36553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 0; 36653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe} 36753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 3683baddf2450d811be658fb47ef883ee84478dc352Jens Axboestatic int __file_invalidate_cache(struct thread_data *td, struct fio_file *f, 3693baddf2450d811be658fb47ef883ee84478dc352Jens Axboe unsigned long long off, 3703baddf2450d811be658fb47ef883ee84478dc352Jens Axboe unsigned long long len) 371e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe{ 372e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe int ret = 0; 373e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe 3745e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe if (len == -1ULL) 3753baddf2450d811be658fb47ef883ee84478dc352Jens Axboe len = f->io_size; 3763baddf2450d811be658fb47ef883ee84478dc352Jens Axboe if (off == -1ULL) 3773baddf2450d811be658fb47ef883ee84478dc352Jens Axboe off = f->file_offset; 378ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe 3790d1cd207e409a36313784cb9596990c819775f77Jens Axboe if (len == -1ULL || off == -1ULL) 3800d1cd207e409a36313784cb9596990c819775f77Jens Axboe return 0; 3810d1cd207e409a36313784cb9596990c819775f77Jens Axboe 3823baddf2450d811be658fb47ef883ee84478dc352Jens Axboe dprint(FD_IO, "invalidate cache %s: %llu/%llu\n", f->file_name, off, 3833baddf2450d811be658fb47ef883ee84478dc352Jens Axboe len); 384b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe 385e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe /* 386e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe * FIXME: add blockdev flushing too 387e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe */ 388a1c58075279454a91ec43366846b93e8dcf9753cJens Axboe if (f->mmap_ptr) { 38903e20d687566753b90383571e5e152c5142bdffdBruce Cran ret = posix_madvise(f->mmap_ptr, f->mmap_sz, POSIX_MADV_DONTNEED); 390a1c58075279454a91ec43366846b93e8dcf9753cJens Axboe#ifdef FIO_MADV_FREE 3913e10fb832645e3ab3ef006f589f0459dc567cb53Jens Axboe if (f->filetype == FIO_TYPE_BD) 3923e10fb832645e3ab3ef006f589f0459dc567cb53Jens Axboe (void) posix_madvise(f->mmap_ptr, f->mmap_sz, FIO_MADV_FREE); 393a1c58075279454a91ec43366846b93e8dcf9753cJens Axboe#endif 394a1c58075279454a91ec43366846b93e8dcf9753cJens Axboe } else if (f->filetype == FIO_TYPE_FILE) { 395ecc314ba7c5f02b7e90ac1dfbce1a74cd4e6d6feBruce Cran ret = posix_fadvise(f->fd, off, len, POSIX_FADV_DONTNEED); 3965ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe } else if (f->filetype == FIO_TYPE_BD) { 397ecc314ba7c5f02b7e90ac1dfbce1a74cd4e6d6feBruce Cran ret = blockdev_invalidate_cache(f); 3987e0e25c924d51f23196b3e0ea83b79178fc46823Jens Axboe if (ret < 0 && errno == EACCES && geteuid()) { 3997172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboe if (!root_warn) { 4005ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe log_err("fio: only root may flush block " 4015ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe "devices. Cache flush bypassed!\n"); 4027172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboe root_warn = 1; 4037172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboe } 4047e0e25c924d51f23196b3e0ea83b79178fc46823Jens Axboe ret = 0; 4057e0e25c924d51f23196b3e0ea83b79178fc46823Jens Axboe } 406b5605e9ded4188ed91faae1a43ecd333a9856f62Jens Axboe } else if (f->filetype == FIO_TYPE_CHAR || f->filetype == FIO_TYPE_PIPE) 407e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe ret = 0; 408e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe 409e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe if (ret < 0) { 410e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe td_verror(td, errno, "invalidate_cache"); 411e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe return 1; 4123baddf2450d811be658fb47ef883ee84478dc352Jens Axboe } else if (ret > 0) { 4133baddf2450d811be658fb47ef883ee84478dc352Jens Axboe td_verror(td, ret, "invalidate_cache"); 4143baddf2450d811be658fb47ef883ee84478dc352Jens Axboe return 1; 415e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe } 416e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe 417ad2da605a62faf16887970618b434db19594e17bJens Axboe return ret; 4183baddf2450d811be658fb47ef883ee84478dc352Jens Axboe 4193baddf2450d811be658fb47ef883ee84478dc352Jens Axboe} 4203baddf2450d811be658fb47ef883ee84478dc352Jens Axboe 4213baddf2450d811be658fb47ef883ee84478dc352Jens Axboeint file_invalidate_cache(struct thread_data *td, struct fio_file *f) 4223baddf2450d811be658fb47ef883ee84478dc352Jens Axboe{ 423d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe if (!fio_file_open(f)) 424a5fb461fdff86c442daeebbd28e07984be9f3807Jens Axboe return 0; 425a5fb461fdff86c442daeebbd28e07984be9f3807Jens Axboe 4265e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe return __file_invalidate_cache(td, f, -1ULL, -1ULL); 427e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe} 428e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe 4296977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboeint generic_close_file(struct thread_data fio_unused *td, struct fio_file *f) 43053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{ 4316977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe int ret = 0; 4326977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe 433ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe dprint(FD_FILE, "fd close %s\n", f->file_name); 4344906e0b57f2b8cbad02ef2428522281cf6038bddJens Axboe 4354906e0b57f2b8cbad02ef2428522281cf6038bddJens Axboe remove_file_hash(f); 4364906e0b57f2b8cbad02ef2428522281cf6038bddJens Axboe 4376977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe if (close(f->fd) < 0) 4386977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe ret = errno; 4396977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe 440b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe f->fd = -1; 441e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe 442e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe if (f->shadow_fd != -1) { 443e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe close(f->shadow_fd); 444e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe f->shadow_fd = -1; 445e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe } 446e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe 4476977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe return ret; 44853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe} 44953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 4501ccc6dc75b28ef70cd7a8c39ac8c1cb68c720a65Dmitry Monakhovint file_lookup_open(struct fio_file *f, int flags) 45153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{ 45229c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe struct fio_file *__f; 4534d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe int from_hash; 4544d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe 4554d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe __f = lookup_file_hash(f->file_name); 4564d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe if (__f) { 4579efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe dprint(FD_FILE, "found file in hash %s\n", f->file_name); 4584d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe /* 4594d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe * racy, need the __f->lock locked 4604d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe */ 4614d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe f->lock = __f->lock; 4624d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe from_hash = 1; 4634d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe } else { 4649efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe dprint(FD_FILE, "file not found in hash %s\n", f->file_name); 4654d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe from_hash = 0; 4664d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe } 4674d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe 468e8670ef8b26039573fbf835b4b95ba45a1039d83Jens Axboe f->fd = open(f->file_name, flags, 0600); 4694d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe return from_hash; 4704d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe} 4714d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe 472e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboestatic int file_close_shadow_fds(struct thread_data *td) 473e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe{ 474e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe struct fio_file *f; 475e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe int num_closed = 0; 476e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe unsigned int i; 477e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe 478e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe for_each_file(td, f, i) { 479e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe if (f->shadow_fd == -1) 480e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe continue; 481e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe 482e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe close(f->shadow_fd); 483e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe f->shadow_fd = -1; 484e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe num_closed++; 485e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe } 486e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe 487e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe return num_closed; 488e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe} 489e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe 4904d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboeint generic_open_file(struct thread_data *td, struct fio_file *f) 4914d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe{ 492661598287ecc3b8987f312cf8403936552ce686aJens Axboe int is_std = 0; 49353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe int flags = 0; 49429c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe int from_hash = 0; 49553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 496ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe dprint(FD_FILE, "fd open %s\n", f->file_name); 497ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe 4986eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li if (td_trim(td) && f->filetype != FIO_TYPE_BD) { 4996eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li log_err("fio: trim only applies to block device\n"); 5006eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li return 1; 5016eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li } 5026eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li 503661598287ecc3b8987f312cf8403936552ce686aJens Axboe if (!strcmp(f->file_name, "-")) { 504661598287ecc3b8987f312cf8403936552ce686aJens Axboe if (td_rw(td)) { 505661598287ecc3b8987f312cf8403936552ce686aJens Axboe log_err("fio: can't read/write to stdin/out\n"); 506661598287ecc3b8987f312cf8403936552ce686aJens Axboe return 1; 507661598287ecc3b8987f312cf8403936552ce686aJens Axboe } 508661598287ecc3b8987f312cf8403936552ce686aJens Axboe is_std = 1; 509ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe 510ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe /* 511ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe * move output logging to stderr, if we are writing to stdout 512ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe */ 513ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe if (td_write(td)) 514ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe f_out = stderr; 515661598287ecc3b8987f312cf8403936552ce686aJens Axboe } 516661598287ecc3b8987f312cf8403936552ce686aJens Axboe 5176eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li if (td_trim(td)) 5186eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li goto skip_flags; 5192dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe if (td->o.odirect) 5202fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe flags |= OS_O_DIRECT; 5212dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe if (td->o.sync_io) 5222fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe flags |= O_SYNC; 523814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe if (td->o.create_on_open) 524814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe flags |= O_CREAT; 5256eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Liskip_flags: 5266eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li if (f->filetype != FIO_TYPE_FILE) 5276eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li flags |= FIO_O_NOATIME; 52853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 529056f3459149a7670257350d84b49858718e4a0e6Aaron Carrollopen_again: 530660a1cb5fb9843ec09a04337714e78d63cd557e7Jens Axboe if (td_write(td)) { 531173081581f94dc4f9f203eb7a7922fc843bfafdeJens Axboe if (!read_only) 532173081581f94dc4f9f203eb7a7922fc843bfafdeJens Axboe flags |= O_RDWR; 53353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 534af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe if (f->filetype == FIO_TYPE_FILE) 5352fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe flags |= O_CREAT; 5362fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe 537661598287ecc3b8987f312cf8403936552ce686aJens Axboe if (is_std) 538661598287ecc3b8987f312cf8403936552ce686aJens Axboe f->fd = dup(STDOUT_FILENO); 5394d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe else 5404d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe from_hash = file_lookup_open(f, flags); 5416eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li } else if (td_read(td)) { 5424241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe if (f->filetype == FIO_TYPE_CHAR && !read_only) 5432fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe flags |= O_RDWR; 5442fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe else 5452fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe flags |= O_RDONLY; 5462fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe 547661598287ecc3b8987f312cf8403936552ce686aJens Axboe if (is_std) 548661598287ecc3b8987f312cf8403936552ce686aJens Axboe f->fd = dup(STDIN_FILENO); 5494d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe else 5504d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe from_hash = file_lookup_open(f, flags); 5516eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li } else { //td trim 5526eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li flags |= O_RDWR; 5536eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li from_hash = file_lookup_open(f, flags); 55453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 55553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 55653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (f->fd == -1) { 557e4e33258637e55550a0fac59eb3350e8bf06f8e6Jens Axboe char buf[FIO_VERROR_SIZE]; 558e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe int __e = errno; 559e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe 560835d9b9ed0e5c2591b8a3eacbd5f4ab6bdab466cJens Axboe if (__e == EPERM && (flags & FIO_O_NOATIME)) { 5615921e80c5dfc9f96d2f21da6ae58f2b5d3a0b373Jens Axboe flags &= ~FIO_O_NOATIME; 562056f3459149a7670257350d84b49858718e4a0e6Aaron Carroll goto open_again; 563056f3459149a7670257350d84b49858718e4a0e6Aaron Carroll } 564e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe if (__e == EMFILE && file_close_shadow_fds(td)) 565e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe goto open_again; 566056f3459149a7670257350d84b49858718e4a0e6Aaron Carroll 56798ffb8f3ecebed9984d1744f142eb8be10c14dbdKen Raeburn snprintf(buf, sizeof(buf), "open(%s)", f->file_name); 568e4e33258637e55550a0fac59eb3350e8bf06f8e6Jens Axboe 569a93c5f049da63a60f9962177d8ada50094d234deJens Axboe if (__e == EINVAL && (flags & OS_O_DIRECT)) { 570a93c5f049da63a60f9962177d8ada50094d234deJens Axboe log_err("fio: looks like your file system does not " \ 571a93c5f049da63a60f9962177d8ada50094d234deJens Axboe "support direct=1/buffered=0\n"); 572a93c5f049da63a60f9962177d8ada50094d234deJens Axboe } 573a93c5f049da63a60f9962177d8ada50094d234deJens Axboe 574e4e33258637e55550a0fac59eb3350e8bf06f8e6Jens Axboe td_verror(td, __e, buf); 57553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 57653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 57729c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe if (!from_hash && f->fd != -1) { 57829c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe if (add_file_hash(f)) { 5793f0ca9b914e6d0db8c5c457713c277ce458cbc02Jens Axboe int fio_unused ret; 58029c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe 58129c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe /* 582e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe * Stash away descriptor for later close. This is to 583e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe * work-around a "feature" on Linux, where a close of 584e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe * an fd that has been opened for write will trigger 585e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe * udev to call blkid to check partitions, fs id, etc. 586e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe * That polutes the device cache, which can slow down 587e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe * unbuffered accesses. 58829c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe */ 589e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe if (f->shadow_fd == -1) 590e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe f->shadow_fd = f->fd; 591e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe else { 592e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe /* 593e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe * OK to ignore, we haven't done anything 594e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe * with it 595e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe */ 596e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe ret = generic_close_file(td, f); 597e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe } 59829c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe goto open_again; 59929c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe } 60029c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe } 6014906e0b57f2b8cbad02ef2428522281cf6038bddJens Axboe 60253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 0; 603b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe} 604b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe 605df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboeint generic_get_file_size(struct thread_data *td, struct fio_file *f) 60621972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe{ 607df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe return get_file_size(td, f); 60821972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe} 60921972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe 6107bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe/* 6117bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * open/close all files, so that ->real_file_size gets set 6127bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */ 613bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboestatic int get_file_sizes(struct thread_data *td) 6147bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe{ 6157bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe struct fio_file *f; 6167bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe unsigned int i; 617bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe int err = 0; 6187bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 6197bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe for_each_file(td, f, i) { 6205ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe dprint(FD_FILE, "get file size for %p/%d/%p\n", f, i, 6215ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe f->file_name); 6229efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe 62399a47c6905731e53dd4d8f7ea6501f36d9329e7bJens Axboe if (td_io_get_file_size(td, f)) { 62440b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe if (td->error != ENOENT) { 62540b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe log_err("%s\n", td->verror); 62640b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe err = 1; 62740b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe } 628541d66d70b8fbe9860b31307c0760e6d5f4c78a8Jens Axboe clear_error(td); 62907eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe } 630409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe 631409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe if (f->real_file_size == -1ULL && td->o.size) 632409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe f->real_file_size = td->o.size / td->o.nr_files; 6337bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } 634bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe 635bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe return err; 6367bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe} 6377bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 6382e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboestruct fio_mount { 6392e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe struct flist_head list; 6402e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe const char *base; 6412e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe char __base[256]; 6422e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe unsigned int key; 6432e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe}; 6442e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 6452e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe/* 6462e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe * Get free number of bytes for each file on each unique mount. 6472e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe */ 6482e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboestatic unsigned long long get_fs_free_counts(struct thread_data *td) 6492e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe{ 6502e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe struct flist_head *n, *tmp; 65168b0316f581c3c881d7dbf7c9dafef4a10100a66Jens Axboe unsigned long long ret = 0; 6522e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe struct fio_mount *fm; 6532e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe FLIST_HEAD(list); 6542e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe struct fio_file *f; 6552e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe unsigned int i; 6562e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 6572e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe for_each_file(td, f, i) { 6582e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe struct stat sb; 6592e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe char buf[256]; 6602e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 6614ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe if (f->filetype == FIO_TYPE_BD || f->filetype == FIO_TYPE_CHAR) { 6624ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe if (f->real_file_size != -1ULL) 6634ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe ret += f->real_file_size; 66468b0316f581c3c881d7dbf7c9dafef4a10100a66Jens Axboe continue; 66568b0316f581c3c881d7dbf7c9dafef4a10100a66Jens Axboe } else if (f->filetype != FIO_TYPE_FILE) 66668b0316f581c3c881d7dbf7c9dafef4a10100a66Jens Axboe continue; 66768b0316f581c3c881d7dbf7c9dafef4a10100a66Jens Axboe 6682e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe strcpy(buf, f->file_name); 6692e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 6702e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe if (stat(buf, &sb) < 0) { 6712e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe if (errno != ENOENT) 6722e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe break; 6732e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe strcpy(buf, "."); 6742e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe if (stat(buf, &sb) < 0) 6752e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe break; 6762e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe } 6772e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 6782e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe fm = NULL; 6792e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe flist_for_each(n, &list) { 6802e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe fm = flist_entry(n, struct fio_mount, list); 6812e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe if (fm->key == sb.st_dev) 6822e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe break; 6832e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 6842e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe fm = NULL; 6852e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe } 6862e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 6872e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe if (fm) 6882e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe continue; 6892e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 6902e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe fm = malloc(sizeof(*fm)); 6912e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe strcpy(fm->__base, buf); 6922e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe fm->base = basename(fm->__base); 6932e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe fm->key = sb.st_dev; 6942e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe flist_add(&fm->list, &list); 6952e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe } 6962e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 6972e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe flist_for_each_safe(n, tmp, &list) { 6982e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe unsigned long long sz; 6992e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 7002e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe fm = flist_entry(n, struct fio_mount, list); 7012e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe flist_del(&fm->list); 7022e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 7032e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe sz = get_fs_size(fm->base); 7042e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe if (sz && sz != -1ULL) 7052e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe ret += sz; 7062e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 7072e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe free(fm); 7082e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe } 7092e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 7102e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe return ret; 7112e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe} 7122e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 713293b8c1f23bbe4c735cd00fbb7cca1121bf18016Jens Axboeuint64_t get_start_offset(struct thread_data *td) 714ce95d651568bd5494e4c4ddc95832715c6760d56Dan Ehrenberg{ 715ce95d651568bd5494e4c4ddc95832715c6760d56Dan Ehrenberg return td->o.start_offset + 716ce95d651568bd5494e4c4ddc95832715c6760d56Dan Ehrenberg (td->thread_number - 1) * td->o.offset_increment; 717ce95d651568bd5494e4c4ddc95832715c6760d56Dan Ehrenberg} 718ce95d651568bd5494e4c4ddc95832715c6760d56Dan Ehrenberg 7197bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe/* 7207bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * Open the files and setup files sizes, creating files if necessary. 7217bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */ 72253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboeint setup_files(struct thread_data *td) 72353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{ 7247bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe unsigned long long total_size, extend_size; 725de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe struct thread_options *o = &td->o; 72653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe struct fio_file *f; 727af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe unsigned int i; 728000b080395e45cbe0ce54e75f0e993addbdc8676Jens Axboe int err = 0, need_extend; 729e90391eb56d81a2cc175c50caf6b4e5abbdb6142Jens Axboe int old_state; 73053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 731ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe dprint(FD_FILE, "setup files\n"); 732ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe 733e90391eb56d81a2cc175c50caf6b4e5abbdb6142Jens Axboe old_state = td->runstate; 734e90391eb56d81a2cc175c50caf6b4e5abbdb6142Jens Axboe td_set_runstate(td, TD_SETTING_UP); 735e90391eb56d81a2cc175c50caf6b4e5abbdb6142Jens Axboe 736de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe if (o->read_iolog_file) 73725460cf6350fb90b8a7943bb649a51d81bac13a4Jens Axboe goto done; 738691c8fb014da9dd82e999a90b5511423f4eee188Jens Axboe 73953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe /* 74053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe * if ioengine defines a setup() method, it's responsible for 7417bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * opening the files and setting f->real_file_size to indicate 7427bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * the valid range for that file. 74353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe */ 74453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (td->io_ops->setup) 7457bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe err = td->io_ops->setup(td); 7467bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe else 747bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe err = get_file_sizes(td); 74853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 749f102706350093e60617cc271b128e56c57ab3ce7Jens Axboe if (err) 750e90391eb56d81a2cc175c50caf6b4e5abbdb6142Jens Axboe goto err_out; 751f102706350093e60617cc271b128e56c57ab3ce7Jens Axboe 7520a7eb121ecb2e4279e9eb8178aa1e554dda40191Jens Axboe /* 7537bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * check sizes. if the files/devices do not exist and the size 7547bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * isn't passed to fio, abort. 7550a7eb121ecb2e4279e9eb8178aa1e554dda40191Jens Axboe */ 7567bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe total_size = 0; 7577bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe for_each_file(td, f, i) { 7587bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (f->real_file_size == -1ULL) 7597bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe total_size = -1ULL; 7607bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe else 7617bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe total_size += f->real_file_size; 7627bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } 7630a7eb121ecb2e4279e9eb8178aa1e554dda40191Jens Axboe 764de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe if (o->fill_device) 7652e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe td->fill_device_size = get_fs_free_counts(td); 7662e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 7677bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe /* 7687bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * device/file sizes are zero and no size given, punt 7697bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */ 770de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe if ((!total_size || total_size == -1ULL) && !o->size && 771de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe !(td->io_ops->flags & FIO_NOIO) && !o->fill_device && 772de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe !(o->nr_files && (o->file_size_low || o->file_size_high))) { 773de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe log_err("%s: you need to specify size=\n", o->name); 774e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe td_verror(td, EINVAL, "total_file_size"); 775e90391eb56d81a2cc175c50caf6b4e5abbdb6142Jens Axboe goto err_out; 77653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 77753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 7787bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe /* 7797bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * now file sizes are known, so we can set ->io_size. if size= is 7807bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * not given, ->io_size is just equal to ->real_file_size. if size 7817bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * is given, ->io_size is size / nr_files. 7827bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */ 7837bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe extend_size = total_size = 0; 7847bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe need_extend = 0; 7857bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe for_each_file(td, f, i) { 786ce95d651568bd5494e4c4ddc95832715c6760d56Dan Ehrenberg f->file_offset = get_start_offset(td); 787bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang 788de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe if (!o->file_size_low) { 7897bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe /* 7907bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * no file size range given, file size is equal to 7917bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * total size divided by number of files. if that is 7927bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * zero, set it to the real file size. 7937bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */ 794de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe f->io_size = o->size / o->nr_files; 79565bdb10a09222d8b5d213de74824be775772ea8fJens Axboe if (!f->io_size) 796273f8c912d981439049d9b21aa048aaeaa323c5dJens Axboe f->io_size = f->real_file_size - f->file_offset; 797de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe } else if (f->real_file_size < o->file_size_low || 798de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe f->real_file_size > o->file_size_high) { 799de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe if (f->file_offset > o->file_size_low) 800bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang goto err_offset; 8017bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe /* 8027bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * file size given. if it's fixed, use that. if it's a 8037bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * range, generate a random size in-between. 8047bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */ 805de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe if (o->file_size_low == o->file_size_high) 806de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe f->io_size = o->file_size_low - f->file_offset; 807de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe else { 8085ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe f->io_size = get_rand_file_size(td) 8095ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe - f->file_offset; 8105ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe } 81165bdb10a09222d8b5d213de74824be775772ea8fJens Axboe } else 812bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang f->io_size = f->real_file_size - f->file_offset; 81353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 8147bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (f->io_size == -1ULL) 8157bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe total_size = -1ULL; 8164d002569dc503474a53e824e3f72b10a09c9a2b5Shaohua Li else { 817de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe if (o->size_percent) 818de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe f->io_size = (f->io_size * o->size_percent) / 100; 8197bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe total_size += f->io_size; 8204d002569dc503474a53e824e3f72b10a09c9a2b5Shaohua Li } 8217bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 8227bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (f->filetype == FIO_TYPE_FILE && 823bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang (f->io_size + f->file_offset) > f->real_file_size && 8247bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe !(td->io_ops->flags & FIO_DISKLESSIO)) { 825de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe if (!o->create_on_open) { 826814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe need_extend++; 827814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe extend_size += (f->io_size + f->file_offset); 828814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe } else 829814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe f->real_file_size = f->io_size + f->file_offset; 830d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe fio_file_set_extend(f); 8315ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe } 8327bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } 83353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 834de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe if (!o->size || o->size > total_size) 835de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe o->size = total_size; 83621972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe 8377bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe /* 8387bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * See if we need to extend some files 8397bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */ 8407bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (need_extend) { 8417bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe temp_stall_ts = 1; 842f3afa57e36550288340f1b6c694f354ae72654b9Jens Axboe if (output_format == FIO_OUTPUT_NORMAL) 843a7ba8c5f4c0f9fe117d529c1ad6686b2070bae51Shaozhi Shawn Ye log_info("%s: Laying out IO file(s) (%u file(s) /" 844de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe " %lluMB)\n", o->name, need_extend, 845a7ba8c5f4c0f9fe117d529c1ad6686b2070bae51Shaozhi Shawn Ye extend_size >> 20); 8467bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 8477bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe for_each_file(td, f, i) { 8485e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe unsigned long long old_len = -1ULL, extend_len = -1ULL; 8493baddf2450d811be658fb47ef883ee84478dc352Jens Axboe 850d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe if (!fio_file_extend(f)) 8517bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe continue; 8527bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 853409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe assert(f->filetype == FIO_TYPE_FILE); 854d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe fio_file_clear_extend(f); 855de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe if (!o->fill_device) { 8565e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe old_len = f->real_file_size; 8570b9d69ecb14045cf3b2622ae922756b9889b25e6Jens Axboe extend_len = f->io_size + f->file_offset - 8580b9d69ecb14045cf3b2622ae922756b9889b25e6Jens Axboe old_len; 8595e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe } 860bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang f->real_file_size = (f->io_size + f->file_offset); 8617bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe err = extend_file(td, f); 8627bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (err) 8633baddf2450d811be658fb47ef883ee84478dc352Jens Axboe break; 8645e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe 8653baddf2450d811be658fb47ef883ee84478dc352Jens Axboe err = __file_invalidate_cache(td, f, old_len, 8663baddf2450d811be658fb47ef883ee84478dc352Jens Axboe extend_len); 8673baddf2450d811be658fb47ef883ee84478dc352Jens Axboe close(f->fd); 8683baddf2450d811be658fb47ef883ee84478dc352Jens Axboe f->fd = -1; 8693baddf2450d811be658fb47ef883ee84478dc352Jens Axboe if (err) 8707bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe break; 8717bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } 8727bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe temp_stall_ts = 0; 8737bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } 8747bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 8757bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (err) 876e90391eb56d81a2cc175c50caf6b4e5abbdb6142Jens Axboe goto err_out; 8777bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 878de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe if (!o->zone_size) 879de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe o->zone_size = o->size; 8807bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 881ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe /* 882ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe * iolog already set the total io size, if we read back 883ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe * stored entries. 884ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe */ 885de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe if (!o->read_iolog_file) 886de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe td->total_io_size = o->size * o->loops; 88725460cf6350fb90b8a7943bb649a51d81bac13a4Jens Axboe 88825460cf6350fb90b8a7943bb649a51d81bac13a4Jens Axboedone: 889de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe if (o->create_only) 89025460cf6350fb90b8a7943bb649a51d81bac13a4Jens Axboe td->done = 1; 89125460cf6350fb90b8a7943bb649a51d81bac13a4Jens Axboe 892e90391eb56d81a2cc175c50caf6b4e5abbdb6142Jens Axboe td_set_runstate(td, old_state); 8937bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe return 0; 894bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tangerr_offset: 895de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe log_err("%s: you need to specify valid offset=\n", o->name); 896e90391eb56d81a2cc175c50caf6b4e5abbdb6142Jens Axboeerr_out: 897e90391eb56d81a2cc175c50caf6b4e5abbdb6142Jens Axboe td_set_runstate(td, old_state); 898bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang return 1; 89953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe} 90053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 901afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanminint pre_read_files(struct thread_data *td) 902afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin{ 903afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin struct fio_file *f; 904afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin unsigned int i; 905afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin 906afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin dprint(FD_FILE, "pre_read files\n"); 907afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin 908afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin for_each_file(td, f, i) { 909afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin pre_read_file(td, f); 910afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin } 911afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin 912afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin return 1; 913afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin} 914afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin 9159c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboestatic int __init_rand_distribution(struct thread_data *td, struct fio_file *f) 9169c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe{ 9172316296a514711bb388d87b34742c04bb561d986Jens Axboe unsigned int range_size, seed; 9189c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe unsigned long nranges; 91921415db9f1689a5c47fda5e710879c4739707442Jens Axboe uint64_t file_size; 9209c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe 9219c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe range_size = min(td->o.min_bs[DDIR_READ], td->o.min_bs[DDIR_WRITE]); 92221415db9f1689a5c47fda5e710879c4739707442Jens Axboe file_size = min(f->real_file_size, f->io_size); 9239c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe 92421415db9f1689a5c47fda5e710879c4739707442Jens Axboe nranges = (file_size + range_size - 1) / range_size; 9259c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe 9262316296a514711bb388d87b34742c04bb561d986Jens Axboe seed = jhash(f->file_name, strlen(f->file_name), 0) * td->thread_number; 9278425687edef1b2961a17bd58341686f7b598cf28Jens Axboe if (!td->o.rand_repeatable) 9288425687edef1b2961a17bd58341686f7b598cf28Jens Axboe seed = td->rand_seeds[4]; 9298425687edef1b2961a17bd58341686f7b598cf28Jens Axboe 9309c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe if (td->o.random_distribution == FIO_RAND_DIST_ZIPF) 931888677a428eb6ae6b54195e99734d6d6b3ee55e7Jens Axboe zipf_init(&f->zipf, nranges, td->o.zipf_theta.u.f, seed); 9329c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe else 933888677a428eb6ae6b54195e99734d6d6b3ee55e7Jens Axboe pareto_init(&f->zipf, nranges, td->o.pareto_h.u.f, seed); 9349c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe 9359c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe return 1; 9369c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe} 9379c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe 9389c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboestatic int init_rand_distribution(struct thread_data *td) 9399c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe{ 9409c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe struct fio_file *f; 9419c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe unsigned int i; 9429c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe int state; 9439c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe 9449c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe if (td->o.random_distribution == FIO_RAND_DIST_RANDOM) 9459c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe return 0; 9469c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe 9479c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe state = td->runstate; 9489c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe td_set_runstate(td, TD_SETTING_UP); 9499c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe for_each_file(td, f, i) 9509c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe __init_rand_distribution(td, f); 9519c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe td_set_runstate(td, state); 9529c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe 9539c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe return 1; 9549c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe} 9559c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe 956687270767de17dbad53c50e03e5d73d52505405cJens Axboeint init_random_map(struct thread_data *td) 957687270767de17dbad53c50e03e5d73d52505405cJens Axboe{ 95851ede0b1e9c9b570b942b50b44d0455183a0d5ecJens Axboe unsigned long long blocks; 959687270767de17dbad53c50e03e5d73d52505405cJens Axboe struct fio_file *f; 960687270767de17dbad53c50e03e5d73d52505405cJens Axboe unsigned int i; 961687270767de17dbad53c50e03e5d73d52505405cJens Axboe 9629c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe if (init_rand_distribution(td)) 9639c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe return 0; 9643831a843c289ab6a42a19752733d0fca4250882aJens Axboe if (!td_random(td)) 965687270767de17dbad53c50e03e5d73d52505405cJens Axboe return 0; 966687270767de17dbad53c50e03e5d73d52505405cJens Axboe 967687270767de17dbad53c50e03e5d73d52505405cJens Axboe for_each_file(td, f, i) { 96838f30c81d8d194da047950cbbda3896bd35cd98cJens Axboe uint64_t file_size = min(f->real_file_size, f->io_size); 96938f30c81d8d194da047950cbbda3896bd35cd98cJens Axboe 97053737ae01ca65f88089d3b8639df7be5b2f7ef0eJens Axboe blocks = file_size / (unsigned long long) td->o.rw_min_bs; 97153737ae01ca65f88089d3b8639df7be5b2f7ef0eJens Axboe 9728055e41d0ecc54770a2653427532b3e2c5fabdadJens Axboe if (td->o.random_generator == FIO_RAND_GEN_LFSR) { 97382af46be1fa0c0e188bbb6723008fa33a510606fJens Axboe unsigned long seed; 97482af46be1fa0c0e188bbb6723008fa33a510606fJens Axboe 97582af46be1fa0c0e188bbb6723008fa33a510606fJens Axboe seed = td->rand_seeds[FIO_RAND_BLOCK_OFF]; 97682af46be1fa0c0e188bbb6723008fa33a510606fJens Axboe 977d474cbc9ba33448848b50cc697622a402e91e33eAlex Pyrgiotis if (!lfsr_init(&f->lfsr, blocks, seed, seed & 0xF)) 9788055e41d0ecc54770a2653427532b3e2c5fabdadJens Axboe continue; 9793831a843c289ab6a42a19752733d0fca4250882aJens Axboe } else if (!td->o.norandommap) { 9807ebd796f4e50c21d652e62bf1e112755b0f338a8Jens Axboe f->io_axmap = axmap_new(blocks); 9817ebd796f4e50c21d652e62bf1e112755b0f338a8Jens Axboe if (f->io_axmap) 9828055e41d0ecc54770a2653427532b3e2c5fabdadJens Axboe continue; 9831cad7121e8e6c59440ae43545be05fa302e4110dJens Axboe } else if (td->o.norandommap) 9841cad7121e8e6c59440ae43545be05fa302e4110dJens Axboe continue; 985ceadd59ef93421001530aa765d928e9e8c26b32eJens Axboe 9862b386d2569c9078ca9790c4e6d318ec3835b8739Jens Axboe if (!td->o.softrandommap) { 9875ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe log_err("fio: failed allocating random map. If running" 9885ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe " a large number of jobs, try the 'norandommap'" 9892b386d2569c9078ca9790c4e6d318ec3835b8739Jens Axboe " option or set 'softrandommap'. Or give" 9902b386d2569c9078ca9790c4e6d318ec3835b8739Jens Axboe " a larger --alloc-size to fio.\n"); 991687270767de17dbad53c50e03e5d73d52505405cJens Axboe return 1; 992687270767de17dbad53c50e03e5d73d52505405cJens Axboe } 993303032ae4e13c7ac10b8198c40df98d95a4524a6Jens Axboe 994303032ae4e13c7ac10b8198c40df98d95a4524a6Jens Axboe log_info("fio: file %s failed allocating random map. Running " 995303032ae4e13c7ac10b8198c40df98d95a4524a6Jens Axboe "job without.\n", f->file_name); 996687270767de17dbad53c50e03e5d73d52505405cJens Axboe } 997687270767de17dbad53c50e03e5d73d52505405cJens Axboe 998687270767de17dbad53c50e03e5d73d52505405cJens Axboe return 0; 999687270767de17dbad53c50e03e5d73d52505405cJens Axboe} 1000687270767de17dbad53c50e03e5d73d52505405cJens Axboe 100153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboevoid close_files(struct thread_data *td) 100253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{ 10030ab8db8943acc6b9ea778735563bfad2a79e8dddJens Axboe struct fio_file *f; 1004af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe unsigned int i; 100553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 10062be3eec330360e6735fb4e7d70907e11eaa346f8Jens Axboe for_each_file(td, f, i) { 10072be3eec330360e6735fb4e7d70907e11eaa346f8Jens Axboe if (fio_file_open(f)) 10082be3eec330360e6735fb4e7d70907e11eaa346f8Jens Axboe td_io_close_file(td, f); 10092be3eec330360e6735fb4e7d70907e11eaa346f8Jens Axboe } 101024ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe} 101124ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe 101224ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboevoid close_and_free_files(struct thread_data *td) 101324ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe{ 101424ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe struct fio_file *f; 101524ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe unsigned int i; 101624ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe 1017ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe dprint(FD_FILE, "close files\n"); 1018ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe 10190ab8db8943acc6b9ea778735563bfad2a79e8dddJens Axboe for_each_file(td, f, i) { 1020ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe if (td->o.unlink && f->filetype == FIO_TYPE_FILE) { 1021ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe dprint(FD_FILE, "free unlink %s\n", f->file_name); 1022132ad46d22bcf12da95ad69e03c1b6f23f5e60a9Jens Axboe unlink(f->file_name); 1023ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe } 1024bdb4e2e99d4a87e5d3677cc09aa1ce92135125a9Jens Axboe 102522a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe if (fio_file_open(f)) 102622a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe td_io_close_file(td, f); 102722a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe 1028b9fbcf2104ab79127825e0c23ba0a147ec076087Shaozhi Shawn Ye remove_file_hash(f); 1029b3dc7f075b85e004f8c681ebb8566475017696f3Jens Axboe 1030f17c43928c202e557f2f325272c60d9050ee528eJens Axboe sfree(f->file_name); 1031fa1da8653e2177b3cc31a91e963c389f079d4172Jens Axboe f->file_name = NULL; 10327ebd796f4e50c21d652e62bf1e112755b0f338a8Jens Axboe axmap_free(f->io_axmap); 10337ebd796f4e50c21d652e62bf1e112755b0f338a8Jens Axboe f->io_axmap = NULL; 103478d99e6a2695d3a7936c5dd02f996f13a30309b1Jens Axboe sfree(f); 103553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 1036b4a6a59a939f0e6554632de311e7d1d1b7633ccfJens Axboe 10372dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe td->o.filename = NULL; 1038cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe free(td->files); 1039d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe free(td->file_locks); 10409efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe td->files_index = 0; 1041b4a6a59a939f0e6554632de311e7d1d1b7633ccfJens Axboe td->files = NULL; 1042d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe td->file_locks = NULL; 10432dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe td->o.nr_files = 0; 104453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe} 1045af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe 1046e3bab463d4397e3378d8c7437e31de8aaf861a4fJens Axboestatic void get_file_type(struct fio_file *f) 1047af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe{ 1048af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe struct stat sb; 1049af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe 1050661598287ecc3b8987f312cf8403936552ce686aJens Axboe if (!strcmp(f->file_name, "-")) 1051661598287ecc3b8987f312cf8403936552ce686aJens Axboe f->filetype = FIO_TYPE_PIPE; 1052661598287ecc3b8987f312cf8403936552ce686aJens Axboe else 1053661598287ecc3b8987f312cf8403936552ce686aJens Axboe f->filetype = FIO_TYPE_FILE; 1054af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe 10553892182aff21486d9c38a346fe8681c9098ecb0cBruce Cran /* \\.\ is the device namespace in Windows, where every file is 10563892182aff21486d9c38a346fe8681c9098ecb0cBruce Cran * a block device */ 10573892182aff21486d9c38a346fe8681c9098ecb0cBruce Cran if (strncmp(f->file_name, "\\\\.\\", 4) == 0) 10583892182aff21486d9c38a346fe8681c9098ecb0cBruce Cran f->filetype = FIO_TYPE_BD; 10593892182aff21486d9c38a346fe8681c9098ecb0cBruce Cran 1060b30d395ec288508f9c787af11d0f52e9df26e39fJens Axboe if (!stat(f->file_name, &sb)) { 10613892182aff21486d9c38a346fe8681c9098ecb0cBruce Cran if (S_ISBLK(sb.st_mode)) 1062af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe f->filetype = FIO_TYPE_BD; 1063af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe else if (S_ISCHR(sb.st_mode)) 1064af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe f->filetype = FIO_TYPE_CHAR; 1065b5605e9ded4188ed91faae1a43ecd333a9856f62Jens Axboe else if (S_ISFIFO(sb.st_mode)) 1066b5605e9ded4188ed91faae1a43ecd333a9856f62Jens Axboe f->filetype = FIO_TYPE_PIPE; 1067af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe } 1068af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe} 1069af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe 1070f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboeint add_file(struct thread_data *td, const char *fname) 1071af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe{ 10727b4e4fe5e6fa26f82f9169c18ec70c08d0805ca9Jens Axboe int cur_files = td->files_index; 1073bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe char file_name[PATH_MAX]; 1074af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe struct fio_file *f; 1075bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe int len = 0; 1076af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe 1077ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe dprint(FD_FILE, "add file %s\n", fname); 1078ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe 1079f17c43928c202e557f2f325272c60d9050ee528eJens Axboe f = smalloc(sizeof(*f)); 1080c48c0be79173897824d8f439c39374f2588931dcJens Axboe if (!f) { 1081c48c0be79173897824d8f439c39374f2588931dcJens Axboe log_err("fio: smalloc OOM\n"); 1082c48c0be79173897824d8f439c39374f2588931dcJens Axboe assert(0); 1083c48c0be79173897824d8f439c39374f2588931dcJens Axboe } 10840b9d69ecb14045cf3b2622ae922756b9889b25e6Jens Axboe 1085af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe f->fd = -1; 1086e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe f->shadow_fd = -1; 108733c48814e08cf961801bf37f759da2748eb3431bJens Axboe fio_file_reset(td, f); 1088bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe 1089fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe if (td->files_size <= td->files_index) { 10901983e3271c20a5dca84ac1ad872e44dd9e62e6b8Jianpeng Ma unsigned int new_size = td->o.nr_files + 1; 1091126d65c6fc97d6acdc568aa5a969c012018daf15Jens Axboe 1092fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe dprint(FD_FILE, "resize file array to %d files\n", new_size); 1093fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe 1094fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe td->files = realloc(td->files, new_size * sizeof(f)); 1095d537c08b0eacdeb05835ee8c5f269b872239713aJianpeng Ma if (td->files == NULL) { 1096d537c08b0eacdeb05835ee8c5f269b872239713aJianpeng Ma log_err("fio: realloc OOM\n"); 1097d537c08b0eacdeb05835ee8c5f269b872239713aJianpeng Ma assert(0); 1098d537c08b0eacdeb05835ee8c5f269b872239713aJianpeng Ma } 1099d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe if (td->o.file_lock_mode != FILE_LOCK_NONE) { 1100d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe td->file_locks = realloc(td->file_locks, new_size); 1101d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe if (!td->file_locks) { 1102d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe log_err("fio: realloc OOM\n"); 1103d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe assert(0); 1104d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe } 1105d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe td->file_locks[cur_files] = FILE_LOCK_NONE; 1106d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe } 1107fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe td->files_size = new_size; 1108fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe } 11098bb7679e73d3086a01b9d21a650b0d7a859412b6Jens Axboe td->files[cur_files] = f; 111089ac1d48971578ccb0645c292d4a058340aeb909Shaohua Li f->fileno = cur_files; 1111126d65c6fc97d6acdc568aa5a969c012018daf15Jens Axboe 111207eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe /* 111307eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe * init function, io engine may not be loaded yet 111407eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe */ 111507eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe if (td->io_ops && (td->io_ops->flags & FIO_DISKLESSIO)) 111607eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe f->real_file_size = -1ULL; 111707eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe 1118bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe if (td->o.directory) 1119bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe len = sprintf(file_name, "%s/", td->o.directory); 1120bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe 1121bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe sprintf(file_name + len, "%s", fname); 1122f17c43928c202e557f2f325272c60d9050ee528eJens Axboe f->file_name = smalloc_strdup(file_name); 1123c48c0be79173897824d8f439c39374f2588931dcJens Axboe if (!f->file_name) { 1124c48c0be79173897824d8f439c39374f2588931dcJens Axboe log_err("fio: smalloc OOM\n"); 1125c48c0be79173897824d8f439c39374f2588931dcJens Axboe assert(0); 1126c48c0be79173897824d8f439c39374f2588931dcJens Axboe } 11270b9d69ecb14045cf3b2622ae922756b9889b25e6Jens Axboe 1128e3bab463d4397e3378d8c7437e31de8aaf861a4fJens Axboe get_file_type(f); 1129af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe 11304d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe switch (td->o.file_lock_mode) { 11314d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe case FILE_LOCK_NONE: 11324d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe break; 11334d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe case FILE_LOCK_READWRITE: 1134d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe f->rwlock = fio_rwlock_init(); 11354d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe break; 11364d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe case FILE_LOCK_EXCLUSIVE: 1137521da527743088a9bd2ab882f8b64799d49d5848Jens Axboe f->lock = fio_mutex_init(FIO_MUTEX_UNLOCKED); 11384d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe break; 11394d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe default: 11404d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe log_err("fio: unknown lock mode: %d\n", td->o.file_lock_mode); 11414d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe assert(0); 11424d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe } 114329c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe 11447b4e4fe5e6fa26f82f9169c18ec70c08d0805ca9Jens Axboe td->files_index++; 11451549441cdfecb2c1a4a8b8d494253859d67b4344Jens Axboe if (f->filetype == FIO_TYPE_FILE) 11461549441cdfecb2c1a4a8b8d494253859d67b4344Jens Axboe td->nr_normal_files++; 1147f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe 11485ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe dprint(FD_FILE, "file %p \"%s\" added at %d\n", f, f->file_name, 11495ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe cur_files); 11509efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe 1151f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe return cur_files; 1152af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe} 11530ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe 115449ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboeint add_file_exclusive(struct thread_data *td, const char *fname) 115549ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe{ 115649ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe struct fio_file *f; 115749ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe unsigned int i; 115849ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe 115949ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe for_each_file(td, f, i) { 116049ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe if (!strcmp(f->file_name, fname)) 116149ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe return i; 116249ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe } 116349ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe 116449ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe return add_file(td, fname); 116549ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe} 116649ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe 11670ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboevoid get_file(struct fio_file *f) 11680ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe{ 11698172fe972f3a79d42f34d7f6e259ed3f7f800316Jens Axboe dprint(FD_FILE, "get file %s, ref=%d\n", f->file_name, f->references); 1170d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe assert(fio_file_open(f)); 11710ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe f->references++; 11720ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe} 11730ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe 11746977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboeint put_file(struct thread_data *td, struct fio_file *f) 11750ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe{ 117698e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe int f_ret = 0, ret = 0; 11776977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe 11788172fe972f3a79d42f34d7f6e259ed3f7f800316Jens Axboe dprint(FD_FILE, "put file %s, ref=%d\n", f->file_name, f->references); 1179ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe 118022a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe if (!fio_file_open(f)) { 118122a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe assert(f->fd == -1); 11826977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe return 0; 118322a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe } 11840ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe 11850ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe assert(f->references); 11860ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe if (--f->references) 11876977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe return 0; 11880ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe 1189d424d4dd657eaf4aeb8ffb07a550a5f64940f41aJens Axboe if (should_fsync(td) && td->o.fsync_on_close) 119098e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe f_ret = fsync(f->fd); 1191ebb1415f729c123b8a13bcbd667bf4b4cc95b4d4Jens Axboe 11920ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe if (td->io_ops->close_file) 11936977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe ret = td->io_ops->close_file(td, f); 11941020a139beff50faf1bb18f761b024b664a09e14Jens Axboe 119598e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe if (!ret) 1196a5fb461fdff86c442daeebbd28e07984be9f3807Jens Axboe ret = f_ret; 119798e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe 11980ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe td->nr_open_files--; 1199d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe fio_file_clear_open(f); 120022a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe assert(f->fd == -1); 12016977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe return ret; 12020ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe} 1203bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 12044d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboevoid lock_file(struct thread_data *td, struct fio_file *f, enum fio_ddir ddir) 1205b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe{ 12064d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe if (!f->lock || td->o.file_lock_mode == FILE_LOCK_NONE) 12074d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe return; 120829c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe 12094d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe if (td->o.file_lock_mode == FILE_LOCK_READWRITE) { 12104d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe if (ddir == DDIR_READ) 1211d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe fio_rwlock_read(f->rwlock); 12124d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe else 1213d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe fio_rwlock_write(f->rwlock); 12144d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe } else if (td->o.file_lock_mode == FILE_LOCK_EXCLUSIVE) 12154d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe fio_mutex_down(f->lock); 12164d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe 1217d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe td->file_locks[f->fileno] = td->o.file_lock_mode; 1218b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe} 1219b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe 12204d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboevoid unlock_file(struct thread_data *td, struct fio_file *f) 1221b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe{ 12224d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe if (!f->lock || td->o.file_lock_mode == FILE_LOCK_NONE) 12234d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe return; 12244d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe 1225d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe if (td->o.file_lock_mode == FILE_LOCK_READWRITE) 1226d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe fio_rwlock_unlock(f->rwlock); 1227d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe else if (td->o.file_lock_mode == FILE_LOCK_EXCLUSIVE) 12284d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe fio_mutex_up(f->lock); 1229d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe 1230d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe td->file_locks[f->fileno] = FILE_LOCK_NONE; 1231b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe} 1232b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe 12334d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboevoid unlock_file_all(struct thread_data *td, struct fio_file *f) 12344d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe{ 1235d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe if (td->file_locks[f->fileno] != FILE_LOCK_NONE) 1236d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe unlock_file(td, f); 12374d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe} 12384d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe 1239bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboestatic int recurse_dir(struct thread_data *td, const char *dirname) 1240bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe{ 1241bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe struct dirent *dir; 1242bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe int ret = 0; 1243bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe DIR *D; 1244bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 1245bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe D = opendir(dirname); 1246bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe if (!D) { 12470ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe char buf[FIO_VERROR_SIZE]; 12480ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe 124998ffb8f3ecebed9984d1744f142eb8be10c14dbdKen Raeburn snprintf(buf, FIO_VERROR_SIZE, "opendir(%s)", dirname); 12500ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe td_verror(td, errno, buf); 1251bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe return 1; 1252bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe } 1253bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 1254bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe while ((dir = readdir(D)) != NULL) { 1255bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe char full_path[PATH_MAX]; 1256bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe struct stat sb; 1257bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 1258e85b2b83e39b64ba5cb73fbfddbf3902b6e84925Jens Axboe if (!strcmp(dir->d_name, ".") || !strcmp(dir->d_name, "..")) 1259e85b2b83e39b64ba5cb73fbfddbf3902b6e84925Jens Axboe continue; 126096d32d518a0743a6c050057bc1562e4883e51c5dJens Axboe 1261b9fd788f0e8adacc33316107594e9eb0463743d7Bruce Cran sprintf(full_path, "%s%s%s", dirname, FIO_OS_PATH_SEPARATOR, dir->d_name); 1262bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 1263bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe if (lstat(full_path, &sb) == -1) { 1264bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe if (errno != ENOENT) { 1265bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe td_verror(td, errno, "stat"); 1266bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe return 1; 1267bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe } 1268bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe } 1269bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 1270bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe if (S_ISREG(sb.st_mode)) { 1271bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe add_file(td, full_path); 12722dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe td->o.nr_files++; 1273bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe continue; 1274bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe } 12750ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe if (!S_ISDIR(sb.st_mode)) 12760ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe continue; 1277bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 12785ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe ret = recurse_dir(td, full_path); 12795ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe if (ret) 1280bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe break; 1281bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe } 1282bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 1283bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe closedir(D); 1284bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe return ret; 1285bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe} 1286bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 1287bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboeint add_dir_files(struct thread_data *td, const char *path) 1288bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe{ 12890ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe int ret = recurse_dir(td, path); 12900ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe 12910ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe if (!ret) 12920ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe log_info("fio: opendir added %d files\n", td->o.nr_files); 12930ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe 12940ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe return ret; 1295bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe} 1296cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe 1297cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboevoid dup_files(struct thread_data *td, struct thread_data *org) 1298cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe{ 1299cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe struct fio_file *f; 1300cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe unsigned int i; 13019efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe 13029efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe dprint(FD_FILE, "dup files: %d\n", org->files_index); 1303cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe 1304cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe if (!org->files) 1305cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe return; 1306cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe 13079efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe td->files = malloc(org->files_index * sizeof(f)); 1308cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe 1309d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe if (td->o.file_lock_mode != FILE_LOCK_NONE) 1310d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe td->file_locks = malloc(org->files_index); 1311d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe 13129efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe for_each_file(org, f, i) { 1313b0fe421a6a0487ff71f6f903908f666d9ca1b327Jens Axboe struct fio_file *__f; 1314b0fe421a6a0487ff71f6f903908f666d9ca1b327Jens Axboe 1315f17c43928c202e557f2f325272c60d9050ee528eJens Axboe __f = smalloc(sizeof(*__f)); 1316c48c0be79173897824d8f439c39374f2588931dcJens Axboe if (!__f) { 1317c48c0be79173897824d8f439c39374f2588931dcJens Axboe log_err("fio: smalloc OOM\n"); 1318c48c0be79173897824d8f439c39374f2588931dcJens Axboe assert(0); 1319c48c0be79173897824d8f439c39374f2588931dcJens Axboe } 132022a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe __f->fd = -1; 132133c48814e08cf961801bf37f759da2748eb3431bJens Axboe fio_file_reset(td, __f); 13220b9d69ecb14045cf3b2622ae922756b9889b25e6Jens Axboe 1323bc3456fa06cc7777c4764da8c7b1c0fd0a3c3772Aaron Carroll if (f->file_name) { 1324f17c43928c202e557f2f325272c60d9050ee528eJens Axboe __f->file_name = smalloc_strdup(f->file_name); 1325c48c0be79173897824d8f439c39374f2588931dcJens Axboe if (!__f->file_name) { 1326c48c0be79173897824d8f439c39374f2588931dcJens Axboe log_err("fio: smalloc OOM\n"); 1327c48c0be79173897824d8f439c39374f2588931dcJens Axboe assert(0); 1328c48c0be79173897824d8f439c39374f2588931dcJens Axboe } 13290b9d69ecb14045cf3b2622ae922756b9889b25e6Jens Axboe 1330bc3456fa06cc7777c4764da8c7b1c0fd0a3c3772Aaron Carroll __f->filetype = f->filetype; 1331bc3456fa06cc7777c4764da8c7b1c0fd0a3c3772Aaron Carroll } 1332b0fe421a6a0487ff71f6f903908f666d9ca1b327Jens Axboe 1333b0fe421a6a0487ff71f6f903908f666d9ca1b327Jens Axboe td->files[i] = __f; 1334cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe } 1335cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe} 1336f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe 1337f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe/* 1338f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe * Returns the index that matches the filename, or -1 if not there 1339f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe */ 1340f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboeint get_fileno(struct thread_data *td, const char *fname) 1341f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe{ 1342f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe struct fio_file *f; 1343f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe unsigned int i; 1344f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe 1345f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe for_each_file(td, f, i) 1346f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe if (!strcmp(f->file_name, fname)) 1347f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe return i; 1348f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe 1349f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe return -1; 1350f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe} 1351f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe 1352f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe/* 1353f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe * For log usage, where we add/open/close files automatically 1354f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe */ 1355f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboevoid free_release_files(struct thread_data *td) 1356f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe{ 1357f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe close_files(td); 1358f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe td->files_index = 0; 1359f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe td->nr_normal_files = 0; 1360f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe} 136133c48814e08cf961801bf37f759da2748eb3431bJens Axboe 136233c48814e08cf961801bf37f759da2748eb3431bJens Axboevoid fio_file_reset(struct thread_data *td, struct fio_file *f) 136333c48814e08cf961801bf37f759da2748eb3431bJens Axboe{ 136433c48814e08cf961801bf37f759da2748eb3431bJens Axboe f->last_pos = f->file_offset; 136533c48814e08cf961801bf37f759da2748eb3431bJens Axboe f->last_start = -1ULL; 136633c48814e08cf961801bf37f759da2748eb3431bJens Axboe if (f->io_axmap) 136733c48814e08cf961801bf37f759da2748eb3431bJens Axboe axmap_reset(f->io_axmap); 136833c48814e08cf961801bf37f759da2748eb3431bJens Axboe if (td->o.random_generator == FIO_RAND_GEN_LFSR) 136933c48814e08cf961801bf37f759da2748eb3431bJens Axboe lfsr_reset(&f->lfsr, td->rand_seeds[FIO_RAND_BLOCK_OFF]); 137033c48814e08cf961801bf37f759da2748eb3431bJens Axboe} 1371