filesetup.c revision 4d4e80f2b4260f2c8b37a8612ce655502a799f7a
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> 653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe#include <sys/stat.h> 753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe#include <sys/mman.h> 8bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe#include <sys/types.h> 953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 1053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe#include "fio.h" 11f17c43928c202e557f2f325272c60d9050ee528eJens Axboe#include "smalloc.h" 124906e0b57f2b8cbad02ef2428522281cf6038bddJens Axboe#include "filehash.h" 1353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 147172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboestatic int root_warn; 157172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboe 167bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboestatic int extend_file(struct thread_data *td, struct fio_file *f) 1725205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe{ 18ea443657ce85860b7a0dd2f39f2572d4a09fc885Jens Axboe int r, new_layout = 0, unlink_file = 0, flags; 1925205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe unsigned long long left; 2025205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe unsigned int bs; 2125205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe char *b; 22b2a151925a91f38aeb298d693687a47269ad4e94Jens Axboe 234241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe if (read_only) { 244241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe log_err("fio: refusing extend of file due to read-only\n"); 254241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe return 0; 264241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe } 274241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe 28507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe /* 29507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe * check if we need to lay the file out complete again. fio 30507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe * does that for operations involving reads, or for writes 31507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe * where overwrite is set 32507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe */ 33507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe if (td_read(td) || (td_write(td) && td->o.overwrite)) 34507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe new_layout = 1; 35ea443657ce85860b7a0dd2f39f2572d4a09fc885Jens Axboe if (td_write(td) && !td->o.overwrite) 36ea443657ce85860b7a0dd2f39f2572d4a09fc885Jens Axboe unlink_file = 1; 37507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe 386ae1f57f2cb8661b97b770372eeb3694f6d5a744Jens Axboe if (unlink_file || new_layout) { 39982016d689dc7fedbb09646ba0df7e72a781b164Zhang, Yanmin if ((unlink(f->file_name) < 0) && (errno != ENOENT)) { 407bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe td_verror(td, errno, "unlink"); 417bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe return 1; 427bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } 437bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } 447bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 45507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe flags = O_WRONLY | O_CREAT; 46507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe if (new_layout) 47507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe flags |= O_TRUNC; 48507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe 49ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe dprint(FD_FILE, "open file %s, flags %x\n", f->file_name, flags); 50507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe f->fd = open(f->file_name, flags, 0644); 5153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (f->fd < 0) { 52e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe td_verror(td, errno, "open"); 5353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 1; 5453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 5553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 56fc74ac1d749c977308016eb22c8658a9a5ac7989Shawn Lewis if (!new_layout) 57fc74ac1d749c977308016eb22c8658a9a5ac7989Shawn Lewis goto done; 58fc74ac1d749c977308016eb22c8658a9a5ac7989Shawn Lewis 59ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe dprint(FD_FILE, "truncate file %s, size %llu\n", f->file_name, 60ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe f->real_file_size); 617bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (ftruncate(f->fd, f->real_file_size) == -1) { 62e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe td_verror(td, errno, "ftruncate"); 6353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe goto err; 6453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 6553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 66ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe dprint(FD_FILE, "fallocate file %s, size %llu\n", f->file_name, 67ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe f->real_file_size); 687bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (posix_fallocate(f->fd, 0, f->real_file_size) < 0) { 69e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe td_verror(td, errno, "posix_fallocate"); 7040f8298cd252157fa15d93f8eb470116a94069a0Jens Axboe goto err; 7140f8298cd252157fa15d93f8eb470116a94069a0Jens Axboe } 7240f8298cd252157fa15d93f8eb470116a94069a0Jens Axboe 732dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe b = malloc(td->o.max_bs[DDIR_WRITE]); 742dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe memset(b, 0, td->o.max_bs[DDIR_WRITE]); 7553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 767bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe left = f->real_file_size; 7753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe while (left && !td->terminate) { 782dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe bs = td->o.max_bs[DDIR_WRITE]; 7953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (bs > left) 8053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe bs = left; 8153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 8253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe r = write(f->fd, b, bs); 8353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 8453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (r == (int) bs) { 8553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe left -= bs; 8653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe continue; 8753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } else { 8853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (r < 0) 89e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe td_verror(td, errno, "write"); 9053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe else 91e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe td_verror(td, EIO, "write"); 9253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 9353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe break; 9453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 9553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 9653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 9753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (td->terminate) 9853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe unlink(f->file_name); 992dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe else if (td->o.create_fsync) 10053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe fsync(f->fd); 10153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 10253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe free(b); 103507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboedone: 10453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe close(f->fd); 10553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe f->fd = -1; 10653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 0; 10753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboeerr: 10853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe close(f->fd); 10953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe f->fd = -1; 11053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 1; 11153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe} 11253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 1137bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboestatic unsigned long long get_rand_file_size(struct thread_data *td) 1149c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe{ 1159c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe unsigned long long ret; 1169c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe long r; 1179c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe 1189c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe r = os_random_long(&td->file_size_state); 119d11a531f38b9b612dfb3bd09c89d011dc786f81dljzhang,Yaxin Hu,Jianchao Tang ret = td->o.file_size_low + (unsigned long long) ((double) (td->o.file_size_high - td->o.file_size_low) * (r / (RAND_MAX + 1.0))); 1202dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe ret -= (ret % td->o.rw_min_bs); 1219c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe return ret; 1229c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe} 1239c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe 12453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboestatic int file_size(struct thread_data *td, struct fio_file *f) 12553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{ 12653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe struct stat st; 12753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 1287bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (fstat(f->fd, &st) == -1) { 1297bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe td_verror(td, errno, "fstat"); 1307bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe return 1; 1317bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } 13253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 1337bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe f->real_file_size = st.st_size; 13453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 0; 13553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe} 13653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 13753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboestatic int bdev_size(struct thread_data *td, struct fio_file *f) 13853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{ 13953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe unsigned long long bytes; 14053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe int r; 14153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 14253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe r = blockdev_size(f->fd, &bytes); 14353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (r) { 144e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe td_verror(td, r, "blockdev_size"); 14553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 1; 14653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 14753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 14853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe f->real_file_size = bytes; 14953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 0; 15053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe} 15153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 15253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboestatic int get_file_size(struct thread_data *td, struct fio_file *f) 15353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{ 15453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe int ret = 0; 15553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 156409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe if (f->flags & FIO_SIZE_KNOWN) 157409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe return 0; 158409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe 1597bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (f->filetype == FIO_TYPE_FILE) 1607bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe ret = file_size(td, f); 1617bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe else if (f->filetype == FIO_TYPE_BD) 16253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe ret = bdev_size(td, f); 16353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe else 16453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe f->real_file_size = -1; 16553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 16653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (ret) 16753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return ret; 16853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 16953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (f->file_offset > f->real_file_size) { 1702dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe log_err("%s: offset extends end (%Lu > %Lu)\n", td->o.name, f->file_offset, f->real_file_size); 17153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 1; 17253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 17353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 174409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe f->flags |= FIO_SIZE_KNOWN; 17553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 0; 17653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe} 17753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 178e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboeint file_invalidate_cache(struct thread_data *td, struct fio_file *f) 179e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe{ 180e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe int ret = 0; 181e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe 182ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe dprint(FD_IO, "invalidate cache (%d)\n", td->o.odirect); 183ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe 1842dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe if (td->o.odirect) 185b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe return 0; 186b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe 187e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe /* 188e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe * FIXME: add blockdev flushing too 189e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe */ 190b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe if (f->mmap) 1917bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe ret = madvise(f->mmap, f->io_size, MADV_DONTNEED); 192467d1b6b3ebbfcb7cc0545a882ba8a93ea66752bJens Axboe else if (f->filetype == FIO_TYPE_FILE) 1937bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe ret = fadvise(f->fd, f->file_offset, f->io_size, POSIX_FADV_DONTNEED); 1947e0e25c924d51f23196b3e0ea83b79178fc46823Jens Axboe else if (f->filetype == FIO_TYPE_BD) { 195b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe ret = blockdev_invalidate_cache(f->fd); 1967e0e25c924d51f23196b3e0ea83b79178fc46823Jens Axboe if (ret < 0 && errno == EACCES && geteuid()) { 1977172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboe if (!root_warn) { 1987172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboe log_err("fio: only root may flush block devices. Cache flush bypassed!\n"); 1997172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboe root_warn = 1; 2007172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboe } 2017e0e25c924d51f23196b3e0ea83b79178fc46823Jens Axboe ret = 0; 2027e0e25c924d51f23196b3e0ea83b79178fc46823Jens Axboe } 203b5605e9ded4188ed91faae1a43ecd333a9856f62Jens Axboe } else if (f->filetype == FIO_TYPE_CHAR || f->filetype == FIO_TYPE_PIPE) 204e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe ret = 0; 205e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe 206e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe if (ret < 0) { 207e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe td_verror(td, errno, "invalidate_cache"); 208e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe return 1; 209e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe } 210e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe 211ad2da605a62faf16887970618b434db19594e17bJens Axboe return ret; 212e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe} 213e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe 2146977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboeint generic_close_file(struct thread_data fio_unused *td, struct fio_file *f) 21553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{ 2166977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe int ret = 0; 2176977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe 218ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe dprint(FD_FILE, "fd close %s\n", f->file_name); 2194906e0b57f2b8cbad02ef2428522281cf6038bddJens Axboe 2204906e0b57f2b8cbad02ef2428522281cf6038bddJens Axboe remove_file_hash(f); 2214906e0b57f2b8cbad02ef2428522281cf6038bddJens Axboe 2226977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe if (close(f->fd) < 0) 2236977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe ret = errno; 2246977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe 225b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe f->fd = -1; 2266977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe return ret; 22753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe} 22853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 2294d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboestatic int file_lookup_open(struct fio_file *f, int flags) 23053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{ 23129c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe struct fio_file *__f; 2324d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe int from_hash; 2334d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe 2344d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe __f = lookup_file_hash(f->file_name); 2354d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe if (__f) { 2364d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe /* 2374d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe * racy, need the __f->lock locked 2384d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe */ 2394d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe f->lock = __f->lock; 2404d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe f->lock_owner = __f->lock_owner; 2414d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe f->lock_batch = __f->lock_batch; 2424d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe f->lock_ddir = __f->lock_ddir; 2434d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe f->fd = dup(__f->fd); 2444d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe f->references++; 2454d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe from_hash = 1; 2464d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe } else { 2474d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe f->fd = open(f->file_name, flags, 0600); 2484d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe from_hash = 0; 2494d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe } 2504d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe 2514d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe return from_hash; 2524d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe} 2534d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe 2544d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboeint generic_open_file(struct thread_data *td, struct fio_file *f) 2554d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe{ 256661598287ecc3b8987f312cf8403936552ce686aJens Axboe int is_std = 0; 25753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe int flags = 0; 25829c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe int from_hash = 0; 25953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 260ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe dprint(FD_FILE, "fd open %s\n", f->file_name); 261ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe 262661598287ecc3b8987f312cf8403936552ce686aJens Axboe if (!strcmp(f->file_name, "-")) { 263661598287ecc3b8987f312cf8403936552ce686aJens Axboe if (td_rw(td)) { 264661598287ecc3b8987f312cf8403936552ce686aJens Axboe log_err("fio: can't read/write to stdin/out\n"); 265661598287ecc3b8987f312cf8403936552ce686aJens Axboe return 1; 266661598287ecc3b8987f312cf8403936552ce686aJens Axboe } 267661598287ecc3b8987f312cf8403936552ce686aJens Axboe is_std = 1; 268ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe 269ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe /* 270ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe * move output logging to stderr, if we are writing to stdout 271ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe */ 272ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe if (td_write(td)) 273ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe f_out = stderr; 274661598287ecc3b8987f312cf8403936552ce686aJens Axboe } 275661598287ecc3b8987f312cf8403936552ce686aJens Axboe 2762dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe if (td->o.odirect) 2772fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe flags |= OS_O_DIRECT; 2782dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe if (td->o.sync_io) 2792fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe flags |= O_SYNC; 280ad92396cc21055cee93470dcf65e82ccde03aac5Jens Axboe if (f->filetype != FIO_TYPE_FILE) 281ad92396cc21055cee93470dcf65e82ccde03aac5Jens Axboe flags |= O_NOATIME; 28253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 283056f3459149a7670257350d84b49858718e4a0e6Aaron Carrollopen_again: 284660a1cb5fb9843ec09a04337714e78d63cd557e7Jens Axboe if (td_write(td)) { 2854241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe assert(!read_only); 2864241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe 2872fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe flags |= O_RDWR; 28853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 289af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe if (f->filetype == FIO_TYPE_FILE) 2902fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe flags |= O_CREAT; 2912fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe 292661598287ecc3b8987f312cf8403936552ce686aJens Axboe if (is_std) 293661598287ecc3b8987f312cf8403936552ce686aJens Axboe f->fd = dup(STDOUT_FILENO); 2944d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe else 2954d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe from_hash = file_lookup_open(f, flags); 2962fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe } else { 2974241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe if (f->filetype == FIO_TYPE_CHAR && !read_only) 2982fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe flags |= O_RDWR; 2992fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe else 3002fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe flags |= O_RDONLY; 3012fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe 302661598287ecc3b8987f312cf8403936552ce686aJens Axboe if (is_std) 303661598287ecc3b8987f312cf8403936552ce686aJens Axboe f->fd = dup(STDIN_FILENO); 3044d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe else 3054d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe from_hash = file_lookup_open(f, flags); 30653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 30753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 30853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (f->fd == -1) { 309e4e33258637e55550a0fac59eb3350e8bf06f8e6Jens Axboe char buf[FIO_VERROR_SIZE]; 310e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe int __e = errno; 311e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe 312056f3459149a7670257350d84b49858718e4a0e6Aaron Carroll if (errno == EPERM && (flags & O_NOATIME)) { 313056f3459149a7670257350d84b49858718e4a0e6Aaron Carroll flags &= ~O_NOATIME; 314056f3459149a7670257350d84b49858718e4a0e6Aaron Carroll goto open_again; 315056f3459149a7670257350d84b49858718e4a0e6Aaron Carroll } 316056f3459149a7670257350d84b49858718e4a0e6Aaron Carroll 317e4e33258637e55550a0fac59eb3350e8bf06f8e6Jens Axboe snprintf(buf, sizeof(buf) - 1, "open(%s)", f->file_name); 318e4e33258637e55550a0fac59eb3350e8bf06f8e6Jens Axboe 319e4e33258637e55550a0fac59eb3350e8bf06f8e6Jens Axboe td_verror(td, __e, buf); 32053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 32153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 322b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe if (get_file_size(td, f)) 323b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe goto err; 324b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe 32529c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe if (!from_hash && f->fd != -1) { 32629c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe if (add_file_hash(f)) { 32729c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe int ret; 32829c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe 32929c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe /* 33029c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe * OK to ignore, we haven't done anything with it 33129c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe */ 33229c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe ret = generic_close_file(td, f); 33329c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe goto open_again; 33429c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe } 33529c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe } 3364906e0b57f2b8cbad02ef2428522281cf6038bddJens Axboe 33753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 0; 338b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboeerr: 339b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe close(f->fd); 340b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe return 1; 341b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe} 342b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe 34321972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboeint open_files(struct thread_data *td) 34421972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe{ 34521972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe struct fio_file *f; 346af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe unsigned int i; 347af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe int err = 0; 34821972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe 349ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe dprint(FD_FILE, "open files\n"); 350ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe 35121972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe for_each_file(td, f, i) { 352b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe err = td_io_open_file(td, f); 3539bf27b4530fca07088ab978aea47be79a3d48879Jens Axboe if (err) { 3549bf27b4530fca07088ab978aea47be79a3d48879Jens Axboe if (td->error == EMFILE) { 3559bf27b4530fca07088ab978aea47be79a3d48879Jens Axboe log_err("fio: limited open files to: %d\n", td->nr_open_files); 3569bf27b4530fca07088ab978aea47be79a3d48879Jens Axboe td->o.open_files = td->nr_open_files; 3579bf27b4530fca07088ab978aea47be79a3d48879Jens Axboe err = 0; 3589bf27b4530fca07088ab978aea47be79a3d48879Jens Axboe clear_error(td); 3599bf27b4530fca07088ab978aea47be79a3d48879Jens Axboe } 36021972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe break; 3619bf27b4530fca07088ab978aea47be79a3d48879Jens Axboe } 362b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe 3632dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe if (td->o.open_files == td->nr_open_files) 364b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe break; 36521972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe } 36621972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe 3677abf833d25ab6cc866308fe37483dfe2fde28efcJens Axboe if (!err) 3687abf833d25ab6cc866308fe37483dfe2fde28efcJens Axboe return 0; 3697abf833d25ab6cc866308fe37483dfe2fde28efcJens Axboe 370bdb4e2e99d4a87e5d3677cc09aa1ce92135125a9Jens Axboe for_each_file(td, f, i) 371b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe td_io_close_file(td, f); 3727abf833d25ab6cc866308fe37483dfe2fde28efcJens Axboe 37321972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe return err; 37421972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe} 37521972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe 3767bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe/* 3777bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * open/close all files, so that ->real_file_size gets set 3787bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */ 379bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboestatic int get_file_sizes(struct thread_data *td) 3807bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe{ 3817bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe struct fio_file *f; 3827bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe unsigned int i; 383bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe int err = 0; 3847bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 3857bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe for_each_file(td, f, i) { 386bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe if (td->io_ops->open_file(td, f)) { 38740b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe if (td->error != ENOENT) { 38840b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe log_err("%s\n", td->verror); 38940b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe err = 1; 39040b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe } 391541d66d70b8fbe9860b31307c0760e6d5f4c78a8Jens Axboe clear_error(td); 39207eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe } else { 39307eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe if (td->io_ops->close_file) 39407eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe td->io_ops->close_file(td, f); 39507eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe } 396409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe 397409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe if (f->real_file_size == -1ULL && td->o.size) 398409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe f->real_file_size = td->o.size / td->o.nr_files; 3997bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } 400bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe 401bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe return err; 4027bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe} 4037bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 4047bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe/* 4057bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * Open the files and setup files sizes, creating files if necessary. 4067bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */ 40753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboeint setup_files(struct thread_data *td) 40853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{ 4097bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe unsigned long long total_size, extend_size; 41053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe struct fio_file *f; 411af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe unsigned int i; 412000b080395e45cbe0ce54e75f0e993addbdc8676Jens Axboe int err = 0, need_extend; 41353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 414ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe dprint(FD_FILE, "setup files\n"); 415ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe 41653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe /* 41753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe * if ioengine defines a setup() method, it's responsible for 4187bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * opening the files and setting f->real_file_size to indicate 4197bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * the valid range for that file. 42053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe */ 42153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (td->io_ops->setup) 4227bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe err = td->io_ops->setup(td); 4237bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe else 424bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe err = get_file_sizes(td); 42553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 426f102706350093e60617cc271b128e56c57ab3ce7Jens Axboe if (err) 427f102706350093e60617cc271b128e56c57ab3ce7Jens Axboe return err; 428f102706350093e60617cc271b128e56c57ab3ce7Jens Axboe 4290a7eb121ecb2e4279e9eb8178aa1e554dda40191Jens Axboe /* 4307bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * check sizes. if the files/devices do not exist and the size 4317bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * isn't passed to fio, abort. 4320a7eb121ecb2e4279e9eb8178aa1e554dda40191Jens Axboe */ 4337bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe total_size = 0; 4347bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe for_each_file(td, f, i) { 4357bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (f->real_file_size == -1ULL) 4367bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe total_size = -1ULL; 4377bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe else 4387bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe total_size += f->real_file_size; 4397bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } 4400a7eb121ecb2e4279e9eb8178aa1e554dda40191Jens Axboe 4417bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe /* 4427bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * device/file sizes are zero and no size given, punt 4437bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */ 4441f809d151ddc4a4c348c2e4f6007db510e3e08a2Jens Axboe if ((!total_size || total_size == -1ULL) && !td->o.size && 445aa31f1f108348ba2a8749c73fa8c25f3d4630a7cShawn Lewis !(td->io_ops->flags & FIO_NOIO) && !td->o.fill_device) { 4467bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe log_err("%s: you need to specify size=\n", td->o.name); 447e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe td_verror(td, EINVAL, "total_file_size"); 44853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 1; 44953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 45053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 4517bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe /* 4527bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * now file sizes are known, so we can set ->io_size. if size= is 4537bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * not given, ->io_size is just equal to ->real_file_size. if size 4547bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * is given, ->io_size is size / nr_files. 4557bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */ 4567bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe extend_size = total_size = 0; 4577bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe need_extend = 0; 4587bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe for_each_file(td, f, i) { 459bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang f->file_offset = td->o.start_offset; 460bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang 4617bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (!td->o.file_size_low) { 4627bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe /* 4637bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * no file size range given, file size is equal to 4647bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * total size divided by number of files. if that is 4657bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * zero, set it to the real file size. 4667bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */ 4677bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe f->io_size = td->o.size / td->o.nr_files; 46865bdb10a09222d8b5d213de74824be775772ea8fJens Axboe if (!f->io_size) 469273f8c912d981439049d9b21aa048aaeaa323c5dJens Axboe f->io_size = f->real_file_size - f->file_offset; 4707bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } else if (f->real_file_size < td->o.file_size_low || 4717bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe f->real_file_size > td->o.file_size_high) { 472bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang if (f->file_offset > td->o.file_size_low) 473bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang goto err_offset; 4747bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe /* 4757bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * file size given. if it's fixed, use that. if it's a 4767bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * range, generate a random size in-between. 4777bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */ 4787bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (td->o.file_size_low == td->o.file_size_high) 479bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang f->io_size = td->o.file_size_low - f->file_offset; 4807bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe else 481bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang f->io_size = get_rand_file_size(td) - f->file_offset; 48265bdb10a09222d8b5d213de74824be775772ea8fJens Axboe } else 483bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang f->io_size = f->real_file_size - f->file_offset; 48453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 4857bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (f->io_size == -1ULL) 4867bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe total_size = -1ULL; 4877bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe else 4887bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe total_size += f->io_size; 4897bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 4907bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (f->filetype == FIO_TYPE_FILE && 491bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang (f->io_size + f->file_offset) > f->real_file_size && 4927bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe !(td->io_ops->flags & FIO_DISKLESSIO)) { 4937bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe need_extend++; 494bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang extend_size += (f->io_size + f->file_offset); 4957bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe f->flags |= FIO_FILE_EXTEND; 496bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang } 4977bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } 49853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 4992298290eabbe1017421a6ba0f5de93d8c2b048adljzhang,Yaxin Hu,Jianchao Tang if (!td->o.size || td->o.size > total_size) 5007bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe td->o.size = total_size; 50121972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe 5027bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe /* 5037bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * See if we need to extend some files 5047bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */ 5057bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (need_extend) { 5067bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe temp_stall_ts = 1; 507f627d8ae4dca9de8a72928a7928cf2903e81ad41Jens Axboe log_info("%s: Laying out IO file(s) (%u file(s) / %LuMiB)\n", 5087bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe td->o.name, need_extend, extend_size >> 20); 5097bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 5107bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe for_each_file(td, f, i) { 5117bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (!(f->flags & FIO_FILE_EXTEND)) 5127bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe continue; 5137bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 514409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe assert(f->filetype == FIO_TYPE_FILE); 5157bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe f->flags &= ~FIO_FILE_EXTEND; 516bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang f->real_file_size = (f->io_size + f->file_offset); 5177bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe err = extend_file(td, f); 5187bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (err) 5197bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe break; 5207bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } 5217bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe temp_stall_ts = 0; 5227bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } 5237bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 5247bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (err) 5257bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe return err; 5267bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 5277bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (!td->o.zone_size) 5287bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe td->o.zone_size = td->o.size; 5297bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 530ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe /* 531ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe * iolog already set the total io size, if we read back 532ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe * stored entries. 533ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe */ 534ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe if (!td->o.read_iolog_file) 535ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe td->total_io_size = td->o.size * td->o.loops; 5367bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe return 0; 537bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tangerr_offset: 538bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang log_err("%s: you need to specify valid offset=\n", td->o.name); 539bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang return 1; 54053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe} 54153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 542687270767de17dbad53c50e03e5d73d52505405cJens Axboeint init_random_map(struct thread_data *td) 543687270767de17dbad53c50e03e5d73d52505405cJens Axboe{ 544509eab12448823a8eefbe925804b5308ee63bf5eJens Axboe unsigned long long blocks, num_maps; 545687270767de17dbad53c50e03e5d73d52505405cJens Axboe struct fio_file *f; 546687270767de17dbad53c50e03e5d73d52505405cJens Axboe unsigned int i; 547687270767de17dbad53c50e03e5d73d52505405cJens Axboe 548de8dd119d7d869dd9c90c6d62bf4bededd10642eJens Axboe if (td->o.norandommap || !td_random(td)) 549687270767de17dbad53c50e03e5d73d52505405cJens Axboe return 0; 550687270767de17dbad53c50e03e5d73d52505405cJens Axboe 551687270767de17dbad53c50e03e5d73d52505405cJens Axboe for_each_file(td, f, i) { 552509eab12448823a8eefbe925804b5308ee63bf5eJens Axboe blocks = (f->real_file_size + td->o.rw_min_bs - 1) / (unsigned long long) td->o.rw_min_bs; 553509eab12448823a8eefbe925804b5308ee63bf5eJens Axboe num_maps = (blocks + BLOCKS_PER_MAP-1)/ (unsigned long long) BLOCKS_PER_MAP; 554f17c43928c202e557f2f325272c60d9050ee528eJens Axboe f->file_map = smalloc(num_maps * sizeof(long)); 555687270767de17dbad53c50e03e5d73d52505405cJens Axboe if (!f->file_map) { 556687270767de17dbad53c50e03e5d73d52505405cJens Axboe log_err("fio: failed allocating random map. If running a large number of jobs, try the 'norandommap' option\n"); 557687270767de17dbad53c50e03e5d73d52505405cJens Axboe return 1; 558687270767de17dbad53c50e03e5d73d52505405cJens Axboe } 559687270767de17dbad53c50e03e5d73d52505405cJens Axboe f->num_maps = num_maps; 560687270767de17dbad53c50e03e5d73d52505405cJens Axboe } 561687270767de17dbad53c50e03e5d73d52505405cJens Axboe 562687270767de17dbad53c50e03e5d73d52505405cJens Axboe return 0; 563687270767de17dbad53c50e03e5d73d52505405cJens Axboe} 564687270767de17dbad53c50e03e5d73d52505405cJens Axboe 56553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboevoid close_files(struct thread_data *td) 56653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{ 5670ab8db8943acc6b9ea778735563bfad2a79e8dddJens Axboe struct fio_file *f; 568af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe unsigned int i; 56953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 57024ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe for_each_file(td, f, i) 57124ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe td_io_close_file(td, f); 57224ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe} 57324ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe 57424ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboevoid close_and_free_files(struct thread_data *td) 57524ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe{ 57624ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe struct fio_file *f; 57724ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe unsigned int i; 57824ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe 579ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe dprint(FD_FILE, "close files\n"); 580ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe 5810ab8db8943acc6b9ea778735563bfad2a79e8dddJens Axboe for_each_file(td, f, i) { 582a9b7b3052b35c20e82b8fc909cd546a5fe1ff293Jens Axboe if (td->o.unlink && f->filetype == FIO_TYPE_FILE) 583132ad46d22bcf12da95ad69e03c1b6f23f5e60a9Jens Axboe unlink(f->file_name); 584bdb4e2e99d4a87e5d3677cc09aa1ce92135125a9Jens Axboe 585b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe td_io_close_file(td, f); 586b3dc7f075b85e004f8c681ebb8566475017696f3Jens Axboe 587f17c43928c202e557f2f325272c60d9050ee528eJens Axboe sfree(f->file_name); 588fa1da8653e2177b3cc31a91e963c389f079d4172Jens Axboe f->file_name = NULL; 589fa1da8653e2177b3cc31a91e963c389f079d4172Jens Axboe 590c343981b9874179009a92e4d29eae95cf341843aJens Axboe if (f->file_map) { 591f17c43928c202e557f2f325272c60d9050ee528eJens Axboe sfree(f->file_map); 592c343981b9874179009a92e4d29eae95cf341843aJens Axboe f->file_map = NULL; 593c343981b9874179009a92e4d29eae95cf341843aJens Axboe } 59478d99e6a2695d3a7936c5dd02f996f13a30309b1Jens Axboe sfree(f); 59553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 596b4a6a59a939f0e6554632de311e7d1d1b7633ccfJens Axboe 5972dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe td->o.filename = NULL; 598cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe free(td->files); 599b4a6a59a939f0e6554632de311e7d1d1b7633ccfJens Axboe td->files = NULL; 6002dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe td->o.nr_files = 0; 60153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe} 602af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe 603e3bab463d4397e3378d8c7437e31de8aaf861a4fJens Axboestatic void get_file_type(struct fio_file *f) 604af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe{ 605af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe struct stat sb; 606af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe 607661598287ecc3b8987f312cf8403936552ce686aJens Axboe if (!strcmp(f->file_name, "-")) 608661598287ecc3b8987f312cf8403936552ce686aJens Axboe f->filetype = FIO_TYPE_PIPE; 609661598287ecc3b8987f312cf8403936552ce686aJens Axboe else 610661598287ecc3b8987f312cf8403936552ce686aJens Axboe f->filetype = FIO_TYPE_FILE; 611af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe 612e3bab463d4397e3378d8c7437e31de8aaf861a4fJens Axboe if (!lstat(f->file_name, &sb)) { 613af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe if (S_ISBLK(sb.st_mode)) 614af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe f->filetype = FIO_TYPE_BD; 615af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe else if (S_ISCHR(sb.st_mode)) 616af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe f->filetype = FIO_TYPE_CHAR; 617b5605e9ded4188ed91faae1a43ecd333a9856f62Jens Axboe else if (S_ISFIFO(sb.st_mode)) 618b5605e9ded4188ed91faae1a43ecd333a9856f62Jens Axboe f->filetype = FIO_TYPE_PIPE; 619af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe } 620af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe} 621af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe 622f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboeint add_file(struct thread_data *td, const char *fname) 623af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe{ 6247b4e4fe5e6fa26f82f9169c18ec70c08d0805ca9Jens Axboe int cur_files = td->files_index; 625bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe char file_name[PATH_MAX]; 626af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe struct fio_file *f; 627bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe int len = 0; 628af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe 629ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe dprint(FD_FILE, "add file %s\n", fname); 630ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe 631f17c43928c202e557f2f325272c60d9050ee528eJens Axboe f = smalloc(sizeof(*f)); 632af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe f->fd = -1; 633bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe 634126d65c6fc97d6acdc568aa5a969c012018daf15Jens Axboe td->files = realloc(td->files, (cur_files + 1) * sizeof(f)); 635126d65c6fc97d6acdc568aa5a969c012018daf15Jens Axboe 636126d65c6fc97d6acdc568aa5a969c012018daf15Jens Axboe td->files[cur_files] = f; 637126d65c6fc97d6acdc568aa5a969c012018daf15Jens Axboe 63807eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe /* 63907eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe * init function, io engine may not be loaded yet 64007eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe */ 64107eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe if (td->io_ops && (td->io_ops->flags & FIO_DISKLESSIO)) 64207eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe f->real_file_size = -1ULL; 64307eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe 644bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe if (td->o.directory) 645bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe len = sprintf(file_name, "%s/", td->o.directory); 646bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe 647bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe sprintf(file_name + len, "%s", fname); 648f17c43928c202e557f2f325272c60d9050ee528eJens Axboe f->file_name = smalloc_strdup(file_name); 649af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe 650e3bab463d4397e3378d8c7437e31de8aaf861a4fJens Axboe get_file_type(f); 651af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe 6524d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe switch (td->o.file_lock_mode) { 6534d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe case FILE_LOCK_NONE: 6544d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe break; 6554d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe case FILE_LOCK_READWRITE: 6564d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe f->lock = fio_mutex_rw_init(); 6574d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe break; 6584d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe case FILE_LOCK_EXCLUSIVE: 6594d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe f->lock = fio_mutex_init(1); 6604d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe break; 6614d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe default: 6624d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe log_err("fio: unknown lock mode: %d\n", td->o.file_lock_mode); 6634d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe assert(0); 6644d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe } 66529c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe 6667b4e4fe5e6fa26f82f9169c18ec70c08d0805ca9Jens Axboe td->files_index++; 6671549441cdfecb2c1a4a8b8d494253859d67b4344Jens Axboe if (f->filetype == FIO_TYPE_FILE) 6681549441cdfecb2c1a4a8b8d494253859d67b4344Jens Axboe td->nr_normal_files++; 669f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe 670f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe return cur_files; 671af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe} 6720ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe 6730ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboevoid get_file(struct fio_file *f) 6740ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe{ 6758172fe972f3a79d42f34d7f6e259ed3f7f800316Jens Axboe dprint(FD_FILE, "get file %s, ref=%d\n", f->file_name, f->references); 67697af62cec418cd722fb43c6010d6430534e12353Jens Axboe assert(f->flags & FIO_FILE_OPEN); 6770ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe f->references++; 6780ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe} 6790ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe 6806977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboeint put_file(struct thread_data *td, struct fio_file *f) 6810ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe{ 6826977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe int ret = 0; 6836977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe 6848172fe972f3a79d42f34d7f6e259ed3f7f800316Jens Axboe dprint(FD_FILE, "put file %s, ref=%d\n", f->file_name, f->references); 685ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe 6860ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe if (!(f->flags & FIO_FILE_OPEN)) 6876977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe return 0; 6880ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe 6890ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe assert(f->references); 6900ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe if (--f->references) 6916977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe return 0; 6920ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe 693d424d4dd657eaf4aeb8ffb07a550a5f64940f41aJens Axboe if (should_fsync(td) && td->o.fsync_on_close) 694ebb1415f729c123b8a13bcbd667bf4b4cc95b4d4Jens Axboe fsync(f->fd); 695ebb1415f729c123b8a13bcbd667bf4b4cc95b4d4Jens Axboe 6960ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe if (td->io_ops->close_file) 6976977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe ret = td->io_ops->close_file(td, f); 6981020a139beff50faf1bb18f761b024b664a09e14Jens Axboe 6990ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe td->nr_open_files--; 7000ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe f->flags &= ~FIO_FILE_OPEN; 7016977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe return ret; 7020ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe} 703bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 7044d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboevoid lock_file(struct thread_data *td, struct fio_file *f, enum fio_ddir ddir) 705b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe{ 7064d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe if (!f->lock || td->o.file_lock_mode == FILE_LOCK_NONE) 7074d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe return; 70829c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe 7094d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe if (f->lock_owner == td && f->lock_batch--) 7104d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe return; 7114d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe 7124d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe if (td->o.file_lock_mode == FILE_LOCK_READWRITE) { 7134d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe if (ddir == DDIR_READ) 7144d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe fio_mutex_down_read(f->lock); 7154d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe else 7164d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe fio_mutex_down_write(f->lock); 7174d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe } else if (td->o.file_lock_mode == FILE_LOCK_EXCLUSIVE) 7184d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe fio_mutex_down(f->lock); 7194d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe 7204d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe f->lock_owner = td; 7214d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe f->lock_batch = td->o.lockfile_batch; 7224d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe f->lock_ddir = ddir; 723b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe} 724b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe 7254d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboevoid unlock_file(struct thread_data *td, struct fio_file *f) 726b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe{ 7274d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe if (!f->lock || td->o.file_lock_mode == FILE_LOCK_NONE) 7284d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe return; 7294d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe if (f->lock_batch) 7304d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe return; 7314d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe 7324d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe if (td->o.file_lock_mode == FILE_LOCK_READWRITE) { 7334d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe const int is_read = f->lock_ddir == DDIR_READ; 7344d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe int val = fio_mutex_getval(f->lock); 73529c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe 7364d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe if ((is_read && val == 1) || (!is_read && val == -1)) 7374d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe f->lock_owner = NULL; 73829c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe 7394d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe if (is_read) 7404d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe fio_mutex_up_read(f->lock); 7414d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe else 7424d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe fio_mutex_up_write(f->lock); 7434d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe } else if (td->o.file_lock_mode == FILE_LOCK_EXCLUSIVE) { 7444d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe int val = fio_mutex_getval(f->lock); 7454d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe 7464d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe if (val == 0) 7474d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe f->lock_owner = NULL; 7484d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe 7494d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe fio_mutex_up(f->lock); 75029c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe } 751b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe} 752b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe 7534d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboevoid unlock_file_all(struct thread_data *td, struct fio_file *f) 7544d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe{ 7554d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe if (f->lock_owner != td) 7564d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe return; 7574d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe 7584d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe f->lock_batch = 0; 7594d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe unlock_file(td, f); 7604d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe} 7614d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe 762bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboestatic int recurse_dir(struct thread_data *td, const char *dirname) 763bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe{ 764bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe struct dirent *dir; 765bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe int ret = 0; 766bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe DIR *D; 767bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 768bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe D = opendir(dirname); 769bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe if (!D) { 7700ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe char buf[FIO_VERROR_SIZE]; 7710ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe 7720ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe snprintf(buf, FIO_VERROR_SIZE - 1, "opendir(%s)", dirname); 7730ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe td_verror(td, errno, buf); 774bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe return 1; 775bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe } 776bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 777bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe while ((dir = readdir(D)) != NULL) { 778bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe char full_path[PATH_MAX]; 779bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe struct stat sb; 780bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 781e85b2b83e39b64ba5cb73fbfddbf3902b6e84925Jens Axboe if (!strcmp(dir->d_name, ".") || !strcmp(dir->d_name, "..")) 782e85b2b83e39b64ba5cb73fbfddbf3902b6e84925Jens Axboe continue; 78396d32d518a0743a6c050057bc1562e4883e51c5dJens Axboe 784bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe sprintf(full_path, "%s/%s", dirname, dir->d_name); 785bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 786bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe if (lstat(full_path, &sb) == -1) { 787bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe if (errno != ENOENT) { 788bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe td_verror(td, errno, "stat"); 789bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe return 1; 790bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe } 791bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe } 792bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 793bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe if (S_ISREG(sb.st_mode)) { 794bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe add_file(td, full_path); 7952dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe td->o.nr_files++; 796bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe continue; 797bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe } 7980ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe if (!S_ISDIR(sb.st_mode)) 7990ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe continue; 800bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 801bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe if ((ret = recurse_dir(td, full_path)) != 0) 802bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe break; 803bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe } 804bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 805bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe closedir(D); 806bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe return ret; 807bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe} 808bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 809bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboeint add_dir_files(struct thread_data *td, const char *path) 810bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe{ 8110ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe int ret = recurse_dir(td, path); 8120ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe 8130ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe if (!ret) 8140ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe log_info("fio: opendir added %d files\n", td->o.nr_files); 8150ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe 8160ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe return ret; 817bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe} 818cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe 819cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboevoid dup_files(struct thread_data *td, struct thread_data *org) 820cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe{ 821cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe struct fio_file *f; 822cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe unsigned int i; 823cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe size_t bytes; 824cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe 825cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe if (!org->files) 826cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe return; 827cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe 828b0fe421a6a0487ff71f6f903908f666d9ca1b327Jens Axboe bytes = org->files_index * sizeof(f); 829cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe td->files = malloc(bytes); 830cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe memcpy(td->files, org->files, bytes); 831cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe 832cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe for_each_file(td, f, i) { 833b0fe421a6a0487ff71f6f903908f666d9ca1b327Jens Axboe struct fio_file *__f; 834b0fe421a6a0487ff71f6f903908f666d9ca1b327Jens Axboe 835f17c43928c202e557f2f325272c60d9050ee528eJens Axboe __f = smalloc(sizeof(*__f)); 836b0fe421a6a0487ff71f6f903908f666d9ca1b327Jens Axboe 837cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe if (f->file_name) 838f17c43928c202e557f2f325272c60d9050ee528eJens Axboe __f->file_name = smalloc_strdup(f->file_name); 839b0fe421a6a0487ff71f6f903908f666d9ca1b327Jens Axboe 840b0fe421a6a0487ff71f6f903908f666d9ca1b327Jens Axboe td->files[i] = __f; 841cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe } 842cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe} 843f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe 844f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe/* 845f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe * Returns the index that matches the filename, or -1 if not there 846f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe */ 847f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboeint get_fileno(struct thread_data *td, const char *fname) 848f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe{ 849f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe struct fio_file *f; 850f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe unsigned int i; 851f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe 852f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe for_each_file(td, f, i) 853f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe if (!strcmp(f->file_name, fname)) 854f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe return i; 855f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe 856f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe return -1; 857f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe} 858f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe 859f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe/* 860f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe * For log usage, where we add/open/close files automatically 861f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe */ 862f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboevoid free_release_files(struct thread_data *td) 863f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe{ 864f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe close_files(td); 865f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe td->files_index = 0; 866f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe td->nr_normal_files = 0; 867f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe} 868