filesetup.c revision 21972cdef7db6b557c2d56138f8434658a9d1e49
153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe#include <unistd.h> 253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe#include <fcntl.h> 353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe#include <string.h> 453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe#include <assert.h> 553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe#include <sys/stat.h> 653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe#include <sys/mman.h> 753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe#include "fio.h" 953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe#include "os.h" 1053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 1125205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe/* 1225205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe * Check if the file exists and it's large enough. 1325205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe */ 1425205e975e6dce6079a4b94d656724011f1aabd0Jens Axboestatic int file_ok(struct thread_data *td, struct fio_file *f) 1553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{ 16b2a151925a91f38aeb298d693687a47269ad4e94Jens Axboe struct stat st; 1753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 18b2a151925a91f38aeb298d693687a47269ad4e94Jens Axboe if (td->filetype != FIO_TYPE_FILE) 19b2a151925a91f38aeb298d693687a47269ad4e94Jens Axboe return 0; 20b2a151925a91f38aeb298d693687a47269ad4e94Jens Axboe 2125205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe if (stat(f->file_name, &st) == -1) 2225205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe return 1; 2325205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe else if (st.st_size < (off_t) f->file_size) 2425205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe return 1; 2525205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe 2625205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe return 0; 2725205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe} 2825205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe 2925205e975e6dce6079a4b94d656724011f1aabd0Jens Axboestatic int create_file(struct thread_data *td, struct fio_file *f) 3025205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe{ 3125205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe unsigned long long left; 3225205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe unsigned int bs; 3325205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe char *b; 3425205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe int r; 35b2a151925a91f38aeb298d693687a47269ad4e94Jens Axboe 3653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe f->fd = open(f->file_name, O_WRONLY | O_CREAT | O_TRUNC, 0644); 3753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (f->fd < 0) { 3853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe td_verror(td, errno); 3953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 1; 4053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 4153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 4253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (ftruncate(f->fd, f->file_size) == -1) { 4353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe td_verror(td, errno); 4453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe goto err; 4553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 4653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 4740f8298cd252157fa15d93f8eb470116a94069a0Jens Axboe if (posix_fallocate(f->fd, 0, f->file_size) < 0) { 4840f8298cd252157fa15d93f8eb470116a94069a0Jens Axboe td_verror(td, errno); 4940f8298cd252157fa15d93f8eb470116a94069a0Jens Axboe goto err; 5040f8298cd252157fa15d93f8eb470116a94069a0Jens Axboe } 5140f8298cd252157fa15d93f8eb470116a94069a0Jens Axboe 52a00735e66f9ec42549da94eba3170e543b542904Jens Axboe b = malloc(td->max_bs[DDIR_WRITE]); 53a00735e66f9ec42549da94eba3170e543b542904Jens Axboe memset(b, 0, td->max_bs[DDIR_WRITE]); 5453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 5553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe left = f->file_size; 5653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe while (left && !td->terminate) { 57a00735e66f9ec42549da94eba3170e543b542904Jens Axboe bs = td->max_bs[DDIR_WRITE]; 5853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (bs > left) 5953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe bs = left; 6053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 6153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe r = write(f->fd, b, bs); 6253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 6353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (r == (int) bs) { 6453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe left -= bs; 6553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe continue; 6653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } else { 6753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (r < 0) 6853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe td_verror(td, errno); 6953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe else 7053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe td_verror(td, EIO); 7153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 7253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe break; 7353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 7453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 7553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 7653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (td->terminate) 7753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe unlink(f->file_name); 7853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe else if (td->create_fsync) 7953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe fsync(f->fd); 8053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 8153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe free(b); 8253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe close(f->fd); 8353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe f->fd = -1; 8453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 0; 8553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboeerr: 8653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe close(f->fd); 8753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe f->fd = -1; 8853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 1; 8953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe} 9053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 9153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboestatic int create_files(struct thread_data *td) 9253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{ 9353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe struct fio_file *f; 9425205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe int i, err, need_create; 9553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 96f697125ab9003d358a37186d610e09799afd190fJens Axboe for_each_file(td, f, i) 97f697125ab9003d358a37186d610e09799afd190fJens Axboe f->file_size = td->total_file_size / td->nr_files; 98f697125ab9003d358a37186d610e09799afd190fJens Axboe 9953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe /* 10053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe * unless specifically asked for overwrite, let normal io extend it 10153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe */ 102f697125ab9003d358a37186d610e09799afd190fJens Axboe if (!td->overwrite) 10353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 0; 10453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 10525205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe need_create = 0; 1060a7eb121ecb2e4279e9eb8178aa1e554dda40191Jens Axboe if (td->filetype == FIO_TYPE_FILE) 1070a7eb121ecb2e4279e9eb8178aa1e554dda40191Jens Axboe for_each_file(td, f, i) 108f102706350093e60617cc271b128e56c57ab3ce7Jens Axboe need_create += file_ok(td, f); 10925205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe 11025205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe if (!need_create) 11125205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe return 0; 11225205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe 113f102706350093e60617cc271b128e56c57ab3ce7Jens Axboe if (!td->total_file_size) { 114f102706350093e60617cc271b128e56c57ab3ce7Jens Axboe log_err("Need size for create\n"); 115f102706350093e60617cc271b128e56c57ab3ce7Jens Axboe td_verror(td, EINVAL); 116f102706350093e60617cc271b128e56c57ab3ce7Jens Axboe return 1; 117f102706350093e60617cc271b128e56c57ab3ce7Jens Axboe } 118f102706350093e60617cc271b128e56c57ab3ce7Jens Axboe 11953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe temp_stall_ts = 1; 12025205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe fprintf(f_out, "%s: Laying out IO file(s) (%d x %LuMiB == %LuMiB)\n", 12113f8e2d2e3e5ec7d8c18b70fb2a2e2a026190020Jens Axboe td->name, td->nr_uniq_files, 12213f8e2d2e3e5ec7d8c18b70fb2a2e2a026190020Jens Axboe (td->total_file_size >> 20) / td->nr_uniq_files, 12325205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe td->total_file_size >> 20); 12453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 12553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe err = 0; 12653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe for_each_file(td, f, i) { 12725205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe if (file_ok(td, f)) { 12825205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe err = create_file(td, f); 12925205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe if (err) 13025205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe break; 13125205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe } 13253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 13353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 13453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe temp_stall_ts = 0; 13553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return err; 13653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe} 13753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 13853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboestatic int file_size(struct thread_data *td, struct fio_file *f) 13953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{ 14053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe struct stat st; 14153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 14253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (td->overwrite) { 14353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (fstat(f->fd, &st) == -1) { 14453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe td_verror(td, errno); 14553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 1; 14653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 14753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 14853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe f->real_file_size = st.st_size; 14953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 15053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (!f->file_size || f->file_size > f->real_file_size) 15153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe f->file_size = f->real_file_size; 15253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 15353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 15453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe f->file_size -= f->file_offset; 15553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 0; 15653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe} 15753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 15853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboestatic int bdev_size(struct thread_data *td, struct fio_file *f) 15953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{ 16053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe unsigned long long bytes; 16153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe int r; 16253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 16353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe r = blockdev_size(f->fd, &bytes); 16453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (r) { 16553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe td_verror(td, r); 16653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 1; 16753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 16853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 16953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe f->real_file_size = bytes; 17053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 17153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe /* 17253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe * no extend possibilities, so limit size to device size if too large 17353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe */ 17453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (!f->file_size || f->file_size > f->real_file_size) 17553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe f->file_size = f->real_file_size; 17653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 17753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe f->file_size -= f->file_offset; 17853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 0; 17953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe} 18053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 18153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboestatic int get_file_size(struct thread_data *td, struct fio_file *f) 18253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{ 18353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe int ret = 0; 18453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 18553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (td->filetype == FIO_TYPE_FILE) 18653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe ret = file_size(td, f); 18753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe else if (td->filetype == FIO_TYPE_BD) 18853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe ret = bdev_size(td, f); 18953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe else 19053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe f->real_file_size = -1; 19153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 19253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (ret) 19353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return ret; 19453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 19553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (f->file_offset > f->real_file_size) { 19653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe log_err("%s: offset extends end (%Lu > %Lu)\n", td->name, f->file_offset, f->real_file_size); 19753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 1; 19853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 19953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 20053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 0; 20153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe} 20253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 203e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboeint file_invalidate_cache(struct thread_data *td, struct fio_file *f) 204e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe{ 205e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe int ret = 0; 206e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe 207e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe /* 208e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe * FIXME: add blockdev flushing too 209e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe */ 210e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe if (td->io_ops->flags & FIO_MMAPIO) 211e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe ret = madvise(f->mmap, f->file_size, MADV_DONTNEED); 212e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe else if (td->filetype == FIO_TYPE_FILE) 213e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe ret = fadvise(f->fd, f->file_offset, f->file_size, POSIX_FADV_DONTNEED); 214e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe else if (td->filetype == FIO_TYPE_BD) 215e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe ret = blockdev_invalidate_cache(f->fd); 216e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe else if (td->filetype == FIO_TYPE_CHAR) 217e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe ret = 0; 218e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe 219e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe if (ret < 0) { 220e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe td_verror(td, errno); 221e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe return 1; 222e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe } 223e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe 224e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe return 0; 225e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe} 226e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe 22753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboestatic int __setup_file_mmap(struct thread_data *td, struct fio_file *f) 22853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{ 22953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe int flags; 23053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 23153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (td_rw(td)) 23253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe flags = PROT_READ | PROT_WRITE; 23353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe else if (td_write(td)) { 23453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe flags = PROT_WRITE; 23553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 23653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (td->verify != VERIFY_NONE) 23753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe flags |= PROT_READ; 23853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } else 23953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe flags = PROT_READ; 24053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 24153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe f->mmap = mmap(NULL, f->file_size, flags, MAP_SHARED, f->fd, f->file_offset); 24253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (f->mmap == MAP_FAILED) { 24353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe f->mmap = NULL; 24453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe td_verror(td, errno); 24553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 1; 24653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 24753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 248e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe if (td->invalidate_cache && file_invalidate_cache(td, f)) 249e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe return 1; 25053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 25153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (td->sequential) { 25253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (madvise(f->mmap, f->file_size, MADV_SEQUENTIAL) < 0) { 25353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe td_verror(td, errno); 25453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 1; 25553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 25653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } else { 25753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (madvise(f->mmap, f->file_size, MADV_RANDOM) < 0) { 25853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe td_verror(td, errno); 25953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 1; 26053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 26153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 26253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 26353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 0; 26453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe} 26553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 26653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboestatic int setup_files_mmap(struct thread_data *td) 26753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{ 26853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe struct fio_file *f; 26953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe int i, err = 0; 27053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 27153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe for_each_file(td, f, i) { 27253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe err = __setup_file_mmap(td, f); 27353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (err) 27453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe break; 27553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 27653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 27753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return err; 27853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe} 27953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 28053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboestatic int __setup_file_plain(struct thread_data *td, struct fio_file *f) 28153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{ 282e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe if (td->invalidate_cache && file_invalidate_cache(td, f)) 283e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe return 1; 28453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 28553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (td->sequential) { 28653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (fadvise(f->fd, f->file_offset, f->file_size, POSIX_FADV_SEQUENTIAL) < 0) { 28753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe td_verror(td, errno); 28853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 1; 28953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 29053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } else { 29153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (fadvise(f->fd, f->file_offset, f->file_size, POSIX_FADV_RANDOM) < 0) { 29253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe td_verror(td, errno); 29353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 1; 29453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 29553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 29653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 29753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 0; 29853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe} 29953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 30053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboestatic int setup_files_plain(struct thread_data *td) 30153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{ 30253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe struct fio_file *f; 30353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe int i, err = 0; 30453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 30553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe for_each_file(td, f, i) { 30653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe err = __setup_file_plain(td, f); 30753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (err) 30853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe break; 30953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 31053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 31153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return err; 31253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe} 31353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 31453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboestatic int setup_file(struct thread_data *td, struct fio_file *f) 31553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{ 31653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe int flags = 0; 31753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 31853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (td->odirect) 31953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe flags |= OS_O_DIRECT; 32053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 32153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (td_write(td) || td_rw(td)) { 32253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (td->filetype == FIO_TYPE_FILE) { 32353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (!td->overwrite) 32453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe flags |= O_TRUNC; 32553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 32653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe flags |= O_CREAT; 32753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 32853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (td->sync_io) 32953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe flags |= O_SYNC; 33053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 33153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe flags |= O_RDWR; 33253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 33353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe f->fd = open(f->file_name, flags, 0600); 33453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } else { 33553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (td->filetype == FIO_TYPE_CHAR) 33653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe flags |= O_RDWR; 33753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe else 33853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe flags |= O_RDONLY; 33953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 34053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe f->fd = open(f->file_name, flags); 34153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 34253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 34353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (f->fd == -1) { 34453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe td_verror(td, errno); 34553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 1; 34653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 34753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 34853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (get_file_size(td, f)) 34953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 1; 35053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 35153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 0; 35253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe} 35353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 35421972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboeint open_files(struct thread_data *td) 35521972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe{ 35621972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe struct fio_file *f; 35721972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe int i, err = 0; 35821972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe 35921972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe for_each_file(td, f, i) { 36021972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe err = setup_file(td, f); 36121972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe if (err) 36221972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe break; 36321972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe } 36421972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe 36521972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe return err; 36621972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe} 36721972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe 36853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboeint setup_files(struct thread_data *td) 36953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{ 37053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe struct fio_file *f; 37121972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe int err, i; 37253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 37353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe /* 37453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe * if ioengine defines a setup() method, it's responsible for 37553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe * setting up everything in the td->files[] area. 37653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe */ 37753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (td->io_ops->setup) 37853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return td->io_ops->setup(td); 37953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 38053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (create_files(td)) 38153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 1; 38253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 38321972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe err = open_files(td); 384f102706350093e60617cc271b128e56c57ab3ce7Jens Axboe if (err) 385f102706350093e60617cc271b128e56c57ab3ce7Jens Axboe return err; 386f102706350093e60617cc271b128e56c57ab3ce7Jens Axboe 3870a7eb121ecb2e4279e9eb8178aa1e554dda40191Jens Axboe /* 3880a7eb121ecb2e4279e9eb8178aa1e554dda40191Jens Axboe * Recalculate the total file size now that files are set up. 3890a7eb121ecb2e4279e9eb8178aa1e554dda40191Jens Axboe */ 3900a7eb121ecb2e4279e9eb8178aa1e554dda40191Jens Axboe td->total_file_size = 0; 3910a7eb121ecb2e4279e9eb8178aa1e554dda40191Jens Axboe for_each_file(td, f, i) 3920a7eb121ecb2e4279e9eb8178aa1e554dda40191Jens Axboe td->total_file_size += f->file_size; 3930a7eb121ecb2e4279e9eb8178aa1e554dda40191Jens Axboe 394f102706350093e60617cc271b128e56c57ab3ce7Jens Axboe td->io_size = td->total_file_size; 39553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (td->io_size == 0) { 39653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe log_err("%s: no io blocks\n", td->name); 39753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe td_verror(td, EINVAL); 39853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 1; 39953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 40053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 40153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (!td->zone_size) 40253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe td->zone_size = td->io_size; 40353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 40453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe td->total_io_size = td->io_size * td->loops; 40553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 40653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (td->io_ops->flags & FIO_MMAPIO) 40721972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe err = setup_files_mmap(td); 40853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe else 40921972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe err = setup_files_plain(td); 41021972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe 41121972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe for_each_file(td, f, i) { 41221972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe if (f->fd != -1) { 41321972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe close(f->fd); 41421972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe f->fd = -1; 41521972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe } 41621972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe } 41721972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe 41821972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe return err; 41953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe} 42053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 42153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboevoid close_files(struct thread_data *td) 42253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{ 4230ab8db8943acc6b9ea778735563bfad2a79e8dddJens Axboe struct fio_file *f; 42453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe int i; 42553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 4260ab8db8943acc6b9ea778735563bfad2a79e8dddJens Axboe for_each_file(td, f, i) { 427132ad46d22bcf12da95ad69e03c1b6f23f5e60a9Jens Axboe if (td->unlink && td->filetype == FIO_TYPE_FILE) { 428132ad46d22bcf12da95ad69e03c1b6f23f5e60a9Jens Axboe unlink(f->file_name); 429132ad46d22bcf12da95ad69e03c1b6f23f5e60a9Jens Axboe free(f->file_name); 430132ad46d22bcf12da95ad69e03c1b6f23f5e60a9Jens Axboe f->file_name = NULL; 431132ad46d22bcf12da95ad69e03c1b6f23f5e60a9Jens Axboe } 43221972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe if (f->fd != -1) { 43321972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe close(f->fd); 43421972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe f->fd = -1; 43521972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe } 43653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (f->mmap) { 43753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe munmap(f->mmap, f->file_size); 43853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe f->mmap = NULL; 43953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 44053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 441b4a6a59a939f0e6554632de311e7d1d1b7633ccfJens Axboe 442132ad46d22bcf12da95ad69e03c1b6f23f5e60a9Jens Axboe td->filename = NULL; 443b4a6a59a939f0e6554632de311e7d1d1b7633ccfJens Axboe free(td->files); 444b4a6a59a939f0e6554632de311e7d1d1b7633ccfJens Axboe td->files = NULL; 445b4a6a59a939f0e6554632de311e7d1d1b7633ccfJens Axboe td->nr_files = 0; 44653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe} 447