filesetup.c revision 38dad62d5154ffaad445bd0231b271b9a46a5190
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" 1453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 157172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboestatic int root_warn; 167172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboe 17c592b9fe12d4739d99d5bece517e304804876df6Jens Axboestatic inline void clear_error(struct thread_data *td) 18c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe{ 19c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe td->error = 0; 20c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe td->verror[0] = '\0'; 21c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe} 22c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe 233baddf2450d811be658fb47ef883ee84478dc352Jens Axboe/* 243baddf2450d811be658fb47ef883ee84478dc352Jens Axboe * Leaves f->fd open on success, caller must close 253baddf2450d811be658fb47ef883ee84478dc352Jens Axboe */ 267bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboestatic int extend_file(struct thread_data *td, struct fio_file *f) 2725205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe{ 28ea443657ce85860b7a0dd2f39f2572d4a09fc885Jens Axboe int r, new_layout = 0, unlink_file = 0, flags; 2925205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe unsigned long long left; 3025205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe unsigned int bs; 3125205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe char *b; 32b2a151925a91f38aeb298d693687a47269ad4e94Jens Axboe 334241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe if (read_only) { 344241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe log_err("fio: refusing extend of file due to read-only\n"); 354241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe return 0; 364241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe } 374241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe 38507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe /* 39507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe * check if we need to lay the file out complete again. fio 40507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe * does that for operations involving reads, or for writes 41507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe * where overwrite is set 42507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe */ 43ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe if (td_read(td) || (td_write(td) && td->o.overwrite) || 44ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe (td_write(td) && td->io_ops->flags & FIO_NOEXTEND)) 45507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe new_layout = 1; 46ea443657ce85860b7a0dd2f39f2572d4a09fc885Jens Axboe if (td_write(td) && !td->o.overwrite) 47ea443657ce85860b7a0dd2f39f2572d4a09fc885Jens Axboe unlink_file = 1; 48507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe 496ae1f57f2cb8661b97b770372eeb3694f6d5a744Jens Axboe if (unlink_file || new_layout) { 50bd199f2b98eeb9101795e40fdef5889c630178c1Jens Axboe dprint(FD_FILE, "layout unlink %s\n", f->file_name); 51982016d689dc7fedbb09646ba0df7e72a781b164Zhang, Yanmin if ((unlink(f->file_name) < 0) && (errno != ENOENT)) { 527bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe td_verror(td, errno, "unlink"); 537bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe return 1; 547bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } 557bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } 567bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 57507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe flags = O_WRONLY | O_CREAT; 58507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe if (new_layout) 59507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe flags |= O_TRUNC; 60507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe 61ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe dprint(FD_FILE, "open file %s, flags %x\n", f->file_name, flags); 62507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe f->fd = open(f->file_name, flags, 0644); 6353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (f->fd < 0) { 64e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe td_verror(td, errno, "open"); 6553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 1; 6653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 6753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 687bc8c2cf02fbd538ca388618ff2f4618787a86e0Jens Axboe#ifdef FIO_HAVE_FALLOCATE 697bc8c2cf02fbd538ca388618ff2f4618787a86e0Jens Axboe if (td->o.fallocate && !td->o.fill_device) { 707bc8c2cf02fbd538ca388618ff2f4618787a86e0Jens Axboe dprint(FD_FILE, "fallocate file %s size %llu\n", f->file_name, 717bc8c2cf02fbd538ca388618ff2f4618787a86e0Jens Axboe f->real_file_size); 727bc8c2cf02fbd538ca388618ff2f4618787a86e0Jens Axboe 737bc8c2cf02fbd538ca388618ff2f4618787a86e0Jens Axboe r = posix_fallocate(f->fd, 0, f->real_file_size); 7410accd7cf68af21ef4831528626a75ba7a06ce81Greg Edwards if (r > 0) { 757bc8c2cf02fbd538ca388618ff2f4618787a86e0Jens Axboe log_err("fio: posix_fallocate fails: %s\n", 7610accd7cf68af21ef4831528626a75ba7a06ce81Greg Edwards strerror(r)); 777bc8c2cf02fbd538ca388618ff2f4618787a86e0Jens Axboe } 787bc8c2cf02fbd538ca388618ff2f4618787a86e0Jens Axboe } 797bc8c2cf02fbd538ca388618ff2f4618787a86e0Jens Axboe#endif 807bc8c2cf02fbd538ca388618ff2f4618787a86e0Jens Axboe 81fc74ac1d749c977308016eb22c8658a9a5ac7989Shawn Lewis if (!new_layout) 82fc74ac1d749c977308016eb22c8658a9a5ac7989Shawn Lewis goto done; 83fc74ac1d749c977308016eb22c8658a9a5ac7989Shawn Lewis 845e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe /* 855e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe * The size will be -1ULL when fill_device is used, so don't truncate 865e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe * or fallocate this file, just write it 875e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe */ 885e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe if (!td->o.fill_device) { 895e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe dprint(FD_FILE, "truncate file %s, size %llu\n", f->file_name, 90ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe f->real_file_size); 915e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe if (ftruncate(f->fd, f->real_file_size) == -1) { 925e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe td_verror(td, errno, "ftruncate"); 935e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe goto err; 945e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe } 955e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe } 9640f8298cd252157fa15d93f8eb470116a94069a0Jens Axboe 972dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe b = malloc(td->o.max_bs[DDIR_WRITE]); 982dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe memset(b, 0, td->o.max_bs[DDIR_WRITE]); 9953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 1007bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe left = f->real_file_size; 10153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe while (left && !td->terminate) { 1022dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe bs = td->o.max_bs[DDIR_WRITE]; 10353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (bs > left) 10453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe bs = left; 10553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 10653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe r = write(f->fd, b, bs); 10753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 1085e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe if (r > 0) { 1095e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe left -= r; 11053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe continue; 11153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } else { 1125e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe if (r < 0) { 1135e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe int __e = errno; 1145e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe 1155e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe if (__e == ENOSPC) { 1165e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe if (td->o.fill_device) 1175e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe break; 1185e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe log_info("fio: ENOSPC on laying out " 1195e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe "file, stopping\n"); 1205e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe break; 1215e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe } 122e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe td_verror(td, errno, "write"); 1235e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe } else 124e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe td_verror(td, EIO, "write"); 12553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 12653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe break; 12753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 12853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 12953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 130ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe if (td->terminate) { 131ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe dprint(FD_FILE, "terminate unlink %s\n", f->file_name); 13253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe unlink(f->file_name); 133ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe } else if (td->o.create_fsync) { 13498e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe if (fsync(f->fd) < 0) { 13598e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe td_verror(td, errno, "fsync"); 13698e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe goto err; 13798e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe } 13898e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe } 1390d1cd207e409a36313784cb9596990c819775f77Jens Axboe if (td->o.fill_device && !td_write(td)) { 140d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe fio_file_clear_size_known(f); 1415e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe if (td_io_get_file_size(td, f)) 1425e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe goto err; 1435e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe if (f->io_size > f->real_file_size) 1445e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe f->io_size = f->real_file_size; 1455e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe } 14653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 14753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe free(b); 148507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboedone: 14953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 0; 15053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboeerr: 15153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe close(f->fd); 15253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe f->fd = -1; 15353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 1; 15453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe} 15553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 156afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanminstatic int pre_read_file(struct thread_data *td, struct fio_file *f) 157afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin{ 158b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe int r, did_open = 0, old_runstate; 159afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin unsigned long long left; 160afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin unsigned int bs; 161afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin char *b; 162afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin 1639c0d224129b0c59698e4c77e7fed00dc8cbb50e1Jens Axboe if (td->io_ops->flags & FIO_PIPEIO) 1649c0d224129b0c59698e4c77e7fed00dc8cbb50e1Jens Axboe return 0; 1659c0d224129b0c59698e4c77e7fed00dc8cbb50e1Jens Axboe 166d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe if (!fio_file_open(f)) { 167b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe if (td->io_ops->open_file(td, f)) { 168b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe log_err("fio: cannot pre-read, failed to open file\n"); 169b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe return 1; 170b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe } 171b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe did_open = 1; 172b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe } 173b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe 174b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe old_runstate = td->runstate; 175b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe td_set_runstate(td, TD_PRE_READING); 176b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe 177afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin bs = td->o.max_bs[DDIR_READ]; 178afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin b = malloc(bs); 179afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin memset(b, 0, bs); 180afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin 181afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin lseek(f->fd, f->file_offset, SEEK_SET); 182afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin left = f->io_size; 183afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin 184afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin while (left && !td->terminate) { 185afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin if (bs > left) 186afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin bs = left; 187afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin 188afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin r = read(f->fd, b, bs); 189afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin 190afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin if (r == (int) bs) { 191afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin left -= bs; 192afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin continue; 193afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin } else { 194afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin td_verror(td, EIO, "pre_read"); 195afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin break; 196afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin } 197afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin } 198afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin 199b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe td_set_runstate(td, old_runstate); 200b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe 201b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe if (did_open) 202b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe td->io_ops->close_file(td, f); 203afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin free(b); 204afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin return 0; 205afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin} 206afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin 2077bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboestatic unsigned long long get_rand_file_size(struct thread_data *td) 2089c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe{ 209dc873b6f4a536c332b72cce268d5a7ccd356a891Jens Axboe unsigned long long ret, sized; 2109c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe long r; 2119c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe 2129c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe r = os_random_long(&td->file_size_state); 213dc873b6f4a536c332b72cce268d5a7ccd356a891Jens Axboe sized = td->o.file_size_high - td->o.file_size_low; 214dc873b6f4a536c332b72cce268d5a7ccd356a891Jens Axboe ret = (unsigned long long) ((double) sized * (r / (OS_RAND_MAX + 1.0))); 2155ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe ret += td->o.file_size_low; 2162dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe ret -= (ret % td->o.rw_min_bs); 2179c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe return ret; 2189c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe} 2199c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe 22053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboestatic int file_size(struct thread_data *td, struct fio_file *f) 22153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{ 22253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe struct stat st; 22353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 224df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe if (stat(f->file_name, &st) == -1) { 2257bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe td_verror(td, errno, "fstat"); 2267bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe return 1; 2277bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } 22853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 2297bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe f->real_file_size = st.st_size; 23053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 0; 23153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe} 23253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 23353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboestatic int bdev_size(struct thread_data *td, struct fio_file *f) 23453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{ 23553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe unsigned long long bytes; 23653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe int r; 23753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 238df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe if (td->io_ops->open_file(td, f)) { 239df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe log_err("fio: failed opening blockdev %s for size check\n", 240df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe f->file_name); 241df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe return 1; 242df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe } 243df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe 24453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe r = blockdev_size(f->fd, &bytes); 24553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (r) { 246e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe td_verror(td, r, "blockdev_size"); 247df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe goto err; 24853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 24953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 2507ab077ab119fd28b6ccf5705ea8453e414f574c1Jens Axboe if (!bytes) { 2517ab077ab119fd28b6ccf5705ea8453e414f574c1Jens Axboe log_err("%s: zero sized block device?\n", f->file_name); 252df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe goto err; 2537ab077ab119fd28b6ccf5705ea8453e414f574c1Jens Axboe } 2547ab077ab119fd28b6ccf5705ea8453e414f574c1Jens Axboe 25553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe f->real_file_size = bytes; 25622a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe td->io_ops->close_file(td, f); 25753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 0; 258df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboeerr: 259df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe td->io_ops->close_file(td, f); 260df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe return 1; 26153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe} 26253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 2634ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboestatic int char_size(struct thread_data *td, struct fio_file *f) 2644ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe{ 2654ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe#ifdef FIO_HAVE_CHARDEV_SIZE 2664ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe unsigned long long bytes; 2674ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe int r; 2684ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe 2694ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe if (td->io_ops->open_file(td, f)) { 2704ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe log_err("fio: failed opening blockdev %s for size check\n", 2714ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe f->file_name); 2724ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe return 1; 2734ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe } 2744ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe 2754ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe r = chardev_size(f->fd, &bytes); 2764ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe if (r) { 2774ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe td_verror(td, r, "chardev_size"); 2784ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe goto err; 2794ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe } 2804ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe 2814ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe if (!bytes) { 2824ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe log_err("%s: zero sized char device?\n", f->file_name); 2834ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe goto err; 2844ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe } 2854ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe 2864ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe f->real_file_size = bytes; 2874ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe td->io_ops->close_file(td, f); 2884ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe return 0; 2894ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboeerr: 2904ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe td->io_ops->close_file(td, f); 2914ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe return 1; 2924ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe#else 2934ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe f->real_file_size = -1ULL; 2944ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe return 0; 2954ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe#endif 2964ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe} 2974ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe 29853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboestatic int get_file_size(struct thread_data *td, struct fio_file *f) 29953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{ 30053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe int ret = 0; 30153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 302d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe if (fio_file_size_known(f)) 303409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe return 0; 304409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe 3057bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (f->filetype == FIO_TYPE_FILE) 3067bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe ret = file_size(td, f); 3077bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe else if (f->filetype == FIO_TYPE_BD) 30853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe ret = bdev_size(td, f); 3094ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe else if (f->filetype == FIO_TYPE_CHAR) 3104ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe ret = char_size(td, f); 31153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe else 31253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe f->real_file_size = -1; 31353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 31453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (ret) 31553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return ret; 31653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 31753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (f->file_offset > f->real_file_size) { 3185ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe log_err("%s: offset extends end (%Lu > %Lu)\n", td->o.name, 3195ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe f->file_offset, f->real_file_size); 32053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 1; 32153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 32253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 323d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe fio_file_set_size_known(f); 32453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 0; 32553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe} 32653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 3273baddf2450d811be658fb47ef883ee84478dc352Jens Axboestatic int __file_invalidate_cache(struct thread_data *td, struct fio_file *f, 3283baddf2450d811be658fb47ef883ee84478dc352Jens Axboe unsigned long long off, 3293baddf2450d811be658fb47ef883ee84478dc352Jens Axboe unsigned long long len) 330e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe{ 331e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe int ret = 0; 332e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe 3335e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe if (len == -1ULL) 3343baddf2450d811be658fb47ef883ee84478dc352Jens Axboe len = f->io_size; 3353baddf2450d811be658fb47ef883ee84478dc352Jens Axboe if (off == -1ULL) 3363baddf2450d811be658fb47ef883ee84478dc352Jens Axboe off = f->file_offset; 337ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe 3380d1cd207e409a36313784cb9596990c819775f77Jens Axboe if (len == -1ULL || off == -1ULL) 3390d1cd207e409a36313784cb9596990c819775f77Jens Axboe return 0; 3400d1cd207e409a36313784cb9596990c819775f77Jens Axboe 3413baddf2450d811be658fb47ef883ee84478dc352Jens Axboe dprint(FD_IO, "invalidate cache %s: %llu/%llu\n", f->file_name, off, 3423baddf2450d811be658fb47ef883ee84478dc352Jens Axboe len); 343b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe 344e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe /* 345e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe * FIXME: add blockdev flushing too 346e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe */ 347a1c58075279454a91ec43366846b93e8dcf9753cJens Axboe if (f->mmap_ptr) { 348ac89311241264280574c81e6400c9a0c59615082Jens Axboe ret = madvise(f->mmap_ptr, f->mmap_sz, MADV_DONTNEED); 349a1c58075279454a91ec43366846b93e8dcf9753cJens Axboe#ifdef FIO_MADV_FREE 350a1c58075279454a91ec43366846b93e8dcf9753cJens Axboe (void) madvise(f->mmap_ptr, f->mmap_sz, FIO_MADV_FREE); 351a1c58075279454a91ec43366846b93e8dcf9753cJens Axboe#endif 352a1c58075279454a91ec43366846b93e8dcf9753cJens Axboe } else if (f->filetype == FIO_TYPE_FILE) { 3533baddf2450d811be658fb47ef883ee84478dc352Jens Axboe ret = fadvise(f->fd, off, len, POSIX_FADV_DONTNEED); 3545ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe } else if (f->filetype == FIO_TYPE_BD) { 355b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe ret = blockdev_invalidate_cache(f->fd); 3567e0e25c924d51f23196b3e0ea83b79178fc46823Jens Axboe if (ret < 0 && errno == EACCES && geteuid()) { 3577172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboe if (!root_warn) { 3585ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe log_err("fio: only root may flush block " 3595ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe "devices. Cache flush bypassed!\n"); 3607172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboe root_warn = 1; 3617172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboe } 3627e0e25c924d51f23196b3e0ea83b79178fc46823Jens Axboe ret = 0; 3637e0e25c924d51f23196b3e0ea83b79178fc46823Jens Axboe } 364b5605e9ded4188ed91faae1a43ecd333a9856f62Jens Axboe } else if (f->filetype == FIO_TYPE_CHAR || f->filetype == FIO_TYPE_PIPE) 365e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe ret = 0; 366e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe 367e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe if (ret < 0) { 368e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe td_verror(td, errno, "invalidate_cache"); 369e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe return 1; 3703baddf2450d811be658fb47ef883ee84478dc352Jens Axboe } else if (ret > 0) { 3713baddf2450d811be658fb47ef883ee84478dc352Jens Axboe td_verror(td, ret, "invalidate_cache"); 3723baddf2450d811be658fb47ef883ee84478dc352Jens Axboe return 1; 373e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe } 374e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe 375ad2da605a62faf16887970618b434db19594e17bJens Axboe return ret; 3763baddf2450d811be658fb47ef883ee84478dc352Jens Axboe 3773baddf2450d811be658fb47ef883ee84478dc352Jens Axboe} 3783baddf2450d811be658fb47ef883ee84478dc352Jens Axboe 3793baddf2450d811be658fb47ef883ee84478dc352Jens Axboeint file_invalidate_cache(struct thread_data *td, struct fio_file *f) 3803baddf2450d811be658fb47ef883ee84478dc352Jens Axboe{ 381d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe if (!fio_file_open(f)) 382a5fb461fdff86c442daeebbd28e07984be9f3807Jens Axboe return 0; 383a5fb461fdff86c442daeebbd28e07984be9f3807Jens Axboe 3845e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe return __file_invalidate_cache(td, f, -1ULL, -1ULL); 385e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe} 386e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe 3876977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboeint generic_close_file(struct thread_data fio_unused *td, struct fio_file *f) 38853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{ 3896977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe int ret = 0; 3906977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe 391ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe dprint(FD_FILE, "fd close %s\n", f->file_name); 3924906e0b57f2b8cbad02ef2428522281cf6038bddJens Axboe 3934906e0b57f2b8cbad02ef2428522281cf6038bddJens Axboe remove_file_hash(f); 3944906e0b57f2b8cbad02ef2428522281cf6038bddJens Axboe 3956977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe if (close(f->fd) < 0) 3966977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe ret = errno; 3976977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe 398b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe f->fd = -1; 3996977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe return ret; 40053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe} 40153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 4024d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboestatic int file_lookup_open(struct fio_file *f, int flags) 40353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{ 40429c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe struct fio_file *__f; 4054d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe int from_hash; 4064d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe 4074d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe __f = lookup_file_hash(f->file_name); 4084d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe if (__f) { 4099efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe dprint(FD_FILE, "found file in hash %s\n", f->file_name); 4104d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe /* 4114d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe * racy, need the __f->lock locked 4124d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe */ 4134d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe f->lock = __f->lock; 4144d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe f->lock_owner = __f->lock_owner; 4154d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe f->lock_batch = __f->lock_batch; 4164d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe f->lock_ddir = __f->lock_ddir; 4174d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe from_hash = 1; 4184d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe } else { 4199efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe dprint(FD_FILE, "file not found in hash %s\n", f->file_name); 4204d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe from_hash = 0; 4214d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe } 4224d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe 423e8670ef8b26039573fbf835b4b95ba45a1039d83Jens Axboe f->fd = open(f->file_name, flags, 0600); 4244d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe return from_hash; 4254d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe} 4264d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe 4274d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboeint generic_open_file(struct thread_data *td, struct fio_file *f) 4284d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe{ 429661598287ecc3b8987f312cf8403936552ce686aJens Axboe int is_std = 0; 43053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe int flags = 0; 43129c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe int from_hash = 0; 43253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 433ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe dprint(FD_FILE, "fd open %s\n", f->file_name); 434ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe 435661598287ecc3b8987f312cf8403936552ce686aJens Axboe if (!strcmp(f->file_name, "-")) { 436661598287ecc3b8987f312cf8403936552ce686aJens Axboe if (td_rw(td)) { 437661598287ecc3b8987f312cf8403936552ce686aJens Axboe log_err("fio: can't read/write to stdin/out\n"); 438661598287ecc3b8987f312cf8403936552ce686aJens Axboe return 1; 439661598287ecc3b8987f312cf8403936552ce686aJens Axboe } 440661598287ecc3b8987f312cf8403936552ce686aJens Axboe is_std = 1; 441ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe 442ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe /* 443ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe * move output logging to stderr, if we are writing to stdout 444ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe */ 445ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe if (td_write(td)) 446ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe f_out = stderr; 447661598287ecc3b8987f312cf8403936552ce686aJens Axboe } 448661598287ecc3b8987f312cf8403936552ce686aJens Axboe 4492dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe if (td->o.odirect) 4502fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe flags |= OS_O_DIRECT; 4512dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe if (td->o.sync_io) 4522fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe flags |= O_SYNC; 453ad92396cc21055cee93470dcf65e82ccde03aac5Jens Axboe if (f->filetype != FIO_TYPE_FILE) 4545921e80c5dfc9f96d2f21da6ae58f2b5d3a0b373Jens Axboe flags |= FIO_O_NOATIME; 455814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe if (td->o.create_on_open) 456814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe flags |= O_CREAT; 45753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 458056f3459149a7670257350d84b49858718e4a0e6Aaron Carrollopen_again: 459660a1cb5fb9843ec09a04337714e78d63cd557e7Jens Axboe if (td_write(td)) { 460173081581f94dc4f9f203eb7a7922fc843bfafdeJens Axboe if (!read_only) 461173081581f94dc4f9f203eb7a7922fc843bfafdeJens Axboe flags |= O_RDWR; 46253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 463af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe if (f->filetype == FIO_TYPE_FILE) 4642fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe flags |= O_CREAT; 4652fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe 466661598287ecc3b8987f312cf8403936552ce686aJens Axboe if (is_std) 467661598287ecc3b8987f312cf8403936552ce686aJens Axboe f->fd = dup(STDOUT_FILENO); 4684d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe else 4694d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe from_hash = file_lookup_open(f, flags); 4702fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe } else { 4714241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe if (f->filetype == FIO_TYPE_CHAR && !read_only) 4722fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe flags |= O_RDWR; 4732fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe else 4742fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe flags |= O_RDONLY; 4752fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe 476661598287ecc3b8987f312cf8403936552ce686aJens Axboe if (is_std) 477661598287ecc3b8987f312cf8403936552ce686aJens Axboe f->fd = dup(STDIN_FILENO); 4784d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe else 4794d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe from_hash = file_lookup_open(f, flags); 48053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 48153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 48253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (f->fd == -1) { 483e4e33258637e55550a0fac59eb3350e8bf06f8e6Jens Axboe char buf[FIO_VERROR_SIZE]; 484e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe int __e = errno; 485e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe 486835d9b9ed0e5c2591b8a3eacbd5f4ab6bdab466cJens Axboe if (__e == EPERM && (flags & FIO_O_NOATIME)) { 4875921e80c5dfc9f96d2f21da6ae58f2b5d3a0b373Jens Axboe flags &= ~FIO_O_NOATIME; 488056f3459149a7670257350d84b49858718e4a0e6Aaron Carroll goto open_again; 489056f3459149a7670257350d84b49858718e4a0e6Aaron Carroll } 490056f3459149a7670257350d84b49858718e4a0e6Aaron Carroll 491e8670ef8b26039573fbf835b4b95ba45a1039d83Jens Axboe snprintf(buf, sizeof(buf) - 1, "open(%s)", f->file_name); 492e4e33258637e55550a0fac59eb3350e8bf06f8e6Jens Axboe 493e4e33258637e55550a0fac59eb3350e8bf06f8e6Jens Axboe td_verror(td, __e, buf); 49453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 49553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 49629c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe if (!from_hash && f->fd != -1) { 49729c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe if (add_file_hash(f)) { 49829c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe int ret; 49929c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe 50029c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe /* 50129c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe * OK to ignore, we haven't done anything with it 50229c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe */ 50329c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe ret = generic_close_file(td, f); 50429c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe goto open_again; 50529c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe } 50629c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe } 5074906e0b57f2b8cbad02ef2428522281cf6038bddJens Axboe 50853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 0; 509b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe} 510b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe 511df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboeint generic_get_file_size(struct thread_data *td, struct fio_file *f) 51221972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe{ 513df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe return get_file_size(td, f); 51421972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe} 51521972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe 5167bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe/* 5177bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * open/close all files, so that ->real_file_size gets set 5187bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */ 519bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboestatic int get_file_sizes(struct thread_data *td) 5207bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe{ 5217bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe struct fio_file *f; 5227bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe unsigned int i; 523bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe int err = 0; 5247bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 5257bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe for_each_file(td, f, i) { 5265ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe dprint(FD_FILE, "get file size for %p/%d/%p\n", f, i, 5275ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe f->file_name); 5289efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe 52999a47c6905731e53dd4d8f7ea6501f36d9329e7bJens Axboe if (td_io_get_file_size(td, f)) { 53040b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe if (td->error != ENOENT) { 53140b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe log_err("%s\n", td->verror); 53240b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe err = 1; 53340b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe } 534541d66d70b8fbe9860b31307c0760e6d5f4c78a8Jens Axboe clear_error(td); 53507eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe } 536409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe 537409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe if (f->real_file_size == -1ULL && td->o.size) 538409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe f->real_file_size = td->o.size / td->o.nr_files; 5397bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } 540bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe 541bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe return err; 5427bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe} 5437bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 5442e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboestruct fio_mount { 5452e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe struct flist_head list; 5462e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe const char *base; 5472e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe char __base[256]; 5482e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe unsigned int key; 5492e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe}; 5502e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 5512e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe/* 5522e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe * Get free number of bytes for each file on each unique mount. 5532e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe */ 5542e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboestatic unsigned long long get_fs_free_counts(struct thread_data *td) 5552e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe{ 5562e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe struct flist_head *n, *tmp; 55768b0316f581c3c881d7dbf7c9dafef4a10100a66Jens Axboe unsigned long long ret = 0; 5582e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe struct fio_mount *fm; 5592e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe FLIST_HEAD(list); 5602e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe struct fio_file *f; 5612e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe unsigned int i; 5622e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 5632e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe for_each_file(td, f, i) { 5642e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe struct stat sb; 5652e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe char buf[256]; 5662e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 5674ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe if (f->filetype == FIO_TYPE_BD || f->filetype == FIO_TYPE_CHAR) { 5684ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe if (f->real_file_size != -1ULL) 5694ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe ret += f->real_file_size; 57068b0316f581c3c881d7dbf7c9dafef4a10100a66Jens Axboe continue; 57168b0316f581c3c881d7dbf7c9dafef4a10100a66Jens Axboe } else if (f->filetype != FIO_TYPE_FILE) 57268b0316f581c3c881d7dbf7c9dafef4a10100a66Jens Axboe continue; 57368b0316f581c3c881d7dbf7c9dafef4a10100a66Jens Axboe 5742e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe strcpy(buf, f->file_name); 5752e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 5762e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe if (stat(buf, &sb) < 0) { 5772e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe if (errno != ENOENT) 5782e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe break; 5792e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe strcpy(buf, "."); 5802e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe if (stat(buf, &sb) < 0) 5812e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe break; 5822e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe } 5832e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 5842e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe fm = NULL; 5852e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe flist_for_each(n, &list) { 5862e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe fm = flist_entry(n, struct fio_mount, list); 5872e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe if (fm->key == sb.st_dev) 5882e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe break; 5892e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 5902e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe fm = NULL; 5912e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe } 5922e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 5932e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe if (fm) 5942e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe continue; 5952e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 5962e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe fm = malloc(sizeof(*fm)); 5972e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe strcpy(fm->__base, buf); 5982e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe fm->base = basename(fm->__base); 5992e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe fm->key = sb.st_dev; 6002e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe flist_add(&fm->list, &list); 6012e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe } 6022e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 6032e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe flist_for_each_safe(n, tmp, &list) { 6042e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe unsigned long long sz; 6052e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 6062e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe fm = flist_entry(n, struct fio_mount, list); 6072e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe flist_del(&fm->list); 6082e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 6092e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe sz = get_fs_size(fm->base); 6102e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe if (sz && sz != -1ULL) 6112e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe ret += sz; 6122e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 6132e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe free(fm); 6142e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe } 6152e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 6162e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe return ret; 6172e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe} 6182e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 6197bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe/* 6207bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * Open the files and setup files sizes, creating files if necessary. 6217bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */ 62253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboeint setup_files(struct thread_data *td) 62353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{ 6247bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe unsigned long long total_size, extend_size; 62553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe struct fio_file *f; 626af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe unsigned int i; 627000b080395e45cbe0ce54e75f0e993addbdc8676Jens Axboe int err = 0, need_extend; 62853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 629ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe dprint(FD_FILE, "setup files\n"); 630ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe 631691c8fb014da9dd82e999a90b5511423f4eee188Jens Axboe if (td->o.read_iolog_file) 632691c8fb014da9dd82e999a90b5511423f4eee188Jens Axboe return 0; 633691c8fb014da9dd82e999a90b5511423f4eee188Jens Axboe 63453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe /* 63553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe * if ioengine defines a setup() method, it's responsible for 6367bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * opening the files and setting f->real_file_size to indicate 6377bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * the valid range for that file. 63853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe */ 63953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (td->io_ops->setup) 6407bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe err = td->io_ops->setup(td); 6417bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe else 642bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe err = get_file_sizes(td); 64353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 644f102706350093e60617cc271b128e56c57ab3ce7Jens Axboe if (err) 645f102706350093e60617cc271b128e56c57ab3ce7Jens Axboe return err; 646f102706350093e60617cc271b128e56c57ab3ce7Jens Axboe 6470a7eb121ecb2e4279e9eb8178aa1e554dda40191Jens Axboe /* 6487bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * check sizes. if the files/devices do not exist and the size 6497bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * isn't passed to fio, abort. 6500a7eb121ecb2e4279e9eb8178aa1e554dda40191Jens Axboe */ 6517bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe total_size = 0; 6527bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe for_each_file(td, f, i) { 6537bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (f->real_file_size == -1ULL) 6547bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe total_size = -1ULL; 6557bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe else 6567bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe total_size += f->real_file_size; 6577bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } 6580a7eb121ecb2e4279e9eb8178aa1e554dda40191Jens Axboe 6592e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe if (td->o.fill_device) 6602e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe td->fill_device_size = get_fs_free_counts(td); 6612e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 6627bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe /* 6637bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * device/file sizes are zero and no size given, punt 6647bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */ 6651f809d151ddc4a4c348c2e4f6007db510e3e08a2Jens Axboe if ((!total_size || total_size == -1ULL) && !td->o.size && 666aa31f1f108348ba2a8749c73fa8c25f3d4630a7cShawn Lewis !(td->io_ops->flags & FIO_NOIO) && !td->o.fill_device) { 6677bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe log_err("%s: you need to specify size=\n", td->o.name); 668e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe td_verror(td, EINVAL, "total_file_size"); 66953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe return 1; 67053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 67153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 6727bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe /* 6737bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * now file sizes are known, so we can set ->io_size. if size= is 6747bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * not given, ->io_size is just equal to ->real_file_size. if size 6757bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * is given, ->io_size is size / nr_files. 6767bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */ 6777bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe extend_size = total_size = 0; 6787bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe need_extend = 0; 6797bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe for_each_file(td, f, i) { 680bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang f->file_offset = td->o.start_offset; 681bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang 6827bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (!td->o.file_size_low) { 6837bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe /* 6847bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * no file size range given, file size is equal to 6857bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * total size divided by number of files. if that is 6867bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * zero, set it to the real file size. 6877bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */ 6887bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe f->io_size = td->o.size / td->o.nr_files; 68965bdb10a09222d8b5d213de74824be775772ea8fJens Axboe if (!f->io_size) 690273f8c912d981439049d9b21aa048aaeaa323c5dJens Axboe f->io_size = f->real_file_size - f->file_offset; 6917bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } else if (f->real_file_size < td->o.file_size_low || 6927bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe f->real_file_size > td->o.file_size_high) { 6935ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe if (f->file_offset > td->o.file_size_low) 694bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang goto err_offset; 6957bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe /* 6967bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * file size given. if it's fixed, use that. if it's a 6977bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * range, generate a random size in-between. 6987bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */ 6995ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe if (td->o.file_size_low == td->o.file_size_high) { 7005ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe f->io_size = td->o.file_size_low 7015ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe - f->file_offset; 7025ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe } else { 7035ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe f->io_size = get_rand_file_size(td) 7045ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe - f->file_offset; 7055ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe } 70665bdb10a09222d8b5d213de74824be775772ea8fJens Axboe } else 707bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang f->io_size = f->real_file_size - f->file_offset; 70853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 7097bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (f->io_size == -1ULL) 7107bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe total_size = -1ULL; 7117bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe else 7127bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe total_size += f->io_size; 7137bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 7147bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (f->filetype == FIO_TYPE_FILE && 715bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang (f->io_size + f->file_offset) > f->real_file_size && 7167bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe !(td->io_ops->flags & FIO_DISKLESSIO)) { 717814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe if (!td->o.create_on_open) { 718814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe need_extend++; 719814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe extend_size += (f->io_size + f->file_offset); 720814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe } else 721814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe f->real_file_size = f->io_size + f->file_offset; 722d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe fio_file_set_extend(f); 7235ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe } 7247bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } 72553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 7262298290eabbe1017421a6ba0f5de93d8c2b048adljzhang,Yaxin Hu,Jianchao Tang if (!td->o.size || td->o.size > total_size) 7277bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe td->o.size = total_size; 72821972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe 7297bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe /* 7307bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * See if we need to extend some files 7317bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */ 7327bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (need_extend) { 7337bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe temp_stall_ts = 1; 734a7ba8c5f4c0f9fe117d529c1ad6686b2070bae51Shaozhi Shawn Ye if (!terse_output) 735a7ba8c5f4c0f9fe117d529c1ad6686b2070bae51Shaozhi Shawn Ye log_info("%s: Laying out IO file(s) (%u file(s) /" 736b22989b9f9349b3c1d1c41846ab27ff0914bd6deJens Axboe " %LuMB)\n", td->o.name, need_extend, 737a7ba8c5f4c0f9fe117d529c1ad6686b2070bae51Shaozhi Shawn Ye extend_size >> 20); 7387bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 7397bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe for_each_file(td, f, i) { 7405e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe unsigned long long old_len = -1ULL, extend_len = -1ULL; 7413baddf2450d811be658fb47ef883ee84478dc352Jens Axboe 742d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe if (!fio_file_extend(f)) 7437bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe continue; 7447bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 745409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe assert(f->filetype == FIO_TYPE_FILE); 746d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe fio_file_clear_extend(f); 7475e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe if (!td->o.fill_device) { 7485e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe old_len = f->real_file_size; 7490b9d69ecb14045cf3b2622ae922756b9889b25e6Jens Axboe extend_len = f->io_size + f->file_offset - 7500b9d69ecb14045cf3b2622ae922756b9889b25e6Jens Axboe old_len; 7515e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe } 752bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang f->real_file_size = (f->io_size + f->file_offset); 7537bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe err = extend_file(td, f); 7547bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (err) 7553baddf2450d811be658fb47ef883ee84478dc352Jens Axboe break; 7565e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe 7573baddf2450d811be658fb47ef883ee84478dc352Jens Axboe err = __file_invalidate_cache(td, f, old_len, 7583baddf2450d811be658fb47ef883ee84478dc352Jens Axboe extend_len); 7593baddf2450d811be658fb47ef883ee84478dc352Jens Axboe close(f->fd); 7603baddf2450d811be658fb47ef883ee84478dc352Jens Axboe f->fd = -1; 7613baddf2450d811be658fb47ef883ee84478dc352Jens Axboe if (err) 7627bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe break; 7637bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } 7647bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe temp_stall_ts = 0; 7657bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } 7667bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 7677bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (err) 7687bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe return err; 7697bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 7707bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe if (!td->o.zone_size) 7717bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe td->o.zone_size = td->o.size; 7727bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe 773ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe /* 774ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe * iolog already set the total io size, if we read back 775ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe * stored entries. 776ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe */ 777ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe if (!td->o.read_iolog_file) 778ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe td->total_io_size = td->o.size * td->o.loops; 7797bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe return 0; 780bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tangerr_offset: 781bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang log_err("%s: you need to specify valid offset=\n", td->o.name); 782bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang return 1; 78353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe} 78453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 785afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanminint pre_read_files(struct thread_data *td) 786afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin{ 787afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin struct fio_file *f; 788afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin unsigned int i; 789afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin 790afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin dprint(FD_FILE, "pre_read files\n"); 791afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin 792afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin for_each_file(td, f, i) { 793afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin pre_read_file(td, f); 794afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin } 795afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin 796afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin return 1; 797afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin} 798afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin 799687270767de17dbad53c50e03e5d73d52505405cJens Axboeint init_random_map(struct thread_data *td) 800687270767de17dbad53c50e03e5d73d52505405cJens Axboe{ 801509eab12448823a8eefbe925804b5308ee63bf5eJens Axboe unsigned long long blocks, num_maps; 802687270767de17dbad53c50e03e5d73d52505405cJens Axboe struct fio_file *f; 803687270767de17dbad53c50e03e5d73d52505405cJens Axboe unsigned int i; 804687270767de17dbad53c50e03e5d73d52505405cJens Axboe 805de8dd119d7d869dd9c90c6d62bf4bededd10642eJens Axboe if (td->o.norandommap || !td_random(td)) 806687270767de17dbad53c50e03e5d73d52505405cJens Axboe return 0; 807687270767de17dbad53c50e03e5d73d52505405cJens Axboe 808687270767de17dbad53c50e03e5d73d52505405cJens Axboe for_each_file(td, f, i) { 8095ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe blocks = (f->real_file_size + td->o.rw_min_bs - 1) / 8105ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe (unsigned long long) td->o.rw_min_bs; 8115ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe num_maps = (blocks + BLOCKS_PER_MAP - 1) / 8125ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe (unsigned long long) BLOCKS_PER_MAP; 813de605666880852ba9d1a0469723126b09782c520Jens Axboe f->file_map = smalloc(num_maps * sizeof(int)); 814303032ae4e13c7ac10b8198c40df98d95a4524a6Jens Axboe if (f->file_map) { 815303032ae4e13c7ac10b8198c40df98d95a4524a6Jens Axboe f->num_maps = num_maps; 816303032ae4e13c7ac10b8198c40df98d95a4524a6Jens Axboe continue; 817687270767de17dbad53c50e03e5d73d52505405cJens Axboe } 8182b386d2569c9078ca9790c4e6d318ec3835b8739Jens Axboe if (!td->o.softrandommap) { 8195ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe log_err("fio: failed allocating random map. If running" 8205ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe " a large number of jobs, try the 'norandommap'" 8212b386d2569c9078ca9790c4e6d318ec3835b8739Jens Axboe " option or set 'softrandommap'. Or give" 8222b386d2569c9078ca9790c4e6d318ec3835b8739Jens Axboe " a larger --alloc-size to fio.\n"); 823687270767de17dbad53c50e03e5d73d52505405cJens Axboe return 1; 824687270767de17dbad53c50e03e5d73d52505405cJens Axboe } 825303032ae4e13c7ac10b8198c40df98d95a4524a6Jens Axboe 826303032ae4e13c7ac10b8198c40df98d95a4524a6Jens Axboe log_info("fio: file %s failed allocating random map. Running " 827303032ae4e13c7ac10b8198c40df98d95a4524a6Jens Axboe "job without.\n", f->file_name); 828303032ae4e13c7ac10b8198c40df98d95a4524a6Jens Axboe f->num_maps = 0; 829687270767de17dbad53c50e03e5d73d52505405cJens Axboe } 830687270767de17dbad53c50e03e5d73d52505405cJens Axboe 831687270767de17dbad53c50e03e5d73d52505405cJens Axboe return 0; 832687270767de17dbad53c50e03e5d73d52505405cJens Axboe} 833687270767de17dbad53c50e03e5d73d52505405cJens Axboe 83453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboevoid close_files(struct thread_data *td) 83553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{ 8360ab8db8943acc6b9ea778735563bfad2a79e8dddJens Axboe struct fio_file *f; 837af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe unsigned int i; 83853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 8392be3eec330360e6735fb4e7d70907e11eaa346f8Jens Axboe for_each_file(td, f, i) { 8402be3eec330360e6735fb4e7d70907e11eaa346f8Jens Axboe if (fio_file_open(f)) 8412be3eec330360e6735fb4e7d70907e11eaa346f8Jens Axboe td_io_close_file(td, f); 8422be3eec330360e6735fb4e7d70907e11eaa346f8Jens Axboe } 84324ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe} 84424ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe 84524ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboevoid close_and_free_files(struct thread_data *td) 84624ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe{ 84724ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe struct fio_file *f; 84824ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe unsigned int i; 84924ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe 850ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe dprint(FD_FILE, "close files\n"); 851ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe 8520ab8db8943acc6b9ea778735563bfad2a79e8dddJens Axboe for_each_file(td, f, i) { 853ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe if (td->o.unlink && f->filetype == FIO_TYPE_FILE) { 854ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe dprint(FD_FILE, "free unlink %s\n", f->file_name); 855132ad46d22bcf12da95ad69e03c1b6f23f5e60a9Jens Axboe unlink(f->file_name); 856ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe } 857bdb4e2e99d4a87e5d3677cc09aa1ce92135125a9Jens Axboe 85822a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe if (fio_file_open(f)) 85922a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe td_io_close_file(td, f); 86022a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe 861b9fbcf2104ab79127825e0c23ba0a147ec076087Shaozhi Shawn Ye remove_file_hash(f); 862b3dc7f075b85e004f8c681ebb8566475017696f3Jens Axboe 863f17c43928c202e557f2f325272c60d9050ee528eJens Axboe sfree(f->file_name); 864fa1da8653e2177b3cc31a91e963c389f079d4172Jens Axboe f->file_name = NULL; 86561eb313e28c0f0ba8eb144c5b5f331b6b74c4fc8Jens Axboe sfree(f->file_map); 86661eb313e28c0f0ba8eb144c5b5f331b6b74c4fc8Jens Axboe f->file_map = NULL; 86778d99e6a2695d3a7936c5dd02f996f13a30309b1Jens Axboe sfree(f); 86853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe } 869b4a6a59a939f0e6554632de311e7d1d1b7633ccfJens Axboe 8702dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe td->o.filename = NULL; 871cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe free(td->files); 8729efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe td->files_index = 0; 873b4a6a59a939f0e6554632de311e7d1d1b7633ccfJens Axboe td->files = NULL; 8742dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe td->o.nr_files = 0; 87553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe} 876af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe 877e3bab463d4397e3378d8c7437e31de8aaf861a4fJens Axboestatic void get_file_type(struct fio_file *f) 878af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe{ 879af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe struct stat sb; 880af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe 881661598287ecc3b8987f312cf8403936552ce686aJens Axboe if (!strcmp(f->file_name, "-")) 882661598287ecc3b8987f312cf8403936552ce686aJens Axboe f->filetype = FIO_TYPE_PIPE; 883661598287ecc3b8987f312cf8403936552ce686aJens Axboe else 884661598287ecc3b8987f312cf8403936552ce686aJens Axboe f->filetype = FIO_TYPE_FILE; 885af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe 886b30d395ec288508f9c787af11d0f52e9df26e39fJens Axboe if (!stat(f->file_name, &sb)) { 887af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe if (S_ISBLK(sb.st_mode)) 888af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe f->filetype = FIO_TYPE_BD; 889af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe else if (S_ISCHR(sb.st_mode)) 890af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe f->filetype = FIO_TYPE_CHAR; 891b5605e9ded4188ed91faae1a43ecd333a9856f62Jens Axboe else if (S_ISFIFO(sb.st_mode)) 892b5605e9ded4188ed91faae1a43ecd333a9856f62Jens Axboe f->filetype = FIO_TYPE_PIPE; 893af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe } 894af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe} 895af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe 896f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboeint add_file(struct thread_data *td, const char *fname) 897af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe{ 8987b4e4fe5e6fa26f82f9169c18ec70c08d0805ca9Jens Axboe int cur_files = td->files_index; 899bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe char file_name[PATH_MAX]; 900af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe struct fio_file *f; 901bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe int len = 0; 902af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe 903ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe dprint(FD_FILE, "add file %s\n", fname); 904ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe 905f17c43928c202e557f2f325272c60d9050ee528eJens Axboe f = smalloc(sizeof(*f)); 906c48c0be79173897824d8f439c39374f2588931dcJens Axboe if (!f) { 907c48c0be79173897824d8f439c39374f2588931dcJens Axboe log_err("fio: smalloc OOM\n"); 908c48c0be79173897824d8f439c39374f2588931dcJens Axboe assert(0); 909c48c0be79173897824d8f439c39374f2588931dcJens Axboe } 9100b9d69ecb14045cf3b2622ae922756b9889b25e6Jens Axboe 911af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe f->fd = -1; 91238dad62d5154ffaad445bd0231b271b9a46a5190Jens Axboe fio_file_reset(f); 913bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe 914fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe if (td->files_size <= td->files_index) { 9154b341fca0dab0caa41d000e8db36f1530c26616fCarl Henrik Lunde int new_size = td->o.nr_files + 1; 916126d65c6fc97d6acdc568aa5a969c012018daf15Jens Axboe 917fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe dprint(FD_FILE, "resize file array to %d files\n", new_size); 918fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe 919fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe td->files = realloc(td->files, new_size * sizeof(f)); 920fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe td->files_size = new_size; 921fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe } 9228bb7679e73d3086a01b9d21a650b0d7a859412b6Jens Axboe td->files[cur_files] = f; 923126d65c6fc97d6acdc568aa5a969c012018daf15Jens Axboe 92407eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe /* 92507eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe * init function, io engine may not be loaded yet 92607eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe */ 92707eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe if (td->io_ops && (td->io_ops->flags & FIO_DISKLESSIO)) 92807eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe f->real_file_size = -1ULL; 92907eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe 930bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe if (td->o.directory) 931bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe len = sprintf(file_name, "%s/", td->o.directory); 932bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe 933bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe sprintf(file_name + len, "%s", fname); 934f17c43928c202e557f2f325272c60d9050ee528eJens Axboe f->file_name = smalloc_strdup(file_name); 935c48c0be79173897824d8f439c39374f2588931dcJens Axboe if (!f->file_name) { 936c48c0be79173897824d8f439c39374f2588931dcJens Axboe log_err("fio: smalloc OOM\n"); 937c48c0be79173897824d8f439c39374f2588931dcJens Axboe assert(0); 938c48c0be79173897824d8f439c39374f2588931dcJens Axboe } 9390b9d69ecb14045cf3b2622ae922756b9889b25e6Jens Axboe 940e3bab463d4397e3378d8c7437e31de8aaf861a4fJens Axboe get_file_type(f); 941af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe 9424d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe switch (td->o.file_lock_mode) { 9434d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe case FILE_LOCK_NONE: 9444d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe break; 9454d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe case FILE_LOCK_READWRITE: 9464d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe f->lock = fio_mutex_rw_init(); 9474d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe break; 9484d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe case FILE_LOCK_EXCLUSIVE: 9494d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe f->lock = fio_mutex_init(1); 9504d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe break; 9514d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe default: 9524d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe log_err("fio: unknown lock mode: %d\n", td->o.file_lock_mode); 9534d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe assert(0); 9544d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe } 95529c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe 9567b4e4fe5e6fa26f82f9169c18ec70c08d0805ca9Jens Axboe td->files_index++; 9571549441cdfecb2c1a4a8b8d494253859d67b4344Jens Axboe if (f->filetype == FIO_TYPE_FILE) 9581549441cdfecb2c1a4a8b8d494253859d67b4344Jens Axboe td->nr_normal_files++; 959f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe 9605ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe dprint(FD_FILE, "file %p \"%s\" added at %d\n", f, f->file_name, 9615ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe cur_files); 9629efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe 963f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe return cur_files; 964af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe} 9650ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe 9660ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboevoid get_file(struct fio_file *f) 9670ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe{ 9688172fe972f3a79d42f34d7f6e259ed3f7f800316Jens Axboe dprint(FD_FILE, "get file %s, ref=%d\n", f->file_name, f->references); 969d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe assert(fio_file_open(f)); 9700ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe f->references++; 9710ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe} 9720ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe 9736977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboeint put_file(struct thread_data *td, struct fio_file *f) 9740ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe{ 97598e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe int f_ret = 0, ret = 0; 9766977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe 9778172fe972f3a79d42f34d7f6e259ed3f7f800316Jens Axboe dprint(FD_FILE, "put file %s, ref=%d\n", f->file_name, f->references); 978ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe 97922a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe if (!fio_file_open(f)) { 98022a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe assert(f->fd == -1); 9816977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe return 0; 98222a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe } 9830ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe 9840ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe assert(f->references); 9850ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe if (--f->references) 9866977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe return 0; 9870ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe 988d424d4dd657eaf4aeb8ffb07a550a5f64940f41aJens Axboe if (should_fsync(td) && td->o.fsync_on_close) 98998e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe f_ret = fsync(f->fd); 990ebb1415f729c123b8a13bcbd667bf4b4cc95b4d4Jens Axboe 9910ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe if (td->io_ops->close_file) 9926977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe ret = td->io_ops->close_file(td, f); 9931020a139beff50faf1bb18f761b024b664a09e14Jens Axboe 99498e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe if (!ret) 995a5fb461fdff86c442daeebbd28e07984be9f3807Jens Axboe ret = f_ret; 99698e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe 9970ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe td->nr_open_files--; 998d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe fio_file_clear_open(f); 99922a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe assert(f->fd == -1); 10006977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe return ret; 10010ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe} 1002bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 10034d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboevoid lock_file(struct thread_data *td, struct fio_file *f, enum fio_ddir ddir) 1004b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe{ 10054d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe if (!f->lock || td->o.file_lock_mode == FILE_LOCK_NONE) 10064d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe return; 100729c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe 10084d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe if (f->lock_owner == td && f->lock_batch--) 10094d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe return; 10104d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe 10114d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe if (td->o.file_lock_mode == FILE_LOCK_READWRITE) { 10124d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe if (ddir == DDIR_READ) 10134d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe fio_mutex_down_read(f->lock); 10144d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe else 10154d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe fio_mutex_down_write(f->lock); 10164d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe } else if (td->o.file_lock_mode == FILE_LOCK_EXCLUSIVE) 10174d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe fio_mutex_down(f->lock); 10184d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe 10194d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe f->lock_owner = td; 10204d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe f->lock_batch = td->o.lockfile_batch; 10214d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe f->lock_ddir = ddir; 1022b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe} 1023b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe 10244d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboevoid unlock_file(struct thread_data *td, struct fio_file *f) 1025b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe{ 10264d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe if (!f->lock || td->o.file_lock_mode == FILE_LOCK_NONE) 10274d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe return; 10284d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe if (f->lock_batch) 10294d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe return; 10304d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe 10314d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe if (td->o.file_lock_mode == FILE_LOCK_READWRITE) { 10324d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe const int is_read = f->lock_ddir == DDIR_READ; 10334d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe int val = fio_mutex_getval(f->lock); 103429c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe 10354d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe if ((is_read && val == 1) || (!is_read && val == -1)) 10364d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe f->lock_owner = NULL; 103729c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe 10384d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe if (is_read) 10394d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe fio_mutex_up_read(f->lock); 10404d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe else 10414d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe fio_mutex_up_write(f->lock); 10424d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe } else if (td->o.file_lock_mode == FILE_LOCK_EXCLUSIVE) { 10434d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe int val = fio_mutex_getval(f->lock); 10444d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe 10454d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe if (val == 0) 10464d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe f->lock_owner = NULL; 10474d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe 10484d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe fio_mutex_up(f->lock); 104929c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe } 1050b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe} 1051b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe 10524d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboevoid unlock_file_all(struct thread_data *td, struct fio_file *f) 10534d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe{ 10544d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe if (f->lock_owner != td) 10554d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe return; 10564d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe 10574d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe f->lock_batch = 0; 10584d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe unlock_file(td, f); 10594d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe} 10604d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe 1061bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboestatic int recurse_dir(struct thread_data *td, const char *dirname) 1062bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe{ 1063bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe struct dirent *dir; 1064bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe int ret = 0; 1065bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe DIR *D; 1066bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 1067bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe D = opendir(dirname); 1068bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe if (!D) { 10690ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe char buf[FIO_VERROR_SIZE]; 10700ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe 10710ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe snprintf(buf, FIO_VERROR_SIZE - 1, "opendir(%s)", dirname); 10720ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe td_verror(td, errno, buf); 1073bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe return 1; 1074bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe } 1075bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 1076bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe while ((dir = readdir(D)) != NULL) { 1077bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe char full_path[PATH_MAX]; 1078bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe struct stat sb; 1079bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 1080e85b2b83e39b64ba5cb73fbfddbf3902b6e84925Jens Axboe if (!strcmp(dir->d_name, ".") || !strcmp(dir->d_name, "..")) 1081e85b2b83e39b64ba5cb73fbfddbf3902b6e84925Jens Axboe continue; 108296d32d518a0743a6c050057bc1562e4883e51c5dJens Axboe 1083bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe sprintf(full_path, "%s/%s", dirname, dir->d_name); 1084bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 1085bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe if (lstat(full_path, &sb) == -1) { 1086bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe if (errno != ENOENT) { 1087bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe td_verror(td, errno, "stat"); 1088bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe return 1; 1089bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe } 1090bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe } 1091bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 1092bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe if (S_ISREG(sb.st_mode)) { 1093bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe add_file(td, full_path); 10942dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe td->o.nr_files++; 1095bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe continue; 1096bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe } 10970ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe if (!S_ISDIR(sb.st_mode)) 10980ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe continue; 1099bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 11005ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe ret = recurse_dir(td, full_path); 11015ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe if (ret) 1102bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe break; 1103bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe } 1104bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 1105bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe closedir(D); 1106bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe return ret; 1107bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe} 1108bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe 1109bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboeint add_dir_files(struct thread_data *td, const char *path) 1110bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe{ 11110ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe int ret = recurse_dir(td, path); 11120ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe 11130ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe if (!ret) 11140ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe log_info("fio: opendir added %d files\n", td->o.nr_files); 11150ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe 11160ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe return ret; 1117bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe} 1118cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe 1119cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboevoid dup_files(struct thread_data *td, struct thread_data *org) 1120cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe{ 1121cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe struct fio_file *f; 1122cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe unsigned int i; 11239efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe 11249efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe dprint(FD_FILE, "dup files: %d\n", org->files_index); 1125cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe 1126cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe if (!org->files) 1127cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe return; 1128cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe 11299efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe td->files = malloc(org->files_index * sizeof(f)); 1130cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe 11319efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe for_each_file(org, f, i) { 1132b0fe421a6a0487ff71f6f903908f666d9ca1b327Jens Axboe struct fio_file *__f; 1133b0fe421a6a0487ff71f6f903908f666d9ca1b327Jens Axboe 1134f17c43928c202e557f2f325272c60d9050ee528eJens Axboe __f = smalloc(sizeof(*__f)); 1135c48c0be79173897824d8f439c39374f2588931dcJens Axboe if (!__f) { 1136c48c0be79173897824d8f439c39374f2588931dcJens Axboe log_err("fio: smalloc OOM\n"); 1137c48c0be79173897824d8f439c39374f2588931dcJens Axboe assert(0); 1138c48c0be79173897824d8f439c39374f2588931dcJens Axboe } 113922a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe __f->fd = -1; 114038dad62d5154ffaad445bd0231b271b9a46a5190Jens Axboe fio_file_reset(__f); 11410b9d69ecb14045cf3b2622ae922756b9889b25e6Jens Axboe 1142bc3456fa06cc7777c4764da8c7b1c0fd0a3c3772Aaron Carroll if (f->file_name) { 1143f17c43928c202e557f2f325272c60d9050ee528eJens Axboe __f->file_name = smalloc_strdup(f->file_name); 1144c48c0be79173897824d8f439c39374f2588931dcJens Axboe if (!__f->file_name) { 1145c48c0be79173897824d8f439c39374f2588931dcJens Axboe log_err("fio: smalloc OOM\n"); 1146c48c0be79173897824d8f439c39374f2588931dcJens Axboe assert(0); 1147c48c0be79173897824d8f439c39374f2588931dcJens Axboe } 11480b9d69ecb14045cf3b2622ae922756b9889b25e6Jens Axboe 1149bc3456fa06cc7777c4764da8c7b1c0fd0a3c3772Aaron Carroll __f->filetype = f->filetype; 1150bc3456fa06cc7777c4764da8c7b1c0fd0a3c3772Aaron Carroll } 1151b0fe421a6a0487ff71f6f903908f666d9ca1b327Jens Axboe 1152b0fe421a6a0487ff71f6f903908f666d9ca1b327Jens Axboe td->files[i] = __f; 1153cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe } 1154cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe} 1155f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe 1156f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe/* 1157f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe * Returns the index that matches the filename, or -1 if not there 1158f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe */ 1159f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboeint get_fileno(struct thread_data *td, const char *fname) 1160f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe{ 1161f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe struct fio_file *f; 1162f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe unsigned int i; 1163f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe 1164f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe for_each_file(td, f, i) 1165f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe if (!strcmp(f->file_name, fname)) 1166f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe return i; 1167f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe 1168f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe return -1; 1169f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe} 1170f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe 1171f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe/* 1172f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe * For log usage, where we add/open/close files automatically 1173f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe */ 1174f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboevoid free_release_files(struct thread_data *td) 1175f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe{ 1176f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe close_files(td); 1177f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe td->files_index = 0; 1178f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe td->nr_normal_files = 0; 1179f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe} 1180