filesetup.c revision ad92396cc21055cee93470dcf65e82ccde03aac5
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" 1153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 127172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboestatic int root_warn; 137172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboe 147bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboestatic int extend_file(struct thread_data *td, struct fio_file *f) 1525205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe{ 16ea443657ce85860b7a0dd2f39f2572d4a09fc885Jens Axboe int r, new_layout = 0, unlink_file = 0, flags; 1725205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe unsigned long long left; 1825205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe unsigned int bs; 1925205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe char *b; 20b2a151925a91f38aeb298d693687a47269ad4e94Jens Axboe 214241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe if (read_only) { 224241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe log_err("fio: refusing extend of file due to read-only\n"); 234241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe return 0; 244241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe } 254241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe 26507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe /* 27507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe * check if we need to lay the file out complete again. fio 28507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe * does that for operations involving reads, or for writes 29507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe * where overwrite is set 30507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe */ 31507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe if (td_read(td) || (td_write(td) && td->o.overwrite)) 32507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe new_layout = 1; 33ea443657ce85860b7a0dd2f39f2572d4a09fc885Jens Axboe if (td_write(td) && !td->o.overwrite) 34ea443657ce85860b7a0dd2f39f2572d4a09fc885Jens Axboe unlink_file = 1; 35507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe 36ea443657ce85860b7a0dd2f39f2572d4a09fc885Jens Axboe if ((unlink_file || new_layout) && (f->flags & FIO_FILE_EXISTS)) { 377bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (unlink(f->file_name) < 0) { 387bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe td_verror(td, errno, "unlink"); 397bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe return 1; 407bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } 417bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } 427bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 43507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe flags = O_WRONLY | O_CREAT; 44507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe if (new_layout) 45507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe flags |= O_TRUNC; 46507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe 47507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe f->fd = open(f->file_name, flags, 0644); 4853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (f->fd < 0) { 49e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe td_verror(td, errno, "open"); 5053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 1; 5153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 5253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 537bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (ftruncate(f->fd, f->real_file_size) == -1) { 54e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe td_verror(td, errno, "ftruncate"); 5553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe goto err; 5653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 5753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 58e8be2ad711db813537a1f2a6a6939c42909ba5ccJens Axboe if (!new_layout) 59e8be2ad711db813537a1f2a6a6939c42909ba5ccJens Axboe goto done; 60e8be2ad711db813537a1f2a6a6939c42909ba5ccJens Axboe 617bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (posix_fallocate(f->fd, 0, f->real_file_size) < 0) { 62e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe td_verror(td, errno, "posix_fallocate"); 6340f8298cd252157fa15d93f8eb470116a94069a0Jens Axboe goto err; 6440f8298cd252157fa15d93f8eb470116a94069a0Jens Axboe } 6540f8298cd252157fa15d93f8eb470116a94069a0Jens Axboe 662dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe b = malloc(td->o.max_bs[DDIR_WRITE]); 672dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe memset(b, 0, td->o.max_bs[DDIR_WRITE]); 6853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 697bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe left = f->real_file_size; 7053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe while (left && !td->terminate) { 712dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe bs = td->o.max_bs[DDIR_WRITE]; 7253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (bs > left) 7353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe bs = left; 7453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 7553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe r = write(f->fd, b, bs); 7653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 7753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (r == (int) bs) { 7853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe left -= bs; 7953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe continue; 8053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } else { 8153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (r < 0) 82e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe td_verror(td, errno, "write"); 8353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe else 84e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe td_verror(td, EIO, "write"); 8553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 8653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe break; 8753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 8853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 8953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 9053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (td->terminate) 9153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe unlink(f->file_name); 922dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe else if (td->o.create_fsync) 9353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe fsync(f->fd); 9453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 9553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe free(b); 96507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboedone: 9753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe close(f->fd); 9853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe f->fd = -1; 9953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 0; 10053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboeerr: 10153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe close(f->fd); 10253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe f->fd = -1; 10353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 1; 10453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe} 10553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 1067bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboestatic unsigned long long get_rand_file_size(struct thread_data *td) 1079c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe{ 1089c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe unsigned long long ret; 1099c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe long r; 1109c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe 1119c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe r = os_random_long(&td->file_size_state); 112d11a531f38b9b612dfb3bd09c89d011dc786f81dljzhang,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))); 1132dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe ret -= (ret % td->o.rw_min_bs); 1149c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe return ret; 1159c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe} 1169c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe 11753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboestatic int file_size(struct thread_data *td, struct fio_file *f) 11853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{ 11953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe struct stat st; 12053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 1217bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (fstat(f->fd, &st) == -1) { 1227bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe td_verror(td, errno, "fstat"); 1237bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe return 1; 1247bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } 12553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 1267bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe f->real_file_size = st.st_size; 12753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 0; 12853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe} 12953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 13053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboestatic int bdev_size(struct thread_data *td, struct fio_file *f) 13153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{ 13253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe unsigned long long bytes; 13353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe int r; 13453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 13553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe r = blockdev_size(f->fd, &bytes); 13653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (r) { 137e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe td_verror(td, r, "blockdev_size"); 13853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 1; 13953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 14053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 14153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe f->real_file_size = bytes; 14253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 0; 14353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe} 14453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 14553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboestatic int get_file_size(struct thread_data *td, struct fio_file *f) 14653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{ 14753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe int ret = 0; 14853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 149409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe if (f->flags & FIO_SIZE_KNOWN) 150409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe return 0; 151409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe 1527bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (f->filetype == FIO_TYPE_FILE) 1537bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe ret = file_size(td, f); 1547bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe else if (f->filetype == FIO_TYPE_BD) 15553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe ret = bdev_size(td, f); 15653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe else 15753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe f->real_file_size = -1; 15853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 15953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (ret) 16053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return ret; 16153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 16253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (f->file_offset > f->real_file_size) { 1632dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe log_err("%s: offset extends end (%Lu > %Lu)\n", td->o.name, f->file_offset, f->real_file_size); 16453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 1; 16553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 16653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 167409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe f->flags |= FIO_SIZE_KNOWN; 16853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 0; 16953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe} 17053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 171e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboeint file_invalidate_cache(struct thread_data *td, struct fio_file *f) 172e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe{ 173e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe int ret = 0; 174e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe 1752dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe if (td->o.odirect) 176b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe return 0; 177b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe 178e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe /* 179e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe * FIXME: add blockdev flushing too 180e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe */ 181b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe if (f->mmap) 1827bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe ret = madvise(f->mmap, f->io_size, MADV_DONTNEED); 183467d1b6b3ebbfcb7cc0545a882ba8a93ea66752bJens Axboe else if (f->filetype == FIO_TYPE_FILE) 1847bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe ret = fadvise(f->fd, f->file_offset, f->io_size, POSIX_FADV_DONTNEED); 1857e0e25c924d51f23196b3e0ea83b79178fc46823Jens Axboe else if (f->filetype == FIO_TYPE_BD) { 186b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe ret = blockdev_invalidate_cache(f->fd); 1877e0e25c924d51f23196b3e0ea83b79178fc46823Jens Axboe if (ret < 0 && errno == EACCES && geteuid()) { 1887172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboe if (!root_warn) { 1897172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboe log_err("fio: only root may flush block devices. Cache flush bypassed!\n"); 1907172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboe root_warn = 1; 1917172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboe } 1927e0e25c924d51f23196b3e0ea83b79178fc46823Jens Axboe ret = 0; 1937e0e25c924d51f23196b3e0ea83b79178fc46823Jens Axboe } 194b5605e9ded4188ed91faae1a43ecd333a9856f62Jens Axboe } else if (f->filetype == FIO_TYPE_CHAR || f->filetype == FIO_TYPE_PIPE) 195e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe ret = 0; 196e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe 197e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe if (ret < 0) { 198e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe td_verror(td, errno, "invalidate_cache"); 199e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe return 1; 200e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe } 201e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe 202ad2da605a62faf16887970618b434db19594e17bJens Axboe return ret; 203e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe} 204e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe 205b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboevoid generic_close_file(struct thread_data fio_unused *td, struct fio_file *f) 20653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{ 207b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe close(f->fd); 208b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe f->fd = -1; 20953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe} 21053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 211b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboeint generic_open_file(struct thread_data *td, struct fio_file *f) 21253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{ 213661598287ecc3b8987f312cf8403936552ce686aJens Axboe int is_std = 0; 21453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe int flags = 0; 21553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 216661598287ecc3b8987f312cf8403936552ce686aJens Axboe if (!strcmp(f->file_name, "-")) { 217661598287ecc3b8987f312cf8403936552ce686aJens Axboe if (td_rw(td)) { 218661598287ecc3b8987f312cf8403936552ce686aJens Axboe log_err("fio: can't read/write to stdin/out\n"); 219661598287ecc3b8987f312cf8403936552ce686aJens Axboe return 1; 220661598287ecc3b8987f312cf8403936552ce686aJens Axboe } 221661598287ecc3b8987f312cf8403936552ce686aJens Axboe is_std = 1; 222ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe 223ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe /* 224ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe * move output logging to stderr, if we are writing to stdout 225ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe */ 226ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe if (td_write(td)) 227ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe f_out = stderr; 228661598287ecc3b8987f312cf8403936552ce686aJens Axboe } 229661598287ecc3b8987f312cf8403936552ce686aJens Axboe 2302dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe if (td->o.odirect) 2312fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe flags |= OS_O_DIRECT; 2322dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe if (td->o.sync_io) 2332fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe flags |= O_SYNC; 234ad92396cc21055cee93470dcf65e82ccde03aac5Jens Axboe if (f->filetype != FIO_TYPE_FILE) 235ad92396cc21055cee93470dcf65e82ccde03aac5Jens Axboe flags |= O_NOATIME; 23653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 237660a1cb5fb9843ec09a04337714e78d63cd557e7Jens Axboe if (td_write(td)) { 2384241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe assert(!read_only); 2394241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe 2402fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe flags |= O_RDWR; 24153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 242af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe if (f->filetype == FIO_TYPE_FILE) 2432fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe flags |= O_CREAT; 2442fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe 245661598287ecc3b8987f312cf8403936552ce686aJens Axboe if (is_std) 246661598287ecc3b8987f312cf8403936552ce686aJens Axboe f->fd = dup(STDOUT_FILENO); 247661598287ecc3b8987f312cf8403936552ce686aJens Axboe else 248661598287ecc3b8987f312cf8403936552ce686aJens Axboe f->fd = open(f->file_name, flags, 0600); 2492fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe } else { 2504241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe if (f->filetype == FIO_TYPE_CHAR && !read_only) 2512fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe flags |= O_RDWR; 2522fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe else 2532fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe flags |= O_RDONLY; 2542fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe 255661598287ecc3b8987f312cf8403936552ce686aJens Axboe if (is_std) 256661598287ecc3b8987f312cf8403936552ce686aJens Axboe f->fd = dup(STDIN_FILENO); 257661598287ecc3b8987f312cf8403936552ce686aJens Axboe else 258661598287ecc3b8987f312cf8403936552ce686aJens Axboe f->fd = open(f->file_name, flags); 25953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 26053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 26153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (f->fd == -1) { 262e4e33258637e55550a0fac59eb3350e8bf06f8e6Jens Axboe char buf[FIO_VERROR_SIZE]; 263e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe int __e = errno; 264e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe 265e4e33258637e55550a0fac59eb3350e8bf06f8e6Jens Axboe snprintf(buf, sizeof(buf) - 1, "open(%s)", f->file_name); 266e4e33258637e55550a0fac59eb3350e8bf06f8e6Jens Axboe 267e4e33258637e55550a0fac59eb3350e8bf06f8e6Jens Axboe td_verror(td, __e, buf); 26853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 26953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 270b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe if (get_file_size(td, f)) 271b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe goto err; 272b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe 27353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 0; 274b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboeerr: 275b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe close(f->fd); 276b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe return 1; 277b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe} 278b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe 27921972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboeint open_files(struct thread_data *td) 28021972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe{ 28121972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe struct fio_file *f; 282af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe unsigned int i; 283af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe int err = 0; 28421972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe 28521972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe for_each_file(td, f, i) { 286b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe err = td_io_open_file(td, f); 2879bf27b4530fca07088ab978aea47be79a3d48879Jens Axboe if (err) { 2889bf27b4530fca07088ab978aea47be79a3d48879Jens Axboe if (td->error == EMFILE) { 2899bf27b4530fca07088ab978aea47be79a3d48879Jens Axboe log_err("fio: limited open files to: %d\n", td->nr_open_files); 2909bf27b4530fca07088ab978aea47be79a3d48879Jens Axboe td->o.open_files = td->nr_open_files; 2919bf27b4530fca07088ab978aea47be79a3d48879Jens Axboe err = 0; 2929bf27b4530fca07088ab978aea47be79a3d48879Jens Axboe clear_error(td); 2939bf27b4530fca07088ab978aea47be79a3d48879Jens Axboe } 29421972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe break; 2959bf27b4530fca07088ab978aea47be79a3d48879Jens Axboe } 296b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe 2972dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe if (td->o.open_files == td->nr_open_files) 298b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe break; 29921972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe } 30021972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe 3017abf833d25ab6cc866308fe37483dfe2fde28efcJens Axboe if (!err) 3027abf833d25ab6cc866308fe37483dfe2fde28efcJens Axboe return 0; 3037abf833d25ab6cc866308fe37483dfe2fde28efcJens Axboe 304bdb4e2e99d4a87e5d3677cc09aa1ce92135125a9Jens Axboe for_each_file(td, f, i) 305b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe td_io_close_file(td, f); 3067abf833d25ab6cc866308fe37483dfe2fde28efcJens Axboe 30721972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe return err; 30821972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe} 30921972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe 3107bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe/* 3117bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * open/close all files, so that ->real_file_size gets set 3127bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */ 313bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboestatic int get_file_sizes(struct thread_data *td) 3147bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe{ 3157bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe struct fio_file *f; 3167bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe unsigned int i; 317bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe int err = 0; 3187bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 3197bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe for_each_file(td, f, i) { 320bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe if (td->io_ops->open_file(td, f)) { 32140b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe if (td->error != ENOENT) { 32240b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe log_err("%s\n", td->verror); 32340b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe err = 1; 32440b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe } 325541d66d70b8fbe9860b31307c0760e6d5f4c78a8Jens Axboe clear_error(td); 32607eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe } else { 32707eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe if (td->io_ops->close_file) 32807eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe td->io_ops->close_file(td, f); 32907eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe } 330409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe 331409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe if (f->real_file_size == -1ULL && td->o.size) 332409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe f->real_file_size = td->o.size / td->o.nr_files; 3337bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } 334bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe 335bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe return err; 3367bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe} 3377bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 3387bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe/* 3397bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * Open the files and setup files sizes, creating files if necessary. 3407bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */ 34153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboeint setup_files(struct thread_data *td) 34253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{ 3437bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe unsigned long long total_size, extend_size; 34453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe struct fio_file *f; 345af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe unsigned int i; 346000b080395e45cbe0ce54e75f0e993addbdc8676Jens Axboe int err = 0, need_extend; 34753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 34853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe /* 34953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe * if ioengine defines a setup() method, it's responsible for 3507bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * opening the files and setting f->real_file_size to indicate 3517bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * the valid range for that file. 35253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe */ 35353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (td->io_ops->setup) 3547bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe err = td->io_ops->setup(td); 3557bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe else 356bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe err = get_file_sizes(td); 35753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 358f102706350093e60617cc271b128e56c57ab3ce7Jens Axboe if (err) 359f102706350093e60617cc271b128e56c57ab3ce7Jens Axboe return err; 360f102706350093e60617cc271b128e56c57ab3ce7Jens Axboe 3610a7eb121ecb2e4279e9eb8178aa1e554dda40191Jens Axboe /* 3627bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * check sizes. if the files/devices do not exist and the size 3637bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * isn't passed to fio, abort. 3640a7eb121ecb2e4279e9eb8178aa1e554dda40191Jens Axboe */ 3657bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe total_size = 0; 3667bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe for_each_file(td, f, i) { 3677bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (f->real_file_size == -1ULL) 3687bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe total_size = -1ULL; 3697bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe else 3707bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe total_size += f->real_file_size; 3717bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } 3720a7eb121ecb2e4279e9eb8178aa1e554dda40191Jens Axboe 3737bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe /* 3747bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * device/file sizes are zero and no size given, punt 3757bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */ 376409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe if ((!total_size || total_size == -1ULL) && !td->o.size) { 3777bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe log_err("%s: you need to specify size=\n", td->o.name); 378e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe td_verror(td, EINVAL, "total_file_size"); 37953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 1; 38053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 38153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 3827bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe /* 3837bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * now file sizes are known, so we can set ->io_size. if size= is 3847bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * not given, ->io_size is just equal to ->real_file_size. if size 3857bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * is given, ->io_size is size / nr_files. 3867bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */ 3877bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe extend_size = total_size = 0; 3887bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe need_extend = 0; 3897bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe for_each_file(td, f, i) { 390bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang f->file_offset = td->o.start_offset; 391bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang 3927bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (!td->o.file_size_low) { 3937bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe /* 3947bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * no file size range given, file size is equal to 3957bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * total size divided by number of files. if that is 3967bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * zero, set it to the real file size. 3977bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */ 3987bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe f->io_size = td->o.size / td->o.nr_files; 399bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang if (!f->io_size) { 400bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang if (f->file_offset > f->real_file_size) 401bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang goto err_offset; 402bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang f->io_size = f->real_file_size - f->file_offset; 403bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang } 4047bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } else if (f->real_file_size < td->o.file_size_low || 4057bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe f->real_file_size > td->o.file_size_high) { 406bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang if (f->file_offset > td->o.file_size_low) 407bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang goto err_offset; 4087bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe /* 4097bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * file size given. if it's fixed, use that. if it's a 4107bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * range, generate a random size in-between. 4117bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */ 4127bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (td->o.file_size_low == td->o.file_size_high) 413bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang f->io_size = td->o.file_size_low - f->file_offset; 4147bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe else 415bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang f->io_size = get_rand_file_size(td) - f->file_offset; 416bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang } else if (f->file_offset > f->real_file_size) 417bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang goto err_offset; 418bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang else 419bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang f->io_size = f->real_file_size - f->file_offset; 42053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 4217bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (f->io_size == -1ULL) 4227bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe total_size = -1ULL; 4237bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe else 4247bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe total_size += f->io_size; 4257bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 4267bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (f->filetype == FIO_TYPE_FILE && 427bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang (f->io_size + f->file_offset) > f->real_file_size && 4287bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe !(td->io_ops->flags & FIO_DISKLESSIO)) { 4297bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe need_extend++; 430bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang extend_size += (f->io_size + f->file_offset); 4317bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe f->flags |= FIO_FILE_EXTEND; 432bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang } 4337bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } 43453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 4352298290eabbe1017421a6ba0f5de93d8c2b048adljzhang,Yaxin Hu,Jianchao Tang if (!td->o.size || td->o.size > total_size) 4367bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe td->o.size = total_size; 43721972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe 4387bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe /* 4397bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * See if we need to extend some files 4407bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */ 4417bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (need_extend) { 4427bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe temp_stall_ts = 1; 443f627d8ae4dca9de8a72928a7928cf2903e81ad41Jens Axboe log_info("%s: Laying out IO file(s) (%u file(s) / %LuMiB)\n", 4447bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe td->o.name, need_extend, extend_size >> 20); 4457bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 4467bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe for_each_file(td, f, i) { 4477bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (!(f->flags & FIO_FILE_EXTEND)) 4487bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe continue; 4497bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 450409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe assert(f->filetype == FIO_TYPE_FILE); 4517bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe f->flags &= ~FIO_FILE_EXTEND; 452bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang f->real_file_size = (f->io_size + f->file_offset); 4537bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe err = extend_file(td, f); 4547bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (err) 4557bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe break; 4567bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } 4577bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe temp_stall_ts = 0; 4587bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } 4597bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 4607bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (err) 4617bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe return err; 4627bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 4637bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (!td->o.zone_size) 4647bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe td->o.zone_size = td->o.size; 4657bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 466ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe /* 467ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe * iolog already set the total io size, if we read back 468ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe * stored entries. 469ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe */ 470ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe if (!td->o.read_iolog_file) 471ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe td->total_io_size = td->o.size * td->o.loops; 4727bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe return 0; 473bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tangerr_offset: 474bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang log_err("%s: you need to specify valid offset=\n", td->o.name); 475bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang return 1; 47653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe} 47753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 478687270767de17dbad53c50e03e5d73d52505405cJens Axboeint init_random_map(struct thread_data *td) 479687270767de17dbad53c50e03e5d73d52505405cJens Axboe{ 480687270767de17dbad53c50e03e5d73d52505405cJens Axboe int num_maps, blocks; 481687270767de17dbad53c50e03e5d73d52505405cJens Axboe struct fio_file *f; 482687270767de17dbad53c50e03e5d73d52505405cJens Axboe unsigned int i; 483687270767de17dbad53c50e03e5d73d52505405cJens Axboe 484687270767de17dbad53c50e03e5d73d52505405cJens Axboe if (td->o.norandommap) 485687270767de17dbad53c50e03e5d73d52505405cJens Axboe return 0; 486687270767de17dbad53c50e03e5d73d52505405cJens Axboe 487687270767de17dbad53c50e03e5d73d52505405cJens Axboe for_each_file(td, f, i) { 488687270767de17dbad53c50e03e5d73d52505405cJens Axboe blocks = (f->real_file_size + td->o.rw_min_bs - 1) / td->o.rw_min_bs; 489687270767de17dbad53c50e03e5d73d52505405cJens Axboe num_maps = (blocks + BLOCKS_PER_MAP-1)/ BLOCKS_PER_MAP; 490687270767de17dbad53c50e03e5d73d52505405cJens Axboe f->file_map = malloc(num_maps * sizeof(long)); 491687270767de17dbad53c50e03e5d73d52505405cJens Axboe if (!f->file_map) { 492687270767de17dbad53c50e03e5d73d52505405cJens Axboe log_err("fio: failed allocating random map. If running a large number of jobs, try the 'norandommap' option\n"); 493687270767de17dbad53c50e03e5d73d52505405cJens Axboe return 1; 494687270767de17dbad53c50e03e5d73d52505405cJens Axboe } 495687270767de17dbad53c50e03e5d73d52505405cJens Axboe f->num_maps = num_maps; 496687270767de17dbad53c50e03e5d73d52505405cJens Axboe memset(f->file_map, 0, num_maps * sizeof(long)); 497687270767de17dbad53c50e03e5d73d52505405cJens Axboe } 498687270767de17dbad53c50e03e5d73d52505405cJens Axboe 499687270767de17dbad53c50e03e5d73d52505405cJens Axboe return 0; 500687270767de17dbad53c50e03e5d73d52505405cJens Axboe} 501687270767de17dbad53c50e03e5d73d52505405cJens Axboe 50253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboevoid close_files(struct thread_data *td) 50353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{ 5040ab8db8943acc6b9ea778735563bfad2a79e8dddJens Axboe struct fio_file *f; 505af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe unsigned int i; 50653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 5070ab8db8943acc6b9ea778735563bfad2a79e8dddJens Axboe for_each_file(td, f, i) { 508a9b7b3052b35c20e82b8fc909cd546a5fe1ff293Jens Axboe if (td->o.unlink && f->filetype == FIO_TYPE_FILE) 509132ad46d22bcf12da95ad69e03c1b6f23f5e60a9Jens Axboe unlink(f->file_name); 510bdb4e2e99d4a87e5d3677cc09aa1ce92135125a9Jens Axboe 511b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe td_io_close_file(td, f); 512b3dc7f075b85e004f8c681ebb8566475017696f3Jens Axboe 513fa1da8653e2177b3cc31a91e963c389f079d4172Jens Axboe free(f->file_name); 514fa1da8653e2177b3cc31a91e963c389f079d4172Jens Axboe f->file_name = NULL; 515fa1da8653e2177b3cc31a91e963c389f079d4172Jens Axboe 516c343981b9874179009a92e4d29eae95cf341843aJens Axboe if (f->file_map) { 517b3dc7f075b85e004f8c681ebb8566475017696f3Jens Axboe free(f->file_map); 518c343981b9874179009a92e4d29eae95cf341843aJens Axboe f->file_map = NULL; 519c343981b9874179009a92e4d29eae95cf341843aJens Axboe } 52053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 521b4a6a59a939f0e6554632de311e7d1d1b7633ccfJens Axboe 5222dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe td->o.filename = NULL; 523cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe free(td->files); 524b4a6a59a939f0e6554632de311e7d1d1b7633ccfJens Axboe td->files = NULL; 5252dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe td->o.nr_files = 0; 52653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe} 527af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe 528e3bab463d4397e3378d8c7437e31de8aaf861a4fJens Axboestatic void get_file_type(struct fio_file *f) 529af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe{ 530af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe struct stat sb; 531af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe 532661598287ecc3b8987f312cf8403936552ce686aJens Axboe if (!strcmp(f->file_name, "-")) 533661598287ecc3b8987f312cf8403936552ce686aJens Axboe f->filetype = FIO_TYPE_PIPE; 534661598287ecc3b8987f312cf8403936552ce686aJens Axboe else 535661598287ecc3b8987f312cf8403936552ce686aJens Axboe f->filetype = FIO_TYPE_FILE; 536af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe 537e3bab463d4397e3378d8c7437e31de8aaf861a4fJens Axboe if (!lstat(f->file_name, &sb)) { 538af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe if (S_ISBLK(sb.st_mode)) 539af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe f->filetype = FIO_TYPE_BD; 540af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe else if (S_ISCHR(sb.st_mode)) 541af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe f->filetype = FIO_TYPE_CHAR; 542b5605e9ded4188ed91faae1a43ecd333a9856f62Jens Axboe else if (S_ISFIFO(sb.st_mode)) 543b5605e9ded4188ed91faae1a43ecd333a9856f62Jens Axboe f->filetype = FIO_TYPE_PIPE; 544af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe } 545af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe} 546af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe 547f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboeint add_file(struct thread_data *td, const char *fname) 548af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe{ 5497b4e4fe5e6fa26f82f9169c18ec70c08d0805ca9Jens Axboe int cur_files = td->files_index; 550bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe char file_name[PATH_MAX]; 551af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe struct fio_file *f; 552bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe int len = 0; 553af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe 554af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe td->files = realloc(td->files, (cur_files + 1) * sizeof(*f)); 555af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe 556af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe f = &td->files[cur_files]; 557af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe memset(f, 0, sizeof(*f)); 558af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe f->fd = -1; 559bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe 56007eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe /* 56107eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe * init function, io engine may not be loaded yet 56207eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe */ 56307eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe if (td->io_ops && (td->io_ops->flags & FIO_DISKLESSIO)) 56407eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe f->real_file_size = -1ULL; 56507eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe 566bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe if (td->o.directory) 567bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe len = sprintf(file_name, "%s/", td->o.directory); 568bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe 569bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe sprintf(file_name + len, "%s", fname); 570bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe f->file_name = strdup(file_name); 571af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe 572e3bab463d4397e3378d8c7437e31de8aaf861a4fJens Axboe get_file_type(f); 573af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe 5747b4e4fe5e6fa26f82f9169c18ec70c08d0805ca9Jens Axboe td->files_index++; 5751549441cdfecb2c1a4a8b8d494253859d67b4344Jens Axboe if (f->filetype == FIO_TYPE_FILE) 5761549441cdfecb2c1a4a8b8d494253859d67b4344Jens Axboe td->nr_normal_files++; 577f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe 578f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe return cur_files; 579af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe} 5800ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe 5810ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboevoid get_file(struct fio_file *f) 5820ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe{ 58397af62cec418cd722fb43c6010d6430534e12353Jens Axboe assert(f->flags & FIO_FILE_OPEN); 5840ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe f->references++; 5850ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe} 5860ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe 5870ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboevoid put_file(struct thread_data *td, struct fio_file *f) 5880ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe{ 5890ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe if (!(f->flags & FIO_FILE_OPEN)) 5900ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe return; 5910ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe 5920ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe assert(f->references); 5930ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe if (--f->references) 5940ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe return; 5950ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe 596d424d4dd657eaf4aeb8ffb07a550a5f64940f41aJens Axboe if (should_fsync(td) && td->o.fsync_on_close) 597ebb1415f729c123b8a13bcbd667bf4b4cc95b4d4Jens Axboe fsync(f->fd); 598ebb1415f729c123b8a13bcbd667bf4b4cc95b4d4Jens Axboe 5990ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe if (td->io_ops->close_file) 6000ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe td->io_ops->close_file(td, f); 6011020a139beff50faf1bb18f761b024b664a09e14Jens Axboe 6020ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe td->nr_open_files--; 6030ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe f->flags &= ~FIO_FILE_OPEN; 6040ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe} 605bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 606bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboestatic int recurse_dir(struct thread_data *td, const char *dirname) 607bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe{ 608bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe struct dirent *dir; 609bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe int ret = 0; 610bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe DIR *D; 611bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 612bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe D = opendir(dirname); 613bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe if (!D) { 6140ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe char buf[FIO_VERROR_SIZE]; 6150ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe 6160ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe snprintf(buf, FIO_VERROR_SIZE - 1, "opendir(%s)", dirname); 6170ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe td_verror(td, errno, buf); 618bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe return 1; 619bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe } 620bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 621bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe while ((dir = readdir(D)) != NULL) { 622bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe char full_path[PATH_MAX]; 623bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe struct stat sb; 624bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 625e85b2b83e39b64ba5cb73fbfddbf3902b6e84925Jens Axboe if (!strcmp(dir->d_name, ".") || !strcmp(dir->d_name, "..")) 626e85b2b83e39b64ba5cb73fbfddbf3902b6e84925Jens Axboe continue; 62796d32d518a0743a6c050057bc1562e4883e51c5dJens Axboe 628bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe sprintf(full_path, "%s/%s", dirname, dir->d_name); 629bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 630bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe if (lstat(full_path, &sb) == -1) { 631bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe if (errno != ENOENT) { 632bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe td_verror(td, errno, "stat"); 633bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe return 1; 634bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe } 635bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe } 636bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 637bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe if (S_ISREG(sb.st_mode)) { 638bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe add_file(td, full_path); 6392dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe td->o.nr_files++; 640bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe continue; 641bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe } 6420ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe if (!S_ISDIR(sb.st_mode)) 6430ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe continue; 644bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 645bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe if ((ret = recurse_dir(td, full_path)) != 0) 646bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe break; 647bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe } 648bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 649bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe closedir(D); 650bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe return ret; 651bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe} 652bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 653bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboeint add_dir_files(struct thread_data *td, const char *path) 654bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe{ 6550ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe int ret = recurse_dir(td, path); 6560ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe 6570ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe if (!ret) 6580ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe log_info("fio: opendir added %d files\n", td->o.nr_files); 6590ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe 6600ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe return ret; 661bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe} 662cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe 663cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboevoid dup_files(struct thread_data *td, struct thread_data *org) 664cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe{ 665cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe struct fio_file *f; 666cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe unsigned int i; 667cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe size_t bytes; 668cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe 669cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe if (!org->files) 670cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe return; 671cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe 672cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe bytes = org->files_index * sizeof(*f); 673cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe td->files = malloc(bytes); 674cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe memcpy(td->files, org->files, bytes); 675cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe 676cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe for_each_file(td, f, i) { 677cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe if (f->file_name) 678cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe f->file_name = strdup(f->file_name); 679cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe } 680cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe} 681f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe 682f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe/* 683f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe * Returns the index that matches the filename, or -1 if not there 684f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe */ 685f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboeint get_fileno(struct thread_data *td, const char *fname) 686f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe{ 687f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe struct fio_file *f; 688f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe unsigned int i; 689f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe 690f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe for_each_file(td, f, i) 691f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe if (!strcmp(f->file_name, fname)) 692f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe return i; 693f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe 694f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe return -1; 695f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe} 696f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe 697f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe/* 698f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe * For log usage, where we add/open/close files automatically 699f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe */ 700f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboevoid free_release_files(struct thread_data *td) 701f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe{ 702f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe close_files(td); 703f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe td->files_index = 0; 704f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe td->nr_normal_files = 0; 705f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe} 706