filesetup.c revision 1294c3ec7a02d20a98b105c1c41b23358afc67e4
153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe#include <unistd.h> 253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe#include <fcntl.h> 353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe#include <string.h> 453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe#include <assert.h> 5bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe#include <dirent.h> 6d74ac843d82345862070400cb5fe408524c613f3YAMAMOTO Takashi#include <libgen.h> 753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe#include <sys/stat.h> 853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe#include <sys/mman.h> 9bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe#include <sys/types.h> 1053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 1153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe#include "fio.h" 12f17c43928c202e557f2f325272c60d9050ee528eJens Axboe#include "smalloc.h" 134906e0b57f2b8cbad02ef2428522281cf6038bddJens Axboe#include "filehash.h" 14ecc314ba7c5f02b7e90ac1dfbce1a74cd4e6d6feBruce Cran#include "os/os.h" 1553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 167172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboestatic int root_warn; 177172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboe 18c592b9fe12d4739d99d5bece517e304804876df6Jens Axboestatic inline void clear_error(struct thread_data *td) 19c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe{ 20c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe td->error = 0; 21c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe td->verror[0] = '\0'; 22c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe} 23c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe 243baddf2450d811be658fb47ef883ee84478dc352Jens Axboe/* 253baddf2450d811be658fb47ef883ee84478dc352Jens Axboe * Leaves f->fd open on success, caller must close 263baddf2450d811be658fb47ef883ee84478dc352Jens Axboe */ 277bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboestatic int extend_file(struct thread_data *td, struct fio_file *f) 2825205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe{ 29ea443657ce85860b7a0dd2f39f2572d4a09fc885Jens Axboe int r, new_layout = 0, unlink_file = 0, flags; 3025205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe unsigned long long left; 3125205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe unsigned int bs; 3225205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe char *b; 33b2a151925a91f38aeb298d693687a47269ad4e94Jens Axboe 344241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe if (read_only) { 354241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe log_err("fio: refusing extend of file due to read-only\n"); 364241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe return 0; 374241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe } 384241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe 39507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe /* 40507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe * check if we need to lay the file out complete again. fio 41507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe * does that for operations involving reads, or for writes 42507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe * where overwrite is set 43507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe */ 44ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe if (td_read(td) || (td_write(td) && td->o.overwrite) || 45ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe (td_write(td) && td->io_ops->flags & FIO_NOEXTEND)) 46507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe new_layout = 1; 47ea443657ce85860b7a0dd2f39f2572d4a09fc885Jens Axboe if (td_write(td) && !td->o.overwrite) 48ea443657ce85860b7a0dd2f39f2572d4a09fc885Jens Axboe unlink_file = 1; 49507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe 506ae1f57f2cb8661b97b770372eeb3694f6d5a744Jens Axboe if (unlink_file || new_layout) { 51bd199f2b98eeb9101795e40fdef5889c630178c1Jens Axboe dprint(FD_FILE, "layout unlink %s\n", f->file_name); 52982016d689dc7fedbb09646ba0df7e72a781b164Zhang, Yanmin if ((unlink(f->file_name) < 0) && (errno != ENOENT)) { 537bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe td_verror(td, errno, "unlink"); 547bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe return 1; 557bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } 567bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } 577bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 58507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe flags = O_WRONLY | O_CREAT; 59507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe if (new_layout) 60507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe flags |= O_TRUNC; 61507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe 62ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe dprint(FD_FILE, "open file %s, flags %x\n", f->file_name, flags); 63507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe f->fd = open(f->file_name, flags, 0644); 6453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (f->fd < 0) { 65e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe td_verror(td, errno, "open"); 6653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 1; 6753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 6853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 697bc8c2cf02fbd538ca388618ff2f4618787a86e0Jens Axboe#ifdef FIO_HAVE_FALLOCATE 707bc8c2cf02fbd538ca388618ff2f4618787a86e0Jens Axboe if (td->o.fallocate && !td->o.fill_device) { 717bc8c2cf02fbd538ca388618ff2f4618787a86e0Jens Axboe dprint(FD_FILE, "fallocate file %s size %llu\n", f->file_name, 727bc8c2cf02fbd538ca388618ff2f4618787a86e0Jens Axboe f->real_file_size); 737bc8c2cf02fbd538ca388618ff2f4618787a86e0Jens Axboe 747bc8c2cf02fbd538ca388618ff2f4618787a86e0Jens Axboe r = posix_fallocate(f->fd, 0, f->real_file_size); 7510accd7cf68af21ef4831528626a75ba7a06ce81Greg Edwards if (r > 0) { 767bc8c2cf02fbd538ca388618ff2f4618787a86e0Jens Axboe log_err("fio: posix_fallocate fails: %s\n", 7710accd7cf68af21ef4831528626a75ba7a06ce81Greg Edwards strerror(r)); 787bc8c2cf02fbd538ca388618ff2f4618787a86e0Jens Axboe } 797bc8c2cf02fbd538ca388618ff2f4618787a86e0Jens Axboe } 807bc8c2cf02fbd538ca388618ff2f4618787a86e0Jens Axboe#endif 819b8365618309572d8fd2579c8ea3132db89f843fBruce Cran 82fc74ac1d749c977308016eb22c8658a9a5ac7989Shawn Lewis if (!new_layout) 83fc74ac1d749c977308016eb22c8658a9a5ac7989Shawn Lewis goto done; 84fc74ac1d749c977308016eb22c8658a9a5ac7989Shawn Lewis 855e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe /* 865e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe * The size will be -1ULL when fill_device is used, so don't truncate 875e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe * or fallocate this file, just write it 885e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe */ 895e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe if (!td->o.fill_device) { 905e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe dprint(FD_FILE, "truncate file %s, size %llu\n", f->file_name, 91ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe f->real_file_size); 925e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe if (ftruncate(f->fd, f->real_file_size) == -1) { 935e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe td_verror(td, errno, "ftruncate"); 945e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe goto err; 955e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe } 965e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe } 9740f8298cd252157fa15d93f8eb470116a94069a0Jens Axboe 982dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe b = malloc(td->o.max_bs[DDIR_WRITE]); 992dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe memset(b, 0, td->o.max_bs[DDIR_WRITE]); 10053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 1017bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe left = f->real_file_size; 10253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe while (left && !td->terminate) { 1032dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe bs = td->o.max_bs[DDIR_WRITE]; 10453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (bs > left) 10553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe bs = left; 10653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 10753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe r = write(f->fd, b, bs); 10853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 1095e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe if (r > 0) { 1105e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe left -= r; 11153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe continue; 11253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } else { 1135e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe if (r < 0) { 1145e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe int __e = errno; 1155e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe 1165e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe if (__e == ENOSPC) { 1175e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe if (td->o.fill_device) 1185e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe break; 1195e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe log_info("fio: ENOSPC on laying out " 1205e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe "file, stopping\n"); 1215e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe break; 1225e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe } 123e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe td_verror(td, errno, "write"); 1245e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe } else 125e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe td_verror(td, EIO, "write"); 12653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 12753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe break; 12853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 12953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 13053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 131ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe if (td->terminate) { 132ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe dprint(FD_FILE, "terminate unlink %s\n", f->file_name); 13353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe unlink(f->file_name); 134ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe } else if (td->o.create_fsync) { 13598e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe if (fsync(f->fd) < 0) { 13698e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe td_verror(td, errno, "fsync"); 13798e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe goto err; 13898e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe } 13998e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe } 1400d1cd207e409a36313784cb9596990c819775f77Jens Axboe if (td->o.fill_device && !td_write(td)) { 141d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe fio_file_clear_size_known(f); 1425e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe if (td_io_get_file_size(td, f)) 1435e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe goto err; 1445e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe if (f->io_size > f->real_file_size) 1455e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe f->io_size = f->real_file_size; 1465e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe } 14753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 14853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe free(b); 149507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboedone: 15053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 0; 15153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboeerr: 15253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe close(f->fd); 15353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe f->fd = -1; 15453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 1; 15553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe} 15653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 157afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanminstatic int pre_read_file(struct thread_data *td, struct fio_file *f) 158afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin{ 159b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe int r, did_open = 0, old_runstate; 160afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin unsigned long long left; 161afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin unsigned int bs; 162afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin char *b; 163afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin 1649c0d224129b0c59698e4c77e7fed00dc8cbb50e1Jens Axboe if (td->io_ops->flags & FIO_PIPEIO) 1659c0d224129b0c59698e4c77e7fed00dc8cbb50e1Jens Axboe return 0; 1669c0d224129b0c59698e4c77e7fed00dc8cbb50e1Jens Axboe 167d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe if (!fio_file_open(f)) { 168b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe if (td->io_ops->open_file(td, f)) { 169b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe log_err("fio: cannot pre-read, failed to open file\n"); 170b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe return 1; 171b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe } 172b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe did_open = 1; 173b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe } 174b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe 175b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe old_runstate = td->runstate; 176b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe td_set_runstate(td, TD_PRE_READING); 177b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe 178afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin bs = td->o.max_bs[DDIR_READ]; 179afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin b = malloc(bs); 180afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin memset(b, 0, bs); 181afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin 182afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin lseek(f->fd, f->file_offset, SEEK_SET); 183afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin left = f->io_size; 184afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin 185afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin while (left && !td->terminate) { 186afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin if (bs > left) 187afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin bs = left; 188afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin 189afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin r = read(f->fd, b, bs); 190afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin 191afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin if (r == (int) bs) { 192afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin left -= bs; 193afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin continue; 194afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin } else { 195afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin td_verror(td, EIO, "pre_read"); 196afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin break; 197afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin } 198afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin } 199afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin 200b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe td_set_runstate(td, old_runstate); 201b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe 202b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe if (did_open) 203b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe td->io_ops->close_file(td, f); 204afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin free(b); 205afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin return 0; 206afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin} 207afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin 2087bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboestatic unsigned long long get_rand_file_size(struct thread_data *td) 2099c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe{ 210dc873b6f4a536c332b72cce268d5a7ccd356a891Jens Axboe unsigned long long ret, sized; 2111294c3ec7a02d20a98b105c1c41b23358afc67e4Jens Axboe unsigned long r; 2129c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe 2134c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe if (td->o.use_os_rand) { 2144c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe r = os_random_long(&td->file_size_state); 2154c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe sized = td->o.file_size_high - td->o.file_size_low; 2164c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe ret = (unsigned long long) ((double) sized * (r / (OS_RAND_MAX + 1.0))); 2174c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe } else { 2184c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe r = __rand(&td->__file_size_state); 2194c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe sized = td->o.file_size_high - td->o.file_size_low; 2204c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe ret = (unsigned long long) ((double) sized * (r / (FRAND_MAX + 1.0))); 2214c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe } 2224c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe 2235ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe ret += td->o.file_size_low; 2242dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe ret -= (ret % td->o.rw_min_bs); 2259c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe return ret; 2269c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe} 2279c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe 22853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboestatic int file_size(struct thread_data *td, struct fio_file *f) 22953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{ 23053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe struct stat st; 23153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 232df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe if (stat(f->file_name, &st) == -1) { 2337bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe td_verror(td, errno, "fstat"); 2347bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe return 1; 2357bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } 23653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 2377bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe f->real_file_size = st.st_size; 23853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 0; 23953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe} 24053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 24153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboestatic int bdev_size(struct thread_data *td, struct fio_file *f) 24253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{ 2439b8365618309572d8fd2579c8ea3132db89f843fBruce Cran unsigned long long bytes = 0; 24453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe int r; 24553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 246df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe if (td->io_ops->open_file(td, f)) { 247df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe log_err("fio: failed opening blockdev %s for size check\n", 248df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe f->file_name); 249df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe return 1; 250df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe } 251df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe 252ecc314ba7c5f02b7e90ac1dfbce1a74cd4e6d6feBruce Cran r = blockdev_size(f, &bytes); 25353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (r) { 254e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe td_verror(td, r, "blockdev_size"); 2550e238572c4e63b0675fd9cbbf168d19ad8d60464Jens Axboe printf("fd is %d\n", f->fd); 256df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe goto err; 25753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 25853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 2597ab077ab119fd28b6ccf5705ea8453e414f574c1Jens Axboe if (!bytes) { 2607ab077ab119fd28b6ccf5705ea8453e414f574c1Jens Axboe log_err("%s: zero sized block device?\n", f->file_name); 261df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe goto err; 2627ab077ab119fd28b6ccf5705ea8453e414f574c1Jens Axboe } 2637ab077ab119fd28b6ccf5705ea8453e414f574c1Jens Axboe 26453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe f->real_file_size = bytes; 26522a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe td->io_ops->close_file(td, f); 26653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 0; 267df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboeerr: 268df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe td->io_ops->close_file(td, f); 269df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe return 1; 27053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe} 27153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 2724ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboestatic int char_size(struct thread_data *td, struct fio_file *f) 2734ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe{ 2744ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe#ifdef FIO_HAVE_CHARDEV_SIZE 2759b8365618309572d8fd2579c8ea3132db89f843fBruce Cran unsigned long long bytes = 0; 2764ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe int r; 2774ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe 2784ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe if (td->io_ops->open_file(td, f)) { 2794ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe log_err("fio: failed opening blockdev %s for size check\n", 2804ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe f->file_name); 2814ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe return 1; 2824ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe } 2834ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe 284ecc314ba7c5f02b7e90ac1dfbce1a74cd4e6d6feBruce Cran r = chardev_size(f, &bytes); 2854ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe if (r) { 2864ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe td_verror(td, r, "chardev_size"); 2874ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe goto err; 2884ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe } 2894ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe 2904ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe if (!bytes) { 2914ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe log_err("%s: zero sized char device?\n", f->file_name); 2924ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe goto err; 2934ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe } 2944ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe 2954ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe f->real_file_size = bytes; 2964ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe td->io_ops->close_file(td, f); 2974ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe return 0; 2984ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboeerr: 2994ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe td->io_ops->close_file(td, f); 3004ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe return 1; 3014ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe#else 3024ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe f->real_file_size = -1ULL; 3034ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe return 0; 3044ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe#endif 3054ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe} 3064ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe 30753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboestatic int get_file_size(struct thread_data *td, struct fio_file *f) 30853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{ 30953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe int ret = 0; 31053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 311d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe if (fio_file_size_known(f)) 312409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe return 0; 313409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe 3147bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (f->filetype == FIO_TYPE_FILE) 3157bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe ret = file_size(td, f); 3167bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe else if (f->filetype == FIO_TYPE_BD) 31753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe ret = bdev_size(td, f); 3184ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe else if (f->filetype == FIO_TYPE_CHAR) 3194ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe ret = char_size(td, f); 32053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe else 32153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe f->real_file_size = -1; 32253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 32353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (ret) 32453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return ret; 32553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 32653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (f->file_offset > f->real_file_size) { 3270f2152c19ed12fc2280c3d475973112f18e48cd5Bruce Cran log_err("%s: offset extends end (%llu > %llu)\n", td->o.name, 3285ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe f->file_offset, f->real_file_size); 32953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 1; 33053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 33153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 332d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe fio_file_set_size_known(f); 33353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 0; 33453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe} 33553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 3363baddf2450d811be658fb47ef883ee84478dc352Jens Axboestatic int __file_invalidate_cache(struct thread_data *td, struct fio_file *f, 3373baddf2450d811be658fb47ef883ee84478dc352Jens Axboe unsigned long long off, 3383baddf2450d811be658fb47ef883ee84478dc352Jens Axboe unsigned long long len) 339e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe{ 340e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe int ret = 0; 341e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe 3425e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe if (len == -1ULL) 3433baddf2450d811be658fb47ef883ee84478dc352Jens Axboe len = f->io_size; 3443baddf2450d811be658fb47ef883ee84478dc352Jens Axboe if (off == -1ULL) 3453baddf2450d811be658fb47ef883ee84478dc352Jens Axboe off = f->file_offset; 346ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe 3470d1cd207e409a36313784cb9596990c819775f77Jens Axboe if (len == -1ULL || off == -1ULL) 3480d1cd207e409a36313784cb9596990c819775f77Jens Axboe return 0; 3490d1cd207e409a36313784cb9596990c819775f77Jens Axboe 3503baddf2450d811be658fb47ef883ee84478dc352Jens Axboe dprint(FD_IO, "invalidate cache %s: %llu/%llu\n", f->file_name, off, 3513baddf2450d811be658fb47ef883ee84478dc352Jens Axboe len); 352b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe 353e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe /* 354e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe * FIXME: add blockdev flushing too 355e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe */ 356a1c58075279454a91ec43366846b93e8dcf9753cJens Axboe if (f->mmap_ptr) { 35703e20d687566753b90383571e5e152c5142bdffdBruce Cran ret = posix_madvise(f->mmap_ptr, f->mmap_sz, POSIX_MADV_DONTNEED); 358a1c58075279454a91ec43366846b93e8dcf9753cJens Axboe#ifdef FIO_MADV_FREE 35903e20d687566753b90383571e5e152c5142bdffdBruce Cran (void) posix_madvise(f->mmap_ptr, f->mmap_sz, FIO_MADV_FREE); 360a1c58075279454a91ec43366846b93e8dcf9753cJens Axboe#endif 361a1c58075279454a91ec43366846b93e8dcf9753cJens Axboe } else if (f->filetype == FIO_TYPE_FILE) { 362ecc314ba7c5f02b7e90ac1dfbce1a74cd4e6d6feBruce Cran ret = posix_fadvise(f->fd, off, len, POSIX_FADV_DONTNEED); 3635ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe } else if (f->filetype == FIO_TYPE_BD) { 364ecc314ba7c5f02b7e90ac1dfbce1a74cd4e6d6feBruce Cran ret = blockdev_invalidate_cache(f); 3657e0e25c924d51f23196b3e0ea83b79178fc46823Jens Axboe if (ret < 0 && errno == EACCES && geteuid()) { 3667172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboe if (!root_warn) { 3675ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe log_err("fio: only root may flush block " 3685ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe "devices. Cache flush bypassed!\n"); 3697172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboe root_warn = 1; 3707172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboe } 3717e0e25c924d51f23196b3e0ea83b79178fc46823Jens Axboe ret = 0; 3727e0e25c924d51f23196b3e0ea83b79178fc46823Jens Axboe } 373b5605e9ded4188ed91faae1a43ecd333a9856f62Jens Axboe } else if (f->filetype == FIO_TYPE_CHAR || f->filetype == FIO_TYPE_PIPE) 374e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe ret = 0; 375e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe 376e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe if (ret < 0) { 377e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe td_verror(td, errno, "invalidate_cache"); 378e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe return 1; 3793baddf2450d811be658fb47ef883ee84478dc352Jens Axboe } else if (ret > 0) { 3803baddf2450d811be658fb47ef883ee84478dc352Jens Axboe td_verror(td, ret, "invalidate_cache"); 3813baddf2450d811be658fb47ef883ee84478dc352Jens Axboe return 1; 382e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe } 383e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe 384ad2da605a62faf16887970618b434db19594e17bJens Axboe return ret; 3853baddf2450d811be658fb47ef883ee84478dc352Jens Axboe 3863baddf2450d811be658fb47ef883ee84478dc352Jens Axboe} 3873baddf2450d811be658fb47ef883ee84478dc352Jens Axboe 3883baddf2450d811be658fb47ef883ee84478dc352Jens Axboeint file_invalidate_cache(struct thread_data *td, struct fio_file *f) 3893baddf2450d811be658fb47ef883ee84478dc352Jens Axboe{ 390d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe if (!fio_file_open(f)) 391a5fb461fdff86c442daeebbd28e07984be9f3807Jens Axboe return 0; 392a5fb461fdff86c442daeebbd28e07984be9f3807Jens Axboe 3935e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe return __file_invalidate_cache(td, f, -1ULL, -1ULL); 394e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe} 395e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe 3966977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboeint generic_close_file(struct thread_data fio_unused *td, struct fio_file *f) 39753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{ 3986977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe int ret = 0; 3996977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe 400ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe dprint(FD_FILE, "fd close %s\n", f->file_name); 4014906e0b57f2b8cbad02ef2428522281cf6038bddJens Axboe 4024906e0b57f2b8cbad02ef2428522281cf6038bddJens Axboe remove_file_hash(f); 4034906e0b57f2b8cbad02ef2428522281cf6038bddJens Axboe 4046977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe if (close(f->fd) < 0) 4056977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe ret = errno; 4066977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe 407b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe f->fd = -1; 4086977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe return ret; 40953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe} 41053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 4114d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboestatic int file_lookup_open(struct fio_file *f, int flags) 41253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{ 41329c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe struct fio_file *__f; 4144d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe int from_hash; 4154d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe 4164d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe __f = lookup_file_hash(f->file_name); 4174d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe if (__f) { 4189efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe dprint(FD_FILE, "found file in hash %s\n", f->file_name); 4194d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe /* 4204d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe * racy, need the __f->lock locked 4214d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe */ 4224d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe f->lock = __f->lock; 4234d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe f->lock_owner = __f->lock_owner; 4244d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe f->lock_batch = __f->lock_batch; 4254d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe f->lock_ddir = __f->lock_ddir; 4264d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe from_hash = 1; 4274d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe } else { 4289efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe dprint(FD_FILE, "file not found in hash %s\n", f->file_name); 4294d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe from_hash = 0; 4304d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe } 4314d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe 432e8670ef8b26039573fbf835b4b95ba45a1039d83Jens Axboe f->fd = open(f->file_name, flags, 0600); 4334d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe return from_hash; 4344d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe} 4354d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe 4364d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboeint generic_open_file(struct thread_data *td, struct fio_file *f) 4374d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe{ 438661598287ecc3b8987f312cf8403936552ce686aJens Axboe int is_std = 0; 43953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe int flags = 0; 44029c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe int from_hash = 0; 44153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 442ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe dprint(FD_FILE, "fd open %s\n", f->file_name); 443ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe 444661598287ecc3b8987f312cf8403936552ce686aJens Axboe if (!strcmp(f->file_name, "-")) { 445661598287ecc3b8987f312cf8403936552ce686aJens Axboe if (td_rw(td)) { 446661598287ecc3b8987f312cf8403936552ce686aJens Axboe log_err("fio: can't read/write to stdin/out\n"); 447661598287ecc3b8987f312cf8403936552ce686aJens Axboe return 1; 448661598287ecc3b8987f312cf8403936552ce686aJens Axboe } 449661598287ecc3b8987f312cf8403936552ce686aJens Axboe is_std = 1; 450ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe 451ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe /* 452ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe * move output logging to stderr, if we are writing to stdout 453ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe */ 454ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe if (td_write(td)) 455ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe f_out = stderr; 456661598287ecc3b8987f312cf8403936552ce686aJens Axboe } 457661598287ecc3b8987f312cf8403936552ce686aJens Axboe 4582dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe if (td->o.odirect) 4592fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe flags |= OS_O_DIRECT; 4602dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe if (td->o.sync_io) 4612fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe flags |= O_SYNC; 462ad92396cc21055cee93470dcf65e82ccde03aac5Jens Axboe if (f->filetype != FIO_TYPE_FILE) 4635921e80c5dfc9f96d2f21da6ae58f2b5d3a0b373Jens Axboe flags |= FIO_O_NOATIME; 464814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe if (td->o.create_on_open) 465814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe flags |= O_CREAT; 46653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 467056f3459149a7670257350d84b49858718e4a0e6Aaron Carrollopen_again: 468660a1cb5fb9843ec09a04337714e78d63cd557e7Jens Axboe if (td_write(td)) { 469173081581f94dc4f9f203eb7a7922fc843bfafdeJens Axboe if (!read_only) 470173081581f94dc4f9f203eb7a7922fc843bfafdeJens Axboe flags |= O_RDWR; 47153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 472af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe if (f->filetype == FIO_TYPE_FILE) 4732fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe flags |= O_CREAT; 4742fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe 475661598287ecc3b8987f312cf8403936552ce686aJens Axboe if (is_std) 476661598287ecc3b8987f312cf8403936552ce686aJens Axboe f->fd = dup(STDOUT_FILENO); 4774d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe else 4784d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe from_hash = file_lookup_open(f, flags); 4792fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe } else { 4804241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe if (f->filetype == FIO_TYPE_CHAR && !read_only) 4812fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe flags |= O_RDWR; 4822fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe else 4832fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe flags |= O_RDONLY; 4842fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe 485661598287ecc3b8987f312cf8403936552ce686aJens Axboe if (is_std) 486661598287ecc3b8987f312cf8403936552ce686aJens Axboe f->fd = dup(STDIN_FILENO); 4874d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe else 4884d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe from_hash = file_lookup_open(f, flags); 48953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 49053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 49153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (f->fd == -1) { 492e4e33258637e55550a0fac59eb3350e8bf06f8e6Jens Axboe char buf[FIO_VERROR_SIZE]; 493e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe int __e = errno; 494e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe 495835d9b9ed0e5c2591b8a3eacbd5f4ab6bdab466cJens Axboe if (__e == EPERM && (flags & FIO_O_NOATIME)) { 4965921e80c5dfc9f96d2f21da6ae58f2b5d3a0b373Jens Axboe flags &= ~FIO_O_NOATIME; 497056f3459149a7670257350d84b49858718e4a0e6Aaron Carroll goto open_again; 498056f3459149a7670257350d84b49858718e4a0e6Aaron Carroll } 499056f3459149a7670257350d84b49858718e4a0e6Aaron Carroll 500e8670ef8b26039573fbf835b4b95ba45a1039d83Jens Axboe snprintf(buf, sizeof(buf) - 1, "open(%s)", f->file_name); 501e4e33258637e55550a0fac59eb3350e8bf06f8e6Jens Axboe 502e4e33258637e55550a0fac59eb3350e8bf06f8e6Jens Axboe td_verror(td, __e, buf); 50353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 50453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 50529c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe if (!from_hash && f->fd != -1) { 50629c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe if (add_file_hash(f)) { 50729c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe int ret; 50829c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe 50929c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe /* 51029c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe * OK to ignore, we haven't done anything with it 51129c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe */ 51229c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe ret = generic_close_file(td, f); 51329c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe goto open_again; 51429c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe } 51529c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe } 5164906e0b57f2b8cbad02ef2428522281cf6038bddJens Axboe 51753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 0; 518b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe} 519b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe 520df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboeint generic_get_file_size(struct thread_data *td, struct fio_file *f) 52121972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe{ 522df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe return get_file_size(td, f); 52321972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe} 52421972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe 5257bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe/* 5267bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * open/close all files, so that ->real_file_size gets set 5277bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */ 528bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboestatic int get_file_sizes(struct thread_data *td) 5297bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe{ 5307bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe struct fio_file *f; 5317bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe unsigned int i; 532bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe int err = 0; 5337bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 5347bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe for_each_file(td, f, i) { 5355ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe dprint(FD_FILE, "get file size for %p/%d/%p\n", f, i, 5365ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe f->file_name); 5379efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe 53899a47c6905731e53dd4d8f7ea6501f36d9329e7bJens Axboe if (td_io_get_file_size(td, f)) { 53940b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe if (td->error != ENOENT) { 54040b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe log_err("%s\n", td->verror); 54140b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe err = 1; 54240b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe } 543541d66d70b8fbe9860b31307c0760e6d5f4c78a8Jens Axboe clear_error(td); 54407eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe } 545409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe 546409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe if (f->real_file_size == -1ULL && td->o.size) 547409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe f->real_file_size = td->o.size / td->o.nr_files; 5487bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } 549bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe 550bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe return err; 5517bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe} 5527bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 5532e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboestruct fio_mount { 5542e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe struct flist_head list; 5552e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe const char *base; 5562e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe char __base[256]; 5572e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe unsigned int key; 5582e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe}; 5592e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 5602e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe/* 5612e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe * Get free number of bytes for each file on each unique mount. 5622e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe */ 5632e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboestatic unsigned long long get_fs_free_counts(struct thread_data *td) 5642e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe{ 5652e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe struct flist_head *n, *tmp; 56668b0316f581c3c881d7dbf7c9dafef4a10100a66Jens Axboe unsigned long long ret = 0; 5672e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe struct fio_mount *fm; 5682e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe FLIST_HEAD(list); 5692e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe struct fio_file *f; 5702e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe unsigned int i; 5712e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 5722e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe for_each_file(td, f, i) { 5732e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe struct stat sb; 5742e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe char buf[256]; 5752e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 5764ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe if (f->filetype == FIO_TYPE_BD || f->filetype == FIO_TYPE_CHAR) { 5774ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe if (f->real_file_size != -1ULL) 5784ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe ret += f->real_file_size; 57968b0316f581c3c881d7dbf7c9dafef4a10100a66Jens Axboe continue; 58068b0316f581c3c881d7dbf7c9dafef4a10100a66Jens Axboe } else if (f->filetype != FIO_TYPE_FILE) 58168b0316f581c3c881d7dbf7c9dafef4a10100a66Jens Axboe continue; 58268b0316f581c3c881d7dbf7c9dafef4a10100a66Jens Axboe 5832e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe strcpy(buf, f->file_name); 5842e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 5852e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe if (stat(buf, &sb) < 0) { 5862e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe if (errno != ENOENT) 5872e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe break; 5882e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe strcpy(buf, "."); 5892e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe if (stat(buf, &sb) < 0) 5902e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe break; 5912e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe } 5922e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 5932e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe fm = NULL; 5942e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe flist_for_each(n, &list) { 5952e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe fm = flist_entry(n, struct fio_mount, list); 5962e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe if (fm->key == sb.st_dev) 5972e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe break; 5982e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 5992e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe fm = NULL; 6002e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe } 6012e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 6022e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe if (fm) 6032e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe continue; 6042e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 6052e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe fm = malloc(sizeof(*fm)); 6062e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe strcpy(fm->__base, buf); 6072e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe fm->base = basename(fm->__base); 6082e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe fm->key = sb.st_dev; 6092e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe flist_add(&fm->list, &list); 6102e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe } 6112e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 6122e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe flist_for_each_safe(n, tmp, &list) { 6132e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe unsigned long long sz; 6142e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 6152e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe fm = flist_entry(n, struct fio_mount, list); 6162e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe flist_del(&fm->list); 6172e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 6182e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe sz = get_fs_size(fm->base); 6192e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe if (sz && sz != -1ULL) 6202e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe ret += sz; 6212e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 6222e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe free(fm); 6232e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe } 6242e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 6252e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe return ret; 6262e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe} 6272e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 6287bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe/* 6297bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * Open the files and setup files sizes, creating files if necessary. 6307bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */ 63153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboeint setup_files(struct thread_data *td) 63253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{ 6337bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe unsigned long long total_size, extend_size; 63453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe struct fio_file *f; 635af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe unsigned int i; 636000b080395e45cbe0ce54e75f0e993addbdc8676Jens Axboe int err = 0, need_extend; 63753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 638ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe dprint(FD_FILE, "setup files\n"); 639ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe 640691c8fb014da9dd82e999a90b5511423f4eee188Jens Axboe if (td->o.read_iolog_file) 641691c8fb014da9dd82e999a90b5511423f4eee188Jens Axboe return 0; 642691c8fb014da9dd82e999a90b5511423f4eee188Jens Axboe 64353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe /* 64453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe * if ioengine defines a setup() method, it's responsible for 6457bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * opening the files and setting f->real_file_size to indicate 6467bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * the valid range for that file. 64753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe */ 64853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (td->io_ops->setup) 6497bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe err = td->io_ops->setup(td); 6507bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe else 651bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe err = get_file_sizes(td); 65253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 653f102706350093e60617cc271b128e56c57ab3ce7Jens Axboe if (err) 654f102706350093e60617cc271b128e56c57ab3ce7Jens Axboe return err; 655f102706350093e60617cc271b128e56c57ab3ce7Jens Axboe 6560a7eb121ecb2e4279e9eb8178aa1e554dda40191Jens Axboe /* 6577bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * check sizes. if the files/devices do not exist and the size 6587bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * isn't passed to fio, abort. 6590a7eb121ecb2e4279e9eb8178aa1e554dda40191Jens Axboe */ 6607bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe total_size = 0; 6617bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe for_each_file(td, f, i) { 6627bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (f->real_file_size == -1ULL) 6637bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe total_size = -1ULL; 6647bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe else 6657bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe total_size += f->real_file_size; 6667bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } 6670a7eb121ecb2e4279e9eb8178aa1e554dda40191Jens Axboe 6682e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe if (td->o.fill_device) 6692e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe td->fill_device_size = get_fs_free_counts(td); 6702e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 6717bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe /* 6727bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * device/file sizes are zero and no size given, punt 6737bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */ 6741f809d151ddc4a4c348c2e4f6007db510e3e08a2Jens Axboe if ((!total_size || total_size == -1ULL) && !td->o.size && 675aa31f1f108348ba2a8749c73fa8c25f3d4630a7cShawn Lewis !(td->io_ops->flags & FIO_NOIO) && !td->o.fill_device) { 6767bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe log_err("%s: you need to specify size=\n", td->o.name); 677e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe td_verror(td, EINVAL, "total_file_size"); 67853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 1; 67953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 68053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 6817bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe /* 6827bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * now file sizes are known, so we can set ->io_size. if size= is 6837bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * not given, ->io_size is just equal to ->real_file_size. if size 6847bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * is given, ->io_size is size / nr_files. 6857bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */ 6867bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe extend_size = total_size = 0; 6877bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe need_extend = 0; 6887bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe for_each_file(td, f, i) { 689bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang f->file_offset = td->o.start_offset; 690bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang 6917bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (!td->o.file_size_low) { 6927bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe /* 6937bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * no file size range given, file size is equal to 6947bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * total size divided by number of files. if that is 6957bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * zero, set it to the real file size. 6967bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */ 6977bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe f->io_size = td->o.size / td->o.nr_files; 69865bdb10a09222d8b5d213de74824be775772ea8fJens Axboe if (!f->io_size) 699273f8c912d981439049d9b21aa048aaeaa323c5dJens Axboe f->io_size = f->real_file_size - f->file_offset; 7007bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } else if (f->real_file_size < td->o.file_size_low || 7017bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe f->real_file_size > td->o.file_size_high) { 7025ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe if (f->file_offset > td->o.file_size_low) 703bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang goto err_offset; 7047bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe /* 7057bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * file size given. if it's fixed, use that. if it's a 7067bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * range, generate a random size in-between. 7077bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */ 7085ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe if (td->o.file_size_low == td->o.file_size_high) { 7095ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe f->io_size = td->o.file_size_low 7105ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe - f->file_offset; 7115ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe } else { 7125ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe f->io_size = get_rand_file_size(td) 7135ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe - f->file_offset; 7145ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe } 71565bdb10a09222d8b5d213de74824be775772ea8fJens Axboe } else 716bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang f->io_size = f->real_file_size - f->file_offset; 71753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 7187bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (f->io_size == -1ULL) 7197bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe total_size = -1ULL; 7207bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe else 7217bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe total_size += f->io_size; 7227bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 7237bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (f->filetype == FIO_TYPE_FILE && 724bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang (f->io_size + f->file_offset) > f->real_file_size && 7257bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe !(td->io_ops->flags & FIO_DISKLESSIO)) { 726814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe if (!td->o.create_on_open) { 727814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe need_extend++; 728814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe extend_size += (f->io_size + f->file_offset); 729814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe } else 730814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe f->real_file_size = f->io_size + f->file_offset; 731d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe fio_file_set_extend(f); 7325ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe } 7337bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } 73453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 7352298290eabbe1017421a6ba0f5de93d8c2b048adljzhang,Yaxin Hu,Jianchao Tang if (!td->o.size || td->o.size > total_size) 7367bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe td->o.size = total_size; 73721972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe 7387bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe /* 7397bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * See if we need to extend some files 7407bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */ 7417bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (need_extend) { 7427bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe temp_stall_ts = 1; 743a7ba8c5f4c0f9fe117d529c1ad6686b2070bae51Shaozhi Shawn Ye if (!terse_output) 744a7ba8c5f4c0f9fe117d529c1ad6686b2070bae51Shaozhi Shawn Ye log_info("%s: Laying out IO file(s) (%u file(s) /" 7450f2152c19ed12fc2280c3d475973112f18e48cd5Bruce Cran " %lluMB)\n", td->o.name, need_extend, 746a7ba8c5f4c0f9fe117d529c1ad6686b2070bae51Shaozhi Shawn Ye extend_size >> 20); 7477bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 7487bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe for_each_file(td, f, i) { 7495e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe unsigned long long old_len = -1ULL, extend_len = -1ULL; 7503baddf2450d811be658fb47ef883ee84478dc352Jens Axboe 751d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe if (!fio_file_extend(f)) 7527bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe continue; 7537bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 754409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe assert(f->filetype == FIO_TYPE_FILE); 755d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe fio_file_clear_extend(f); 7565e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe if (!td->o.fill_device) { 7575e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe old_len = f->real_file_size; 7580b9d69ecb14045cf3b2622ae922756b9889b25e6Jens Axboe extend_len = f->io_size + f->file_offset - 7590b9d69ecb14045cf3b2622ae922756b9889b25e6Jens Axboe old_len; 7605e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe } 761bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang f->real_file_size = (f->io_size + f->file_offset); 7627bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe err = extend_file(td, f); 7637bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (err) 7643baddf2450d811be658fb47ef883ee84478dc352Jens Axboe break; 7655e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe 7663baddf2450d811be658fb47ef883ee84478dc352Jens Axboe err = __file_invalidate_cache(td, f, old_len, 7673baddf2450d811be658fb47ef883ee84478dc352Jens Axboe extend_len); 7683baddf2450d811be658fb47ef883ee84478dc352Jens Axboe close(f->fd); 7693baddf2450d811be658fb47ef883ee84478dc352Jens Axboe f->fd = -1; 7703baddf2450d811be658fb47ef883ee84478dc352Jens Axboe if (err) 7717bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe break; 7727bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } 7737bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe temp_stall_ts = 0; 7747bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } 7757bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 7767bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (err) 7777bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe return err; 7787bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 7797bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (!td->o.zone_size) 7807bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe td->o.zone_size = td->o.size; 7817bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 782ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe /* 783ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe * iolog already set the total io size, if we read back 784ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe * stored entries. 785ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe */ 786ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe if (!td->o.read_iolog_file) 787ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe td->total_io_size = td->o.size * td->o.loops; 7887bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe return 0; 789bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tangerr_offset: 790bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang log_err("%s: you need to specify valid offset=\n", td->o.name); 791bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang return 1; 79253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe} 79353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 794afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanminint pre_read_files(struct thread_data *td) 795afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin{ 796afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin struct fio_file *f; 797afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin unsigned int i; 798afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin 799afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin dprint(FD_FILE, "pre_read files\n"); 800afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin 801afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin for_each_file(td, f, i) { 802afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin pre_read_file(td, f); 803afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin } 804afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin 805afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin return 1; 806afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin} 807afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin 808687270767de17dbad53c50e03e5d73d52505405cJens Axboeint init_random_map(struct thread_data *td) 809687270767de17dbad53c50e03e5d73d52505405cJens Axboe{ 810509eab12448823a8eefbe925804b5308ee63bf5eJens Axboe unsigned long long blocks, num_maps; 811687270767de17dbad53c50e03e5d73d52505405cJens Axboe struct fio_file *f; 812687270767de17dbad53c50e03e5d73d52505405cJens Axboe unsigned int i; 813687270767de17dbad53c50e03e5d73d52505405cJens Axboe 814de8dd119d7d869dd9c90c6d62bf4bededd10642eJens Axboe if (td->o.norandommap || !td_random(td)) 815687270767de17dbad53c50e03e5d73d52505405cJens Axboe return 0; 816687270767de17dbad53c50e03e5d73d52505405cJens Axboe 817687270767de17dbad53c50e03e5d73d52505405cJens Axboe for_each_file(td, f, i) { 8185ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe blocks = (f->real_file_size + td->o.rw_min_bs - 1) / 8195ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe (unsigned long long) td->o.rw_min_bs; 8205ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe num_maps = (blocks + BLOCKS_PER_MAP - 1) / 8215ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe (unsigned long long) BLOCKS_PER_MAP; 8220ce8b119b65849e537cab628a176a0ec4238aab0Jens Axboe f->file_map = smalloc(num_maps * sizeof(unsigned long)); 823303032ae4e13c7ac10b8198c40df98d95a4524a6Jens Axboe if (f->file_map) { 824303032ae4e13c7ac10b8198c40df98d95a4524a6Jens Axboe f->num_maps = num_maps; 825303032ae4e13c7ac10b8198c40df98d95a4524a6Jens Axboe continue; 826687270767de17dbad53c50e03e5d73d52505405cJens Axboe } 8272b386d2569c9078ca9790c4e6d318ec3835b8739Jens Axboe if (!td->o.softrandommap) { 8285ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe log_err("fio: failed allocating random map. If running" 8295ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe " a large number of jobs, try the 'norandommap'" 8302b386d2569c9078ca9790c4e6d318ec3835b8739Jens Axboe " option or set 'softrandommap'. Or give" 8312b386d2569c9078ca9790c4e6d318ec3835b8739Jens Axboe " a larger --alloc-size to fio.\n"); 832687270767de17dbad53c50e03e5d73d52505405cJens Axboe return 1; 833687270767de17dbad53c50e03e5d73d52505405cJens Axboe } 834303032ae4e13c7ac10b8198c40df98d95a4524a6Jens Axboe 835303032ae4e13c7ac10b8198c40df98d95a4524a6Jens Axboe log_info("fio: file %s failed allocating random map. Running " 836303032ae4e13c7ac10b8198c40df98d95a4524a6Jens Axboe "job without.\n", f->file_name); 837303032ae4e13c7ac10b8198c40df98d95a4524a6Jens Axboe f->num_maps = 0; 838687270767de17dbad53c50e03e5d73d52505405cJens Axboe } 839687270767de17dbad53c50e03e5d73d52505405cJens Axboe 840687270767de17dbad53c50e03e5d73d52505405cJens Axboe return 0; 841687270767de17dbad53c50e03e5d73d52505405cJens Axboe} 842687270767de17dbad53c50e03e5d73d52505405cJens Axboe 84353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboevoid close_files(struct thread_data *td) 84453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{ 8450ab8db8943acc6b9ea778735563bfad2a79e8dddJens Axboe struct fio_file *f; 846af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe unsigned int i; 84753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 8482be3eec330360e6735fb4e7d70907e11eaa346f8Jens Axboe for_each_file(td, f, i) { 8492be3eec330360e6735fb4e7d70907e11eaa346f8Jens Axboe if (fio_file_open(f)) 8502be3eec330360e6735fb4e7d70907e11eaa346f8Jens Axboe td_io_close_file(td, f); 8512be3eec330360e6735fb4e7d70907e11eaa346f8Jens Axboe } 85224ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe} 85324ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe 85424ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboevoid close_and_free_files(struct thread_data *td) 85524ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe{ 85624ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe struct fio_file *f; 85724ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe unsigned int i; 85824ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe 859ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe dprint(FD_FILE, "close files\n"); 860ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe 8610ab8db8943acc6b9ea778735563bfad2a79e8dddJens Axboe for_each_file(td, f, i) { 862ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe if (td->o.unlink && f->filetype == FIO_TYPE_FILE) { 863ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe dprint(FD_FILE, "free unlink %s\n", f->file_name); 864132ad46d22bcf12da95ad69e03c1b6f23f5e60a9Jens Axboe unlink(f->file_name); 865ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe } 866bdb4e2e99d4a87e5d3677cc09aa1ce92135125a9Jens Axboe 86722a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe if (fio_file_open(f)) 86822a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe td_io_close_file(td, f); 86922a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe 870b9fbcf2104ab79127825e0c23ba0a147ec076087Shaozhi Shawn Ye remove_file_hash(f); 871b3dc7f075b85e004f8c681ebb8566475017696f3Jens Axboe 872f17c43928c202e557f2f325272c60d9050ee528eJens Axboe sfree(f->file_name); 873fa1da8653e2177b3cc31a91e963c389f079d4172Jens Axboe f->file_name = NULL; 87461eb313e28c0f0ba8eb144c5b5f331b6b74c4fc8Jens Axboe sfree(f->file_map); 87561eb313e28c0f0ba8eb144c5b5f331b6b74c4fc8Jens Axboe f->file_map = NULL; 87678d99e6a2695d3a7936c5dd02f996f13a30309b1Jens Axboe sfree(f); 87753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 878b4a6a59a939f0e6554632de311e7d1d1b7633ccfJens Axboe 8792dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe td->o.filename = NULL; 880cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe free(td->files); 8819efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe td->files_index = 0; 882b4a6a59a939f0e6554632de311e7d1d1b7633ccfJens Axboe td->files = NULL; 8832dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe td->o.nr_files = 0; 88453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe} 885af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe 886e3bab463d4397e3378d8c7437e31de8aaf861a4fJens Axboestatic void get_file_type(struct fio_file *f) 887af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe{ 888af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe struct stat sb; 889af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe 890661598287ecc3b8987f312cf8403936552ce686aJens Axboe if (!strcmp(f->file_name, "-")) 891661598287ecc3b8987f312cf8403936552ce686aJens Axboe f->filetype = FIO_TYPE_PIPE; 892661598287ecc3b8987f312cf8403936552ce686aJens Axboe else 893661598287ecc3b8987f312cf8403936552ce686aJens Axboe f->filetype = FIO_TYPE_FILE; 894af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe 895b30d395ec288508f9c787af11d0f52e9df26e39fJens Axboe if (!stat(f->file_name, &sb)) { 896ecc314ba7c5f02b7e90ac1dfbce1a74cd4e6d6feBruce Cran /* \\.\ is the device namespace in Windows, where every file is 897ecc314ba7c5f02b7e90ac1dfbce1a74cd4e6d6feBruce Cran * a block device */ 898ecc314ba7c5f02b7e90ac1dfbce1a74cd4e6d6feBruce Cran if (S_ISBLK(sb.st_mode) || strncmp(f->file_name, "\\\\.\\", 4) == 0) 899af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe f->filetype = FIO_TYPE_BD; 900af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe else if (S_ISCHR(sb.st_mode)) 901af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe f->filetype = FIO_TYPE_CHAR; 902b5605e9ded4188ed91faae1a43ecd333a9856f62Jens Axboe else if (S_ISFIFO(sb.st_mode)) 903b5605e9ded4188ed91faae1a43ecd333a9856f62Jens Axboe f->filetype = FIO_TYPE_PIPE; 904af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe } 905af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe} 906af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe 907f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboeint add_file(struct thread_data *td, const char *fname) 908af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe{ 9097b4e4fe5e6fa26f82f9169c18ec70c08d0805ca9Jens Axboe int cur_files = td->files_index; 910bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe char file_name[PATH_MAX]; 911af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe struct fio_file *f; 912bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe int len = 0; 913af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe 914ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe dprint(FD_FILE, "add file %s\n", fname); 915ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe 916f17c43928c202e557f2f325272c60d9050ee528eJens Axboe f = smalloc(sizeof(*f)); 917c48c0be79173897824d8f439c39374f2588931dcJens Axboe if (!f) { 918c48c0be79173897824d8f439c39374f2588931dcJens Axboe log_err("fio: smalloc OOM\n"); 919c48c0be79173897824d8f439c39374f2588931dcJens Axboe assert(0); 920c48c0be79173897824d8f439c39374f2588931dcJens Axboe } 9210b9d69ecb14045cf3b2622ae922756b9889b25e6Jens Axboe 922af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe f->fd = -1; 92338dad62d5154ffaad445bd0231b271b9a46a5190Jens Axboe fio_file_reset(f); 924bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe 925fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe if (td->files_size <= td->files_index) { 9264b341fca0dab0caa41d000e8db36f1530c26616fCarl Henrik Lunde int new_size = td->o.nr_files + 1; 927126d65c6fc97d6acdc568aa5a969c012018daf15Jens Axboe 928fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe dprint(FD_FILE, "resize file array to %d files\n", new_size); 929fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe 930fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe td->files = realloc(td->files, new_size * sizeof(f)); 931fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe td->files_size = new_size; 932fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe } 9338bb7679e73d3086a01b9d21a650b0d7a859412b6Jens Axboe td->files[cur_files] = f; 934126d65c6fc97d6acdc568aa5a969c012018daf15Jens Axboe 93507eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe /* 93607eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe * init function, io engine may not be loaded yet 93707eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe */ 93807eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe if (td->io_ops && (td->io_ops->flags & FIO_DISKLESSIO)) 93907eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe f->real_file_size = -1ULL; 94007eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe 941bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe if (td->o.directory) 942bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe len = sprintf(file_name, "%s/", td->o.directory); 943bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe 944bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe sprintf(file_name + len, "%s", fname); 945f17c43928c202e557f2f325272c60d9050ee528eJens Axboe f->file_name = smalloc_strdup(file_name); 946c48c0be79173897824d8f439c39374f2588931dcJens Axboe if (!f->file_name) { 947c48c0be79173897824d8f439c39374f2588931dcJens Axboe log_err("fio: smalloc OOM\n"); 948c48c0be79173897824d8f439c39374f2588931dcJens Axboe assert(0); 949c48c0be79173897824d8f439c39374f2588931dcJens Axboe } 9500b9d69ecb14045cf3b2622ae922756b9889b25e6Jens Axboe 951e3bab463d4397e3378d8c7437e31de8aaf861a4fJens Axboe get_file_type(f); 952af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe 9534d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe switch (td->o.file_lock_mode) { 9544d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe case FILE_LOCK_NONE: 9554d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe break; 9564d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe case FILE_LOCK_READWRITE: 9574d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe f->lock = fio_mutex_rw_init(); 9584d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe break; 9594d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe case FILE_LOCK_EXCLUSIVE: 9604d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe f->lock = fio_mutex_init(1); 9614d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe break; 9624d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe default: 9634d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe log_err("fio: unknown lock mode: %d\n", td->o.file_lock_mode); 9644d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe assert(0); 9654d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe } 96629c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe 9677b4e4fe5e6fa26f82f9169c18ec70c08d0805ca9Jens Axboe td->files_index++; 9681549441cdfecb2c1a4a8b8d494253859d67b4344Jens Axboe if (f->filetype == FIO_TYPE_FILE) 9691549441cdfecb2c1a4a8b8d494253859d67b4344Jens Axboe td->nr_normal_files++; 970f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe 9715ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe dprint(FD_FILE, "file %p \"%s\" added at %d\n", f, f->file_name, 9725ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe cur_files); 9739efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe 974f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe return cur_files; 975af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe} 9760ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe 97749ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboeint add_file_exclusive(struct thread_data *td, const char *fname) 97849ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe{ 97949ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe struct fio_file *f; 98049ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe unsigned int i; 98149ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe 98249ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe for_each_file(td, f, i) { 98349ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe if (!strcmp(f->file_name, fname)) 98449ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe return i; 98549ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe } 98649ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe 98749ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe return add_file(td, fname); 98849ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe} 98949ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe 9900ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboevoid get_file(struct fio_file *f) 9910ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe{ 9928172fe972f3a79d42f34d7f6e259ed3f7f800316Jens Axboe dprint(FD_FILE, "get file %s, ref=%d\n", f->file_name, f->references); 993d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe assert(fio_file_open(f)); 9940ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe f->references++; 9950ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe} 9960ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe 9976977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboeint put_file(struct thread_data *td, struct fio_file *f) 9980ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe{ 99998e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe int f_ret = 0, ret = 0; 10006977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe 10018172fe972f3a79d42f34d7f6e259ed3f7f800316Jens Axboe dprint(FD_FILE, "put file %s, ref=%d\n", f->file_name, f->references); 1002ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe 100322a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe if (!fio_file_open(f)) { 100422a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe assert(f->fd == -1); 10056977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe return 0; 100622a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe } 10070ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe 10080ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe assert(f->references); 10090ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe if (--f->references) 10106977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe return 0; 10110ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe 1012d424d4dd657eaf4aeb8ffb07a550a5f64940f41aJens Axboe if (should_fsync(td) && td->o.fsync_on_close) 101398e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe f_ret = fsync(f->fd); 1014ebb1415f729c123b8a13bcbd667bf4b4cc95b4d4Jens Axboe 10150ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe if (td->io_ops->close_file) 10166977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe ret = td->io_ops->close_file(td, f); 10171020a139beff50faf1bb18f761b024b664a09e14Jens Axboe 101898e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe if (!ret) 1019a5fb461fdff86c442daeebbd28e07984be9f3807Jens Axboe ret = f_ret; 102098e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe 10210ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe td->nr_open_files--; 1022d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe fio_file_clear_open(f); 102322a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe assert(f->fd == -1); 10246977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe return ret; 10250ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe} 1026bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 10274d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboevoid lock_file(struct thread_data *td, struct fio_file *f, enum fio_ddir ddir) 1028b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe{ 10294d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe if (!f->lock || td->o.file_lock_mode == FILE_LOCK_NONE) 10304d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe return; 103129c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe 10324d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe if (f->lock_owner == td && f->lock_batch--) 10334d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe return; 10344d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe 10354d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe if (td->o.file_lock_mode == FILE_LOCK_READWRITE) { 10364d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe if (ddir == DDIR_READ) 10374d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe fio_mutex_down_read(f->lock); 10384d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe else 10394d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe fio_mutex_down_write(f->lock); 10404d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe } else if (td->o.file_lock_mode == FILE_LOCK_EXCLUSIVE) 10414d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe fio_mutex_down(f->lock); 10424d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe 10434d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe f->lock_owner = td; 10444d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe f->lock_batch = td->o.lockfile_batch; 10454d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe f->lock_ddir = ddir; 1046b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe} 1047b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe 10484d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboevoid unlock_file(struct thread_data *td, struct fio_file *f) 1049b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe{ 10504d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe if (!f->lock || td->o.file_lock_mode == FILE_LOCK_NONE) 10514d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe return; 10524d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe if (f->lock_batch) 10534d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe return; 10544d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe 10554d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe if (td->o.file_lock_mode == FILE_LOCK_READWRITE) { 10564d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe const int is_read = f->lock_ddir == DDIR_READ; 10574d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe int val = fio_mutex_getval(f->lock); 105829c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe 10594d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe if ((is_read && val == 1) || (!is_read && val == -1)) 10604d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe f->lock_owner = NULL; 106129c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe 10624d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe if (is_read) 10634d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe fio_mutex_up_read(f->lock); 10644d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe else 10654d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe fio_mutex_up_write(f->lock); 10664d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe } else if (td->o.file_lock_mode == FILE_LOCK_EXCLUSIVE) { 10674d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe int val = fio_mutex_getval(f->lock); 10684d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe 10694d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe if (val == 0) 10704d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe f->lock_owner = NULL; 10714d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe 10724d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe fio_mutex_up(f->lock); 107329c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe } 1074b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe} 1075b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe 10764d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboevoid unlock_file_all(struct thread_data *td, struct fio_file *f) 10774d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe{ 10784d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe if (f->lock_owner != td) 10794d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe return; 10804d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe 10814d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe f->lock_batch = 0; 10824d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe unlock_file(td, f); 10834d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe} 10844d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe 1085bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboestatic int recurse_dir(struct thread_data *td, const char *dirname) 1086bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe{ 1087bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe struct dirent *dir; 1088bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe int ret = 0; 1089bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe DIR *D; 1090bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 1091bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe D = opendir(dirname); 1092bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe if (!D) { 10930ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe char buf[FIO_VERROR_SIZE]; 10940ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe 10950ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe snprintf(buf, FIO_VERROR_SIZE - 1, "opendir(%s)", dirname); 10960ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe td_verror(td, errno, buf); 1097bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe return 1; 1098bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe } 1099bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 1100bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe while ((dir = readdir(D)) != NULL) { 1101bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe char full_path[PATH_MAX]; 1102bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe struct stat sb; 1103bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 1104e85b2b83e39b64ba5cb73fbfddbf3902b6e84925Jens Axboe if (!strcmp(dir->d_name, ".") || !strcmp(dir->d_name, "..")) 1105e85b2b83e39b64ba5cb73fbfddbf3902b6e84925Jens Axboe continue; 110696d32d518a0743a6c050057bc1562e4883e51c5dJens Axboe 1107bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe sprintf(full_path, "%s/%s", dirname, dir->d_name); 1108bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 1109bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe if (lstat(full_path, &sb) == -1) { 1110bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe if (errno != ENOENT) { 1111bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe td_verror(td, errno, "stat"); 1112bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe return 1; 1113bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe } 1114bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe } 1115bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 1116bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe if (S_ISREG(sb.st_mode)) { 1117bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe add_file(td, full_path); 11182dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe td->o.nr_files++; 1119bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe continue; 1120bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe } 11210ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe if (!S_ISDIR(sb.st_mode)) 11220ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe continue; 1123bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 11245ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe ret = recurse_dir(td, full_path); 11255ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe if (ret) 1126bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe break; 1127bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe } 1128bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 1129bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe closedir(D); 1130bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe return ret; 1131bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe} 1132bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 1133bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboeint add_dir_files(struct thread_data *td, const char *path) 1134bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe{ 11350ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe int ret = recurse_dir(td, path); 11360ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe 11370ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe if (!ret) 11380ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe log_info("fio: opendir added %d files\n", td->o.nr_files); 11390ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe 11400ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe return ret; 1141bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe} 1142cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe 1143cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboevoid dup_files(struct thread_data *td, struct thread_data *org) 1144cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe{ 1145cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe struct fio_file *f; 1146cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe unsigned int i; 11479efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe 11489efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe dprint(FD_FILE, "dup files: %d\n", org->files_index); 1149cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe 1150cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe if (!org->files) 1151cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe return; 1152cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe 11539efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe td->files = malloc(org->files_index * sizeof(f)); 1154cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe 11559efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe for_each_file(org, f, i) { 1156b0fe421a6a0487ff71f6f903908f666d9ca1b327Jens Axboe struct fio_file *__f; 1157b0fe421a6a0487ff71f6f903908f666d9ca1b327Jens Axboe 1158f17c43928c202e557f2f325272c60d9050ee528eJens Axboe __f = smalloc(sizeof(*__f)); 1159c48c0be79173897824d8f439c39374f2588931dcJens Axboe if (!__f) { 1160c48c0be79173897824d8f439c39374f2588931dcJens Axboe log_err("fio: smalloc OOM\n"); 1161c48c0be79173897824d8f439c39374f2588931dcJens Axboe assert(0); 1162c48c0be79173897824d8f439c39374f2588931dcJens Axboe } 116322a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe __f->fd = -1; 116438dad62d5154ffaad445bd0231b271b9a46a5190Jens Axboe fio_file_reset(__f); 11650b9d69ecb14045cf3b2622ae922756b9889b25e6Jens Axboe 1166bc3456fa06cc7777c4764da8c7b1c0fd0a3c3772Aaron Carroll if (f->file_name) { 1167f17c43928c202e557f2f325272c60d9050ee528eJens Axboe __f->file_name = smalloc_strdup(f->file_name); 1168c48c0be79173897824d8f439c39374f2588931dcJens Axboe if (!__f->file_name) { 1169c48c0be79173897824d8f439c39374f2588931dcJens Axboe log_err("fio: smalloc OOM\n"); 1170c48c0be79173897824d8f439c39374f2588931dcJens Axboe assert(0); 1171c48c0be79173897824d8f439c39374f2588931dcJens Axboe } 11720b9d69ecb14045cf3b2622ae922756b9889b25e6Jens Axboe 1173bc3456fa06cc7777c4764da8c7b1c0fd0a3c3772Aaron Carroll __f->filetype = f->filetype; 1174bc3456fa06cc7777c4764da8c7b1c0fd0a3c3772Aaron Carroll } 1175b0fe421a6a0487ff71f6f903908f666d9ca1b327Jens Axboe 1176b0fe421a6a0487ff71f6f903908f666d9ca1b327Jens Axboe td->files[i] = __f; 1177cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe } 1178cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe} 1179f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe 1180f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe/* 1181f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe * Returns the index that matches the filename, or -1 if not there 1182f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe */ 1183f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboeint get_fileno(struct thread_data *td, const char *fname) 1184f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe{ 1185f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe struct fio_file *f; 1186f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe unsigned int i; 1187f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe 1188f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe for_each_file(td, f, i) 1189f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe if (!strcmp(f->file_name, fname)) 1190f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe return i; 1191f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe 1192f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe return -1; 1193f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe} 1194f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe 1195f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe/* 1196f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe * For log usage, where we add/open/close files automatically 1197f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe */ 1198f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboevoid free_release_files(struct thread_data *td) 1199f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe{ 1200f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe close_files(td); 1201f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe td->files_index = 0; 1202f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe td->nr_normal_files = 0; 1203f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe} 1204