filesetup.c revision a93c5f049da63a60f9962177d8ada50094d234de
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" 1553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 16a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou#ifdef FIO_HAVE_LINUX_FALLOCATE 17a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou#include <linux/falloc.h> 18a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou#endif 19a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou 207172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboestatic int root_warn; 217172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboe 22c592b9fe12d4739d99d5bece517e304804876df6Jens Axboestatic inline void clear_error(struct thread_data *td) 23c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe{ 24c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe td->error = 0; 25c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe td->verror[0] = '\0'; 26c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe} 27c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe 283baddf2450d811be658fb47ef883ee84478dc352Jens Axboe/* 293baddf2450d811be658fb47ef883ee84478dc352Jens Axboe * Leaves f->fd open on success, caller must close 303baddf2450d811be658fb47ef883ee84478dc352Jens Axboe */ 317bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboestatic int extend_file(struct thread_data *td, struct fio_file *f) 3225205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe{ 33ea443657ce85860b7a0dd2f39f2572d4a09fc885Jens Axboe int r, new_layout = 0, unlink_file = 0, flags; 3425205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe unsigned long long left; 3525205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe unsigned int bs; 3625205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe char *b; 37b2a151925a91f38aeb298d693687a47269ad4e94Jens Axboe 384241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe if (read_only) { 394241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe log_err("fio: refusing extend of file due to read-only\n"); 404241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe return 0; 414241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe } 424241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe 43507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe /* 44507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe * check if we need to lay the file out complete again. fio 45507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe * does that for operations involving reads, or for writes 46507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe * where overwrite is set 47507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe */ 48ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe if (td_read(td) || (td_write(td) && td->o.overwrite) || 49ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe (td_write(td) && td->io_ops->flags & FIO_NOEXTEND)) 50507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe new_layout = 1; 51ea443657ce85860b7a0dd2f39f2572d4a09fc885Jens Axboe if (td_write(td) && !td->o.overwrite) 52ea443657ce85860b7a0dd2f39f2572d4a09fc885Jens Axboe unlink_file = 1; 53507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe 546ae1f57f2cb8661b97b770372eeb3694f6d5a744Jens Axboe if (unlink_file || new_layout) { 55bd199f2b98eeb9101795e40fdef5889c630178c1Jens Axboe dprint(FD_FILE, "layout unlink %s\n", f->file_name); 56982016d689dc7fedbb09646ba0df7e72a781b164Zhang, Yanmin if ((unlink(f->file_name) < 0) && (errno != ENOENT)) { 577bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe td_verror(td, errno, "unlink"); 587bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe return 1; 597bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } 607bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } 617bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 62507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe flags = O_WRONLY | O_CREAT; 63507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe if (new_layout) 64507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe flags |= O_TRUNC; 65507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe 66ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe dprint(FD_FILE, "open file %s, flags %x\n", f->file_name, flags); 67507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe f->fd = open(f->file_name, flags, 0644); 6853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (f->fd < 0) { 69e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe td_verror(td, errno, "open"); 7053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 1; 7153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 7253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 737bc8c2cf02fbd538ca388618ff2f4618787a86e0Jens Axboe#ifdef FIO_HAVE_FALLOCATE 74a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou if (!td->o.fill_device) { 75a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou switch (td->o.fallocate_mode) { 76a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou case FIO_FALLOCATE_NONE: 77a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou break; 78a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou case FIO_FALLOCATE_POSIX: 79a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou dprint(FD_FILE, "posix_fallocate file %s size %llu\n", 80a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou f->file_name, f->real_file_size); 81a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou 82a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou r = posix_fallocate(f->fd, 0, f->real_file_size); 83a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou if (r > 0) { 84a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou log_err("fio: posix_fallocate fails: %s\n", 85a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou strerror(r)); 86a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou } 87a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou break; 88a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou#ifdef FIO_HAVE_LINUX_FALLOCATE 89a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou case FIO_FALLOCATE_KEEP_SIZE: 90a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou dprint(FD_FILE, 91a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou "fallocate(FALLOC_FL_KEEP_SIZE) " 92a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou "file %s size %llu\n", 93a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou f->file_name, f->real_file_size); 947bc8c2cf02fbd538ca388618ff2f4618787a86e0Jens Axboe 95a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou r = fallocate(f->fd, FALLOC_FL_KEEP_SIZE, 0, 96a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou f->real_file_size); 97a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou if (r != 0) { 98a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou td_verror(td, errno, "fallocate"); 99a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou } 100a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou break; 101a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou#endif /* FIO_HAVE_LINUX_FALLOCATE */ 102a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou default: 103a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou log_err("fio: unknown fallocate mode: %d\n", 104a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou td->o.fallocate_mode); 105a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou assert(0); 1067bc8c2cf02fbd538ca388618ff2f4618787a86e0Jens Axboe } 1077bc8c2cf02fbd538ca388618ff2f4618787a86e0Jens Axboe } 108a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou#endif /* FIO_HAVE_FALLOCATE */ 1099b8365618309572d8fd2579c8ea3132db89f843fBruce Cran 110fc74ac1d749c977308016eb22c8658a9a5ac7989Shawn Lewis if (!new_layout) 111fc74ac1d749c977308016eb22c8658a9a5ac7989Shawn Lewis goto done; 112fc74ac1d749c977308016eb22c8658a9a5ac7989Shawn Lewis 1135e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe /* 1145e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe * The size will be -1ULL when fill_device is used, so don't truncate 1155e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe * or fallocate this file, just write it 1165e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe */ 1175e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe if (!td->o.fill_device) { 1185e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe dprint(FD_FILE, "truncate file %s, size %llu\n", f->file_name, 119ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe f->real_file_size); 1205e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe if (ftruncate(f->fd, f->real_file_size) == -1) { 1215e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe td_verror(td, errno, "ftruncate"); 1225e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe goto err; 1235e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe } 1245e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe } 12540f8298cd252157fa15d93f8eb470116a94069a0Jens Axboe 1262dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe b = malloc(td->o.max_bs[DDIR_WRITE]); 1272dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe memset(b, 0, td->o.max_bs[DDIR_WRITE]); 12853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 1297bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe left = f->real_file_size; 13053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe while (left && !td->terminate) { 1312dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe bs = td->o.max_bs[DDIR_WRITE]; 13253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (bs > left) 13353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe bs = left; 13453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 13553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe r = write(f->fd, b, bs); 13653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 1375e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe if (r > 0) { 1385e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe left -= r; 13953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe continue; 14053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } else { 1415e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe if (r < 0) { 1425e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe int __e = errno; 1435e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe 1445e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe if (__e == ENOSPC) { 1455e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe if (td->o.fill_device) 1465e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe break; 1475e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe log_info("fio: ENOSPC on laying out " 1485e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe "file, stopping\n"); 1495e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe break; 1505e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe } 151e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe td_verror(td, errno, "write"); 1525e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe } else 153e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe td_verror(td, EIO, "write"); 15453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 15553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe break; 15653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 15753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 15853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 159ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe if (td->terminate) { 160ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe dprint(FD_FILE, "terminate unlink %s\n", f->file_name); 16153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe unlink(f->file_name); 162ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe } else if (td->o.create_fsync) { 16398e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe if (fsync(f->fd) < 0) { 16498e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe td_verror(td, errno, "fsync"); 16598e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe goto err; 16698e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe } 16798e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe } 1680d1cd207e409a36313784cb9596990c819775f77Jens Axboe if (td->o.fill_device && !td_write(td)) { 169d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe fio_file_clear_size_known(f); 1705e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe if (td_io_get_file_size(td, f)) 1715e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe goto err; 1725e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe if (f->io_size > f->real_file_size) 1735e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe f->io_size = f->real_file_size; 1745e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe } 17553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 17653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe free(b); 177507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboedone: 17853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 0; 17953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboeerr: 18053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe close(f->fd); 18153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe f->fd = -1; 18253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 1; 18353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe} 18453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 185afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanminstatic int pre_read_file(struct thread_data *td, struct fio_file *f) 186afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin{ 187b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe int r, did_open = 0, old_runstate; 188afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin unsigned long long left; 189afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin unsigned int bs; 190afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin char *b; 191afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin 1929c0d224129b0c59698e4c77e7fed00dc8cbb50e1Jens Axboe if (td->io_ops->flags & FIO_PIPEIO) 1939c0d224129b0c59698e4c77e7fed00dc8cbb50e1Jens Axboe return 0; 1949c0d224129b0c59698e4c77e7fed00dc8cbb50e1Jens Axboe 195d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe if (!fio_file_open(f)) { 196b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe if (td->io_ops->open_file(td, f)) { 197b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe log_err("fio: cannot pre-read, failed to open file\n"); 198b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe return 1; 199b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe } 200b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe did_open = 1; 201b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe } 202b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe 203b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe old_runstate = td->runstate; 204b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe td_set_runstate(td, TD_PRE_READING); 205b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe 206afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin bs = td->o.max_bs[DDIR_READ]; 207afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin b = malloc(bs); 208afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin memset(b, 0, bs); 209afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin 210afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin lseek(f->fd, f->file_offset, SEEK_SET); 211afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin left = f->io_size; 212afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin 213afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin while (left && !td->terminate) { 214afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin if (bs > left) 215afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin bs = left; 216afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin 217afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin r = read(f->fd, b, bs); 218afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin 219afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin if (r == (int) bs) { 220afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin left -= bs; 221afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin continue; 222afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin } else { 223afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin td_verror(td, EIO, "pre_read"); 224afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin break; 225afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin } 226afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin } 227afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin 228b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe td_set_runstate(td, old_runstate); 229b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe 230b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe if (did_open) 231b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe td->io_ops->close_file(td, f); 232afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin free(b); 233afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin return 0; 234afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin} 235afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin 2367bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboestatic unsigned long long get_rand_file_size(struct thread_data *td) 2379c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe{ 238dc873b6f4a536c332b72cce268d5a7ccd356a891Jens Axboe unsigned long long ret, sized; 2391294c3ec7a02d20a98b105c1c41b23358afc67e4Jens Axboe unsigned long r; 2409c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe 2414c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe if (td->o.use_os_rand) { 2424c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe r = os_random_long(&td->file_size_state); 2434c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe sized = td->o.file_size_high - td->o.file_size_low; 2444c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe ret = (unsigned long long) ((double) sized * (r / (OS_RAND_MAX + 1.0))); 2454c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe } else { 2464c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe r = __rand(&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 / (FRAND_MAX + 1.0))); 2494c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe } 2504c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe 2515ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe ret += td->o.file_size_low; 2522dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe ret -= (ret % td->o.rw_min_bs); 2539c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe return ret; 2549c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe} 2559c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe 25653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboestatic int file_size(struct thread_data *td, struct fio_file *f) 25753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{ 25853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe struct stat st; 25953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 260df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe if (stat(f->file_name, &st) == -1) { 2617bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe td_verror(td, errno, "fstat"); 2627bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe return 1; 2637bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } 26453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 2657bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe f->real_file_size = st.st_size; 26653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 0; 26753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe} 26853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 26953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboestatic int bdev_size(struct thread_data *td, struct fio_file *f) 27053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{ 2719b8365618309572d8fd2579c8ea3132db89f843fBruce Cran unsigned long long bytes = 0; 27253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe int r; 27353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 274df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe if (td->io_ops->open_file(td, f)) { 275df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe log_err("fio: failed opening blockdev %s for size check\n", 276df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe f->file_name); 277df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe return 1; 278df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe } 279df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe 280ecc314ba7c5f02b7e90ac1dfbce1a74cd4e6d6feBruce Cran r = blockdev_size(f, &bytes); 28153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (r) { 282e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe td_verror(td, r, "blockdev_size"); 283df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe goto err; 28453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 28553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 2867ab077ab119fd28b6ccf5705ea8453e414f574c1Jens Axboe if (!bytes) { 2877ab077ab119fd28b6ccf5705ea8453e414f574c1Jens Axboe log_err("%s: zero sized block device?\n", f->file_name); 288df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe goto err; 2897ab077ab119fd28b6ccf5705ea8453e414f574c1Jens Axboe } 2907ab077ab119fd28b6ccf5705ea8453e414f574c1Jens Axboe 29153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe f->real_file_size = bytes; 29222a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe td->io_ops->close_file(td, f); 29353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 0; 294df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboeerr: 295df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe td->io_ops->close_file(td, f); 296df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe return 1; 29753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe} 29853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 2994ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboestatic int char_size(struct thread_data *td, struct fio_file *f) 3004ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe{ 3014ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe#ifdef FIO_HAVE_CHARDEV_SIZE 3029b8365618309572d8fd2579c8ea3132db89f843fBruce Cran unsigned long long bytes = 0; 3034ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe int r; 3044ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe 3054ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe if (td->io_ops->open_file(td, f)) { 3064ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe log_err("fio: failed opening blockdev %s for size check\n", 3074ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe f->file_name); 3084ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe return 1; 3094ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe } 3104ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe 311ecc314ba7c5f02b7e90ac1dfbce1a74cd4e6d6feBruce Cran r = chardev_size(f, &bytes); 3124ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe if (r) { 3134ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe td_verror(td, r, "chardev_size"); 3144ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe goto err; 3154ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe } 3164ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe 3174ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe if (!bytes) { 3184ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe log_err("%s: zero sized char device?\n", f->file_name); 3194ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe goto err; 3204ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe } 3214ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe 3224ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe f->real_file_size = bytes; 3234ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe td->io_ops->close_file(td, f); 3244ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe return 0; 3254ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboeerr: 3264ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe td->io_ops->close_file(td, f); 3274ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe return 1; 3284ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe#else 3294ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe f->real_file_size = -1ULL; 3304ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe return 0; 3314ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe#endif 3324ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe} 3334ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe 33453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboestatic int get_file_size(struct thread_data *td, struct fio_file *f) 33553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{ 33653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe int ret = 0; 33753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 338d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe if (fio_file_size_known(f)) 339409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe return 0; 340409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe 3417bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (f->filetype == FIO_TYPE_FILE) 3427bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe ret = file_size(td, f); 3437bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe else if (f->filetype == FIO_TYPE_BD) 34453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe ret = bdev_size(td, f); 3454ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe else if (f->filetype == FIO_TYPE_CHAR) 3464ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe ret = char_size(td, f); 34753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe else 34853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe f->real_file_size = -1; 34953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 35053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (ret) 35153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return ret; 35253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 35353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (f->file_offset > f->real_file_size) { 3540f2152c19ed12fc2280c3d475973112f18e48cd5Bruce Cran log_err("%s: offset extends end (%llu > %llu)\n", td->o.name, 3555ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe f->file_offset, f->real_file_size); 35653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 1; 35753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 35853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 359d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe fio_file_set_size_known(f); 36053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 0; 36153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe} 36253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 3633baddf2450d811be658fb47ef883ee84478dc352Jens Axboestatic int __file_invalidate_cache(struct thread_data *td, struct fio_file *f, 3643baddf2450d811be658fb47ef883ee84478dc352Jens Axboe unsigned long long off, 3653baddf2450d811be658fb47ef883ee84478dc352Jens Axboe unsigned long long len) 366e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe{ 367e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe int ret = 0; 368e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe 3695e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe if (len == -1ULL) 3703baddf2450d811be658fb47ef883ee84478dc352Jens Axboe len = f->io_size; 3713baddf2450d811be658fb47ef883ee84478dc352Jens Axboe if (off == -1ULL) 3723baddf2450d811be658fb47ef883ee84478dc352Jens Axboe off = f->file_offset; 373ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe 3740d1cd207e409a36313784cb9596990c819775f77Jens Axboe if (len == -1ULL || off == -1ULL) 3750d1cd207e409a36313784cb9596990c819775f77Jens Axboe return 0; 3760d1cd207e409a36313784cb9596990c819775f77Jens Axboe 3773baddf2450d811be658fb47ef883ee84478dc352Jens Axboe dprint(FD_IO, "invalidate cache %s: %llu/%llu\n", f->file_name, off, 3783baddf2450d811be658fb47ef883ee84478dc352Jens Axboe len); 379b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe 380e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe /* 381e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe * FIXME: add blockdev flushing too 382e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe */ 383a1c58075279454a91ec43366846b93e8dcf9753cJens Axboe if (f->mmap_ptr) { 38403e20d687566753b90383571e5e152c5142bdffdBruce Cran ret = posix_madvise(f->mmap_ptr, f->mmap_sz, POSIX_MADV_DONTNEED); 385a1c58075279454a91ec43366846b93e8dcf9753cJens Axboe#ifdef FIO_MADV_FREE 38603e20d687566753b90383571e5e152c5142bdffdBruce Cran (void) posix_madvise(f->mmap_ptr, f->mmap_sz, FIO_MADV_FREE); 387a1c58075279454a91ec43366846b93e8dcf9753cJens Axboe#endif 388a1c58075279454a91ec43366846b93e8dcf9753cJens Axboe } else if (f->filetype == FIO_TYPE_FILE) { 389ecc314ba7c5f02b7e90ac1dfbce1a74cd4e6d6feBruce Cran ret = posix_fadvise(f->fd, off, len, POSIX_FADV_DONTNEED); 3905ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe } else if (f->filetype == FIO_TYPE_BD) { 391ecc314ba7c5f02b7e90ac1dfbce1a74cd4e6d6feBruce Cran ret = blockdev_invalidate_cache(f); 3927e0e25c924d51f23196b3e0ea83b79178fc46823Jens Axboe if (ret < 0 && errno == EACCES && geteuid()) { 3937172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboe if (!root_warn) { 3945ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe log_err("fio: only root may flush block " 3955ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe "devices. Cache flush bypassed!\n"); 3967172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboe root_warn = 1; 3977172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboe } 3987e0e25c924d51f23196b3e0ea83b79178fc46823Jens Axboe ret = 0; 3997e0e25c924d51f23196b3e0ea83b79178fc46823Jens Axboe } 400b5605e9ded4188ed91faae1a43ecd333a9856f62Jens Axboe } else if (f->filetype == FIO_TYPE_CHAR || f->filetype == FIO_TYPE_PIPE) 401e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe ret = 0; 402e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe 403e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe if (ret < 0) { 404e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe td_verror(td, errno, "invalidate_cache"); 405e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe return 1; 4063baddf2450d811be658fb47ef883ee84478dc352Jens Axboe } else if (ret > 0) { 4073baddf2450d811be658fb47ef883ee84478dc352Jens Axboe td_verror(td, ret, "invalidate_cache"); 4083baddf2450d811be658fb47ef883ee84478dc352Jens Axboe return 1; 409e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe } 410e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe 411ad2da605a62faf16887970618b434db19594e17bJens Axboe return ret; 4123baddf2450d811be658fb47ef883ee84478dc352Jens Axboe 4133baddf2450d811be658fb47ef883ee84478dc352Jens Axboe} 4143baddf2450d811be658fb47ef883ee84478dc352Jens Axboe 4153baddf2450d811be658fb47ef883ee84478dc352Jens Axboeint file_invalidate_cache(struct thread_data *td, struct fio_file *f) 4163baddf2450d811be658fb47ef883ee84478dc352Jens Axboe{ 417d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe if (!fio_file_open(f)) 418a5fb461fdff86c442daeebbd28e07984be9f3807Jens Axboe return 0; 419a5fb461fdff86c442daeebbd28e07984be9f3807Jens Axboe 4205e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe return __file_invalidate_cache(td, f, -1ULL, -1ULL); 421e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe} 422e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe 4236977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboeint generic_close_file(struct thread_data fio_unused *td, struct fio_file *f) 42453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{ 4256977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe int ret = 0; 4266977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe 427ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe dprint(FD_FILE, "fd close %s\n", f->file_name); 4284906e0b57f2b8cbad02ef2428522281cf6038bddJens Axboe 4294906e0b57f2b8cbad02ef2428522281cf6038bddJens Axboe remove_file_hash(f); 4304906e0b57f2b8cbad02ef2428522281cf6038bddJens Axboe 4316977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe if (close(f->fd) < 0) 4326977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe ret = errno; 4336977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe 434b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe f->fd = -1; 4356977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe return ret; 43653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe} 43753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 4384d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboestatic int file_lookup_open(struct fio_file *f, int flags) 43953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{ 44029c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe struct fio_file *__f; 4414d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe int from_hash; 4424d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe 4434d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe __f = lookup_file_hash(f->file_name); 4444d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe if (__f) { 4459efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe dprint(FD_FILE, "found file in hash %s\n", f->file_name); 4464d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe /* 4474d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe * racy, need the __f->lock locked 4484d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe */ 4494d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe f->lock = __f->lock; 4504d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe f->lock_owner = __f->lock_owner; 4514d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe f->lock_batch = __f->lock_batch; 4524d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe f->lock_ddir = __f->lock_ddir; 4534d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe from_hash = 1; 4544d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe } else { 4559efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe dprint(FD_FILE, "file not found in hash %s\n", f->file_name); 4564d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe from_hash = 0; 4574d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe } 4584d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe 459e8670ef8b26039573fbf835b4b95ba45a1039d83Jens Axboe f->fd = open(f->file_name, flags, 0600); 4604d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe return from_hash; 4614d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe} 4624d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe 4634d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboeint generic_open_file(struct thread_data *td, struct fio_file *f) 4644d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe{ 465661598287ecc3b8987f312cf8403936552ce686aJens Axboe int is_std = 0; 46653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe int flags = 0; 46729c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe int from_hash = 0; 46853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 469ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe dprint(FD_FILE, "fd open %s\n", f->file_name); 470ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe 471661598287ecc3b8987f312cf8403936552ce686aJens Axboe if (!strcmp(f->file_name, "-")) { 472661598287ecc3b8987f312cf8403936552ce686aJens Axboe if (td_rw(td)) { 473661598287ecc3b8987f312cf8403936552ce686aJens Axboe log_err("fio: can't read/write to stdin/out\n"); 474661598287ecc3b8987f312cf8403936552ce686aJens Axboe return 1; 475661598287ecc3b8987f312cf8403936552ce686aJens Axboe } 476661598287ecc3b8987f312cf8403936552ce686aJens Axboe is_std = 1; 477ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe 478ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe /* 479ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe * move output logging to stderr, if we are writing to stdout 480ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe */ 481ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe if (td_write(td)) 482ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe f_out = stderr; 483661598287ecc3b8987f312cf8403936552ce686aJens Axboe } 484661598287ecc3b8987f312cf8403936552ce686aJens Axboe 4852dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe if (td->o.odirect) 4862fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe flags |= OS_O_DIRECT; 4872dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe if (td->o.sync_io) 4882fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe flags |= O_SYNC; 489ad92396cc21055cee93470dcf65e82ccde03aac5Jens Axboe if (f->filetype != FIO_TYPE_FILE) 4905921e80c5dfc9f96d2f21da6ae58f2b5d3a0b373Jens Axboe flags |= FIO_O_NOATIME; 491814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe if (td->o.create_on_open) 492814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe flags |= O_CREAT; 49353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 494056f3459149a7670257350d84b49858718e4a0e6Aaron Carrollopen_again: 495660a1cb5fb9843ec09a04337714e78d63cd557e7Jens Axboe if (td_write(td)) { 496173081581f94dc4f9f203eb7a7922fc843bfafdeJens Axboe if (!read_only) 497173081581f94dc4f9f203eb7a7922fc843bfafdeJens Axboe flags |= O_RDWR; 49853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 499af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe if (f->filetype == FIO_TYPE_FILE) 5002fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe flags |= O_CREAT; 5012fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe 502661598287ecc3b8987f312cf8403936552ce686aJens Axboe if (is_std) 503661598287ecc3b8987f312cf8403936552ce686aJens Axboe f->fd = dup(STDOUT_FILENO); 5044d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe else 5054d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe from_hash = file_lookup_open(f, flags); 5062fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe } else { 5074241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe if (f->filetype == FIO_TYPE_CHAR && !read_only) 5082fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe flags |= O_RDWR; 5092fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe else 5102fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe flags |= O_RDONLY; 5112fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe 512661598287ecc3b8987f312cf8403936552ce686aJens Axboe if (is_std) 513661598287ecc3b8987f312cf8403936552ce686aJens Axboe f->fd = dup(STDIN_FILENO); 5144d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe else 5154d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe from_hash = file_lookup_open(f, flags); 51653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 51753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 51853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (f->fd == -1) { 519e4e33258637e55550a0fac59eb3350e8bf06f8e6Jens Axboe char buf[FIO_VERROR_SIZE]; 520e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe int __e = errno; 521e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe 522835d9b9ed0e5c2591b8a3eacbd5f4ab6bdab466cJens Axboe if (__e == EPERM && (flags & FIO_O_NOATIME)) { 5235921e80c5dfc9f96d2f21da6ae58f2b5d3a0b373Jens Axboe flags &= ~FIO_O_NOATIME; 524056f3459149a7670257350d84b49858718e4a0e6Aaron Carroll goto open_again; 525056f3459149a7670257350d84b49858718e4a0e6Aaron Carroll } 526056f3459149a7670257350d84b49858718e4a0e6Aaron Carroll 527e8670ef8b26039573fbf835b4b95ba45a1039d83Jens Axboe snprintf(buf, sizeof(buf) - 1, "open(%s)", f->file_name); 528e4e33258637e55550a0fac59eb3350e8bf06f8e6Jens Axboe 529a93c5f049da63a60f9962177d8ada50094d234deJens Axboe if (__e == EINVAL && (flags & OS_O_DIRECT)) { 530a93c5f049da63a60f9962177d8ada50094d234deJens Axboe log_err("fio: looks like your file system does not " \ 531a93c5f049da63a60f9962177d8ada50094d234deJens Axboe "support direct=1/buffered=0\n"); 532a93c5f049da63a60f9962177d8ada50094d234deJens Axboe } 533a93c5f049da63a60f9962177d8ada50094d234deJens Axboe 534e4e33258637e55550a0fac59eb3350e8bf06f8e6Jens Axboe td_verror(td, __e, buf); 53553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 53653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 53729c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe if (!from_hash && f->fd != -1) { 53829c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe if (add_file_hash(f)) { 5393f0ca9b914e6d0db8c5c457713c277ce458cbc02Jens Axboe int fio_unused ret; 54029c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe 54129c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe /* 54229c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe * OK to ignore, we haven't done anything with it 54329c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe */ 54429c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe ret = generic_close_file(td, f); 54529c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe goto open_again; 54629c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe } 54729c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe } 5484906e0b57f2b8cbad02ef2428522281cf6038bddJens Axboe 54953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 0; 550b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe} 551b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe 552df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboeint generic_get_file_size(struct thread_data *td, struct fio_file *f) 55321972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe{ 554df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe return get_file_size(td, f); 55521972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe} 55621972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe 5577bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe/* 5587bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * open/close all files, so that ->real_file_size gets set 5597bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */ 560bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboestatic int get_file_sizes(struct thread_data *td) 5617bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe{ 5627bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe struct fio_file *f; 5637bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe unsigned int i; 564bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe int err = 0; 5657bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 5667bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe for_each_file(td, f, i) { 5675ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe dprint(FD_FILE, "get file size for %p/%d/%p\n", f, i, 5685ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe f->file_name); 5699efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe 57099a47c6905731e53dd4d8f7ea6501f36d9329e7bJens Axboe if (td_io_get_file_size(td, f)) { 57140b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe if (td->error != ENOENT) { 57240b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe log_err("%s\n", td->verror); 57340b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe err = 1; 57440b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe } 575541d66d70b8fbe9860b31307c0760e6d5f4c78a8Jens Axboe clear_error(td); 57607eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe } 577409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe 578409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe if (f->real_file_size == -1ULL && td->o.size) 579409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe f->real_file_size = td->o.size / td->o.nr_files; 5807bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } 581bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe 582bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe return err; 5837bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe} 5847bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 5852e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboestruct fio_mount { 5862e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe struct flist_head list; 5872e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe const char *base; 5882e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe char __base[256]; 5892e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe unsigned int key; 5902e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe}; 5912e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 5922e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe/* 5932e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe * Get free number of bytes for each file on each unique mount. 5942e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe */ 5952e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboestatic unsigned long long get_fs_free_counts(struct thread_data *td) 5962e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe{ 5972e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe struct flist_head *n, *tmp; 59868b0316f581c3c881d7dbf7c9dafef4a10100a66Jens Axboe unsigned long long ret = 0; 5992e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe struct fio_mount *fm; 6002e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe FLIST_HEAD(list); 6012e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe struct fio_file *f; 6022e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe unsigned int i; 6032e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 6042e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe for_each_file(td, f, i) { 6052e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe struct stat sb; 6062e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe char buf[256]; 6072e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 6084ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe if (f->filetype == FIO_TYPE_BD || f->filetype == FIO_TYPE_CHAR) { 6094ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe if (f->real_file_size != -1ULL) 6104ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe ret += f->real_file_size; 61168b0316f581c3c881d7dbf7c9dafef4a10100a66Jens Axboe continue; 61268b0316f581c3c881d7dbf7c9dafef4a10100a66Jens Axboe } else if (f->filetype != FIO_TYPE_FILE) 61368b0316f581c3c881d7dbf7c9dafef4a10100a66Jens Axboe continue; 61468b0316f581c3c881d7dbf7c9dafef4a10100a66Jens Axboe 6152e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe strcpy(buf, f->file_name); 6162e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 6172e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe if (stat(buf, &sb) < 0) { 6182e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe if (errno != ENOENT) 6192e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe break; 6202e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe strcpy(buf, "."); 6212e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe if (stat(buf, &sb) < 0) 6222e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe break; 6232e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe } 6242e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 6252e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe fm = NULL; 6262e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe flist_for_each(n, &list) { 6272e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe fm = flist_entry(n, struct fio_mount, list); 6282e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe if (fm->key == sb.st_dev) 6292e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe break; 6302e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 6312e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe fm = NULL; 6322e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe } 6332e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 6342e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe if (fm) 6352e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe continue; 6362e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 6372e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe fm = malloc(sizeof(*fm)); 6382e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe strcpy(fm->__base, buf); 6392e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe fm->base = basename(fm->__base); 6402e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe fm->key = sb.st_dev; 6412e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe flist_add(&fm->list, &list); 6422e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe } 6432e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 6442e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe flist_for_each_safe(n, tmp, &list) { 6452e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe unsigned long long sz; 6462e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 6472e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe fm = flist_entry(n, struct fio_mount, list); 6482e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe flist_del(&fm->list); 6492e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 6502e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe sz = get_fs_size(fm->base); 6512e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe if (sz && sz != -1ULL) 6522e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe ret += sz; 6532e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 6542e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe free(fm); 6552e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe } 6562e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 6572e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe return ret; 6582e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe} 6592e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 6607bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe/* 6617bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * Open the files and setup files sizes, creating files if necessary. 6627bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */ 66353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboeint setup_files(struct thread_data *td) 66453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{ 6657bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe unsigned long long total_size, extend_size; 66653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe struct fio_file *f; 667af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe unsigned int i; 668000b080395e45cbe0ce54e75f0e993addbdc8676Jens Axboe int err = 0, need_extend; 66953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 670ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe dprint(FD_FILE, "setup files\n"); 671ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe 672691c8fb014da9dd82e999a90b5511423f4eee188Jens Axboe if (td->o.read_iolog_file) 67325460cf6350fb90b8a7943bb649a51d81bac13a4Jens Axboe goto done; 674691c8fb014da9dd82e999a90b5511423f4eee188Jens Axboe 67553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe /* 67653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe * if ioengine defines a setup() method, it's responsible for 6777bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * opening the files and setting f->real_file_size to indicate 6787bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * the valid range for that file. 67953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe */ 68053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (td->io_ops->setup) 6817bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe err = td->io_ops->setup(td); 6827bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe else 683bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe err = get_file_sizes(td); 68453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 685f102706350093e60617cc271b128e56c57ab3ce7Jens Axboe if (err) 686f102706350093e60617cc271b128e56c57ab3ce7Jens Axboe return err; 687f102706350093e60617cc271b128e56c57ab3ce7Jens Axboe 6880a7eb121ecb2e4279e9eb8178aa1e554dda40191Jens Axboe /* 6897bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * check sizes. if the files/devices do not exist and the size 6907bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * isn't passed to fio, abort. 6910a7eb121ecb2e4279e9eb8178aa1e554dda40191Jens Axboe */ 6927bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe total_size = 0; 6937bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe for_each_file(td, f, i) { 6947bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (f->real_file_size == -1ULL) 6957bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe total_size = -1ULL; 6967bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe else 6977bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe total_size += f->real_file_size; 6987bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } 6990a7eb121ecb2e4279e9eb8178aa1e554dda40191Jens Axboe 7002e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe if (td->o.fill_device) 7012e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe td->fill_device_size = get_fs_free_counts(td); 7022e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 7037bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe /* 7047bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * device/file sizes are zero and no size given, punt 7057bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */ 7061f809d151ddc4a4c348c2e4f6007db510e3e08a2Jens Axboe if ((!total_size || total_size == -1ULL) && !td->o.size && 707aa31f1f108348ba2a8749c73fa8c25f3d4630a7cShawn Lewis !(td->io_ops->flags & FIO_NOIO) && !td->o.fill_device) { 7087bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe log_err("%s: you need to specify size=\n", td->o.name); 709e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe td_verror(td, EINVAL, "total_file_size"); 71053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 1; 71153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 71253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 7137bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe /* 7147bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * now file sizes are known, so we can set ->io_size. if size= is 7157bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * not given, ->io_size is just equal to ->real_file_size. if size 7167bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * is given, ->io_size is size / nr_files. 7177bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */ 7187bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe extend_size = total_size = 0; 7197bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe need_extend = 0; 7207bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe for_each_file(td, f, i) { 721214ac7e009897f8f82ab9e21aff9bc86d33bb470Dan Ehrenberg f->file_offset = td->o.start_offset + 722591e9e0653dd8f5d8464b2896434a01ab742a3b1Jens Axboe (td->thread_number - 1) * td->o.offset_increment; 723bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang 7247bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (!td->o.file_size_low) { 7257bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe /* 7267bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * no file size range given, file size is equal to 7277bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * total size divided by number of files. if that is 7287bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * zero, set it to the real file size. 7297bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */ 7307bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe f->io_size = td->o.size / td->o.nr_files; 73165bdb10a09222d8b5d213de74824be775772ea8fJens Axboe if (!f->io_size) 732273f8c912d981439049d9b21aa048aaeaa323c5dJens Axboe f->io_size = f->real_file_size - f->file_offset; 7337bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } else if (f->real_file_size < td->o.file_size_low || 7347bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe f->real_file_size > td->o.file_size_high) { 7355ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe if (f->file_offset > td->o.file_size_low) 736bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang goto err_offset; 7377bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe /* 7387bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * file size given. if it's fixed, use that. if it's a 7397bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * range, generate a random size in-between. 7407bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */ 7415ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe if (td->o.file_size_low == td->o.file_size_high) { 7425ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe f->io_size = td->o.file_size_low 7435ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe - f->file_offset; 7445ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe } else { 7455ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe f->io_size = get_rand_file_size(td) 7465ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe - f->file_offset; 7475ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe } 74865bdb10a09222d8b5d213de74824be775772ea8fJens Axboe } else 749bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang f->io_size = f->real_file_size - f->file_offset; 75053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 7517bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (f->io_size == -1ULL) 7527bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe total_size = -1ULL; 7537bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe else 7547bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe total_size += f->io_size; 7557bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 7567bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (f->filetype == FIO_TYPE_FILE && 757bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang (f->io_size + f->file_offset) > f->real_file_size && 7587bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe !(td->io_ops->flags & FIO_DISKLESSIO)) { 759814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe if (!td->o.create_on_open) { 760814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe need_extend++; 761814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe extend_size += (f->io_size + f->file_offset); 762814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe } else 763814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe f->real_file_size = f->io_size + f->file_offset; 764d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe fio_file_set_extend(f); 7655ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe } 7667bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } 76753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 7687bb591020669b7266c57108f2a68b48a03ae72eeJens Axboe if (td->o.size_percent) 7697bb591020669b7266c57108f2a68b48a03ae72eeJens Axboe total_size = (total_size * td->o.size_percent) / 100; 7707bb591020669b7266c57108f2a68b48a03ae72eeJens Axboe 7712298290eabbe1017421a6ba0f5de93d8c2b048adljzhang,Yaxin Hu,Jianchao Tang if (!td->o.size || td->o.size > total_size) 7727bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe td->o.size = total_size; 77321972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe 7747bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe /* 7757bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * See if we need to extend some files 7767bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */ 7777bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (need_extend) { 7787bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe temp_stall_ts = 1; 779a7ba8c5f4c0f9fe117d529c1ad6686b2070bae51Shaozhi Shawn Ye if (!terse_output) 780a7ba8c5f4c0f9fe117d529c1ad6686b2070bae51Shaozhi Shawn Ye log_info("%s: Laying out IO file(s) (%u file(s) /" 7810f2152c19ed12fc2280c3d475973112f18e48cd5Bruce Cran " %lluMB)\n", td->o.name, need_extend, 782a7ba8c5f4c0f9fe117d529c1ad6686b2070bae51Shaozhi Shawn Ye extend_size >> 20); 7837bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 7847bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe for_each_file(td, f, i) { 7855e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe unsigned long long old_len = -1ULL, extend_len = -1ULL; 7863baddf2450d811be658fb47ef883ee84478dc352Jens Axboe 787d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe if (!fio_file_extend(f)) 7887bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe continue; 7897bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 790409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe assert(f->filetype == FIO_TYPE_FILE); 791d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe fio_file_clear_extend(f); 7925e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe if (!td->o.fill_device) { 7935e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe old_len = f->real_file_size; 7940b9d69ecb14045cf3b2622ae922756b9889b25e6Jens Axboe extend_len = f->io_size + f->file_offset - 7950b9d69ecb14045cf3b2622ae922756b9889b25e6Jens Axboe old_len; 7965e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe } 797bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang f->real_file_size = (f->io_size + f->file_offset); 7987bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe err = extend_file(td, f); 7997bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (err) 8003baddf2450d811be658fb47ef883ee84478dc352Jens Axboe break; 8015e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe 8023baddf2450d811be658fb47ef883ee84478dc352Jens Axboe err = __file_invalidate_cache(td, f, old_len, 8033baddf2450d811be658fb47ef883ee84478dc352Jens Axboe extend_len); 8043baddf2450d811be658fb47ef883ee84478dc352Jens Axboe close(f->fd); 8053baddf2450d811be658fb47ef883ee84478dc352Jens Axboe f->fd = -1; 8063baddf2450d811be658fb47ef883ee84478dc352Jens Axboe if (err) 8077bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe break; 8087bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } 8097bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe temp_stall_ts = 0; 8107bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } 8117bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 8127bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (err) 8137bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe return err; 8147bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 8157bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (!td->o.zone_size) 8167bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe td->o.zone_size = td->o.size; 8177bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 818ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe /* 819ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe * iolog already set the total io size, if we read back 820ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe * stored entries. 821ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe */ 822ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe if (!td->o.read_iolog_file) 823ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe td->total_io_size = td->o.size * td->o.loops; 82425460cf6350fb90b8a7943bb649a51d81bac13a4Jens Axboe 82525460cf6350fb90b8a7943bb649a51d81bac13a4Jens Axboedone: 82625460cf6350fb90b8a7943bb649a51d81bac13a4Jens Axboe if (td->o.create_only) 82725460cf6350fb90b8a7943bb649a51d81bac13a4Jens Axboe td->done = 1; 82825460cf6350fb90b8a7943bb649a51d81bac13a4Jens Axboe 8297bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe return 0; 830bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tangerr_offset: 831bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang log_err("%s: you need to specify valid offset=\n", td->o.name); 832bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang return 1; 83353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe} 83453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 835afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanminint pre_read_files(struct thread_data *td) 836afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin{ 837afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin struct fio_file *f; 838afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin unsigned int i; 839afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin 840afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin dprint(FD_FILE, "pre_read files\n"); 841afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin 842afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin for_each_file(td, f, i) { 843afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin pre_read_file(td, f); 844afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin } 845afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin 846afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin return 1; 847afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin} 848afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin 849687270767de17dbad53c50e03e5d73d52505405cJens Axboeint init_random_map(struct thread_data *td) 850687270767de17dbad53c50e03e5d73d52505405cJens Axboe{ 851509eab12448823a8eefbe925804b5308ee63bf5eJens Axboe unsigned long long blocks, num_maps; 852687270767de17dbad53c50e03e5d73d52505405cJens Axboe struct fio_file *f; 853687270767de17dbad53c50e03e5d73d52505405cJens Axboe unsigned int i; 854687270767de17dbad53c50e03e5d73d52505405cJens Axboe 855de8dd119d7d869dd9c90c6d62bf4bededd10642eJens Axboe if (td->o.norandommap || !td_random(td)) 856687270767de17dbad53c50e03e5d73d52505405cJens Axboe return 0; 857687270767de17dbad53c50e03e5d73d52505405cJens Axboe 858687270767de17dbad53c50e03e5d73d52505405cJens Axboe for_each_file(td, f, i) { 8595ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe blocks = (f->real_file_size + td->o.rw_min_bs - 1) / 8605ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe (unsigned long long) td->o.rw_min_bs; 8615ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe num_maps = (blocks + BLOCKS_PER_MAP - 1) / 8625ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe (unsigned long long) BLOCKS_PER_MAP; 863ceadd59ef93421001530aa765d928e9e8c26b32eJens Axboe if (num_maps == (unsigned long) num_maps) { 864ceadd59ef93421001530aa765d928e9e8c26b32eJens Axboe f->file_map = smalloc(num_maps * sizeof(unsigned long)); 865ceadd59ef93421001530aa765d928e9e8c26b32eJens Axboe if (f->file_map) { 866ceadd59ef93421001530aa765d928e9e8c26b32eJens Axboe f->num_maps = num_maps; 867ceadd59ef93421001530aa765d928e9e8c26b32eJens Axboe continue; 868ceadd59ef93421001530aa765d928e9e8c26b32eJens Axboe } 869ceadd59ef93421001530aa765d928e9e8c26b32eJens Axboe } else 870ceadd59ef93421001530aa765d928e9e8c26b32eJens Axboe f->file_map = NULL; 871ceadd59ef93421001530aa765d928e9e8c26b32eJens Axboe 8722b386d2569c9078ca9790c4e6d318ec3835b8739Jens Axboe if (!td->o.softrandommap) { 8735ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe log_err("fio: failed allocating random map. If running" 8745ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe " a large number of jobs, try the 'norandommap'" 8752b386d2569c9078ca9790c4e6d318ec3835b8739Jens Axboe " option or set 'softrandommap'. Or give" 8762b386d2569c9078ca9790c4e6d318ec3835b8739Jens Axboe " a larger --alloc-size to fio.\n"); 877687270767de17dbad53c50e03e5d73d52505405cJens Axboe return 1; 878687270767de17dbad53c50e03e5d73d52505405cJens Axboe } 879303032ae4e13c7ac10b8198c40df98d95a4524a6Jens Axboe 880303032ae4e13c7ac10b8198c40df98d95a4524a6Jens Axboe log_info("fio: file %s failed allocating random map. Running " 881303032ae4e13c7ac10b8198c40df98d95a4524a6Jens Axboe "job without.\n", f->file_name); 882303032ae4e13c7ac10b8198c40df98d95a4524a6Jens Axboe f->num_maps = 0; 883687270767de17dbad53c50e03e5d73d52505405cJens Axboe } 884687270767de17dbad53c50e03e5d73d52505405cJens Axboe 885687270767de17dbad53c50e03e5d73d52505405cJens Axboe return 0; 886687270767de17dbad53c50e03e5d73d52505405cJens Axboe} 887687270767de17dbad53c50e03e5d73d52505405cJens Axboe 88853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboevoid close_files(struct thread_data *td) 88953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{ 8900ab8db8943acc6b9ea778735563bfad2a79e8dddJens Axboe struct fio_file *f; 891af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe unsigned int i; 89253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 8932be3eec330360e6735fb4e7d70907e11eaa346f8Jens Axboe for_each_file(td, f, i) { 8942be3eec330360e6735fb4e7d70907e11eaa346f8Jens Axboe if (fio_file_open(f)) 8952be3eec330360e6735fb4e7d70907e11eaa346f8Jens Axboe td_io_close_file(td, f); 8962be3eec330360e6735fb4e7d70907e11eaa346f8Jens Axboe } 89724ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe} 89824ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe 89924ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboevoid close_and_free_files(struct thread_data *td) 90024ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe{ 90124ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe struct fio_file *f; 90224ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe unsigned int i; 90324ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe 904ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe dprint(FD_FILE, "close files\n"); 905ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe 9060ab8db8943acc6b9ea778735563bfad2a79e8dddJens Axboe for_each_file(td, f, i) { 907ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe if (td->o.unlink && f->filetype == FIO_TYPE_FILE) { 908ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe dprint(FD_FILE, "free unlink %s\n", f->file_name); 909132ad46d22bcf12da95ad69e03c1b6f23f5e60a9Jens Axboe unlink(f->file_name); 910ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe } 911bdb4e2e99d4a87e5d3677cc09aa1ce92135125a9Jens Axboe 91222a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe if (fio_file_open(f)) 91322a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe td_io_close_file(td, f); 91422a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe 915b9fbcf2104ab79127825e0c23ba0a147ec076087Shaozhi Shawn Ye remove_file_hash(f); 916b3dc7f075b85e004f8c681ebb8566475017696f3Jens Axboe 917f17c43928c202e557f2f325272c60d9050ee528eJens Axboe sfree(f->file_name); 918fa1da8653e2177b3cc31a91e963c389f079d4172Jens Axboe f->file_name = NULL; 91961eb313e28c0f0ba8eb144c5b5f331b6b74c4fc8Jens Axboe sfree(f->file_map); 92061eb313e28c0f0ba8eb144c5b5f331b6b74c4fc8Jens Axboe f->file_map = NULL; 92178d99e6a2695d3a7936c5dd02f996f13a30309b1Jens Axboe sfree(f); 92253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 923b4a6a59a939f0e6554632de311e7d1d1b7633ccfJens Axboe 9242dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe td->o.filename = NULL; 925cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe free(td->files); 9269efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe td->files_index = 0; 927b4a6a59a939f0e6554632de311e7d1d1b7633ccfJens Axboe td->files = NULL; 9282dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe td->o.nr_files = 0; 92953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe} 930af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe 931e3bab463d4397e3378d8c7437e31de8aaf861a4fJens Axboestatic void get_file_type(struct fio_file *f) 932af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe{ 933af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe struct stat sb; 934af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe 935661598287ecc3b8987f312cf8403936552ce686aJens Axboe if (!strcmp(f->file_name, "-")) 936661598287ecc3b8987f312cf8403936552ce686aJens Axboe f->filetype = FIO_TYPE_PIPE; 937661598287ecc3b8987f312cf8403936552ce686aJens Axboe else 938661598287ecc3b8987f312cf8403936552ce686aJens Axboe f->filetype = FIO_TYPE_FILE; 939af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe 9403892182aff21486d9c38a346fe8681c9098ecb0cBruce Cran /* \\.\ is the device namespace in Windows, where every file is 9413892182aff21486d9c38a346fe8681c9098ecb0cBruce Cran * a block device */ 9423892182aff21486d9c38a346fe8681c9098ecb0cBruce Cran if (strncmp(f->file_name, "\\\\.\\", 4) == 0) 9433892182aff21486d9c38a346fe8681c9098ecb0cBruce Cran f->filetype = FIO_TYPE_BD; 9443892182aff21486d9c38a346fe8681c9098ecb0cBruce Cran 945b30d395ec288508f9c787af11d0f52e9df26e39fJens Axboe if (!stat(f->file_name, &sb)) { 9463892182aff21486d9c38a346fe8681c9098ecb0cBruce Cran if (S_ISBLK(sb.st_mode)) 947af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe f->filetype = FIO_TYPE_BD; 948af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe else if (S_ISCHR(sb.st_mode)) 949af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe f->filetype = FIO_TYPE_CHAR; 950b5605e9ded4188ed91faae1a43ecd333a9856f62Jens Axboe else if (S_ISFIFO(sb.st_mode)) 951b5605e9ded4188ed91faae1a43ecd333a9856f62Jens Axboe f->filetype = FIO_TYPE_PIPE; 952af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe } 953af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe} 954af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe 955f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboeint add_file(struct thread_data *td, const char *fname) 956af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe{ 9577b4e4fe5e6fa26f82f9169c18ec70c08d0805ca9Jens Axboe int cur_files = td->files_index; 958bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe char file_name[PATH_MAX]; 959af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe struct fio_file *f; 960bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe int len = 0; 961af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe 962ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe dprint(FD_FILE, "add file %s\n", fname); 963ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe 964f17c43928c202e557f2f325272c60d9050ee528eJens Axboe f = smalloc(sizeof(*f)); 965c48c0be79173897824d8f439c39374f2588931dcJens Axboe if (!f) { 966c48c0be79173897824d8f439c39374f2588931dcJens Axboe log_err("fio: smalloc OOM\n"); 967c48c0be79173897824d8f439c39374f2588931dcJens Axboe assert(0); 968c48c0be79173897824d8f439c39374f2588931dcJens Axboe } 9690b9d69ecb14045cf3b2622ae922756b9889b25e6Jens Axboe 970af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe f->fd = -1; 97138dad62d5154ffaad445bd0231b271b9a46a5190Jens Axboe fio_file_reset(f); 972bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe 973fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe if (td->files_size <= td->files_index) { 9744b341fca0dab0caa41d000e8db36f1530c26616fCarl Henrik Lunde int new_size = td->o.nr_files + 1; 975126d65c6fc97d6acdc568aa5a969c012018daf15Jens Axboe 976fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe dprint(FD_FILE, "resize file array to %d files\n", new_size); 977fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe 978fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe td->files = realloc(td->files, new_size * sizeof(f)); 979fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe td->files_size = new_size; 980fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe } 9818bb7679e73d3086a01b9d21a650b0d7a859412b6Jens Axboe td->files[cur_files] = f; 982126d65c6fc97d6acdc568aa5a969c012018daf15Jens Axboe 98307eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe /* 98407eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe * init function, io engine may not be loaded yet 98507eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe */ 98607eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe if (td->io_ops && (td->io_ops->flags & FIO_DISKLESSIO)) 98707eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe f->real_file_size = -1ULL; 98807eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe 989bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe if (td->o.directory) 990bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe len = sprintf(file_name, "%s/", td->o.directory); 991bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe 992bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe sprintf(file_name + len, "%s", fname); 993f17c43928c202e557f2f325272c60d9050ee528eJens Axboe f->file_name = smalloc_strdup(file_name); 994c48c0be79173897824d8f439c39374f2588931dcJens Axboe if (!f->file_name) { 995c48c0be79173897824d8f439c39374f2588931dcJens Axboe log_err("fio: smalloc OOM\n"); 996c48c0be79173897824d8f439c39374f2588931dcJens Axboe assert(0); 997c48c0be79173897824d8f439c39374f2588931dcJens Axboe } 9980b9d69ecb14045cf3b2622ae922756b9889b25e6Jens Axboe 999e3bab463d4397e3378d8c7437e31de8aaf861a4fJens Axboe get_file_type(f); 1000af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe 10014d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe switch (td->o.file_lock_mode) { 10024d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe case FILE_LOCK_NONE: 10034d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe break; 10044d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe case FILE_LOCK_READWRITE: 10054d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe f->lock = fio_mutex_rw_init(); 10064d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe break; 10074d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe case FILE_LOCK_EXCLUSIVE: 10084d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe f->lock = fio_mutex_init(1); 10094d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe break; 10104d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe default: 10114d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe log_err("fio: unknown lock mode: %d\n", td->o.file_lock_mode); 10124d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe assert(0); 10134d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe } 101429c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe 10157b4e4fe5e6fa26f82f9169c18ec70c08d0805ca9Jens Axboe td->files_index++; 10161549441cdfecb2c1a4a8b8d494253859d67b4344Jens Axboe if (f->filetype == FIO_TYPE_FILE) 10171549441cdfecb2c1a4a8b8d494253859d67b4344Jens Axboe td->nr_normal_files++; 1018f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe 10195ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe dprint(FD_FILE, "file %p \"%s\" added at %d\n", f, f->file_name, 10205ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe cur_files); 10219efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe 1022f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe return cur_files; 1023af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe} 10240ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe 102549ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboeint add_file_exclusive(struct thread_data *td, const char *fname) 102649ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe{ 102749ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe struct fio_file *f; 102849ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe unsigned int i; 102949ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe 103049ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe for_each_file(td, f, i) { 103149ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe if (!strcmp(f->file_name, fname)) 103249ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe return i; 103349ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe } 103449ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe 103549ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe return add_file(td, fname); 103649ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe} 103749ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe 10380ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboevoid get_file(struct fio_file *f) 10390ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe{ 10408172fe972f3a79d42f34d7f6e259ed3f7f800316Jens Axboe dprint(FD_FILE, "get file %s, ref=%d\n", f->file_name, f->references); 1041d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe assert(fio_file_open(f)); 10420ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe f->references++; 10430ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe} 10440ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe 10456977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboeint put_file(struct thread_data *td, struct fio_file *f) 10460ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe{ 104798e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe int f_ret = 0, ret = 0; 10486977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe 10498172fe972f3a79d42f34d7f6e259ed3f7f800316Jens Axboe dprint(FD_FILE, "put file %s, ref=%d\n", f->file_name, f->references); 1050ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe 105122a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe if (!fio_file_open(f)) { 105222a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe assert(f->fd == -1); 10536977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe return 0; 105422a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe } 10550ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe 10560ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe assert(f->references); 10570ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe if (--f->references) 10586977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe return 0; 10590ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe 1060d424d4dd657eaf4aeb8ffb07a550a5f64940f41aJens Axboe if (should_fsync(td) && td->o.fsync_on_close) 106198e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe f_ret = fsync(f->fd); 1062ebb1415f729c123b8a13bcbd667bf4b4cc95b4d4Jens Axboe 10630ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe if (td->io_ops->close_file) 10646977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe ret = td->io_ops->close_file(td, f); 10651020a139beff50faf1bb18f761b024b664a09e14Jens Axboe 106698e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe if (!ret) 1067a5fb461fdff86c442daeebbd28e07984be9f3807Jens Axboe ret = f_ret; 106898e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe 10690ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe td->nr_open_files--; 1070d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe fio_file_clear_open(f); 107122a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe assert(f->fd == -1); 10726977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe return ret; 10730ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe} 1074bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 10754d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboevoid lock_file(struct thread_data *td, struct fio_file *f, enum fio_ddir ddir) 1076b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe{ 10774d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe if (!f->lock || td->o.file_lock_mode == FILE_LOCK_NONE) 10784d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe return; 107929c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe 10804d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe if (f->lock_owner == td && f->lock_batch--) 10814d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe return; 10824d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe 10834d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe if (td->o.file_lock_mode == FILE_LOCK_READWRITE) { 10844d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe if (ddir == DDIR_READ) 10854d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe fio_mutex_down_read(f->lock); 10864d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe else 10874d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe fio_mutex_down_write(f->lock); 10884d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe } else if (td->o.file_lock_mode == FILE_LOCK_EXCLUSIVE) 10894d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe fio_mutex_down(f->lock); 10904d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe 10914d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe f->lock_owner = td; 10924d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe f->lock_batch = td->o.lockfile_batch; 10934d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe f->lock_ddir = ddir; 1094b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe} 1095b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe 10964d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboevoid unlock_file(struct thread_data *td, struct fio_file *f) 1097b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe{ 10984d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe if (!f->lock || td->o.file_lock_mode == FILE_LOCK_NONE) 10994d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe return; 11004d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe if (f->lock_batch) 11014d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe return; 11024d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe 11034d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe if (td->o.file_lock_mode == FILE_LOCK_READWRITE) { 11044d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe const int is_read = f->lock_ddir == DDIR_READ; 11054d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe int val = fio_mutex_getval(f->lock); 110629c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe 11074d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe if ((is_read && val == 1) || (!is_read && val == -1)) 11084d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe f->lock_owner = NULL; 110929c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe 11104d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe if (is_read) 11114d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe fio_mutex_up_read(f->lock); 11124d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe else 11134d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe fio_mutex_up_write(f->lock); 11144d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe } else if (td->o.file_lock_mode == FILE_LOCK_EXCLUSIVE) { 11154d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe int val = fio_mutex_getval(f->lock); 11164d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe 11174d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe if (val == 0) 11184d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe f->lock_owner = NULL; 11194d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe 11204d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe fio_mutex_up(f->lock); 112129c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe } 1122b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe} 1123b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe 11244d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboevoid unlock_file_all(struct thread_data *td, struct fio_file *f) 11254d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe{ 11264d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe if (f->lock_owner != td) 11274d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe return; 11284d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe 11294d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe f->lock_batch = 0; 11304d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe unlock_file(td, f); 11314d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe} 11324d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe 1133bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboestatic int recurse_dir(struct thread_data *td, const char *dirname) 1134bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe{ 1135bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe struct dirent *dir; 1136bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe int ret = 0; 1137bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe DIR *D; 1138bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 1139bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe D = opendir(dirname); 1140bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe if (!D) { 11410ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe char buf[FIO_VERROR_SIZE]; 11420ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe 11430ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe snprintf(buf, FIO_VERROR_SIZE - 1, "opendir(%s)", dirname); 11440ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe td_verror(td, errno, buf); 1145bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe return 1; 1146bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe } 1147bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 1148bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe while ((dir = readdir(D)) != NULL) { 1149bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe char full_path[PATH_MAX]; 1150bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe struct stat sb; 1151bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 1152e85b2b83e39b64ba5cb73fbfddbf3902b6e84925Jens Axboe if (!strcmp(dir->d_name, ".") || !strcmp(dir->d_name, "..")) 1153e85b2b83e39b64ba5cb73fbfddbf3902b6e84925Jens Axboe continue; 115496d32d518a0743a6c050057bc1562e4883e51c5dJens Axboe 1155b9fd788f0e8adacc33316107594e9eb0463743d7Bruce Cran sprintf(full_path, "%s%s%s", dirname, FIO_OS_PATH_SEPARATOR, dir->d_name); 1156bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 1157bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe if (lstat(full_path, &sb) == -1) { 1158bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe if (errno != ENOENT) { 1159bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe td_verror(td, errno, "stat"); 1160bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe return 1; 1161bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe } 1162bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe } 1163bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 1164bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe if (S_ISREG(sb.st_mode)) { 1165bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe add_file(td, full_path); 11662dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe td->o.nr_files++; 1167bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe continue; 1168bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe } 11690ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe if (!S_ISDIR(sb.st_mode)) 11700ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe continue; 1171bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 11725ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe ret = recurse_dir(td, full_path); 11735ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe if (ret) 1174bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe break; 1175bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe } 1176bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 1177bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe closedir(D); 1178bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe return ret; 1179bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe} 1180bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 1181bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboeint add_dir_files(struct thread_data *td, const char *path) 1182bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe{ 11830ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe int ret = recurse_dir(td, path); 11840ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe 11850ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe if (!ret) 11860ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe log_info("fio: opendir added %d files\n", td->o.nr_files); 11870ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe 11880ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe return ret; 1189bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe} 1190cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe 1191cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboevoid dup_files(struct thread_data *td, struct thread_data *org) 1192cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe{ 1193cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe struct fio_file *f; 1194cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe unsigned int i; 11959efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe 11969efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe dprint(FD_FILE, "dup files: %d\n", org->files_index); 1197cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe 1198cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe if (!org->files) 1199cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe return; 1200cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe 12019efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe td->files = malloc(org->files_index * sizeof(f)); 1202cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe 12039efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe for_each_file(org, f, i) { 1204b0fe421a6a0487ff71f6f903908f666d9ca1b327Jens Axboe struct fio_file *__f; 1205b0fe421a6a0487ff71f6f903908f666d9ca1b327Jens Axboe 1206f17c43928c202e557f2f325272c60d9050ee528eJens Axboe __f = smalloc(sizeof(*__f)); 1207c48c0be79173897824d8f439c39374f2588931dcJens Axboe if (!__f) { 1208c48c0be79173897824d8f439c39374f2588931dcJens Axboe log_err("fio: smalloc OOM\n"); 1209c48c0be79173897824d8f439c39374f2588931dcJens Axboe assert(0); 1210c48c0be79173897824d8f439c39374f2588931dcJens Axboe } 121122a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe __f->fd = -1; 121238dad62d5154ffaad445bd0231b271b9a46a5190Jens Axboe fio_file_reset(__f); 12130b9d69ecb14045cf3b2622ae922756b9889b25e6Jens Axboe 1214bc3456fa06cc7777c4764da8c7b1c0fd0a3c3772Aaron Carroll if (f->file_name) { 1215f17c43928c202e557f2f325272c60d9050ee528eJens Axboe __f->file_name = smalloc_strdup(f->file_name); 1216c48c0be79173897824d8f439c39374f2588931dcJens Axboe if (!__f->file_name) { 1217c48c0be79173897824d8f439c39374f2588931dcJens Axboe log_err("fio: smalloc OOM\n"); 1218c48c0be79173897824d8f439c39374f2588931dcJens Axboe assert(0); 1219c48c0be79173897824d8f439c39374f2588931dcJens Axboe } 12200b9d69ecb14045cf3b2622ae922756b9889b25e6Jens Axboe 1221bc3456fa06cc7777c4764da8c7b1c0fd0a3c3772Aaron Carroll __f->filetype = f->filetype; 1222bc3456fa06cc7777c4764da8c7b1c0fd0a3c3772Aaron Carroll } 1223b0fe421a6a0487ff71f6f903908f666d9ca1b327Jens Axboe 1224b0fe421a6a0487ff71f6f903908f666d9ca1b327Jens Axboe td->files[i] = __f; 1225cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe } 1226cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe} 1227f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe 1228f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe/* 1229f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe * Returns the index that matches the filename, or -1 if not there 1230f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe */ 1231f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboeint get_fileno(struct thread_data *td, const char *fname) 1232f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe{ 1233f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe struct fio_file *f; 1234f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe unsigned int i; 1235f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe 1236f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe for_each_file(td, f, i) 1237f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe if (!strcmp(f->file_name, fname)) 1238f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe return i; 1239f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe 1240f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe return -1; 1241f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe} 1242f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe 1243f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe/* 1244f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe * For log usage, where we add/open/close files automatically 1245f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe */ 1246f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboevoid free_release_files(struct thread_data *td) 1247f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe{ 1248f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe close_files(td); 1249f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe td->files_index = 0; 1250f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe td->nr_normal_files = 0; 1251f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe} 1252