filesetup.c revision 661598287ecc3b8987f312cf8403936552ce686a
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 127bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboestatic int extend_file(struct thread_data *td, struct fio_file *f) 1325205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe{ 14ea443657ce85860b7a0dd2f39f2572d4a09fc885Jens Axboe int r, new_layout = 0, unlink_file = 0, flags; 1525205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe unsigned long long left; 1625205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe unsigned int bs; 1725205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe char *b; 18b2a151925a91f38aeb298d693687a47269ad4e94Jens Axboe 19507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe /* 20507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe * check if we need to lay the file out complete again. fio 21507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe * does that for operations involving reads, or for writes 22507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe * where overwrite is set 23507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe */ 24507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe if (td_read(td) || (td_write(td) && td->o.overwrite)) 25507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe new_layout = 1; 26ea443657ce85860b7a0dd2f39f2572d4a09fc885Jens Axboe if (td_write(td) && !td->o.overwrite) 27ea443657ce85860b7a0dd2f39f2572d4a09fc885Jens Axboe unlink_file = 1; 28507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe 29ea443657ce85860b7a0dd2f39f2572d4a09fc885Jens Axboe if ((unlink_file || new_layout) && (f->flags & FIO_FILE_EXISTS)) { 307bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (unlink(f->file_name) < 0) { 317bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe td_verror(td, errno, "unlink"); 327bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe return 1; 337bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } 347bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } 357bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 36507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe flags = O_WRONLY | O_CREAT; 37507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe if (new_layout) 38507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe flags |= O_TRUNC; 39507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe 40507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe f->fd = open(f->file_name, flags, 0644); 4153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (f->fd < 0) { 42e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe td_verror(td, errno, "open"); 4353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 1; 4453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 4553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 467bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (ftruncate(f->fd, f->real_file_size) == -1) { 47e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe td_verror(td, errno, "ftruncate"); 4853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe goto err; 4953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 5053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 51e8be2ad711db813537a1f2a6a6939c42909ba5ccJens Axboe if (!new_layout) 52e8be2ad711db813537a1f2a6a6939c42909ba5ccJens Axboe goto done; 53e8be2ad711db813537a1f2a6a6939c42909ba5ccJens Axboe 547bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (posix_fallocate(f->fd, 0, f->real_file_size) < 0) { 55e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe td_verror(td, errno, "posix_fallocate"); 5640f8298cd252157fa15d93f8eb470116a94069a0Jens Axboe goto err; 5740f8298cd252157fa15d93f8eb470116a94069a0Jens Axboe } 5840f8298cd252157fa15d93f8eb470116a94069a0Jens Axboe 592dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe b = malloc(td->o.max_bs[DDIR_WRITE]); 602dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe memset(b, 0, td->o.max_bs[DDIR_WRITE]); 6153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 627bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe left = f->real_file_size; 6353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe while (left && !td->terminate) { 642dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe bs = td->o.max_bs[DDIR_WRITE]; 6553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (bs > left) 6653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe bs = left; 6753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 6853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe r = write(f->fd, b, bs); 6953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 7053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (r == (int) bs) { 7153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe left -= bs; 7253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe continue; 7353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } else { 7453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (r < 0) 75e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe td_verror(td, errno, "write"); 7653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe else 77e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe td_verror(td, EIO, "write"); 7853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 7953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe break; 8053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 8153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 8253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 8353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (td->terminate) 8453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe unlink(f->file_name); 852dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe else if (td->o.create_fsync) 8653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe fsync(f->fd); 8753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 8853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe free(b); 89507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboedone: 9053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe close(f->fd); 9153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe f->fd = -1; 9253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 0; 9353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboeerr: 9453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe close(f->fd); 9553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe f->fd = -1; 9653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 1; 9753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe} 9853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 997bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboestatic unsigned long long get_rand_file_size(struct thread_data *td) 1009c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe{ 1019c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe unsigned long long ret; 1029c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe long r; 1039c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe 1049c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe r = os_random_long(&td->file_size_state); 1057bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe ret = td->o.file_size_low + (unsigned long long) ((double) td->o.file_size_high * (r / (RAND_MAX + 1.0))); 1062dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe ret -= (ret % td->o.rw_min_bs); 1079c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe return ret; 1089c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe} 1099c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe 11053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboestatic int file_size(struct thread_data *td, struct fio_file *f) 11153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{ 11253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe struct stat st; 11353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 1147bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (fstat(f->fd, &st) == -1) { 1157bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe td_verror(td, errno, "fstat"); 1167bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe return 1; 1177bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } 11853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 1197bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe f->real_file_size = st.st_size; 12053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 0; 12153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe} 12253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 12353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboestatic int bdev_size(struct thread_data *td, struct fio_file *f) 12453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{ 12553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe unsigned long long bytes; 12653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe int r; 12753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 12853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe r = blockdev_size(f->fd, &bytes); 12953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (r) { 130e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe td_verror(td, r, "blockdev_size"); 13153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 1; 13253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 13353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 13453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe f->real_file_size = bytes; 13553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 0; 13653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe} 13753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 13853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboestatic int get_file_size(struct thread_data *td, struct fio_file *f) 13953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{ 14053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe int ret = 0; 14153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 142409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe if (f->flags & FIO_SIZE_KNOWN) 143409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe return 0; 144409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe 1457bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (f->filetype == FIO_TYPE_FILE) 1467bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe ret = file_size(td, f); 1477bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe else if (f->filetype == FIO_TYPE_BD) 14853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe ret = bdev_size(td, f); 14953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe else 15053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe f->real_file_size = -1; 15153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 15253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (ret) 15353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return ret; 15453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 15553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (f->file_offset > f->real_file_size) { 1562dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe log_err("%s: offset extends end (%Lu > %Lu)\n", td->o.name, f->file_offset, f->real_file_size); 15753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 1; 15853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 15953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 160409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe f->flags |= FIO_SIZE_KNOWN; 16153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 0; 16253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe} 16353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 164e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboeint file_invalidate_cache(struct thread_data *td, struct fio_file *f) 165e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe{ 166e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe int ret = 0; 167e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe 1682dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe if (td->o.odirect) 169b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe return 0; 170b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe 171e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe /* 172e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe * FIXME: add blockdev flushing too 173e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe */ 174b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe if (f->mmap) 1757bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe ret = madvise(f->mmap, f->io_size, MADV_DONTNEED); 176467d1b6b3ebbfcb7cc0545a882ba8a93ea66752bJens Axboe else if (f->filetype == FIO_TYPE_FILE) 1777bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe ret = fadvise(f->fd, f->file_offset, f->io_size, POSIX_FADV_DONTNEED); 1787e0e25c924d51f23196b3e0ea83b79178fc46823Jens Axboe else if (f->filetype == FIO_TYPE_BD) { 179b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe ret = blockdev_invalidate_cache(f->fd); 1807e0e25c924d51f23196b3e0ea83b79178fc46823Jens Axboe if (ret < 0 && errno == EACCES && geteuid()) { 1817e0e25c924d51f23196b3e0ea83b79178fc46823Jens Axboe log_err("fio: only root may flush block devices. Cache flush bypassed!\n"); 1827e0e25c924d51f23196b3e0ea83b79178fc46823Jens Axboe ret = 0; 1837e0e25c924d51f23196b3e0ea83b79178fc46823Jens Axboe } 184b5605e9ded4188ed91faae1a43ecd333a9856f62Jens Axboe } else if (f->filetype == FIO_TYPE_CHAR || f->filetype == FIO_TYPE_PIPE) 185e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe ret = 0; 186e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe 187e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe if (ret < 0) { 188e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe td_verror(td, errno, "invalidate_cache"); 189e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe return 1; 190e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe } 191e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe 192ad2da605a62faf16887970618b434db19594e17bJens Axboe return ret; 193e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe} 194e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe 195b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboevoid generic_close_file(struct thread_data fio_unused *td, struct fio_file *f) 19653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{ 197b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe close(f->fd); 198b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe f->fd = -1; 19953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe} 20053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 201b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboeint generic_open_file(struct thread_data *td, struct fio_file *f) 20253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{ 203661598287ecc3b8987f312cf8403936552ce686aJens Axboe int is_std = 0; 20453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe int flags = 0; 20553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 206661598287ecc3b8987f312cf8403936552ce686aJens Axboe if (!strcmp(f->file_name, "-")) { 207661598287ecc3b8987f312cf8403936552ce686aJens Axboe if (td_rw(td)) { 208661598287ecc3b8987f312cf8403936552ce686aJens Axboe log_err("fio: can't read/write to stdin/out\n"); 209661598287ecc3b8987f312cf8403936552ce686aJens Axboe return 1; 210661598287ecc3b8987f312cf8403936552ce686aJens Axboe } 211661598287ecc3b8987f312cf8403936552ce686aJens Axboe is_std = 1; 212661598287ecc3b8987f312cf8403936552ce686aJens Axboe } 213661598287ecc3b8987f312cf8403936552ce686aJens Axboe 2142dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe if (td->o.odirect) 2152fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe flags |= OS_O_DIRECT; 2162dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe if (td->o.sync_io) 2172fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe flags |= O_SYNC; 21853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 2192fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe if (td_write(td) || td_rw(td)) { 2202fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe flags |= O_RDWR; 22153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 222af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe if (f->filetype == FIO_TYPE_FILE) 2232fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe flags |= O_CREAT; 2242fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe 225661598287ecc3b8987f312cf8403936552ce686aJens Axboe if (is_std) 226661598287ecc3b8987f312cf8403936552ce686aJens Axboe f->fd = dup(STDOUT_FILENO); 227661598287ecc3b8987f312cf8403936552ce686aJens Axboe else 228661598287ecc3b8987f312cf8403936552ce686aJens Axboe f->fd = open(f->file_name, flags, 0600); 2292fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe } else { 230af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe if (f->filetype == FIO_TYPE_CHAR) 2312fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe flags |= O_RDWR; 2322fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe else 2332fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe flags |= O_RDONLY; 2342fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe 235661598287ecc3b8987f312cf8403936552ce686aJens Axboe if (is_std) 236661598287ecc3b8987f312cf8403936552ce686aJens Axboe f->fd = dup(STDIN_FILENO); 237661598287ecc3b8987f312cf8403936552ce686aJens Axboe else 238661598287ecc3b8987f312cf8403936552ce686aJens Axboe f->fd = open(f->file_name, flags); 23953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 24053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 24153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (f->fd == -1) { 242e4e33258637e55550a0fac59eb3350e8bf06f8e6Jens Axboe char buf[FIO_VERROR_SIZE]; 243e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe int __e = errno; 244e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe 245e4e33258637e55550a0fac59eb3350e8bf06f8e6Jens Axboe snprintf(buf, sizeof(buf) - 1, "open(%s)", f->file_name); 246e4e33258637e55550a0fac59eb3350e8bf06f8e6Jens Axboe 247e4e33258637e55550a0fac59eb3350e8bf06f8e6Jens Axboe td_verror(td, __e, buf); 24853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 24953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 250b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe if (get_file_size(td, f)) 251b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe goto err; 252b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe 25353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 0; 254b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboeerr: 255b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe close(f->fd); 256b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe return 1; 257b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe} 258b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe 25921972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboeint open_files(struct thread_data *td) 26021972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe{ 26121972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe struct fio_file *f; 262af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe unsigned int i; 263af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe int err = 0; 26421972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe 26521972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe for_each_file(td, f, i) { 266b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe err = td_io_open_file(td, f); 2679bf27b4530fca07088ab978aea47be79a3d48879Jens Axboe if (err) { 2689bf27b4530fca07088ab978aea47be79a3d48879Jens Axboe if (td->error == EMFILE) { 2699bf27b4530fca07088ab978aea47be79a3d48879Jens Axboe log_err("fio: limited open files to: %d\n", td->nr_open_files); 2709bf27b4530fca07088ab978aea47be79a3d48879Jens Axboe td->o.open_files = td->nr_open_files; 2719bf27b4530fca07088ab978aea47be79a3d48879Jens Axboe err = 0; 2729bf27b4530fca07088ab978aea47be79a3d48879Jens Axboe clear_error(td); 2739bf27b4530fca07088ab978aea47be79a3d48879Jens Axboe } 27421972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe break; 2759bf27b4530fca07088ab978aea47be79a3d48879Jens Axboe } 276b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe 2772dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe if (td->o.open_files == td->nr_open_files) 278b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe break; 27921972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe } 28021972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe 2817abf833d25ab6cc866308fe37483dfe2fde28efcJens Axboe if (!err) 2827abf833d25ab6cc866308fe37483dfe2fde28efcJens Axboe return 0; 2837abf833d25ab6cc866308fe37483dfe2fde28efcJens Axboe 284bdb4e2e99d4a87e5d3677cc09aa1ce92135125a9Jens Axboe for_each_file(td, f, i) 285b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe td_io_close_file(td, f); 2867abf833d25ab6cc866308fe37483dfe2fde28efcJens Axboe 28721972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe return err; 28821972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe} 28921972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe 2907bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe/* 2917bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * open/close all files, so that ->real_file_size gets set 2927bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */ 293bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboestatic int get_file_sizes(struct thread_data *td) 2947bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe{ 2957bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe struct fio_file *f; 2967bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe unsigned int i; 297bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe int err = 0; 2987bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 2997bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe for_each_file(td, f, i) { 300bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe if (td->io_ops->open_file(td, f)) { 30140b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe if (td->error != ENOENT) { 30240b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe log_err("%s\n", td->verror); 30340b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe err = 1; 30440b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe } 305541d66d70b8fbe9860b31307c0760e6d5f4c78a8Jens Axboe clear_error(td); 30607eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe } else { 30707eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe if (td->io_ops->close_file) 30807eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe td->io_ops->close_file(td, f); 30907eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe } 310409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe 311409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe if (f->real_file_size == -1ULL && td->o.size) 312409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe f->real_file_size = td->o.size / td->o.nr_files; 3137bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } 314bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe 315bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe return err; 3167bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe} 3177bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 3187bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe/* 3197bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * Open the files and setup files sizes, creating files if necessary. 3207bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */ 32153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboeint setup_files(struct thread_data *td) 32253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{ 3237bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe unsigned long long total_size, extend_size; 32453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe struct fio_file *f; 325af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe unsigned int i; 326000b080395e45cbe0ce54e75f0e993addbdc8676Jens Axboe int err = 0, need_extend; 32753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 32853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe /* 32953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe * if ioengine defines a setup() method, it's responsible for 3307bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * opening the files and setting f->real_file_size to indicate 3317bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * the valid range for that file. 33253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe */ 33353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (td->io_ops->setup) 3347bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe err = td->io_ops->setup(td); 3357bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe else 336bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe err = get_file_sizes(td); 33753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 338f102706350093e60617cc271b128e56c57ab3ce7Jens Axboe if (err) 339f102706350093e60617cc271b128e56c57ab3ce7Jens Axboe return err; 340f102706350093e60617cc271b128e56c57ab3ce7Jens Axboe 3410a7eb121ecb2e4279e9eb8178aa1e554dda40191Jens Axboe /* 3427bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * check sizes. if the files/devices do not exist and the size 3437bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * isn't passed to fio, abort. 3440a7eb121ecb2e4279e9eb8178aa1e554dda40191Jens Axboe */ 3457bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe total_size = 0; 3467bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe for_each_file(td, f, i) { 3477bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (f->real_file_size == -1ULL) 3487bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe total_size = -1ULL; 3497bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe else 3507bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe total_size += f->real_file_size; 3517bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } 3520a7eb121ecb2e4279e9eb8178aa1e554dda40191Jens Axboe 3537bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe /* 3547bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * device/file sizes are zero and no size given, punt 3557bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */ 356409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe if ((!total_size || total_size == -1ULL) && !td->o.size) { 3577bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe log_err("%s: you need to specify size=\n", td->o.name); 358e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe td_verror(td, EINVAL, "total_file_size"); 35953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 1; 36053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 36153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 3627bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe /* 3637bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * now file sizes are known, so we can set ->io_size. if size= is 3647bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * not given, ->io_size is just equal to ->real_file_size. if size 3657bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * is given, ->io_size is size / nr_files. 3667bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */ 3677bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe extend_size = total_size = 0; 3687bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe need_extend = 0; 3697bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe for_each_file(td, f, i) { 3707bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (!td->o.file_size_low) { 3717bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe /* 3727bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * no file size range given, file size is equal to 3737bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * total size divided by number of files. if that is 3747bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * zero, set it to the real file size. 3757bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */ 3767bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe f->io_size = td->o.size / td->o.nr_files; 3777bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (!f->io_size) 3787bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe f->io_size = f->real_file_size; 3797bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } else if (f->real_file_size < td->o.file_size_low || 3807bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe f->real_file_size > td->o.file_size_high) { 3817bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe /* 3827bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * file size given. if it's fixed, use that. if it's a 3837bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * range, generate a random size in-between. 3847bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */ 3857bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (td->o.file_size_low == td->o.file_size_high) 3867bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe f->io_size = td->o.file_size_low; 3877bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe else 3887bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe f->io_size = get_rand_file_size(td); 3897bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } else 3907bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe f->io_size = f->real_file_size; 39153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 3927bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (f->io_size == -1ULL) 3937bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe total_size = -1ULL; 3947bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe else 3957bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe total_size += f->io_size; 3967bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 3977bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (f->filetype == FIO_TYPE_FILE && 3987bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe f->io_size > f->real_file_size && 3997bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe !(td->io_ops->flags & FIO_DISKLESSIO)) { 4007bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe need_extend++; 4017bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe extend_size += f->io_size; 4027bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe f->flags |= FIO_FILE_EXTEND; 4037bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } 4047bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } 40553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 4067bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (!td->o.size) 4077bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe td->o.size = total_size; 40821972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe 4097bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe /* 4107bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * See if we need to extend some files 4117bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */ 4127bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (need_extend) { 4137bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe temp_stall_ts = 1; 4147bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe log_info("%s: Laying out IO file(s) (%u files / %LuMiB)\n", 4157bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe td->o.name, need_extend, extend_size >> 20); 4167bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 4177bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe for_each_file(td, f, i) { 4187bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (!(f->flags & FIO_FILE_EXTEND)) 4197bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe continue; 4207bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 421409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe assert(f->filetype == FIO_TYPE_FILE); 4227bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe f->flags &= ~FIO_FILE_EXTEND; 4237bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe f->real_file_size = f->io_size; 4247bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe err = extend_file(td, f); 4257bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (err) 4267bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe break; 4277bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } 4287bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe temp_stall_ts = 0; 4297bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } 4307bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 4317bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (err) 4327bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe return err; 4337bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 4347bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (!td->o.zone_size) 4357bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe td->o.zone_size = td->o.size; 4367bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 4377bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe td->total_io_size = td->o.size * td->o.loops; 4387bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe return 0; 43953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe} 44053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 441687270767de17dbad53c50e03e5d73d52505405cJens Axboeint init_random_map(struct thread_data *td) 442687270767de17dbad53c50e03e5d73d52505405cJens Axboe{ 443687270767de17dbad53c50e03e5d73d52505405cJens Axboe int num_maps, blocks; 444687270767de17dbad53c50e03e5d73d52505405cJens Axboe struct fio_file *f; 445687270767de17dbad53c50e03e5d73d52505405cJens Axboe unsigned int i; 446687270767de17dbad53c50e03e5d73d52505405cJens Axboe 447687270767de17dbad53c50e03e5d73d52505405cJens Axboe if (td->o.norandommap) 448687270767de17dbad53c50e03e5d73d52505405cJens Axboe return 0; 449687270767de17dbad53c50e03e5d73d52505405cJens Axboe 450687270767de17dbad53c50e03e5d73d52505405cJens Axboe for_each_file(td, f, i) { 451687270767de17dbad53c50e03e5d73d52505405cJens Axboe blocks = (f->real_file_size + td->o.rw_min_bs - 1) / td->o.rw_min_bs; 452687270767de17dbad53c50e03e5d73d52505405cJens Axboe num_maps = (blocks + BLOCKS_PER_MAP-1)/ BLOCKS_PER_MAP; 453687270767de17dbad53c50e03e5d73d52505405cJens Axboe f->file_map = malloc(num_maps * sizeof(long)); 454687270767de17dbad53c50e03e5d73d52505405cJens Axboe if (!f->file_map) { 455687270767de17dbad53c50e03e5d73d52505405cJens Axboe log_err("fio: failed allocating random map. If running a large number of jobs, try the 'norandommap' option\n"); 456687270767de17dbad53c50e03e5d73d52505405cJens Axboe return 1; 457687270767de17dbad53c50e03e5d73d52505405cJens Axboe } 458687270767de17dbad53c50e03e5d73d52505405cJens Axboe f->num_maps = num_maps; 459687270767de17dbad53c50e03e5d73d52505405cJens Axboe memset(f->file_map, 0, num_maps * sizeof(long)); 460687270767de17dbad53c50e03e5d73d52505405cJens Axboe } 461687270767de17dbad53c50e03e5d73d52505405cJens Axboe 462687270767de17dbad53c50e03e5d73d52505405cJens Axboe return 0; 463687270767de17dbad53c50e03e5d73d52505405cJens Axboe} 464687270767de17dbad53c50e03e5d73d52505405cJens Axboe 46553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboevoid close_files(struct thread_data *td) 46653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{ 4670ab8db8943acc6b9ea778735563bfad2a79e8dddJens Axboe struct fio_file *f; 468af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe unsigned int i; 46953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 4700ab8db8943acc6b9ea778735563bfad2a79e8dddJens Axboe for_each_file(td, f, i) { 471fa1da8653e2177b3cc31a91e963c389f079d4172Jens Axboe if ((f->flags & FIO_FILE_UNLINK) && 472fa1da8653e2177b3cc31a91e963c389f079d4172Jens Axboe f->filetype == FIO_TYPE_FILE) 473132ad46d22bcf12da95ad69e03c1b6f23f5e60a9Jens Axboe unlink(f->file_name); 474bdb4e2e99d4a87e5d3677cc09aa1ce92135125a9Jens Axboe 475b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe td_io_close_file(td, f); 476b3dc7f075b85e004f8c681ebb8566475017696f3Jens Axboe 477fa1da8653e2177b3cc31a91e963c389f079d4172Jens Axboe free(f->file_name); 478fa1da8653e2177b3cc31a91e963c389f079d4172Jens Axboe f->file_name = NULL; 479fa1da8653e2177b3cc31a91e963c389f079d4172Jens Axboe 480c343981b9874179009a92e4d29eae95cf341843aJens Axboe if (f->file_map) { 481b3dc7f075b85e004f8c681ebb8566475017696f3Jens Axboe free(f->file_map); 482c343981b9874179009a92e4d29eae95cf341843aJens Axboe f->file_map = NULL; 483c343981b9874179009a92e4d29eae95cf341843aJens Axboe } 48453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 485b4a6a59a939f0e6554632de311e7d1d1b7633ccfJens Axboe 4862dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe td->o.filename = NULL; 487cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe free(td->files); 488b4a6a59a939f0e6554632de311e7d1d1b7633ccfJens Axboe td->files = NULL; 4892dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe td->o.nr_files = 0; 49053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe} 491af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe 492e3bab463d4397e3378d8c7437e31de8aaf861a4fJens Axboestatic void get_file_type(struct fio_file *f) 493af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe{ 494af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe struct stat sb; 495af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe 496661598287ecc3b8987f312cf8403936552ce686aJens Axboe if (!strcmp(f->file_name, "-")) 497661598287ecc3b8987f312cf8403936552ce686aJens Axboe f->filetype = FIO_TYPE_PIPE; 498661598287ecc3b8987f312cf8403936552ce686aJens Axboe else 499661598287ecc3b8987f312cf8403936552ce686aJens Axboe f->filetype = FIO_TYPE_FILE; 500af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe 501e3bab463d4397e3378d8c7437e31de8aaf861a4fJens Axboe if (!lstat(f->file_name, &sb)) { 502af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe if (S_ISBLK(sb.st_mode)) 503af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe f->filetype = FIO_TYPE_BD; 504af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe else if (S_ISCHR(sb.st_mode)) 505af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe f->filetype = FIO_TYPE_CHAR; 506b5605e9ded4188ed91faae1a43ecd333a9856f62Jens Axboe else if (S_ISFIFO(sb.st_mode)) 507b5605e9ded4188ed91faae1a43ecd333a9856f62Jens Axboe f->filetype = FIO_TYPE_PIPE; 508af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe } 509af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe} 510af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe 511af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboevoid add_file(struct thread_data *td, const char *fname) 512af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe{ 5137b4e4fe5e6fa26f82f9169c18ec70c08d0805ca9Jens Axboe int cur_files = td->files_index; 514bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe char file_name[PATH_MAX]; 515af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe struct fio_file *f; 516bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe int len = 0; 517af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe 518af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe td->files = realloc(td->files, (cur_files + 1) * sizeof(*f)); 519af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe 520af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe f = &td->files[cur_files]; 521af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe memset(f, 0, sizeof(*f)); 522af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe f->fd = -1; 523bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe 52407eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe /* 52507eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe * init function, io engine may not be loaded yet 52607eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe */ 52707eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe if (td->io_ops && (td->io_ops->flags & FIO_DISKLESSIO)) 52807eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe f->real_file_size = -1ULL; 52907eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe 530bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe if (td->o.directory) 531bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe len = sprintf(file_name, "%s/", td->o.directory); 532bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe 533bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe sprintf(file_name + len, "%s", fname); 534bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe f->file_name = strdup(file_name); 535af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe 536e3bab463d4397e3378d8c7437e31de8aaf861a4fJens Axboe get_file_type(f); 537af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe 5387b4e4fe5e6fa26f82f9169c18ec70c08d0805ca9Jens Axboe td->files_index++; 5391549441cdfecb2c1a4a8b8d494253859d67b4344Jens Axboe if (f->filetype == FIO_TYPE_FILE) 5401549441cdfecb2c1a4a8b8d494253859d67b4344Jens Axboe td->nr_normal_files++; 541af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe} 5420ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe 5430ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboevoid get_file(struct fio_file *f) 5440ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe{ 5450ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe f->references++; 5460ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe} 5470ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe 5480ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboevoid put_file(struct thread_data *td, struct fio_file *f) 5490ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe{ 5500ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe if (!(f->flags & FIO_FILE_OPEN)) 5510ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe return; 5520ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe 5530ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe assert(f->references); 5540ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe if (--f->references) 5550ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe return; 5560ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe 557661598287ecc3b8987f312cf8403936552ce686aJens Axboe if (should_fsync(td) && td->o.fsync_on_close && 558661598287ecc3b8987f312cf8403936552ce686aJens Axboe (f->filetype == FIO_TYPE_FILE || f->filetype == FIO_TYPE_BD)) 559ebb1415f729c123b8a13bcbd667bf4b4cc95b4d4Jens Axboe fsync(f->fd); 560ebb1415f729c123b8a13bcbd667bf4b4cc95b4d4Jens Axboe 5610ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe if (td->io_ops->close_file) 5620ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe td->io_ops->close_file(td, f); 5631020a139beff50faf1bb18f761b024b664a09e14Jens Axboe 5640ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe td->nr_open_files--; 5650ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe f->flags &= ~FIO_FILE_OPEN; 5660ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe} 567bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 568bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboestatic int recurse_dir(struct thread_data *td, const char *dirname) 569bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe{ 570bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe struct dirent *dir; 571bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe int ret = 0; 572bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe DIR *D; 573bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 574bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe D = opendir(dirname); 575bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe if (!D) { 5760ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe char buf[FIO_VERROR_SIZE]; 5770ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe 5780ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe snprintf(buf, FIO_VERROR_SIZE - 1, "opendir(%s)", dirname); 5790ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe td_verror(td, errno, buf); 580bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe return 1; 581bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe } 582bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 583bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe while ((dir = readdir(D)) != NULL) { 584bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe char full_path[PATH_MAX]; 585bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe struct stat sb; 586bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 587e85b2b83e39b64ba5cb73fbfddbf3902b6e84925Jens Axboe if (!strcmp(dir->d_name, ".") || !strcmp(dir->d_name, "..")) 588e85b2b83e39b64ba5cb73fbfddbf3902b6e84925Jens Axboe continue; 58996d32d518a0743a6c050057bc1562e4883e51c5dJens Axboe 590bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe sprintf(full_path, "%s/%s", dirname, dir->d_name); 591bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 592bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe if (lstat(full_path, &sb) == -1) { 593bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe if (errno != ENOENT) { 594bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe td_verror(td, errno, "stat"); 595bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe return 1; 596bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe } 597bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe } 598bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 599bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe if (S_ISREG(sb.st_mode)) { 600bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe add_file(td, full_path); 6012dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe td->o.nr_files++; 602bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe continue; 603bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe } 6040ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe if (!S_ISDIR(sb.st_mode)) 6050ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe continue; 606bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 607bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe if ((ret = recurse_dir(td, full_path)) != 0) 608bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe break; 609bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe } 610bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 611bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe closedir(D); 612bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe return ret; 613bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe} 614bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 615bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboeint add_dir_files(struct thread_data *td, const char *path) 616bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe{ 6170ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe int ret = recurse_dir(td, path); 6180ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe 6190ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe if (!ret) 6200ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe log_info("fio: opendir added %d files\n", td->o.nr_files); 6210ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe 6220ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe return ret; 623bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe} 624cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe 625cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboevoid dup_files(struct thread_data *td, struct thread_data *org) 626cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe{ 627cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe struct fio_file *f; 628cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe unsigned int i; 629cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe size_t bytes; 630cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe 631cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe if (!org->files) 632cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe return; 633cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe 634cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe bytes = org->files_index * sizeof(*f); 635cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe td->files = malloc(bytes); 636cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe memcpy(td->files, org->files, bytes); 637cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe 638cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe for_each_file(td, f, i) { 639cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe if (f->file_name) 640cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe f->file_name = strdup(f->file_name); 641cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe } 642cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe} 643